File openssl-1_1-ossl-sli-020-PBKDF2-HMAC-size-SLI.patch of Package openssl-1_1.37526

diff --git a/crypto/fips/fips_sli.c b/crypto/fips/fips_sli.c
index a31f4d2..a92579d 100644
--- a/crypto/fips/fips_sli.c
+++ b/crypto/fips/fips_sli.c
@@ -140,6 +140,7 @@ typedef enum hash_usage_e {
     HASH_SIGVER,
     HASH_KDF_SSHKDF,
     HASH_KDF_PBKDF2,
+    HASH_KDF_HKDF,
     HASH_KDF_TLS,
     HASH_RNG,
     HASH_MAC,
@@ -161,8 +162,25 @@ static FIPS_STATUS get_fips_hash_status(const EVP_MD *md, HASH_USAGE u) {
         case NID_md5_sha1:
         default:
             return FIPS_NONAPPROVED;
-        }
+        } 
     case HASH_KDF_PBKDF2:
+    case HASH_KDF_HKDF:
+	switch (EVP_MD_type(md)) {
+	//case NID_sha1:
+	case NID_sha224:
+	case NID_sha256:
+	case NID_sha384:
+	case NID_sha512:
+	case NID_sha512_224:
+	case NID_sha512_256:
+	case NID_sha3_224:
+	case NID_sha3_256:
+	case NID_sha3_384:
+	case NID_sha3_512:
+	    return FIPS_APPROVED;
+	default:
+	    return FIPS_NONAPPROVED;
+	} 
     case HASH_MAC:
         switch (EVP_MD_type(md)) {
         case NID_sha224:
@@ -239,6 +257,9 @@ make_fips_sli_check_hash(HMAC_CTX, mac, HASH_MAC)
 FIPS_STATUS fips_sli_get_hash_status_sshkdf(const EVP_MD * md) {
     return get_fips_hash_status(md, HASH_KDF_SSHKDF);
 }
+FIPS_STATUS fips_sli_get_hash_status_hkdf(const EVP_MD * md) {
+    return get_fips_hash_status(md, HASH_KDF_HKDF);
+}
 FIPS_STATUS fips_sli_get_hash_status_pbkdf2(const EVP_MD * md) {
     return get_fips_hash_status(md, HASH_KDF_PBKDF2);
 }
diff --git a/crypto/kdf/hkdf.c b/crypto/kdf/hkdf.c
index 12f4167..616a542 100644
--- a/crypto/kdf/hkdf.c
+++ b/crypto/kdf/hkdf.c
@@ -16,6 +16,7 @@
 #include "internal/cryptlib.h"
 #include "crypto/evp.h"
 #include "kdf_local.h"
+#include "internal/fips_sli_local.h"
 
 #define HKDF_MAXBUF 1024
 
@@ -222,8 +223,10 @@ static int kdf_hkdf_derive(EVP_KDF_IMPL *impl, unsigned char *key,
     }
 }
 
-static int kdf_hkdf_fips_sli_is_approved(EVP_KDF_IMPL *impl) {
-    if (impl->key_len < 112)
+static int kdf_hkdf_fips_sli_is_approved(const EVP_KDF_IMPL *impl) {
+    if (fips_sli_get_hash_status_hkdf(impl->md) != FIPS_APPROVED)
+        return 0;
+    if (impl->key_len < 112/8)
         return 0;
     return 1;
 }
diff --git a/crypto/kdf/pbkdf2.c b/crypto/kdf/pbkdf2.c
index 2310580..25d526a 100644
--- a/crypto/kdf/pbkdf2.c
+++ b/crypto/kdf/pbkdf2.c
@@ -34,6 +34,14 @@ struct evp_kdf_impl_st {
     FIPS_STATUS sli; /* Service Level Indicator */
 };
 
+static int kdf_pbkdf_fips_sli_is_approved(const EVP_KDF_IMPL *impl) {
+    if (fips_sli_get_hash_status_pbkdf2(impl->md) != FIPS_APPROVED)
+        return 0;
+    if (impl->pass_len < 112/8)
+        return 0;
+    return 1;
+}
+
 static ossl_unused int fips_sli_is_approved_struct_evp_kdf_impl_st(const struct evp_kdf_impl_st *ctx);
 fips_sli_define_basic_for(static, struct_evp_kdf_impl_st, struct evp_kdf_impl_st)
 
@@ -207,7 +215,7 @@ const EVP_KDF_METHOD pbkdf2_kdf_meth = {
     kdf_pbkdf2_ctrl_str,
     NULL,
     kdf_pbkdf2_derive,
-    fips_sli_is_approved_struct_evp_kdf_impl_st
+    kdf_pbkdf_fips_sli_is_approved
 };
 
 /*
diff --git a/include/internal/fips_sli_local.h b/include/internal/fips_sli_local.h
index e444af8..2b8b735 100644
--- a/include/internal/fips_sli_local.h
+++ b/include/internal/fips_sli_local.h
@@ -66,8 +66,10 @@ void fips_sli_check_hash_sigver_EVP_MD_CTX(EVP_MD_CTX * ctx, const EVP_MD * md);
 void fips_sli_check_hash_siggen_EVP_PKEY_CTX(EVP_PKEY_CTX * ctx, const EVP_MD * md);
 void fips_sli_check_hash_sigver_EVP_PKEY_CTX(EVP_PKEY_CTX * ctx, const EVP_MD * md);
 void fips_sli_check_hash_mac_HMAC_CTX(HMAC_CTX * ctx, const EVP_MD * md);
+void fips_sli_check_hash_pbkdf2_HMAC_CTX(EVP_KDF_CTX * ctx, const EVP_MD * md);
 
 FIPS_STATUS fips_sli_get_hash_status_sshkdf(const EVP_MD * md);
+FIPS_STATUS fips_sli_get_hash_status_hkdf(const EVP_MD * md);
 FIPS_STATUS fips_sli_get_hash_status_pbkdf2(const EVP_MD * md);
 FIPS_STATUS fips_sli_get_hash_status_kdf_tls1_prf(const EVP_MD * md);
 FIPS_STATUS fips_sli_get_kdf_keylen_status(size_t keylen_bytes);
openSUSE Build Service is sponsored by