module Network.Haskoin.Crypto.Arbitrary
( genPrvKeyC
, genPrvKeyU
) where
import Test.QuickCheck
import Network.Haskoin.Util.Arbitrary()
import Control.Applicative ((<$>))
import Data.Maybe
import Network.Haskoin.Crypto.Point
import Network.Haskoin.Crypto.Hash
import Network.Haskoin.Crypto.Ring
import Network.Haskoin.Crypto.ECDSA
import Network.Haskoin.Crypto.Keys
import Network.Haskoin.Crypto.Base58
import Network.Haskoin.Crypto.Curve
instance RingMod n => Arbitrary (Ring n) where
arbitrary = fromInteger <$> arbitrary
instance Arbitrary CheckSum32 where
arbitrary = chksum32 <$> arbitrary
instance Arbitrary Point where
arbitrary = frequency
[ (1, return makeInfPoint)
, (9, (flip mulPoint $ curveG) <$> (arbitrary :: Gen FieldN))
]
genPrvKeyC :: Gen PrvKey
genPrvKeyC = do
i <- fromInteger <$> choose (1, curveN1)
return $ fromJust $ makePrvKey i
genPrvKeyU :: Gen PrvKey
genPrvKeyU = do
i <- fromInteger <$> choose (1, curveN1)
return $ fromJust $ makePrvKeyU i
instance Arbitrary PrvKey where
arbitrary = oneof [genPrvKeyC, genPrvKeyU]
instance Arbitrary PubKey where
arbitrary = derivePubKey <$> arbitrary
instance Arbitrary Address where
arbitrary = do
i <- fromInteger <$> choose (1,2^(1601 :: Int))
elements [ PubKeyAddress i
, ScriptAddress i
]
instance Arbitrary Signature where
arbitrary = do
msg <- arbitrary
prv <- prvKeyFieldN <$> arbitrary
non <- prvKeyFieldN <$> arbitrary
let pub = mulPoint non curveG
case unsafeSignMsg msg prv (non,pub) of
(Just sig) -> return sig
Nothing -> arbitrary