{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Network.TLS.RNG
    ( StateRNG(..)
    , Seed
    , seedNew
    , seedToInteger
    , seedFromInteger
    , withTLSRNG
    , newStateRNG
    , MonadRandom
    , getRandomBytes
    ) where

import Crypto.Random.Types
import Crypto.Random

newtype StateRNG = StateRNG ChaChaDRG
    deriving (Int -> StateRNG -> (byteArray, StateRNG)
(forall byteArray.
 ByteArray byteArray =>
 Int -> StateRNG -> (byteArray, StateRNG))
-> DRG StateRNG
forall byteArray.
ByteArray byteArray =>
Int -> StateRNG -> (byteArray, StateRNG)
forall gen.
(forall byteArray.
 ByteArray byteArray =>
 Int -> gen -> (byteArray, gen))
-> DRG gen
randomBytesGenerate :: Int -> StateRNG -> (byteArray, StateRNG)
$crandomBytesGenerate :: forall byteArray.
ByteArray byteArray =>
Int -> StateRNG -> (byteArray, StateRNG)
DRG)

instance Show StateRNG where
    show :: StateRNG -> String
show StateRNG
_ = String
"rng[..]"

withTLSRNG :: StateRNG
           -> MonadPseudoRandom StateRNG a
           -> (a, StateRNG)
withTLSRNG :: StateRNG -> MonadPseudoRandom StateRNG a -> (a, StateRNG)
withTLSRNG StateRNG
rng MonadPseudoRandom StateRNG a
f = StateRNG -> MonadPseudoRandom StateRNG a -> (a, StateRNG)
forall gen a. DRG gen => gen -> MonadPseudoRandom gen a -> (a, gen)
withDRG StateRNG
rng MonadPseudoRandom StateRNG a
f

newStateRNG :: Seed -> StateRNG
newStateRNG :: Seed -> StateRNG
newStateRNG Seed
seed = ChaChaDRG -> StateRNG
StateRNG (ChaChaDRG -> StateRNG) -> ChaChaDRG -> StateRNG
forall a b. (a -> b) -> a -> b
$ Seed -> ChaChaDRG
drgNewSeed Seed
seed