// Copyright 2017 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package istanbul import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" ) func RLPHash(v interface{}) (h common.Hash) { hw := sha3.NewKeccak256() rlp.Encode(hw, v) hw.Sum(h[:0]) return h } // GetSignatureAddress gets the signer address from the signature func GetSignatureAddress(data []byte, sig []byte) (common.Address, error) { // 1. Keccak data hashData := crypto.Keccak256([]byte(data)) // 2. Recover public key pubkey, err := crypto.SigToPub(hashData, sig) if err != nil { return common.Address{}, err } return crypto.PubkeyToAddress(*pubkey), nil } func CheckValidatorSignature(valSet ValidatorSet, data []byte, sig []byte) (common.Address, error) { // 1. Get signature address signer, err := GetSignatureAddress(data, sig) if err != nil { log.Error("Failed to get signer address", "err", err) return common.Address{}, err } // 2. Check validator if _, val := valSet.GetByAddress(signer); val != nil { return val.Address(), nil } return common.Address{}, ErrUnauthorizedAddress }