packages feed

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