mirror of
https://github.com/golang/go
synced 2024-11-17 01:34:52 -07:00
crypto/x509: don't panic marshaling invalid ECDSA keys
MarshalPKIXPublicKey, CreateCertificate, CreateCertificateRequest, MarshalECPrivateKey, and MarshalPKCS8PrivateKey started raising a panic when encoding an invalid ECDSA key in Go 1.19. Since they have an error return value, they should return an error instead. Fixes #54288 Change-Id: Iba132cd2f890ece36bb7d0396eb9a9a77bdb81df Reviewed-on: https://go-review.googlesource.com/c/go/+/422298 Auto-Submit: Filippo Valsorda <filippo@golang.org> Reviewed-by: Roland Shoemaker <roland@golang.org> Run-TryBot: Filippo Valsorda <filippo@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
b9bf824655
commit
f64f12f0b3
@ -54,6 +54,9 @@ func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error) {
|
||||
// marshalECPrivateKey marshals an EC private key into ASN.1, DER format and
|
||||
// sets the curve ID to the given OID, or omits it if OID is nil.
|
||||
func marshalECPrivateKeyWithOID(key *ecdsa.PrivateKey, oid asn1.ObjectIdentifier) ([]byte, error) {
|
||||
if !key.Curve.IsOnCurve(key.X, key.Y) {
|
||||
return nil, errors.New("invalid elliptic key public key")
|
||||
}
|
||||
privateKey := make([]byte, (key.Curve.Params().N.BitLen()+7)/8)
|
||||
return asn1.Marshal(ecPrivateKey{
|
||||
Version: 1,
|
||||
|
@ -84,11 +84,14 @@ func marshalPublicKey(pub any) (publicKeyBytes []byte, publicKeyAlgorithm pkix.A
|
||||
// RFC 3279, Section 2.3.1.
|
||||
publicKeyAlgorithm.Parameters = asn1.NullRawValue
|
||||
case *ecdsa.PublicKey:
|
||||
publicKeyBytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)
|
||||
oid, ok := oidFromNamedCurve(pub.Curve)
|
||||
if !ok {
|
||||
return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: unsupported elliptic curve")
|
||||
}
|
||||
if !pub.Curve.IsOnCurve(pub.X, pub.Y) {
|
||||
return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: invalid elliptic curve public key")
|
||||
}
|
||||
publicKeyBytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)
|
||||
publicKeyAlgorithm.Algorithm = oidPublicKeyECDSA
|
||||
var paramBytes []byte
|
||||
paramBytes, err = asn1.Marshal(oid)
|
||||
|
@ -68,6 +68,20 @@ func TestPKCS1MismatchPublicKeyFormat(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarshalInvalidPublicKey(t *testing.T) {
|
||||
_, err := MarshalPKIXPublicKey(&ecdsa.PublicKey{})
|
||||
if err == nil {
|
||||
t.Errorf("expected error, got MarshalPKIXPublicKey success")
|
||||
}
|
||||
_, err = MarshalPKIXPublicKey(&ecdsa.PublicKey{
|
||||
Curve: elliptic.P256(),
|
||||
X: big.NewInt(1), Y: big.NewInt(2),
|
||||
})
|
||||
if err == nil {
|
||||
t.Errorf("expected error, got MarshalPKIXPublicKey success")
|
||||
}
|
||||
}
|
||||
|
||||
func testParsePKIXPublicKey(t *testing.T, pemBytes string) (pub any) {
|
||||
block, _ := pem.Decode([]byte(pemBytes))
|
||||
pub, err := ParsePKIXPublicKey(block.Bytes)
|
||||
|
Loading…
Reference in New Issue
Block a user