diff --git a/Crypto/Random.hs b/Crypto/Random.hs index e71fa51..abc08a4 100644 --- a/Crypto/Random.hs +++ b/Crypto/Random.hs @@ -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. --