Support for ASN1 ENUMERATED type. This copies and duplicates the ASN1_INTEGER
authorDr. Stephen Henson <steve@openssl.org>
Tue, 9 Feb 1999 01:29:37 +0000 (01:29 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 9 Feb 1999 01:29:37 +0000 (01:29 +0000)
code and adds support to ASN1_TYPE and asn1parse.

CHANGES
crypto/asn1/Makefile.ssl
crypto/asn1/a_type.c
crypto/asn1/asn1.err
crypto/asn1/asn1.h
crypto/asn1/asn1_err.c
crypto/asn1/asn1_par.c

diff --git a/CHANGES b/CHANGES
index 9c33fbe2c743e633649a737663eceabc0aaf20da..156497841d2eb36c33cb2d3e163e27bde06d726c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,10 @@
 
  Changes between 0.9.1c and 0.9.2
 
+  *) Preliminary support for ENUMERATED type. This is largely copied from the
+     INTEGER code.
+     [Steve Henson]
+
   *) Add new function, EVP_MD_CTX_copy() to replace frequent use of memcpy.
      [Eric A. Young, (from changes to C2Net SSLeay, integrated by Mark Cox)]
 
index 67a26df25dc8edf2e64198b3ddeeba010d509828..1b0cfa5a786cc773d1d70816e91c5d07364a179f 100644 (file)
@@ -24,7 +24,7 @@ APPS=
 LIB=$(TOP)/libcrypto.a
 LIBSRC=        a_object.c a_bitstr.c a_utctm.c a_gentm.c a_time.c a_int.c a_octet.c \
        a_print.c a_type.c a_set.c a_dup.c a_d2i_fp.c a_i2d_fp.c a_bmp.c \
-       a_sign.c a_digest.c a_verify.c \
+       a_enum.c a_sign.c a_digest.c a_verify.c \
        x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_attrib.c \
        x_name.c x_cinf.c x_x509.c x_crl.c x_info.c x_spki.c nsseq.c \
        d2i_r_pr.c i2d_r_pr.c d2i_r_pu.c i2d_r_pu.c \
@@ -39,7 +39,7 @@ LIBSRC=       a_object.c a_bitstr.c a_utctm.c a_gentm.c a_time.c a_int.c a_octet.c \
        evp_asn1.c
 LIBOBJ= a_object.o a_bitstr.o a_utctm.o a_gentm.o a_time.o a_int.o a_octet.o \
        a_print.o a_type.o a_set.o a_dup.o a_d2i_fp.o a_i2d_fp.o a_bmp.o \
-       a_sign.o a_digest.o a_verify.o \
+       a_enum.o a_sign.o a_digest.o a_verify.o \
        x_algor.o x_val.o x_pubkey.o x_sig.o x_req.o x_attrib.o \
        x_name.o x_cinf.o x_x509.o x_crl.o x_info.o x_spki.o nsseq.o \
        d2i_r_pr.o i2d_r_pr.o d2i_r_pu.o i2d_r_pu.o \
index 63b458358a9e03a203c6db19c61b06c67707ae89..a3cf736026b53b95c8021653ce9f619626dae8c8 100644 (file)
@@ -89,6 +89,10 @@ unsigned char **pp;
        case V_ASN1_NEG_INTEGER:
                r=i2d_ASN1_INTEGER(a->value.integer,pp);
                break;
+       case V_ASN1_ENUMERATED:
+       case V_ASN1_NEG_ENUMERATED:
+               r=i2d_ASN1_ENUMERATED(a->value.enumerated,pp);
+               break;
        case V_ASN1_BIT_STRING:
                r=i2d_ASN1_BIT_STRING(a->value.bit_string,pp);
                break;
@@ -177,6 +181,11 @@ long length;
                        d2i_ASN1_INTEGER(NULL,&p,max-p)) == NULL)
                        goto err;
                break;
+       case V_ASN1_ENUMERATED:
+               if ((ret->value.enumerated=
+                       d2i_ASN1_ENUMERATED(NULL,&p,max-p)) == NULL)
+                       goto err;
+               break;
        case V_ASN1_BIT_STRING:
                if ((ret->value.bit_string=
                        d2i_ASN1_BIT_STRING(NULL,&p,max-p)) == NULL)
