You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
4.9 KiB
115 lines
4.9 KiB
From 8e388e194e665286a8996d7d5926bab5c1a6b4f9 Mon Sep 17 00:00:00 2001
|
|
From: Dmitry Belyavskiy <dbelyavs@redhat.com>
|
|
Date: Mon, 21 Aug 2023 15:46:40 +0200
|
|
Subject: [PATCH 38/48]
|
|
0083-hmac-Add-explicit-FIPS-indicator-for-key-length.patch
|
|
|
|
Patch-name: 0083-hmac-Add-explicit-FIPS-indicator-for-key-length.patch
|
|
Patch-id: 83
|
|
---
|
|
include/crypto/evp.h | 7 +++++++
|
|
include/openssl/evp.h | 3 +++
|
|
providers/implementations/macs/hmac_prov.c | 17 +++++++++++++++++
|
|
4 files changed, 28 insertions(+)
|
|
|
|
diff --git a/include/crypto/evp.h b/include/crypto/evp.h
|
|
index aa07153441..a13127bd59 100644
|
|
--- a/include/crypto/evp.h
|
|
+++ b/include/crypto/evp.h
|
|
@@ -196,6 +196,13 @@ const EVP_PKEY_METHOD *ossl_ed448_pkey_method(void);
|
|
const EVP_PKEY_METHOD *ossl_rsa_pkey_method(void);
|
|
const EVP_PKEY_METHOD *ossl_rsa_pss_pkey_method(void);
|
|
|
|
+#ifdef FIPS_MODULE
|
|
+/* NIST SP 800-131Ar2, Table 9: Approval Status of MAC Algorithms specifies key
|
|
+ * lengths < 112 bytes are disallowed for HMAC generation and legacy use for
|
|
+ * HMAC verification. */
|
|
+# define EVP_HMAC_GEN_FIPS_MIN_KEY_LEN (112 / 8)
|
|
+#endif
|
|
+
|
|
struct evp_mac_st {
|
|
OSSL_PROVIDER *prov;
|
|
int name_id;
|
|
diff --git a/include/openssl/evp.h b/include/openssl/evp.h
|
|
index 86f4e22c70..615857caf5 100644
|
|
--- a/include/openssl/evp.h
|
|
+++ b/include/openssl/evp.h
|
|
@@ -1194,6 +1194,9 @@ void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx,
|
|
void *arg);
|
|
|
|
/* MAC stuff */
|
|
+# define EVP_MAC_REDHAT_FIPS_INDICATOR_UNDETERMINED 0
|
|
+# define EVP_MAC_REDHAT_FIPS_INDICATOR_APPROVED 1
|
|
+# define EVP_MAC_REDHAT_FIPS_INDICATOR_NOT_APPROVED 2
|
|
|
|
EVP_MAC *EVP_MAC_fetch(OSSL_LIB_CTX *libctx, const char *algorithm,
|
|
const char *properties);
|
|
diff --git a/providers/implementations/macs/hmac_prov.c b/providers/implementations/macs/hmac_prov.c
|
|
index 52ebb08b8f..cf5c3ecbe7 100644
|
|
--- a/providers/implementations/macs/hmac_prov.c
|
|
+++ b/providers/implementations/macs/hmac_prov.c
|
|
@@ -21,6 +21,8 @@
|
|
#include <openssl/evp.h>
|
|
#include <openssl/hmac.h>
|
|
|
|
+#include "crypto/evp.h"
|
|
+
|
|
#include "internal/ssl3_cbc.h"
|
|
|
|
#include "prov/implementations.h"
|
|
@@ -244,6 +246,9 @@ static int hmac_final(void *vmacctx, unsigned char *out, size_t *outl,
|
|
static const OSSL_PARAM known_gettable_ctx_params[] = {
|
|
OSSL_PARAM_size_t(OSSL_MAC_PARAM_SIZE, NULL),
|
|
OSSL_PARAM_size_t(OSSL_MAC_PARAM_BLOCK_SIZE, NULL),
|
|
+#ifdef FIPS_MODULE
|
|
+ OSSL_PARAM_int(OSSL_MAC_PARAM_REDHAT_FIPS_INDICATOR, NULL),
|
|
+#endif /* defined(FIPS_MODULE) */
|
|
OSSL_PARAM_END
|
|
};
|
|
static const OSSL_PARAM *hmac_gettable_ctx_params(ossl_unused void *ctx,
|
|
@@ -265,6 +270,18 @@ static int hmac_get_ctx_params(void *vmacctx, OSSL_PARAM params[])
|
|
&& !OSSL_PARAM_set_int(p, hmac_block_size(macctx)))
|
|
return 0;
|
|
|
|
+#ifdef FIPS_MODULE
|
|
+ if ((p = OSSL_PARAM_locate(params, OSSL_MAC_PARAM_REDHAT_FIPS_INDICATOR)) != NULL) {
|
|
+ int fips_indicator = EVP_MAC_REDHAT_FIPS_INDICATOR_APPROVED;
|
|
+ /* NIST SP 800-131Ar2, Table 9: Approval Status of MAC Algorithms
|
|
+ * specifies key lengths < 112 bytes are disallowed for HMAC generation
|
|
+ * and legacy use for HMAC verification. */
|
|
+ if (macctx->keylen < EVP_HMAC_GEN_FIPS_MIN_KEY_LEN)
|
|
+ fips_indicator = EVP_MAC_REDHAT_FIPS_INDICATOR_NOT_APPROVED;
|
|
+ return OSSL_PARAM_set_int(p, fips_indicator);
|
|
+ }
|
|
+#endif /* defined(FIPS_MODULE) */
|
|
+
|
|
return 1;
|
|
}
|
|
|
|
--
|
|
2.41.0
|
|
|
|
diff -up openssl-3.2.0/util/perl/OpenSSL/paramnames.pm.hmac-patch openssl-3.2.0/util/perl/OpenSSL/paramnames.pm
|
|
--- openssl-3.2.0/util/perl/OpenSSL/paramnames.pm.hmac-patch 2024-01-02 12:18:16.909596613 +0100
|
|
+++ openssl-3.2.0/util/perl/OpenSSL/paramnames.pm 2024-01-02 12:20:18.465886160 +0100
|
|
@@ -137,12 +137,13 @@ my %params = (
|
|
# If "engine",or "properties",are specified, they should always be paired
|
|
# with "cipher",or "digest".
|
|
|
|
- 'MAC_PARAM_CIPHER' => '*ALG_PARAM_CIPHER', # utf8 string
|
|
- 'MAC_PARAM_DIGEST' => '*ALG_PARAM_DIGEST', # utf8 string
|
|
- 'MAC_PARAM_PROPERTIES' => '*ALG_PARAM_PROPERTIES', # utf8 string
|
|
- 'MAC_PARAM_SIZE' => "size", # size_t
|
|
- 'MAC_PARAM_BLOCK_SIZE' => "block-size", # size_t
|
|
- 'MAC_PARAM_TLS_DATA_SIZE' => "tls-data-size", # size_t
|
|
+ 'MAC_PARAM_CIPHER' => '*ALG_PARAM_CIPHER', # utf8 string
|
|
+ 'MAC_PARAM_DIGEST' => '*ALG_PARAM_DIGEST', # utf8 string
|
|
+ 'MAC_PARAM_PROPERTIES' => '*ALG_PARAM_PROPERTIES', # utf8 string
|
|
+ 'MAC_PARAM_SIZE' => "size", # size_t
|
|
+ 'MAC_PARAM_BLOCK_SIZE' => "block-size", # size_t
|
|
+ 'MAC_PARAM_TLS_DATA_SIZE' => "tls-data-size", # size_t
|
|
+ 'MAC_PARAM_REDHAT_FIPS_INDICATOR' => "redhat-fips-indicator", # size_t
|
|
|
|
# KDF / PRF parameters
|
|
'KDF_PARAM_SECRET' => "secret", # octet string
|