OLD | NEW |
1 /* asn1_gen.c */ | 1 /* asn1_gen.c */ |
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 * project 2002. | 3 * project 2002. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 2002 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 2002 The OpenSSL Project. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 { | 240 { |
241 ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len, | 241 ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len, |
242 etmp->exp_tag, etmp->exp_class); | 242 etmp->exp_tag, etmp->exp_class); |
243 if (etmp->exp_pad) | 243 if (etmp->exp_pad) |
244 *p++ = 0; | 244 *p++ = 0; |
245 } | 245 } |
246 | 246 |
247 /* If IMPLICIT, output tag */ | 247 /* If IMPLICIT, output tag */ |
248 | 248 |
249 if (asn1_tags.imp_tag != -1) | 249 if (asn1_tags.imp_tag != -1) |
| 250 { |
| 251 if (asn1_tags.imp_class == V_ASN1_UNIVERSAL |
| 252 && (asn1_tags.imp_tag == V_ASN1_SEQUENCE |
| 253 || asn1_tags.imp_tag == V_ASN1_SET) ) |
| 254 hdr_constructed = V_ASN1_CONSTRUCTED; |
250 ASN1_put_object(&p, hdr_constructed, hdr_len, | 255 ASN1_put_object(&p, hdr_constructed, hdr_len, |
251 asn1_tags.imp_tag, asn1_tags.imp_class); | 256 asn1_tags.imp_tag, asn1_tags.imp_class); |
| 257 } |
252 | 258 |
253 /* Copy across original encoding */ | 259 /* Copy across original encoding */ |
254 memcpy(p, cpy_start, cpy_len); | 260 memcpy(p, cpy_start, cpy_len); |
255 | 261 |
256 cp = new_der; | 262 cp = new_der; |
257 | 263 |
258 /* Obtain new ASN1_TYPE structure */ | 264 /* Obtain new ASN1_TYPE structure */ |
259 ret = d2i_ASN1_TYPE(NULL, &cp, len); | 265 ret = d2i_ASN1_TYPE(NULL, &cp, len); |
260 | 266 |
261 err: | 267 err: |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 *pclass = V_ASN1_CONTEXT_SPECIFIC; | 440 *pclass = V_ASN1_CONTEXT_SPECIFIC; |
435 | 441 |
436 return 1; | 442 return 1; |
437 | 443 |
438 } | 444 } |
439 | 445 |
440 /* Handle multiple types: SET and SEQUENCE */ | 446 /* Handle multiple types: SET and SEQUENCE */ |
441 | 447 |
442 static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf) | 448 static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf) |
443 { | 449 { |
444 » ASN1_TYPE *ret = NULL, *typ = NULL; | 450 » ASN1_TYPE *ret = NULL; |
445 STACK_OF(ASN1_TYPE) *sk = NULL; | 451 STACK_OF(ASN1_TYPE) *sk = NULL; |
446 STACK_OF(CONF_VALUE) *sect = NULL; | 452 STACK_OF(CONF_VALUE) *sect = NULL; |
447 » unsigned char *der = NULL, *p; | 453 » unsigned char *der = NULL; |
448 int derlen; | 454 int derlen; |
449 » int i, is_set; | 455 » int i; |
450 sk = sk_ASN1_TYPE_new_null(); | 456 sk = sk_ASN1_TYPE_new_null(); |
451 if (!sk) | 457 if (!sk) |
452 goto bad; | 458 goto bad; |
453 if (section) | 459 if (section) |
454 { | 460 { |
455 if (!cnf) | 461 if (!cnf) |
456 goto bad; | 462 goto bad; |
457 sect = X509V3_get_section(cnf, (char *)section); | 463 sect = X509V3_get_section(cnf, (char *)section); |
458 if (!sect) | 464 if (!sect) |
459 goto bad; | 465 goto bad; |
460 for (i = 0; i < sk_CONF_VALUE_num(sect); i++) | 466 for (i = 0; i < sk_CONF_VALUE_num(sect); i++) |
461 { | 467 { |
462 » » » typ = ASN1_generate_v3(sk_CONF_VALUE_value(sect, i)->val
ue, cnf); | 468 » » » ASN1_TYPE *typ = ASN1_generate_v3(sk_CONF_VALUE_value(se
ct, i)->value, cnf); |
463 if (!typ) | 469 if (!typ) |
464 goto bad; | 470 goto bad; |
465 if (!sk_ASN1_TYPE_push(sk, typ)) | 471 if (!sk_ASN1_TYPE_push(sk, typ)) |
466 goto bad; | 472 goto bad; |
467 typ = NULL; | |
468 } | 473 } |
469 } | 474 } |
470 | 475 |
471 /* Now we has a STACK of the components, convert to the correct form */ | 476 /* Now we has a STACK of the components, convert to the correct form */ |
472 | 477 |
473 if (utype == V_ASN1_SET) | 478 if (utype == V_ASN1_SET) |
474 » » is_set = 1; | 479 » » derlen = i2d_ASN1_SET_ANY(sk, &der); |
475 else | 480 else |
476 » » is_set = 0; | 481 » » derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der); |
477 | 482 |
478 | 483 » if (derlen < 0) |
479 » derlen = i2d_ASN1_SET_OF_ASN1_TYPE(sk, NULL, i2d_ASN1_TYPE, utype, | |
480 » » » » » V_ASN1_UNIVERSAL, is_set); | |
481 » der = OPENSSL_malloc(derlen); | |
482 » if (!der) | |
483 goto bad; | 484 goto bad; |
484 p = der; | |
485 i2d_ASN1_SET_OF_ASN1_TYPE(sk, &p, i2d_ASN1_TYPE, utype, | |
486 V_ASN1_UNIVERSAL, is_set); | |
487 | 485 |
488 if (!(ret = ASN1_TYPE_new())) | 486 if (!(ret = ASN1_TYPE_new())) |
489 goto bad; | 487 goto bad; |
490 | 488 |
491 if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype))) | 489 if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype))) |
492 goto bad; | 490 goto bad; |
493 | 491 |
494 ret->type = utype; | 492 ret->type = utype; |
495 | 493 |
496 ret->value.asn1_string->data = der; | 494 ret->value.asn1_string->data = der; |
497 ret->value.asn1_string->length = derlen; | 495 ret->value.asn1_string->length = derlen; |
498 | 496 |
499 der = NULL; | 497 der = NULL; |
500 | 498 |
501 bad: | 499 bad: |
502 | 500 |
503 if (der) | 501 if (der) |
504 OPENSSL_free(der); | 502 OPENSSL_free(der); |
505 | 503 |
506 if (sk) | 504 if (sk) |
507 sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free); | 505 sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free); |
508 if (typ) | |
509 ASN1_TYPE_free(typ); | |
510 if (sect) | 506 if (sect) |
511 X509V3_section_free(cnf, sect); | 507 X509V3_section_free(cnf, sect); |
512 | 508 |
513 return ret; | 509 return ret; |
514 } | 510 } |
515 | 511 |
516 static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class, int exp_cons
tructed, int exp_pad, int imp_ok) | 512 static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class, int exp_cons
tructed, int exp_pad, int imp_ok) |
517 { | 513 { |
518 tag_exp_type *exp_tmp; | 514 tag_exp_type *exp_tmp; |
519 /* Can only have IMPLICIT if permitted */ | 515 /* Can only have IMPLICIT if permitted */ |
(...skipping 29 matching lines...) Expand all Loading... |
549 exp_tmp->exp_constructed = exp_constructed; | 545 exp_tmp->exp_constructed = exp_constructed; |
550 exp_tmp->exp_pad = exp_pad; | 546 exp_tmp->exp_pad = exp_pad; |
551 | 547 |
552 return 1; | 548 return 1; |
553 } | 549 } |
554 | 550 |
555 | 551 |
556 static int asn1_str2tag(const char *tagstr, int len) | 552 static int asn1_str2tag(const char *tagstr, int len) |
557 { | 553 { |
558 unsigned int i; | 554 unsigned int i; |
559 » static struct tag_name_st *tntmp, tnst [] = { | 555 » static const struct tag_name_st *tntmp, tnst [] = { |
560 ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN), | 556 ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN), |
561 ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN), | 557 ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN), |
562 ASN1_GEN_STR("NULL", V_ASN1_NULL), | 558 ASN1_GEN_STR("NULL", V_ASN1_NULL), |
563 ASN1_GEN_STR("INT", V_ASN1_INTEGER), | 559 ASN1_GEN_STR("INT", V_ASN1_INTEGER), |
564 ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER), | 560 ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER), |
565 ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED), | 561 ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED), |
566 ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED), | 562 ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED), |
567 ASN1_GEN_STR("OID", V_ASN1_OBJECT), | 563 ASN1_GEN_STR("OID", V_ASN1_OBJECT), |
568 ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT), | 564 ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT), |
569 ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME), | 565 ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME), |
(...skipping 14 matching lines...) Expand all Loading... |
584 ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING), | 580 ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING), |
585 ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING), | 581 ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING), |
586 ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING), | 582 ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING), |
587 ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING), | 583 ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING), |
588 ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING), | 584 ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING), |
589 ASN1_GEN_STR("T61", V_ASN1_T61STRING), | 585 ASN1_GEN_STR("T61", V_ASN1_T61STRING), |
590 ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING), | 586 ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING), |
591 ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING), | 587 ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING), |
592 ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING), | 588 ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING), |
593 ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING), | 589 ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING), |
| 590 ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING), |
| 591 ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING), |
594 | 592 |
595 /* Special cases */ | 593 /* Special cases */ |
596 ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE), | 594 ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE), |
597 ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE), | 595 ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE), |
598 ASN1_GEN_STR("SET", V_ASN1_SET), | 596 ASN1_GEN_STR("SET", V_ASN1_SET), |
599 /* type modifiers */ | 597 /* type modifiers */ |
600 /* Explicit tag */ | 598 /* Explicit tag */ |
601 ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP), | 599 ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP), |
602 ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP), | 600 ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP), |
603 /* Implicit tag */ | 601 /* Implicit tag */ |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 break; | 727 break; |
730 | 728 |
731 case V_ASN1_BMPSTRING: | 729 case V_ASN1_BMPSTRING: |
732 case V_ASN1_PRINTABLESTRING: | 730 case V_ASN1_PRINTABLESTRING: |
733 case V_ASN1_IA5STRING: | 731 case V_ASN1_IA5STRING: |
734 case V_ASN1_T61STRING: | 732 case V_ASN1_T61STRING: |
735 case V_ASN1_UTF8STRING: | 733 case V_ASN1_UTF8STRING: |
736 case V_ASN1_VISIBLESTRING: | 734 case V_ASN1_VISIBLESTRING: |
737 case V_ASN1_UNIVERSALSTRING: | 735 case V_ASN1_UNIVERSALSTRING: |
738 case V_ASN1_GENERALSTRING: | 736 case V_ASN1_GENERALSTRING: |
| 737 case V_ASN1_NUMERICSTRING: |
739 | 738 |
740 if (format == ASN1_GEN_FORMAT_ASCII) | 739 if (format == ASN1_GEN_FORMAT_ASCII) |
741 format = MBSTRING_ASC; | 740 format = MBSTRING_ASC; |
742 else if (format == ASN1_GEN_FORMAT_UTF8) | 741 else if (format == ASN1_GEN_FORMAT_UTF8) |
743 format = MBSTRING_UTF8; | 742 format = MBSTRING_UTF8; |
744 else | 743 else |
745 { | 744 { |
746 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_FORMAT); | 745 ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_FORMAT); |
747 goto bad_form; | 746 goto bad_form; |
748 } | 747 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 return 0; | 845 return 0; |
847 } | 846 } |
848 if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) | 847 if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) |
849 { | 848 { |
850 ASN1err(ASN1_F_BITSTR_CB, ERR_R_MALLOC_FAILURE); | 849 ASN1err(ASN1_F_BITSTR_CB, ERR_R_MALLOC_FAILURE); |
851 return 0; | 850 return 0; |
852 } | 851 } |
853 return 1; | 852 return 1; |
854 } | 853 } |
855 | 854 |
OLD | NEW |