summaryrefslogtreecommitdiffstats
path: root/crypto/cms
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2021-03-12 19:45:40 +0100
committerDr. David von Oheimb <dev@ddvo.net>2021-03-18 07:03:53 +0100
commit63b64f19c13d59d68dc2e525f454aea62a739842 (patch)
treea0eb5a23182f4d056dcb435dadf4c96fb50e76c1 /crypto/cms
parentbef876f97e26309ccd20f916cf1e5e305735ee98 (diff)
TS and CMS CAdES-BES: Refactor check_signing_certs() funcs into common ESS func
Also constify related CMS/PKCS7 functions and improve error codes thrown. Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/14503)
Diffstat (limited to 'crypto/cms')
-rw-r--r--crypto/cms/cms_att.c3
-rw-r--r--crypto/cms/cms_err.c2
-rw-r--r--crypto/cms/cms_ess.c63
-rw-r--r--crypto/cms/cms_local.h3
-rw-r--r--crypto/cms/cms_smime.c2
5 files changed, 10 insertions, 63 deletions
diff --git a/crypto/cms/cms_att.c b/crypto/cms/cms_att.c
index a9ef0357e5..2ac118b9e6 100644
--- a/crypto/cms/cms_att.c
+++ b/crypto/cms/cms_att.c
@@ -125,7 +125,8 @@ int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si,
return 0;
}
-void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *oid,
+void *CMS_signed_get0_data_by_OBJ(const CMS_SignerInfo *si,
+ const ASN1_OBJECT *oid,
int lastpos, int type)
{
return X509at_get0_data_by_OBJ(si->signedAttrs, oid, lastpos, type);
diff --git a/crypto/cms/cms_err.c b/crypto/cms/cms_err.c
index 173e1596f6..81249ce689 100644
--- a/crypto/cms/cms_err.c
+++ b/crypto/cms/cms_err.c
@@ -59,8 +59,6 @@ static const ERR_STRING_DATA CMS_str_reasons[] = {
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_ERROR_SETTING_KEY), "error setting key"},
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_ERROR_SETTING_RECIPIENTINFO),
"error setting recipientinfo"},
- {ERR_PACK(ERR_LIB_CMS, 0, CMS_R_ESS_NO_SIGNING_CERTID_ATTRIBUTE),
- "ess no signing certid attribute"},
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR),
"ess signing certid mismatch error"},
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_INVALID_ENCRYPTED_KEY_LENGTH),
diff --git a/crypto/cms/cms_ess.c b/crypto/cms/cms_ess.c
index b8b0076e03..5982035c45 100644
--- a/crypto/cms/cms_ess.c
+++ b/crypto/cms/cms_ess.c
@@ -46,67 +46,14 @@ int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr)
return 1;
}
-/*
- First, get the ESS_SIGNING_CERT(V2) signed attribute from |si|.
- Then check matching of each cert of trust |chain| with one of
- the |cert_ids|(Hash+IssuerID) list from this ESS_SIGNING_CERT.
- Derived from ts_check_signing_certs()
-*/
-int ossl_ess_check_signing_certs(CMS_SignerInfo *si, STACK_OF(X509) *chain)
+int ossl_cms_check_signing_certs(const CMS_SignerInfo *si,
+ const STACK_OF(X509) *chain)
{
ESS_SIGNING_CERT *ss = NULL;
ESS_SIGNING_CERT_V2 *ssv2 = NULL;
- X509 *cert;
- int i = 0, ret = 0;
-
- if (ossl_cms_signerinfo_get_signing_cert(si, &ss) > 0
- && ss->cert_ids != NULL) {
- STACK_OF(ESS_CERT_ID) *cert_ids = ss->cert_ids;
-
- cert = sk_X509_value(chain, 0);
- if (ossl_ess_find_cert(cert_ids, cert) != 0)
- goto err;
-
- /*
- * Check the other certificates of the chain.
- * Fail if no signing certificate ids found for each certificate.
- */
- if (sk_ESS_CERT_ID_num(cert_ids) > 1) {
- /* for each chain cert, try to find its cert id */
- for (i = 1; i < sk_X509_num(chain); ++i) {
- cert = sk_X509_value(chain, i);
- if (ossl_ess_find_cert(cert_ids, cert) < 0)
- goto err;
- }
- }
- } else if (ossl_cms_signerinfo_get_signing_cert_v2(si, &ssv2) > 0
- && ssv2->cert_ids!= NULL) {
- STACK_OF(ESS_CERT_ID_V2) *cert_ids_v2 = ssv2->cert_ids;
-
- cert = sk_X509_value(chain, 0);
- if (ossl_ess_find_cert_v2(cert_ids_v2, cert) != 0)
- goto err;
-
- /*
- * Check the other certificates of the chain.
- * Fail if no signing certificate ids found for each certificate.
- */
- if (sk_ESS_CERT_ID_V2_num(cert_ids_v2) > 1) {
- /* for each chain cert, try to find its cert id */
- for (i = 1; i < sk_X509_num(chain); ++i) {
- cert = sk_X509_value(chain, i);
- if (ossl_ess_find_cert_v2(cert_ids_v2, cert) < 0)
- goto err;
- }
- }
- } else {
- ERR_raise(ERR_LIB_CMS, CMS_R_ESS_NO_SIGNING_CERTID_ATTRIBUTE);
- return 0;
- }
- ret = 1;
- err:
- if (!ret)
- ERR_raise(ERR_LIB_CMS, CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR);
+ int ret = ossl_cms_signerinfo_get_signing_cert(si, &ss) >= 0
+ && ossl_cms_signerinfo_get_signing_cert_v2(si, &ssv2) >= 0
+ && ossl_ess_check_signing_certs(ss, ssv2, chain, 1);
ESS_SIGNING_CERT_free(ss);
ESS_SIGNING_CERT_V2_free(ssv2);
diff --git a/crypto/cms/cms_local.h b/crypto/cms/cms_local.h
index 2429202fa8..0827c55a1c 100644
--- a/crypto/cms/cms_local.h
+++ b/crypto/cms/cms_local.h
@@ -473,7 +473,8 @@ void ossl_cms_SignerInfos_set_cmsctx(CMS_ContentInfo *cms);
/* ESS routines */
-int ossl_ess_check_signing_certs(CMS_SignerInfo *si, STACK_OF(X509) *chain);
+int ossl_cms_check_signing_certs(const CMS_SignerInfo *si,
+ const STACK_OF(X509) *chain);
int ossl_cms_dh_envelope(CMS_RecipientInfo *ri, int decrypt);
int ossl_cms_ecdh_envelope(CMS_RecipientInfo *ri, int decrypt);
diff --git a/crypto/cms/cms_smime.c b/crypto/cms/cms_smime.c
index ac4ad2d490..3ab4cd2e6f 100644
--- a/crypto/cms/cms_smime.c
+++ b/crypto/cms/cms_smime.c
@@ -381,7 +381,7 @@ int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs,
if (cadesVerify) {
STACK_OF(X509) *si_chain = si_chains ? si_chains[i] : NULL;
- if (ossl_ess_check_signing_certs(si, si_chain) <= 0)
+ if (ossl_cms_check_signing_certs(si, si_chain) <= 0)
goto err;
}
}