@@ -309,6 +318,8 @@ ASN1_TYPE *a;
                        break;
                case V_ASN1_INTEGER:
                case V_ASN1_NEG_INTEGER:
+               case V_ASN1_ENUMERATED:
+               case V_ASN1_NEG_ENUMERATED:
                case V_ASN1_BIT_STRING:
                case V_ASN1_OCTET_STRING:
                case V_ASN1_SEQUENCE:
index 2aa311ff3cc55a72fefa78b711b84bf63b2be8a4..a9c631bd4dc3d4463481862474035507dd31bd12 100644 (file)
@@ -8,6 +8,8 @@
 #define ASN1_F_ASN1_D2I_BIO                             104
 #define ASN1_F_ASN1_D2I_FP                              105
 #define ASN1_F_ASN1_DUP                                         106
+#define ASN1_F_ASN1_ENUMERATED_SET                      232
+#define ASN1_F_ASN1_ENUMERATED_TO_BN                    233
 #define ASN1_F_ASN1_GENERALIZEDTIME_NEW                         222
 #define ASN1_F_ASN1_GET_OBJECT                          107
 #define ASN1_F_ASN1_HEADER_NEW                          108
 #define ASN1_F_ASN1_UTCTIME_NEW                                 120
 #define ASN1_F_ASN1_VERIFY                              121
 #define ASN1_F_BASIC_CONSTRAINTS_NEW                    226
+#define ASN1_F_BN_TO_ASN1_ENUMERATED                    234
 #define ASN1_F_BN_TO_ASN1_INTEGER                       122
 #define ASN1_F_D2I_ASN1_BIT_STRING                      123
 #define ASN1_F_D2I_ASN1_BMPSTRING                       124
 #define ASN1_F_D2I_ASN1_BOOLEAN                                 125
 #define ASN1_F_D2I_ASN1_BYTES                           126
+#define ASN1_F_D2I_ASN1_ENUMERATED                      235
 #define ASN1_F_D2I_ASN1_GENERALIZEDTIME                         223
 #define ASN1_F_D2I_ASN1_HEADER                          127
 #define ASN1_F_D2I_ASN1_INTEGER                                 128
 #define ASN1_R_DATA_IS_WRONG                            110
 #define ASN1_R_DECODING_ERROR                           111
 #define ASN1_R_ERROR_PARSING_SET_ELEMENT                112
+#define ASN1_R_EXPECTING_AN_ENUMERATED                  154
 #define ASN1_R_EXPECTING_AN_INTEGER                     113
 #define ASN1_R_EXPECTING_AN_OBJECT                      114
 #define ASN1_R_EXPECTING_AN_OCTET_STRING                115
