module Gen.Bcc.Crypto.Seed
  ( genSeed
  , genSeedForKey
  ) where

import           Bcc.Api (AsType, Key)
import           Bcc.Crypto.Seed (Seed)
import           Data.Functor ((<$>))
import           Data.Int (Int)
import           Hedgehog (MonadGen, Range)
import           Prelude (fromIntegral)

import qualified Bcc.Api as API
import qualified Bcc.Crypto.Seed as C
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R

genSeed :: MonadGen m => Range Int -> m Seed
genSeed :: Range Int -> m Seed
genSeed Range Int
r = ByteString -> Seed
C.mkSeedFromBytes (ByteString -> Seed) -> m ByteString -> m Seed
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> m ByteString
forall (m :: * -> *). MonadGen m => Range Int -> m ByteString
G.bytes Range Int
r

genSeedForKey :: (Key key, MonadGen m) => AsType key -> m Seed
genSeedForKey :: AsType key -> m Seed
genSeedForKey AsType key
keyRole = Range Int -> m Seed
forall (m :: * -> *). MonadGen m => Range Int -> m Seed
genSeed (Int -> Range Int
forall a. a -> Range a
R.singleton (Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (AsType key -> Word
forall keyrole. Key keyrole => AsType keyrole -> Word
API.deterministicSigningKeySeedSize AsType key
keyRole)))