btcec/pubkey: remove redundant checks from compressed pubkey parsing

As of https://github.com/btcsuite/btcd/pull/1193, decompressPoint now
validates that the point is on the curve. The x and y cooordinates are
also implicitly <= P, since the modular reduction is applied to both
before the method returns. The checks are moved so that they are still
applied when parsing an uncompressed pubkey, as the checks are not
redundant in that path.
This commit is contained in:
Conner Fromknecht 2019-05-14 22:46:54 -07:00
parent 4aeb189fc4
commit 39500ed5ed
No known key found for this signature in database
GPG key ID: E7D737B67FA592C7

View file

@ -102,6 +102,17 @@ func ParsePubKey(pubKeyStr []byte, curve *KoblitzCurve) (key *PublicKey, err err
if format == pubkeyHybrid && ybit != isOdd(pubkey.Y) { if format == pubkeyHybrid && ybit != isOdd(pubkey.Y) {
return nil, fmt.Errorf("ybit doesn't match oddness") return nil, fmt.Errorf("ybit doesn't match oddness")
} }
if pubkey.X.Cmp(pubkey.Curve.Params().P) >= 0 {
return nil, fmt.Errorf("pubkey X parameter is >= to P")
}
if pubkey.Y.Cmp(pubkey.Curve.Params().P) >= 0 {
return nil, fmt.Errorf("pubkey Y parameter is >= to P")
}
if !pubkey.Curve.IsOnCurve(pubkey.X, pubkey.Y) {
return nil, fmt.Errorf("pubkey isn't on secp256k1 curve")
}
case PubKeyBytesLenCompressed: case PubKeyBytesLenCompressed:
// format is 0x2 | solution, <X coordinate> // format is 0x2 | solution, <X coordinate>
// solution determines which solution of the curve we use. // solution determines which solution of the curve we use.
@ -115,20 +126,12 @@ func ParsePubKey(pubKeyStr []byte, curve *KoblitzCurve) (key *PublicKey, err err
if err != nil { if err != nil {
return nil, err return nil, err
} }
default: // wrong! default: // wrong!
return nil, fmt.Errorf("invalid pub key length %d", return nil, fmt.Errorf("invalid pub key length %d",
len(pubKeyStr)) len(pubKeyStr))
} }
if pubkey.X.Cmp(pubkey.Curve.Params().P) >= 0 {
return nil, fmt.Errorf("pubkey X parameter is >= to P")
}
if pubkey.Y.Cmp(pubkey.Curve.Params().P) >= 0 {
return nil, fmt.Errorf("pubkey Y parameter is >= to P")
}
if !pubkey.Curve.IsOnCurve(pubkey.X, pubkey.Y) {
return nil, fmt.Errorf("pubkey isn't on secp256k1 curve")
}
return &pubkey, nil return &pubkey, nil
} }