module Crypto.Ethereum
(
hashMessage
, ecsign
, ecrecover
, SecKey
, derivePubKey
)where
import Crypto.Hash (Keccak_256 (..), hashWith)
import Crypto.Secp256k1 (CompactRecSig, Msg, SecKey,
derivePubKey, exportCompactRecSig,
importCompactRecSig, msg, recover,
signRecMsg)
import Data.ByteArray (ByteArrayAccess, convert)
import Data.Maybe (fromJust)
import Data.Solidity.Prim.Address (Address, fromPubKey)
hashMessage :: ByteArrayAccess ba => ba -> Msg
hashMessage = fromJust . msg . convert . hashWith Keccak_256
ecsign :: ByteArrayAccess message
=> SecKey
-> message
-> CompactRecSig
ecsign key = exportCompactRecSig . signRecMsg key . hashMessage
ecrecover :: ByteArrayAccess message
=> CompactRecSig
-> message
-> Maybe Address
ecrecover sig message = do
sig' <- importCompactRecSig sig
fromPubKey <$> recover sig' (hashMessage message)