packages feed

libsecp256k1-0.1.0: src/Crypto/Secp256k1/Gen.hs

module Crypto.Secp256k1.Gen where

import Crypto.Secp256k1 (KeyPair, PubKeyXO, PubKeyXY, SecKey, Tweak, derivePubKey, importSecKey, importTweak, keyPairCreate, xyToXO)
import Hedgehog (MonadGen)
import Hedgehog.Gen (bytes, discard, prune)
import Hedgehog.Range (singleton)


secKeyGen :: MonadGen m => m SecKey
secKeyGen = do
    bs <- prune $ bytes (singleton 32)
    maybe discard pure (importSecKey bs)


pubKeyXYGen :: MonadGen m => m PubKeyXY
pubKeyXYGen = derivePubKey <$> secKeyGen


pubKeyXOGen :: MonadGen m => m PubKeyXO
pubKeyXOGen = fst . xyToXO <$> pubKeyXYGen


keyPairGen :: MonadGen m => m KeyPair
keyPairGen = keyPairCreate <$> secKeyGen


tweakGen :: MonadGen m => m Tweak
tweakGen = do
    bs <- prune $ bytes (singleton 32)
    maybe discard pure (importTweak bs)