{- |
Module      : Haskoin.Test.Crypto
Copyright   : No rights reserved
License     : MIT
Maintainer  : jprupp@protonmail.ch
Stability   : experimental
Portability : POSIX
-}
module Haskoin.Util.Arbitrary.Crypto where

import Haskoin.Crypto.Hash
import Haskoin.Util.Arbitrary.Util
import Test.QuickCheck

-- | Arbitrary 160-bit hash.
arbitraryHash160 :: Gen Hash160
arbitraryHash160 :: Gen Hash160
arbitraryHash160 =
    forall b. ByteArrayAccess b => b -> Hash160
ripemd160 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ByteString
arbitraryBSn Int
20

-- | Arbitrary 256-bit hash.
arbitraryHash256 :: Gen Hash256
arbitraryHash256 :: Gen Hash256
arbitraryHash256 =
    forall b. ByteArrayAccess b => b -> Hash256
sha256 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ByteString
arbitraryBSn Int
32

-- | Arbitrary 512-bit hash.
arbitraryHash512 :: Gen Hash512
arbitraryHash512 :: Gen Hash512
arbitraryHash512 =
    forall b. ByteArrayAccess b => b -> Hash512
sha512 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ByteString
arbitraryBSn Int
64

-- | Arbitrary 32-bit checksum.
arbitraryCheckSum32 :: Gen CheckSum32
arbitraryCheckSum32 :: Gen CheckSum32
arbitraryCheckSum32 =
    forall b. ByteArrayAccess b => b -> CheckSum32
checkSum32 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ByteString
arbitraryBSn Int
4