small simplifications
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 22 Nov 2012 18:38:38 +0000 (19:38 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 22 Nov 2012 18:39:17 +0000 (19:39 +0100)
lib/coding.c
lib/decoding.c
lib/element.c
lib/int.h
lib/structure.c

index af5c1b7..ba59257 100644 (file)
@@ -431,26 +431,26 @@ _asn1_complete_explicit_tag (asn1_node node, unsigned char *der,
 
 tag_and_class_st _asn1_tags[] =
 {
-  [ASN1_ETYPE_GENERALSTRING] = {ASN1_TAG_GENERALSTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_NUMERICSTRING] = {ASN1_TAG_NUMERICSTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_IA5STRING] =     {ASN1_TAG_IA5STRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_TELETEXSTRING] = {ASN1_TAG_TELETEXSTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_PRINTABLESTRING] = {ASN1_TAG_PRINTABLESTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_UNIVERSALSTRING] = {ASN1_TAG_UNIVERSALSTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_BMPSTRING] =     {ASN1_TAG_BMPSTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_UTF8STRING] =    {ASN1_TAG_UTF8STRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_VISIBLESTRING] = {ASN1_TAG_VISIBLESTRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_OCTET_STRING] = {ASN1_TAG_OCTET_STRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_BIT_STRING] = {ASN1_TAG_BIT_STRING, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_OBJECT_ID] =  {ASN1_TAG_OBJECT_ID, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_NULL] =       {ASN1_TAG_NULL, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_BOOLEAN] =    {ASN1_TAG_BOOLEAN, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_INTEGER] =    {ASN1_TAG_INTEGER, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_ENUMERATED] = {ASN1_TAG_ENUMERATED, ASN1_CLASS_UNIVERSAL},
-  [ASN1_ETYPE_SEQUENCE] =   {ASN1_TAG_SEQUENCE, ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED},
-  [ASN1_ETYPE_SEQUENCE_OF] ={ASN1_TAG_SEQUENCE, ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED},
-  [ASN1_ETYPE_SET] =        {ASN1_TAG_SET, ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED},
-  [ASN1_ETYPE_SET_OF] =     {ASN1_TAG_SET, ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED},
+  [ASN1_ETYPE_GENERALSTRING] = {ASN1_TAG_GENERALSTRING, ASN1_CLASS_UNIVERSAL, "type:GENERALSTRING"},
+  [ASN1_ETYPE_NUMERICSTRING] = {ASN1_TAG_NUMERICSTRING, ASN1_CLASS_UNIVERSAL, "type:NUMERIC_STR"},
+  [ASN1_ETYPE_IA5STRING] =     {ASN1_TAG_IA5STRING, ASN1_CLASS_UNIVERSAL, "type:IA5_STR"},
+  [ASN1_ETYPE_TELETEXSTRING] = {ASN1_TAG_TELETEXSTRING, ASN1_CLASS_UNIVERSAL, "type:TELETEX_STR"},
+  [ASN1_ETYPE_PRINTABLESTRING] = {ASN1_TAG_PRINTABLESTRING, ASN1_CLASS_UNIVERSAL, "type:PRINTABLE_STR"},
+  [ASN1_ETYPE_UNIVERSALSTRING] = {ASN1_TAG_UNIVERSALSTRING, ASN1_CLASS_UNIVERSAL, "type:UNIVERSAL_STR"},
+  [ASN1_ETYPE_BMPSTRING] =     {ASN1_TAG_BMPSTRING, ASN1_CLASS_UNIVERSAL, "type:BMP_STR"},
+  [ASN1_ETYPE_UTF8STRING] =    {ASN1_TAG_UTF8STRING, ASN1_CLASS_UNIVERSAL, "type:UTF8_STR"},
+  [ASN1_ETYPE_VISIBLESTRING] = {ASN1_TAG_VISIBLESTRING, 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_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"},
+  [ASN1_ETYPE_ENUMERATED] = {ASN1_TAG_ENUMERATED, ASN1_CLASS_UNIVERSAL, "type:ENUMERATED"},
+  [ASN1_ETYPE_SEQUENCE] =   {ASN1_TAG_SEQUENCE, ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED, "type:SEQUENCE"},
+  [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"},
 };
 
 /******************************************************/
@@ -554,26 +554,7 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, int *counter,
            _asn1_tag_der (ASN1_CLASS_UNIVERSAL, ASN1_TAG_GENERALIZEDTime,
                           tag_der, &tag_len);
          break;
-       case ASN1_ETYPE_OBJECT_ID:
-       case ASN1_ETYPE_OCTET_STRING:
-       case ASN1_ETYPE_GENERALSTRING:
-       case ASN1_ETYPE_NUMERICSTRING:
-       case ASN1_ETYPE_IA5STRING:
-       case ASN1_ETYPE_TELETEXSTRING:
-       case ASN1_ETYPE_PRINTABLESTRING:
-       case ASN1_ETYPE_UNIVERSALSTRING:
-       case ASN1_ETYPE_BMPSTRING:
-       case ASN1_ETYPE_UTF8STRING:
-       case ASN1_ETYPE_VISIBLESTRING:
-       case ASN1_ETYPE_BIT_STRING:
-       case ASN1_ETYPE_NULL:
-       case ASN1_ETYPE_BOOLEAN:
-       case ASN1_ETYPE_INTEGER:
-       case ASN1_ETYPE_ENUMERATED:
-       case ASN1_ETYPE_SEQUENCE:
-       case ASN1_ETYPE_SEQUENCE_OF:
-       case ASN1_ETYPE_SET:
-       case ASN1_ETYPE_SET_OF:
+        CASE_TAGGED_TYPES:
          _asn1_tag_der (_asn1_tags[type].class, _asn1_tags[type].tag,
                         tag_der, &tag_len);
          break;
index 5a844b8..eb4ca0e 100644 (file)
@@ -531,7 +531,8 @@ _asn1_extract_tag_der (asn1_node node, const unsigned char *der, int der_len,
          break;
 
        case ASN1_ETYPE_OCTET_STRING:
-         /* does it need to be structured??? --nmav */
+         /* OCTET STRING is handled differently to allow
+          * BER encodings (structured class). */
          if (((class != ASN1_CLASS_UNIVERSAL)
               && (class != (ASN1_CLASS_UNIVERSAL | ASN1_CLASS_STRUCTURED)))
              || (tag != ASN1_TAG_OCTET_STRING))
index 2c6a2fd..f1d002e 100644 (file)
@@ -926,26 +926,7 @@ asn1_read_tag (asn1_node root, const char *name, int *tagValue,
 
       switch (type)
        {
-       case ASN1_ETYPE_NULL:
-       case ASN1_ETYPE_BOOLEAN:
-       case ASN1_ETYPE_INTEGER:
-       case ASN1_ETYPE_ENUMERATED:
-       case ASN1_ETYPE_OBJECT_ID:
-       case ASN1_ETYPE_OCTET_STRING:
-       case ASN1_ETYPE_GENERALSTRING:
-        case ASN1_ETYPE_NUMERICSTRING:
-        case ASN1_ETYPE_IA5STRING:
-        case ASN1_ETYPE_TELETEXSTRING:
-        case ASN1_ETYPE_PRINTABLESTRING:
-        case ASN1_ETYPE_UNIVERSALSTRING:
-        case ASN1_ETYPE_BMPSTRING:
-        case ASN1_ETYPE_UTF8STRING:
-        case ASN1_ETYPE_VISIBLESTRING:
-       case ASN1_ETYPE_BIT_STRING:
-       case ASN1_ETYPE_SEQUENCE:
-       case ASN1_ETYPE_SEQUENCE_OF:
-       case ASN1_ETYPE_SET:
-       case ASN1_ETYPE_SET_OF:
+       CASE_TAGGED_TYPES:
          *tagValue = _asn1_tags[type].tag;
          break;
        case ASN1_ETYPE_TIME:
index 7791906..7dedd88 100644 (file)
--- a/lib/int.h
+++ b/lib/int.h
@@ -61,8 +61,32 @@ struct asn1_node_st
 typedef struct tag_and_class_st {
   unsigned tag;
   unsigned class;
+  const char* desc;
 } tag_and_class_st;
 
+/* the types that are handled in _asn1_tags */
+#define CASE_TAGGED_TYPES \
+       case ASN1_ETYPE_NULL: \
+       case ASN1_ETYPE_BOOLEAN: \
+       case ASN1_ETYPE_INTEGER: \
+       case ASN1_ETYPE_ENUMERATED: \
+       case ASN1_ETYPE_OBJECT_ID: \
+       case ASN1_ETYPE_OCTET_STRING: \
+       case ASN1_ETYPE_GENERALSTRING: \
+        case ASN1_ETYPE_NUMERICSTRING: \
+        case ASN1_ETYPE_IA5STRING: \
+        case ASN1_ETYPE_TELETEXSTRING: \
+        case ASN1_ETYPE_PRINTABLESTRING: \
+        case ASN1_ETYPE_UNIVERSALSTRING: \
+        case ASN1_ETYPE_BMPSTRING: \
+        case ASN1_ETYPE_UTF8STRING: \
+        case ASN1_ETYPE_VISIBLESTRING: \
+       case ASN1_ETYPE_BIT_STRING: \
+       case ASN1_ETYPE_SEQUENCE: \
+       case ASN1_ETYPE_SEQUENCE_OF: \
+       case ASN1_ETYPE_SET: \
+       case ASN1_ETYPE_SET_OF
+
 extern tag_and_class_st _asn1_tags[];
 
 #define _asn1_strlen(s) strlen((const char *) s)
index 34fd6f0..eee15a3 100644 (file)
@@ -732,7 +732,8 @@ asn1_print_structure (FILE * out, asn1_node structure, const char *name,
 
       if (mode != ASN1_PRINT_NAME)
        {
-         switch (type_field (p->type))
+         unsigned type = type_field (p->type);
+         switch (type)
            {
            case ASN1_ETYPE_CONSTANT:
              if (mode == ASN1_PRINT_ALL)
@@ -749,81 +750,24 @@ asn1_print_structure (FILE * out, asn1_node structure, const char *name,
            case ASN1_ETYPE_DEFAULT:
              fprintf (out, "type:DEFAULT");
              break;
-           case ASN1_ETYPE_NULL:
-             fprintf (out, "type:NULL");
-             break;
            case ASN1_ETYPE_IDENTIFIER:
              fprintf (out, "type:IDENTIFIER");
              break;
-           case ASN1_ETYPE_INTEGER:
-             fprintf (out, "type:INTEGER");
-             break;
-           case ASN1_ETYPE_ENUMERATED:
-             fprintf (out, "type:ENUMERATED");
-             break;
            case ASN1_ETYPE_TIME:
              fprintf (out, "type:TIME");
              break;
-           case ASN1_ETYPE_BOOLEAN:
-             fprintf (out, "type:BOOLEAN");
-             break;
-           case ASN1_ETYPE_SEQUENCE:
-             fprintf (out, "type:SEQUENCE");
-             break;
-           case ASN1_ETYPE_BIT_STRING:
-             fprintf (out, "type:BIT_STR");
-             break;
-           case ASN1_ETYPE_OCTET_STRING:
-             fprintf (out, "type:OCT_STR");
-             break;
-           case ASN1_ETYPE_GENERALSTRING:
-             fprintf (out, "type:GENERALSTRING");
-             break;
-           case ASN1_ETYPE_NUMERICSTRING:
-             fprintf (out, "type:NUMERICSTRING");
-             break;
-           case ASN1_ETYPE_IA5STRING:
-             fprintf (out, "type:IA5STRING");
-             break;
-           case ASN1_ETYPE_TELETEXSTRING:
-             fprintf (out, "type:TELETEXSTRING");
-             break;
-           case ASN1_ETYPE_PRINTABLESTRING:
-             fprintf (out, "type:PRINTABLESTRING");
-             break;
-           case ASN1_ETYPE_UNIVERSALSTRING:
-             fprintf (out, "type:UNIVERSALSTRING");
-             break;
-           case ASN1_ETYPE_BMPSTRING:
-             fprintf (out, "type:BMPSTRING");
-             break;
-           case ASN1_ETYPE_UTF8STRING:
-             fprintf (out, "type:UTF8STRING");
-             break;
-           case ASN1_ETYPE_VISIBLESTRING:
-             fprintf (out, "type:VISIBLESTRING");
-             break;
-           case ASN1_ETYPE_SEQUENCE_OF:
-             fprintf (out, "type:SEQ_OF");
-             break;
-           case ASN1_ETYPE_OBJECT_ID:
-             fprintf (out, "type:OBJ_ID");
-             break;
            case ASN1_ETYPE_ANY:
              fprintf (out, "type:ANY");
              break;
-           case ASN1_ETYPE_SET:
-             fprintf (out, "type:SET");
-             break;
-           case ASN1_ETYPE_SET_OF:
-             fprintf (out, "type:SET_OF");
-             break;
            case ASN1_ETYPE_CHOICE:
              fprintf (out, "type:CHOICE");
              break;
            case ASN1_ETYPE_DEFINITIONS:
              fprintf (out, "type:DEFINITIONS");
              break;
+            CASE_TAGGED_TYPES:
+             fprintf (out, "%s", _asn1_tags[type].desc);
+             break;
            default:
              break;
            }