File 8651-crypto-pbkdf2_hmac-5-error-ERR-error-ERR-FileInfo-De.patch of Package erlang
From 814234aa91b52b744bb7251b15a6e4b19df4e05d Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Tue, 8 Mar 2022 11:30:35 +0100
Subject: [PATCH 1/8] crypto:pbkdf2_hmac/5: error:ERR ->
error:{ERR,FileInfo,Description}
---
lib/crypto/c_src/common.h | 2 ++
lib/crypto/c_src/pbkdf2_hmac.c | 36 +++++++++++++++-------------------
lib/crypto/doc/src/crypto.xml | 4 +---
lib/crypto/src/crypto.erl | 2 +-
4 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/lib/crypto/c_src/common.h b/lib/crypto/c_src/common.h
index 593a58373f..911652b023 100644
--- a/lib/crypto/c_src/common.h
+++ b/lib/crypto/c_src/common.h
@@ -46,4 +46,6 @@ ERL_NIF_TERM raise_exception(ErlNifEnv* env, ERL_NIF_TERM id, int arg_num, char*
#define EXCP_NOTSUP_N(Env, ArgNum, Str) raise_exception((Env), atom_notsup, (ArgNum), (Str), __FILE__, __LINE__)
#define EXCP_BADARG_N(Env, ArgNum, Str) raise_exception((Env), atom_badarg, (ArgNum), (Str), __FILE__, __LINE__)
+#define assign_goto(Var, Goto, CALL) {Var = (CALL); goto Goto;}
+
#endif /* E_COMMON_H__ */
diff --git a/lib/crypto/c_src/pbkdf2_hmac.c b/lib/crypto/c_src/pbkdf2_hmac.c
index 7eec603d9c..461932eba7 100644
--- a/lib/crypto/c_src/pbkdf2_hmac.c
+++ b/lib/crypto/c_src/pbkdf2_hmac.c
@@ -30,43 +30,38 @@ static ERL_NIF_TERM pbkdf2_hmac(ErlNifEnv* env, int argc,
ErlNifUInt64 iter, keylen;
struct digest_type_t* digp = NULL;
- ASSERT(argc == 5);
-
if ((digp = get_digest_type(argv[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad digest type");
if (digp->md.p == NULL)
- goto bad_arg;
- if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0) {
- goto bad_arg;
- }
+ return EXCP_BADARG_N(env, 0, "md.p is not NULL");
+ if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0)
+ return EXCP_BADARG_N(env, 0, "Not eligible digest type");
if (!enif_inspect_binary(env, argv[1], &pass))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 1, "Not binary");
+
if (!enif_inspect_binary(env, argv[2], &salt))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 2, "Not binary");
/* We already checked iter<0 and keylen<0 in pbkdf2_hmac_nif */
if (!enif_get_uint64(env, argv[3], &iter))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 3, "Not integer");
if (!enif_get_uint64(env, argv[4], &keylen))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 4, "Not integer");
if (!enif_alloc_binary(keylen, &out))
- goto err;
+ return EXCP_ERROR(env, "Can't allocate binary");
if (!PKCS5_PBKDF2_HMAC((const char *)pass.data, pass.size,
salt.data, salt.size, iter,
digp->md.p,
keylen, out.data)) {
enif_release_binary(&out);
- goto err;
+ return EXCP_ERROR(env, "Low-level call failed");
}
return enif_make_binary(env, &out);
- bad_arg:
- err:
- return enif_make_badarg(env);
}
#endif /* HAS_PKCS5_PBKDF2_HMAC */
diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml
index c4cde105c6..34abbfa279 100644
--- a/lib/crypto/doc/src/crypto.xml
+++ b/lib/crypto/doc/src/crypto.xml
@@ -1982,12 +1982,10 @@ FloatValue = rand:uniform(). % again
<name name="pbkdf2_hmac" arity="5" since="OTP 24.2"/>
<fsummary>PBKDF2 in combination with HMAC</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
PKCS #5 PBKDF2 (Password-Based Key Derivation Function 2) in combination with HMAC.
</p>
- <p>
- The function raises a <c>error:badarg</c> if the parameters are in wrong format.
- </p>
</desc>
</func>
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index d9627b2f6f..9d54849ee6 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -580,7 +580,7 @@ enable_fips_mode_nif(_) -> ?nif_stub.
KeyLen :: pos_integer(),
Result :: binary().
pbkdf2_hmac(Digest, Pass, Salt, Iter, KeyLen) ->
- pbkdf2_hmac_nif(Digest, Pass, Salt, Iter, KeyLen).
+ ?nif_call(pbkdf2_hmac_nif(Digest, Pass, Salt, Iter, KeyLen)).
pbkdf2_hmac_nif(_, _, _, _, _) -> ?nif_stub.
--
2.34.1