New function to convert ASN1 tag values to strings. Also fix typo in asn1.h
authorDr. Stephen Henson <steve@openssl.org>
Tue, 7 Sep 1999 12:16:29 +0000 (12:16 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 7 Sep 1999 12:16:29 +0000 (12:16 +0000)
CHANGES
crypto/asn1/asn1.h
crypto/asn1/asn1_par.c

diff --git a/CHANGES b/CHANGES
index c246ca9..2f40440 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,10 @@
 
  Changes between 0.9.4 and 0.9.5  [xx XXX 1999]
 
+  *) New function ANS1_tag2str() to convert an ASN1 tag to a descriptive
+     ASCII string. This was handled independently in various places before.
+     [Steve Henson]
+
   *) New functions UTF8_getc() and UTF8_putc() that parse and generate
      UTF8 strings a character at a time.
      [Steve Henson]
index 0ef18ac..bb5c121 100644 (file)
@@ -379,7 +379,7 @@ typedef struct asn1_header_st
                (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\
                ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING)
 
-#define ASN1_T61STRING_new()   (ASN1_T61STRING_STRING *)\
+#define ASN1_T61STRING_new()   (ASN1_T61STRING *)\
                ASN1_STRING_type_new(V_ASN1_T61STRING)
 #define ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a)
 #define M_i2d_ASN1_T61STRING(a,pp) \
@@ -658,6 +658,7 @@ int ASN1_TIME_print(BIO *fp,ASN1_TIME *a);
 int ASN1_STRING_print(BIO *bp,ASN1_STRING *v);
 int ASN1_parse(BIO *bp,unsigned char *pp,long len,int indent);
 #endif
+const char *ASN1_tag2str(int tag);
 
 /* Used to load and write netscape format cert/key */
 int i2d_ASN1_HEADER(ASN1_HEADER *a,unsigned char **pp);
index 8688660..8209b7f 100644 (file)
@@ -93,55 +93,8 @@ static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
                sprintf(str,"cont [ %d ]",tag);
        else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
                sprintf(str,"appl [ %d ]",tag);
-       else if ((tag == V_ASN1_EOC) /* && (xclass == V_ASN1_UNIVERSAL) */)
-               p="EOC";
-       else if (tag == V_ASN1_BOOLEAN)
-               p="BOOLEAN";
-       else if (tag == V_ASN1_INTEGER)
-               p="INTEGER";
-       else if (tag == V_ASN1_ENUMERATED)
-               p="ENUMERATED";
-       else if (tag == V_ASN1_BIT_STRING)
-               p="BIT STRING";
-       else if (tag == V_ASN1_OCTET_STRING)
-               p="OCTET STRING";
-       else if (tag == V_ASN1_NULL)
-               p="NULL";
-       else if (tag == V_ASN1_OBJECT)
-               p="OBJECT";
-       else if (tag == V_ASN1_SEQUENCE)
-               p="SEQUENCE";
-       else if (tag == V_ASN1_SET)
-               p="SET";
-       else if (tag == V_ASN1_PRINTABLESTRING)
-               p="PRINTABLESTRING";
-       else if (tag == V_ASN1_T61STRING)
-               p="T61STRING";
-       else if (tag == V_ASN1_IA5STRING)
-               p="IA5STRING";
-       else if (tag == V_ASN1_UTCTIME)
-               p="UTCTIME";
+       else p = ASN1_tag2str(tag);
 
-       /* extras */
-       else if (tag == V_ASN1_NUMERICSTRING)
-               p="NUMERICSTRING";
-       else if (tag == V_ASN1_VIDEOTEXSTRING)
-               p="VIDEOTEXSTRING";
-       else if (tag == V_ASN1_GENERALIZEDTIME)
-               p="GENERALIZEDTIME";
-       else if (tag == V_ASN1_GRAPHICSTRING)
-               p="GRAPHICSTRING";
-       else if (tag == V_ASN1_VISIBLESTRING)
-               p="VISIBLESTRING";
-       else if (tag == V_ASN1_GENERALSTRING)
-               p="GENERALSTRING";
-       else if (tag == V_ASN1_UNIVERSALSTRING)
-               p="UNIVERSALSTRING";
-       else if (tag == V_ASN1_BMPSTRING)
-               p="BMPSTRING";
-       else
-               p2="(unknown)";
-               
        if (p2 != NULL)
                {
                if (BIO_printf(bp,fmt2,tag,p2) <= 0) goto err;
@@ -409,3 +362,24 @@ end:
        *pp=p;
        return(ret);
        }
+
+const char *ASN1_tag2str(int tag)
+{
+       const static char *tag2str[] = {
+        "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", /* 0-4 */
+        "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", /* 5-9 */
+        "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>",      /* 10-13 */
+       "<ASN1 14>", "<ASN1 15>", "SEQUENCE", "SET",                /* 15-17 */
+       "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",            /* 18-20 */
+       "VIDEOTEXSTRING", "IA5STRING", "UTCTIME" "GENERALIZEDTIME", /* 21-24 */
+       "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING",          /* 25-27 */
+       "UNIVERSALSTRING", "<ASN1 29>", "BMPSTRING"                 /* 28-30 */
+       };
+
+       if((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
+                                                       tag &= ~0x100;
+
+       if(tag < 0 || tag > 30) return "(unknown)";
+       return tag2str[tag];
+}
+