From a2040b54e2c01c5f734b5d1bfae38c92e73e6bc6 Mon Sep 17 00:00:00 2001 From: Didactic Drunk <1479616+didactic-drunk@users.noreply.github.com> Date: Sun, 22 May 2022 22:58:26 -0700 Subject: [PATCH] .random Allow specifying the Random source --- README.md | 2 +- src/crypto-secret/secret.cr | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f596fa9..c730649 100644 --- a/README.md +++ b/README.md @@ -207,7 +207,7 @@ end **Only intended for use by crypto library authors** -``` +```crystal class MySecret < Crypto::Secret # Choose one include Crypto::Secret::Stateless diff --git a/src/crypto-secret/secret.cr b/src/crypto-secret/secret.cr index 493a136..0875427 100644 --- a/src/crypto-secret/secret.cr +++ b/src/crypto-secret/secret.cr @@ -40,11 +40,13 @@ abstract class Crypto::Secret raise NotImplementedError.new("workaround for lack of `abstract def self.new`") end - def self.random(size : Int32, *uses : Symbol) : Crypto::Secret - for(size, *uses).random + # def self.random(size : Int32, *uses : Symbol, *, random = Random::Secure) : Crypto::Secret + def self.random(size : Int32, *uses : Symbol, **options) : Crypto::Secret + rand = options[:random]? || Random::Secure + for(size, *uses).random(random: rand) end - def self.for(size : Int32, *uses) : Crypto::Secret + def self.for(size : Int32, *uses : Symbol) : Crypto::Secret for(*uses).new(size) end @@ -98,9 +100,9 @@ abstract class Crypto::Secret end # Fills `Secret` with secure random data - def random : self + def random(random = Random::Secure) : self readwrite do |slice| - Random::Secure.random_bytes slice + random.random_bytes slice end self end