File 0283-public_key-Let-options-down-to-crypto-from-public_en.patch of Package erlang

From a171c391cb3c27376e8ea72f4472012005e248e4 Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Tue, 9 Apr 2019 15:37:34 +0200
Subject: [PATCH] public_key: Let options down to crypto from public_encrypt
 etc

---
 lib/public_key/src/public_key.erl | 39 +++++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index 47c5dbb95a..431c77141c 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -406,8 +406,7 @@ decrypt_private(CipherText,
 		Options)
   when is_binary(CipherText),
        is_list(Options) ->
-    Padding = proplists:get_value(rsa_pad, Options, rsa_pkcs1_padding),
-    crypto:private_decrypt(rsa, CipherText, format_rsa_private_key(Key), Padding).
+    crypto:private_decrypt(rsa, CipherText, format_rsa_private_key(Key), default_options(Options)).
 
 %%--------------------------------------------------------------------
 %% Description: Public key decryption using the public key.
@@ -428,8 +427,7 @@ decrypt_public(CipherText, Key) ->
                                      PlainText :: binary() .
 decrypt_public(CipherText, #'RSAPublicKey'{modulus = N, publicExponent = E}, 
 	       Options) when is_binary(CipherText), is_list(Options)  ->
-    Padding = proplists:get_value(rsa_pad, Options, rsa_pkcs1_padding),
-    crypto:public_decrypt(rsa, CipherText,[E, N], Padding).
+    crypto:public_decrypt(rsa, CipherText,[E, N], default_options(Options)).
 
 %%--------------------------------------------------------------------
 %% Description: Public key encryption using the public key.
@@ -451,8 +449,7 @@ encrypt_public(PlainText, Key) ->
                                        CipherText :: binary() .
 encrypt_public(PlainText, #'RSAPublicKey'{modulus=N,publicExponent=E}, 
 	       Options) when is_binary(PlainText), is_list(Options) ->
-    Padding = proplists:get_value(rsa_pad, Options, rsa_pkcs1_padding),
-    crypto:public_encrypt(rsa, PlainText, [E,N], Padding).
+    crypto:public_encrypt(rsa, PlainText, [E,N], default_options(Options)).
 
 %%--------------------------------------------------------------------
 %%
@@ -480,8 +477,7 @@ encrypt_private(PlainText,
   when is_binary(PlainText),
        is_integer(N), is_integer(E), is_integer(D),
        is_list(Options) ->
-    Padding = proplists:get_value(rsa_pad, Options, rsa_pkcs1_padding),
-    crypto:private_encrypt(rsa, PlainText, format_rsa_private_key(Key), Padding).
+    crypto:private_encrypt(rsa, PlainText, format_rsa_private_key(Key), default_options(Options)).
 
 %%--------------------------------------------------------------------
 %% Description: List available group sizes among the pre-computed dh groups
@@ -1234,6 +1230,33 @@ pkix_test_root_cert(Name, Opts) ->
 %%--------------------------------------------------------------------
 %%% Internal functions
 %%--------------------------------------------------------------------
+default_options([]) ->
+    [{rsa_padding, rsa_pkcs1_padding}];
+default_options(Opts) ->
+    case proplists:get_value(rsa_pad, Opts) of
+        undefined ->
+            case proplists:get_value(rsa_padding, Opts) of
+                undefined ->
+                    case lists:dropwhile(fun erlang:is_tuple/1, Opts) of
+                        [Pad|_] ->
+                            set_padding(Pad, Opts);
+                        [] ->
+                            set_padding(rsa_pkcs1_padding, Opts)
+                    end;
+                Pad ->
+                    set_padding(Pad, Opts)
+            end;
+        Pad ->
+            set_padding(Pad, Opts)
+    end.
+
+set_padding(Pad, Opts) ->
+    [{rsa_padding,Pad} | [{T,V} || {T,V} <- Opts,
+                                   T =/= rsa_padding,
+                                   T =/= rsa_pad]
+    ].
+
+
 format_sign_key(Key = #'RSAPrivateKey'{}) ->
     {rsa, format_rsa_private_key(Key)};
 format_sign_key(#'DSAPrivateKey'{p = P, q = Q, g = G, x = X}) ->
-- 
2.16.4

openSUSE Build Service is sponsored by