mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-13 19:46:39 +00:00
crypto: validate hash length in no cgo Sign (#33104)
- Replace hardcoded DigestLength - Add hash length validation
This commit is contained in:
parent
d2a5dba48f
commit
ebc7dc9e37
1 changed files with 5 additions and 2 deletions
|
|
@ -43,6 +43,9 @@ func sigToPub(hash, sig []byte) (*secp256k1.PublicKey, error) {
|
||||||
if len(sig) != SignatureLength {
|
if len(sig) != SignatureLength {
|
||||||
return nil, errors.New("invalid signature")
|
return nil, errors.New("invalid signature")
|
||||||
}
|
}
|
||||||
|
if len(hash) != DigestLength {
|
||||||
|
return nil, fmt.Errorf("hash is required to be exactly %d bytes (%d)", DigestLength, len(hash))
|
||||||
|
}
|
||||||
// Convert to secp256k1 input format with 'recovery id' v at the beginning.
|
// Convert to secp256k1 input format with 'recovery id' v at the beginning.
|
||||||
btcsig := make([]byte, SignatureLength)
|
btcsig := make([]byte, SignatureLength)
|
||||||
btcsig[0] = sig[RecoveryIDOffset] + 27
|
btcsig[0] = sig[RecoveryIDOffset] + 27
|
||||||
|
|
@ -76,8 +79,8 @@ func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) {
|
||||||
//
|
//
|
||||||
// The produced signature is in the [R || S || V] format where V is 0 or 1.
|
// The produced signature is in the [R || S || V] format where V is 0 or 1.
|
||||||
func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) {
|
func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) {
|
||||||
if len(hash) != 32 {
|
if len(hash) != DigestLength {
|
||||||
return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash))
|
return nil, fmt.Errorf("hash is required to be exactly %d bytes (%d)", DigestLength, len(hash))
|
||||||
}
|
}
|
||||||
if prv.Curve != S256() {
|
if prv.Curve != S256() {
|
||||||
return nil, errors.New("private key curve is not secp256k1")
|
return nil, errors.New("private key curve is not secp256k1")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue