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