From 136988155862ce2b45683ef8045e7a8cdd11e215 Mon Sep 17 00:00:00 2001 From: Dmitry Belyavskiy Date: Mon, 21 Aug 2023 16:13:46 +0200 Subject: [PATCH 47/48] 0113-asymciphers-kem-Add-explicit-FIPS-indicator.patch Patch-name: 0113-asymciphers-kem-Add-explicit-FIPS-indicator.patch Patch-id: 113 --- include/openssl/core_names.h | 2 ++ include/openssl/evp.h | 4 +++ .../implementations/asymciphers/rsa_enc.c | 22 ++++++++++++++ providers/implementations/kem/rsa_kem.c | 30 ++++++++++++++++++- 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/include/openssl/evp.h b/include/openssl/evp.h index f1a33ff6f2..dadbf46a5a 100644 --- a/include/openssl/evp.h +++ b/include/openssl/evp.h @@ -1767,6 +1767,10 @@ OSSL_DEPRECATEDIN_3_0 size_t EVP_PKEY_meth_get_count(void); OSSL_DEPRECATEDIN_3_0 const EVP_PKEY_METHOD *EVP_PKEY_meth_get0(size_t idx); # endif +# define EVP_PKEY_REDHAT_FIPS_INDICATOR_UNDETERMINED 0 +# define EVP_PKEY_REDHAT_FIPS_INDICATOR_APPROVED 1 +# define EVP_PKEY_REDHAT_FIPS_INDICATOR_NOT_APPROVED 2 + EVP_KEYMGMT *EVP_KEYMGMT_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, const char *properties); int EVP_KEYMGMT_up_ref(EVP_KEYMGMT *keymgmt); diff --git a/providers/implementations/asymciphers/rsa_enc.c b/providers/implementations/asymciphers/rsa_enc.c index d169bfd396..bd4dcb4e27 100644 --- a/providers/implementations/asymciphers/rsa_enc.c +++ b/providers/implementations/asymciphers/rsa_enc.c @@ -466,6 +466,27 @@ static int rsa_get_ctx_params(void *vprsactx, OSSL_PARAM *params) if (p != NULL && !OSSL_PARAM_set_uint(p, prsactx->implicit_rejection)) return 0; +#ifdef FIPS_MODULE + p = OSSL_PARAM_locate(params, OSSL_ASYM_CIPHER_PARAM_REDHAT_FIPS_INDICATOR); + if (p != NULL) { + int fips_indicator = EVP_PKEY_REDHAT_FIPS_INDICATOR_APPROVED; + + /* NIST SP 800-56Br2 section 6.4.2.1 requires either explicit key + * confirmation (section 6.4.2.3.2), or assurance from a trusted third + * party (section 6.4.2.3.1) for the KTS-OAEP key transport scheme, but + * explicit key confirmation is not implemented here and cannot be + * implemented without protocol changes, and the FIPS provider does not + * implement trusted third party validation, since it relies on its + * callers to do that. We must thus mark RSA-OAEP as unapproved until + * we have received clarification from NIST on how library modules such + * as OpenSSL should implement TTP validation. */ + fips_indicator = EVP_PKEY_REDHAT_FIPS_INDICATOR_NOT_APPROVED; + + if (!OSSL_PARAM_set_int(p, fips_indicator)) + return 0; + } +#endif /* defined(FIPS_MODULE) */ + return 1; } @@ -480,6 +501,7 @@ static const OSSL_PARAM known_gettable_ctx_params[] = { OSSL_PARAM_uint(OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION, NULL), #ifdef FIPS_MODULE OSSL_PARAM_octet_string(OSSL_ASYM_CIPHER_PARAM_REDHAT_KAT_OEAP_SEED, NULL, 0), + OSSL_PARAM_int(OSSL_ASYM_CIPHER_PARAM_REDHAT_FIPS_INDICATOR, NULL), #endif /* FIPS_MODULE */ OSSL_PARAM_uint(OSSL_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION, NULL), OSSL_PARAM_END diff --git a/providers/implementations/kem/rsa_kem.c b/providers/implementations/kem/rsa_kem.c index 8a6f585d0b..f4b7415074 100644 --- a/providers/implementations/kem/rsa_kem.c +++ b/providers/implementations/kem/rsa_kem.c @@ -152,11 +152,39 @@ static int rsakem_decapsulate_init(void *vprsactx, void *vrsa, static int rsakem_get_ctx_params(void *vprsactx, OSSL_PARAM *params) { PROV_RSA_CTX *ctx = (PROV_RSA_CTX *)vprsactx; +#ifdef FIPS_MODULE + OSSL_PARAM *p; +#endif /* defined(FIPS_MODULE) */ + + if (ctx == NULL) + return 0; + +#ifdef FIPS_MODULE + p = OSSL_PARAM_locate(params, OSSL_KEM_PARAM_REDHAT_FIPS_INDICATOR); + if (p != NULL) { + /* NIST SP 800-56Br2 section 6.4.2.1 requires either explicit key + * confirmation (section 6.4.2.3.2), or assurance from a trusted third + * party (section 6.4.2.3.1) for key agreement or key transport, but + * explicit key confirmation is not implemented here and cannot be + * implemented without protocol changes, and the FIPS provider does not + * implement trusted third party validation, since it relies on its + * callers to do that. We must thus mark RSASVE unapproved until we + * have received clarification from NIST on how library modules such as + * OpenSSL should implement TTP validation. */ + int fips_indicator = EVP_PKEY_REDHAT_FIPS_INDICATOR_NOT_APPROVED; + + if (!OSSL_PARAM_set_int(p, fips_indicator)) + return 0; + } +#endif /* defined(FIPS_MODULE) */ - return ctx != NULL; + return 1; } static const OSSL_PARAM known_gettable_rsakem_ctx_params[] = { +#ifdef FIPS_MODULE + OSSL_PARAM_int(OSSL_KEM_PARAM_REDHAT_FIPS_INDICATOR, NULL), +#endif /* defined(FIPS_MODULE) */ OSSL_PARAM_END }; -- 2.41.0 diff -up openssl-3.2.0/util/perl/OpenSSL/paramnames.pm.kem-patch openssl-3.2.0/util/perl/OpenSSL/paramnames.pm --- openssl-3.2.0/util/perl/OpenSSL/paramnames.pm.kem-patch 2024-01-02 12:49:04.598756268 +0100 +++ openssl-3.2.0/util/perl/OpenSSL/paramnames.pm 2024-01-02 12:53:16.466464414 +0100 @@ -406,6 +406,7 @@ my %params = ( 'ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION' => "tls-negotiated-version", 'ASYM_CIPHER_PARAM_IMPLICIT_REJECTION' => "implicit-rejection", 'ASYM_CIPHER_PARAM_REDHAT_KAT_OEAP_SEED' => "redhat-kat-oaep-seed", + 'ASYM_CIPHER_PARAM_REDHAT_FIPS_INDICATOR' => "redhat-fips-indicator", # Encoder / decoder parameters @@ -438,8 +439,9 @@ my %params = ( 'SIGNATURE_PARAM_KAT' => "kat", # KEM parameters - 'KEM_PARAM_OPERATION' => "operation", - 'KEM_PARAM_IKME' => "ikme", + 'KEM_PARAM_OPERATION' => "operation", + 'KEM_PARAM_REDHAT_FIPS_INDICATOR' => "redhat-fips-indicator", + 'KEM_PARAM_IKME' => "ikme", # Capabilities