index c28c7b42ff6fd04868217fedd03a36000a74c5c3..c4e321177822c8732f55f61e8f047f21dcf63f1c 100644 (file)
@@ -89,7 +89,8 @@ extern "C" {
 #define V_ASN1_OBJECT_DESCRIPTOR       7
 #define V_ASN1_EXTERNAL                        8
 #define V_ASN1_REAL                    9
-#define V_ASN1_ENUMERATED              10      /* microsoft weirdness */
+#define V_ASN1_ENUMERATED              10
+#define V_ASN1_NEG_ENUMERATED          (10+0x100)
 #define V_ASN1_SEQUENCE                        16
 #define V_ASN1_SET                     17
 #define V_ASN1_NUMERICSTRING           18      /**/
@@ -168,6 +169,7 @@ typedef struct asn1_string_st
 
 #ifndef DEBUG
 #define ASN1_INTEGER           ASN1_STRING
+#define ASN1_ENUMERATED                ASN1_STRING
 #define ASN1_BIT_STRING                ASN1_STRING
 #define ASN1_OCTET_STRING      ASN1_STRING
 #define ASN1_PRINTABLESTRING   ASN1_STRING
@@ -181,6 +183,7 @@ typedef struct asn1_string_st
 #define ASN1_BMPSTRING         ASN1_STRING
 #else
 typedef struct asn1_string_st ASN1_INTEGER;
+typedef struct asn1_string_st ASN1_ENUMERATED;
 typedef struct asn1_string_st ASN1_BIT_STRING;
 typedef struct asn1_string_st ASN1_OCTET_STRING;
 typedef struct asn1_string_st ASN1_PRINTABLESTRING;
@@ -202,6 +205,7 @@ typedef struct asn1_type_st
                ASN1_STRING *           asn1_string;
                ASN1_OBJECT *           object;
                ASN1_INTEGER *          integer;
+               ASN1_ENUMERATED *       enumerated;
                ASN1_BIT_STRING *       bit_string;
                ASN1_OCTET_STRING *     octet_string;
                ASN1_PRINTABLESTRING *  printablestring;
@@ -262,6 +266,17 @@ typedef struct asn1_header_st
 /* i2d_ASN1_INTEGER() is a function */
 /* d2i_ASN1_INTEGER() is a function */
 
+#define ASN1_ENUMERATED_new()  (ASN1_ENUMERATED *)\
+               ASN1_STRING_type_new(V_ASN1_ENUMERATED)
+#define ASN1_ENUMERATED_free(a)                ASN1_STRING_free((ASN1_STRING *)a)
+#define ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)ASN1_STRING_dup((ASN1_STRING *)a)
+#define ASN1_ENUMERATED_cmp(a,b)       ASN1_STRING_cmp(\
+               (ASN1_STRING *)a,(ASN1_STRING *)b)
+/* ASN1_ENUMERATED_set() is a function, also see BN_to_ASN1_ENUMERATED() */
+/* ASN1_ENUMERATED_get() is a function, also see ASN1_ENUMERATED_to_BN() */
+/* i2d_ASN1_ENUMERATED() is a function */
+/* d2i_ASN1_ENUMERATED() is a function */
+
 #define ASN1_OCTET_STRING_new()        (ASN1_OCTET_STRING *)\
                ASN1_STRING_type_new(V_ASN1_OCTET_STRING)
 #define ASN1_OCTET_STRING_free(a)      ASN1_STRING_free((ASN1_STRING *)a)
@@ -414,6 +429,10 @@ int                i2d_ASN1_INTEGER(ASN1_INTEGER *a,unsigned char **pp);
 ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a,unsigned char **pp,
                        long length);
 
+int            i2d_ASN1_ENUMERATED(ASN1_ENUMERATED *a,unsigned char **pp);
+ASN1_ENUMERATED *d2i_ASN1_ENUMERATED(ASN1_ENUMERATED **a,unsigned char **pp,
+                       long length);
+
 int ASN1_UTCTIME_check(ASN1_UTCTIME *a);
 ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s,time_t t);
 int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, char *str); 
@@ -465,6 +484,8 @@ STACK *             d2i_ASN1_SET(STACK **a, unsigned char **pp, long length,
 #ifdef HEADER_BIO_H
 int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a);
 int a2i_ASN1_INTEGER(BIO *bp,ASN1_INTEGER *bs,char *buf,int size);
+int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a);
+int a2i_ASN1_ENUMERATED(BIO *bp,ASN1_ENUMERATED *bs,char *buf,int size);
 int i2a_ASN1_OBJECT(BIO *bp,ASN1_OBJECT *a);
 int a2i_ASN1_STRING(BIO *bp,ASN1_STRING *bs,char *buf,int size);
 int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type);
@@ -480,6 +501,11 @@ long ASN1_INTEGER_get(ASN1_INTEGER *a);
 ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai);
 BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai,BIGNUM *bn);
 
+int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v);
+long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a);
+ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai);
+BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai,BIGNUM *bn);
+
 /* General */
 /* given a string, return the correct type, max is the maximum length */
 int ASN1_PRINTABLE_type(unsigned char *s, int max);
@@ -572,6 +598,8 @@ int         i2d_ASN1_BOOLEAN();
 int            d2i_ASN1_BOOLEAN();
 int            i2d_ASN1_INTEGER();
 ASN1_INTEGER *d2i_ASN1_INTEGER();
+int            i2d_ASN1_ENUMERATED();
+ASN1_INTEGER *d2i_ASN1_ENUMERATED();
 int ASN1_UTCTIME_check();
 ASN1_UTCTIME *ASN1_UTCTIME_set();
 int ASN1_UTCTIME_set_string();
