module Haskoin.Util.Arbitrary.Keys where
import Data.Bits (clearBit)
import Data.List (foldl')
import Data.Word (Word32)
import Haskoin.Crypto
import Haskoin.Keys.Common
import Haskoin.Keys.Extended
import Haskoin.Util.Arbitrary.Crypto
import Test.QuickCheck
arbitrarySecKeyI :: Gen SecKeyI
arbitrarySecKeyI :: Gen SecKeyI
arbitrarySecKeyI = Bool -> SecKey -> SecKeyI
wrapSecKey (Bool -> SecKey -> SecKeyI) -> Gen Bool -> Gen (SecKey -> SecKeyI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Bool
forall a. Arbitrary a => Gen a
arbitrary Gen (SecKey -> SecKeyI) -> Gen SecKey -> Gen SecKeyI
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen SecKey
forall a. Arbitrary a => Gen a
arbitrary
arbitraryKeyPair :: Gen (SecKeyI, PubKeyI)
arbitraryKeyPair :: Gen (SecKeyI, PubKeyI)
arbitraryKeyPair = do
SecKeyI
k <- Gen SecKeyI
arbitrarySecKeyI
(SecKeyI, PubKeyI) -> Gen (SecKeyI, PubKeyI)
forall (m :: * -> *) a. Monad m => a -> m a
return (SecKeyI
k, SecKeyI -> PubKeyI
derivePubKeyI SecKeyI
k)
arbitraryXPrvKey :: Gen XPrvKey
arbitraryXPrvKey :: Gen XPrvKey
arbitraryXPrvKey =
Word8
-> Fingerprint -> Fingerprint -> ChainCode -> SecKey -> XPrvKey
XPrvKey (Word8
-> Fingerprint -> Fingerprint -> ChainCode -> SecKey -> XPrvKey)
-> Gen Word8
-> Gen
(Fingerprint -> Fingerprint -> ChainCode -> SecKey -> XPrvKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Word8
forall a. Arbitrary a => Gen a
arbitrary
Gen (Fingerprint -> Fingerprint -> ChainCode -> SecKey -> XPrvKey)
-> Gen Fingerprint
-> Gen (Fingerprint -> ChainCode -> SecKey -> XPrvKey)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Fingerprint
forall a. Arbitrary a => Gen a
arbitrary
Gen (Fingerprint -> ChainCode -> SecKey -> XPrvKey)
-> Gen Fingerprint -> Gen (ChainCode -> SecKey -> XPrvKey)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Fingerprint
forall a. Arbitrary a => Gen a
arbitrary
Gen (ChainCode -> SecKey -> XPrvKey)
-> Gen ChainCode -> Gen (SecKey -> XPrvKey)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ChainCode
arbitraryHash256
Gen (SecKey -> XPrvKey) -> Gen SecKey -> Gen XPrvKey
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen SecKey
forall a. Arbitrary a => Gen a
arbitrary
arbitraryXPubKey :: Gen (XPrvKey, XPubKey)
arbitraryXPubKey :: Gen (XPrvKey, XPubKey)
arbitraryXPubKey = (\k :: XPrvKey
k -> (XPrvKey
k, XPrvKey -> XPubKey
deriveXPubKey XPrvKey
k)) (XPrvKey -> (XPrvKey, XPubKey))
-> Gen XPrvKey -> Gen (XPrvKey, XPubKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen XPrvKey
arbitraryXPrvKey
genIndex :: Gen Word32
genIndex :: Gen Fingerprint
genIndex = (Fingerprint -> Int -> Fingerprint
forall a. Bits a => a -> Int -> a
`clearBit` 31) (Fingerprint -> Fingerprint) -> Gen Fingerprint -> Gen Fingerprint
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Fingerprint
forall a. Arbitrary a => Gen a
arbitrary
arbitraryBip32PathIndex :: Gen Bip32PathIndex
arbitraryBip32PathIndex :: Gen Bip32PathIndex
arbitraryBip32PathIndex =
[Gen Bip32PathIndex] -> Gen Bip32PathIndex
forall a. [Gen a] -> Gen a
oneof [ Fingerprint -> Bip32PathIndex
Bip32SoftIndex (Fingerprint -> Bip32PathIndex)
-> Gen Fingerprint -> Gen Bip32PathIndex
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Fingerprint
genIndex
, Fingerprint -> Bip32PathIndex
Bip32HardIndex (Fingerprint -> Bip32PathIndex)
-> Gen Fingerprint -> Gen Bip32PathIndex
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Fingerprint
genIndex
]
arbitraryHardPath :: Gen HardPath
arbitraryHardPath :: Gen HardPath
arbitraryHardPath = (HardPath -> Fingerprint -> HardPath)
-> HardPath -> [Fingerprint] -> HardPath
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' HardPath -> Fingerprint -> HardPath
forall t.
HardOrAny t =>
DerivPathI t -> Fingerprint -> DerivPathI t
(:|) HardPath
forall t. DerivPathI t
Deriv ([Fingerprint] -> HardPath) -> Gen [Fingerprint] -> Gen HardPath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Fingerprint -> Gen [Fingerprint]
forall a. Gen a -> Gen [a]
listOf Gen Fingerprint
genIndex
arbitrarySoftPath :: Gen SoftPath
arbitrarySoftPath :: Gen SoftPath
arbitrarySoftPath = (SoftPath -> Fingerprint -> SoftPath)
-> SoftPath -> [Fingerprint] -> SoftPath
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' SoftPath -> Fingerprint -> SoftPath
forall t.
AnyOrSoft t =>
DerivPathI t -> Fingerprint -> DerivPathI t
(:/) SoftPath
forall t. DerivPathI t
Deriv ([Fingerprint] -> SoftPath) -> Gen [Fingerprint] -> Gen SoftPath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Fingerprint -> Gen [Fingerprint]
forall a. Gen a -> Gen [a]
listOf Gen Fingerprint
genIndex
arbitraryDerivPath :: Gen DerivPath
arbitraryDerivPath :: Gen DerivPath
arbitraryDerivPath = [Bip32PathIndex] -> DerivPath
concatBip32Segments ([Bip32PathIndex] -> DerivPath)
-> Gen [Bip32PathIndex] -> Gen DerivPath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Bip32PathIndex -> Gen [Bip32PathIndex]
forall a. Gen a -> Gen [a]
listOf Gen Bip32PathIndex
arbitraryBip32PathIndex
arbitraryParsedPath :: Gen ParsedPath
arbitraryParsedPath :: Gen ParsedPath
arbitraryParsedPath =
[Gen ParsedPath] -> Gen ParsedPath
forall a. [Gen a] -> Gen a
oneof [ DerivPath -> ParsedPath
ParsedPrv (DerivPath -> ParsedPath) -> Gen DerivPath -> Gen ParsedPath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen DerivPath
arbitraryDerivPath
, DerivPath -> ParsedPath
ParsedPub (DerivPath -> ParsedPath) -> Gen DerivPath -> Gen ParsedPath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen DerivPath
arbitraryDerivPath
, DerivPath -> ParsedPath
ParsedEmpty (DerivPath -> ParsedPath) -> Gen DerivPath -> Gen ParsedPath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen DerivPath
arbitraryDerivPath
]
arbitrarySignature :: Gen (Hash256, SecKey, Sig)
arbitrarySignature :: Gen (ChainCode, SecKey, Sig)
arbitrarySignature = do
ChainCode
m <- Gen ChainCode
arbitraryHash256
SecKey
key <- Gen SecKey
forall a. Arbitrary a => Gen a
arbitrary
let sig :: Sig
sig = SecKey -> ChainCode -> Sig
signHash SecKey
key ChainCode
m
(ChainCode, SecKey, Sig) -> Gen (ChainCode, SecKey, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return (ChainCode
m, SecKey
key, Sig
sig)