File 0430-crypto-Fix-SHAKE-128-256-xoflen-default-for-OpenSSL-.patch of Package erlang
From f370d9f9d5e832aa3def5caad2b08b61acd97ea7 Mon Sep 17 00:00:00 2001
From: Fredrik Frantzen <frazze@erlang.org>
Date: Tue, 10 Jun 2025 10:42:49 +0200
Subject: [PATCH] crypto: Fix SHAKE-128/256 xoflen default for OpenSSL 3.4+ in
hash_nif
Co-authored-by: Sverker Eriksson <sverker@erlang.org>
---
lib/crypto/c_src/hash.c | 30 ++++++++++++++++++++++++++++++
lib/crypto/test/crypto_SUITE.erl | 6 ++++++
2 files changed, 36 insertions(+)
diff --git a/lib/crypto/c_src/hash.c b/lib/crypto/c_src/hash.c
index e821464105..5757c30d24 100644
--- a/lib/crypto/c_src/hash.c
+++ b/lib/crypto/c_src/hash.c
@@ -117,6 +117,36 @@ ERL_NIF_TERM hash_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
if (!enif_inspect_iolist_as_binary(env, argv[1], &data))
return EXCP_BADARG_N(env, 1, "Not iolist");
+#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(3,4,0)
+ /* Set xoflen for SHAKE digests if needed */
+ if (digp->xof_default_length) {
+ EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+ OSSL_PARAM params[2];
+
+ if (!ctx) {
+ return EXCP_ERROR(env, "EVP_MD_CTX_new failed");
+ }
+ params[0] = OSSL_PARAM_construct_uint("xoflen", &digp->xof_default_length);
+ params[1] = OSSL_PARAM_construct_end();
+ if (EVP_DigestInit_ex2(ctx, md, params) != 1) {
+ assign_goto(ret, done, EXCP_ERROR(env, "EVP_DigestInit failed"));
+ }
+ ret_size = digp->xof_default_length;
+ if ((outp = enif_make_new_binary(env, ret_size, &ret)) == NULL) {
+ assign_goto(ret, done, EXCP_ERROR(env, "Can't allocate binary"));
+ }
+ if (EVP_DigestUpdate(ctx, data.data, data.size) != 1) {
+ assign_goto(ret, done, EXCP_ERROR(env, "EVP_DigestUpdate failed"));
+ }
+ if (EVP_DigestFinalXOF(ctx, outp, ret_size) != 1) {
+ assign_goto(ret, done, EXCP_ERROR(env, "EVP_DigestFinalXOF failed"));
+ }
+ CONSUME_REDS(env, data);
+ done:
+ EVP_MD_CTX_free(ctx);
+ return ret;
+ }
+#endif
ret_size = (unsigned)EVP_MD_size(md);
ASSERT(0 < ret_size && ret_size <= EVP_MAX_MD_SIZE);
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index dfdf8d8ffb..1abba36585 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -1589,6 +1589,12 @@ hash_xof(Type, DefaultLen, [Msg | RestMsg], [Digest | RestDigest], [Length | Res
ok;
Other2 ->
ct:fail({{crypto, hash_xof, [Type, Msg, Length]}, {expected, Digest}, {got, Other2}})
+ end,
+ case crypto:hash(Type, Msg) of
+ Digest ->
+ ok;
+ Other3 ->
+ ct:fail({{crypto, hash, [Type, Msg]}, {expected, Digest}, {got, Other3}})
end;
_ ->
ok % No crypto:hash_init({Type,Length}) support yet
--
2.43.0