libtasn1-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU libtasn1 branch, master, updated. libtasn1_3_0-33-g8cd1f61


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU libtasn1 branch, master, updated. libtasn1_3_0-33-g8cd1f61
Date: Sat, 24 Nov 2012 15:23:37 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU libtasn1".

http://git.savannah.gnu.org/cgit/libtasn1.git/commit/?id=8cd1f611d962eb62db6b5beb5b395597ce463110

The branch, master has been updated
       via  8cd1f611d962eb62db6b5beb5b395597ce463110 (commit)
       via  37c47bd8102ec213ee8d53c2800232a9bb7bace2 (commit)
       via  e2e72dead5e31c38a161e7bd8b3cfb716869db40 (commit)
       via  2ac0d04b5f8571866e729e9d816ea69780892634 (commit)
       via  bbfe113c2d7540c6883eb3d83d7052f49f7988fc (commit)
       via  435b15341e5aed9fe0f936d87a88bca31678458d (commit)
      from  57e61a0d130b4bae6331c2412f87c45fcd540af2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 8cd1f611d962eb62db6b5beb5b395597ce463110
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sat Nov 24 16:23:08 2012 +0100

    simplified

commit 37c47bd8102ec213ee8d53c2800232a9bb7bace2
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sat Nov 24 13:46:21 2012 +0100

    corrected typo

commit e2e72dead5e31c38a161e7bd8b3cfb716869db40
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sat Nov 24 10:41:48 2012 +0100

    better error reporting

commit 2ac0d04b5f8571866e729e9d816ea69780892634
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sat Nov 24 10:41:33 2012 +0100

    some simplifications in time handling

commit bbfe113c2d7540c6883eb3d83d7052f49f7988fc
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sat Nov 24 09:41:50 2012 +0100

    Introduced ASN1_ETYPE_UTC_TIME and ASN1_ETYPE_GENERALIZED_TIME

commit 435b15341e5aed9fe0f936d87a88bca31678458d
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sat Nov 24 09:07:41 2012 +0100

    updates in ETYPE_OK

-----------------------------------------------------------------------

Summary of changes:
 NEWS              |    1 +
 lib/ASN1.c        |    4 +-
 lib/ASN1.y        |    4 +-
 lib/coding.c      |   28 +--
 lib/decoding.c    |   32 +--
 lib/element.c     |   44 ++--
 lib/int.h         |   45 ++++-
 lib/libtasn1.h    |    4 +-
 lib/parser_aux.c  |    4 +-
 lib/structure.c   |   30 ++-
 tests/Test_tree.c |  637 +++++++++++++++++++++++++++--------------------------
 11 files changed, 442 insertions(+), 391 deletions(-)

diff --git a/NEWS b/NEWS
index 371e804..b2dddec 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@ GNU Libtasn1 NEWS                                     -*- 
outline -*-
 - Parser outputs more detailed syntax error message.
 - Added asn1_decode_simple_der() and asn1_encode_simple_der().
 - Added asn1_read_value_type() to return value and type.
+- Introduced ASN1_ETYPE_UTC_TIME and ASN1_ETYPE_GENERALIZED_TIME
 
 * Noteworthy changes in release 3.0 (2012-10-28) [stable]
 - Added tool in tests/ to benchmark X.509 structure decoding.
diff --git a/lib/ASN1.c b/lib/ASN1.c
index 928d28d..2a60527 100644
--- a/lib/ASN1.c
+++ b/lib/ASN1.c
@@ -1987,14 +1987,14 @@ yyreduce:
 
 /* Line 1806 of yacc.c  */
 #line 233 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_UTC);}
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_UTC_TIME);}
     break;
 
   case 39:
 
 /* Line 1806 of yacc.c  */
 #line 234 "ASN1.y"
-    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_GENERALIZED);}
+    {(yyval.node)=_asn1_add_static_node(ASN1_ETYPE_GENERALIZED_TIME);}
     break;
 
   case 40:
