summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509/x509_att.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509/x509_att.c')
-rw-r--r--src/lib/libcrypto/x509/x509_att.c277
1 files changed, 163 insertions, 114 deletions
diff --git a/src/lib/libcrypto/x509/x509_att.c b/src/lib/libcrypto/x509/x509_att.c
index 7f924fbe39..5699568998 100644
--- a/src/lib/libcrypto/x509/x509_att.c
+++ b/src/lib/libcrypto/x509/x509_att.c
@@ -5,21 +5,21 @@
5 * This package is an SSL implementation written 5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com). 6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL. 7 * The implementation was written so as to conform with Netscapes SSL.
8 * 8 *
9 * This library is free for commercial and non-commercial use as long as 9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions 10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA, 11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms 13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 * 15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed. 17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution 18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used. 19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or 20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package. 21 * in documentation (online or textual) provided with the package.
22 * 22 *
23 * Redistribution and use in source and binary forms, with or without 23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 24 * modification, are permitted provided that the following conditions
25 * are met: 25 * are met:
@@ -34,10 +34,10 @@
34 * Eric Young (eay@cryptsoft.com)" 34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library 35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-). 36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from 37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement: 38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 * 40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -49,7 +49,7 @@
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 51 * SUCH DAMAGE.
52 * 52 *
53 * The licence and distribution terms for any publically available version or 53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
@@ -65,134 +65,152 @@
65#include <openssl/x509.h> 65#include <openssl/x509.h>
66#include <openssl/x509v3.h> 66#include <openssl/x509v3.h>
67 67
68int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x) 68int
69X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
69{ 70{
70 return sk_X509_ATTRIBUTE_num(x); 71 return sk_X509_ATTRIBUTE_num(x);
71} 72}
72 73
73int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, 74int
74 int lastpos) 75X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
76 int lastpos)
75{ 77{
76 ASN1_OBJECT *obj; 78 ASN1_OBJECT *obj;
77 79
78 obj=OBJ_nid2obj(nid); 80 obj = OBJ_nid2obj(nid);
79 if (obj == NULL) return(-2); 81 if (obj == NULL)
80 return(X509at_get_attr_by_OBJ(x,obj,lastpos)); 82 return (-2);
83 return (X509at_get_attr_by_OBJ(x, obj, lastpos));
81} 84}
82 85
83int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj, 86int
84 int lastpos) 87X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
88 int lastpos)
85{ 89{
86 int n; 90 int n;
87 X509_ATTRIBUTE *ex; 91 X509_ATTRIBUTE *ex;
88 92
89 if (sk == NULL) return(-1); 93 if (sk == NULL)
94 return (-1);
90 lastpos++; 95 lastpos++;
91 if (lastpos < 0) 96 if (lastpos < 0)
92 lastpos=0; 97 lastpos = 0;
93 n=sk_X509_ATTRIBUTE_num(sk); 98 n = sk_X509_ATTRIBUTE_num(sk);
94 for ( ; lastpos < n; lastpos++) { 99 for (; lastpos < n; lastpos++) {
95 ex=sk_X509_ATTRIBUTE_value(sk,lastpos); 100 ex = sk_X509_ATTRIBUTE_value(sk, lastpos);
96 if (OBJ_cmp(ex->object,obj) == 0) 101 if (OBJ_cmp(ex->object, obj) == 0)
97 return(lastpos); 102 return (lastpos);
98 } 103 }
99 return(-1); 104 return (-1);
100} 105}
101 106
102X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc) 107X509_ATTRIBUTE *
108X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)
103{ 109{
104 if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0) 110 if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0)
105 return NULL; 111 return NULL;
106 else 112 else
107 return sk_X509_ATTRIBUTE_value(x,loc); 113 return sk_X509_ATTRIBUTE_value(x, loc);
108} 114}
109 115
110X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc) 116X509_ATTRIBUTE *
117X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)
111{ 118{
112 X509_ATTRIBUTE *ret; 119 X509_ATTRIBUTE *ret;
113 120
114 if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0) 121 if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0)
115 return(NULL); 122 return (NULL);
116 ret=sk_X509_ATTRIBUTE_delete(x,loc); 123 ret = sk_X509_ATTRIBUTE_delete(x, loc);
117 return(ret); 124 return (ret);
118} 125}
119 126
120STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, 127STACK_OF(X509_ATTRIBUTE) *
121 X509_ATTRIBUTE *attr) 128X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, X509_ATTRIBUTE *attr)
122{ 129{
123 X509_ATTRIBUTE *new_attr=NULL; 130 X509_ATTRIBUTE *new_attr = NULL;
124 STACK_OF(X509_ATTRIBUTE) *sk=NULL; 131 STACK_OF(X509_ATTRIBUTE) *sk = NULL;
125 132
126 if (x == NULL) { 133 if (x == NULL) {
127 X509err(X509_F_X509AT_ADD1_ATTR, ERR_R_PASSED_NULL_PARAMETER); 134 X509err(X509_F_X509AT_ADD1_ATTR, ERR_R_PASSED_NULL_PARAMETER);
128 goto err2; 135 goto err2;
129 } 136 }
130 137
131 if (*x == NULL) { 138 if (*x == NULL) {
132 if ((sk=sk_X509_ATTRIBUTE_new_null()) == NULL) 139 if ((sk = sk_X509_ATTRIBUTE_new_null()) == NULL)
133 goto err; 140 goto err;
134 } else 141 } else
135 sk= *x; 142 sk= *x;
136 143
137 if ((new_attr=X509_ATTRIBUTE_dup(attr)) == NULL) 144 if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL)
138 goto err2; 145 goto err2;
139 if (!sk_X509_ATTRIBUTE_push(sk,new_attr)) 146 if (!sk_X509_ATTRIBUTE_push(sk, new_attr))
140 goto err; 147 goto err;
141 if (*x == NULL) 148 if (*x == NULL)
142 *x=sk; 149 *x = sk;
143 return(sk); 150 return (sk);
151
144err: 152err:
145 X509err(X509_F_X509AT_ADD1_ATTR,ERR_R_MALLOC_FAILURE); 153 X509err(X509_F_X509AT_ADD1_ATTR, ERR_R_MALLOC_FAILURE);
146err2: 154err2:
147 if (new_attr != NULL) X509_ATTRIBUTE_free(new_attr); 155 if (new_attr != NULL)
148 if (sk != NULL) sk_X509_ATTRIBUTE_free(sk); 156 X509_ATTRIBUTE_free(new_attr);
149 return(NULL); 157 if (sk != NULL)
158 sk_X509_ATTRIBUTE_free(sk);
159 return (NULL);
150} 160}
151 161
152STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, 162STACK_OF(X509_ATTRIBUTE) *
153 const ASN1_OBJECT *obj, int type, 163X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, const ASN1_OBJECT *obj,
154 const unsigned char *bytes, int len) 164 int type, const unsigned char *bytes, int len)
155{ 165{
156 X509_ATTRIBUTE *attr; 166 X509_ATTRIBUTE *attr;
157 STACK_OF(X509_ATTRIBUTE) *ret; 167 STACK_OF(X509_ATTRIBUTE) *ret;
168
158 attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len); 169 attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len);
159 if(!attr) return 0; 170 if (!attr)
171 return 0;
160 ret = X509at_add1_attr(x, attr); 172 ret = X509at_add1_attr(x, attr);
161 X509_ATTRIBUTE_free(attr); 173 X509_ATTRIBUTE_free(attr);
162 return ret; 174 return ret;
163} 175}
164 176
165STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, 177STACK_OF(X509_ATTRIBUTE) *
166 int nid, int type, 178X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, int nid, int type,
167 const unsigned char *bytes, int len) 179 const unsigned char *bytes, int len)
168{ 180{
169 X509_ATTRIBUTE *attr; 181 X509_ATTRIBUTE *attr;
170 STACK_OF(X509_ATTRIBUTE) *ret; 182 STACK_OF(X509_ATTRIBUTE) *ret;
183
171 attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len); 184 attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len);
172 if(!attr) return 0; 185 if (!attr)
186 return 0;
173 ret = X509at_add1_attr(x, attr); 187 ret = X509at_add1_attr(x, attr);
174 X509_ATTRIBUTE_free(attr); 188 X509_ATTRIBUTE_free(attr);
175 return ret; 189 return ret;
176} 190}
177 191
178STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, 192STACK_OF(X509_ATTRIBUTE) *
179 const char *attrname, int type, 193X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, const char *attrname,
180 const unsigned char *bytes, int len) 194 int type, const unsigned char *bytes, int len)
181{ 195{
182 X509_ATTRIBUTE *attr; 196 X509_ATTRIBUTE *attr;
183 STACK_OF(X509_ATTRIBUTE) *ret; 197 STACK_OF(X509_ATTRIBUTE) *ret;
198
184 attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len); 199 attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len);
185 if(!attr) return 0; 200 if (!attr)
201 return 0;
186 ret = X509at_add1_attr(x, attr); 202 ret = X509at_add1_attr(x, attr);
187 X509_ATTRIBUTE_free(attr); 203 X509_ATTRIBUTE_free(attr);
188 return ret; 204 return ret;
189} 205}
190 206
191void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, 207void *
192 ASN1_OBJECT *obj, int lastpos, int type) 208X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, ASN1_OBJECT *obj,
209 int lastpos, int type)
193{ 210{
194 int i; 211 int i;
195 X509_ATTRIBUTE *at; 212 X509_ATTRIBUTE *at;
213
196 i = X509at_get_attr_by_OBJ(x, obj, lastpos); 214 i = X509at_get_attr_by_OBJ(x, obj, lastpos);
197 if (i == -1) 215 if (i == -1)
198 return NULL; 216 return NULL;
@@ -204,96 +222,112 @@ void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x,
204 return X509_ATTRIBUTE_get0_data(at, 0, type, NULL); 222 return X509_ATTRIBUTE_get0_data(at, 0, type, NULL);
205} 223}
206 224
207X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, 225X509_ATTRIBUTE *
208 int atrtype, const void *data, int len) 226X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, int atrtype,
227 const void *data, int len)
209{ 228{
210 ASN1_OBJECT *obj; 229 ASN1_OBJECT *obj;
211 X509_ATTRIBUTE *ret; 230 X509_ATTRIBUTE *ret;
212 231
213 obj=OBJ_nid2obj(nid); 232 obj = OBJ_nid2obj(nid);
214 if (obj == NULL) { 233 if (obj == NULL) {
215 X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_NID,X509_R_UNKNOWN_NID); 234 X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_NID,
216 return(NULL); 235 X509_R_UNKNOWN_NID);
236 return (NULL);
217 } 237 }
218 ret=X509_ATTRIBUTE_create_by_OBJ(attr,obj,atrtype,data,len); 238 ret = X509_ATTRIBUTE_create_by_OBJ(attr, obj, atrtype, data, len);
219 if (ret == NULL) ASN1_OBJECT_free(obj); 239 if (ret == NULL)
220 return(ret); 240 ASN1_OBJECT_free(obj);
241 return (ret);
221} 242}
222 243
223X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, 244X509_ATTRIBUTE *
224 const ASN1_OBJECT *obj, int atrtype, const void *data, int len) 245X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj,
246 int atrtype, const void *data, int len)
225{ 247{
226 X509_ATTRIBUTE *ret; 248 X509_ATTRIBUTE *ret;
227 249
228 if ((attr == NULL) || (*attr == NULL)) { 250 if ((attr == NULL) || (*attr == NULL)) {
229 if ((ret=X509_ATTRIBUTE_new()) == NULL) { 251 if ((ret = X509_ATTRIBUTE_new()) == NULL) {
230 X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ,ERR_R_MALLOC_FAILURE); 252 X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ,
231 return(NULL); 253 ERR_R_MALLOC_FAILURE);
254 return (NULL);
232 } 255 }
233 } 256 } else
234 else
235 ret= *attr; 257 ret= *attr;
236 258
237 if (!X509_ATTRIBUTE_set1_object(ret,obj)) 259 if (!X509_ATTRIBUTE_set1_object(ret, obj))
238 goto err; 260 goto err;
239 if (!X509_ATTRIBUTE_set1_data(ret,atrtype,data,len)) 261 if (!X509_ATTRIBUTE_set1_data(ret, atrtype, data, len))
240 goto err; 262 goto err;
241 263
242 if ((attr != NULL) && (*attr == NULL)) *attr=ret; 264 if ((attr != NULL) && (*attr == NULL))
243 return(ret); 265 *attr = ret;
266 return (ret);
267
244err: 268err:
245 if ((attr == NULL) || (ret != *attr)) 269 if ((attr == NULL) || (ret != *attr))
246 X509_ATTRIBUTE_free(ret); 270 X509_ATTRIBUTE_free(ret);
247 return(NULL); 271 return (NULL);
248} 272}
249 273
250X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, 274X509_ATTRIBUTE *
251 const char *atrname, int type, const unsigned char *bytes, int len) 275X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, const char *atrname,
276 int type, const unsigned char *bytes, int len)
252{ 277{
253 ASN1_OBJECT *obj; 278 ASN1_OBJECT *obj;
254 X509_ATTRIBUTE *nattr; 279 X509_ATTRIBUTE *nattr;
255 280
256 obj=OBJ_txt2obj(atrname, 0); 281 obj = OBJ_txt2obj(atrname, 0);
257 if (obj == NULL) { 282 if (obj == NULL) {
258 X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_TXT, 283 X509err(X509_F_X509_ATTRIBUTE_CREATE_BY_TXT,
259 X509_R_INVALID_FIELD_NAME); 284 X509_R_INVALID_FIELD_NAME);
260 ERR_add_error_data(2, "name=", atrname); 285 ERR_add_error_data(2, "name=", atrname);
261 return(NULL); 286 return (NULL);
262 } 287 }
263 nattr = X509_ATTRIBUTE_create_by_OBJ(attr,obj,type,bytes,len); 288 nattr = X509_ATTRIBUTE_create_by_OBJ(attr, obj, type, bytes, len);
264 ASN1_OBJECT_free(obj); 289 ASN1_OBJECT_free(obj);
265 return nattr; 290 return nattr;
266} 291}
267 292
268int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj) 293int
294X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj)
269{ 295{
270 if ((attr == NULL) || (obj == NULL)) 296 if ((attr == NULL) || (obj == NULL))
271 return(0); 297 return (0);
272 ASN1_OBJECT_free(attr->object); 298 ASN1_OBJECT_free(attr->object);
273 attr->object=OBJ_dup(obj); 299 attr->object = OBJ_dup(obj);
274 return(1); 300 return (1);
275} 301}
276 302
277int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len) 303int
304X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data,
305 int len)
278{ 306{
279 ASN1_TYPE *ttmp; 307 ASN1_TYPE *ttmp;
280 ASN1_STRING *stmp = NULL; 308 ASN1_STRING *stmp = NULL;
281 int atype = 0; 309 int atype = 0;
282 if (!attr) return 0; 310
283 if(attrtype & MBSTRING_FLAG) { 311 if (!attr)
312 return 0;
313 if (attrtype & MBSTRING_FLAG) {
284 stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype, 314 stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype,
285 OBJ_obj2nid(attr->object)); 315 OBJ_obj2nid(attr->object));
286 if(!stmp) { 316 if (!stmp) {
287 X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_ASN1_LIB); 317 X509err(X509_F_X509_ATTRIBUTE_SET1_DATA,
318 ERR_R_ASN1_LIB);
288 return 0; 319 return 0;
289 } 320 }
290 atype = stmp->type; 321 atype = stmp->type;
291 } else if (len != -1){ 322 } else if (len != -1){
292 if(!(stmp = ASN1_STRING_type_new(attrtype))) goto err; 323 if (!(stmp = ASN1_STRING_type_new(attrtype)))
293 if(!ASN1_STRING_set(stmp, data, len)) goto err; 324 goto err;
325 if (!ASN1_STRING_set(stmp, data, len))
326 goto err;
294 atype = attrtype; 327 atype = attrtype;
295 } 328 }
296 if(!(attr->value.set = sk_ASN1_TYPE_new_null())) goto err; 329 if (!(attr->value.set = sk_ASN1_TYPE_new_null()))
330 goto err;
297 attr->single = 0; 331 attr->single = 0;
298 /* This is a bit naughty because the attribute should really have 332 /* This is a bit naughty because the attribute should really have
299 * at least one value but some types use and zero length SET and 333 * at least one value but some types use and zero length SET and
@@ -301,49 +335,64 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *dat
301 */ 335 */
302 if (attrtype == 0) 336 if (attrtype == 0)
303 return 1; 337 return 1;
304 if(!(ttmp = ASN1_TYPE_new())) goto err; 338 if (!(ttmp = ASN1_TYPE_new()))
339 goto err;
305 if ((len == -1) && !(attrtype & MBSTRING_FLAG)) { 340 if ((len == -1) && !(attrtype & MBSTRING_FLAG)) {
306 if (!ASN1_TYPE_set1(ttmp, attrtype, data)) 341 if (!ASN1_TYPE_set1(ttmp, attrtype, data))
307 goto err; 342 goto err;
308 } else 343 } else
309 ASN1_TYPE_set(ttmp, atype, stmp); 344 ASN1_TYPE_set(ttmp, atype, stmp);
310 if(!sk_ASN1_TYPE_push(attr->value.set, ttmp)) goto err; 345 if (!sk_ASN1_TYPE_push(attr->value.set, ttmp))
346 goto err;
311 return 1; 347 return 1;
312 err: 348
349err:
313 X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE); 350 X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE);
314 return 0; 351 return 0;
315} 352}
316 353
317int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr) 354int
355X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr)
318{ 356{
319 if(!attr->single) return sk_ASN1_TYPE_num(attr->value.set); 357 if (!attr->single)
320 if(attr->value.single) return 1; 358 return sk_ASN1_TYPE_num(attr->value.set);
359 if (attr->value.single)
360 return 1;
321 return 0; 361 return 0;
322} 362}
323 363
324ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr) 364ASN1_OBJECT *
365X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr)
325{ 366{
326 if (attr == NULL) return(NULL); 367 if (attr == NULL)
327 return(attr->object); 368 return (NULL);
369 return (attr->object);
328} 370}
329 371
330void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, 372void *
331 int atrtype, void *data) 373X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, void *data)
332{ 374{
333 ASN1_TYPE *ttmp; 375 ASN1_TYPE *ttmp;
376
334 ttmp = X509_ATTRIBUTE_get0_type(attr, idx); 377 ttmp = X509_ATTRIBUTE_get0_type(attr, idx);
335 if(!ttmp) return NULL; 378 if (!ttmp)
336 if(atrtype != ASN1_TYPE_get(ttmp)){ 379 return NULL;
380 if (atrtype != ASN1_TYPE_get(ttmp)){
337 X509err(X509_F_X509_ATTRIBUTE_GET0_DATA, X509_R_WRONG_TYPE); 381 X509err(X509_F_X509_ATTRIBUTE_GET0_DATA, X509_R_WRONG_TYPE);
338 return NULL; 382 return NULL;
339 } 383 }
340 return ttmp->value.ptr; 384 return ttmp->value.ptr;
341} 385}
342 386
343ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx) 387ASN1_TYPE *
388X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)
344{ 389{
345 if (attr == NULL) return(NULL); 390 if (attr == NULL)
346 if(idx >= X509_ATTRIBUTE_count(attr)) return NULL; 391 return (NULL);
347 if(!attr->single) return sk_ASN1_TYPE_value(attr->value.set, idx); 392 if (idx >= X509_ATTRIBUTE_count(attr))
348 else return attr->value.single; 393 return NULL;
394 if (!attr->single)
395 return sk_ASN1_TYPE_value(attr->value.set, idx);
396 else
397 return attr->value.single;
349} 398}