diff options
Diffstat (limited to '')
| -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 | ||
