diff --git a/crypto/crypto.go b/crypto/crypto.go index aa4fa45a2c..0371073270 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -199,23 +199,32 @@ func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { } // Sign calculates an ECDSA signature. -// Note: the signature is not Ethereum compliant. The yellow paper dictates -// Ethereum singature to have a V value with and offset of 27 v in [27,28]. +// This function is susceptible to choosen plaintext attacks that can leak +// information about the private key that is used for signing. Callers must +// be aware that the given hash cannot be choosen by an adversery. Common +// solution is to hash any input before calculating the signature. +// +// Note: the calculated signature is not Ethereum compliant. The yellow paper +// dictates Ethereum singature to have a V value with and offset of 27 v in [27,28]. // Use SignEthereum to get an Ethereum compliant signature. -func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { - if len(hash) != 32 { - return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash)) +func Sign(data []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { + if len(data) != 32 { + return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(data)) } seckey := common.LeftPadBytes(prv.D.Bytes(), prv.Params().BitSize/8) defer zeroBytes(seckey) - sig, err = secp256k1.Sign(hash, seckey) + sig, err = secp256k1.Sign(data, seckey) return } // SignEthereum calculates an Ethereum ECDSA signature. -func SignEthereum(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) { - sig, err := Sign(hash, prv) +// This function is susceptible to choosen plaintext attacks that can leak +// information about the private key that is used for signing. Callers must +// be aware that the given hash cannot be choosen by an adversery. Common +// solution is to hash any input before calculating the signature. +func SignEthereum(data []byte, prv *ecdsa.PrivateKey) ([]byte, error) { + sig, err := Sign(data, prv) if err != nil { return nil, err }