module BIP32.GHC
( Prv
, prv
, unPrv
, prvToPub
, addPrvTweak
, Pub
, pub
, unPub
, addPubTweak
, Tweak
, tweak
, hmacSHA512
, ripemd160
, sha256
) where
import Control.Monad
import qualified Crypto.Hash as Hash
import qualified Crypto.MAC.HMAC as HMAC
import qualified Crypto.Secp256k1 as K
import qualified Data.ByteArray as BA
import qualified Data.ByteString as B
newtype Prv = Prv K.SecKey
deriving (Eq, Show)
unPrv :: Prv -> B.ByteString
{-# INLINE unPrv #-}
unPrv (Prv x) = K.getSecKey x
prv :: B.ByteString -> Maybe Prv
{-# INLINE prv #-}
prv x = Prv <$> K.secKey x
prvToPub :: Prv -> Pub
{-# INLINE prvToPub #-}
prvToPub (Prv x) = Pub (K.derivePubKey x)
addPrvTweak :: Prv -> Tweak -> Maybe Prv
{-# INLINE addPrvTweak #-}
addPrvTweak (Prv p) (Tweak t) = Prv <$> K.tweakAddSecKey p t
newtype Pub = Pub K.PubKey
deriving (Eq, Show)
unPub :: Pub -> B.ByteString
{-# INLINE unPub #-}
unPub (Pub x) = K.exportPubKey True x
pub :: B.ByteString -> Maybe Pub
{-# INLINE pub #-}
pub x = do
guard (B.length x == 33)
Pub <$> K.importPubKey x
addPubTweak :: Pub -> Tweak -> Maybe Pub
{-# INLINE addPubTweak #-}
addPubTweak (Pub p) (Tweak t) = Pub <$> K.tweakAddPubKey p t
newtype Tweak = Tweak K.Tweak
tweak :: B.ByteString -> Maybe Tweak
{-# INLINE tweak #-}
tweak x = Tweak <$> K.tweak x
hmacSHA512
:: B.ByteString
-> B.ByteString
-> B.ByteString
{-# INLINE hmacSHA512 #-}
hmacSHA512 k d = BA.convert (HMAC.hmac k d :: HMAC.HMAC Hash.SHA512)
ripemd160
:: B.ByteString
-> B.ByteString
{-# INLINE ripemd160 #-}
ripemd160 d = BA.convert (Hash.hash d :: Hash.Digest Hash.RIPEMD160)
sha256
:: B.ByteString
-> B.ByteString
{-# INLINE sha256 #-}
sha256 d = BA.convert (Hash.hash d :: Hash.Digest Hash.SHA256)