Support for ASN1 ENUMERATED type. This copies and duplicates the ASN1_INTEGER
[openssl.git] / crypto / asn1 / a_type.c
index 7c0004084c2dc802b5d46ab9a14cdc6837bef15e..a3cf736026b53b95c8021653ce9f619626dae8c8 100644 (file)
@@ -60,9 +60,7 @@
 #include "cryptlib.h"
 #include "asn1_mac.h"
 
-/* ASN1err(ASN1_F_ASN1_TYPE_NEW,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_BYTES,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_BYTES,ASN1_R_WRONG_TAG);
+/* ASN1err(ASN1_F_D2I_ASN1_BYTES,ASN1_R_WRONG_TAG);
  * ASN1err(ASN1_F_ASN1_COLLATE_PRIMATIVE,ASN1_R_WRONG_TAG);
  */
 
@@ -91,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;
@@ -121,6 +123,9 @@ unsigned char **pp;
        case V_ASN1_UTCTIME:
                r=i2d_ASN1_UTCTIME(a->value.utctime,pp);
                break;
+       case V_ASN1_GENERALIZEDTIME:
+               r=i2d_ASN1_GENERALIZEDTIME(a->value.generalizedtime,pp);
+               break;
        case V_ASN1_SET:
        case V_ASN1_SEQUENCE:
                if (a->value.set == NULL)
@@ -176,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)
@@ -226,6 +236,11 @@ long length;
                        d2i_ASN1_UTCTIME(NULL,&p,max-p)) == NULL)
                        goto err;
                break;
+       case V_ASN1_GENERALIZEDTIME:
+               if ((ret->value.generalizedtime=
+                       d2i_ASN1_GENERALIZEDTIME(NULL,&p,max-p)) == NULL)
+                       goto err;
+               break;
        case V_ASN1_SET:
        case V_ASN1_SEQUENCE:
                /* Sets and sequences are left complete */
@@ -252,6 +267,7 @@ err:
 ASN1_TYPE *ASN1_TYPE_new()
        {
        ASN1_TYPE *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,ASN1_TYPE);
        ret->type= -1;
@@ -302,16 +318,24 @@ 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:
+               case V_ASN1_SET:
+               case V_ASN1_NUMERICSTRING:
                case V_ASN1_PRINTABLESTRING:
                case V_ASN1_T61STRING:
+               case V_ASN1_VIDEOTEXSTRING:
                case V_ASN1_IA5STRING:
-               case V_ASN1_UNIVERSALSTRING:
-               case V_ASN1_GENERALSTRING:
                case V_ASN1_UTCTIME:
-               case V_ASN1_SET:
-               case V_ASN1_SEQUENCE:
+               case V_ASN1_GENERALIZEDTIME:
+               case V_ASN1_GRAPHICSTRING:
+               case V_ASN1_VISIBLESTRING:
+               case V_ASN1_GENERALSTRING:
+               case V_ASN1_UNIVERSALSTRING:
+               case V_ASN1_BMPSTRING:
                        ASN1_STRING_free((ASN1_STRING *)a->value.ptr);
                        break;
                default: