Change functions to ANSI C.
[openssl.git] / crypto / asn1 / a_bytes.c
index 0c9132498cf99d98551ff2a9c5c1bed953ec9391..fdfe9ea8efda48f25d20e54714256d6e933926c2 100644 (file)
@@ -1,5 +1,5 @@
 /* crypto/asn1/a_bytes.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
 #include "cryptlib.h"
 #include "asn1_mac.h"
 
-/* ASN1err(ASN1_F_ASN1_TYPE_NEW,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_TYPE_BYTES,ASN1_R_ERROR_STACK);
- * ASN1err(ASN1_F_D2I_ASN1_TYPE_BYTES,ASN1_R_WRONG_TYPE);
+/* ASN1err(ASN1_F_D2I_ASN1_TYPE_BYTES,ASN1_R_WRONG_TYPE);
  * ASN1err(ASN1_F_ASN1_COLLATE_PRIMATIVE,ASN1_R_WRONG_TAG);
  */
 
 static unsigned long tag2bit[32]={
-0,     0,      0,      0,      /* tags  0 -  3 */
+0,     0,      0,      B_ASN1_BIT_STRING,      /* tags  0 -  3 */
 B_ASN1_OCTET_STRING,   0,      0,              B_ASN1_UNKNOWN,/* tags  4- 7 */
 B_ASN1_UNKNOWN,        B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, B_ASN1_UNKNOWN,/* tags  8-11 */
-B_ASN1_UNKNOWN,        B_ASN1_UNKNOWN, B_ASN1_UNKNOWN, B_ASN1_UNKNOWN,/* tags 12-15 */
+B_ASN1_UTF8STRING,B_ASN1_UNKNOWN,B_ASN1_UNKNOWN,B_ASN1_UNKNOWN,/* tags 12-15 */
 0,     0,      B_ASN1_NUMERICSTRING,B_ASN1_PRINTABLESTRING,
 B_ASN1_T61STRING,B_ASN1_VIDEOTEXSTRING,B_ASN1_IA5STRING,0,
 0,B_ASN1_GRAPHICSTRING,B_ASN1_ISO64STRING,B_ASN1_GENERALSTRING,
-B_ASN1_UNIVERSALSTRING,B_ASN1_UNKNOWN,B_ASN1_UNKNOWN,B_ASN1_UNKNOWN,
+B_ASN1_UNIVERSALSTRING,B_ASN1_UNKNOWN,B_ASN1_BMPSTRING,B_ASN1_UNKNOWN,
        };
 
 #ifndef NOPROTO
@@ -83,13 +81,10 @@ static int asn1_collate_primative(ASN1_STRING *a, ASN1_CTX *c);
 static int asn1_collate_primative();
 #endif
 
-/* type is a 'bitmap' of acceptable string types to be accepted.
+/* type is a 'bitmap' of acceptable string types.
  */
-ASN1_STRING *d2i_ASN1_type_bytes(a, pp, length, type)
-ASN1_STRING **a;
-unsigned char **pp;
-long length;
-int type;
+ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, unsigned char **pp,
+            long length, int type)
        {
        ASN1_STRING *ret=NULL;
        unsigned char *p,*s;
@@ -97,13 +92,6 @@ int type;
        int inf,tag,xclass;
        int i=0;
 
-       if ((a == NULL) || ((*a) == NULL))
-               {
-               if ((ret=ASN1_STRING_new()) == NULL) return(NULL);
-               }
-       else
-               ret=(*a);
-
        p= *pp;
        inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
        if (inf & 0x80) goto err;
@@ -118,6 +106,18 @@ int type;
                i=ASN1_R_WRONG_TYPE;
                goto err;
                }
+
+       /* If a bit-string, exit early */
+       if (tag == V_ASN1_BIT_STRING)
+               return(d2i_ASN1_BIT_STRING(a,pp,length));
+
+       if ((a == NULL) || ((*a) == NULL))
+               {
+               if ((ret=ASN1_STRING_new()) == NULL) return(NULL);
+               }
+       else
+               ret=(*a);
+
        if (len != 0)
                {
                s=(unsigned char *)Malloc((int)len+1);
@@ -147,16 +147,16 @@ err:
        return(NULL);
        }
 
-int i2d_ASN1_bytes(a, pp, tag, xclass)
-ASN1_STRING *a;
-unsigned char **pp;
-int tag;
-int xclass;
+int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass)
        {
        int ret,r,constructed;
        unsigned char *p;
 
        if (a == NULL)  return(0);
+
+       if (tag == V_ASN1_BIT_STRING)
+               return(i2d_ASN1_BIT_STRING(a,pp));
+               
        ret=a->length;
        r=ASN1_object_size(0,ret,tag);
        if (pp == NULL) return(r);
@@ -173,12 +173,8 @@ int xclass;
        return(r);
        }
 
-ASN1_STRING *d2i_ASN1_bytes(a, pp, length, Ptag, Pclass)
-ASN1_STRING **a;
-unsigned char **pp;
-long length;
-int Ptag;
-int Pclass;
+ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, unsigned char **pp, long length,
+            int Ptag, int Pclass)
        {
        ASN1_STRING *ret=NULL;
        unsigned char *p,*s;
@@ -229,7 +225,7 @@ int Pclass;
                {
                if (len != 0)
                        {
-                       if (ret->length < len)
+                       if ((ret->length < len) || (ret->data == NULL))
                                {
                                if (ret->data != NULL) Free((char *)ret->data);
                                s=(unsigned char *)Malloc((int)len);
@@ -270,9 +266,7 @@ err:
  * them into the one struture that is then returned */
 /* There have been a few bug fixes for this function from
  * Paul Keogh <paul.keogh@sse.ie>, many thanks to him */
-static int asn1_collate_primative(a,c)
-ASN1_STRING *a;
-ASN1_CTX *c;
+static int asn1_collate_primative(ASN1_STRING *a, ASN1_CTX *c)
        {
        ASN1_STRING *os=NULL;
        BUF_MEM b;