diff --git a/crypto/secp256r1/publickey.go b/crypto/secp256r1/publickey.go deleted file mode 100644 index 9b84044efa..0000000000 --- a/crypto/secp256r1/publickey.go +++ /dev/null @@ -1,26 +0,0 @@ -package secp256r1 - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "math/big" -) - -// Generates approptiate public key format from given coordinates -func newPublicKey(x, y *big.Int) *ecdsa.PublicKey { - // Check if the given coordinates are valid - if x == nil || y == nil || !elliptic.P256().IsOnCurve(x, y) { - return nil - } - - // Check if the given coordinates are the reference point (infinity) - if x.Sign() == 0 && y.Sign() == 0 { - return nil - } - - return &ecdsa.PublicKey{ - Curve: elliptic.P256(), - X: x, - Y: y, - } -} diff --git a/crypto/secp256r1/verifier.go b/crypto/secp256r1/verifier.go index ccc0786610..9943000764 100644 --- a/crypto/secp256r1/verifier.go +++ b/crypto/secp256r1/verifier.go @@ -1,21 +1,43 @@ +// Copyright 2024 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 secp256r1 implements signature verification for the P256VERIFY precompile. package secp256r1 import ( "crypto/ecdsa" + "crypto/elliptic" "math/big" ) -// Verifies the given signature (r, s) for the given hash and public key (x, y). -func Verify(hash []byte, r, s, x, y *big.Int) bool { - // Create the public key format - publicKey := newPublicKey(x, y) +func newPublicKey(x, y *big.Int) *ecdsa.PublicKey { + if x == nil || y == nil || !elliptic.P256().IsOnCurve(x, y) { + return nil + } + if x.Sign() == 0 && y.Sign() == 0 { + return nil + } + return &ecdsa.PublicKey{Curve: elliptic.P256(), X: x, Y: y} +} - // Check if they are invalid public key coordinates +// Verify checks the given signature (r, s) for the given hash and public key (x, y). +func Verify(hash []byte, r, s, x, y *big.Int) bool { + publicKey := newPublicKey(x, y) if publicKey == nil { return false } - - // Verify the signature with the public key, - // then return true if it's valid, false otherwise return ecdsa.Verify(publicKey, hash, r, s) }