diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/cms/cms_sd.c | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/src/lib/libcrypto/cms/cms_sd.c b/src/lib/libcrypto/cms/cms_sd.c index 5a38bf59aa..b783941911 100644 --- a/src/lib/libcrypto/cms/cms_sd.c +++ b/src/lib/libcrypto/cms/cms_sd.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: cms_sd.c,v 1.31 2024/03/29 06:41:58 tb Exp $ */ | 1 | /* $OpenBSD: cms_sd.c,v 1.32 2024/04/07 06:34:42 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 3 | * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
4 | * project. | 4 | * project. |
@@ -1008,36 +1008,55 @@ CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs) | |||
1008 | } | 1008 | } |
1009 | LCRYPTO_ALIAS(CMS_add_smimecap); | 1009 | LCRYPTO_ALIAS(CMS_add_smimecap); |
1010 | 1010 | ||
1011 | /* | ||
1012 | * Add AlgorithmIdentifier OID of type |nid| to the SMIMECapability attribute | ||
1013 | * set |*out_algs| (see RFC 3851, section 2.5.2). If keysize > 0, the OID has | ||
1014 | * an integer parameter of value |keysize|, otherwise parameters are omitted. | ||
1015 | */ | ||
1011 | int | 1016 | int |
1012 | CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, int algnid, int keysize) | 1017 | CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **out_algs, int nid, int keysize) |
1013 | { | 1018 | { |
1014 | X509_ALGOR *alg; | 1019 | STACK_OF(X509_ALGOR) *algs; |
1015 | ASN1_INTEGER *key = NULL; | 1020 | X509_ALGOR *alg = NULL; |
1021 | ASN1_INTEGER *parameter = NULL; | ||
1022 | int parameter_type = V_ASN1_UNDEF; | ||
1023 | int ret = 0; | ||
1024 | |||
1025 | if ((algs = *out_algs) == NULL) | ||
1026 | algs = sk_X509_ALGOR_new_null(); | ||
1027 | if (algs == NULL) | ||
1028 | goto err; | ||
1016 | 1029 | ||
1017 | if (keysize > 0) { | 1030 | if (keysize > 0) { |
1018 | if ((key = ASN1_INTEGER_new()) == NULL) | 1031 | if ((parameter = ASN1_INTEGER_new()) == NULL) |
1019 | return 0; | 1032 | goto err; |
1020 | if (!ASN1_INTEGER_set(key, keysize)) { | 1033 | if (!ASN1_INTEGER_set(parameter, keysize)) |
1021 | ASN1_INTEGER_free(key); | 1034 | goto err; |
1022 | return 0; | 1035 | parameter_type = V_ASN1_INTEGER; |
1023 | } | ||
1024 | } | ||
1025 | alg = X509_ALGOR_new(); | ||
1026 | if (alg == NULL) { | ||
1027 | ASN1_INTEGER_free(key); | ||
1028 | return 0; | ||
1029 | } | 1036 | } |
1030 | 1037 | ||
1031 | X509_ALGOR_set0(alg, OBJ_nid2obj(algnid), | 1038 | if ((alg = X509_ALGOR_new()) == NULL) |
1032 | key ? V_ASN1_INTEGER : V_ASN1_UNDEF, key); | 1039 | goto err; |
1033 | if (*algs == NULL) | 1040 | if (!X509_ALGOR_set0_by_nid(alg, nid, parameter_type, parameter)) |
1034 | *algs = sk_X509_ALGOR_new_null(); | 1041 | goto err; |
1035 | if (*algs == NULL || !sk_X509_ALGOR_push(*algs, alg)) { | 1042 | parameter = NULL; |
1036 | X509_ALGOR_free(alg); | ||
1037 | return 0; | ||
1038 | } | ||
1039 | 1043 | ||
1040 | return 1; | 1044 | if (sk_X509_ALGOR_push(algs, alg) <= 0) |
1045 | goto err; | ||
1046 | alg = NULL; | ||
1047 | |||
1048 | *out_algs = algs; | ||
1049 | algs = NULL; | ||
1050 | |||
1051 | ret = 1; | ||
1052 | |||
1053 | err: | ||
1054 | if (algs != *out_algs) | ||
1055 | sk_X509_ALGOR_pop_free(algs, X509_ALGOR_free); | ||
1056 | X509_ALGOR_free(alg); | ||
1057 | ASN1_INTEGER_free(parameter); | ||
1058 | |||
1059 | return ret; | ||
1041 | } | 1060 | } |
1042 | LCRYPTO_ALIAS(CMS_add_simple_smimecap); | 1061 | LCRYPTO_ALIAS(CMS_add_simple_smimecap); |
1043 | 1062 | ||