Maintainer | Thomas.DuBuisson@gmail.com |
---|---|
Stability | beta |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
Obtain entropy from system sources or x86 RDRAND when available.
Currently supporting:
- Windows via CryptoAPI
- *nix systems via
/dev/urandom
- Includes QNX
- ghcjs/browser via JavaScript crypto API.
Synopsis
- getEntropy :: Int -> IO ByteString
- getHardwareEntropy :: Int -> IO (Maybe ByteString)
- data CryptHandle
- openHandle :: IO CryptHandle
- hGetEntropy :: CryptHandle -> Int -> IO ByteString
- closeHandle :: CryptHandle -> IO ()
Documentation
:: Int | Number of bytes |
-> IO ByteString |
Get a specific number of bytes of cryptographically secure random data using the *system-specific* sources. (As of 0.4. Versions <0.4 mixed system and hardware sources)
The returned random value is considered cryptographically secure but not true entropy.
On some platforms this requires a file handle which can lead to resource exhaustion in some situations.
:: Int | Number of bytes |
-> IO (Maybe ByteString) |
Get a specific number of bytes of cryptographically secure random data using a supported *hardware* random bit generator.
If there is no hardware random number generator then Nothing
is returned.
If any call returns non-Nothing then it should never be Nothing
unless
there has been a hardware failure.
If trust of the CPU allows it and no context switching is important, a bias to the hardware rng with system rng as fall back is trivial:
let fastRandom nr = maybe (getEntropy nr) pure =<< getHardwareEntropy nr
The old, <0.4
, behavior is possible using xor
from Bits
:
let oldRandom nr = do hwRnd maybe (replicate nr 0) BS.unpack <$ getHardwareEntropy nr sysRnd BS.unpack <$ getEntropy nr pure $ BS.pack $ zipWith xor sysRnd hwRnd
A less maliable mixing can be accomplished by replacing xor
with a
composition of concat and cryptographic hash.
data CryptHandle Source #
Handle for manual resource management
openHandle :: IO CryptHandle Source #
Open a CryptHandle
hGetEntropy :: CryptHandle -> Int -> IO ByteString Source #
Read random data from a CryptHandle
closeHandle :: CryptHandle -> IO () Source #
Close the CryptHandle