[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
|
-- Stability : stable
|
||||||
-- Portability : good
|
-- Portability : good
|
||||||
--
|
--
|
||||||
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||||
module Crypto.Random
|
module Crypto.Random
|
||||||
(
|
(
|
||||||
-- * Deterministic instances
|
-- * Deterministic instances
|
||||||
ChaChaDRG
|
ChaChaDRG
|
||||||
, SystemDRG
|
, SystemDRG
|
||||||
|
, Seed
|
||||||
|
-- * Seed
|
||||||
|
, seedNew
|
||||||
|
, seedFromInteger
|
||||||
|
, seedToInteger
|
||||||
-- * Deterministic Random class
|
-- * Deterministic Random class
|
||||||
, getSystemDRG
|
, getSystemDRG
|
||||||
, drgNew
|
, drgNew
|
||||||
|
, drgNewSeed
|
||||||
, drgNewTest
|
, drgNewTest
|
||||||
, withDRG
|
, withDRG
|
||||||
, withRandomBytes
|
, withRandomBytes
|
||||||
@ -25,14 +32,37 @@ module Crypto.Random
|
|||||||
import Crypto.Random.Types
|
import Crypto.Random.Types
|
||||||
import Crypto.Random.ChaChaDRG
|
import Crypto.Random.ChaChaDRG
|
||||||
import Crypto.Random.SystemDRG
|
import Crypto.Random.SystemDRG
|
||||||
import Data.ByteArray (ByteArray, ScrubbedBytes)
|
import Data.ByteArray (ByteArray, ByteArrayAccess, ScrubbedBytes)
|
||||||
import Crypto.Internal.Imports
|
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
|
-- | Create a new DRG from system entropy
|
||||||
drgNew :: MonadRandom randomly => randomly ChaChaDRG
|
drgNew :: MonadRandom randomly => randomly ChaChaDRG
|
||||||
drgNew = do
|
drgNew = drgNewSeed `fmap` seedNew
|
||||||
b <- getRandomBytes 40
|
|
||||||
return $ initialize (b :: ScrubbedBytes)
|
-- | Create a new DRG from a seed
|
||||||
|
drgNewSeed :: Seed -> ChaChaDRG
|
||||||
|
drgNewSeed (Seed seed) = initialize seed
|
||||||
|
|
||||||
-- | Create a new DRG from 5 Word64.
|
-- | Create a new DRG from 5 Word64.
|
||||||
--
|
--
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user