aboutsummaryrefslogtreecommitdiffstats
path: root/lib/crypto/src/crypto.erl
diff options
context:
space:
mode:
authorGuilherme Andrade <[email protected]>2017-03-18 17:27:35 +0000
committerGuilherme Andrade <[email protected]>2017-03-18 18:06:36 +0000
commit77039e648c8a62bfc4f0242531d5fd4874b29aad (patch)
tree3ed70566ce80b0feac00a0b36c2cb070c4e5a1b6 /lib/crypto/src/crypto.erl
parente50f63fbb2c974b4b8ad50095ca0b16a846fc161 (diff)
downloadotp-77039e648c8a62bfc4f0242531d5fd4874b29aad.tar.gz
otp-77039e648c8a62bfc4f0242531d5fd4874b29aad.tar.bz2
otp-77039e648c8a62bfc4f0242531d5fd4874b29aad.zip
Support cryptographically strong rand plugin
Diffstat (limited to 'lib/crypto/src/crypto.erl')
-rw-r--r--lib/crypto/src/crypto.erl30
1 files changed, 29 insertions, 1 deletions
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index 2c3208a3d5..4ae7a9cdd6 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -32,6 +32,8 @@
-export([exor/2, strong_rand_bytes/1, mod_pow/3]).
-export([strong_rand_range/1]).
-export([strong_rand_float/0]).
+-export([rand_seed/0]).
+-export([rand_seed_s/0]).
-export([rand_uniform/2]).
-export([block_encrypt/3, block_decrypt/3, block_encrypt/4, block_decrypt/4]).
-export([next_iv/2, next_iv/3]).
@@ -290,6 +292,8 @@ stream_decrypt(State, Data0) ->
-spec strong_rand_bytes(non_neg_integer()) -> binary().
-spec strong_rand_range(pos_integer() | binary()) -> binary().
-spec strong_rand_float() -> float().
+-spec rand_seed() -> rand:state().
+-spec rand_seed_s() -> rand:state().
-spec rand_uniform(crypto_integer(), crypto_integer()) ->
crypto_integer().
@@ -311,7 +315,6 @@ strong_rand_range(BinRange) when is_binary(BinRange) ->
<<BinResult/binary>> ->
BinResult
end.
-
strong_rand_range_nif(_BinRange) -> ?nif_stub.
@@ -325,6 +328,31 @@ strong_rand_float() ->
Value - 1.0.
+rand_seed() ->
+ rand:seed(rand_seed_s()).
+
+rand_seed_s() ->
+ {#{ type => crypto,
+ max => infinity,
+ next => fun rand_plugin_next/1,
+ uniform => fun rand_plugin_uniform/1,
+ uniform_n => fun rand_plugin_uniform/2,
+ jump => fun rand_plugin_jump/1},
+ no_seed}.
+
+rand_plugin_next(Seed) ->
+ {bytes_to_integer(strong_rand_range(1 bsl 64)), Seed}.
+
+rand_plugin_uniform(State) ->
+ {strong_rand_float(), State}.
+
+rand_plugin_uniform(Max, State) ->
+ {bytes_to_integer(strong_rand_range(Max)) + 1, State}.
+
+rand_plugin_jump(State) ->
+ State.
+
+
rand_uniform(From,To) when is_binary(From), is_binary(To) ->
case rand_uniform_nif(From,To) of
<<Len:32/integer, MSB, Rest/binary>> when MSB > 127 ->