diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/asn1_gen.c')
-rw-r--r-- | src/lib/libcrypto/asn1/asn1_gen.c | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_gen.c b/src/lib/libcrypto/asn1/asn1_gen.c index 2da38292c8..4fc241908f 100644 --- a/src/lib/libcrypto/asn1/asn1_gen.c +++ b/src/lib/libcrypto/asn1/asn1_gen.c | |||
@@ -227,6 +227,8 @@ ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf) | |||
227 | /* Allocate buffer for new encoding */ | 227 | /* Allocate buffer for new encoding */ |
228 | 228 | ||
229 | new_der = OPENSSL_malloc(len); | 229 | new_der = OPENSSL_malloc(len); |
230 | if (!new_der) | ||
231 | goto err; | ||
230 | 232 | ||
231 | /* Generate tagged encoding */ | 233 | /* Generate tagged encoding */ |
232 | 234 | ||
@@ -245,8 +247,14 @@ ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf) | |||
245 | /* If IMPLICIT, output tag */ | 247 | /* If IMPLICIT, output tag */ |
246 | 248 | ||
247 | 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; | ||
248 | ASN1_put_object(&p, hdr_constructed, hdr_len, | 255 | ASN1_put_object(&p, hdr_constructed, hdr_len, |
249 | asn1_tags.imp_tag, asn1_tags.imp_class); | 256 | asn1_tags.imp_tag, asn1_tags.imp_class); |
257 | } | ||
250 | 258 | ||
251 | /* Copy across original encoding */ | 259 | /* Copy across original encoding */ |
252 | memcpy(p, cpy_start, cpy_len); | 260 | memcpy(p, cpy_start, cpy_len); |
@@ -439,13 +447,15 @@ static int parse_tagging(const char *vstart, int vlen, int *ptag, int *pclass) | |||
439 | 447 | ||
440 | 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) |
441 | { | 449 | { |
442 | ASN1_TYPE *ret = NULL, *typ = NULL; | 450 | ASN1_TYPE *ret = NULL; |
443 | STACK_OF(ASN1_TYPE) *sk = NULL; | 451 | STACK_OF(ASN1_TYPE) *sk = NULL; |
444 | STACK_OF(CONF_VALUE) *sect = NULL; | 452 | STACK_OF(CONF_VALUE) *sect = NULL; |
445 | unsigned char *der = NULL, *p; | 453 | unsigned char *der = NULL; |
446 | int derlen; | 454 | int derlen; |
447 | int i, is_set; | 455 | int i; |
448 | sk = sk_ASN1_TYPE_new_null(); | 456 | sk = sk_ASN1_TYPE_new_null(); |
457 | if (!sk) | ||
458 | goto bad; | ||
449 | if (section) | 459 | if (section) |
450 | { | 460 | { |
451 | if (!cnf) | 461 | if (!cnf) |
@@ -455,28 +465,23 @@ static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf) | |||
455 | goto bad; | 465 | goto bad; |
456 | for (i = 0; i < sk_CONF_VALUE_num(sect); i++) | 466 | for (i = 0; i < sk_CONF_VALUE_num(sect); i++) |
457 | { | 467 | { |
458 | typ = ASN1_generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf); | 468 | ASN1_TYPE *typ = ASN1_generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf); |
459 | if (!typ) | 469 | if (!typ) |
460 | goto bad; | 470 | goto bad; |
461 | sk_ASN1_TYPE_push(sk, typ); | 471 | if (!sk_ASN1_TYPE_push(sk, typ)) |
462 | typ = NULL; | 472 | goto bad; |
463 | } | 473 | } |
464 | } | 474 | } |
465 | 475 | ||
466 | /* 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 */ |
467 | 477 | ||
468 | if (utype == V_ASN1_SET) | 478 | if (utype == V_ASN1_SET) |
469 | is_set = 1; | 479 | derlen = i2d_ASN1_SET_ANY(sk, &der); |
470 | else | 480 | else |
471 | is_set = 0; | 481 | derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der); |
472 | |||
473 | 482 | ||
474 | derlen = i2d_ASN1_SET_OF_ASN1_TYPE(sk, NULL, i2d_ASN1_TYPE, utype, | 483 | if (derlen < 0) |
475 | V_ASN1_UNIVERSAL, is_set); | 484 | goto bad; |
476 | der = OPENSSL_malloc(derlen); | ||
477 | p = der; | ||
478 | i2d_ASN1_SET_OF_ASN1_TYPE(sk, &p, i2d_ASN1_TYPE, utype, | ||
479 | V_ASN1_UNIVERSAL, is_set); | ||
480 | 485 | ||
481 | if (!(ret = ASN1_TYPE_new())) | 486 | if (!(ret = ASN1_TYPE_new())) |
482 | goto bad; | 487 | goto bad; |
@@ -498,8 +503,6 @@ static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf) | |||
498 | 503 | ||
499 | if (sk) | 504 | if (sk) |
500 | sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free); | 505 | sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free); |
501 | if (typ) | ||
502 | ASN1_TYPE_free(typ); | ||
503 | if (sect) | 506 | if (sect) |
504 | X509V3_section_free(cnf, sect); | 507 | X509V3_section_free(cnf, sect); |
505 | 508 | ||
@@ -549,7 +552,7 @@ static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class, int exp_cons | |||
549 | static int asn1_str2tag(const char *tagstr, int len) | 552 | static int asn1_str2tag(const char *tagstr, int len) |
550 | { | 553 | { |
551 | unsigned int i; | 554 | unsigned int i; |
552 | static struct tag_name_st *tntmp, tnst [] = { | 555 | static const struct tag_name_st *tntmp, tnst [] = { |
553 | ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN), | 556 | ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN), |
554 | ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN), | 557 | ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN), |
555 | ASN1_GEN_STR("NULL", V_ASN1_NULL), | 558 | ASN1_GEN_STR("NULL", V_ASN1_NULL), |
@@ -584,6 +587,8 @@ static int asn1_str2tag(const char *tagstr, int len) | |||
584 | ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING), | 587 | ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING), |
585 | ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING), | 588 | ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING), |
586 | 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), | ||
587 | 592 | ||
588 | /* Special cases */ | 593 | /* Special cases */ |
589 | ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE), | 594 | ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE), |
@@ -729,6 +734,7 @@ static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype) | |||
729 | case V_ASN1_VISIBLESTRING: | 734 | case V_ASN1_VISIBLESTRING: |
730 | case V_ASN1_UNIVERSALSTRING: | 735 | case V_ASN1_UNIVERSALSTRING: |
731 | case V_ASN1_GENERALSTRING: | 736 | case V_ASN1_GENERALSTRING: |
737 | case V_ASN1_NUMERICSTRING: | ||
732 | 738 | ||
733 | if (format == ASN1_GEN_FORMAT_ASCII) | 739 | if (format == ASN1_GEN_FORMAT_ASCII) |
734 | format = MBSTRING_ASC; | 740 | format = MBSTRING_ASC; |