Add support for MS CSP Name PKCS#12 attribute.
[openssl.git] / crypto / x509 / x509_att.c
index b5cb2d5a7d122d2db3c80f0ccae9a1e3eb8b3979..0bae3d32a1a5ffd4e7ce140f2dd3e404c6000b55 100644 (file)
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 
-int X509_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
+int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
 {
        if (!x) return 0;
        return(sk_X509_ATTRIBUTE_num(x));
 }
 
-int X509_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
+int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
                          int lastpos)
 {
        ASN1_OBJECT *obj;
 
        obj=OBJ_nid2obj(nid);
        if (obj == NULL) return(-2);
-       return(X509_get_attr_by_OBJ(x,obj,lastpos));
+       return(X509at_get_attr_by_OBJ(x,obj,lastpos));
 }
 
-int X509_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
+int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
                          int lastpos)
 {
        int n;
@@ -101,7 +101,7 @@ int X509_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
        return(-1);
 }
 
-X509_ATTRIBUTE *X509_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)
+X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)
 {
        if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0)
                return NULL;
@@ -109,7 +109,7 @@ X509_ATTRIBUTE *X509_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)
                return sk_X509_ATTRIBUTE_value(x,loc);
 }
 
-X509_ATTRIBUTE *X509_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)
+X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)
 {
        X509_ATTRIBUTE *ret;
 
@@ -119,11 +119,10 @@ X509_ATTRIBUTE *X509_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)
        return(ret);
 }
 
-STACK_OF(X509_ATTRIBUTE) *X509_radd_attr(STACK_OF(X509_ATTRIBUTE) **x,
-                                        X509_ATTRIBUTE *attr, int loc)
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
+                                        X509_ATTRIBUTE *attr)
 {
        X509_ATTRIBUTE *new_attr=NULL;
-       int n;
        STACK_OF(X509_ATTRIBUTE) *sk=NULL;
 
        if ((x != NULL) && (*x == NULL))
@@ -134,13 +133,9 @@ STACK_OF(X509_ATTRIBUTE) *X509_radd_attr(STACK_OF(X509_ATTRIBUTE) **x,
        else
                sk= *x;
 
-       n=sk_X509_ATTRIBUTE_num(sk);
-       if (loc > n) loc=n;
-       else if (loc < 0) loc=n;
-
        if ((new_attr=X509_ATTRIBUTE_dup(attr)) == NULL)
                goto err2;
-       if (!sk_X509_ATTRIBUTE_insert(sk,new_attr,loc))
+       if (!sk_X509_ATTRIBUTE_push(sk,new_attr))
                goto err;
        if ((x != NULL) && (*x == NULL))
                *x=sk;
@@ -153,8 +148,47 @@ err2:
        return(NULL);
 }
 
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x,
+                       const ASN1_OBJECT *obj, int type,
+                       const unsigned char *bytes, int len)
+{
+       X509_ATTRIBUTE *attr;
+       STACK_OF(X509_ATTRIBUTE) *ret;
+       attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len);
+       if(!attr) return 0;
+       ret = X509at_add1_attr(x, attr);
+       X509_ATTRIBUTE_free(attr);
+       return ret;
+}
+
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x,
+                       int nid, int type,
+                       const unsigned char *bytes, int len)
+{
+       X509_ATTRIBUTE *attr;
+       STACK_OF(X509_ATTRIBUTE) *ret;
+       attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len);
+       if(!attr) return 0;
+       ret = X509at_add1_attr(x, attr);
+       X509_ATTRIBUTE_free(attr);
+       return ret;
+}
+
+STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x,
+                       const char *attrname, int type,
+                       const unsigned char *bytes, int len)
+{
+       X509_ATTRIBUTE *attr;
+       STACK_OF(X509_ATTRIBUTE) *ret;
+       attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len);
+       if(!attr) return 0;
+       ret = X509at_add1_attr(x, attr);
+       X509_ATTRIBUTE_free(attr);
+       return ret;
+}
+
 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
-            int atrtype, void *data, int len)
+            int atrtype, const void *data, int len)
 {
        ASN1_OBJECT *obj;
        X509_ATTRIBUTE *ret;
@@ -171,7 +205,7 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
 }
 
 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
-            ASN1_OBJECT *obj, int atrtype, void *data, int len)
+            const ASN1_OBJECT *obj, int atrtype, const void *data, int len)
 {
        X509_ATTRIBUTE *ret;
 
@@ -186,9 +220,9 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
        else
                ret= *attr;
 
-       if (!X509_ATTRIBUTE_rset_object(ret,obj))
+       if (!X509_ATTRIBUTE_set1_object(ret,obj))
                goto err;
-       if (!X509_ATTRIBUTE_rset_data(ret,atrtype,data,len))
+       if (!X509_ATTRIBUTE_set1_data(ret,atrtype,data,len))
                goto err;
        
        if ((attr != NULL) && (*attr == NULL)) *attr=ret;
@@ -199,7 +233,26 @@ err:
        return(NULL);
 }
 
