forked from rpms/openssl
		
	import openssl-3.0.1-20.el9_0
This commit is contained in:
		
							parent
							
								
									47cc85c5fc
								
							
						
					
					
						commit
						e20814a6ed
					
				
							
								
								
									
										80
									
								
								SOURCES/0012-Disable-explicit-ec.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								SOURCES/0012-Disable-explicit-ec.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| diff -up openssl-3.0.1/crypto/ec/ec_lib.c.disable_explicit_ec openssl-3.0.1/crypto/ec/ec_lib.c
 | ||||
| --- openssl-3.0.1/crypto/ec/ec_lib.c.disable_explicit_ec	2022-02-22 09:08:48.557823665 +0100
 | ||||
| +++ openssl-3.0.1/crypto/ec/ec_lib.c	2022-02-22 09:09:26.634133847 +0100
 | ||||
| @@ -1458,7 +1458,7 @@ static EC_GROUP *ec_group_explicit_to_na
 | ||||
|                  goto err; | ||||
|          } | ||||
|      } else { | ||||
| -        ret_group = (EC_GROUP *)group;
 | ||||
| +        goto err;
 | ||||
|      } | ||||
|      EC_GROUP_free(dup); | ||||
|      return ret_group; | ||||
| diff -up openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c.disable_explicit_ec openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c
 | ||||
| --- openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c.disable_explicit_ec	2022-02-22 13:04:16.850856612 +0100
 | ||||
| +++ openssl-3.0.1/providers/implementations/keymgmt/ec_kmgmt.c	2022-02-22 14:16:19.848369641 +0100
 | ||||
| @@ -936,11 +936,8 @@ int ec_validate(const void *keydata, int
 | ||||
|      if ((selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0) { | ||||
|          int flags = EC_KEY_get_flags(eck); | ||||
|   | ||||
| -        if ((flags & EC_FLAG_CHECK_NAMED_GROUP) != 0)
 | ||||
| -            ok = ok && EC_GROUP_check_named_curve(EC_KEY_get0_group(eck),
 | ||||
| -                           (flags & EC_FLAG_CHECK_NAMED_GROUP_NIST) != 0, ctx);
 | ||||
| -        else
 | ||||
| -            ok = ok && EC_GROUP_check(EC_KEY_get0_group(eck), ctx);
 | ||||
| +        ok = ok && EC_GROUP_check_named_curve(EC_KEY_get0_group(eck),
 | ||||
| +                      (flags & EC_FLAG_CHECK_NAMED_GROUP_NIST) != 0, ctx);
 | ||||
|      } | ||||
|   | ||||
|      if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) { | ||||
| @@ -1217,6 +1214,10 @@ static int ec_gen_assign_group(EC_KEY *e
 | ||||
|          ERR_raise(ERR_LIB_PROV, PROV_R_NO_PARAMETERS_SET); | ||||
|          return 0; | ||||
|      } | ||||
| +    if (EC_GROUP_get_curve_name(group) == NID_undef) {
 | ||||
| +        ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_CURVE);
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
|      return EC_KEY_set_group(ec, group) > 0; | ||||
|  } | ||||
|   | ||||
| diff -up openssl-3.0.1/providers/common/securitycheck.c.disable_explicit_ec openssl-3.0.1/providers/common/securitycheck.c
 | ||||
| --- openssl-3.0.1/providers/common/securitycheck.c.disable_explicit_ec	2022-02-25 11:44:19.554673396 +0100
 | ||||
| +++ openssl-3.0.1/providers/common/securitycheck.c	2022-02-25 12:16:38.168610089 +0100
 | ||||
| @@ -93,22 +93,22 @@ int ossl_rsa_check_key(OSSL_LIB_CTX *ctx
 | ||||
|  int ossl_ec_check_key(OSSL_LIB_CTX *ctx, const EC_KEY *ec, int protect) | ||||
|  { | ||||
|  # if !defined(OPENSSL_NO_FIPS_SECURITYCHECKS) | ||||
| -    if (ossl_securitycheck_enabled(ctx)) {
 | ||||
| -        int nid, strength;
 | ||||
| -        const char *curve_name;
 | ||||
| -        const EC_GROUP *group = EC_KEY_get0_group(ec);
 | ||||
| +    int nid, strength;
 | ||||
| +    const char *curve_name;
 | ||||
| +    const EC_GROUP *group = EC_KEY_get0_group(ec);
 | ||||
|   | ||||
| -        if (group == NULL) {
 | ||||
| -            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE, "No group");
 | ||||
| -            return 0;
 | ||||
| -        }
 | ||||
| -        nid = EC_GROUP_get_curve_name(group);
 | ||||
| -        if (nid == NID_undef) {
 | ||||
| -            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE,
 | ||||
| -                           "Explicit curves are not allowed in fips mode");
 | ||||
| -            return 0;
 | ||||
| -        }
 | ||||
| +    if (group == NULL) {
 | ||||
| +        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE, "No group");
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
| +    nid = EC_GROUP_get_curve_name(group);
 | ||||
| +    if (nid == NID_undef) {
 | ||||
| +        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE,
 | ||||
| +                       "Explicit curves are not allowed in this build");
 | ||||
| +        return 0;
 | ||||
| +    }
 | ||||
|   | ||||
| +    if (ossl_securitycheck_enabled(ctx)) {
 | ||||
|          curve_name = EC_curve_nid2nist(nid); | ||||
|          if (curve_name == NULL) { | ||||
|              ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_CURVE, | ||||
| @ -11,6 +11,23 @@ diff -up openssl-3.0.0/providers/fips/fipsprov.c.fipsmin openssl-3.0.0/providers | ||||
|   | ||||
|  extern OSSL_FUNC_core_thread_start_fn *c_thread_start; | ||||
|  int FIPS_security_check_enabled(OSSL_LIB_CTX *libctx); | ||||
| @@ -177,13 +177,13 @@ static int fips_get_params(void *provctx
 | ||||
|                                                &fips_prov_ossl_ctx_method); | ||||
|   | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME); | ||||
| -    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL FIPS Provider"))
 | ||||
| +    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "Red Hat Enterprise Linux 9 - OpenSSL FIPS Provider"))
 | ||||
|          return 0; | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION); | ||||
| -    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
 | ||||
| +    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, REDHAT_FIPS_VERSION))
 | ||||
|          return 0; | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO); | ||||
| -    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
 | ||||
| +    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, REDHAT_FIPS_VERSION))
 | ||||
|          return 0; | ||||
|      p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_STATUS); | ||||
|      if (p != NULL && !OSSL_PARAM_set_int(p, ossl_prov_is_running())) | ||||
| @@ -264,9 +267,9 @@ static const OSSL_ALGORITHM fips_digests
 | ||||
|       * KECCAK-KMAC-128 and KECCAK-KMAC-256 as hashes are mostly useful for | ||||
|       * KMAC128 and KMAC256. | ||||
|  | ||||
							
								
								
									
										52
									
								
								SOURCES/0048-correctly-handle-records.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								SOURCES/0048-correctly-handle-records.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| diff -up openssl-3.0.1/apps/s_server.c.handle-records openssl-3.0.1/apps/s_server.c
 | ||||
| --- openssl-3.0.1/apps/s_server.c.handle-records	2022-02-03 15:26:16.803434943 +0100
 | ||||
| +++ openssl-3.0.1/apps/s_server.c	2022-02-03 15:34:33.358298697 +0100
 | ||||
