diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_attrib.c')
-rw-r--r-- | src/lib/libcrypto/asn1/x_attrib.c | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/src/lib/libcrypto/asn1/x_attrib.c b/src/lib/libcrypto/asn1/x_attrib.c index e52ced8627..a1cbebf5a5 100644 --- a/src/lib/libcrypto/asn1/x_attrib.c +++ b/src/lib/libcrypto/asn1/x_attrib.c | |||
@@ -58,19 +58,12 @@ | |||
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include "objects.h" | 61 | #include <openssl/objects.h> |
62 | #include "asn1_mac.h" | 62 | #include <openssl/asn1_mac.h> |
63 | 63 | #include <openssl/x509.h> | |
64 | /* | ||
65 | * ASN1err(ASN1_F_D2I_X509_ATTRIBUTE,ASN1_R_LENGTH_MISMATCH); | ||
66 | * ASN1err(ASN1_F_X509_ATTRIBUTE_NEW,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE); | ||
67 | * ASN1err(ASN1_F_I2D_X509_ATTRIBUTE,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE); | ||
68 | */ | ||
69 | 64 | ||
70 | /* sequence */ | 65 | /* sequence */ |
71 | int i2d_X509_ATTRIBUTE(a,pp) | 66 | int i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a, unsigned char **pp) |
72 | X509_ATTRIBUTE *a; | ||
73 | unsigned char **pp; | ||
74 | { | 67 | { |
75 | int k=0; | 68 | int k=0; |
76 | int r=0,ret=0; | 69 | int r=0,ret=0; |
@@ -92,18 +85,16 @@ unsigned char **pp; | |||
92 | 85 | ||
93 | ret+=i2d_ASN1_OBJECT(a->object,p); | 86 | ret+=i2d_ASN1_OBJECT(a->object,p); |
94 | if (a->set) | 87 | if (a->set) |
95 | ret+=i2d_ASN1_SET(a->value.set,p,i2d_ASN1_TYPE, | 88 | ret+=i2d_ASN1_SET_OF_ASN1_TYPE(a->value.set,p,i2d_ASN1_TYPE, |
96 | V_ASN1_SET,V_ASN1_UNIVERSAL); | 89 | V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); |
97 | else | 90 | else |
98 | ret+=i2d_ASN1_TYPE(a->value.single,p); | 91 | ret+=i2d_ASN1_TYPE(a->value.single,p); |
99 | if (k++) return(r); | 92 | if (k++) return(r); |
100 | } | 93 | } |
101 | } | 94 | } |
102 | 95 | ||
103 | X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(a,pp,length) | 96 | X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **a, unsigned char **pp, |
104 | X509_ATTRIBUTE **a; | 97 | long length) |
105 | unsigned char **pp; | ||
106 | long length; | ||
107 | { | 98 | { |
108 | M_ASN1_D2I_vars(a,X509_ATTRIBUTE *,X509_ATTRIBUTE_new); | 99 | M_ASN1_D2I_vars(a,X509_ATTRIBUTE *,X509_ATTRIBUTE_new); |
109 | 100 | ||
@@ -115,7 +106,8 @@ long length; | |||
115 | (M_ASN1_next == (V_ASN1_CONSTRUCTED|V_ASN1_UNIVERSAL|V_ASN1_SET))) | 106 | (M_ASN1_next == (V_ASN1_CONSTRUCTED|V_ASN1_UNIVERSAL|V_ASN1_SET))) |
116 | { | 107 | { |
117 | ret->set=1; | 108 | ret->set=1; |
118 | M_ASN1_D2I_get_set(ret->value.set,d2i_ASN1_TYPE); | 109 | M_ASN1_D2I_get_set_type(ASN1_TYPE,ret->value.set,d2i_ASN1_TYPE, |
110 | ASN1_TYPE_free); | ||
119 | } | 111 | } |
120 | else | 112 | else |
121 | { | 113 | { |
@@ -126,25 +118,46 @@ long length; | |||
126 | M_ASN1_D2I_Finish(a,X509_ATTRIBUTE_free,ASN1_F_D2I_X509_ATTRIBUTE); | 118 | M_ASN1_D2I_Finish(a,X509_ATTRIBUTE_free,ASN1_F_D2I_X509_ATTRIBUTE); |
127 | } | 119 | } |
128 | 120 | ||
129 | X509_ATTRIBUTE *X509_ATTRIBUTE_new() | 121 | X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value) |
122 | { | ||
123 | X509_ATTRIBUTE *ret=NULL; | ||
124 | ASN1_TYPE *val=NULL; | ||
125 | |||
126 | if ((ret=X509_ATTRIBUTE_new()) == NULL) | ||
127 | return(NULL); | ||
128 | ret->object=OBJ_nid2obj(nid); | ||
129 | ret->set=1; | ||
130 | if ((ret->value.set=sk_ASN1_TYPE_new_null()) == NULL) goto err; | ||
131 | if ((val=ASN1_TYPE_new()) == NULL) goto err; | ||
132 | if (!sk_ASN1_TYPE_push(ret->value.set,val)) goto err; | ||
133 | |||
134 | ASN1_TYPE_set(val,atrtype,value); | ||
135 | return(ret); | ||
136 | err: | ||
137 | if (ret != NULL) X509_ATTRIBUTE_free(ret); | ||
138 | if (val != NULL) ASN1_TYPE_free(val); | ||
139 | return(NULL); | ||
140 | } | ||
141 | |||
142 | X509_ATTRIBUTE *X509_ATTRIBUTE_new(void) | ||
130 | { | 143 | { |
131 | X509_ATTRIBUTE *ret=NULL; | 144 | X509_ATTRIBUTE *ret=NULL; |
145 | ASN1_CTX c; | ||
132 | 146 | ||
133 | M_ASN1_New_Malloc(ret,X509_ATTRIBUTE); | 147 | M_ASN1_New_Malloc(ret,X509_ATTRIBUTE); |
134 | M_ASN1_New(ret->object,ASN1_OBJECT_new); | 148 | ret->object=OBJ_nid2obj(NID_undef); |
135 | ret->set=0; | 149 | ret->set=0; |
136 | ret->value.ptr=NULL; | 150 | ret->value.ptr=NULL; |
137 | return(ret); | 151 | return(ret); |
138 | M_ASN1_New_Error(ASN1_F_X509_ATTRIBUTE_NEW); | 152 | M_ASN1_New_Error(ASN1_F_X509_ATTRIBUTE_NEW); |
139 | } | 153 | } |
140 | 154 | ||
141 | void X509_ATTRIBUTE_free(a) | 155 | void X509_ATTRIBUTE_free(X509_ATTRIBUTE *a) |
142 | X509_ATTRIBUTE *a; | ||
143 | { | 156 | { |
144 | if (a == NULL) return; | 157 | if (a == NULL) return; |
145 | ASN1_OBJECT_free(a->object); | 158 | ASN1_OBJECT_free(a->object); |
146 | if (a->set) | 159 | if (a->set) |
147 | sk_pop_free(a->value.set,ASN1_TYPE_free); | 160 | sk_ASN1_TYPE_pop_free(a->value.set,ASN1_TYPE_free); |
148 | else | 161 | else |
149 | ASN1_TYPE_free(a->value.single); | 162 | ASN1_TYPE_free(a->value.single); |
150 | Free((char *)a); | 163 | Free((char *)a); |