cryptocipher-0.2.2: Number/Generate.hs
module Number.Generate
( generateMax
) where
import Number.Serialize
import Crypto.Random
{- a bit too simplitic and probably not very good. need to have a serious look
- on how to generate random integer. -}
generateMax :: CryptoRandomGen g => g -> Integer -> Either GenError (Integer, g)
generateMax rng m =
let nbbytes = nbBytes m in
case genBytes nbbytes rng of
Left err -> Left err
Right (bs, rng') ->
let n = os2ip bs in
if n < m then Right (n, rng') else generateMax rng' m
nbBytes :: Integer -> Int
nbBytes n
| n < 256 = 1
| otherwise = 1 + nbBytes (n `div` 256)