diff --git a/lib/ASN1.y b/lib/ASN1.y
index dafe15a..874eb13 100644
--- a/lib/ASN1.y
+++ b/lib/ASN1.y
@@ -230,8 +230,8 @@ integer_def: INTEGER                    
{$$=_asn1_add_static_node(ASN1_ETYPE_INT
 boolean_def: BOOLEAN   {$$=_asn1_add_static_node(ASN1_ETYPE_BOOLEAN);}
 ;
 
-Time:   UTCTime          {$$=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_UTC);}
-      | GeneralizedTime  
{$$=_asn1_add_static_node(ASN1_ETYPE_TIME|CONST_GENERALIZED);}
+Time:   UTCTime          {$$=_asn1_add_static_node(ASN1_ETYPE_UTC_TIME);}
+      | GeneralizedTime  
{$$=_asn1_add_static_node(ASN1_ETYPE_GENERALIZED_TIME);}
 ;
 
 size_def2: SIZE'('num_identifier')'  
{$$=_asn1_add_static_node(ASN1_ETYPE_SIZE|CONST_1_PARAM);
diff --git a/lib/coding.c b/lib/coding.c
index aa777f3..5361b3f 100644
--- a/lib/coding.c
+++ b/lib/coding.c
@@ -215,7 +215,10 @@ asn1_encode_simple_der (unsigned int etype, const unsigned 
char *str, unsigned i
 
   if (ETYPE_OK(etype) == 0)
     return ASN1_VALUE_NOT_VALID;
-    
+
+  /* doesn't handle constructed classes */
+  if (ETYPE_CLASS(etype) != ASN1_CLASS_UNIVERSAL)
+    return ASN1_VALUE_NOT_VALID;
 
   _asn1_tag_der (ETYPE_CLASS(etype), ETYPE_TAG(etype),
                 der_tag, &tag_len);
@@ -255,11 +258,10 @@ asn1_encode_simple_der (unsigned int etype, const 
unsigned char *str, unsigned i
 /*   ASN1_SUCCESS otherwise                           */
 /******************************************************/
 static int
-_asn1_time_der (unsigned char *str, unsigned char *der, int *der_len)
+_asn1_time_der (unsigned char *str, int str_len, unsigned char *der, int 
*der_len)
 {
   int len_len;
   int max_len;
-  int str_len = _asn1_strlen (str);
 
   max_len = *der_len;
 
@@ -528,7 +530,7 @@ const tag_and_class_st _asn1_tags[] =
   [ASN1_ETYPE_VISIBLE_STRING] =   {ASN1_TAG_VISIBLE_STRING, 
ASN1_CLASS_UNIVERSAL, "type:VISIBLE_STR"},
   [ASN1_ETYPE_OCTET_STRING] =    {ASN1_TAG_OCTET_STRING, ASN1_CLASS_UNIVERSAL, 
"type:OCT_STR"},
   [ASN1_ETYPE_BIT_STRING] = {ASN1_TAG_BIT_STRING, ASN1_CLASS_UNIVERSAL, 
"type:BIT_STR"},
-  [ASN1_ETYPE_OBJECT_ID] =  {ASN1_TAG_OBJECT_ID, ASN1_CLASS_UNIVERSAL, 
"type:OBJ_STR"},
+  [ASN1_ETYPE_OBJECT_ID] =  {ASN1_TAG_OBJECT_ID, ASN1_CLASS_UNIVERSAL, 
"type:OBJ_ID"},
   [ASN1_ETYPE_NULL] =       {ASN1_TAG_NULL, ASN1_CLASS_UNIVERSAL, "type:NULL"},
   [ASN1_ETYPE_BOOLEAN] =    {ASN1_TAG_BOOLEAN, ASN1_CLASS_UNIVERSAL, 
"type:BOOLEAN"},
   [ASN1_ETYPE_INTEGER] =    {ASN1_TAG_INTEGER, ASN1_CLASS_UNIVERSAL, 
"type:INTEGER"},
@@ -537,7 +539,10 @@ const tag_and_class_st _asn1_tags[] =
   [ASN1_ETYPE_SEQUENCE_OF] ={ASN1_TAG_SEQUENCE, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED, "type:SEQ_OF"},
   [ASN1_ETYPE_SET] =        {ASN1_TAG_SET, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED, "type:SET"},
   [ASN1_ETYPE_SET_OF] =     {ASN1_TAG_SET, ASN1_CLASS_UNIVERSAL | 
ASN1_CLASS_STRUCTURED, "type:SET_OF"},
+  [ASN1_ETYPE_GENERALIZED_TIME] = {ASN1_TAG_GENERALIZEDTime, 
ASN1_CLASS_UNIVERSAL, "type:GENERALIZED_TIME"},
+  [ASN1_ETYPE_UTC_TIME] = {ASN1_TAG_UTCTime, ASN1_CLASS_UNIVERSAL, 
"type:UTC_TIME"},
 };
+
 unsigned int _asn1_tags_size = sizeof(_asn1_tags)/sizeof(_asn1_tags[0]);
 
 /******************************************************/
@@ -631,16 +636,6 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, 
int *counter,
       unsigned type = type_field (node->type);
       switch (type)
        {
-       case ASN1_ETYPE_TIME:
-         if (node->type & CONST_UTC)
-           {
-             _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_UTCTime, tag_der,
-                            &tag_len);
-           }
-         else
-           _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_GENERALIZEDTime,
-                          tag_der, &tag_len);
-         break;
         CASE_HANDLED_ETYPES:
          _asn1_tag_der (_asn1_tags[type].class, _asn1_tags[type].tag,
                         tag_der, &tag_len);
@@ -1065,7 +1060,8 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
            }
          move = RIGHT;
          break;
-       case ASN1_ETYPE_TIME:
+       case ASN1_ETYPE_GENERALIZED_TIME:
+       case ASN1_ETYPE_UTC_TIME:
          if (p->value == NULL)
            {
              _asn1_error_description_value_not_found (p, ErrorDescription);
@@ -1073,7 +1069,7 @@ asn1_der_coding (asn1_node element, const char *name, 
void *ider, int *len,
              goto error;
            }
          len2 = max_len;
-         err = _asn1_time_der (p->value, der + counter, &len2);
+         err = _asn1_time_der (p->value, p->value_len, der + counter, &len2);
          if (err != ASN1_SUCCESS && err != ASN1_MEM_ERROR)
            goto error;
 
diff --git a/lib/decoding.c b/lib/decoding.c
index 5df1f36..f02fe10 100644
--- a/lib/decoding.c
+++ b/lib/decoding.c
@@ -511,25 +511,12 @@ _asn1_extract_tag_der (asn1_node node, const unsigned 
char *der, int der_len,
        case ASN1_ETYPE_SEQUENCE_OF:
        case ASN1_ETYPE_SET:
        case ASN1_ETYPE_SET_OF:
+       case ASN1_ETYPE_GENERALIZED_TIME:
+       case ASN1_ETYPE_UTC_TIME:
          if ((class != _asn1_tags[type].class) || (tag != 
_asn1_tags[type].tag))
            return ASN1_DER_ERROR;
          break;
 
-       case ASN1_ETYPE_TIME:
-         if (node->type & CONST_UTC)
-           {
-             if ((class != ASN1_CLASS_UNIVERSAL)
-                 || (tag != ASN1_TAG_UTCTime))
-               return ASN1_DER_ERROR;
-           }
-         else
-           {
-             if ((class != ASN1_CLASS_UNIVERSAL)
-                 || (tag != ASN1_TAG_GENERALIZEDTime))
-               return ASN1_DER_ERROR;
-           }
-         break;
-
        case ASN1_ETYPE_OCTET_STRING:
          /* OCTET STRING is handled differently to allow
           * BER encodings (structured class). */
@@ -1055,7 +1042,8 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
              counter += len2;
              move = RIGHT;
              break;
-           case ASN1_ETYPE_TIME:
+           case ASN1_ETYPE_GENERALIZED_TIME:
+           case ASN1_ETYPE_UTC_TIME:
              result =
                _asn1_get_time_der (der + counter, len - counter, &len2, temp,
                                    sizeof (temp) - 1);
@@ -1064,7 +1052,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, 
int len,
 
              tlen = strlen (temp);
              if (tlen > 0)
-               _asn1_set_value (p, temp, tlen + 1);
+               _asn1_set_value (p, temp, tlen);
              counter += len2;
              move = RIGHT;
              break;
@@ -1707,7 +1695,8 @@ asn1_der_decoding_element (asn1_node * structure, const 
char *elementName,
              counter += len2;
              move = RIGHT;
              break;
-           case ASN1_ETYPE_TIME:
+           case ASN1_ETYPE_GENERALIZED_TIME:
+           case ASN1_ETYPE_UTC_TIME:
              if (state == FOUND)
                {
                  result =
@@ -2347,7 +2336,8 @@ asn1_der_decoding_startEnd (asn1_node element, const void 
*ider, int len,
              counter += len3;
              move = RIGHT;
              break;
-           case ASN1_ETYPE_TIME:
+           case ASN1_ETYPE_UTC_TIME:
+           case ASN1_ETYPE_GENERALIZED_TIME:
            case ASN1_ETYPE_OBJECT_ID:
            case ASN1_ETYPE_INTEGER:
            case ASN1_ETYPE_ENUMERATED:
@@ -2896,6 +2886,10 @@ asn1_decode_simple_der (unsigned int etype, const 
unsigned char *der, unsigned i
   if (ETYPE_OK(etype) == 0)
     return ASN1_VALUE_NOT_VALID;
 
+  /* doesn't handle constructed classes */
+  if (ETYPE_CLASS(etype) != ASN1_CLASS_UNIVERSAL)
+    return ASN1_VALUE_NOT_VALID;
+
   p = der;
   ret = asn1_get_tag_der (p, der_len, &class, &tag_len, &tag);
   if (ret != ASN1_SUCCESS)
diff --git a/lib/element.c b/lib/element.c
index 2e3d48e..2c761c5 100644
--- a/lib/element.c
+++ b/lib/element.c
@@ -276,6 +276,7 @@ asn1_write_value (asn1_node node_root, const char *name,
   int len2, k, k2, negative;
   size_t i;
   const unsigned char *value = ivalue;
+  unsigned int type;
 
   node = asn1_find_node (node_root, name);
   if (node == NULL)
@@ -286,8 +287,10 @@ asn1_write_value (asn1_node node_root, const char *name,
       asn1_delete_structure (&node);
       return ASN1_SUCCESS;
     }
+  
+  type = type_field(node->type);
 
-  if ((type_field (node->type) == ASN1_ETYPE_SEQUENCE_OF) && (value == NULL)
+  if ((type == ASN1_ETYPE_SEQUENCE_OF) && (value == NULL)
       && (len == 0))
     {
       p = node->down;
@@ -301,7 +304,7 @@ asn1_write_value (asn1_node node_root, const char *name,
       return ASN1_SUCCESS;
     }
 
-  switch (type_field (node->type))
+  switch (type)
     {
     case ASN1_ETYPE_BOOLEAN:
       if (!_asn1_strcmp (value, "TRUE"))
@@ -496,8 +499,7 @@ asn1_write_value (asn1_node node_root, const char *name,
        }
       _asn1_set_value (node, value, _asn1_strlen (value) + 1);
       break;
-    case ASN1_ETYPE_TIME:
-      if (node->type & CONST_UTC)
+    case ASN1_ETYPE_UTC_TIME:
        {
          if (_asn1_strlen (value) < 11)
            return ASN1_VALUE_NOT_VALID;
@@ -534,14 +536,13 @@ asn1_write_value (asn1_node node_root, const char *name,
            default:
              return ASN1_VALUE_NOT_FOUND;
            }
-         _asn1_set_value (node, value, _asn1_strlen (value) + 1);
-       }
-      else
-       {                       /* GENERALIZED TIME */
-         if (value)
-           _asn1_set_value (node, value, _asn1_strlen (value) + 1);
+         _asn1_set_value (node, value, _asn1_strlen (value));
        }
       break;
+    case ASN1_ETYPE_GENERALIZED_TIME:
+      if (value)
+        _asn1_set_value (node, value, _asn1_strlen (value));
+      break;
     case ASN1_ETYPE_OCTET_STRING:
     case ASN1_ETYPE_GENERALSTRING:
     case ASN1_ETYPE_NUMERIC_STRING:
@@ -627,6 +628,16 @@ asn1_write_value (asn1_node node_root, const char *name,
                _asn1_strcpy(ptr, data); \
        }
 
+#define PUT_AS_STR_VALUE( ptr, ptr_size, data, data_size) \
+       *len = data_size + 1; \
+       if (ptr_size < *len) { \
+               return ASN1_MEM_ERROR; \
+       } else { \
+               /* this strcpy is checked */ \
+               memcpy(ptr, data, data_size); \
+               ptr[data_size] = 0; \
+       }
+
 #define ADD_STR_VALUE( ptr, ptr_size, data) \
        *len = (int) _asn1_strlen(data) + 1; \
        if (ptr_size < (int) _asn1_strlen(ptr)+(*len)) { \
@@ -892,8 +903,9 @@ asn1_read_value_type (asn1_node root, const char *name, 
void *ivalue, int *len,
          PUT_STR_VALUE (value, value_size, node->value);
        }
       break;
-    case ASN1_ETYPE_TIME:
-      PUT_STR_VALUE (value, value_size, node->value);
+    case ASN1_ETYPE_GENERALIZED_TIME:
+    case ASN1_ETYPE_UTC_TIME:
+      PUT_AS_STR_VALUE (value, value_size, node->value, node->value_len);
       break;
     case ASN1_ETYPE_OCTET_STRING:
     case ASN1_ETYPE_GENERALSTRING:
@@ -1003,14 +1015,6 @@ asn1_read_tag (asn1_node root, const char *name, int 
*tagValue,
        CASE_HANDLED_ETYPES:
          *tagValue = _asn1_tags[type].tag;
          break;
-       case ASN1_ETYPE_TIME:
-         if (node->type & CONST_UTC)
-           {
-             *tagValue = ASN1_TAG_UTCTime;
-           }
-         else
-           *tagValue = ASN1_TAG_GENERALIZEDTime;
-         break;
        case ASN1_ETYPE_TAG:
        case ASN1_ETYPE_CHOICE:
        case ASN1_ETYPE_ANY:
diff --git a/lib/int.h b/lib/int.h
index 9400cb8..ce20ab2 100644
--- a/lib/int.h
+++ b/lib/int.h
@@ -85,11 +85,15 @@ typedef struct tag_and_class_st {
        case ASN1_ETYPE_SEQUENCE: \
        case ASN1_ETYPE_SEQUENCE_OF: \
        case ASN1_ETYPE_SET: \
+       case ASN1_ETYPE_UTC_TIME: \
+       case ASN1_ETYPE_GENERALIZED_TIME: \
        case ASN1_ETYPE_SET_OF
 
 #define ETYPE_TAG(etype) (_asn1_tags[etype].tag)
 #define ETYPE_CLASS(etype) (_asn1_tags[etype].class)
-#define ETYPE_OK(etype) ((etype <= _asn1_tags_size)?1:0)
+#define ETYPE_OK(etype) ((etype != ASN1_ETYPE_INVALID && \
+                          etype <= _asn1_tags_size && \
+                          _asn1_tags[etype].desc != NULL)?1:0)
 
 extern unsigned int _asn1_tags_size;
 extern const tag_and_class_st _asn1_tags[];
@@ -108,12 +112,6 @@ extern const tag_and_class_st _asn1_tags[];
 #define RIGHT  2
 #define DOWN   3
 
-/****************************************/
-/* Returns the first 8 bits.            */
-/* Used with the field type of asn1_node_st */
-/****************************************/
-#define type_field(x)     (x&0xFF)
-
 /***********************************************************************/
 /* List of constants to better specify the type of typedef asn1_node_st.   */
 /***********************************************************************/
@@ -139,6 +137,7 @@ extern const tag_and_class_st _asn1_tags[];
 
 #define CONST_DEFINED_BY  (1<<22)
 
+/* Those two are deprecated and used for backwards compatibility */
 #define CONST_GENERALIZED (1<<23)
 #define CONST_UTC         (1<<24)
 
@@ -151,4 +150,36 @@ extern const tag_and_class_st _asn1_tags[];
 #define CONST_DOWN        (1<<29)
 #define CONST_RIGHT       (1<<30)
 
+
+#define ASN1_ETYPE_TIME 17
+/****************************************/
+/* Returns the first 8 bits.            */
+/* Used with the field type of asn1_node_st */
+/****************************************/
+inline static unsigned int type_field(unsigned int ntype)
+{
+  return (ntype & 0xff);
+}
+
+/* To convert old types from a static structure */
+inline static unsigned int convert_old_type(unsigned int ntype)
+{
+unsigned int type = ntype & 0xff;
+  if (type == ASN1_ETYPE_TIME)
+    {
+      if (type & CONST_UTC)
+        type = ASN1_ETYPE_UTC_TIME;
+      else
+        type = ASN1_ETYPE_GENERALIZED_TIME;
+
+      ntype &= ~(CONST_UTC|CONST_GENERALIZED);
+      ntype &= 0xffffff00;
+      ntype |= type;
+
+      return ntype;
+    }
+  else
+    return ntype;
+}
+
 #endif /* INT_H */
diff --git a/lib/libtasn1.h b/lib/libtasn1.h
index 59c3093..5b50c47 100644
--- a/lib/libtasn1.h
+++ b/lib/libtasn1.h
@@ -135,6 +135,7 @@ extern "C"
   typedef struct asn1_static_node_st asn1_static_node;
 
 /* List of constants for field type of node_asn  */
+#define ASN1_ETYPE_INVALID        0
 #define ASN1_ETYPE_CONSTANT       1
 #define ASN1_ETYPE_IDENTIFIER     2
 #define ASN1_ETYPE_INTEGER        3
@@ -151,7 +152,6 @@ extern "C"
 #define ASN1_ETYPE_SET           14
 #define ASN1_ETYPE_SET_OF        15
 #define ASN1_ETYPE_DEFINITIONS   16
-#define ASN1_ETYPE_TIME          17
 #define ASN1_ETYPE_CHOICE        18
 #define ASN1_ETYPE_IMPORTS       19
 #define ASN1_ETYPE_NULL          20
@@ -165,6 +165,8 @@ extern "C"
 #define ASN1_ETYPE_BMP_STRING     33
 #define ASN1_ETYPE_UTF8_STRING    34
 #define ASN1_ETYPE_VISIBLE_STRING 35
+#define ASN1_ETYPE_UTC_TIME       36
+#define ASN1_ETYPE_GENERALIZED_TIME 37
 
   struct asn1_data_node_st
   {
diff --git a/lib/parser_aux.c b/lib/parser_aux.c
index 7d16fa3..4fcc7d7 100644
--- a/lib/parser_aux.c
+++ b/lib/parser_aux.c
@@ -48,7 +48,7 @@ list_type *firstElement = NULL;
 /* Description: creates a new NODE_ASN element and    */
 /* puts it in the list pointed by firstElement.       */
 /* Parameters:                                        */
-/*   type: type of the new element (see ASN1_ETYPE_         */
+/*   type: type of the new element (see ASN1_ETYPE_   */
 /*         and CONST_ constants).                     */
 /* Return: pointer to the new element.                */
 /******************************************************/
@@ -73,7 +73,7 @@ _asn1_add_static_node (unsigned int type)
   listElement->next = firstElement;
   firstElement = listElement;
 
-  punt->type = type;
+  punt->type = convert_old_type(type);
 
   return punt;
 }
diff --git a/lib/structure.c b/lib/structure.c
index a508030..1659067 100644
--- a/lib/structure.c
+++ b/lib/structure.c
@@ -753,9 +753,6 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
            case ASN1_ETYPE_IDENTIFIER:
              fprintf (out, "type:IDENTIFIER");
              break;
-           case ASN1_ETYPE_TIME:
-             fprintf (out, "type:TIME");
-             break;
            case ASN1_ETYPE_ANY:
              fprintf (out, "type:ANY");
              break;
@@ -826,10 +823,6 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                      fprintf (out, "%02x", (p->value)[k + len2]);
                }
              break;
-           case ASN1_ETYPE_TIME:
-             if (p->value)
-               fprintf (out, "  value:%s", p->value);
-             break;
            case ASN1_ETYPE_BOOLEAN:
              if (p->value)
                {
@@ -853,14 +846,21 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                    }
                }
              break;
-           case ASN1_ETYPE_OCTET_STRING:
+           case ASN1_ETYPE_GENERALIZED_TIME:
+           case ASN1_ETYPE_UTC_TIME:
+             if (p->value)
+               {
+                 fprintf (out, "  value:");
+                  for (k = 0; k < p->value_len; k++)
+                   fprintf (out, "%c", (p->value)[k]);
+               }
+             break;
            case ASN1_ETYPE_GENERALSTRING:
            case ASN1_ETYPE_NUMERIC_STRING:
            case ASN1_ETYPE_IA5_STRING:
            case ASN1_ETYPE_TELETEX_STRING:
            case ASN1_ETYPE_PRINTABLE_STRING:
            case ASN1_ETYPE_UNIVERSAL_STRING:
-           case ASN1_ETYPE_BMP_STRING:
            case ASN1_ETYPE_UTF8_STRING:
            case ASN1_ETYPE_VISIBLE_STRING:
              if (p->value)
@@ -870,6 +870,18 @@ asn1_print_structure (FILE * out, asn1_node structure, 
const char *name,
                  fprintf (out, "  value:");
                  if (len > 0)
                    for (k = 0; k < len; k++)
+                     fprintf (out, "%c", (p->value)[k + len2]);
+               }
+             break;
+           case ASN1_ETYPE_BMP_STRING:
+           case ASN1_ETYPE_OCTET_STRING:
+             if (p->value)
+               {
+                 len2 = -1;
+                 len = asn1_get_length_der (p->value, p->value_len, &len2);
+                 fprintf (out, "  value:");
+                 if (len > 0)
+                   for (k = 0; k < len; k++)
                      fprintf (out, "%02x", (p->value)[k + len2]);
                }
              break;
diff --git a/tests/Test_tree.c b/tests/Test_tree.c
index abfaa5e..bcd3cbe 100644
--- a/tests/Test_tree.c
+++ b/tests/Test_tree.c
@@ -67,361 +67,362 @@ typedef struct
   const char *par2;
   int par3;
   int errorNumber;
+  int line;
 } test_type;
 
 
 test_type test_array[] = {
 
-  {ACT_DELETE, "", "", 0, ASN1_ELEMENT_NOT_FOUND},
+  {ACT_DELETE, "", "", 0, ASN1_ELEMENT_NOT_FOUND, __LINE__},
 
   /* Test: APPLICATION 30 */
-  {ACT_CREATE, "TEST_TREE.KrbError", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "pvno", "5", 0, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 5, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 4, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 5, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.KrbError", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE_ELEMENT, "pvno", "", 0, ASN1_SUCCESS},
-  {ACT_DELETE_ELEMENT, "pvno", "", 0, ASN1_ELEMENT_NOT_FOUND},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.KrbError", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "pvno", "5", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 5, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 4, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 5, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.KrbError", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE_ELEMENT, "pvno", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE_ELEMENT, "pvno", "", 0, ASN1_ELEMENT_NOT_FOUND, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: CHOICE */
-  {ACT_CREATE, "TEST_TREE.CertTemplate", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "version", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "validity", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer", "rdnSequence", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.3", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.CertTemplate", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "version", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "validity", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer", "rdnSequence", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.3", 0, ASN1_SUCCESS, 
__LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value",
    
"\x0c\x18\x71\x75\x61\x73\x61\x72\x2e\x6c\x61\x73\x2e\x69\x63\x2e\x75\x6e\x69\x63\x61\x6d\x70\x2e\x62\x72",
-   26, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.7", 0, ASN1_SUCCESS},
+   26, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.7", 0, ASN1_SUCCESS, 
__LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value",
-   "\x0c\x08\x43\x61\x6d\x70\x69\x6e\x61\x73", 10, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.6", 0, ASN1_SUCCESS},
+   "\x0c\x08\x43\x61\x6d\x70\x69\x6e\x61\x73", 10, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.6", 0, ASN1_SUCCESS, 
__LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value",
-   "\x13\x06\x42\x72\x61\x73\x69\x6c", 8, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.10", 0, ASN1_SUCCESS},
+   "\x13\x06\x42\x72\x61\x73\x69\x6c", 8, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.10", 0, ASN1_SUCCESS, 
__LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value", "\x0c\x02\x49\x43", 4,
-   ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.11", 0, ASN1_SUCCESS},
+   ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.11", 0, ASN1_SUCCESS, 
__LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value", "\x0c\x03\x4c\x41\x53", 5,
-   ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.8", 0, ASN1_SUCCESS},
+   ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "2.5.4.8", 0, ASN1_SUCCESS, 
__LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value",
-   "\x0c\x09\x53\x61\x6f\x20\x50\x61\x75\x6c\x6f", 11, ASN1_SUCCESS},
-  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS},
+   "\x0c\x09\x53\x61\x6f\x20\x50\x61\x75\x6c\x6f", 11, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "issuer.rdnSequence", "NEW", 0, ASN1_SUCCESS, __LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.type", "1.2.840.113549.1.9.1", 0,
-   ASN1_SUCCESS},
+   ASN1_SUCCESS, __LINE__},
   {ACT_WRITE, "issuer.rdnSequence.?LAST.value",
    
"\x16\x19\x65\x64\x75\x61\x72\x64\x6f\x40\x6c\x61\x73\x2e\x69\x63\x2e\x75\x6e\x69\x63\x61\x6d\x70\x2e\x62\x72",
-   27, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 152, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 151, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 152, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.CertTemplate", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?1", "", 0, ASN1_SUCCESS},
+   27, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 152, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 151, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 152, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.CertTemplate", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?1", "", 0, ASN1_SUCCESS, __LINE__},
   {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?1", "", 0,
-   ASN1_ELEMENT_NOT_FOUND},
-  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?3", "", 0, ASN1_SUCCESS},
-  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?5", "", 0, ASN1_SUCCESS},
-  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?7", "", 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+   ASN1_ELEMENT_NOT_FOUND, __LINE__},
+  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?3", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?5", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE_ELEMENT, "issuer.rdnSequence.?7", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: Empty sequnces */
-  {ACT_CREATE, "TEST_TREE.sequenceEmpty", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "int1", "1", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "seq1.int", NULL, 0, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 11, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 10, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 11, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.sequenceEmpty", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "seq1", "START", 5, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "seq1", "END", 6, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "set1", "START", 7, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "set1", "END", 10, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.sequenceEmpty", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int1", "1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "seq1.int", NULL, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 11, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 10, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 11, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.sequenceEmpty", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "seq1", "START", 5, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "seq1", "END", 6, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "set1", "START", 7, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "set1", "END", 10, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: Indefinite Length */
-  {ACT_CREATE, "TEST_TREE.IndefiniteLengthTest", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "int1", "1", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "seq1.int", "2", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set1", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set1.?LAST", "1.2.3.4", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set1", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set1.?LAST", "1.2.5.6", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 255, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.IndefiniteLengthTest", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int1", "1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "seq1.int", "2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set1", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set1.?LAST", "1.2.3.4", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set1", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set1.?LAST", "1.2.5.6", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 255, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
   {ACT_SET_DER,
    
"\x30\x18\xa1\x80\x02\x01\x02\x00\x00\x31\x80\x06\x03\x2a\x03\x04\x06\x03\x2a\x05\x06\x00\x00\x02\x01\x01",
-   0, 26, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.IndefiniteLengthTest", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "seq1", "START", 2, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "seq1", "END", 8, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "set1", "START", 9, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "set1", "END", 22, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+   0, 26, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.IndefiniteLengthTest", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "seq1", "START", 2, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "seq1", "END", 8, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "set1", "START", 9, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "set1", "END", 22, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: OID */
-  {ACT_CREATE, "TEST_TREE.OidTest", 0, 0, ASN1_SUCCESS},
-  {ACT_READ_LENGTH, "oid", NULL, 9, ASN1_MEM_ERROR},
-  {ACT_READ, "oid", "2.5.29.2", 9, ASN1_SUCCESS},
-  {ACT_WRITE, "oid", "1.2.3.4", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "oid2", "2.5.29.1", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "oid3", "1.2.29.2", 0, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 7, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 6, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 7, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.OidTest", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "oid", "START", 2, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "oid", "END", 6, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "", "START", 0, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "", "END", 6, ASN1_SUCCESS},
-  {ACT_READ, "oid2", "2.5.29.1", 9, ASN1_SUCCESS},
-  {ACT_READ, "oid3", "1.2.29.2", 9, ASN1_SUCCESS},
-  {ACT_WRITE, "oid", "1.2.3.4", 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.OidTest", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_LENGTH, "oid", NULL, 9, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ, "oid", "2.5.29.2", 9, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oid", "1.2.3.4", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oid2", "2.5.29.1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oid3", "1.2.29.2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 7, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 6, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 7, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.OidTest", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "oid", "START", 2, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "oid", "END", 6, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "", "START", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "", "END", 6, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "oid2", "2.5.29.1", 9, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "oid3", "1.2.29.2", 9, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oid", "1.2.3.4", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: ENCODING_LENGTH and READ_LEN */
-  {ACT_CREATE, "TEST_TREE.OidAndTimeTest", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "oid", "1.2.3.4", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "time1", "9801011200Z", 1, ASN1_SUCCESS},
-  {ACT_WRITE, "time2", "2001010112001.12-0700", 1, ASN1_SUCCESS},
-  {ACT_WRITE, "oct", "ABCD", 4, ASN1_SUCCESS},
-  {ACT_WRITE, "bol", "TRUE", 1, ASN1_SUCCESS},
-  {ACT_WRITE, "enum", "2", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "bit", "1\xC0", 10, ASN1_SUCCESS},
-  {ACT_WRITE, "any", "\x30\x01\x01", 3, ASN1_SUCCESS},
-  {ACT_WRITE, "set", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set.?LAST", "10", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set", "NEW", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "set.?LAST", "1", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "gen", "Prova", 5, ASN1_SUCCESS},
-  {ACT_READ_LENGTH, "oid", NULL, 8, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "time1", NULL, 12, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "time2", NULL, 22, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "oct", NULL, 4, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "bol", NULL, 5, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "enum", NULL, 1, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "any", NULL, 3, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "gen", NULL, 5, ASN1_MEM_ERROR},
-  {ACT_READ_LENGTH, "bit", NULL, 10, ASN1_MEM_ERROR},
-  {ACT_READ_BIT, "bit", "1\xC0", 10, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 79, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 78, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 79, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.OidAndTimeTest", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.OidAndTimeTest", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oid", "1.2.3.4", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "time1", "9801011200Z", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "time2", "2001010112001.12-0700", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oct", "ABCD", 4, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "bol", "TRUE", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "enum", "2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "bit", "1\xC0", 10, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "any", "\x30\x01\x01", 3, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set.?LAST", "10", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set", "NEW", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "set.?LAST", "1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "gen", "Prova", 5, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_LENGTH, "oid", NULL, 8, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "time1", NULL, 12, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "time2", NULL, 22, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "oct", NULL, 4, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "bol", NULL, 5, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "enum", NULL, 1, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "any", NULL, 3, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "gen", NULL, 5, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_LENGTH, "bit", NULL, 10, ASN1_MEM_ERROR, __LINE__},
+  {ACT_READ_BIT, "bit", "1\xC0", 10, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 79, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 78, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 79, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.OidAndTimeTest", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: OID to STRUCTURE */
-  {ACT_OID_2_STRUCTURE, "2.5.29.3", "", 0, ASN1_ELEMENT_NOT_FOUND},
-  {ACT_OID_2_STRUCTURE, "1.2.29.2", "", 0, ASN1_ELEMENT_NOT_FOUND},
-  {ACT_OID_2_STRUCTURE, "2.5.29.2", "anyTest2", 0, ASN1_SUCCESS},
+  {ACT_OID_2_STRUCTURE, "2.5.29.3", "", 0, ASN1_ELEMENT_NOT_FOUND, __LINE__},
+  {ACT_OID_2_STRUCTURE, "1.2.29.2", "", 0, ASN1_ELEMENT_NOT_FOUND, __LINE__},
+  {ACT_OID_2_STRUCTURE, "2.5.29.2", "anyTest2", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: READ TAG and CLASS */
-  {ACT_CREATE, "TEST_TREE.SequenceTestTag", 0, 0, ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "int", "", 0, ASN1_ELEMENT_NOT_FOUND},
-  {ACT_READ_TAG_CLASS, "int1", "TAG", ASN1_TAG_INTEGER, ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "int1", "CLASS", ASN1_CLASS_UNIVERSAL, ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "int2", "TAG", 3, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.SequenceTestTag", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_TAG_CLASS, "int", "", 0, ASN1_ELEMENT_NOT_FOUND, __LINE__},
+  {ACT_READ_TAG_CLASS, "int1", "TAG", ASN1_TAG_INTEGER, ASN1_SUCCESS, 
__LINE__},
+  {ACT_READ_TAG_CLASS, "int1", "CLASS", ASN1_CLASS_UNIVERSAL, ASN1_SUCCESS, 
__LINE__},
+  {ACT_READ_TAG_CLASS, "int2", "TAG", 3, ASN1_SUCCESS, __LINE__},
   {ACT_READ_TAG_CLASS, "int2", "CLASS", ASN1_CLASS_CONTEXT_SPECIFIC,
-   ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "str1", "TAG", 1, ASN1_SUCCESS},
+   ASN1_SUCCESS, __LINE__},
+  {ACT_READ_TAG_CLASS, "str1", "TAG", 1, ASN1_SUCCESS, __LINE__},
   {ACT_READ_TAG_CLASS, "str1", "CLASS", ASN1_CLASS_CONTEXT_SPECIFIC,
-   ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "str2", "TAG", 28, ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "str2", "CLASS", ASN1_CLASS_UNIVERSAL, ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "str3", "TAG", 28, ASN1_SUCCESS},
-  {ACT_READ_TAG_CLASS, "str3", "CLASS", ASN1_CLASS_UNIVERSAL, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+   ASN1_SUCCESS, __LINE__},
+  {ACT_READ_TAG_CLASS, "str2", "TAG", 28, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_TAG_CLASS, "str2", "CLASS", ASN1_CLASS_UNIVERSAL, ASN1_SUCCESS, 
__LINE__},
+  {ACT_READ_TAG_CLASS, "str3", "TAG", 28, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_TAG_CLASS, "str3", "CLASS", ASN1_CLASS_UNIVERSAL, ASN1_SUCCESS, 
__LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: OBJECT IDENTIFIER  elements */
-  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "int1", "v2", 0, ASN1_SUCCESS},
-  {ACT_READ, "int1", "\x01", 1, ASN1_SUCCESS},
-  {ACT_WRITE, "int2", "0", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "oct", "\x02\x01\x0a", 3, ASN1_SUCCESS},
-  {ACT_WRITE, "id", "1 2 3 4 5", 0, ASN1_VALUE_NOT_VALID},
-  {ACT_WRITE, "id", "2.5.29.2", 0, ASN1_SUCCESS},
-  {ACT_READ, "id", "2.5.29.2", 9, ASN1_SUCCESS},
-  {ACT_READ_LENGTH, "id", NULL, 9, ASN1_MEM_ERROR},
-  {ACT_WRITE, "any1", "\x02\x01\x05", 3, ASN1_SUCCESS},
-  {ACT_READ_DEFINITIONS, "TEST_TREE.id-anyTest", "2.5.29.1", 9, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 20, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 19, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 200, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "id", "START", 7, ASN1_SUCCESS},
-  {ACT_READ, "id", "2.5.29.2", 9, ASN1_SUCCESS},
-  {ACT_EXPAND_ANY, "", NULL, 0, ASN1_SUCCESS},
-  {ACT_EXPAND_OCTET, "oct", "id", 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int1", "v2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "int1", "\x01", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int2", "0", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oct", "\x02\x01\x0a", 3, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "id", "1 2 3 4 5", 0, ASN1_VALUE_NOT_VALID, __LINE__},
+  {ACT_WRITE, "id", "2.5.29.2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "id", "2.5.29.2", 9, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_LENGTH, "id", NULL, 9, ASN1_MEM_ERROR, __LINE__},
+  {ACT_WRITE, "any1", "\x02\x01\x05", 3, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_DEFINITIONS, "TEST_TREE.id-anyTest", "2.5.29.1", 9, ASN1_SUCCESS, 
__LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 20, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 19, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 200, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "id", "START", 7, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "id", "2.5.29.2", 9, ASN1_SUCCESS, __LINE__},
+  {ACT_EXPAND_ANY, "", NULL, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_EXPAND_OCTET, "oct", "id", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: CHOICE elements */
-  {ACT_CREATE, "TEST_TREE.X520LocalityName", 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "", "teletexString", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "teletexString", "PROVA", 5, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 7, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 6, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 7, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.X520LocalityName", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.X520LocalityName", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "", "teletexString", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "teletexString", "PROVA", 5, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 7, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 6, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 7, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.X520LocalityName", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: OPTIONAL elements */
-  {ACT_CREATE, "TEST_TREE.DHParameter", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "prime", "1", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "base", "2", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "privateValueLength", NULL, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 8, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 7, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 8, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.DHParameter", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.DHParameter", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "prime", "1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "base", "2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "privateValueLength", NULL, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 8, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 7, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 8, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.DHParameter", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: Integer */
-  {ACT_CREATE, "TEST_TREE.AnyTest2", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "", "int", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "0", 0, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 3, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 2, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 3, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "-1", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "1", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "2000000000", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "-2000000000", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "-20000000000", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_WRITE, "int", "20000000000", 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.AnyTest2", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "", "int", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "0", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 3, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 2, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 3, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "-1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "2000000000", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "-2000000000", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "-20000000000", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int", "20000000000", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test: elements without names */
-  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "int2", "10", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "seq", "NEW", 1, ASN1_SUCCESS},
-  {ACT_WRITE, "seq.?LAST", "1", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "seq", "NEW", 1, ASN1_SUCCESS},
-  {ACT_WRITE, "seq.?LAST", "2", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "any1", NULL, 0, ASN1_SUCCESS},
-  {ACT_NUMBER_OF_ELEMENTS, "seq", "", 2, ASN1_SUCCESS},
-  {ACT_WRITE, "id", "1.2.3.4", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "oct", "\x30\x03\x02\x01\x15", 5, ASN1_SUCCESS},
-  {ACT_ENCODING, "int2", 0, 1024, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_ENCODING, "seq.?2", 0, 2, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "seq.?2", 0, 3, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 25, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 24, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 25, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_ELEMENT, "int2", 0, 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_READ, "int2", "\x0a", 1, ASN1_SUCCESS},
-  {ACT_READ_LENGTH, "int2", NULL, 1, ASN1_MEM_ERROR},
-  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_START_END, "seq.?2", "START", 10, ASN1_SUCCESS},
-  {ACT_EXPAND_OCTET, "oct", "id", 0, ASN1_SUCCESS},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "int2", "10", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "seq", "NEW", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "seq.?LAST", "1", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "seq", "NEW", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "seq.?LAST", "2", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "any1", NULL, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_NUMBER_OF_ELEMENTS, "seq", "", 2, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "id", "1.2.3.4", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "oct", "\x30\x03\x02\x01\x15", 5, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "int2", 0, 1024, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING, "seq.?2", 0, 2, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "seq.?2", 0, 3, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 25, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 24, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 25, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_ELEMENT, "int2", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "int2", "\x0a", 1, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_LENGTH, "int2", NULL, 1, ASN1_MEM_ERROR, __LINE__},
+  {ACT_CREATE, "TEST_TREE.Sequence1", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_START_END, "seq.?2", "START", 10, ASN1_SUCCESS, __LINE__},
+  {ACT_EXPAND_OCTET, "oct", "id", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Test GeneralString */
-  {ACT_CREATE, "TEST_TREE.Test3", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "a", "1234", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "b", "prova", 5, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 17, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 16, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 17, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.Test3", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_ELEMENT, "b", 0, 0, ASN1_SUCCESS},
-  {ACT_READ, "b", "prova", 5, ASN1_SUCCESS},
-  {ACT_READ_LENGTH, "b", NULL, 5, ASN1_MEM_ERROR},
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.Test3", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "a", "1234", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "b", "prova", 5, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 17, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 16, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 17, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.Test3", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_ELEMENT, "b", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "b", "prova", 5, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_LENGTH, "b", NULL, 5, ASN1_MEM_ERROR, __LINE__},
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* Bug regression test: Empty write on 64-bit platforms */
-  {ACT_CREATE, "TEST_TREE.Checksum", 0, 0, ASN1_SUCCESS},
-  {ACT_WRITE, "checksum", "foo", 0, ASN1_SUCCESS},
-  {ACT_WRITE, "checksum", "", 0, ASN1_SUCCESS},
-  {ACT_ENCODING_LENGTH, "", 0, 4, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 3, ASN1_MEM_ERROR},
-  {ACT_ENCODING, "", 0, 4, ASN1_SUCCESS},
-  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
-  {ACT_CREATE, "TEST_TREE.Checksum", 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS},
-  {ACT_DECODING_ELEMENT, "checksum", 0, 0, ASN1_SUCCESS},
-  {ACT_READ, "checksum", "", 0, ASN1_SUCCESS},
-  {ACT_READ_LENGTH, "checksum", NULL, 0, ASN1_SUCCESS},        /* MEM_FAILURE? 
*/
-  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS},
-  {ACT_DELETE, "", "", 0, ASN1_SUCCESS},
+  {ACT_CREATE, "TEST_TREE.Checksum", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "checksum", "foo", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_WRITE, "checksum", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_ENCODING_LENGTH, "", 0, 4, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 3, ASN1_MEM_ERROR, __LINE__},
+  {ACT_ENCODING, "", 0, 4, ASN1_SUCCESS, __LINE__},
+  {ACT_PRINT_DER, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_CREATE, "TEST_TREE.Checksum", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING, 0, 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_DECODING_ELEMENT, "checksum", 0, 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ, "checksum", "", 0, ASN1_SUCCESS, __LINE__},
+  {ACT_READ_LENGTH, "checksum", NULL, 0, ASN1_SUCCESS, __LINE__},      /* 
MEM_FAILURE? */
+  {ACT_VISIT, "", "", ASN1_PRINT_ALL, ASN1_SUCCESS, __LINE__},
+  {ACT_DELETE, "", "", 0, ASN1_SUCCESS, __LINE__},
 
   /* end */
   {ACT_NULL}
@@ -429,6 +430,8 @@ test_type test_array[] = {
 };
 
 
+#define  error() fprintf(stderr, "Error at line %d\n", __LINE__); exit(1)
+
 int
 main (int argc, char *argv[])
 {
@@ -625,25 +628,27 @@ main (int argc, char *argv[])
          if (result != test->errorNumber)
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s - %s - %d\n", test->action,
                      test->par1, test->par2, test->par3);
              printf ("  Error expected: %s\n",
                      asn1_strerror (test->errorNumber));
              printf ("  Error detected: %s\n\n", asn1_strerror (result));
+             error();
            }
          break;
        case ACT_DECODING_ELEMENT:
          if (result != test->errorNumber)
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s - %s - %d\n", test->action,
                      test->par1, test->par2, test->par3);
              printf ("  Error expected: %s\n",
                      asn1_strerror (test->errorNumber));
              printf ("  Error detected: %s\n", asn1_strerror (result));
              printf ("  Error description : %s\n\n", errorDescription);
+             error();
            }
          break;
        case ACT_NUMBER_OF_ELEMENTS:
@@ -651,24 +656,26 @@ main (int argc, char *argv[])
          if ((result != test->errorNumber) || (valueLen != test->par3))
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s\n", test->action, test->par1);
              printf ("  Error expected: %s - %d\n",
                      asn1_strerror (test->errorNumber), test->par3);
              printf ("  Error detected: %s - %d\n\n", asn1_strerror (result),
                      valueLen);
+             error();
            }
          break;
        case ACT_ENCODING_LENGTH:
          if ((result != test->errorNumber) || (der_len != test->par3))
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s\n", test->action, test->par1);
              printf ("  Error expected: %s - %d\n",
                      asn1_strerror (test->errorNumber), test->par3);
              printf ("  Error detected: %s - %d\n\n", asn1_strerror (result),
                      der_len);
+             error();
            }
          break;
        case ACT_OID_2_STRUCTURE:
@@ -678,11 +685,12 @@ main (int argc, char *argv[])
               && (strcmp (str_p, test->par2))))
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s\n", test->action, test->par1);
              printf ("  Error expected: %s - %s\n",
                      asn1_strerror (test->errorNumber), test->par2);
              printf ("  Value detected: %s\n\n", str_p);
+             error();
            }
          break;
        case ACT_DECODING_START_END:
@@ -691,7 +699,7 @@ main (int argc, char *argv[])
              ((!strcmp (test->par2, "END")) && (end != test->par3)))
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s - %d\n", test->action, test->par1,
                      test->par3);
              printf ("  Error expected: %s - %s - %d\n",
@@ -699,6 +707,7 @@ main (int argc, char *argv[])
                      test->par3);
              printf ("  Error detected: %s - %d - %d\n\n",
                      asn1_strerror (result), start, end);
+             error();
            }
          break;
 
@@ -708,7 +717,7 @@ main (int argc, char *argv[])
              ((!strcmp (test->par2, "CLASS")) && (class != test->par3)))
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s - %d\n", test->action, test->par1,
                      test->par3);
              printf ("  Error expected: %s - %s - %d\n",
@@ -716,6 +725,7 @@ main (int argc, char *argv[])
                      test->par3);
              printf ("  Error detected: %s - %d - %d\n\n",
                      asn1_strerror (result), tag, class);
+             error();
            }
 
          break;
@@ -746,7 +756,7 @@ main (int argc, char *argv[])
              (valueLen != test->par3) || (k == -1))
            {
              errorCounter++;
-             printf ("ERROR N. %d:\n", errorCounter);
+             printf ("ERROR in %d:\n", test->line);
              printf ("  Action %d - %s\n", test->action, test->par1);
              printf ("  Error expected: %s - %d - ",
                      asn1_strerror (test->errorNumber), test->par3);
@@ -758,6 +768,7 @@ main (int argc, char *argv[])
                printf ("%02x", value[k]);
              printf ("\n\n");
 
+             error();
            }
 
          break;


hooks/post-receive
-- 
GNU libtasn1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]