File 8703-crypto-Extend-bn.patch of Package erlang
From 993d6b8f80bbb31c528c9b666580f4af68d0d839 Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Thu, 21 Apr 2022 20:04:12 +0200
Subject: [PATCH 3/7] crypto: Extend bn.*
---
lib/crypto/c_src/bn.c | 22 +++++++++++++++++++---
lib/crypto/c_src/bn.h | 5 ++++-
lib/crypto/c_src/dh.c | 6 +++---
3 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/lib/crypto/c_src/bn.c b/lib/crypto/c_src/bn.c
index 838173c5e8..f06ed9002e 100644
--- a/lib/crypto/c_src/bn.c
+++ b/lib/crypto/c_src/bn.c
@@ -196,12 +196,28 @@ ERL_NIF_TERM bn2term(ErlNifEnv* env, size_t size, const BIGNUM *bn)
#ifdef HAS_3_0_API
-int get_ossl_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest)
+int get_ossl_octet_string_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest)
+{
+ ErlNifBinary tmp;
+
+ if (!enif_inspect_binary(env, bin, &tmp)) return 0;
+
+ *dest = OSSL_PARAM_construct_octet_string(key, tmp.data, tmp.size);
+ return 1;
+}
+
+
+int get_ossl_BN_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest)
+{
+ return get_ossl_BN_param_from_bin_sz(env, key, bin, dest, NULL);
+}
+
+int get_ossl_BN_param_from_bin_sz(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest, size_t *size)
{
BIGNUM *bn = NULL;
ErlNifBinary tmp;
- if (!get_bn_from_bin(env, bin, &bn) ||
+ if (!get_bn_from_bin_sz(env, bin, &bn, size) ||
!enif_inspect_binary(env, bin_from_bn(env,bn), &tmp) || // Allocate buf
BN_bn2nativepad(bn, tmp.data, tmp.size) < 0) {// Fill with BN in right endianity
if (bn) BN_free(bn);
@@ -219,7 +235,7 @@ int get_ossl_param_from_bin_in_list(ErlNifEnv* env, char* key, ERL_NIF_TERM *lis
return
enif_get_list_cell(env, *listcell, &head, listcell) &&
- get_ossl_param_from_bin(env, key, head, dest);
+ get_ossl_BN_param_from_bin(env, key, head, dest);
}
#endif
diff --git a/lib/crypto/c_src/bn.h b/lib/crypto/c_src/bn.h
index f0b447970f..5e207aed2d 100644
--- a/lib/crypto/c_src/bn.h
+++ b/lib/crypto/c_src/bn.h
@@ -35,7 +35,10 @@ int get_bn_from_bin(ErlNifEnv* env, ERL_NIF_TERM term, BIGNUM** bnp);
int get_bn_from_bin_sz(ErlNifEnv* env, ERL_NIF_TERM term, BIGNUM** bnp, size_t* binsize);
#ifdef HAS_3_0_API
-int get_ossl_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest);
+int get_ossl_octet_string_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest);
+int get_ossl_BN_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest);
+int get_ossl_BN_param_from_bin_sz(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest, size_t *size);
+
int get_ossl_param_from_bin_in_list(ErlNifEnv* env, char* key, ERL_NIF_TERM *listcell, OSSL_PARAM *dest);
#endif
diff --git a/lib/crypto/c_src/dh.c b/lib/crypto/c_src/dh.c
index ebf47cae3c..4bcab0ec6e 100644
--- a/lib/crypto/c_src/dh.c
+++ b/lib/crypto/c_src/dh.c
@@ -53,7 +53,7 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
/* Fetch parameters and assign them to params[] */
if (argv[0] != atom_undefined)
- if (!get_ossl_param_from_bin(env, "priv", argv[0], ¶ms[i++])) {
+ if (!get_ossl_BN_param_from_bin(env, "priv", argv[0], ¶ms[i++])) {
ret = EXCP_BADARG_N(env, 0, "PrivKeyIn");
goto done;
}
@@ -183,7 +183,7 @@ ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
/* Build peer_pkey */
- if (!get_ossl_param_from_bin(env, "pub", argv[0], ¶ms[i++]))
+ if (!get_ossl_BN_param_from_bin(env, "pub", argv[0], ¶ms[i++]))
assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad peer public key; binary expected"));
{ /*argv[2] - the lists [P,G] */
@@ -211,7 +211,7 @@ ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
assign_goto(ret, err, EXCP_ERROR(env, "Can't do fromdata"));
/* Build own_pkey. Just replace the pub key with the priv key in params */
- if (!get_ossl_param_from_bin(env, "priv", argv[1], ¶ms[0]))
+ if (!get_ossl_BN_param_from_bin(env, "priv", argv[1], ¶ms[0]))
assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad peer public key; binary expected"));
own_pctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL);
--
2.35.3