summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/cms/cms_sd.c67
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}
1009LCRYPTO_ALIAS(CMS_add_smimecap); 1009LCRYPTO_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 */
1011int 1016int
1012CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, int algnid, int keysize) 1017CMS_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}
1042LCRYPTO_ALIAS(CMS_add_simple_smimecap); 1061LCRYPTO_ALIAS(CMS_add_simple_smimecap);
1043 1062