| @@ -2982,7 +2982,9 @@ static int www_body(int s, int stype, in
 | ||||
|      /* Set width for a select call if needed */ | ||||
|      width = s + 1; | ||||
|   | ||||
| -    buf = app_malloc(bufsize, "server www buffer");
 | ||||
| +    /* as we use BIO_gets(), and it always null terminates data, we need
 | ||||
| +     * to allocate 1 byte longer buffer to fit the full 2^14 byte record */
 | ||||
| +    buf = app_malloc(bufsize + 1, "server www buffer");
 | ||||
|      io = BIO_new(BIO_f_buffer()); | ||||
|      ssl_bio = BIO_new(BIO_f_ssl()); | ||||
|      if ((io == NULL) || (ssl_bio == NULL)) | ||||
| @@ -3047,7 +3049,7 @@ static int www_body(int s, int stype, in
 | ||||
|      } | ||||
|   | ||||
|      for (;;) { | ||||
| -        i = BIO_gets(io, buf, bufsize - 1);
 | ||||
| +        i = BIO_gets(io, buf, bufsize + 1);
 | ||||
|          if (i < 0) {            /* error */ | ||||
|              if (!BIO_should_retry(io) && !SSL_waiting_for_async(con)) { | ||||
|                  if (!s_quiet) | ||||
| @@ -3112,7 +3114,7 @@ static int www_body(int s, int stype, in
 | ||||
|                   * we're expecting to come from the client. If they haven't | ||||
|                   * sent one there's not much we can do. | ||||
|                   */ | ||||
| -                BIO_gets(io, buf, bufsize - 1);
 | ||||
| +                BIO_gets(io, buf, bufsize + 1);
 | ||||
|              } | ||||
|   | ||||
|              BIO_puts(io, | ||||
| @@ -3401,7 +3403,9 @@ static int rev_body(int s, int stype, in
 | ||||
|      SSL *con; | ||||
|      BIO *io, *ssl_bio, *sbio; | ||||
|   | ||||
| -    buf = app_malloc(bufsize, "server rev buffer");
 | ||||
| +    /* as we use BIO_gets(), and it always null terminates data, we need
 | ||||
| +     * to allocate 1 byte longer buffer to fit the full 2^14 byte record */
 | ||||
| +    buf = app_malloc(bufsize + 1, "server rev buffer");
 | ||||
|      io = BIO_new(BIO_f_buffer()); | ||||
|      ssl_bio = BIO_new(BIO_f_ssl()); | ||||
|      if ((io == NULL) || (ssl_bio == NULL)) | ||||
| @@ -3476,7 +3480,7 @@ static int rev_body(int s, int stype, in
 | ||||
|      print_ssl_summary(con); | ||||
|   | ||||
|      for (;;) { | ||||
| -        i = BIO_gets(io, buf, bufsize - 1);
 | ||||
| +        i = BIO_gets(io, buf, bufsize + 1);
 | ||||
|          if (i < 0) {            /* error */ | ||||
|              if (!BIO_should_retry(io)) { | ||||
|                  if (!s_quiet) | ||||
							
								
								
									
										489
									
								
								SOURCES/0049-Selectively-disallow-SHA1-signatures.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										489
									
								
								SOURCES/0049-Selectively-disallow-SHA1-signatures.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,489 @@ | ||||
| From 243201772cc6d583fae9eba81cb2c2c7425bc564 Mon Sep 17 00:00:00 2001 | ||||
| From: Clemens Lang <cllang@redhat.com> | ||||
| Date: Mon, 21 Feb 2022 17:24:44 +0100 | ||||
| Subject: Selectively disallow SHA1 signatures | ||||
| 
 | ||||
| For RHEL 9.0, we want to phase out SHA1. One of the steps to do that is | ||||
| disabling SHA1 signatures. Introduce a new configuration option in the | ||||
| alg_section named 'rh-allow-sha1-signatures'. This option defaults to | ||||
| false. If set to false (or unset), any signature creation or | ||||
| verification operations that involve SHA1 as digest will fail. | ||||
| 
 | ||||
| This also affects TLS, where the signature_algorithms extension of any | ||||
| ClientHello message sent by OpenSSL will no longer include signatures | ||||
| with the SHA1 digest if rh-allow-sha1-signatures is false. For servers | ||||
| that request a client certificate, the same also applies for | ||||
| CertificateRequest messages sent by them. | ||||
| 
 | ||||
| For signatures created using the EVP_PKEY API, this is a best-effort | ||||
| check that will deny signatures in cases where the digest algorithm is | ||||
| known. This means, for example, that that following steps will still | ||||
| work: | ||||
| 
 | ||||
|  $> openssl dgst -sha1 -binary -out sha1 infile | ||||
|  $> openssl pkeyutl -inkey key.pem -sign -in sha1 -out sha1sig | ||||
|  $> openssl pkeyutl -inkey key.pem -verify -sigfile sha1sig -in sha1 | ||||
| 
 | ||||
| whereas these will not: | ||||
| 
 | ||||
|  $> openssl dgst -sha1 -binary -out sha1 infile | ||||
|  $> openssl pkeyutl -inkey kem.pem -sign -in sha1 -out sha1sig -pkeyopt digest:sha1 | ||||
|  $> openssl pkeyutl -inkey kem.pem -verify -sigfile sha1sig -in sha1 -pkeyopt digest:sha1 | ||||
| 
 | ||||
| This happens because in the first case, OpenSSL's signature | ||||
| implementation does not know that it is signing a SHA1 hash (it could be | ||||
| signing arbitrary data). | ||||
| 
 | ||||
| Resolves: rhbz#2031742 | ||||
| ---
 | ||||
|  crypto/evp/evp_cnf.c                          | 13 ++++ | ||||
|  crypto/evp/m_sigver.c                         | 77 +++++++++++++++++++ | ||||
|  crypto/evp/pmeth_lib.c                        | 15 ++++ | ||||
|  doc/man5/config.pod                           | 11 +++ | ||||
|  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 + | ||||
|  13 files changed, 188 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| 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
 | ||||
| index 9188edbc21..db1a1d7bc3 100644
 | ||||
| --- a/crypto/evp/m_sigver.c
 | ||||
| +++ b/crypto/evp/m_sigver.c
 | ||||
| @@ -16,6 +16,71 @@
 | ||||
|  #include "internal/numbers.h"   /* includes SIZE_MAX */ | ||||
|  #include "evp_local.h" | ||||
|   | ||||
| +typedef struct ossl_legacy_digest_signatures_st {
 | ||||
| +    int allowed;
 | ||||
| +} OSSL_LEGACY_DIGEST_SIGNATURES;
 | ||||
| +
 | ||||
| +static void ossl_ctx_legacy_digest_signatures_free(void *vldsigs)
 | ||||
| +{
 | ||||
| +    OSSL_LEGACY_DIGEST_SIGNATURES *ldsigs = vldsigs;
 | ||||
| +
 | ||||
| +    if (ldsigs != NULL) {
 | ||||
| +        OPENSSL_free(ldsigs);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void *ossl_ctx_legacy_digest_signatures_new(OSSL_LIB_CTX *ctx)
 | ||||
| +{
 | ||||
| +    return OPENSSL_zalloc(sizeof(OSSL_LEGACY_DIGEST_SIGNATURES));
 | ||||
| +}
 | ||||
| +
 | ||||
| +static const OSSL_LIB_CTX_METHOD ossl_ctx_legacy_digest_signatures_method = {
 | ||||
| +    OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
 | ||||
| +    ossl_ctx_legacy_digest_signatures_new,
 | ||||
| +    ossl_ctx_legacy_digest_signatures_free,
 | ||||
| +};
 | ||||
| +
 | ||||
| +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))
 | ||||
| +        return 0;
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +    return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES,
 | ||||
| +                                 &ossl_ctx_legacy_digest_signatures_method);
 | ||||
| +}
 | ||||
| +
 | ||||
| +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);
 | ||||
| +
 | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +    if (ossl_safe_getenv("OPENSSL_ENABLE_SHA1_SIGNATURES") != NULL)
 | ||||
| +        /* used in tests */
 | ||||
| +        return 1;
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +    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;
 | ||||
| +}
 | ||||
| +
 | ||||
|  #ifndef FIPS_MODULE | ||||
|   | ||||
|  static int update(EVP_MD_CTX *ctx, const void *data, size_t datalen) | ||||
| @@ -258,6 +323,18 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| +    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
 | ||||
| index 2b9c6c2351..3c5a1e6f5d 100644
 | ||||
| --- 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 | ||||
| @@ -946,6 +947,20 @@ static int evp_pkey_ctx_set_md(EVP_PKEY_CTX *ctx, const EVP_MD *md,
 | ||||
|          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
 | ||||
| index 77a8055e81..aa1be5ca7f 100644
 | ||||
| --- 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 | ||||
| diff --git a/include/internal/cryptlib.h b/include/internal/cryptlib.h
 | ||||
| index 1291299b6e..e234341e6a 100644
 | ||||
| --- a/include/internal/cryptlib.h
 | ||||
| +++ b/include/internal/cryptlib.h
 | ||||
| @@ -168,7 +168,8 @@ typedef struct ossl_ex_data_global_st {
 | ||||
|  # define OSSL_LIB_CTX_PROVIDER_CONF_INDEX           16 | ||||
|  # define OSSL_LIB_CTX_BIO_CORE_INDEX                17 | ||||
|  # define OSSL_LIB_CTX_CHILD_PROVIDER_INDEX          18 | ||||
| -# define OSSL_LIB_CTX_MAX_INDEXES                   19
 | ||||
| +# define OSSL_LIB_CTX_LEGACY_DIGEST_SIGNATURES      19
 | ||||
| +# define OSSL_LIB_CTX_MAX_INDEXES                   20
 | ||||
|   | ||||
|  # define OSSL_LIB_CTX_METHOD_LOW_PRIORITY          -1 | ||||
|  # define OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY       0 | ||||
| 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
 | ||||
| index 699ada7c52..e534ad0a5f 100644
 | ||||
| --- 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 | ||||
| @@ -235,6 +236,15 @@ int ossl_digest_get_approved_nid_with_sha1(OSSL_LIB_CTX *ctx, const EVP_MD *md,
 | ||||
|              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; | ||||
|  } | ||||
|   | ||||
| @@ -244,5 +254,15 @@ int ossl_digest_is_allowed(OSSL_LIB_CTX *ctx, const EVP_MD *md)
 | ||||
|      if (ossl_securitycheck_enabled(ctx)) | ||||
|          return ossl_digest_get_approved_nid(md) != NID_undef; | ||||
|  # endif /* OPENSSL_NO_FIPS_SECURITYCHECKS */ | ||||
| +
 | ||||
| +#ifndef FIPS_MODULE
 | ||||
| +    {
 | ||||
| +        int mdnid = EVP_MD_nid(md);
 | ||||
| +        if ((mdnid == NID_sha1 || mdnid == NID_md5_sha1)
 | ||||
| +                && !ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
 | ||||
| +            return 0;
 | ||||
| +    }
 | ||||
| +#endif
 | ||||
| +
 | ||||
|      return 1; | ||||
|  } | ||||
| diff --git a/providers/common/securitycheck_default.c b/providers/common/securitycheck_default.c
 | ||||
| index de7f0d3a0a..ce54a94fbc 100644
 | ||||
| --- 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) | ||||
| @@ -23,9 +24,10 @@ int ossl_securitycheck_enabled(OSSL_LIB_CTX *libctx)
 | ||||
|  } | ||||
|   | ||||
|  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       }, | ||||
| @@ -36,8 +38,11 @@ int ossl_digest_rsa_sign_get_md_nid(OSSL_LIB_CTX *ctx, const EVP_MD *md,
 | ||||
|          { 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
 | ||||
| index 28fd7c498e..fa3822f39f 100644
 | ||||
| --- a/providers/implementations/signature/dsa_sig.c
 | ||||
| +++ b/providers/implementations/signature/dsa_sig.c
 | ||||
| @@ -124,12 +124,17 @@ static int dsa_setup_md(PROV_DSA_CTX *ctx,
 | ||||
|          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
 | ||||
| index 865d49d100..99b228e82c 100644
 | ||||
| --- a/providers/implementations/signature/ecdsa_sig.c
 | ||||
| +++ b/providers/implementations/signature/ecdsa_sig.c
 | ||||
| @@ -237,7 +237,11 @@ static int ecdsa_setup_md(PROV_ECDSA_CTX *ctx, const char *mdname,
 | ||||
|                         "%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
 | ||||
| index 325e855333..bea397f0c1 100644
 | ||||
| --- a/providers/implementations/signature/rsa_sig.c
 | ||||
| +++ b/providers/implementations/signature/rsa_sig.c
 | ||||
| @@ -26,6 +26,7 @@
 | ||||
|  #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" | ||||
| @@ -34,6 +35,7 @@
 | ||||
|  #include "prov/securitycheck.h" | ||||
|   | ||||
|  #define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1 | ||||
| +#define RSA_DEFAULT_DIGEST_NAME_NONLEGACY OSSL_DIGEST_NAME_SHA2_256
 | ||||
|   | ||||
|  static OSSL_FUNC_signature_newctx_fn rsa_newctx; | ||||
|  static OSSL_FUNC_signature_sign_init_fn rsa_sign_init; | ||||
| @@ -289,10 +291,15 @@ static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
 | ||||
|   | ||||
|      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 | ||||
| @@ -1348,8 +1355,15 @@ static int rsa_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
 | ||||
|      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
 | ||||
| index fc32bb3556..4b74ee1a34 100644
 | ||||
| --- 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" | ||||
| @@ -1145,11 +1146,13 @@ int ssl_setup_sig_algs(SSL_CTX *ctx)
 | ||||
|          = OPENSSL_malloc(sizeof(*lu) * OSSL_NELEM(sigalg_lookup_tbl)); | ||||
|      EVP_PKEY *tmpkey = EVP_PKEY_new(); | ||||
|      int ret = 0; | ||||
| +    int ldsigs_allowed;
 | ||||
|   | ||||
|      if (cache == NULL || tmpkey == NULL) | ||||
|          goto err; | ||||
|   | ||||
|      ERR_set_mark(); | ||||
| +    ldsigs_allowed = ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0);
 | ||||
|      for (i = 0, lu = sigalg_lookup_tbl; | ||||
|           i < OSSL_NELEM(sigalg_lookup_tbl); lu++, i++) { | ||||
|          EVP_PKEY_CTX *pctx; | ||||
| @@ -1169,6 +1172,11 @@ int ssl_setup_sig_algs(SSL_CTX *ctx)
 | ||||
|              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
 | ||||
| index 10b4e57d79..2d3c363bb0 100644
 | ||||
| --- a/util/libcrypto.num
 | ||||
| +++ b/util/libcrypto.num
 | ||||
| @@ -5426,3 +5426,5 @@ ASN1_TIME_print_ex                      5553	3_0_0	EXIST::FUNCTION:
 | ||||
|  EVP_PKEY_get0_provider                  5554	3_0_0	EXIST::FUNCTION: | ||||
|  EVP_PKEY_CTX_get0_provider              5555	3_0_0	EXIST::FUNCTION: | ||||
|  ossl_safe_getenv                        ?	3_0_0	EXIST::FUNCTION: | ||||
| +ossl_ctx_legacy_digest_signatures_allowed ?	3_0_1	EXIST::FUNCTION:
 | ||||
| +ossl_ctx_legacy_digest_signatures_allowed_set ?	3_0_1	EXIST::FUNCTION:
 | ||||
| -- 
 | ||||
| 2.35.1 | ||||
| 
 | ||||
							
								
								
									
										95
									
								
								SOURCES/0050-FIPS-enable-pkcs12-mac.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								SOURCES/0050-FIPS-enable-pkcs12-mac.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | ||||
| diff -up openssl-3.0.1/crypto/pkcs12/p12_key.c.pkc12_fips openssl-3.0.1/crypto/pkcs12/p12_key.c
 | ||||
| --- openssl-3.0.1/crypto/pkcs12/p12_key.c.pkc12_fips	2022-02-21 12:35:24.829893907 +0100
 | ||||
| +++ openssl-3.0.1/crypto/pkcs12/p12_key.c	2022-02-21 13:01:22.711622967 +0100
 | ||||
| @@ -85,17 +85,41 @@ int PKCS12_key_gen_uni_ex(unsigned char
 | ||||
|      EVP_KDF *kdf; | ||||
|      EVP_KDF_CTX *ctx; | ||||
|      OSSL_PARAM params[6], *p = params; | ||||
| +    char *adjusted_propq = NULL;
 | ||||
|   | ||||
|      if (n <= 0) | ||||
|          return 0; | ||||
|   | ||||
| -    kdf = EVP_KDF_fetch(libctx, "PKCS12KDF", propq);
 | ||||
| -    if (kdf == NULL)
 | ||||
| +    if (ossl_get_kernel_fips_flag()) {
 | ||||
| +        const char *nofips = "-fips";
 | ||||
| +        size_t len = propq ? strlen(propq) + 1 + strlen(nofips) + 1 :
 | ||||
| +                                                 strlen(nofips) + 1;
 | ||||
| +        char *ptr = NULL;
 | ||||
| +
 | ||||
| +        adjusted_propq = OPENSSL_zalloc(len);
 | ||||
| +        if (adjusted_propq != NULL) {
 | ||||
| +            ptr = adjusted_propq;
 | ||||
| +            if (propq) {
 | ||||
| +                memcpy(ptr, propq, strlen(propq));
 | ||||
| +                ptr += strlen(propq);
 | ||||
| +                *ptr = ',';
 | ||||
| +                ptr++;
 | ||||
| +            }
 | ||||
| +            memcpy(ptr, nofips, strlen(nofips));
 | ||||
| +        }
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    kdf = adjusted_propq ? EVP_KDF_fetch(libctx, "PKCS12KDF", adjusted_propq) : EVP_KDF_fetch(libctx, "PKCS12KDF", propq);
 | ||||
| +    if (kdf == NULL) {
 | ||||
| +        OPENSSL_free(adjusted_propq);
 | ||||
|          return 0; | ||||
| +    }
 | ||||
|      ctx = EVP_KDF_CTX_new(kdf); | ||||
|      EVP_KDF_free(kdf); | ||||
| -    if (ctx == NULL)
 | ||||
| +    if (ctx == NULL) {
 | ||||
| +        OPENSSL_free(adjusted_propq);
 | ||||
|          return 0; | ||||
| +    }
 | ||||
|   | ||||
|      *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, | ||||
|                                              (char *)EVP_MD_get0_name(md_type), | ||||
| @@ -127,6 +149,7 @@ int PKCS12_key_gen_uni_ex(unsigned char
 | ||||
|          } OSSL_TRACE_END(PKCS12_KEYGEN); | ||||
|      } | ||||
|      EVP_KDF_CTX_free(ctx); | ||||
| +    OPENSSL_free(adjusted_propq);
 | ||||
|      return res; | ||||
|  } | ||||
|   | ||||
| diff -up openssl-3.0.1/apps/pkcs12.c.pkc12_fips_apps openssl-3.0.1/apps/pkcs12.c
 | ||||
| --- openssl-3.0.1/apps/pkcs12.c.pkc12_fips_apps	2022-02-21 16:37:07.908923682 +0100
 | ||||
| +++ openssl-3.0.1/apps/pkcs12.c	2022-02-21 17:38:44.555345633 +0100
 | ||||
| @@ -765,15 +765,34 @@ int pkcs12_main(int argc, char **argv)
 | ||||
|      } | ||||
|      if (macver) { | ||||
|          EVP_KDF *pkcs12kdf; | ||||
| +        char *adjusted_propq = NULL;
 | ||||
| +        const char *nofips = "-fips";
 | ||||
| +        size_t len = app_get0_propq() ? strlen(app_get0_propq()) + 1 + strlen(nofips) + 1 :
 | ||||
| +                                                            strlen(nofips) + 1;
 | ||||
| +        char *ptr = NULL;
 | ||||
| +
 | ||||
| +        adjusted_propq = OPENSSL_zalloc(len);
 | ||||
| +        if (adjusted_propq != NULL) {
 | ||||
| +                ptr = adjusted_propq;
 | ||||
| +                if (app_get0_propq()) {
 | ||||
| +                    memcpy(ptr, app_get0_propq(), strlen(app_get0_propq()));
 | ||||
| +                    ptr += strlen(app_get0_propq());
 | ||||
| +                    *ptr = ',';
 | ||||
| +                    ptr++;
 | ||||
| +                }
 | ||||
| +                memcpy(ptr, nofips, strlen(nofips));
 | ||||
| +        }
 | ||||
|   | ||||
|          pkcs12kdf = EVP_KDF_fetch(app_get0_libctx(), "PKCS12KDF", | ||||
| -                                  app_get0_propq());
 | ||||
| +                                  adjusted_propq ? adjusted_propq : app_get0_propq());
 | ||||
|          if (pkcs12kdf == NULL) { | ||||
|              BIO_printf(bio_err, "Error verifying PKCS12 MAC; no PKCS12KDF support.\n"); | ||||
|              BIO_printf(bio_err, "Use -nomacver if MAC verification is not required.\n"); | ||||
| +            OPENSSL_free(adjusted_propq);
 | ||||
|              goto end; | ||||
|          } | ||||
|          EVP_KDF_free(pkcs12kdf); | ||||
| +        OPENSSL_free(adjusted_propq);
 | ||||
|          /* If we enter empty password try no password first */ | ||||
|          if (!mpass[0] && PKCS12_verify_mac(p12, NULL, 0)) { | ||||
|              /* If mac and crypto pass the same set it to NULL too */ | ||||
							
								
								
									
										2151
									
								
								SOURCES/0051-Support-different-R_BITS-lengths-for-KBKDF.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2151
									
								
								SOURCES/0051-Support-different-R_BITS-lengths-for-KBKDF.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -0,0 +1,206 @@ | ||||
| From c63599ee9708d543205a9173207ee7167315c624 Mon Sep 17 00:00:00 2001 | ||||
| From: Clemens Lang <cllang@redhat.com> | ||||
| Date: Tue, 1 Mar 2022 15:44:18 +0100 | ||||
| Subject: [PATCH] Allow SHA1 in seclevel 2 if rh-allow-sha1-signatures = yes | ||||
| 
 | ||||
| References: rhbz#2055796 | ||||
| ---
 | ||||
|  crypto/x509/x509_vfy.c        | 19 ++++++++++- | ||||
|  doc/man5/config.pod           |  7 +++- | ||||
|  ssl/t1_lib.c                  | 64 ++++++++++++++++++++++++++++------- | ||||
|  test/recipes/25-test_verify.t |  7 ++-- | ||||
|  4 files changed, 79 insertions(+), 18 deletions(-) | ||||
| 
 | ||||
| diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
 | ||||
| index ff3ca83de6..a549c1c111 100644
 | ||||
| --- a/crypto/x509/x509_vfy.c
 | ||||
| +++ b/crypto/x509/x509_vfy.c
 | ||||
| @@ -25,6 +25,7 @@
 | ||||
|  #include <openssl/objects.h> | ||||
|  #include <openssl/core_names.h> | ||||
|  #include "internal/dane.h" | ||||
| +#include "internal/sslconf.h"
 | ||||
|  #include "crypto/x509.h" | ||||
|  #include "x509_local.h" | ||||
|   | ||||
| @@ -3440,14 +3441,30 @@ static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert)
 | ||||
|  { | ||||
|      int secbits = -1; | ||||
|      int level = ctx->param->auth_level; | ||||
| +    int nid;
 | ||||
| +    OSSL_LIB_CTX *libctx = NULL;
 | ||||
|   | ||||
|      if (level <= 0) | ||||
|          return 1; | ||||
|      if (level > NUM_AUTH_LEVELS) | ||||
|          level = NUM_AUTH_LEVELS; | ||||
|   | ||||
| -    if (!X509_get_signature_info(cert, NULL, NULL, &secbits, NULL))
 | ||||
| +    if (ctx->libctx)
 | ||||
| +        libctx = ctx->libctx;
 | ||||
| +    else if (cert->libctx)
 | ||||
| +        libctx = cert->libctx;
 | ||||
| +    else
 | ||||
| +        libctx = OSSL_LIB_CTX_get0_global_default();
 | ||||
| +
 | ||||
| +    if (!X509_get_signature_info(cert, &nid, NULL, &secbits, NULL))
 | ||||
|          return 0; | ||||
|   | ||||
| +    if (nid == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(libctx, 0)
 | ||||
| +            && ctx->param->auth_level < 3)
 | ||||
| +        /* When rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility. */
 | ||||
| +        return 1;
 | ||||
| +
 | ||||
|      return secbits >= minbits_table[level - 1]; | ||||
|  } | ||||
| diff --git a/doc/man5/config.pod b/doc/man5/config.pod
 | ||||
| index aa1be5ca7f..aa69e2b844 100644
 | ||||
| --- a/doc/man5/config.pod
 | ||||
| +++ b/doc/man5/config.pod
 | ||||
| @@ -305,7 +305,12 @@ 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>.
 | ||||
| +B<no>.  Note that enabling B<rh-allow-sha1-signatures> will allow TLS signature
 | ||||
| +algorithms that use SHA1 in security level 2, despite the definition of
 | ||||
| +security level 2 of 112 bits of security, which SHA1 does not meet.  Because
 | ||||
| +TLS 1.1 or lower use MD5-SHA1 as pseudorandom function (PRF) to derive key
 | ||||
| +material, disabling B<rh-allow-sha1-signatures> requires the use of TLS 1.2 or
 | ||||
| +newer.
 | ||||
|   | ||||
|  =item B<fips_mode> (deprecated) | ||||
|   | ||||
| diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
 | ||||
| index 4b74ee1a34..5f089de107 100644
 | ||||
| --- 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 "crypto/x509.h"
 | ||||
|  #include "internal/sslconf.h" | ||||
|  #include "internal/nelem.h" | ||||
|  #include "internal/sizes.h" | ||||
| @@ -1561,19 +1562,27 @@ int tls12_check_peer_sigalg(SSL *s, uint16_t sig, EVP_PKEY *pkey)
 | ||||
|          SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_UNKNOWN_DIGEST); | ||||
|          return 0; | ||||
|      } | ||||
| -    /*
 | ||||
| -     * Make sure security callback allows algorithm. For historical
 | ||||
| -     * reasons we have to pass the sigalg as a two byte char array.
 | ||||
| -     */
 | ||||
| -    sigalgstr[0] = (sig >> 8) & 0xff;
 | ||||
| -    sigalgstr[1] = sig & 0xff;
 | ||||
| -    secbits = sigalg_security_bits(s->ctx, lu);
 | ||||
| -    if (secbits == 0 ||
 | ||||
| -        !ssl_security(s, SSL_SECOP_SIGALG_CHECK, secbits,
 | ||||
| -                      md != NULL ? EVP_MD_get_type(md) : NID_undef,
 | ||||
| -                      (void *)sigalgstr)) {
 | ||||
| -        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE);
 | ||||
| -        return 0;
 | ||||
| +
 | ||||
| +    if (lu->hash == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(s->ctx->libctx, 0)
 | ||||
| +            && SSL_get_security_level(s) < 3) {
 | ||||
| +        /* when rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility */
 | ||||
| +    } else {
 | ||||
| +        /*
 | ||||
| +         * Make sure security callback allows algorithm. For historical
 | ||||
| +         * reasons we have to pass the sigalg as a two byte char array.
 | ||||
| +         */
 | ||||
| +        sigalgstr[0] = (sig >> 8) & 0xff;
 | ||||
| +        sigalgstr[1] = sig & 0xff;
 | ||||
| +        secbits = sigalg_security_bits(s->ctx, lu);
 | ||||
| +        if (secbits == 0 ||
 | ||||
| +            !ssl_security(s, SSL_SECOP_SIGALG_CHECK, secbits,
 | ||||
| +                          md != NULL ? EVP_MD_get_type(md) : NID_undef,
 | ||||
| +                          (void *)sigalgstr)) {
 | ||||
| +            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE);
 | ||||
| +            return 0;
 | ||||
| +        }
 | ||||
|      } | ||||
|      /* Store the sigalg the peer uses */ | ||||
|      s->s3.tmp.peer_sigalg = lu; | ||||
| @@ -2106,6 +2115,14 @@ static int tls12_sigalg_allowed(const SSL *s, int op, const SIGALG_LOOKUP *lu)
 | ||||
|          } | ||||
|      } | ||||
|   | ||||
| +    if (lu->hash == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(s->ctx->libctx, 0)
 | ||||
| +            && SSL_get_security_level(s) < 3) {
 | ||||
| +        /* when rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility */
 | ||||
| +        return 1;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* Finally see if security callback allows it */ | ||||
|      secbits = sigalg_security_bits(s->ctx, lu); | ||||
|      sigalgstr[0] = (lu->sigalg >> 8) & 0xff; | ||||
| @@ -2977,6 +2994,8 @@ static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
 | ||||
|  { | ||||
|      /* Lookup signature algorithm digest */ | ||||
|      int secbits, nid, pknid; | ||||
| +    OSSL_LIB_CTX *libctx = NULL;
 | ||||
| +
 | ||||
|      /* Don't check signature if self signed */ | ||||
|      if ((X509_get_extension_flags(x) & EXFLAG_SS) != 0) | ||||
|          return 1; | ||||
| @@ -2985,6 +3004,25 @@ static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
 | ||||
|      /* If digest NID not defined use signature NID */ | ||||
|      if (nid == NID_undef) | ||||
|          nid = pknid; | ||||
| +
 | ||||
| +    if (x && x->libctx)
 | ||||
| +        libctx = x->libctx;
 | ||||
| +    else if (ctx && ctx->libctx)
 | ||||
| +        libctx = ctx->libctx;
 | ||||
| +    else if (s && s->ctx && s->ctx->libctx)
 | ||||
| +        libctx = s->ctx->libctx;
 | ||||
| +    else
 | ||||
| +        libctx = OSSL_LIB_CTX_get0_global_default();
 | ||||
| +
 | ||||
| +    if (nid == NID_sha1
 | ||||
| +            && ossl_ctx_legacy_digest_signatures_allowed(libctx, 0)
 | ||||
| +            && ((s != NULL && SSL_get_security_level(s) < 3)
 | ||||
| +                || (ctx != NULL && SSL_CTX_get_security_level(ctx) < 3)
 | ||||
| +            ))
 | ||||
| +        /* When rh-allow-sha1-signatures = yes and security level <= 2,
 | ||||
| +         * explicitly allow SHA1 for backwards compatibility. */
 | ||||
| +        return 1;
 | ||||
| +
 | ||||
|      if (s) | ||||
|          return ssl_security(s, op, secbits, nid, x); | ||||
|      else | ||||
| diff --git a/test/recipes/25-test_verify.t b/test/recipes/25-test_verify.t
 | ||||
| index 700bbd849c..2de1d76b5e 100644
 | ||||
| --- a/test/recipes/25-test_verify.t
 | ||||
| +++ b/test/recipes/25-test_verify.t
 | ||||
| @@ -29,7 +29,7 @@ sub verify {
 | ||||
|      run(app([@args])); | ||||
|  } | ||||
|   | ||||
| -plan tests => 160;
 | ||||
| +plan tests => 159;
 | ||||
|   | ||||
|  # Canonical success | ||||
|  ok(verify("ee-cert", "sslserver", ["root-cert"], ["ca-cert"]), | ||||
| @@ -387,8 +387,9 @@ ok(verify("ee-pss-sha1-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "0"
 | ||||
|  ok(verify("ee-pss-sha256-cert", "", ["root-cert"], ["ca-cert"], ), | ||||
|      "CA with PSS signature using SHA256"); | ||||
|   | ||||
| -ok(!verify("ee-pss-sha1-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "1"),
 | ||||
| -    "Reject PSS signature using SHA1 and auth level 1");
 | ||||
| +## rh-allow-sha1-signatures=yes allows this to pass despite -auth_level 1
 | ||||
| +#ok(!verify("ee-pss-sha1-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "1"),
 | ||||
| +#    "Reject PSS signature using SHA1 and auth level 1");
 | ||||
|   | ||||
|  ok(verify("ee-pss-sha256-cert", "", ["root-cert"], ["ca-cert"], "-auth_level", "2"), | ||||
|      "PSS signature using SHA256 and auth level 2"); | ||||
| -- 
 | ||||
| 2.35.1 | ||||
| 
 | ||||
							
								
								
									
										188
									
								
								SOURCES/0053-CVE-2022-0778.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								SOURCES/0053-CVE-2022-0778.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,188 @@ | ||||
| From 23f1773ddf92979006d0f438523f3c73320c384f Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tomas@openssl.org> | ||||
| Date: Mon, 28 Feb 2022 18:26:30 +0100 | ||||
| Subject: [PATCH] Add documentation of BN_mod_sqrt() | ||||
| 
 | ||||
| ---
 | ||||
|  doc/man3/BN_add.pod    | 15 +++++++++++++-- | ||||
|  util/missingcrypto.txt |  1 - | ||||
|  2 files changed, 13 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/doc/man3/BN_add.pod b/doc/man3/BN_add.pod
 | ||||
| index 62d3ee7205..cf6c49c0e3 100644
 | ||||
| --- a/doc/man3/BN_add.pod
 | ||||
| +++ b/doc/man3/BN_add.pod
 | ||||
| @@ -3,7 +3,7 @@
 | ||||
|  =head1 NAME | ||||
|   | ||||
|  BN_add, BN_sub, BN_mul, BN_sqr, BN_div, BN_mod, BN_nnmod, BN_mod_add, | ||||
| -BN_mod_sub, BN_mod_mul, BN_mod_sqr, BN_exp, BN_mod_exp, BN_gcd -
 | ||||
| +BN_mod_sub, BN_mod_mul, BN_mod_sqr, BN_mod_sqrt, BN_exp, BN_mod_exp, BN_gcd -
 | ||||
|  arithmetic operations on BIGNUMs | ||||
|   | ||||
|  =head1 SYNOPSIS | ||||
| @@ -36,6 +36,8 @@ arithmetic operations on BIGNUMs
 | ||||
|   | ||||
|   int BN_mod_sqr(BIGNUM *r, BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); | ||||
|   | ||||
| + BIGNUM *BN_mod_sqrt(BIGNUM *in, BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
 | ||||
| +
 | ||||
|   int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx); | ||||
|   | ||||
|   int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p, | ||||
| @@ -87,6 +89,12 @@ L<BN_mod_mul_reciprocal(3)>.
 | ||||
|  BN_mod_sqr() takes the square of I<a> modulo B<m> and places the | ||||
|  result in I<r>. | ||||
|   | ||||
| +BN_mod_sqrt() returns the modular square root of I<a> such that
 | ||||
| +C<in^2 = a (mod p)>. The modulus I<p> must be a
 | ||||
| +prime, otherwise an error or an incorrect "result" will be returned.
 | ||||
| +The result is stored into I<in> which can be NULL. The result will be
 | ||||
| +newly allocated in that case.
 | ||||
| +
 | ||||
|  BN_exp() raises I<a> to the I<p>-th power and places the result in I<r> | ||||
|  (C<r=a^p>). This function is faster than repeated applications of | ||||
|  BN_mul(). | ||||
| @@ -108,7 +116,10 @@ the arguments.
 | ||||
|   | ||||
|  =head1 RETURN VALUES | ||||
|   | ||||
| -For all functions, 1 is returned for success, 0 on error. The return
 | ||||
| +The BN_mod_sqrt() returns the result (possibly incorrect if I<p> is
 | ||||
| +not a prime), or NULL.
 | ||||
| +
 | ||||
| +For all remaining functions, 1 is returned for success, 0 on error. The return
 | ||||
|  value should always be checked (e.g., C<if (!BN_add(r,a,b)) goto err;>). | ||||
|  The error codes can be obtained by L<ERR_get_error(3)>. | ||||
|   | ||||
| diff --git a/util/missingcrypto.txt b/util/missingcrypto.txt
 | ||||
| index b61bdeb880..4d2fd7f6b7 100644
 | ||||
| --- a/util/missingcrypto.txt
 | ||||
| +++ b/util/missingcrypto.txt
 | ||||
| @@ -264,7 +264,6 @@ BN_mod_lshift(3)
 | ||||
|  BN_mod_lshift1(3) | ||||
|  BN_mod_lshift1_quick(3) | ||||
|  BN_mod_lshift_quick(3) | ||||
| -BN_mod_sqrt(3)
 | ||||
|  BN_mod_sub_quick(3) | ||||
|  BN_nist_mod_192(3) | ||||
|  BN_nist_mod_224(3) | ||||
| 
 | ||||
| From 46673310c9a755b2a56f53d115854983d6ada11a Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tomas@openssl.org> | ||||
| Date: Mon, 28 Feb 2022 18:26:35 +0100 | ||||
| Subject: [PATCH] Add a negative testcase for BN_mod_sqrt | ||||
| 
 | ||||
| ---
 | ||||
|  test/bntest.c                          | 11 ++++++++++- | ||||
|  test/recipes/10-test_bn_data/bnmod.txt | 12 ++++++++++++ | ||||
|  2 files changed, 22 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/test/bntest.c b/test/bntest.c
 | ||||
| index efdb3ef963..d49f87373a 100644
 | ||||
| --- a/test/bntest.c
 | ||||
| +++ b/test/bntest.c
 | ||||
| @@ -1732,8 +1732,17 @@ static int file_modsqrt(STANZA *s)
 | ||||
|              || !TEST_ptr(ret2 = BN_new())) | ||||
|          goto err; | ||||
|   | ||||
| +    if (BN_is_negative(mod_sqrt)) {
 | ||||
| +        /* A negative testcase */
 | ||||
| +        if (!TEST_ptr_null(BN_mod_sqrt(ret, a, p, ctx)))
 | ||||
| +            goto err;
 | ||||
| +
 | ||||
| +        st = 1;
 | ||||
| +        goto err;
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /* There are two possible answers. */ | ||||
| -    if (!TEST_true(BN_mod_sqrt(ret, a, p, ctx))
 | ||||
| +    if (!TEST_ptr(BN_mod_sqrt(ret, a, p, ctx))
 | ||||
|              || !TEST_true(BN_sub(ret2, p, ret))) | ||||
|          goto err; | ||||
|   | ||||
| diff --git a/test/recipes/10-test_bn_data/bnmod.txt b/test/recipes/10-test_bn_data/bnmod.txt
 | ||||
| index e22d656091..bc8a434ea5 100644
 | ||||
| --- a/test/recipes/10-test_bn_data/bnmod.txt
 | ||||
| +++ b/test/recipes/10-test_bn_data/bnmod.txt
 | ||||
| @@ -2799,3 +2799,15 @@ P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f
 | ||||
|  ModSqrt = a1d52989f12f204d3d2167d9b1e6c8a6174c0c786a979a5952383b7b8bd186 | ||||
|  A = 2eee37cf06228a387788188e650bc6d8a2ff402931443f69156a29155eca07dcb45f3aac238d92943c0c25c896098716baa433f25bd696a142f5a69d5d937e81 | ||||
|  P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f | ||||
| +
 | ||||
| +# Negative testcases for BN_mod_sqrt()
 | ||||
| +
 | ||||
| +# This one triggers an infinite loop with unfixed implementation
 | ||||
| +# It should just fail.
 | ||||
| +ModSqrt = -1
 | ||||
| +A = 20a7ee
 | ||||
| +P = 460201
 | ||||
| +
 | ||||
| +ModSqrt = -1
 | ||||
| +A = 65bebdb00a96fc814ec44b81f98b59fba3c30203928fa5214c51e0a97091645280c947b005847f239758482b9bfc45b066fde340d1fe32fc9c1bf02e1b2d0ed
 | ||||
| +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f
 | ||||
| 
 | ||||
| From cafcc62d7719dea73f334c9ef763d1e215fcd94d Mon Sep 17 00:00:00 2001 | ||||
| From: Tomas Mraz <tomas@openssl.org> | ||||
| Date: Mon, 28 Feb 2022 18:26:21 +0100 | ||||
| Subject: [PATCH] Fix possible infinite loop in BN_mod_sqrt() | ||||
| 
 | ||||
| The calculation in some cases does not finish for non-prime p. | ||||
| 
 | ||||
| This fixes CVE-2022-0778. | ||||
| 
 | ||||
| Based on patch by David Benjamin <davidben@google.com>. | ||||
| ---
 | ||||
|  crypto/bn/bn_sqrt.c | 30 ++++++++++++++++++------------ | ||||
|  1 file changed, 18 insertions(+), 12 deletions(-) | ||||
| 
 | ||||
| diff --git a/crypto/bn/bn_sqrt.c b/crypto/bn/bn_sqrt.c
 | ||||
| index b663ae5ec5..c5ea7ab194 100644
 | ||||
| --- a/crypto/bn/bn_sqrt.c
 | ||||
| +++ b/crypto/bn/bn_sqrt.c
 | ||||
| @@ -14,7 +14,8 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
 | ||||
|  /* | ||||
|   * Returns 'ret' such that ret^2 == a (mod p), using the Tonelli/Shanks | ||||
|   * algorithm (cf. Henri Cohen, "A Course in Algebraic Computational Number | ||||
| - * Theory", algorithm 1.5.1). 'p' must be prime!
 | ||||
| + * Theory", algorithm 1.5.1). 'p' must be prime, otherwise an error or
 | ||||
| + * an incorrect "result" will be returned.
 | ||||
|   */ | ||||
|  { | ||||
|      BIGNUM *ret = in; | ||||
| @@ -303,18 +304,23 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
 | ||||
|              goto vrfy; | ||||
|          } | ||||
|   | ||||
| -        /* find smallest  i  such that  b^(2^i) = 1 */
 | ||||
| -        i = 1;
 | ||||
| -        if (!BN_mod_sqr(t, b, p, ctx))
 | ||||
| -            goto end;
 | ||||
| -        while (!BN_is_one(t)) {
 | ||||
| -            i++;
 | ||||
| -            if (i == e) {
 | ||||
| -                ERR_raise(ERR_LIB_BN, BN_R_NOT_A_SQUARE);
 | ||||
| -                goto end;
 | ||||
| +        /* Find the smallest i, 0 < i < e, such that b^(2^i) = 1. */
 | ||||
| +        for (i = 1; i < e; i++) {
 | ||||
| +            if (i == 1) {
 | ||||
| +                if (!BN_mod_sqr(t, b, p, ctx))
 | ||||
| +                    goto end;
 | ||||
| +
 | ||||
| +            } else {
 | ||||
| +                if (!BN_mod_mul(t, t, t, p, ctx))
 | ||||
| +                    goto end;
 | ||||
|              } | ||||
| -            if (!BN_mod_mul(t, t, t, p, ctx))
 | ||||
| -                goto end;
 | ||||
| +            if (BN_is_one(t))
 | ||||
| +                break;
 | ||||
| +        }
 | ||||
| +        /* If not found, a is not a square or p is not prime. */
 | ||||
| +        if (i >= e) {
 | ||||
| +            ERR_raise(ERR_LIB_BN, BN_R_NOT_A_SQUARE);
 | ||||
| +            goto end;
 | ||||
|          } | ||||
|   | ||||
|          /* t := y^2^(e - i - 1) */ | ||||
| 
 | ||||
| @ -2300,8 +2300,8 @@ int setup_tests(void) | ||||
|     ADD_ALL_TESTS(check_ec_key_field_public_range_test, crv_len); | ||||
|     ADD_ALL_TESTS(check_named_curve_from_ecparameters, crv_len); | ||||
|     ADD_ALL_TESTS(ec_point_hex2point_test, crv_len); | ||||
|     ADD_ALL_TESTS(custom_generator_test, crv_len); | ||||
|     ADD_ALL_TESTS(custom_params_test, crv_len); | ||||
|     /* ADD_ALL_TESTS(custom_generator_test, crv_len);
 | ||||
|     ADD_ALL_TESTS(custom_params_test, crv_len); */ | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -15,7 +15,7 @@ | ||||
| Summary: Utilities from the general purpose cryptography library with TLS implementation | ||||
| Name: openssl | ||||
| Version: 3.0.1 | ||||
| Release: 5%{?dist} | ||||
| Release: 20%{?dist} | ||||
| Epoch: 1 | ||||
| # We have to remove certain patented algorithms from the openssl source | ||||
| # tarball with the hobble-openssl script which is included below. | ||||
| @ -53,6 +53,9 @@ Patch8: 0008-Add-FIPS_mode-compatibility-macro.patch | ||||
| Patch9: 0009-Add-Kernel-FIPS-mode-flag-support.patch | ||||
| # remove unsupported EC curves | ||||
| Patch11: 0011-Remove-EC-curves.patch | ||||
| # Disable explicit EC curves | ||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=1977867 | ||||
| Patch12: 0012-Disable-explicit-ec.patch | ||||
| # Instructions to load legacy provider in openssl.cnf | ||||
| Patch24: 0024-load-legacy-prov.patch | ||||
| # Tmp: test name change | ||||
| @ -71,6 +74,18 @@ Patch45: 0045-FIPS-services-minimize.patch | ||||
| Patch46: 0046-FIPS-s390x-hardening.patch | ||||
| # Execute KATS before HMAC verification | ||||
| Patch47: 0047-FIPS-early-KATS.patch | ||||
| # Backport of correctly handle 2^14 byte long records #17538 | ||||
| Patch48: 0048-correctly-handle-records.patch | ||||
| # Selectively disallow SHA1 signatures | ||||
| Patch49: 0049-Selectively-disallow-SHA1-signatures.patch | ||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=2049265 | ||||
| Patch50: 0050-FIPS-enable-pkcs12-mac.patch | ||||
| # Backport of patch for RHEL for Edge rhbz #2027261 | ||||
| Patch51: 0051-Support-different-R_BITS-lengths-for-KBKDF.patch | ||||
| # Allow SHA1 in seclevel 2 if rh-allow-sha1-signatures = yes | ||||
| Patch52: 0052-Allow-SHA1-in-seclevel-2-if-rh-allow-sha1-signatures.patch | ||||
| # CVE 2022-0778 | ||||
| Patch53: 0053-CVE-2022-0778.patch | ||||
| 
 | ||||
| License: ASL 2.0 | ||||
| URL: http://www.openssl.org/ | ||||
| @ -203,6 +218,7 @@ RPM_OPT_FLAGS="$RPM_OPT_FLAGS -Wa,--noexecstack -Wa,--generate-missing-build-not | ||||
| 
 | ||||
| export HASHBANGPERL=/usr/bin/perl | ||||
| 
 | ||||
| %define fips %{version}-%(date +%Y%m%d) | ||||
| # ia64, x86_64, ppc are OK by default | ||||
| # Configure the build tree.  Override OpenSSL defaults with known-good defaults | ||||
| # usable on all platforms.  The Configure script already knows to use -fPIC and | ||||
| @ -213,7 +229,7 @@ export HASHBANGPERL=/usr/bin/perl | ||||
| 	zlib enable-camellia enable-seed enable-rfc3779 enable-sctp \ | ||||
| 	enable-cms enable-md2 enable-rc5 enable-ktls enable-fips\ | ||||
| 	no-mdc2 no-ec2m no-sm2 no-sm4 enable-buildtest-c++\ | ||||
| 	shared  ${sslarch} $RPM_OPT_FLAGS '-DDEVRANDOM="\"/dev/urandom\""' | ||||
| 	shared  ${sslarch} $RPM_OPT_FLAGS '-DDEVRANDOM="\"/dev/urandom\"" -DREDHAT_FIPS_VERSION="\"%{fips}\""' | ||||
| 
 | ||||
| # Do not run this in a production package the FIPS symbols must be patched-in | ||||
| #util/mkdef.pl crypto update | ||||
| @ -242,6 +258,8 @@ patch -p1 < %{SOURCE14} | ||||
| 
 | ||||
| OPENSSL_ENABLE_MD5_VERIFY= | ||||
| export OPENSSL_ENABLE_MD5_VERIFY | ||||
| OPENSSL_ENABLE_SHA1_SIGNATURES= | ||||
| export OPENSSL_ENABLE_SHA1_SIGNATURES | ||||
| OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file | ||||
| export OPENSSL_SYSTEM_CIPHERS_OVERRIDE | ||||
| #embed HMAC into fips provider for test run | ||||
| @ -398,6 +416,70 @@ install -m644 %{SOURCE9} \ | ||||
| %ldconfig_scriptlets libs | ||||
| 
 | ||||
| %changelog | ||||
| * Fri Mar 18 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-20 | ||||
| - Fix acceptance of SHA-1 certificates with rh-allow-sha1-signatures = yes when | ||||
|   no OpenSSL library context is set | ||||
| - Resolves: rhbz#2063306 | ||||
| 
 | ||||
| * Fri Mar 18 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-19 | ||||
| - Fix TLS connections with SHA1 signatures if rh-allow-sha1-signatures = yes | ||||
| - Resolves: rhbz#2063306 | ||||
| 
 | ||||
| * Wed Mar 16 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-18 | ||||
| - CVE-2022-0778 fix | ||||
| - Resolves: rhbz#2062314 | ||||
| 
 | ||||
| * Thu Mar 10 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-15.1 | ||||
| - Fix invocation of EVP_PKEY_CTX_set_rsa_padding(RSA_PKCS1_PSS_PADDING) before | ||||
|   setting an allowed digest with EVP_PKEY_CTX_set_signature_md() | ||||
| - Resolves: rhbz#2061607 | ||||
| 
 | ||||
| * Tue Mar 01 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-14.1 | ||||
| - Allow SHA1 in SECLEVEL 2 if rh-allow-sha1-signatures = yes | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Fri Feb 25 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-14 | ||||
| - Prevent use of SHA1 with ECDSA | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Fri Feb 25 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-13 | ||||
| - OpenSSL will generate keys with prime192v1 curve if it is provided using explicit parameters | ||||
| - Resolves: rhbz#1977867 | ||||
| 
 | ||||
| * Thu Feb 24 2022 Peter Robinson <pbrobinson@fedoraproject.org> - 1:3.0.1-12 | ||||
| - Support KBKDF (NIST SP800-108) with an R value of 8bits | ||||
| - Resolves: rhbz#2027261 | ||||
| 
 | ||||
| * Wed Feb 23 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-11 | ||||
| - Allow SHA1 usage in MGF1 for RSASSA-PSS signatures | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Wed Feb 23 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-10 | ||||
| - rebuilt | ||||
| 
 | ||||
| * Tue Feb 22 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-9 | ||||
| - Allow SHA1 usage in HMAC in TLS | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Tue Feb 22 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-8 | ||||
| - OpenSSL will generate keys with prime192v1 curve if it is provided using explicit parameters | ||||
| - Resolves: rhbz#1977867 | ||||
| - pkcs12 export broken in FIPS mode | ||||
| - Resolves: rhbz#2049265 | ||||
| 
 | ||||
| * Tue Feb 22 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.1-8 | ||||
| - Disable SHA1 signature creation and verification by default | ||||
| - Set rh-allow-sha1-signatures = yes to re-enable | ||||
| - Resolves: rhbz#2031742 | ||||
| 
 | ||||
| * Thu Feb 03 2022 Sahana Prasad <sahana@redhat.com> - 1:3.0.1-7 | ||||
| - s_server: correctly handle 2^14 byte long records | ||||
| - Resolves: rhbz#2042011 | ||||
| 
 | ||||
| * Tue Feb 01 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-6 | ||||
| - Adjust FIPS provider version | ||||
| - Related: rhbz#2026445 | ||||
| 
 | ||||
| * Wed Jan 26 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.1-5 | ||||
| - On the s390x, zeroize all the copies of TLS premaster secret | ||||
| - Related: rhbz#2040448 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user