{-|
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 =
    ByteString -> Hash160
forall b. ByteArrayAccess b => b -> Hash160
ripemd160 (ByteString -> Hash160) -> Gen ByteString -> Gen Hash160
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ByteString
arbitraryBSn 20

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

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

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