module Crypto.Number.Generate
( generateMax
, generateBetween
, generateOfSize
) where
import Crypto.Number.Serialize
import Crypto.Random.API
import qualified Data.ByteString as B
import Data.Bits ((.|.))
generateMax :: CPRG g => g -> Integer -> (Integer, g)
generateMax rng m = withRandomBytes rng (lengthBytes m) $ \bs ->
os2ip bs `mod` m
generateBetween :: CPRG g => g -> Integer -> Integer -> (Integer, g)
generateBetween rng low high = (low + v, rng')
where (v, rng') = generateMax rng (high low + 1)
generateOfSize :: CPRG g => g -> Int -> (Integer, g)
generateOfSize rng bits = withRandomBytes rng (bits `div` 8) $ \bs ->
os2ip $ snd $ B.mapAccumL (\acc w -> (0, w .|. acc)) 0xc0 bs