diff options
author | Filippo Valsorda <filippo@golang.org> | 2020-03-17 20:34:51 -0400 |
---|---|---|
committer | Filippo Valsorda <filippo@golang.org> | 2020-03-23 17:56:24 +0000 |
commit | 5c9bd499e103709a181f7a1a895d221ae6e7ffc8 (patch) | |
tree | 38942a3590c3aeec0ee44736f4ffbfd1d3414e24 /src/crypto/ecdsa/ecdsa.go | |
parent | 24925c7ed9da15fe780d0d2fce21bbaa707e8751 (diff) | |
download | go-5c9bd499e103709a181f7a1a895d221ae6e7ffc8.tar.gz go-5c9bd499e103709a181f7a1a895d221ae6e7ffc8.zip |
crypto/rsa,crypto/ecdsa,crypto/ed25519: implement PublicKey.Equal
This makes all modern public keys in the standard library implement a
common interface (below) that can be used by applications for better
type safety and allows for checking that public (and private keys via
Public()) are equivalent.
interface {
Equal(crypto.PublicKey) bool
}
Equality for ECDSA keys is complicated, we take a strict interpretation
that works for all secure applications (the ones not using the
unfortunate non-constant time CurveParams implementation) and fails
closed otherwise.
Tests in separate files to make them x_tests and avoid an import loop
with crypto/x509.
Fixes #21704
Change-Id: Id5379c96384a11c5afde0614955360e7470bb1c4
Reviewed-on: https://go-review.googlesource.com/c/go/+/223754
Reviewed-by: Katie Hockman <katie@golang.org>
Diffstat (limited to 'src/crypto/ecdsa/ecdsa.go')
-rw-r--r-- | src/crypto/ecdsa/ecdsa.go | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/crypto/ecdsa/ecdsa.go b/src/crypto/ecdsa/ecdsa.go index 744182aac2..189399d126 100644 --- a/src/crypto/ecdsa/ecdsa.go +++ b/src/crypto/ecdsa/ecdsa.go @@ -62,6 +62,24 @@ type PublicKey struct { X, Y *big.Int } +// Equal reports whether pub and x have the same value. +// +// Two keys are only considered to have the same value if they have the same Curve value. +// Note that for example elliptic.P256() and elliptic.P256().Params() are different +// values, as the latter is a generic not constant time implementation. +func (pub *PublicKey) Equal(x crypto.PublicKey) bool { + xx, ok := x.(*PublicKey) + if !ok { + return false + } + return pub.X.Cmp(xx.X) == 0 && pub.Y.Cmp(xx.Y) == 0 && + // Standard library Curve implementations are singletons, so this check + // will work for those. Other Curves might be equivalent even if not + // singletons, but there is no definitive way to check for that, and + // better to err on the side of safety. + pub.Curve == xx.Curve +} + // PrivateKey represents an ECDSA private key. type PrivateKey struct { PublicKey |