Fix for d2i_ASN1_bytes and stop PKCS#7 routines crashing is signed message
[oweals/openssl.git] / crypto / asn1 / asn1_par.c
index 9cddfb497b2f13c20821fbc4e10e050c84ab26d8..8209b7f24063e7c716b6c46b468a2b0dc76f6e02 100644 (file)
 
 #include <stdio.h>
 #include "cryptlib.h"
-#include "buffer.h"
-#include "objects.h"
-#include "x509.h"
+#include <openssl/buffer.h>
+#include <openssl/objects.h>
+#include <openssl/asn1.h>
 
-#ifndef NOPROTO
 static int asn1_print_info(BIO *bp, int tag, int xclass,int constructed,
        int indent);
 static int asn1_parse2(BIO *bp, unsigned char **pp, long length,
        int offset, int depth, int indent);
-#else
-static int asn1_print_info();
-static int asn1_parse2();
-#endif
-
-static int asn1_print_info(bp, tag, xclass, constructed,indent)
-BIO *bp;
-int tag;
-int xclass;
-int constructed;
-int indent;
+static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
+            int indent)
        {
        static const char fmt[]="%-18s";
        static const char fmt2[]="%2d %-15s";
@@ -103,55 +93,8 @@ int indent;
                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_ISO64STRING)
-               p="ISO64STRING";
-       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;
@@ -165,22 +108,13 @@ err:
        return(0);
        }
 
-int ASN1_parse(bp, pp, len, indent)
-BIO *bp;
-unsigned char *pp;
-long len;
-int indent;
+int ASN1_parse(BIO *bp, unsigned char *pp, long len, int indent)
        {
        return(asn1_parse2(bp,&pp,len,0,0,indent));
        }
 
-static int asn1_parse2(bp, pp, length, offset, depth, indent)
-BIO *bp;
-unsigned char **pp;
-long length;
-int offset;
-int depth;
-int indent;
+static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset,
+            int depth, int indent)
        {
        unsigned char *p,*ep,*tot,*op,*opp;
        long len;
@@ -269,6 +203,7 @@ int indent;
                        if (    (tag == V_ASN1_PRINTABLESTRING) ||
                                (tag == V_ASN1_T61STRING) ||
                                (tag == V_ASN1_IA5STRING) ||
+                               (tag == V_ASN1_VISIBLESTRING) ||
                                (tag == V_ASN1_UTCTIME) ||
                                (tag == V_ASN1_GENERALIZEDTIME))
                                {
@@ -427,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];
+}
+