web3-0.8.0.0: unit/Crypto/Ethereum/Test/EcdsaSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Crypto.Ethereum.Test.EcdsaSpec where
import Crypto.Secp256k1 (SecKey, derivePubKey)
import Data.ByteArray (convert)
import Data.ByteString (ByteString, pack)
import Data.Serialize (decode)
import Test.Hspec
import Test.Hspec.QuickCheck
import Crypto.Ethereum
import Data.ByteArray.HexString (HexString)
import Data.Solidity.Prim.Address (fromPubKey)
spec :: Spec
spec = do
describe "Ethereum signatures" $ do
let key = "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20" :: SecKey
address = fromPubKey (derivePubKey key)
message = "Hello World!" :: ByteString
sign = "0xd4a9620cd94387a31b9333935f1e76fbee8467c283d07c39c1606dc4e2af021e317293af09601dbb48f547e40f6b98fe8a67a23dcd1f7f8d054695a81521177001" :: HexString
sign' = either error id $ decode (convert sign)
it "sign message by Ethereum private key" $ do
ecsign key message `shouldBe` sign'
it "verify message by Ethereum public key" $ do
ecrecover sign' message `shouldBe` Just address
prop "round robin sign/verify for random message" $ \chars ->
let msg = pack chars
in ecrecover (ecsign key msg) msg `shouldBe` Just address