Constify where needed
[openssl.git] / crypto / x509v3 / v3_utl.c
index 46d7580b0a832451d4795dc7c7939af86bf56082..706a2b4b42c048a805d25f29f7a924f2df8c3f55 100644 (file)
@@ -1,5 +1,5 @@
 /* v3_utl.c */
-/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
+/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  * project.
  */
 /* ====================================================================
 
 static char *strip_spaces(char *name);
 static int sk_strcmp(const char * const *a, const char * const *b);
-static STACK *get_email(X509_NAME *name, GENERAL_NAMES *gens);
-static void str_free(void *str);
-static int append_ia5(STACK **sk, ASN1_IA5STRING *email);
+static STACK_OF(STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens);
+static void str_free(STRING str);
+static int append_ia5(STACK_OF(STRING) **sk, ASN1_IA5STRING *email);
 
-static int a2i_ipadd(unsigned char *ipout, const char *ipasc);
 static int ipv4_from_asc(unsigned char *v4, const char *in);
 static int ipv6_from_asc(unsigned char *v6, const char *in);
 static int ipv6_cb(const char *elem, int len, void *usr);
@@ -107,19 +106,6 @@ int X509V3_add_value_uchar(const char *name, const unsigned char *value,
     return X509V3_add_value(name,(const char *)value,extlist);
     }
 
-/* New function for CONF_VALUE. */
-
-CONF_VALUE *X509V3_conf_new()
-       {
-       CONF_VALUE *v = (CONF_VALUE *) OPENSSL_malloc(sizeof(CONF_VALUE));
-       if (!v)
-               {
-               v->section = v->name = v->value = NULL;
-               }
-
-       return v;
-       }
-
 /* Free function for STACK_OF(CONF_VALUE) */
 
 void X509V3_conf_free(CONF_VALUE *conf)
@@ -374,12 +360,12 @@ static char *strip_spaces(char *name)
  * @@@ (Contents of buffer are always kept in ASCII, also on EBCDIC machines)
  */
 
