[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:
Vincent Hanquez 2016-04-09 08:33:37 +01:00
parent 149bfa6010
commit d7e26e34ee

View File

@ -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.
-- --