[random] add a seed capability with export/import from integer.
It decomposes the drgNew call that was gathering entropy then initializing a ChaChaDRG, into 2 new calls seedNew and drgNewSeed. drgNew remains unchanged. The integer importing capability, should be used when wanting to bring reproducibility to a debugging problem or for testing, otherwise it's probably a bad idea to use.
This commit is contained in:
parent
149bfa6010
commit
d7e26e34ee
@ -5,14 +5,21 @@
|
||||
-- Stability : stable
|
||||
-- Portability : good
|
||||
--
|
||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||
module Crypto.Random
|
||||
(
|
||||
-- * Deterministic instances
|
||||
ChaChaDRG
|
||||
, SystemDRG
|
||||
, Seed
|
||||
-- * Seed
|
||||
, seedNew
|
||||
, seedFromInteger
|
||||
, seedToInteger
|
||||
-- * Deterministic Random class
|
||||
, getSystemDRG
|
||||
, drgNew
|
||||
, drgNewSeed
|
||||
, drgNewTest
|
||||
, withDRG
|
||||
, withRandomBytes
|
||||
@ -25,14 +32,37 @@ module Crypto.Random
|
||||
import Crypto.Random.Types
|
||||
import Crypto.Random.ChaChaDRG
|
||||
import Crypto.Random.SystemDRG
|
||||
import Data.ByteArray (ByteArray, ScrubbedBytes)
|
||||
import Data.ByteArray (ByteArray, ByteArrayAccess, ScrubbedBytes)
|
||||
import Crypto.Internal.Imports
|
||||
|
||||
import qualified Crypto.Number.Serialize as Serialize
|
||||
|
||||
newtype Seed = Seed ScrubbedBytes
|
||||
deriving (ByteArrayAccess)
|
||||
|
||||
-- Length for ChaCha DRG seed
|
||||
seedLength :: Int
|
||||
seedLength = 40
|
||||
|
||||
-- | Create a new Seed from system entropy
|
||||
seedNew :: MonadRandom randomly => randomly Seed
|
||||
seedNew = Seed `fmap` getRandomBytes seedLength
|
||||
|
||||
-- | Convert a Seed to an integer
|
||||
seedToInteger :: Seed -> Integer
|
||||
seedToInteger (Seed b) = Serialize.os2ip b
|
||||
|
||||
-- | Convert an integer to a Seed
|
||||
seedFromInteger :: Integer -> Seed
|
||||
seedFromInteger i = Seed $ Serialize.i2ospOf_ seedLength (i `mod` 2^(seedLength * 8))
|
||||
|
||||
-- | Create a new DRG from system entropy
|
||||
drgNew :: MonadRandom randomly => randomly ChaChaDRG
|
||||
drgNew = do
|
||||
b <- getRandomBytes 40
|
||||
return $ initialize (b :: ScrubbedBytes)
|
||||
drgNew = drgNewSeed `fmap` seedNew
|
||||
|
||||
-- | Create a new DRG from a seed
|
||||
drgNewSeed :: Seed -> ChaChaDRG
|
||||
drgNewSeed (Seed seed) = initialize seed
|
||||
|
||||
-- | Create a new DRG from 5 Word64.
|
||||
--
|
||||
|
||||
Loading…
Reference in New Issue
Block a user