aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2022-12-19 11:31:10 +0100
committerDr. David von Oheimb <dev@ddvo.net>2024-01-17 15:03:41 +0100
commit1caaf073b071dcd184f10bd9cfbdb6ff73b9e945 (patch)
tree4c0c434dbb44078f75d153cb8c27fcf55083fcc6 /crypto
parentfd514375e22d3039ab0ab12e3017aadf2c38b761 (diff)
downloadopenssl-1caaf073b071dcd184f10bd9cfbdb6ff73b9e945.tar.gz
CMP app and doc: add -no_cache_extracerts option / OSSL_CMP_OPT_NO_CACHE_EXTRACERTS
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/19948)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/cmp/cmp_ctx.c5
-rw-r--r--crypto/cmp/cmp_local.h1
-rw-r--r--crypto/cmp/cmp_vfy.c74
3 files changed, 44 insertions, 36 deletions
diff --git a/crypto/cmp/cmp_ctx.c b/crypto/cmp/cmp_ctx.c
index cc62ae4e4e..3f4fdd0164 100644
--- a/crypto/cmp/cmp_ctx.c
+++ b/crypto/cmp/cmp_ctx.c
@@ -915,6 +915,9 @@ int OSSL_CMP_CTX_set_option(OSSL_CMP_CTX *ctx, int opt, int val)
case OSSL_CMP_OPT_UNPROTECTED_ERRORS:
ctx->unprotectedErrors = val;
break;
+ case OSSL_CMP_OPT_NO_CACHE_EXTRACERTS:
+ ctx->noCacheExtraCerts = val;
+ break;
case OSSL_CMP_OPT_VALIDITY_DAYS:
ctx->days = val;
break;
@@ -1000,6 +1003,8 @@ int OSSL_CMP_CTX_get_option(const OSSL_CMP_CTX *ctx, int opt)
return ctx->unprotectedSend;
case OSSL_CMP_OPT_UNPROTECTED_ERRORS:
return ctx->unprotectedErrors;
+ case OSSL_CMP_OPT_NO_CACHE_EXTRACERTS:
+ return ctx->noCacheExtraCerts;
case OSSL_CMP_OPT_VALIDITY_DAYS:
return ctx->days;
case OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT:
diff --git a/crypto/cmp/cmp_local.h b/crypto/cmp/cmp_local.h
index 175cc2575c..edec8808a7 100644
--- a/crypto/cmp/cmp_local.h
+++ b/crypto/cmp/cmp_local.h
@@ -64,6 +64,7 @@ struct ossl_cmp_ctx_st {
* certificate responses (ip/cp/kup), revocation responses (rp), and PKIConf
*/
int unprotectedErrors;
+ int noCacheExtraCerts;
X509 *srvCert; /* certificate used to identify the server */
X509 *validatedSrvCert; /* caches any already validated server cert */
X509_NAME *expected_sender; /* expected sender in header of response */
diff --git a/crypto/cmp/cmp_vfy.c b/crypto/cmp/cmp_vfy.c
index 5944b43526..39fca416ee 100644
--- a/crypto/cmp/cmp_vfy.c
+++ b/crypto/cmp/cmp_vfy.c
@@ -705,6 +705,7 @@ int ossl_cmp_msg_check_update(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *msg,
{
OSSL_CMP_PKIHEADER *hdr;
const X509_NAME *expected_sender;
+ int num_untrusted, num_added, res;
if (!ossl_assert(ctx != NULL && msg != NULL && msg->header != NULL))
return 0;
@@ -728,41 +729,54 @@ int ossl_cmp_msg_check_update(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *msg,
return 0;
/* Note: if recipient was NULL-DN it could be learned here if needed */
- if (sk_X509_num(msg->extraCerts) > 10)
- ossl_cmp_warn(ctx,
- "received CMP message contains more than 10 extraCerts");
+ num_added = sk_X509_num(msg->extraCerts);
+ if (num_added > 10)
+ ossl_cmp_log1(WARN, ctx, "received CMP message contains %d extraCerts",
+ num_added);
/*
* Store any provided extraCerts in ctx for use in OSSL_CMP_validate_msg()
* and for future use, such that they are available to ctx->certConf_cb and
* the peer does not need to send them again in the same transaction.
* Note that it does not help validating the message before storing the
* extraCerts because they do not belong to the protected msg part anyway.
- * For efficiency, the extraCerts are prepended so they get used first.
+ * The extraCerts are prepended. Allows simple removal if they shall not be
+ * cached. Also they get used first, which is likely good for efficiency.
*/
- if (!X509_add_certs(ctx->untrusted, msg->extraCerts,
- /* this allows self-signed certs */
- X509_ADD_FLAG_UP_REF | X509_ADD_FLAG_NO_DUP
- | X509_ADD_FLAG_PREPEND))
+ num_untrusted = ctx->untrusted == NULL ? 0 : sk_X509_num(ctx->untrusted);
+ res = ossl_x509_add_certs_new(&ctx->untrusted, msg->extraCerts,
+ /* this allows self-signed certs */
+ X509_ADD_FLAG_UP_REF | X509_ADD_FLAG_NO_DUP
+ | X509_ADD_FLAG_PREPEND);
+ num_added = (ctx->untrusted == NULL ? 0 : sk_X509_num(ctx->untrusted))
+ - num_untrusted;
+ if (!res) {
+ while (num_added-- > 0)
+ X509_free(sk_X509_shift(ctx->untrusted));
return 0;
+ }
- /* validate message protection */
- if (hdr->protectionAlg != NULL) {
- /* detect explicitly permitted exceptions for invalid protection */
- if (!OSSL_CMP_validate_msg(ctx, msg)
- && (cb == NULL || (*cb)(ctx, msg, 1, cb_arg) <= 0)) {
-#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
- ERR_raise(ERR_LIB_CMP, CMP_R_ERROR_VALIDATING_PROTECTION);
- return 0;
+ if (hdr->protectionAlg != NULL)
+ res = OSSL_CMP_validate_msg(ctx, msg)
+ /* explicitly permitted exceptions for invalid protection: */
+ || (cb != NULL && (*cb)(ctx, msg, 1, cb_arg) > 0);
+ else
+ /* explicitly permitted exceptions for missing protection: */
+ res = cb != NULL && (*cb)(ctx, msg, 0, cb_arg) > 0;
+#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+ res = 1; /* support more aggressive fuzzing by letting invalid msg pass */
#endif
- }
- } else {
- /* detect explicitly permitted exceptions for missing protection */
- if (cb == NULL || (*cb)(ctx, msg, 0, cb_arg) <= 0) {
-#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
+
+ /* remove extraCerts again if not caching */
+ if (ctx->noCacheExtraCerts)
+ while (num_added-- > 0)
+ X509_free(sk_X509_shift(ctx->untrusted));
+
+ if (!res) {
+ if (hdr->protectionAlg != NULL)
+ ERR_raise(ERR_LIB_CMP, CMP_R_ERROR_VALIDATING_PROTECTION);
+ else
ERR_raise(ERR_LIB_CMP, CMP_R_MISSING_PROTECTION);
- return 0;
-#endif
- }
+ return 0;
}
/* check CMP version number in header */
@@ -820,18 +834,6 @@ int ossl_cmp_msg_check_update(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *msg,
if (!ossl_cmp_ctx_set1_recipNonce(ctx, hdr->senderNonce))
return 0;
- /*
- * Store any provided extraCerts in ctx for future use,
- * such that they are available to ctx->certConf_cb and
- * the peer does not need to send them again in the same transaction.
- * For efficiency, the extraCerts are prepended so they get used first.
- */
- if (!X509_add_certs(ctx->untrusted, msg->extraCerts,
- /* this allows self-signed certs */
- X509_ADD_FLAG_UP_REF | X509_ADD_FLAG_NO_DUP
- | X509_ADD_FLAG_PREPEND))
- return 0;
-
if (ossl_cmp_hdr_get_protection_nid(hdr) == NID_id_PasswordBasedMAC) {
/*
* RFC 4210, 5.3.2: 'Note that if the PKI Message Protection is