-char *hex_to_string(unsigned char *buffer, long len)
+char *hex_to_string(const unsigned char *buffer, long len)
 {
        char *tmp, *q;
-       unsigned char *p;
+       const unsigned char *p;
        int i;
-       static char hexdig[] = "0123456789ABCDEF";
+       const static char hexdig[] = "0123456789ABCDEF";
        if(!buffer || !len) return NULL;
        if(!(tmp = OPENSSL_malloc(len * 3 + 1))) {
                X509V3err(X509V3_F_HEX_TO_STRING,ERR_R_MALLOC_FAILURE);
@@ -403,7 +389,7 @@ char *hex_to_string(unsigned char *buffer, long len)
  * a buffer
  */
 
-unsigned char *string_to_hex(char *str, long *len)
+unsigned char *string_to_hex(const char *str, long *len)
 {
        unsigned char *hexbuf, *q;
        unsigned char ch, cl, *p;
@@ -477,21 +463,48 @@ static int sk_strcmp(const char * const *a, const char * const *b)
        return strcmp(*a, *b);
 }
 
-STACK *X509_get1_email(X509 *x)
+STACK_OF(STRING) *X509_get1_email(X509 *x)
 {
        GENERAL_NAMES *gens;
-       STACK *ret;
+       STACK_OF(STRING) *ret;
+
        gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
        ret = get_email(X509_get_subject_name(x), gens);
        sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
        return ret;
 }
 
-STACK *X509_REQ_get1_email(X509_REQ *x)
+STACK_OF(STRING) *X509_get1_ocsp(X509 *x)
+{
+       AUTHORITY_INFO_ACCESS *info;
+       STACK_OF(STRING) *ret = NULL;
+       int i;
+
+       info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
+       if (!info)
+               return NULL;
+       for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++)
+               {
+               ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
+               if (OBJ_obj2nid(ad->method) == NID_ad_OCSP)
+                       {
+                       if (ad->location->type == GEN_URI)
+                               {
+                               if (!append_ia5(&ret, ad->location->d.uniformResourceIdentifier))
+                                       break;
+                               }
+                       }
+               }
+       AUTHORITY_INFO_ACCESS_free(info);
+       return ret;
+}
+
+STACK_OF(STRING) *X509_REQ_get1_email(X509_REQ *x)
 {
        GENERAL_NAMES *gens;
        STACK_OF(X509_EXTENSION) *exts;
-       STACK *ret;
+       STACK_OF(STRING) *ret;
+
        exts = X509_REQ_get_extensions(x);
        gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
        ret = get_email(X509_REQ_get_subject_name(x), gens);
@@ -501,9 +514,9 @@ STACK *X509_REQ_get1_email(X509_REQ *x)
 }
 
 
-static STACK *get_email(X509_NAME *name, GENERAL_NAMES *gens)
+static STACK_OF(STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens)
 {
-       STACK *ret = NULL;
+       STACK_OF(STRING) *ret = NULL;
        X509_NAME_ENTRY *ne;
        ASN1_IA5STRING *email;
        GENERAL_NAME *gen;
@@ -526,23 +539,23 @@ static STACK *get_email(X509_NAME *name, GENERAL_NAMES *gens)
        return ret;
 }
 
-static void str_free(void *str)
+static void str_free(STRING str)
 {
        OPENSSL_free(str);
 }
 
-static int append_ia5(STACK **sk, ASN1_IA5STRING *email)
+static int append_ia5(STACK_OF(STRING) **sk, ASN1_IA5STRING *email)
 {
        char *emtmp;
        /* First some sanity checks */
        if(email->type != V_ASN1_IA5STRING) return 1;
        if(!email->data || !email->length) return 1;
-       if(!*sk) *sk = sk_new(sk_strcmp);
+       if(!*sk) *sk = sk_STRING_new(sk_strcmp);
        if(!*sk) return 0;
        /* Don't add duplicates */
-       if(sk_find(*sk, (char *)email->data) != -1) return 1;
+       if(sk_STRING_find(*sk, (char *)email->data) != -1) return 1;
        emtmp = BUF_strdup((char *)email->data);
-       if(!emtmp || !sk_push(*sk, emtmp)) {
+       if(!emtmp || !sk_STRING_push(*sk, emtmp)) {
                X509_email_free(*sk);
                *sk = NULL;
                return 0;
@@ -550,9 +563,9 @@ static int append_ia5(STACK **sk, ASN1_IA5STRING *email)
        return 1;
 }
 
-void X509_email_free(STACK *sk)
+void X509_email_free(STACK_OF(STRING) *sk)
 {
-       sk_pop_free(sk, str_free);
+       sk_STRING_pop_free(sk, str_free);
 }
 
 /* Convert IP addresses both IPv4 and IPv6 into an 
@@ -628,7 +641,7 @@ ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc)
        }
        
 
-static int a2i_ipadd(unsigned char *ipout, const char *ipasc)
+int a2i_ipadd(unsigned char *ipout, const char *ipasc)
        {
        /* If string contains a ':' assume IPv6 */
 
@@ -726,17 +739,20 @@ static int ipv6_from_asc(unsigned char *v6, const char *in)
 
        /* Format result */
 
-       /* Copy initial part */
-       if (v6stat.zero_pos > 0)
+       if (v6stat.zero_pos >= 0)
+               {
+               /* Copy initial part */
                memcpy(v6, v6stat.tmp, v6stat.zero_pos);
-       /* Zero middle */
-       if (v6stat.total != 16)
+               /* Zero middle */
                memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
-       /* Copy final part */
-       if (v6stat.total != v6stat.zero_pos)
-               memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
-                       v6stat.tmp + v6stat.zero_pos,
-                       v6stat.total - v6stat.zero_pos);
+               /* Copy final part */
+               if (v6stat.total != v6stat.zero_pos)
+                       memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
+                               v6stat.tmp + v6stat.zero_pos,
+                               v6stat.total - v6stat.zero_pos);
+               }
+       else
+               memcpy(v6, v6stat.tmp, 16);
 
        return 1;
        }