summaryrefslogtreecommitdiffstats
path: root/crypto/cms
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2022-06-27 17:05:21 +0200
committerDr. David von Oheimb <dev@ddvo.net>2022-07-16 08:15:49 +0200
commitd7d3dae694fa4611c1cd953dccf81b3d2b4121c6 (patch)
treed4210058c101d76fc666b53c183fbd3e5fa6cff5 /crypto/cms
parent4329a321c9f939f06e7705fa25ac55af3160acf6 (diff)
CMS: add CMS_SignedData_verify(), a variant of CMS_verify() with extensions
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: David von Oheimb <david.von.oheimb@siemens.com> (Merged from https://github.com/openssl/openssl/pull/18667)
Diffstat (limited to 'crypto/cms')
-rw-r--r--crypto/cms/cms_asn1.c1
-rw-r--r--crypto/cms/cms_env.c2
-rw-r--r--crypto/cms/cms_local.h1
-rw-r--r--crypto/cms/cms_sd.c41
4 files changed, 43 insertions, 2 deletions
diff --git a/crypto/cms/cms_asn1.c b/crypto/cms/cms_asn1.c
index 72cd14317d..785743163c 100644
--- a/crypto/cms/cms_asn1.c
+++ b/crypto/cms/cms_asn1.c
@@ -83,6 +83,7 @@ ASN1_NDEF_SEQUENCE(CMS_SignedData) = {
ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1),
ASN1_SET_OF(CMS_SignedData, signerInfos, CMS_SignerInfo)
} ASN1_NDEF_SEQUENCE_END(CMS_SignedData)
+IMPLEMENT_ASN1_ALLOC_FUNCTIONS(CMS_SignedData)
ASN1_SEQUENCE(CMS_OriginatorInfo) = {
ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, certificates, CMS_CertificateChoices, 0),
diff --git a/crypto/cms/cms_env.c b/crypto/cms/cms_env.c
index 471676d2f5..4648cd1372 100644
--- a/crypto/cms/cms_env.c
+++ b/crypto/cms/cms_env.c
@@ -270,7 +270,7 @@ BIO *CMS_EnvelopedData_decrypt(CMS_EnvelopedData *env, BIO *detached_data,
end:
if (ci != NULL)
- ci->d.envelopedData = NULL;
+ ci->d.envelopedData = NULL; /* do not indirectly free |env| */
CMS_ContentInfo_free(ci);
if (!res) {
BIO_free(bio);
diff --git a/crypto/cms/cms_local.h b/crypto/cms/cms_local.h
index d16ca95176..514a345d6e 100644
--- a/crypto/cms/cms_local.h
+++ b/crypto/cms/cms_local.h
@@ -21,7 +21,6 @@
typedef struct CMS_IssuerAndSerialNumber_st CMS_IssuerAndSerialNumber;
typedef struct CMS_EncapsulatedContentInfo_st CMS_EncapsulatedContentInfo;
typedef struct CMS_SignerIdentifier_st CMS_SignerIdentifier;
-typedef struct CMS_SignedData_st CMS_SignedData;
typedef struct CMS_OtherRevocationInfoFormat_st CMS_OtherRevocationInfoFormat;
typedef struct CMS_OriginatorInfo_st CMS_OriginatorInfo;
typedef struct CMS_EncryptedContentInfo_st CMS_EncryptedContentInfo;
diff --git a/crypto/cms/cms_sd.c b/crypto/cms/cms_sd.c
index 9877ac48a0..07cb8b51c6 100644
--- a/crypto/cms/cms_sd.c
+++ b/crypto/cms/cms_sd.c
@@ -1048,6 +1048,47 @@ int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain)
}
+BIO *CMS_SignedData_verify(CMS_SignedData *sd, BIO *detached_data,
+ STACK_OF(X509) *scerts, X509_STORE *store,
+ STACK_OF(X509) *extra, STACK_OF(X509_CRL) *crls,
+ unsigned int flags,
+ OSSL_LIB_CTX *libctx, const char *propq)
+{
+ CMS_ContentInfo *ci;
+ BIO *bio = NULL;
+ int i, res = 0;
+
+ if (sd == NULL) {
+ ERR_raise(ERR_LIB_CMS, ERR_R_PASSED_NULL_PARAMETER);
+ return NULL;
+ }
+
+ if ((ci = CMS_ContentInfo_new_ex(libctx, propq)) == NULL)
+ return NULL;
+ if ((bio = BIO_new(BIO_s_mem())) == NULL)
+ goto end;
+ ci->contentType = OBJ_nid2obj(NID_pkcs7_signed);
+ ci->d.signedData = sd;
+
+ for (i = 0; i < sk_X509_num(extra); i++)
+ if (!CMS_add1_cert(ci, sk_X509_value(extra, i)))
+ goto end;
+ for (i = 0; i < sk_X509_CRL_num(crls); i++)
+ if (!CMS_add1_crl(ci, sk_X509_CRL_value(crls, i)))
+ goto end;
+ res = CMS_verify(ci, scerts, store, detached_data, bio, flags);
+
+ end:
+ if (ci != NULL)
+ ci->d.signedData = NULL; /* do not indirectly free |sd| */
+ CMS_ContentInfo_free(ci);
+ if (!res) {
+ BIO_free(bio);
+ bio = NULL;
+ }
+ return bio;
+}
+
int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs)
{
unsigned char *smder = NULL;