]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Upgrade libtasn1 to v2.1.
authorSimon Josefsson <simon@josefsson.org>
Tue, 12 May 2009 07:11:09 +0000 (09:11 +0200)
committerSimon Josefsson <simon@josefsson.org>
Tue, 12 May 2009 07:11:09 +0000 (09:11 +0200)
14 files changed:
NEWS
lib/minitasn1/coding.c
lib/minitasn1/decoding.c
lib/minitasn1/element.c
lib/minitasn1/element.h
lib/minitasn1/errors.c
lib/minitasn1/gstr.c
lib/minitasn1/gstr.h
lib/minitasn1/int.h
lib/minitasn1/libtasn1.h
lib/minitasn1/parser_aux.c
lib/minitasn1/parser_aux.h
lib/minitasn1/structure.c
lib/minitasn1/structure.h

diff --git a/NEWS b/NEWS
index 7ee3e6455bf68128632552655c8352e8a9ffdfe0..c6c788e45753aef6273213041858ce57dc5a8519 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,10 @@ See the end for copying conditions.
 
 * Version 2.7.10 (unreleased)
 
+** minitasn1: Internal copy updated to libtasn1 v2.1.
+GnuTLS should work fine with libtasn1 v1.x and that is still
+supported.
+
 ** API and ABI modifications:
 No changes since last version.
 
index 337858a3c57288ddc89a1335b7436ad126035303..ea0c7d9453e115a7c2d18984276178ae3c771b94 100644 (file)
@@ -28,7 +28,6 @@
 /*****************************************************/
 
 #include <int.h>
-#include <errors.h>
 #include "parser_aux.h"
 #include <gstr.h>
 #include "element.h"
@@ -45,8 +44,8 @@
 /*   ErrorDescription: string returned.               */
 /* Return:                                            */
 /******************************************************/
