File 2572-Refactor-pbkdf2-eligible-hash-check.patch of Package erlang
From 60a15f0bb219a7b0aeb143036fd8434bcbe4211b Mon Sep 17 00:00:00 2001
From: gearnode <bryan@frimin.fr>
Date: Thu, 25 Nov 2021 13:08:31 +0100
Subject: [PATCH 2/4] Refactor pbkdf2 eligible hash check
---
lib/crypto/c_src/digest.c | 10 ++++-----
lib/crypto/c_src/digest.h | 1 +
lib/crypto/c_src/openssl_config.h | 1 +
lib/crypto/c_src/pbkdf2_hmac.c | 34 +++----------------------------
lib/crypto/test/crypto_SUITE.erl | 2 +-
5 files changed, 11 insertions(+), 37 deletions(-)
diff --git a/lib/crypto/c_src/digest.c b/lib/crypto/c_src/digest.c
index d4b1813e11..125784ac42 100644
--- a/lib/crypto/c_src/digest.c
+++ b/lib/crypto/c_src/digest.c
@@ -46,9 +46,9 @@ static struct digest_type_t digest_types[] =
#endif
},
- {{"sha"}, 0, {&EVP_sha1}},
+ {{"sha"}, PBKDF2_ELIGIBLE_DIGEST, {&EVP_sha1}},
- {{"sha224"}, 0,
+ {{"sha224"}, PBKDF2_ELIGIBLE_DIGEST,
#ifdef HAVE_SHA224
{&EVP_sha224}
#else
@@ -56,7 +56,7 @@ static struct digest_type_t digest_types[] =
#endif
},
- {{"sha256"}, 0,
+ {{"sha256"}, PBKDF2_ELIGIBLE_DIGEST,
#ifdef HAVE_SHA256
{&EVP_sha256}
#else
@@ -64,7 +64,7 @@ static struct digest_type_t digest_types[] =
#endif
},
- {{"sha384"}, 0,
+ {{"sha384"}, PBKDF2_ELIGIBLE_DIGEST,
#ifdef HAVE_SHA384
{&EVP_sha384}
#else
@@ -72,7 +72,7 @@ static struct digest_type_t digest_types[] =
#endif
},
- {{"sha512"}, 0,
+ {{"sha512"}, PBKDF2_ELIGIBLE_DIGEST,
#ifdef HAVE_SHA512
{&EVP_sha512}
#else
diff --git a/lib/crypto/c_src/digest.h b/lib/crypto/c_src/digest.h
index a1cfb4d4cb..8d8cb243d1 100644
--- a/lib/crypto/c_src/digest.h
+++ b/lib/crypto/c_src/digest.h
@@ -37,6 +37,7 @@ struct digest_type_t {
/* masks in the flags field if digest_type_t */
#define NO_FIPS_DIGEST 1
+#define PBKDF2_ELIGIBLE_DIGEST 2
#ifdef FIPS_SUPPORT
/* May have FIPS support, must check dynamically if it is enabled */
diff --git a/lib/crypto/c_src/openssl_config.h b/lib/crypto/c_src/openssl_config.h
index 63238105f7..ac089b6ba8 100644
--- a/lib/crypto/c_src/openssl_config.h
+++ b/lib/crypto/c_src/openssl_config.h
@@ -313,6 +313,7 @@
# ifdef RSA_PKCS1_PSS_PADDING
# define HAVE_RSA_PKCS1_PSS_PADDING
# endif
+# define HAS_PKCS5_PBKDF2_HMAC
#endif
#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION(0,9,8,'h') \
diff --git a/lib/crypto/c_src/pbkdf2_hmac.c b/lib/crypto/c_src/pbkdf2_hmac.c
index aa9f27c93d..7eec603d9c 100644
--- a/lib/crypto/c_src/pbkdf2_hmac.c
+++ b/lib/crypto/c_src/pbkdf2_hmac.c
@@ -16,7 +16,6 @@
* limitations under the License.
*
* %CopyrightEnd%
-
*/
#include "common.h"
@@ -30,7 +29,6 @@ ERL_NIF_TERM pbkdf2_hmac_nif(ErlNifEnv* env, int argc,
ErlNifBinary pass, salt, out;
ErlNifUInt64 iter, keylen;
struct digest_type_t* digp = NULL;
- const EVP_MD* digest;
ASSERT(argc == 5);
@@ -38,34 +36,8 @@ ERL_NIF_TERM pbkdf2_hmac_nif(ErlNifEnv* env, int argc,
goto bad_arg;
if (digp->md.p == NULL)
goto bad_arg;
-
- switch (EVP_MD_type(digp->md.p))
- {
- case NID_sha1:
- digest = EVP_sha1();
- break;
-#ifdef HAVE_SHA224
- case NID_sha224:
- digest = EVP_sha224();
- break;
-#endif
-#ifdef HAVE_SHA256
- case NID_sha256:
- digest = EVP_sha256();
- break;
-#endif
-#ifdef HAVE_SHA384
- case NID_sha384:
- digest = EVP_sha384();
- break;
-#endif
-#ifdef HAVE_SHA512
- case NID_sha512:
- digest = EVP_sha512();
- break;
-#endif
- default:
- goto err;
+ if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0) {
+ goto bad_arg;
}
if (!enif_inspect_binary(env, argv[1], &pass))
@@ -87,7 +59,7 @@ ERL_NIF_TERM pbkdf2_hmac_nif(ErlNifEnv* env, int argc,
if (!PKCS5_PBKDF2_HMAC((const char *)pass.data, pass.size,
salt.data, salt.size, iter,
- digest,
+ digp->md.p,
keylen, out.data)) {
enif_release_binary(&out);
goto err;
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index 182af02cb0..b8de45de8b 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -4407,7 +4407,7 @@ pbkdf2_hmac(Config) when is_list(Config) ->
F(binary:encode_unsigned(16#f09d849e), <<"EXAMPLE.COMpianist">>, 50, 32)
catch
error:{notsup,{"pbkdf2_hmac.c", _}, "Unsupported CRYPTO_PKCS5_PBKDF2_HMAC"} ->
- {skip, "No Unsupported CRYPTO_PKCS5_PBKDF2_HMAC"}
+ {skip, "No CRYPTO_PKCS5_PBKDF2_HMAC"}
end.
--
2.31.1