@@ -600,6 +628,10 @@ int ASN1_INTEGER_set();
 long ASN1_INTEGER_get();
 ASN1_INTEGER *BN_to_ASN1_INTEGER();
 BIGNUM *ASN1_INTEGER_to_BN();
+int ASN1_ENUMERATED_set();
+long ASN1_ENUMERATED_get();
+ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED();
+BIGNUM *ASN1_ENUMERATED_to_BN();
 int ASN1_PRINTABLE_type();
 int i2d_ASN1_bytes();
 ASN1_STRING *d2i_ASN1_bytes();
@@ -624,6 +656,8 @@ int ASN1_STRING_print();
 int ASN1_parse();
 int i2a_ASN1_INTEGER();
 int a2i_ASN1_INTEGER();
+int i2a_ASN1_ENUMERATED();
+int a2i_ASN1_ENUMERATED();
 int i2a_ASN1_OBJECT();
 int i2t_ASN1_OBJECT();
 int a2i_ASN1_STRING();
@@ -662,6 +696,8 @@ ASN1_BMPSTRING *d2i_ASN1_BMPSTRING();
 #define ASN1_F_ASN1_D2I_BIO                             104
 #define ASN1_F_ASN1_D2I_FP                              105
 #define ASN1_F_ASN1_DUP                                         106
+#define ASN1_F_ASN1_ENUMERATED_SET                      232
+#define ASN1_F_ASN1_ENUMERATED_TO_BN                    233
 #define ASN1_F_ASN1_GENERALIZEDTIME_NEW                         222
 #define ASN1_F_ASN1_GET_OBJECT                          107
 #define ASN1_F_ASN1_HEADER_NEW                          108
@@ -679,11 +715,13 @@ ASN1_BMPSTRING *d2i_ASN1_BMPSTRING();
 #define ASN1_F_ASN1_UTCTIME_NEW                                 120
 #define ASN1_F_ASN1_VERIFY                              121
 #define ASN1_F_BASIC_CONSTRAINTS_NEW                    226
+#define ASN1_F_BN_TO_ASN1_ENUMERATED                    234
 #define ASN1_F_BN_TO_ASN1_INTEGER                       122
 #define ASN1_F_D2I_ASN1_BIT_STRING                      123
 #define ASN1_F_D2I_ASN1_BMPSTRING                       124
 #define ASN1_F_D2I_ASN1_BOOLEAN                                 125
 #define ASN1_F_D2I_ASN1_BYTES                           126
+#define ASN1_F_D2I_ASN1_ENUMERATED                      235
 #define ASN1_F_D2I_ASN1_GENERALIZEDTIME                         223
 #define ASN1_F_D2I_ASN1_HEADER                          127
 #define ASN1_F_D2I_ASN1_INTEGER                                 128
@@ -802,6 +840,7 @@ ASN1_BMPSTRING *d2i_ASN1_BMPSTRING();
 #define ASN1_R_DATA_IS_WRONG                            110
 #define ASN1_R_DECODING_ERROR                           111
 #define ASN1_R_ERROR_PARSING_SET_ELEMENT                112
+#define ASN1_R_EXPECTING_AN_ENUMERATED                  154
 #define ASN1_R_EXPECTING_AN_INTEGER                     113
 #define ASN1_R_EXPECTING_AN_OBJECT                      114
 #define ASN1_R_EXPECTING_AN_OCTET_STRING                115
index b98b6150b032a8b41fe016dee293541190031d0f..51acca54fcbb6521ccabfc40dfd33f40c78f321c 100644 (file)
@@ -70,6 +70,8 @@ static ERR_STRING_DATA ASN1_str_functs[]=
 {ERR_PACK(0,ASN1_F_ASN1_D2I_BIO,0),    "ASN1_d2i_bio"},
 {ERR_PACK(0,ASN1_F_ASN1_D2I_FP,0),     "ASN1_d2i_fp"},
 {ERR_PACK(0,ASN1_F_ASN1_DUP,0),        "ASN1_dup"},
