File 0805-crypto-Test-crypto-privkey_to_pubkey-2.patch of Package erlang

From 4191d8f3baca4cb907c547e6f3b46708ac3e907b Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Fri, 17 Dec 2021 14:48:56 +0100
Subject: [PATCH 1/2] crypto: Test crypto:privkey_to_pubkey/2

---
 lib/crypto/test/crypto_SUITE.erl | 42 +++++++++++++++++++++++++++++---
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index 3f6ec81794..9fe2652f3b 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -112,6 +112,7 @@
          use_all_ec_sign_verify/1,
          use_all_ecdh_generate_compute/1,
          use_all_eddh_generate_compute/1,
+         privkey_to_pubkey/1,
 
          %% Others:
          aes_128_cbc/1,
@@ -346,9 +347,11 @@ groups() ->
      {rsa,                  [], [sign_verify,
                                  public_encrypt,
                                  private_encrypt,
-                                 generate
+                                 generate,
+                                 privkey_to_pubkey
                                 ]},
-     {dss,                  [], [sign_verify
+     {dss,                  [], [sign_verify,
+                                 privkey_to_pubkey
                                  %% Does not work yet:  ,public_encrypt, private_encrypt
                                 ]},
      {ecdsa,                [], [sign_verify, use_all_ec_sign_verify
@@ -1071,6 +1074,23 @@ private_encrypt(Config) when is_list(Config) ->
     Params = proplists:get_value(pub_priv_encrypt, Config, []),
     lists:foreach(fun do_private_encrypt/1, Params).
 
+%%--------------------------------------------------------------------
+privkey_to_pubkey(Config) ->
+    Params = proplists:get_value(privkey_to_pubkey, Config),
+    lists:foreach(fun do_privkey_to_pubkey/1, Params).
+
+do_privkey_to_pubkey({Type, Priv, Pub}) ->
+    ct:log("~p:~p~nType = ~p,~nPriv = ~p,~n  Pub = ~p", [?MODULE,?LINE,Type,Priv,Pub]),
+    case crypto:privkey_to_pubkey(Type, Priv) of
+        Pub ->
+            ok;
+        Priv ->
+            ct:fail("Returned private key", []);
+        Other ->
+            ct:log("~p:~p Other = ~p", [?MODULE,?LINE,Other]),
+            ct:fail("bad", [])
+    end.
+
 %%--------------------------------------------------------------------
 generate_compute() ->
      [{doc, " Test crypto:genarate_key and crypto:compute_key"}].
@@ -1999,9 +2019,11 @@ group_config(rsa, Config) ->
                  [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_mgf1_md,sha}, {rsa_oaep_label, <<"Hej hopp">>}],
                  [{rsa_padding,rsa_pkcs1_oaep_padding}, {rsa_mgf1_md,sha}, {rsa_oaep_md,sha}, {rsa_oaep_label, <<"Hej hopp">>}]
                  ],
-    [{sign_verify,      rsa_sign_verify_tests(Config, Msg, Public, Private, PublicS, PrivateS, SignVerify_OptsToTry)},
+    RsaSignVerify = rsa_sign_verify_tests(Config, Msg, Public, Private, PublicS, PrivateS, SignVerify_OptsToTry),
+    [{sign_verify,      RsaSignVerify},
      {pub_priv_encrypt, gen_rsa_pub_priv_tests(PublicS, PrivateS, MsgPubEnc, PrivEnc_OptsToTry)},
      {pub_pub_encrypt,  gen_rsa_pub_priv_tests(PublicS, PrivateS, MsgPubEnc, PubEnc_OptsToTry)},
+     {privkey_to_pubkey, get_priv_pub_from_sign_verify(RsaSignVerify)},
      {generate, [{rsa, 1024, 3},  {rsa, 2048, 17},  {rsa, 3072, 65537}]}
      | Config];
 group_config(dss = Type, Config) ->
@@ -2023,7 +2045,10 @@ group_config(dss = Type, Config) ->
                      lists:member(Hash, SupportedHashs)],
     MsgPubEnc = <<"7896345786348 Asldi">>,
     PubPrivEnc = [{dss, Public, Private, MsgPubEnc, []}],
-    [{sign_verify, SignVerify}, {pub_priv_encrypt, PubPrivEnc}  | Config];
+    [{sign_verify, SignVerify},
+     {pub_priv_encrypt, PubPrivEnc},
+     {privkey_to_pubkey, get_priv_pub_from_sign_verify(SignVerify)}
+     | Config];
 group_config(ecdsa = Type, Config) ->
     {Private, Public} = ec_key_named(),
     Msg = ec_msg(),
@@ -4409,3 +4434,12 @@ pbkdf2_hmac(Config) when is_list(Config) ->
         not_supported ->
             {skip, "FIPS mode not supported"}
     end.
+
+
+get_priv_pub_from_sign_verify(L) ->
+    lists:foldl(fun get_priv_pub/2, [], L).
+
+get_priv_pub({Type, undefined=_Hash, Private, Public, _Msg, _Signature}, Acc) -> [{Type,Private,Public} | Acc];
+get_priv_pub({Type, _Hash, Public, Private, _Msg}, Acc) -> [{Type,Private,Public} | Acc];
+get_priv_pub({Type, _Hash, Public, Private, _Msg, _Options}, Acc) -> [{Type,Private,Public} | Acc];
+get_priv_pub(_, Acc) -> Acc.
-- 
2.31.1

openSUSE Build Service is sponsored by