summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/x_name.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/x_name.c')
-rw-r--r--src/lib/libcrypto/asn1/x_name.c98
1 files changed, 40 insertions, 58 deletions
diff --git a/src/lib/libcrypto/asn1/x_name.c b/src/lib/libcrypto/asn1/x_name.c
index dfd4363aa0..d10ac5acd1 100644
--- a/src/lib/libcrypto/asn1/x_name.c
+++ b/src/lib/libcrypto/asn1/x_name.c
@@ -145,8 +145,7 @@ static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it)
145 145
146 memerr: 146 memerr:
147 ASN1err(ASN1_F_X509_NAME_EX_NEW, ERR_R_MALLOC_FAILURE); 147 ASN1err(ASN1_F_X509_NAME_EX_NEW, ERR_R_MALLOC_FAILURE);
148 if (ret) 148 if (ret) {
149 {
150 if (ret->entries) 149 if (ret->entries)
151 sk_X509_NAME_ENTRY_free(ret->entries); 150 sk_X509_NAME_ENTRY_free(ret->entries);
152 free(ret); 151 free(ret);
@@ -242,14 +241,14 @@ static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out, const ASN1_IT
242} 241}
243 242
244static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne) 243static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne)
245 { 244{
246 sk_X509_NAME_ENTRY_free(ne); 245 sk_X509_NAME_ENTRY_free(ne);
247 } 246}
248 247
249static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne) 248static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne)
250 { 249{
251 sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free); 250 sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free);
252 } 251}
253 252
254static int x509_name_encode(X509_NAME *a) 253static int x509_name_encode(X509_NAME *a)
255{ 254{
@@ -295,12 +294,12 @@ static int x509_name_ex_print(BIO *out, ASN1_VALUE **pval,
295 int indent, 294 int indent,
296 const char *fname, 295 const char *fname,
297 const ASN1_PCTX *pctx) 296 const ASN1_PCTX *pctx)
298 { 297{
299 if (X509_NAME_print_ex(out, (X509_NAME *)*pval, 298 if (X509_NAME_print_ex(out, (X509_NAME *)*pval,
300 indent, pctx->nm_flags) <= 0) 299 indent, pctx->nm_flags) <= 0)
301 return 0; 300 return 0;
302 return 2; 301 return 2;
303 } 302}
304 303
305/* This function generates the canonical encoding of the Name structure. 304/* This function generates the canonical encoding of the Name structure.
306 * In it all strings are converted to UTF8, leading, trailing and 305 * In it all strings are converted to UTF8, leading, trailing and
@@ -316,39 +315,35 @@ static int x509_name_ex_print(BIO *out, ASN1_VALUE **pval,
316 */ 315 */
317 316
318static int x509_name_canon(X509_NAME *a) 317static int x509_name_canon(X509_NAME *a)
319 { 318{
320 unsigned char *p; 319 unsigned char *p;
321 STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL; 320 STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL;
322 STACK_OF(X509_NAME_ENTRY) *entries = NULL; 321 STACK_OF(X509_NAME_ENTRY) *entries = NULL;
323 X509_NAME_ENTRY *entry, *tmpentry = NULL; 322 X509_NAME_ENTRY *entry, *tmpentry = NULL;
324 int i, set = -1, ret = 0; 323 int i, set = -1, ret = 0;
325 324
326 if (a->canon_enc) 325 if (a->canon_enc) {
327 {
328 free(a->canon_enc); 326 free(a->canon_enc);
329 a->canon_enc = NULL; 327 a->canon_enc = NULL;
330 } 328 }
331 /* Special case: empty X509_NAME => null encoding */ 329 /* Special case: empty X509_NAME => null encoding */
332 if (sk_X509_NAME_ENTRY_num(a->entries) == 0) 330 if (sk_X509_NAME_ENTRY_num(a->entries) == 0) {
333 {
334 a->canon_enclen = 0; 331 a->canon_enclen = 0;
335 return 1; 332 return 1;
336 } 333 }
337 intname = sk_STACK_OF_X509_NAME_ENTRY_new_null(); 334 intname = sk_STACK_OF_X509_NAME_ENTRY_new_null();
338 if(!intname) 335 if(!intname)
339 goto err; 336 goto err;
340 for(i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) 337 for(i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
341 {
342 entry = sk_X509_NAME_ENTRY_value(a->entries, i); 338 entry = sk_X509_NAME_ENTRY_value(a->entries, i);
343 if(entry->set != set) 339 if(entry->set != set) {
344 {
345 entries = sk_X509_NAME_ENTRY_new_null(); 340 entries = sk_X509_NAME_ENTRY_new_null();
346 if(!entries) 341 if(!entries)
347 goto err; 342 goto err;
348 if(!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) 343 if(!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries))
349 goto err; 344 goto err;
350 set = entry->set; 345 set = entry->set;
351 } 346 }
352 tmpentry = X509_NAME_ENTRY_new(); 347 tmpentry = X509_NAME_ENTRY_new();
353 tmpentry->object = OBJ_dup(entry->object); 348 tmpentry->object = OBJ_dup(entry->object);
354 if (!asn1_string_canon(tmpentry->value, entry->value)) 349 if (!asn1_string_canon(tmpentry->value, entry->value))
@@ -356,7 +351,7 @@ static int x509_name_canon(X509_NAME *a)
356 if(!sk_X509_NAME_ENTRY_push(entries, tmpentry)) 351 if(!sk_X509_NAME_ENTRY_push(entries, tmpentry))
357 goto err; 352 goto err;
358 tmpentry = NULL; 353 tmpentry = NULL;
359 } 354 }
360 355
361 /* Finally generate encoding */ 356 /* Finally generate encoding */
362 357
@@ -381,7 +376,7 @@ static int x509_name_canon(X509_NAME *a)
381 sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, 376 sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
382 local_sk_X509_NAME_ENTRY_pop_free); 377 local_sk_X509_NAME_ENTRY_pop_free);
383 return ret; 378 return ret;
384 } 379}
385 380
386/* Bitmap of all the types of string that will be canonicalized. */ 381/* Bitmap of all the types of string that will be canonicalized. */
387 382
@@ -392,17 +387,16 @@ static int x509_name_canon(X509_NAME *a)
392 387
393 388
394static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) 389static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in)
395 { 390{
396 unsigned char *to, *from; 391 unsigned char *to, *from;
397 int len, i; 392 int len, i;
398 393
399 /* If type not in bitmask just copy string across */ 394 /* If type not in bitmask just copy string across */
400 if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) 395 if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) {
401 {
402 if (!ASN1_STRING_copy(out, in)) 396 if (!ASN1_STRING_copy(out, in))
403 return 0; 397 return 0;
404 return 1; 398 return 1;
405 } 399 }
406 400
407 out->type = V_ASN1_UTF8STRING; 401 out->type = V_ASN1_UTF8STRING;
408 out->length = ASN1_STRING_to_UTF8(&out->data, in); 402 out->length = ASN1_STRING_to_UTF8(&out->data, in);
@@ -421,99 +415,87 @@ static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in)
421 */ 415 */
422 416
423 /* Ignore leading spaces */ 417 /* Ignore leading spaces */
424 while((len > 0) && !(*from & 0x80) && isspace(*from)) 418 while((len > 0) && !(*from & 0x80) && isspace(*from)) {
425 {
426 from++; 419 from++;
427 len--; 420 len--;
428 } 421 }
429 422
430 to = from + len - 1; 423 to = from + len - 1;
431 424
432 /* Ignore trailing spaces */ 425 /* Ignore trailing spaces */
433 while ((len > 0) && !(*to & 0x80) && isspace(*to)) 426 while ((len > 0) && !(*to & 0x80) && isspace(*to)) {
434 {
435 to--; 427 to--;
436 len--; 428 len--;
437 } 429 }
438 430
439 to = out->data; 431 to = out->data;
440 432
441 i = 0; 433 i = 0;
442 while(i < len) 434 while(i < len) {
443 {
444 /* If MSB set just copy across */ 435 /* If MSB set just copy across */
445 if (*from & 0x80) 436 if (*from & 0x80) {
446 {
447 *to++ = *from++; 437 *to++ = *from++;
448 i++; 438 i++;
449 } 439 }
450 /* Collapse multiple spaces */ 440 /* Collapse multiple spaces */
451 else if (isspace(*from)) 441 else if (isspace(*from)) {
452 {
453 /* Copy one space across */ 442 /* Copy one space across */
454 *to++ = ' '; 443 *to++ = ' ';
455 /* Ignore subsequent spaces. Note: don't need to 444 /* Ignore subsequent spaces. Note: don't need to
456 * check len here because we know the last 445 * check len here because we know the last
457 * character is a non-space so we can't overflow. 446 * character is a non-space so we can't overflow.
458 */ 447 */
459 do 448 do {
460 {
461 from++; 449 from++;
462 i++; 450 i++;
463 } 451 } while(!(*from & 0x80) && isspace(*from));
464 while(!(*from & 0x80) && isspace(*from)); 452 } else {
465 }
466 else
467 {
468 *to++ = tolower(*from); 453 *to++ = tolower(*from);
469 from++; 454 from++;
470 i++; 455 i++;
471 }
472 } 456 }
457 }
473 458
474 out->length = to - out->data; 459 out->length = to - out->data;
475 460
476 return 1; 461 return 1;
477 462
478 } 463}
479 464
480static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) *_intname, 465static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) *_intname,
481 unsigned char **in) 466 unsigned char **in)
482 { 467{
483 int i, len, ltmp; 468 int i, len, ltmp;
484 ASN1_VALUE *v; 469 ASN1_VALUE *v;
485 STACK_OF(ASN1_VALUE) *intname = (STACK_OF(ASN1_VALUE) *)_intname; 470 STACK_OF(ASN1_VALUE) *intname = (STACK_OF(ASN1_VALUE) *)_intname;
486 471
487 len = 0; 472 len = 0;
488 for (i = 0; i < sk_ASN1_VALUE_num(intname); i++) 473 for (i = 0; i < sk_ASN1_VALUE_num(intname); i++) {
489 {
490 v = sk_ASN1_VALUE_value(intname, i); 474 v = sk_ASN1_VALUE_value(intname, i);
491 ltmp = ASN1_item_ex_i2d(&v, in, 475 ltmp = ASN1_item_ex_i2d(&v, in,
492 ASN1_ITEM_rptr(X509_NAME_ENTRIES), -1, -1); 476 ASN1_ITEM_rptr(X509_NAME_ENTRIES), -1, -1);
493 if (ltmp < 0) 477 if (ltmp < 0)
494 return ltmp; 478 return ltmp;
495 len += ltmp; 479 len += ltmp;
496 }
497 return len;
498 } 480 }
481 return len;
482}
499 483
500int X509_NAME_set(X509_NAME **xn, X509_NAME *name) 484int X509_NAME_set(X509_NAME **xn, X509_NAME *name)
501 { 485{
502 X509_NAME *in; 486 X509_NAME *in;
503 487
504 if (!xn || !name) return(0); 488 if (!xn || !name) return(0);
505 489
506 if (*xn != name) 490 if (*xn != name) {
507 {
508 in=X509_NAME_dup(name); 491 in=X509_NAME_dup(name);
509 if (in != NULL) 492 if (in != NULL) {
510 {
511 X509_NAME_free(*xn); 493 X509_NAME_free(*xn);
512 *xn=in; 494 *xn=in;
513 }
514 } 495 }
515 return(*xn != NULL);
516 } 496 }
497 return(*xn != NULL);
498}
517 499
518IMPLEMENT_STACK_OF(X509_NAME_ENTRY) 500IMPLEMENT_STACK_OF(X509_NAME_ENTRY)
519IMPLEMENT_ASN1_SET_OF(X509_NAME_ENTRY) 501IMPLEMENT_ASN1_SET_OF(X509_NAME_ENTRY)