+{ERR_PACK(0,ASN1_F_ASN1_ENUMERATED_SET,0),     "ASN1_ENUMERATED_set"},
+{ERR_PACK(0,ASN1_F_ASN1_ENUMERATED_TO_BN,0),   "ASN1_ENUMERATED_to_BN"},
 {ERR_PACK(0,ASN1_F_ASN1_GENERALIZEDTIME_NEW,0),        "ASN1_GENERALIZEDTIME_NEW"},
 {ERR_PACK(0,ASN1_F_ASN1_GET_OBJECT,0), "ASN1_get_object"},
 {ERR_PACK(0,ASN1_F_ASN1_HEADER_NEW,0), "ASN1_HEADER_new"},
@@ -87,11 +89,13 @@ static ERR_STRING_DATA ASN1_str_functs[]=
 {ERR_PACK(0,ASN1_F_ASN1_UTCTIME_NEW,0),        "ASN1_UTCTIME_NEW"},
 {ERR_PACK(0,ASN1_F_ASN1_VERIFY,0),     "ASN1_VERIFY"},
 {ERR_PACK(0,ASN1_F_BASIC_CONSTRAINTS_NEW,0),   "BASIC_CONSTRAINTS_NEW"},
+{ERR_PACK(0,ASN1_F_BN_TO_ASN1_ENUMERATED,0),   "BN_to_ASN1_ENUMERATED"},
 {ERR_PACK(0,ASN1_F_BN_TO_ASN1_INTEGER,0),      "BN_to_ASN1_INTEGER"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BIT_STRING,0),     "d2i_ASN1_BIT_STRING"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BMPSTRING,0),      "d2i_ASN1_BMPSTRING"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BOOLEAN,0),        "d2i_ASN1_BOOLEAN"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_BYTES,0),  "d2i_ASN1_bytes"},
+{ERR_PACK(0,ASN1_F_D2I_ASN1_ENUMERATED,0),     "d2i_ASN1_ENUMERATED"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_GENERALIZEDTIME,0),        "d2i_ASN1_GENERALIZEDTIME"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_HEADER,0), "d2i_ASN1_HEADER"},
 {ERR_PACK(0,ASN1_F_D2I_ASN1_INTEGER,0),        "d2i_ASN1_INTEGER"},
@@ -213,6 +217,7 @@ static ERR_STRING_DATA ASN1_str_reasons[]=
 {ASN1_R_DATA_IS_WRONG                    ,"data is wrong"},
 {ASN1_R_DECODING_ERROR                   ,"decoding error"},
 {ASN1_R_ERROR_PARSING_SET_ELEMENT        ,"error parsing set element"},
+{ASN1_R_EXPECTING_AN_ENUMERATED          ,"expecting an enumerated"},
 {ASN1_R_EXPECTING_AN_INTEGER             ,"expecting an integer"},
 {ASN1_R_EXPECTING_AN_OBJECT              ,"expecting an object"},
 {ASN1_R_EXPECTING_AN_OCTET_STRING        ,"expecting an octet string"},
index af71b1a85ddfb4408fca3ef597d4d126db6ffd30..bde3a3b2c32051dd6a0464a5232b62fda0c59c9c 100644 (file)
@@ -108,6 +108,8 @@ int indent;
                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)
@@ -371,6 +373,38 @@ int indent;
                                        }
                                ASN1_INTEGER_free(bs);
                                }
+                       else if (tag == V_ASN1_ENUMERATED)
+                               {
+                               ASN1_ENUMERATED *bs;
+                               int i;
+
+                               opp=op;
+                               bs=d2i_ASN1_ENUMERATED(NULL,&opp,len+hl);
+                               if (bs != NULL)
+                                       {
+                                       if (BIO_write(bp,":",1) <= 0) goto end;
+                                       if (bs->type == V_ASN1_NEG_ENUMERATED)
+                                               if (BIO_write(bp,"-",1) <= 0)
+                                                       goto end;
+                                       for (i=0; i<bs->length; i++)
+                                               {
+                                               if (BIO_printf(bp,"%02X",
+                                                       bs->data[i]) <= 0)
+                                                       goto end;
+                                               }
+                                       if (bs->length == 0)
+                                               {
+                                               if (BIO_write(bp,"00",2) <= 0)
+                                                       goto end;
+                                               }
+                                       }
+                               else
+                                       {
+                                       if (BIO_write(bp,"BAD ENUMERATED",11) <= 0)
+                                               goto end;
+                                       }
+                               ASN1_ENUMERATED_free(bs);
+                               }
 
                        if (!nl) 
                                {