module DetDeriveSpec where --import Bitcoin.Internal.Types import Bitcoin.BIP32.DetDerive import Test.Hspec import Test.QuickCheck import Test.QuickCheck.Arbitrary import qualified Network.Haskoin.Crypto as HC import qualified Network.Haskoin.Test as HT import qualified Data.ByteString.Char8 as C8 import qualified Data.ByteString as BS newtype ArbRootPrv = ArbRootPrv RootPrv instance Arbitrary ArbRootPrv where arbitrary = do ArbitraryDerivSeed bs <- arbitrary return $ ArbRootPrv $ createRootPrv bs spec :: Spec spec = describe "Deterministic key derivation" $ it "derives same XPubKey for ChildPair & ChildPub" $ do ArbRootPrv rootPrv <- generate arbitrary arbSeed <- generate arbitrary let pub = derivExtPub (fromRootPrv rootPrv) arbSeed pair = derivExtPair rootPrv arbSeed (getKey pub :: HC.XPubKey) `shouldBe` getKey pair derivExtPub :: RootPub -> ArbitraryDerivSeed -> External ChildPub derivExtPub = detDerive derivExtPair :: RootPrv -> ArbitraryDerivSeed -> External ChildPair derivExtPair = detDerive newtype ArbitraryDerivSeed = ArbitraryDerivSeed BS.ByteString instance Arbitrary ArbitraryDerivSeed where arbitrary = do len <- choose (0,32) c8Lst <- vector len return $ ArbitraryDerivSeed $ C8.pack c8Lst instance DerivationSeed ArbitraryDerivSeed where toDerivSeed (ArbitraryDerivSeed bs) = bs