2024-09-30 15:08:11 +00:00
|
|
|
From 4f9167db05cade673f98f1a00efd57136e97b460 Mon Sep 17 00:00:00 2001
|
|
|
|
From: rpm-build <rpm-build>
|
|
|
|
Date: Wed, 6 Mar 2024 19:17:15 +0100
|
|
|
|
Subject: [PATCH 22/49] 0049-Allow-disabling-of-SHA1-signatures.patch
|
2022-04-05 11:12:41 +00:00
|
|
|
|
2024-09-30 15:08:11 +00:00
|
|
|
Patch-name: 0049-Allow-disabling-of-SHA1-signatures.patch
|
|
|
|
Patch-id: 49
|
|
|
|
Patch-status: |
|
|
|
|
# # Selectively disallow SHA1 signatures rhbz#2070977
|
|
|
|
From-dist-git-commit: 4334bc837fbc64d14890fdc51679a80770d498ce
|
2022-04-05 11:12:41 +00:00
|
|
|
---
|
2024-09-30 15:08:11 +00:00
|
|
|
crypto/context.c | 14 ++++
|
|
|
|
crypto/evp/evp_cnf.c | 13 +++
|
|
|
|
crypto/evp/m_sigver.c | 79 +++++++++++++++++++
|
2022-04-05 11:12:41 +00:00
|
|
|
crypto/evp/pmeth_lib.c | 15 ++++
|
2024-09-30 15:08:11 +00:00
|
|
|
doc/man5/config.pod | 13 +++
|
|
|
|
include/crypto/context.h | 3 +
|
2022-04-05 11:12:41 +00:00
|
|
|
include/internal/cryptlib.h | 3 +-
|
|
|
|
include/internal/sslconf.h | 4 +
|
|
|
|
providers/common/securitycheck.c | 20 +++++
|
|
|
|
providers/common/securitycheck_default.c | 9 ++-
|
|
|
|
providers/implementations/signature/dsa_sig.c | 11 ++-
|
|
|
|
.../implementations/signature/ecdsa_sig.c | 4 +
|
|
|
|
providers/implementations/signature/rsa_sig.c | 20 ++++-
|
|
|
|
ssl/t1_lib.c | 8 ++
|
|
|
|
util/libcrypto.num | 2 +
|
2024-09-30 15:08:11 +00:00
|
|
|
15 files changed, 209 insertions(+), 9 deletions(-)
|
2022-04-05 11:12:41 +00:00
|
|
|
|
2024-09-30 15:08:11 +00:00
|
|
|
diff --git a/crypto/context.c b/crypto/context.c
|
|
|
|
index fb4816d89b..c04920fe14 100644
|
|
|
|
--- a/crypto/context.c
|
|
|
|
+++ b/crypto/context.c
|
|
|
|
@@ -83,6 +83,8 @@ struct ossl_lib_ctx_st {
|
|
|
|
void *fips_prov;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+ void *legacy_digest_signatures;
|
|
|
|
+
|
|
|
|
unsigned int ischild:1;
|
|
|
|
};
|
|
|
|
|
|
|
|
@@ -223,6 +225,10 @@ static int context_init(OSSL_LIB_CTX *ctx)
|
|
|
|
goto err;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+ ctx->legacy_digest_signatures = ossl_ctx_legacy_digest_signatures_new(ctx);
|
|
|
|
+ if (ctx->legacy_digest_signatures == NULL)
|
|
|
|
+ goto err;
|
|
|
|
+
|
|
|
|
/* Low priority. */
|
|
|
|
#ifndef FIPS_MODULE
|
|
|
|
ctx->child_provider = ossl_child_prov_ctx_new(ctx);
|
|
|
|
@@ -366,6 +372,11 @@ static void context_deinit_objs(OSSL_LIB_CTX *ctx)
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+ if (ctx->legacy_digest_signatures != NULL) {
|
|
|
|
+ ossl_ctx_legacy_digest_signatures_free(ctx->legacy_digest_signatures);
|
|
|
|
+ ctx->legacy_digest_signatures = NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
/* Low priority. */
|
|
|
|
#ifndef FIPS_MODULE
|
|
|
|
if (ctx->child_provider != NULL) {
|
|
|
|
@@ -663,6 +674,9 @@ void *ossl_lib_ctx_get_data(OSSL_LIB_CTX *ctx, int index)
|
|
|
|
return ctx->fips_prov;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+ case OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES_INDEX:
|
|
|
|
+ return ctx->legacy_digest_signatures;
|
|
|
|
+
|
|
|
|
default:
|
|
|
|
return NULL;
|
|
|
|
}
|
2022-04-05 11:12:41 +00:00
|
|
|
diff --git a/crypto/evp/evp_cnf.c b/crypto/evp/evp_cnf.c
|
|
|
|
index 0e7fe64cf9..b9d3b6d226 100644
|
|
|
|
--- a/crypto/evp/evp_cnf.c
|
|
|
|
+++ b/crypto/evp/evp_cnf.c
|
|
|
|
@@ -10,6 +10,7 @@
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <openssl/crypto.h>
|
|
|
|
#include "internal/cryptlib.h"
|
|
|
|
+#include "internal/sslconf.h"
|
|
|
|
#include <openssl/conf.h>
|
|
|
|
#include <openssl/x509.h>
|
|
|
|
#include <openssl/x509v3.h>
|
|
|
|
@@ -57,6 +58,18 @@ static int alg_module_init(CONF_IMODULE *md, const CONF *cnf)
|
|
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_SET_DEFAULT_PROPERTY_FAILURE);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
+ } else if (strcmp(oval->name, "rh-allow-sha1-signatures") == 0) {
|
|
|
|
+ int m;
|
|
|
|
+
|
|
|
|
+ /* Detailed error already reported. */
|
|
|
|
+ if (!X509V3_get_value_bool(oval, &m))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (!ossl_ctx_legacy_digest_signatures_allowed_set(
|
|
|
|
+ NCONF_get0_libctx((CONF *)cnf), m > 0, 0)) {
|
|
|
|
+ ERR_raise(ERR_LIB_EVP, EVP_R_SET_DEFAULT_PROPERTY_FAILURE);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
} else {
|
|
|
|
ERR_raise_data(ERR_LIB_EVP, EVP_R_UNKNOWN_OPTION,
|
|
|
|
"name=%s, value=%s", oval->name, oval->value);
|
|
|
|
diff --git a/crypto/evp/m_sigver.c b/crypto/evp/m_sigver.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index 3a979f4bd4..fd3a4b79df 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/crypto/evp/m_sigver.c
|
|
|
|
+++ b/crypto/evp/m_sigver.c
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -15,6 +15,73 @@
|
|
|
|
#include "internal/provider.h"
|
2022-04-05 11:12:41 +00:00
|
|
|
#include "internal/numbers.h" /* includes SIZE_MAX */
|
|
|
|
#include "evp_local.h"
|
2024-09-30 15:08:11 +00:00
|
|
|
+#include "crypto/context.h"
|
|
|
|
+
|
2022-04-05 11:12:41 +00:00
|
|
|
+typedef struct ossl_legacy_digest_signatures_st {
|
|
|
|
+ int allowed;
|
|
|
|
+} OSSL_LEGACY_DIGEST_SIGNATURES;
|
|
|
|
+
|
2024-09-30 15:08:11 +00:00
|
|
|
+void ossl_ctx_legacy_digest_signatures_free(void *vldsigs)
|
2022-04-05 11:12:41 +00:00
|
|
|
+{
|
|
|
|
+ OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs = vldsigs;
|
|
|
|
+
|
|
|
|
+ if (ldsigs != NULL) {
|
|
|
|
+ OPENSSL_free(ldsigs);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
2024-09-30 15:08:11 +00:00
|
|
|
+void *ossl_ctx_legacy_digest_signatures_new(OSSL_LIB_CTX *ctx)
|
2022-04-05 11:12:41 +00:00
|
|
|
+{
|
2024-09-30 15:08:11 +00:00
|
|
|
+ OSSL_LEGACY_DIGEST_SIGNATURES* ldsigs = OPENSSL_zalloc(sizeof(OSSL_LEGACY_DIGEST_SIGNATURES));
|
|
|
|
+ /* Warning: This patch differs from the same patch in CentOS and RHEL here,
|
|
|
|
+ * because the default on Fedora is to allow SHA-1 and support disabling
|
|
|
|
+ * it, while CentOS/RHEL disable it by default and allow enabling it. */
|
|
|
|
+ ldsigs->allowed = 0;
|
|
|
|
+ return ldsigs;
|
2022-04-05 11:12:41 +00:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static OSSL_LEGACY_DIGEST_SIGNATURES *ossl_ctx_legacy_digest_signatures(
|
|
|
|
+ OSSL_LIB_CTX *libctx, int loadconfig)
|
|
|
|
+{
|
|
|
|
+#ifndef FIPS_MODULE
|
|
|
|
+ if (loadconfig && !OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL))
|
2024-09-30 15:08:11 +00:00
|
|
|
+ return NULL;
|
2022-04-05 11:12:41 +00:00
|
|
|
+#endif
|
|
|
|
+
|
2024-09-30 15:08:11 +00:00
|
|
|
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES_INDEX);
|
2022-04-05 11:12:41 +00:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int ossl_ctx_legacy_digest_signatures_allowed(OSSL_LIB_CTX *libctx, int loadconfig)
|
|
|
|
+{
|
|
|
|
+ OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs
|
|
|
|
+ = ossl_ctx_legacy_digest_signatures(libctx, loadconfig);
|
|
|
|
+
|
2024-09-30 15:08:11 +00:00
|
|
|
+ #ifndef FIPS_MODULE
|
|
|
|
+ if (ossl_safe_getenv("OPENSSL_ENABLE_SHA1_SIGNATURES") != NULL)
|
2022-04-05 11:12:41 +00:00
|
|
|
+ /* used in tests */
|
2024-09-30 15:08:11 +00:00
|
|
|
+ return 1;
|
|
|
|
+ #endif
|
2022-04-05 11:12:41 +00:00
|
|
|
+
|
2024-09-30 15:08:11 +00:00
|
|
|
+ /* Warning: This patch differs from the same patch in CentOS and RHEL here,
|
|
|
|
+ * because the default on Fedora is to allow SHA-1 and support disabling
|
|
|
|
+ * it, while CentOS/RHEL disable it by default and allow enabling it. */
|
2022-04-05 11:12:41 +00:00
|
|
|
+ return ldsigs != NULL ? ldsigs->allowed : 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int ossl_ctx_legacy_digest_signatures_allowed_set(OSSL_LIB_CTX *libctx, int allow,
|
|
|
|
+ int loadconfig)
|
|
|
|
+{
|
|
|
|
+ OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs
|
|
|
|
+ = ossl_ctx_legacy_digest_signatures(libctx, loadconfig);
|
|
|
|
+
|
|
|
|
+ if (ldsigs == NULL) {
|
|
|
|
+ ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ldsigs->allowed = allow;
|
|
|
|
+ return 1;
|
|
|
|
+}
|
2024-09-30 15:08:11 +00:00
|
|
|
|
2022-04-05 11:12:41 +00:00
|
|
|
#ifndef FIPS_MODULE
|
|
|
|
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -253,6 +320,18 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
|
2022-04-05 11:12:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (ctx->reqdigest != NULL
|
|
|
|
+ && !EVP_PKEY_is_a(locpctx->pkey, SN_hmac)
|
|
|
|
+ && !EVP_PKEY_is_a(locpctx->pkey, SN_tls1_prf)
|
|
|
|
+ && !EVP_PKEY_is_a(locpctx->pkey, SN_hkdf)) {
|
|
|
|
+ int mdnid = EVP_MD_nid(ctx->reqdigest);
|
|
|
|
+ if (!ossl_ctx_legacy_digest_signatures_allowed(locpctx->libctx, 0)
|
|
|
|
+ && (mdnid == NID_sha1 || mdnid == NID_md5_sha1)) {
|
|
|
|
+ ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
|
|
|
|
+ goto err;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (ver) {
|
|
|
|
if (signature->digest_verify_init == NULL) {
|
|
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
|
|
|
|
diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index 268b1617e3..248f655d0f 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/crypto/evp/pmeth_lib.c
|
|
|
|
+++ b/crypto/evp/pmeth_lib.c
|
|
|
|
@@ -33,6 +33,7 @@
|
|
|
|
#include "internal/ffc.h"
|
|
|
|
#include "internal/numbers.h"
|
|
|
|
#include "internal/provider.h"
|
|
|
|
+#include "internal/sslconf.h"
|
|
|
|
#include "evp_local.h"
|
|
|
|
|
|
|
|
#ifndef FIPS_MODULE
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -951,6 +952,20 @@ static int evp_pkey_ctx_set_md(EVP_PKEY_CTX *ctx, const EVP_MD *md,
|
2022-04-05 11:12:41 +00:00
|
|
|
return -2;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
|
|
|
|
+ && md != NULL
|
|
|
|
+ && ctx->pkey != NULL
|
|
|
|
+ && !EVP_PKEY_is_a(ctx->pkey, SN_hmac)
|
|
|
|
+ && !EVP_PKEY_is_a(ctx->pkey, SN_tls1_prf)
|
|
|
|
+ && !EVP_PKEY_is_a(ctx->pkey, SN_hkdf)) {
|
|
|
|
+ int mdnid = EVP_MD_nid(md);
|
|
|
|
+ if ((mdnid == NID_sha1 || mdnid == NID_md5_sha1)
|
|
|
|
+ && !ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0)) {
|
|
|
|
+ ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (fallback)
|
|
|
|
return EVP_PKEY_CTX_ctrl(ctx, -1, op, ctrl, 0, (void *)(md));
|
|
|
|
|
|
|
|
diff --git a/doc/man5/config.pod b/doc/man5/config.pod
|
2024-09-30 15:08:11 +00:00
|
|
|
index bd05736220..ed34ff4b9c 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/doc/man5/config.pod
|
|
|
|
+++ b/doc/man5/config.pod
|
|
|
|
@@ -304,6 +304,17 @@ Within the algorithm properties section, the following names have meaning:
|
|
|
|
The value may be anything that is acceptable as a property query
|
|
|
|
string for EVP_set_default_properties().
|
|
|
|
|
|
|
|
+=item B<rh-allow-sha1-signatures>
|
|
|
|
+
|
|
|
|
+The value is a boolean that can be B<yes> or B<no>. If the value is not set,
|
|
|
|
+it behaves as if it was set to B<no>.
|
|
|
|
+
|
|
|
|
+When set to B<no>, any attempt to create or verify a signature with a SHA1
|
|
|
|
+digest will fail. For compatibility with older versions of OpenSSL, set this
|
|
|
|
+option to B<yes>. This setting also affects TLS, where signature algorithms
|
|
|
|
+that use SHA1 as digest will no longer be supported if this option is set to
|
|
|
|
+B<no>.
|
|
|
|
+
|
|
|
|
=item B<fips_mode> (deprecated)
|
|
|
|
|
|
|
|
The value is a boolean that can be B<yes> or B<no>. If the value is
|
2024-09-30 15:08:11 +00:00
|
|
|
diff --git a/include/crypto/context.h b/include/crypto/context.h
|
|
|
|
index 7369a730fb..55b74238c8 100644
|
|
|
|
--- a/include/crypto/context.h
|
|
|
|
+++ b/include/crypto/context.h
|
|
|
|
@@ -46,3 +46,6 @@ void ossl_release_default_drbg_ctx(void);
|
|
|
|
#if defined(OPENSSL_THREADS)
|
|
|
|
void ossl_threads_ctx_free(void *);
|
|
|
|
#endif
|
|
|
|
+
|
|
|
|
+void *ossl_ctx_legacy_digest_signatures_new(OSSL_LIB_CTX *);
|
|
|
|
+void ossl_ctx_legacy_digest_signatures_free(void *);
|
2022-04-05 11:12:41 +00:00
|
|
|
diff --git a/include/internal/cryptlib.h b/include/internal/cryptlib.h
|
2024-09-30 15:08:11 +00:00
|
|
|
index 64851fd8ed..8e01a77ddc 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/include/internal/cryptlib.h
|
|
|
|
+++ b/include/internal/cryptlib.h
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -117,7 +117,8 @@ typedef struct ossl_ex_data_global_st {
|
2022-04-05 11:12:41 +00:00
|
|
|
# define OSSL_LIB_CTX_CHILD_PROVIDER_INDEX 18
|
2024-09-30 15:08:11 +00:00
|
|
|
# define OSSL_LIB_CTX_THREAD_INDEX 19
|
|
|
|
# define OSSL_LIB_CTX_DECODER_CACHE_INDEX 20
|
|
|
|
-# define OSSL_LIB_CTX_MAX_INDEXES 20
|
|
|
|
+# define OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES_INDEX 21
|
|
|
|
+# define OSSL_LIB_CTX_MAX_INDEXES 21
|
2022-04-05 11:12:41 +00:00
|
|
|
|
2024-09-30 15:08:11 +00:00
|
|
|
OSSL_LIB_CTX *ossl_lib_ctx_get_concrete(OSSL_LIB_CTX *ctx);
|
|
|
|
int ossl_lib_ctx_is_default(OSSL_LIB_CTX *ctx);
|
2022-04-05 11:12:41 +00:00
|
|
|
diff --git a/include/internal/sslconf.h b/include/internal/sslconf.h
|
|
|
|
index fd7f7e3331..05464b0655 100644
|
|
|
|
--- a/include/internal/sslconf.h
|
|
|
|
+++ b/include/internal/sslconf.h
|
|
|
|
@@ -18,4 +18,8 @@ int conf_ssl_name_find(const char *name, size_t *idx);
|
|
|
|
void conf_ssl_get_cmd(const SSL_CONF_CMD *cmd, size_t idx, char **cmdstr,
|
|
|
|
char **arg);
|
|
|
|
|
|
|
|
+/* Methods to support disabling all signatures with legacy digests */
|
|
|
|
+int ossl_ctx_legacy_digest_signatures_allowed(OSSL_LIB_CTX *libctx, int loadconfig);
|
|
|
|
+int ossl_ctx_legacy_digest_signatures_allowed_set(OSSL_LIB_CTX *libctx, int allow,
|
|
|
|
+ int loadconfig);
|
|
|
|
#endif
|
|
|
|
diff --git a/providers/common/securitycheck.c b/providers/common/securitycheck.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index 0d3acdbe56..fe694c4e96 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/providers/common/securitycheck.c
|
|
|
|
+++ b/providers/common/securitycheck.c
|
|
|
|
@@ -19,6 +19,7 @@
|
|
|
|
#include <openssl/core_names.h>
|
|
|
|
#include <openssl/obj_mac.h>
|
|
|
|
#include "prov/securitycheck.h"
|
|
|
|
+#include "internal/sslconf.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* FIPS requires a minimum security strength of 112 bits (for encryption or
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -243,6 +244,15 @@ int ossl_digest_get_approved_nid_with_sha1(OSSL_LIB_CTX *ctx, const EVP_MD *md,
|
2022-04-05 11:12:41 +00:00
|
|
|
mdnid = -1; /* disallowed by security checks */
|
|
|
|
}
|
|
|
|
# endif /* OPENSSL_NO_FIPS_SECURITYCHECKS */
|
|
|
|
+
|
|
|
|
+#ifndef FIPS_MODULE
|
|
|
|
+ if (!ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
|
|
|
|
+ /* SHA1 is globally disabled, check whether we want to locally allow
|
|
|
|
+ * it. */
|
|
|
|
+ if (mdnid == NID_sha1 && !sha1_allowed)
|
|
|
|
+ mdnid = -1;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
return mdnid;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/providers/common/securitycheck_default.c b/providers/common/securitycheck_default.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index 246323493e..2ca7a59f39 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/providers/common/securitycheck_default.c
|
|
|
|
+++ b/providers/common/securitycheck_default.c
|
|
|
|
@@ -15,6 +15,7 @@
|
|
|
|
#include <openssl/obj_mac.h>
|
|
|
|
#include "prov/securitycheck.h"
|
|
|
|
#include "internal/nelem.h"
|
|
|
|
+#include "internal/sslconf.h"
|
|
|
|
|
|
|
|
/* Disable the security checks in the default provider */
|
|
|
|
int ossl_securitycheck_enabled(OSSL_LIB_CTX *libctx)
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -29,9 +30,10 @@ int ossl_tls1_prf_ems_check_enabled(OSSL_LIB_CTX *libctx)
|
2022-04-05 11:12:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int ossl_digest_rsa_sign_get_md_nid(OSSL_LIB_CTX *ctx, const EVP_MD *md,
|
|
|
|
- ossl_unused int sha1_allowed)
|
|
|
|
+ int sha1_allowed)
|
|
|
|
{
|
|
|
|
int mdnid;
|
|
|
|
+ int ldsigs_allowed;
|
|
|
|
|
|
|
|
static const OSSL_ITEM name_to_nid[] = {
|
|
|
|
{ NID_md5, OSSL_DIGEST_NAME_MD5 },
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -42,8 +44,11 @@ int ossl_digest_rsa_sign_get_md_nid(OSSL_LIB_CTX *ctx, const EVP_MD *md,
|
2022-04-05 11:12:41 +00:00
|
|
|
{ NID_ripemd160, OSSL_DIGEST_NAME_RIPEMD160 },
|
|
|
|
};
|
|
|
|
|
|
|
|
- mdnid = ossl_digest_get_approved_nid_with_sha1(ctx, md, 1);
|
|
|
|
+ ldsigs_allowed = ossl_ctx_legacy_digest_signatures_allowed(ctx, 0);
|
|
|
|
+ mdnid = ossl_digest_get_approved_nid_with_sha1(ctx, md, sha1_allowed || ldsigs_allowed);
|
|
|
|
if (mdnid == NID_undef)
|
|
|
|
mdnid = ossl_digest_md_to_nid(md, name_to_nid, OSSL_NELEM(name_to_nid));
|
|
|
|
+ if (mdnid == NID_md5_sha1 && !ldsigs_allowed)
|
|
|
|
+ mdnid = -1;
|
|
|
|
return mdnid;
|
|
|
|
}
|
|
|
|
diff --git a/providers/implementations/signature/dsa_sig.c b/providers/implementations/signature/dsa_sig.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index b89a0f6836..e0c26a13e4 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/providers/implementations/signature/dsa_sig.c
|
|
|
|
+++ b/providers/implementations/signature/dsa_sig.c
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -125,12 +125,17 @@ static int dsa_setup_md(PROV_DSA_CTX *ctx,
|
2022-04-05 11:12:41 +00:00
|
|
|
mdprops = ctx->propq;
|
|
|
|
|
|
|
|
if (mdname != NULL) {
|
|
|
|
- int sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN);
|
|
|
|
WPACKET pkt;
|
|
|
|
EVP_MD *md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
|
|
|
|
- int md_nid = ossl_digest_get_approved_nid_with_sha1(ctx->libctx, md,
|
|
|
|
- sha1_allowed);
|
|
|
|
+ int md_nid;
|
|
|
|
size_t mdname_len = strlen(mdname);
|
|
|
|
+#ifdef FIPS_MODULE
|
|
|
|
+ int sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN);
|
|
|
|
+#else
|
|
|
|
+ int sha1_allowed = 0;
|
|
|
|
+#endif
|
|
|
|
+ md_nid = ossl_digest_get_approved_nid_with_sha1(ctx->libctx, md,
|
|
|
|
+ sha1_allowed);
|
|
|
|
|
|
|
|
if (md == NULL || md_nid < 0) {
|
|
|
|
if (md == NULL)
|
|
|
|
diff --git a/providers/implementations/signature/ecdsa_sig.c b/providers/implementations/signature/ecdsa_sig.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index f158105e71..62355b89fe 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/providers/implementations/signature/ecdsa_sig.c
|
|
|
|
+++ b/providers/implementations/signature/ecdsa_sig.c
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -247,7 +247,11 @@ static int ecdsa_setup_md(PROV_ECDSA_CTX *ctx, const char *mdname,
|
2022-04-05 11:12:41 +00:00
|
|
|
"%s could not be fetched", mdname);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
+#ifdef FIPS_MODULE
|
|
|
|
sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN);
|
|
|
|
+#else
|
|
|
|
+ sha1_allowed = 0;
|
|
|
|
+#endif
|
|
|
|
md_nid = ossl_digest_get_approved_nid_with_sha1(ctx->libctx, md,
|
|
|
|
sha1_allowed);
|
|
|
|
if (md_nid < 0) {
|
|
|
|
diff --git a/providers/implementations/signature/rsa_sig.c b/providers/implementations/signature/rsa_sig.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index c1405f47ea..aeda1a7758 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/providers/implementations/signature/rsa_sig.c
|
|
|
|
+++ b/providers/implementations/signature/rsa_sig.c
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -25,6 +25,7 @@
|
2022-04-05 11:12:41 +00:00
|
|
|
#include "internal/cryptlib.h"
|
|
|
|
#include "internal/nelem.h"
|
|
|
|
#include "internal/sizes.h"
|
|
|
|
+#include "internal/sslconf.h"
|
|
|
|
#include "crypto/rsa.h"
|
|
|
|
#include "prov/providercommon.h"
|
|
|
|
#include "prov/implementations.h"
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -33,6 +34,7 @@
|
2022-04-05 11:12:41 +00:00
|
|
|
#include "prov/securitycheck.h"
|
|
|
|
|
|
|
|
#define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1
|
|
|
|
+#define RSA_DEFAULT_DIGEST_NAME_NONLEGACY OSSL_DIGEST_NAME_SHA2_256
|
|
|
|
|
2023-09-21 19:45:13 +00:00
|
|
|
OSSL_FUNC_signature_newctx_fn rsa_newctx;
|
2022-04-05 11:12:41 +00:00
|
|
|
static OSSL_FUNC_signature_sign_init_fn rsa_sign_init;
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -301,10 +303,15 @@ static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
|
2022-04-05 11:12:41 +00:00
|
|
|
|
|
|
|
if (mdname != NULL) {
|
|
|
|
EVP_MD *md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
|
|
|
|
+ int md_nid;
|
|
|
|
+ size_t mdname_len = strlen(mdname);
|
|
|
|
+#ifdef FIPS_MODULE
|
|
|
|
int sha1_allowed = (ctx->operation != EVP_PKEY_OP_SIGN);
|
|
|
|
- int md_nid = ossl_digest_rsa_sign_get_md_nid(ctx->libctx, md,
|
|
|
|
+#else
|
|
|
|
+ int sha1_allowed = 0;
|
|
|
|
+#endif
|
|
|
|
+ md_nid = ossl_digest_rsa_sign_get_md_nid(ctx->libctx, md,
|
|
|
|
sha1_allowed);
|
|
|
|
- size_t mdname_len = strlen(mdname);
|
|
|
|
|
|
|
|
if (md == NULL
|
|
|
|
|| md_nid <= 0
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -1392,8 +1399,15 @@ static int rsa_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
|
2022-04-05 11:12:41 +00:00
|
|
|
prsactx->pad_mode = pad_mode;
|
|
|
|
|
|
|
|
if (prsactx->md == NULL && pmdname == NULL
|
|
|
|
- && pad_mode == RSA_PKCS1_PSS_PADDING)
|
|
|
|
+ && pad_mode == RSA_PKCS1_PSS_PADDING) {
|
|
|
|
pmdname = RSA_DEFAULT_DIGEST_NAME;
|
|
|
|
+#ifndef FIPS_MODULE
|
|
|
|
+ if (!ossl_ctx_legacy_digest_signatures_allowed(prsactx->libctx, 0)) {
|
|
|
|
+ pmdname = RSA_DEFAULT_DIGEST_NAME_NONLEGACY;
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
|
|
if (pmgf1mdname != NULL
|
|
|
|
&& !rsa_setup_mgf1_md(prsactx, pmgf1mdname, pmgf1mdprops))
|
|
|
|
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
|
2024-09-30 15:08:11 +00:00
|
|
|
index 631e1fdef9..05dd7c5595 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/ssl/t1_lib.c
|
|
|
|
+++ b/ssl/t1_lib.c
|
|
|
|
@@ -20,6 +20,7 @@
|
|
|
|
#include <openssl/bn.h>
|
|
|
|
#include <openssl/provider.h>
|
|
|
|
#include <openssl/param_build.h>
|
|
|
|
+#include "internal/sslconf.h"
|
|
|
|
#include "internal/nelem.h"
|
|
|
|
#include "internal/sizes.h"
|
|
|
|
#include "internal/tlsgroups.h"
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -1506,6 +1507,7 @@ int ssl_setup_sigalgs(SSL_CTX *ctx)
|
|
|
|
uint16_t *tls12_sigalgs_list = NULL;
|
2022-04-05 11:12:41 +00:00
|
|
|
EVP_PKEY *tmpkey = EVP_PKEY_new();
|
|
|
|
int ret = 0;
|
|
|
|
+ int ldsigs_allowed;
|
|
|
|
|
2024-09-30 15:08:11 +00:00
|
|
|
if (ctx == NULL)
|
|
|
|
goto err;
|
|
|
|
@@ -1521,6 +1523,7 @@ int ssl_setup_sigalgs(SSL_CTX *ctx)
|
2022-04-05 11:12:41 +00:00
|
|
|
goto err;
|
|
|
|
|
|
|
|
ERR_set_mark();
|
|
|
|
+ ldsigs_allowed = ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0);
|
2024-09-30 15:08:11 +00:00
|
|
|
/* First fill cache and tls12_sigalgs list from legacy algorithm list */
|
2022-04-05 11:12:41 +00:00
|
|
|
for (i = 0, lu = sigalg_lookup_tbl;
|
|
|
|
i < OSSL_NELEM(sigalg_lookup_tbl); lu++, i++) {
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -1542,6 +1545,11 @@ int ssl_setup_sigalgs(SSL_CTX *ctx)
|
2022-04-05 11:12:41 +00:00
|
|
|
cache[i].enabled = 0;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
+ if ((lu->hash == NID_sha1 || lu->hash == NID_md5_sha1)
|
|
|
|
+ && !ldsigs_allowed) {
|
|
|
|
+ cache[i].enabled = 0;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if (!EVP_PKEY_set_type(tmpkey, lu->sig)) {
|
|
|
|
cache[i].enabled = 0;
|
|
|
|
diff --git a/util/libcrypto.num b/util/libcrypto.num
|
2024-09-30 15:08:11 +00:00
|
|
|
index ef97803327..8046454025 100644
|
2022-04-05 11:12:41 +00:00
|
|
|
--- a/util/libcrypto.num
|
|
|
|
+++ b/util/libcrypto.num
|
2024-09-30 15:08:11 +00:00
|
|
|
@@ -5536,3 +5536,5 @@ X509_STORE_CTX_set_get_crl 5663 3_2_0 EXIST::FUNCTION:
|
|
|
|
X509_STORE_CTX_set_current_reasons 5664 3_2_0 EXIST::FUNCTION:
|
|
|
|
OSSL_STORE_delete 5665 3_2_0 EXIST::FUNCTION:
|
|
|
|
BIO_ADDR_copy 5666 3_2_0 EXIST::FUNCTION:SOCK
|
2022-04-05 11:12:41 +00:00
|
|
|
+ossl_ctx_legacy_digest_signatures_allowed ? 3_0_1 EXIST::FUNCTION:
|
|
|
|
+ossl_ctx_legacy_digest_signatures_allowed_set ? 3_0_1 EXIST::FUNCTION:
|
|
|
|
--
|
2024-09-30 15:08:11 +00:00
|
|
|
2.44.0
|
2022-04-05 11:12:41 +00:00
|
|
|
|