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], &params[i++]))  {
+        if (!get_ossl_BN_param_from_bin(env, "priv",  argv[0], &params[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], &params[i++]))
+    if (!get_ossl_BN_param_from_bin(env, "pub",  argv[0], &params[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], &params[0]))
+    if (!get_ossl_BN_param_from_bin(env, "priv",  argv[1], &params[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

openSUSE Build Service is sponsored by