-int X509_ATTRIBUTE_rset_object(X509_ATTRIBUTE *attr, ASN1_OBJECT *obj)
+X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
+               const char *atrname, int type, const unsigned char *bytes, int len)
+       {
+       ASN1_OBJECT *obj;
+       X509_ATTRIBUTE *nattr;
+
+       obj=OBJ_txt2obj(atrname, 0);
+       if (obj == NULL)
+               {
+               X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_TXT,
+                                               X509_R_INVALID_FIELD_NAME);
+               ERR_add_error_data(2, "name=", atrname);
+               return(NULL);
+               }
+       nattr = X509_ATTRIBUTE_create_by_OBJ(attr,obj,type,bytes,len);
+       ASN1_OBJECT_free(obj);
+       return nattr;
+       }
+
+int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj)
 {
        if ((attr == NULL) || (obj == NULL))
                return(0);
@@ -208,7 +261,7 @@ int X509_ATTRIBUTE_rset_object(X509_ATTRIBUTE *attr, ASN1_OBJECT *obj)
        return(1);
 }
 
-int X509_ATTRIBUTE_rset_data(X509_ATTRIBUTE *attr, int attrtype, void *data, int len)
+int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len)
 {
        ASN1_TYPE *ttmp;
        ASN1_STRING *stmp;
@@ -218,7 +271,7 @@ int X509_ATTRIBUTE_rset_data(X509_ATTRIBUTE *attr, int attrtype, void *data, int
                stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype,
                                                OBJ_obj2nid(attr->object));
                if(!stmp) {
-                       X509err(X509_F_X509_ATTRIBUTE_ISET_DATA, ERR_R_ASN1_LIB);
+                       X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_ASN1_LIB);
                        return 0;
                }
                atype = stmp->type;
@@ -230,44 +283,44 @@ int X509_ATTRIBUTE_rset_data(X509_ATTRIBUTE *attr, int attrtype, void *data, int
        if(!(attr->value.set = sk_ASN1_TYPE_new_null())) goto err;
        if(!(ttmp = ASN1_TYPE_new())) goto err;
        if(!sk_ASN1_TYPE_push(attr->value.set, ttmp)) goto err;
-       attr->set = 1;
-       ASN1_TYPE_set(ttmp, atype, data);
+       attr->single = 0;
+       ASN1_TYPE_set(ttmp, atype, stmp);
        return 1;
        err:
-       X509err(X509_F_X509_ATTRIBUTE_ISET_DATA, ERR_R_MALLOC_FAILURE);
+       X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE);
        return 0;
 }
 
 int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr)
 {
-       if(attr->set) return sk_ASN1_TYPE_num(attr->value.set);
+       if(!attr->single) return sk_ASN1_TYPE_num(attr->value.set);
        if(attr->value.single) return 1;
        return 0;
 }
 
-ASN1_OBJECT *X509_ATTRIBUTE_iget_object(X509_ATTRIBUTE *attr)
+ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr)
 {
        if (attr == NULL) return(NULL);
        return(attr->object);
 }
 
-void *X509_ATTRIBUTE_iget_data(X509_ATTRIBUTE *attr, int idx,
+void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
                                        int atrtype, void *data)
 {
        ASN1_TYPE *ttmp;
-       ttmp = X509_ATTRIBUTE_type_iget(attr, idx);
+       ttmp = X509_ATTRIBUTE_get0_type(attr, idx);
        if(!ttmp) return NULL;
        if(atrtype != ASN1_TYPE_get(ttmp)){
-               X509err(X509_F_X509_ATTRIBUTE_IGET_DATA, X509_R_WRONG_TYPE);
+               X509err(X509_F_X509_ATTRIBUTE_GET0_DATA, X509_R_WRONG_TYPE);
                return NULL;
        }
        return ttmp->value.ptr;
 }
 
-ASN1_TYPE *X509_ATTRIBUTE_type_iget(X509_ATTRIBUTE *attr, int idx)
+ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)
 {
        if (attr == NULL) return(NULL);
        if(idx >= X509_ATTRIBUTE_count(attr)) return NULL;
-       if(attr->set) return sk_ASN1_TYPE_value(attr->value.set, idx);
+       if(!attr->single) return sk_ASN1_TYPE_value(attr->value.set, idx);
        else return attr->value.single;
 }