-void
-_asn1_error_description_value_not_found (ASN1_TYPE  node,
+static void
+_asn1_error_description_value_not_found (ASN1_TYPE node,
                                         char *ErrorDescription)
 {
 
@@ -113,7 +112,7 @@ asn1_length_der (unsigned long int len, unsigned char *ans, int *ans_len)
 /*            (ans[0]..ans[ans_len-1]).               */
 /* Return:                                            */
 /******************************************************/
-void
+static void
 _asn1_tag_der (unsigned char class, unsigned int tag_value,
               unsigned char *ans, int *ans_len)
 {
@@ -179,7 +178,7 @@ asn1_octet_der (const unsigned char *str, int str_len,
 /*   ASN1_MEM_ERROR when DER isn't big enough         */
 /*   ASN1_SUCCESS otherwise                           */
 /******************************************************/
-asn1_retCode
+static asn1_retCode
 _asn1_time_der (unsigned char *str, unsigned char *der, int *der_len)
 {
   int len_len;
@@ -250,7 +249,7 @@ _asn1_get_utctime_der(unsigned char *der,int *der_len,unsigned char *str)
 /*   ASN1_MEM_ERROR when DER isn't big enough         */
 /*   ASN1_SUCCESS otherwise                           */
 /******************************************************/
-asn1_retCode
+static asn1_retCode
 _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len)
 {
   int len_len, counter, k, first, max_len;
@@ -370,8 +369,8 @@ asn1_bit_der (const unsigned char *str, int bit_len,
 /*   ASN1_MEM_ERROR if der vector isn't big enough,   */
 /*   otherwise ASN1_SUCCESS.                          */
 /******************************************************/
-asn1_retCode
-_asn1_complete_explicit_tag (ASN1_TYPE  node, unsigned char *der,
+static asn1_retCode
+_asn1_complete_explicit_tag (ASN1_TYPE node, unsigned char *der,
                             int *counter, int *max_len)
 {
   ASN1_TYPE p;
@@ -443,8 +442,8 @@ _asn1_complete_explicit_tag (ASN1_TYPE  node, unsigned char *der,
 /*   ASN1_MEM_ERROR if der vector isn't big enough,   */
 /*   otherwise ASN1_SUCCESS.                          */
 /******************************************************/
-asn1_retCode
-_asn1_insert_tag_der (ASN1_TYPE  node, unsigned char *der, int *counter,
+static asn1_retCode
+_asn1_insert_tag_der (ASN1_TYPE node, unsigned char *der, int *counter,
                      int *max_len)
 {
   ASN1_TYPE p;
@@ -604,8 +603,8 @@ _asn1_insert_tag_der (ASN1_TYPE  node, unsigned char *der, int *counter,
 /*   node: pointer to the SET element.                */
 /* Return:                                            */
 /******************************************************/
-void
-_asn1_ordering_set (unsigned char *der, int der_len, ASN1_TYPE  node)
+static void
+_asn1_ordering_set (unsigned char *der, int der_len, ASN1_TYPE node)
 {
   struct vet
   {
@@ -718,8 +717,8 @@ _asn1_ordering_set (unsigned char *der, int der_len, ASN1_TYPE  node)
 /*   node: pointer to the SET OF element.             */
 /* Return:                                            */
 /******************************************************/
-void
-_asn1_ordering_set_of (unsigned char *der, int der_len, ASN1_TYPE  node)
+static void
+_asn1_ordering_set_of (unsigned char *der, int der_len, ASN1_TYPE node)
 {
   struct vet
   {
index 2374cf80a0d197422b20076ab5376fc8e3bcfcae..d72a4c0397c717f16ef20fb15023c9c4888c766f 100644 (file)
@@ -27,7 +27,6 @@
 /*****************************************************/
 
 #include <int.h>
-#include <errors.h>
 #include "parser_aux.h"
 #include <gstr.h>
 #include "structure.h"
@@ -181,11 +180,11 @@ asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len)
   int ret;
   long err;
 
-  ret = asn1_get_length_derber, ber_len, len);
+  ret = asn1_get_length_der (ber, ber_len, len);
   if (ret == -1)
-    {                  /* indefinite length method */
+    {                          /* indefinite length method */
       ret = ber_len;
-      err = _asn1_get_indefinite_length_string (ber+1, &ret);
+      err = _asn1_get_indefinite_length_string (ber + 1, &ret);
       if (err != ASN1_SUCCESS)
        return -3;
     }
@@ -237,7 +236,7 @@ asn1_get_octet_der (const unsigned char *der, int der_len,
 
 /* Returns ASN1_SUCCESS on success or an error code on error.
  */
-int
+static int
 _asn1_get_time_der (const unsigned char *der, int der_len, int *ret_len,
                    char *str, int str_size)
 {
@@ -257,7 +256,7 @@ _asn1_get_time_der (const unsigned char *der, int der_len, int *ret_len,
 
 
 
-void
+static void
 _asn1_get_objectid_der (const unsigned char *der, int der_len, int *ret_len,
                        char *str, int str_size)
 {
@@ -340,7 +339,7 @@ asn1_get_bit_der (const unsigned char *der, int der_len,
 
 
 
-int
+static int
 _asn1_extract_tag_der (ASN1_TYPE node, const unsigned char *der, int der_len,
                       int *ret_len)
 {
@@ -386,7 +385,7 @@ _asn1_extract_tag_der (ASN1_TYPE node, const unsigned char *der, int der_len,
                                         &len2);
                  if (len3 < 0)
                    return ASN1_DER_ERROR;
-                  
+
                  counter += len2;
                  if (counter > der_len)
                    return ASN1_DER_ERROR;
@@ -539,7 +538,7 @@ _asn1_extract_tag_der (ASN1_TYPE node, const unsigned char *der, int der_len,
 }
 
 
-int
+static int
 _asn1_delete_not_used (ASN1_TYPE node)
 {
   ASN1_TYPE p, p2;
@@ -598,49 +597,53 @@ _asn1_delete_not_used (ASN1_TYPE node)
   return ASN1_SUCCESS;
 }
 
-asn1_retCode _asn1_extract_der_octet(ASN1_TYPE node, const unsigned char *der, int der_len)
+static asn1_retCode
+_asn1_extract_der_octet (ASN1_TYPE node, const unsigned char *der,
+                        int der_len)
 {
-int len2, len3;
-int counter2, counter_end;
+  int len2, len3;
+  int counter2, counter_end;
 
-    len2 = asn1_get_length_der (der, der_len, &len3);
-    if (len2 < -1)
-        return ASN1_DER_ERROR;
+  len2 = asn1_get_length_der (der, der_len, &len3);
+  if (len2 < -1)
+    return ASN1_DER_ERROR;
 
-    counter2 = len3 + 1;
+  counter2 = len3 + 1;
 
-    if (len2 == -1)
-        counter_end = der_len - 2;
-    else
-        counter_end = der_len;
+  if (len2 == -1)
+    counter_end = der_len - 2;
+  else
+    counter_end = der_len;
 
-    while (counter2 < counter_end)
-      {
-       len2 = asn1_get_length_der (der + counter2, der_len - counter2, &len3);
+  while (counter2 < counter_end)
+    {
+      len2 = asn1_get_length_der (der + counter2, der_len - counter2, &len3);
 
-        if (len2 < -1)
-         return ASN1_DER_ERROR;
+      if (len2 < -1)
+       return ASN1_DER_ERROR;
 
-       if (len2 > 0)
-         {
-           _asn1_append_value( node, der + counter2 + len3, len2);
-          }
-        else
-          { /* indefinite */
-            
-            len2 = _asn1_extract_der_octet( node, der+counter2+len3, der_len-counter2-len3);
-            if (len2 < 0)
-                return len2;
-          }
-
-        counter2 += len2 + len3 + 1;
-      }
-      
-      return ASN1_SUCCESS;
+      if (len2 > 0)
+       {
+         _asn1_append_value (node, der + counter2 + len3, len2);
+       }
+      else
+       {                       /* indefinite */
+
+         len2 =
+           _asn1_extract_der_octet (node, der + counter2 + len3,
+                                    der_len - counter2 - len3);
+         if (len2 < 0)
+           return len2;
+       }
+
+      counter2 += len2 + len3 + 1;
+    }
+
+  return ASN1_SUCCESS;
 }
 
 
-asn1_retCode
+static asn1_retCode
 _asn1_get_octet_string (const unsigned char *der, ASN1_TYPE node, int *len)
 {
   int len2, len3, counter, tot_len, indefinite;
@@ -692,17 +695,17 @@ _asn1_get_octet_string (const unsigned char *der, ASN1_TYPE node, int *len)
        {
          unsigned char temp[DER_LEN];
          int ret;
-         
-         len2 = sizeof(temp);
+
+         len2 = sizeof (temp);
 
          asn1_length_der (tot_len, temp, &len2);
          _asn1_set_value (node, temp, len2);
 
          tot_len += len2;
 
-         ret = _asn1_extract_der_octet(node, der, *len);
-         if (ret!=ASN1_SUCCESS)
-             return ret;
+         ret = _asn1_extract_der_octet (node, der, *len);
+         if (ret != ASN1_SUCCESS)
+           return ret;
 
        }
     }
@@ -1241,7 +1244,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
              if (len4 != -1)
                {
                  len2 += len4;
-                 _asn1_set_value_octet (p, der+counter, len2+len3);
+                 _asn1_set_value_octet (p, der + counter, len2 + len3);
                  counter += len2 + len3;
                }
              else
@@ -1261,7 +1264,7 @@ asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
                      return ris;
                    }
 
-                 _asn1_set_value_octet (p, der+counter, len2);
+                 _asn1_set_value_octet (p, der + counter, len2);
                  counter += len2;
 
                  /* Check if a couple of 0x00 are present due to an EXPLICIT TAG with
@@ -1907,7 +1910,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
                  len2 += len4;
                  if (state == FOUND)
                    {
-                     _asn1_set_value_octet (p, der+counter, len2+len3);
+                     _asn1_set_value_octet (p, der + counter, len2 + len3);
                      temp2 = NULL;
 
                      if (p == nodeFound)
@@ -1934,7 +1937,7 @@ asn1_der_decoding_element (ASN1_TYPE * structure, const char *elementName,
 
                  if (state == FOUND)
                    {
-                     _asn1_set_value_octet (p, der+counter, len2);
+                     _asn1_set_value_octet (p, der + counter, len2);
 
                      if (p == nodeFound)
                        state = EXIT;
index 34863781ad983bf1b01a1059546c909e120bd010..4b4c8384f118965a3555d7ca8add37da40b6f2af 100644 (file)
 
 
 #include <int.h>
-#include <errors.h>
 #include "parser_aux.h"
 #include <gstr.h>
 #include "structure.h"
 
+#include "element.h"
+
 void
-_asn1_hierarchical_name (ASN1_TYPE  node, char *name, int name_size)
+_asn1_hierarchical_name (ASN1_TYPE node, char *name, int name_size)
 {
   ASN1_TYPE p;
   char tmp_name[64];
@@ -115,21 +116,19 @@ _asn1_convert_integer (const char *value, unsigned char *value_out,
   for (k2 = k; k2 < SIZEOF_UNSIGNED_LONG_INT; k2++)
     value_out[k2 - k] = val[k2];
 
-
-#ifdef LIBTASN1_DEBUG_INTEGER
-  _libtasn1_log ("_asn1_convert_integer: valueIn=%s, lenOut=%d", value, *len);
+#if 0
+  printf ("_asn1_convert_integer: valueIn=%s, lenOut=%d", value, *len);
   for (k = 0; k < SIZEOF_UNSIGNED_LONG_INT; k++)
-    _libtasn1_log (", vOut[%d]=%d", k, value_out[k]);
-  _libtasn1_log ("\n");
+    printf (", vOut[%d]=%d", k, value_out[k]);
+  printf ("\n");
 #endif
 
-
   return ASN1_SUCCESS;
 }
 
 
 int
-_asn1_append_sequence_set (ASN1_TYPE  node)
+_asn1_append_sequence_set (ASN1_TYPE node)
 {
   ASN1_TYPE p, p2;
   char temp[10];
@@ -281,6 +280,7 @@ asn1_write_value (ASN1_TYPE node_root, const char *name,
   ASN1_TYPE node, p, p2;
   unsigned char *temp, *value_temp = NULL, *default_temp = NULL;
   int len2, k, k2, negative;
+  size_t i;
   const unsigned char *value = ivalue;
 
   node = asn1_find_node (node_root, name);
@@ -417,7 +417,7 @@ asn1_write_value (ASN1_TYPE node_root, const char *name,
          (!negative && (value_temp[k] & 0x80)))
        k--;
 
-      _asn1_set_value_octet (node, value_temp+k, len-k);
+      _asn1_set_value_octet (node, value_temp + k, len - k);
 
       if (node->type & CONST_DEFAULT)
        {
@@ -492,8 +492,8 @@ asn1_write_value (ASN1_TYPE node_root, const char *name,
       _asn1_free (value_temp);
       break;
     case TYPE_OBJECT_ID:
-      for (k = 0; k < strlen (value); k++)
-       if ((!isdigit (value[k])) && (value[k] != '.') && (value[k] != '+'))
+      for (i = 0; i < strlen (value); i++)
+       if ((!isdigit (value[i])) && (value[i] != '.') && (value[i] != '+'))
          return ASN1_VALUE_NOT_VALID;
       if (node->type & CONST_DEFAULT)
        {
@@ -636,8 +636,8 @@ asn1_write_value (ASN1_TYPE node_root, const char *name,
        }
 
 #define ADD_STR_VALUE( ptr, ptr_size, data) \
-       *len = strlen(data) + 1; \
-       if (ptr_size < strlen(ptr)+(*len)) { \
+       *len = (int) strlen(data) + 1; \
+       if (ptr_size < (int) strlen(ptr)+(*len)) { \
                return ASN1_MEM_ERROR; \
        } else { \
                /* this strcat is checked */ \
index f0314d27a690e44f33290926389154e6dea9f3ee..b5d9eb9e550c5fd5be3f935f599e5ad7ad9882f8 100644 (file)
@@ -3,11 +3,12 @@
 #define _ELEMENT_H
 
 
-asn1_retCode _asn1_append_sequence_set(ASN1_TYPE node);
+asn1_retCode _asn1_append_sequence_set (ASN1_TYPE node);
 
-asn1_retCode _asn1_convert_integer(const char *value,unsigned char *value_out,
-                         int value_out_size, int *len);
+asn1_retCode _asn1_convert_integer (const char *value,
+                                   unsigned char *value_out,
+                                   int value_out_size, int *len);
 
-void _asn1_hierarchical_name(ASN1_TYPE node,char *name,int name_size);
+void _asn1_hierarchical_name (ASN1_TYPE node, char *name, int name_size);
 
 #endif
index e8f557f99c691ce1ed77915b613c7cef77148723..1e46c8c5438cc6d61970a85b058d835993bc6b0e 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 #include <int.h>
-#include "errors.h"
 #ifdef STDC_HEADERS
 # include <stdarg.h>
 #endif
@@ -54,16 +53,18 @@ static const libtasn1_error_entry error_algorithms[] = {
   LIBTASN1_ERROR_ENTRY (ASN1_NAME_TOO_LONG),
   LIBTASN1_ERROR_ENTRY (ASN1_ARRAY_ERROR),
   LIBTASN1_ERROR_ENTRY (ASN1_ELEMENT_NOT_EMPTY),
-  {0}
+  {0, 0}
 };
 
 /**
  * asn1_perror - prints a string to stderr with a description of an error
  * @error: is an error returned by a libtasn1 function.
  *
- * This function is like perror(). The only difference is that it
+ * This function is like perror().  The only difference is that it
  * accepts an error returned by a libtasn1 function.
  *
+ * This function replaces libtasn1_perror() in older libtasn1.
+ *
  * Since: 1.6
  **/
 void
@@ -77,9 +78,11 @@ asn1_perror (asn1_retCode error)
  * asn1_strerror - Returns a string with a description of an error
  * @error: is an error returned by a libtasn1 function.
  *
- * This function is similar to strerror(). The only difference is
+ * This function is similar to strerror().  The only difference is
  * that it accepts an error (number) returned by a libtasn1 function.
  *
+ * This function replaces libtasn1_strerror() in older libtasn1.
+ *
  * Returns: Pointer to static zero-terminated string describing error
  *   code.
  *
index cdfa7edecb33bd19662dc4b80e288cf9a54c9c9c..9c0835120bb44fc8f03619d004307298f077ce4e 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 #include <int.h>
+#include "gstr.h"
 
 /* These function are like strcat, strcpy. They only
  * do bounds checking (they shouldn't cause buffer overruns),
index 992fd0ff3d9ba6c831266533ff638c7f1689eca4..5452fa46835de5f360f5f259aadf1211fa5bda21 100644 (file)
@@ -1,5 +1,5 @@
-void _asn1_str_cpy( char* dest, size_t dest_tot_size, const char* src);
-void _asn1_str_cat( char* dest, size_t dest_tot_size, const char* src);
+void _asn1_str_cpy (char *dest, size_t dest_tot_size, const char *src);
+void _asn1_str_cat (char *dest, size_t dest_tot_size, const char *src);
 
 #define Estrcpy(x,y) _asn1_str_cpy(x,ASN1_MAX_ERROR_DESCRIPTION_SIZE,y)
 #define Estrcat(x,y) _asn1_str_cat(x,ASN1_MAX_ERROR_DESCRIPTION_SIZE,y)
index 8ef03bd9b4aa110c74203a476653885deabb29e0..5b42af53442fc48e696e2d17ef693216fb172e92 100644 (file)
 
 #include <libtasn1.h>
 
-/*
-#define LIBTASN1_DEBUG
-#define LIBTASN1_DEBUG_PARSER
-#define LIBTASN1_DEBUG_INTEGER
-*/
+#define ASN1_SMALL_VALUE_SIZE 16
+
+/* This structure is also in libtasn1.h, but then contains less
+   fields.  You cannot make any modifications to these first fields
+   without breaking ABI.  */
+struct node_asn_struct
+{
+  /* public fields: */
+  char *name;                  /* Node name */
+  unsigned int type;           /* Node type */
+  unsigned char *value;                /* Node value */
+  int value_len;
+  ASN1_TYPE down;              /* Pointer to the son node */
+  ASN1_TYPE right;             /* Pointer to the brother node */
+  ASN1_TYPE left;              /* Pointer to the next list element */
+  /* private fields: */
+  unsigned char small_value[ASN1_SMALL_VALUE_SIZE];    /* For small values */
+};
 
 #define _asn1_malloc malloc
 #define _asn1_free free
@@ -51,7 +64,7 @@
 #define _asn1_realloc realloc
 #define _asn1_strdup strdup
 
-#define MAX_LOG_SIZE 1024 /* maximum number of characters of a log message */
+#define MAX_LOG_SIZE 1024      /* maximum number of characters of a log message */
 
 /* Define used for visiting trees. */
 #define UP     1
 #define CONST_EXPLICIT    (1<<11)
 #define CONST_IMPLICIT    (1<<12)
 
-#define CONST_TAG         (1<<13)  /*  Used in ASN.1 assignement  */
+#define CONST_TAG         (1<<13)      /*  Used in ASN.1 assignement  */
 #define CONST_OPTION      (1<<14)
 #define CONST_DEFAULT     (1<<15)
 #define CONST_TRUE        (1<<16)
 #define CONST_FALSE       (1<<17)
 
-#define CONST_LIST        (1<<18)  /*  Used with TYPE_INTEGER and TYPE_BIT_STRING  */
+#define CONST_LIST        (1<<18)      /*  Used with TYPE_INTEGER and TYPE_BIT_STRING  */
 #define CONST_MIN_MAX     (1<<19)
 
 #define CONST_1_PARAM     (1<<20)
index b8ad75b167d9b60ba7e89559976d55b8f1403b1b..5e30e33db921bcafa4a1d2cc0603f121a623a1a5 100644 (file)
 #ifndef LIBTASN1_H
 # define LIBTASN1_H
 
+# ifndef ASN1_API
+#  if defined ASN1_BUILDING && defined HAVE_VISIBILITY && HAVE_VISIBILITY
+#   define ASN1_API __attribute__((__visibility__("default")))
+#  elif defined ASN1_BUILDING && defined _MSC_VER && ! defined ASN1_STATIC
+#   define ASN1_API __declspec(dllexport)
+#  elif defined _MSC_VER && ! defined ASN1_STATIC
+#   define ASN1_API __declspec(dllimport)
+#  else
+#   define ASN1_API
+#  endif
+# endif
+
 #include <stdio.h>             /* for FILE* */
 #include <sys/types.h>
 #include <time.h>
 
 #ifdef __cplusplus
-extern "C" {
+extern "C"
+{
 #endif
 
-#define ASN1_VERSION "1.8"
+#define ASN1_VERSION "2.1"
 
   typedef int asn1_retCode;    /* type returned by libtasn1 functions */
 
@@ -96,6 +109,10 @@ extern "C" {
   /* that represent an ASN.1 DEFINITION.                */
   /******************************************************/
 
+#if !defined(ASN1_BUILDING)
+  /* This structure is also in internal.h, but then contains more
+     fields.  You cannot make any modifications to these fields
+     without breaking ABI.  */
   struct node_asn_struct
   {
     char *name;                        /* Node name */
@@ -106,6 +123,7 @@ extern "C" {
     struct node_asn_struct *right;     /* Pointer to the brother node */
     struct node_asn_struct *left;      /* Pointer to the next list element */
   };
+#endif
 
   typedef struct node_asn_struct node_asn;
 
@@ -118,9 +136,9 @@ extern "C" {
   /*****************************************/
   struct static_struct_asn
   {
-    const char *name;  /* Node name */
-    unsigned int type; /* Node type */
-    const void *value; /* Node value */
+    const char *name;          /* Node name */
+    unsigned int type;         /* Node type */
+    const void *value;         /* Node value */
   };
   typedef struct static_struct_asn ASN1_ARRAY_TYPE;
 
@@ -143,107 +161,108 @@ extern "C" {
 
   asn1_retCode asn1_parser2tree (const char *file_name,
                                 ASN1_TYPE * definitions,
-                                char *errorDescription);
+                                char *errorDescription) ASN1_API;
 
   asn1_retCode asn1_parser2array (const char *inputFileName,
                                  const char *outputFileName,
                                  const char *vectorName,
-                                 char *errorDescription);
+                                 char *errorDescription) ASN1_API;
 
   asn1_retCode asn1_array2tree (const ASN1_ARRAY_TYPE * array,
                                ASN1_TYPE * definitions,
-                               char *errorDescription);
+                               char *errorDescription) ASN1_API;
 
-  void asn1_print_structure (FILE *out, ASN1_TYPE structure, const char *name,
-                            int mode);
+  void asn1_print_structure (FILE * out, ASN1_TYPE structure,
+                            const char *name, int mode) ASN1_API;
 
   asn1_retCode asn1_create_element (ASN1_TYPE definitions,
                                    const char *source_name,
-                                   ASN1_TYPE * element);
+                                   ASN1_TYPE * element) ASN1_API;
 
-  asn1_retCode asn1_delete_structure (ASN1_TYPE * structure);
+  asn1_retCode asn1_delete_structure (ASN1_TYPE * structure) ASN1_API;
 
   asn1_retCode asn1_delete_element (ASN1_TYPE structure,
-                                   const char *element_name);
+                                   const char *element_name) ASN1_API;
 
   asn1_retCode asn1_write_value (ASN1_TYPE node_root, const char *name,
-                                const void *ivalue, int len);
+                                const void *ivalue, int len) ASN1_API;
 
   asn1_retCode asn1_read_value (ASN1_TYPE root, const char *name,
-                               void *ivalue, int *len);
+                               void *ivalue, int *len) ASN1_API;
 
   asn1_retCode asn1_number_of_elements (ASN1_TYPE element, const char *name,
-                                       int *num);
+                                       int *num) ASN1_API;
 
   asn1_retCode asn1_der_coding (ASN1_TYPE element, const char *name,
-                               void *ider, int *len, char *ErrorDescription);
+                               void *ider, int *len,
+                               char *ErrorDescription) ASN1_API;
 
   asn1_retCode asn1_der_decoding (ASN1_TYPE * element, const void *ider,
-                                 int len, char *errorDescription);
+                                 int len, char *errorDescription) ASN1_API;
 
   asn1_retCode asn1_der_decoding_element (ASN1_TYPE * structure,
                                          const char *elementName,
                                          const void *ider, int len,
-                                         char *errorDescription);
+                                         char *errorDescription) ASN1_API;
 
   asn1_retCode asn1_der_decoding_startEnd (ASN1_TYPE element,
                                           const void *ider, int len,
                                           const char *name_element,
-                                          int *start, int *end);
+                                          int *start, int *end) ASN1_API;
 
   asn1_retCode asn1_expand_any_defined_by (ASN1_TYPE definitions,
-                                          ASN1_TYPE * element);
+                                          ASN1_TYPE * element) ASN1_API;
 
   asn1_retCode asn1_expand_octet_string (ASN1_TYPE definitions,
                                         ASN1_TYPE * element,
                                         const char *octetName,
-                                        const char *objectName);
+                                        const char *objectName) ASN1_API;
 
   asn1_retCode asn1_read_tag (ASN1_TYPE root, const char *name,
-                             int *tagValue, int *classValue);
+                             int *tagValue, int *classValue) ASN1_API;
 
   const char *asn1_find_structure_from_oid (ASN1_TYPE definitions,
-                                           const char *oidValue);
+                                           const char *oidValue) ASN1_API;
 
-  const char *asn1_check_version (const char *req_version);
+  const char *asn1_check_version (const char *req_version) ASN1_API;
 
-  const char *asn1_strerror (asn1_retCode error);
-  void asn1_perror (asn1_retCode error);
+  const char *asn1_strerror (asn1_retCode error) ASN1_API;
+  void asn1_perror (asn1_retCode error) ASN1_API;
 
   /* DER utility functions. */
 
   int asn1_get_tag_der (const unsigned char *der, int der_len,
-                       unsigned char *cls, int *len, unsigned long *tag);
+                       unsigned char *cls, int *len,
+                       unsigned long *tag) ASN1_API;
 
   void asn1_octet_der (const unsigned char *str, int str_len,
-                      unsigned char *der, int *der_len);
+                      unsigned char *der, int *der_len) ASN1_API;
 
   asn1_retCode asn1_get_octet_der (const unsigned char *der, int der_len,
                                   int *ret_len, unsigned char *str,
-                                  int str_size, int *str_len);
+                                  int str_size, int *str_len) ASN1_API;
 
   void asn1_bit_der (const unsigned char *str, int bit_len,
-                    unsigned char *der, int *der_len);
+                    unsigned char *der, int *der_len) ASN1_API;
 
   asn1_retCode asn1_get_bit_der (const unsigned char *der, int der_len,
                                 int *ret_len, unsigned char *str,
-                                int str_size, int *bit_len);
+                                int str_size, int *bit_len) ASN1_API;
 
   signed long asn1_get_length_der (const unsigned char *der, int der_len,
-                                  int *len);
+                                  int *len) ASN1_API;
   signed long asn1_get_length_ber (const unsigned char *ber, int ber_len,
-                                  int *len);
+                                  int *len) ASN1_API;
 
   void asn1_length_der (unsigned long int len, unsigned char *ans,
-                       int *ans_len);
+                       int *ans_len) ASN1_API;
 
   /* Other utility functions. */
 
-  ASN1_TYPE asn1_find_node (ASN1_TYPE pointer, const char *name);
+  ASN1_TYPE asn1_find_node (ASN1_TYPE pointer, const char *name) ASN1_API;
 
   asn1_retCode asn1_copy_node (ASN1_TYPE dst, const char *dst_name,
-                              ASN1_TYPE src, const char *src_name);
-
+                              ASN1_TYPE src, const char *src_name) ASN1_API;
 
   /* Deprecated stuff. */
 
@@ -268,11 +287,11 @@ extern "C" {
 
   /* Use asn1_strerror instead. */
   const char *libtasn1_strerror (asn1_retCode error)
-    __attribute__ ((deprecated));
+    __attribute__ ((deprecated)) ASN1_API;
 
   /* Use asn1_perror instead. */
   void libtasn1_perror (asn1_retCode error)
-    __attribute__ ((deprecated));
+    __attribute__ ((deprecated)) ASN1_API;
 
 #endif
 
index 1c71f425f5419e5d5132b5f37902328bc2b73611..554551dc2826161f98bac47a47724f3bc9f7651b 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 #include <int.h>
-#include <errors.h>
 #include "parser_aux.h"
 #include "gstr.h"
 #include "structure.h"
@@ -198,14 +197,15 @@ asn1_find_node (ASN1_TYPE pointer, const char *name)
 /*   len: character number of value.                              */
 /* Return: pointer to the NODE_ASN element.                       */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_set_value (ASN1_TYPE  node, const void *value, unsigned int len)
+ASN1_TYPE
+_asn1_set_value (ASN1_TYPE node, const void *value, unsigned int len)
 {
   if (node == NULL)
     return node;
   if (node->value)
     {
-      _asn1_free (node->value);
+      if (node->value != node->small_value)
+       _asn1_free (node->value);
       node->value = NULL;
       node->value_len = 0;
     }
@@ -213,9 +213,16 @@ _asn1_set_value (ASN1_TYPE  node, const void *value, unsigned int len)
   if (!len)
     return node;
 
-  node->value = (unsigned char *) _asn1_malloc (len);
-  if (node->value == NULL)
-    return NULL;
+  if (len < sizeof (node->small_value))
+    {
+      node->value = node->small_value;
+    }
+  else
+    {
+      node->value = _asn1_malloc (len);
+      if (node->value == NULL)
+       return NULL;
+    }
   node->value_len = len;
 
   memcpy (node->value, value, len);
@@ -226,18 +233,18 @@ _asn1_set_value (ASN1_TYPE  node, const void *value, unsigned int len)
 /* Function : _asn1_set_value_octet                               */
 /* Description: sets the field VALUE in a NODE_ASN element. The   */
 /*              previous value (if exist) will be lost. The value */
-/*             given is stored as an octet string.               */
+/*             given is stored as an octet string.               */
 /* Parameters:                                                    */
 /*   node: element pointer.                                       */
 /*   value: pointer to the value that you want to set.            */
 /*   len: character number of value.                              */
 /* Return: pointer to the NODE_ASN element.                       */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_set_value_octet (ASN1_TYPE  node, const void *value, unsigned int len)
+ASN1_TYPE
+_asn1_set_value_octet (ASN1_TYPE node, const void *value, unsigned int len)
 {
-int len2;
-void* temp;
+  int len2;
+  void *temp;
 
   if (node == NULL)
     return node;
@@ -254,15 +261,16 @@ void* temp;
 /* the same as _asn1_set_value except that it sets an already malloc'ed
  * value.
  */
-ASN1_TYPE 
-_asn1_set_value_m (ASN1_TYPE  node, void *value, unsigned int len)
+ASN1_TYPE
+_asn1_set_value_m (ASN1_TYPE node, void *value, unsigned int len)
 {
   if (node == NULL)
     return node;
 
   if (node->value)
     {
-      _asn1_free (node->value);
+      if (node->value != node->small_value)
+       _asn1_free (node->value);
       node->value = NULL;
       node->value_len = 0;
     }
@@ -279,33 +287,51 @@ _asn1_set_value_m (ASN1_TYPE  node, void *value, unsigned int len)
 /******************************************************************/
 /* Function : _asn1_append_value                                  */
 /* Description: appends to the field VALUE in a NODE_ASN element. */
-/*                                                               */
+/*                                                               */
 /* Parameters:                                                    */
 /*   node: element pointer.                                       */
 /*   value: pointer to the value that you want to be appended.    */
 /*   len: character number of value.                              */
 /* Return: pointer to the NODE_ASN element.                       */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_append_value (ASN1_TYPE  node, const void *value, unsigned int len)
+ASN1_TYPE
+_asn1_append_value (ASN1_TYPE node, const void *value, unsigned int len)
 {
   if (node == NULL)
     return node;
-  if (node->value != NULL) /* value is allocated */
+  if (node->value != NULL && node->value != node->small_value)
     {
+      /* value is allocated */
       int prev_len = node->value_len;
-      node->value_len+=len;
-      node->value = _asn1_realloc( node->value, node->value_len);
-      if (node->value == NULL) {
-       node->value_len = 0;
-       return NULL;
-      }
-      memcpy( &node->value[prev_len], value, len);
+      node->value_len += len;
+      node->value = _asn1_realloc (node->value, node->value_len);
+      if (node->value == NULL)
+       {
+         node->value_len = 0;
+         return NULL;
+       }
+      memcpy (&node->value[prev_len], value, len);
 
       return node;
     }
-  else /* node->value == NULL */
-    return _asn1_set_value(node, value, len);
+  else if (node->value == node->small_value)
+    {
+      /* value is in node */
+      int prev_len = node->value_len;
+      node->value_len += len;
+      node->value = _asn1_malloc (node->value_len);
+      if (node->value == NULL)
+       {
+         node->value_len = 0;
+         return NULL;
+       }
+      memcpy (node->value, node->small_value, prev_len);
+      memcpy (&node->value[prev_len], value, len);
+
+      return node;
+    }
+  else                         /* node->value == NULL */
+    return _asn1_set_value (node, value, len);
 }
 
 /******************************************************************/
@@ -318,8 +344,8 @@ _asn1_append_value (ASN1_TYPE  node, const void *value, unsigned int len)
 /*         to set.                                                */
 /* Return: pointer to the NODE_ASN element.                       */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_set_name (ASN1_TYPE  node, const char *name)
+ASN1_TYPE
+_asn1_set_name (ASN1_TYPE node, const char *name)
 {
   if (node == NULL)
     return node;
@@ -353,8 +379,8 @@ _asn1_set_name (ASN1_TYPE  node, const char *name)
 /*          by NODE.                                              */
 /* Return: pointer to *NODE.                                      */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_set_right (ASN1_TYPE  node, ASN1_TYPE  right)
+ASN1_TYPE
+_asn1_set_right (ASN1_TYPE node, ASN1_TYPE right)
 {
   if (node == NULL)
     return node;
@@ -372,8 +398,8 @@ _asn1_set_right (ASN1_TYPE  node, ASN1_TYPE  right)
 /*   node: NODE_ASN element pointer.                              */
 /* Return: field RIGHT of NODE.                                   */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_get_right (ASN1_TYPE  node)
+ASN1_TYPE
+_asn1_get_right (ASN1_TYPE node)
 {
   if (node == NULL)
     return NULL;
@@ -387,8 +413,8 @@ _asn1_get_right (ASN1_TYPE  node)
 /*   node: starting element pointer.                              */
 /* Return: pointer to the last element along the right chain.     */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_get_last_right (ASN1_TYPE  node)
+ASN1_TYPE
+_asn1_get_last_right (ASN1_TYPE node)
 {
   ASN1_TYPE p;
 
@@ -409,8 +435,8 @@ _asn1_get_last_right (ASN1_TYPE  node)
 /*          by NODE.                                              */
 /* Return: pointer to *NODE.                                      */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_set_down (ASN1_TYPE  node, ASN1_TYPE  down)
+ASN1_TYPE
+_asn1_set_down (ASN1_TYPE node, ASN1_TYPE down)
 {
   if (node == NULL)
     return node;
@@ -428,8 +454,8 @@ _asn1_set_down (ASN1_TYPE  node, ASN1_TYPE  down)
 /*   node: NODE_ASN element pointer.                              */
 /* Return: field DOWN of NODE.                                    */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_get_down (ASN1_TYPE  node)
+ASN1_TYPE
+_asn1_get_down (ASN1_TYPE node)
 {
   if (node == NULL)
     return NULL;
@@ -444,7 +470,7 @@ _asn1_get_down (ASN1_TYPE  node)
 /* Return: a null terminated string.                              */
 /******************************************************************/
 char *
-_asn1_get_name (ASN1_TYPE  node)
+_asn1_get_name (ASN1_TYPE node)
 {
   if (node == NULL)
     return NULL;
@@ -462,8 +488,8 @@ _asn1_get_name (ASN1_TYPE  node)
 /*          value of field TYPE.                                  */
 /* Return: NODE pointer.                                          */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_mod_type (ASN1_TYPE  node, unsigned int value)
+ASN1_TYPE
+_asn1_mod_type (ASN1_TYPE node, unsigned int value)
 {
   if (node == NULL)
     return node;
@@ -480,14 +506,14 @@ _asn1_mod_type (ASN1_TYPE  node, unsigned int value)
 /*   node: NODE_ASN element pointer.                              */
 /******************************************************************/
 void
-_asn1_remove_node (ASN1_TYPE  node)
+_asn1_remove_node (ASN1_TYPE node)
 {
   if (node == NULL)
     return;
 
   if (node->name != NULL)
     _asn1_free (node->name);
-  if (node->value != NULL)
+  if (node->value != NULL && node->value != node->small_value)
     _asn1_free (node->value);
   _asn1_free (node);
 }
@@ -499,8 +525,8 @@ _asn1_remove_node (ASN1_TYPE  node)
 /*   node: NODE_ASN element pointer.                              */
 /* Return: Null if not found.                                     */
 /******************************************************************/
-ASN1_TYPE 
-_asn1_find_up (ASN1_TYPE  node)
+ASN1_TYPE
+_asn1_find_up (ASN1_TYPE node)
 {
   ASN1_TYPE p;
 
index d30a34ca975567743164d0fe7a7fe342b6d935ab..564f64ecf691148eac9f34f271a934d0087e6b01 100644 (file)
@@ -7,67 +7,53 @@
 /***************************************/
 /*  Functions used by ASN.1 parser     */
 /***************************************/
-ASN1_TYPE
-_asn1_add_node(unsigned int type);
+ASN1_TYPE _asn1_add_node (unsigned int type);
 
 ASN1_TYPE
-_asn1_set_value(ASN1_TYPE node,const void *value,unsigned int len);
+_asn1_set_value (ASN1_TYPE node, const void *value, unsigned int len);
 
-ASN1_TYPE
-_asn1_set_value_m(ASN1_TYPE node,void *value,unsigned int len);
+ASN1_TYPE _asn1_set_value_m (ASN1_TYPE node, void *value, unsigned int len);
 
 ASN1_TYPE
-_asn1_set_value_octet(ASN1_TYPE node,const void *value,unsigned int len);
+_asn1_set_value_octet (ASN1_TYPE node, const void *value, unsigned int len);
 
 ASN1_TYPE
-_asn1_append_value(ASN1_TYPE node,const void *value,unsigned int len);
+_asn1_append_value (ASN1_TYPE node, const void *value, unsigned int len);
 
-ASN1_TYPE
-_asn1_set_name(ASN1_TYPE node,const char *name);
+ASN1_TYPE _asn1_set_name (ASN1_TYPE node, const char *name);
 
-ASN1_TYPE
-_asn1_set_right(ASN1_TYPE node, ASN1_TYPE right);
+ASN1_TYPE _asn1_set_right (ASN1_TYPE node, ASN1_TYPE right);
 
-ASN1_TYPE
-_asn1_get_right(ASN1_TYPE node);
+ASN1_TYPE _asn1_get_right (ASN1_TYPE node);
 
-ASN1_TYPE
-_asn1_get_last_right(ASN1_TYPE node);
+ASN1_TYPE _asn1_get_last_right (ASN1_TYPE node);
 
-ASN1_TYPE
-_asn1_set_down(ASN1_TYPE node, ASN1_TYPE down);
+ASN1_TYPE _asn1_set_down (ASN1_TYPE node, ASN1_TYPE down);
 
-char *
-_asn1_get_name(ASN1_TYPE node);
+char *_asn1_get_name (ASN1_TYPE node);
 
-ASN1_TYPE
-_asn1_get_down(ASN1_TYPE node);
+ASN1_TYPE _asn1_get_down (ASN1_TYPE node);
 
-ASN1_TYPE
-_asn1_mod_type(ASN1_TYPE node,unsigned int value);
+ASN1_TYPE _asn1_mod_type (ASN1_TYPE node, unsigned int value);
 
-void
-_asn1_remove_node(ASN1_TYPE node);
+void _asn1_remove_node (ASN1_TYPE node);
 
-void _asn1_delete_list(void);
+void _asn1_delete_list (void);
 
-void _asn1_delete_list_and_nodes(void);
+void _asn1_delete_list_and_nodes (void);
 
-char * _asn1_ltostr(long v,char *str);
+char *_asn1_ltostr (long v, char *str);
 
-ASN1_TYPE _asn1_find_up(ASN1_TYPE node);
+ASN1_TYPE _asn1_find_up (ASN1_TYPE node);
 
-asn1_retCode _asn1_change_integer_value(ASN1_TYPE node);
+asn1_retCode _asn1_change_integer_value (ASN1_TYPE node);
 
-asn1_retCode _asn1_expand_object_id(ASN1_TYPE node);
+asn1_retCode _asn1_expand_object_id (ASN1_TYPE node);
 
-asn1_retCode _asn1_type_set_config(ASN1_TYPE node);
+asn1_retCode _asn1_type_set_config (ASN1_TYPE node);
 
-asn1_retCode _asn1_check_identifier(ASN1_TYPE node);
+asn1_retCode _asn1_check_identifier (ASN1_TYPE node);
 
-asn1_retCode _asn1_set_default_tag(ASN1_TYPE node);
+asn1_retCode _asn1_set_default_tag (ASN1_TYPE node);
 
 #endif
-
-
-
index 4998fb2e5e6ae903a0eff4083f3e064260a63559..39316516dfadb4533525cebb3825b6c6b7771a2c 100644 (file)
@@ -29,7 +29,6 @@
 
 
 #include <int.h>
-#include <errors.h>
 #include <structure.h>
 #include "parser_aux.h"
 #include <gstr.h>
@@ -70,7 +69,7 @@ _asn1_add_node_only (unsigned int type)
 /* Return: NULL if not found.                                     */
 /******************************************************************/
 ASN1_TYPE
-_asn1_find_left (ASN1_TYPE  node)
+_asn1_find_left (ASN1_TYPE node)
 {
   if ((node == NULL) || (node->left == NULL) || (node->left->down == node))
     return NULL;
@@ -387,7 +386,7 @@ asn1_delete_element (ASN1_TYPE structure, const char *element_name)
 }
 
 ASN1_TYPE
-_asn1_copy_structure3 (ASN1_TYPE  source_node)
+_asn1_copy_structure3 (ASN1_TYPE source_node)
 {
   ASN1_TYPE dest_node, p_s, p_d, p_d_prev;
   int move;
@@ -409,7 +408,7 @@ _asn1_copy_structure3 (ASN1_TYPE  source_node)
          if (p_s->name)
            _asn1_set_name (p_d, p_s->name);
          if (p_s->value)
-             _asn1_set_value (p_d, p_s->value, p_s->value_len);
+           _asn1_set_value (p_d, p_s->value, p_s->value_len);
          move = DOWN;
        }
       else
@@ -456,7 +455,7 @@ _asn1_copy_structure3 (ASN1_TYPE  source_node)
 
 
 static ASN1_TYPE
-_asn1_copy_structure2 (ASN1_TYPE  root, const char *source_name)
+_asn1_copy_structure2 (ASN1_TYPE root, const char *source_name)
 {
   ASN1_TYPE source_node;
 
@@ -467,8 +466,8 @@ _asn1_copy_structure2 (ASN1_TYPE  root, const char *source_name)
 }
 
 
-asn1_retCode
-_asn1_type_choice_config (ASN1_TYPE  node)
+static asn1_retCode
+_asn1_type_choice_config (ASN1_TYPE node)
 {
   ASN1_TYPE p, p2, p3, p4;
   int move, tlen;
@@ -552,8 +551,8 @@ _asn1_type_choice_config (ASN1_TYPE  node)
 }
 
 
-asn1_retCode
-_asn1_expand_identifier (ASN1_TYPE * node, ASN1_TYPE  root)
+static asn1_retCode
+_asn1_expand_identifier (ASN1_TYPE * node, ASN1_TYPE root)
 {
   ASN1_TYPE p, p2, p3;
   char name2[ASN1_MAX_NAME_SIZE + 2];
index 1803e7ab041bbb13783d7e897329533f60c73ce7..7257986ba022b597716a91176b8750aabc45a43b 100644 (file)
@@ -8,14 +8,14 @@
 #ifndef _STRUCTURE_H
 #define _STRUCTURE_H
 
-asn1_retCode _asn1_create_static_structure(ASN1_TYPE pointer,
-       char* output_file_name,char *vector_name);
+asn1_retCode _asn1_create_static_structure (ASN1_TYPE pointer,
+                                           char *output_file_name,
+                                           char *vector_name);
 
-ASN1_TYPE _asn1_copy_structure3(ASN1_TYPE source_node);
+ASN1_TYPE _asn1_copy_structure3 (ASN1_TYPE source_node);
 
-ASN1_TYPE  _asn1_add_node_only(unsigned int type);
+ASN1_TYPE _asn1_add_node_only (unsigned int type);
 
-ASN1_TYPE  _asn1_find_left(ASN1_TYPE node);
+ASN1_TYPE _asn1_find_left (ASN1_TYPE node);
 
 #endif
-