Skip to content

Commit 606d9a7

Browse files
committed
crypto/x509: introduce ErrInsecureAlgorithm for insecure algorithms
Until now we've used ErrUnknownAlgorithm but that's a bit confusing when it is returned for obviously-known things like MD5. Fixes golang#10431. Change-Id: Ief8a8ef46e5b99bd4fd18e1acd7ae398a484bac3 Reviewed-on: https://go-review.googlesource.com/17380 Reviewed-by: Adam Langley <[email protected]>
1 parent a778ac5 commit 606d9a7

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/crypto/x509/x509.go

+6
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,10 @@ type Certificate struct {
541541
// involves algorithms that are not currently implemented.
542542
var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented")
543543

544+
// ErrInsecureAlgorithm results from attempting to perform an operation that
545+
// involves algorithms that are deemed insecure, notably MD5.
546+
var ErrInsecureAlgorithm = errors.New("x509: cannot verify signature: insecure algorithm")
547+
544548
// ConstraintViolationError results when a requested usage is not permitted by
545549
// a certificate. For example: checking a signature when the public key isn't a
546550
// certificate signing key.
@@ -651,6 +655,8 @@ func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey
651655
hashType = crypto.SHA384
652656
case SHA512WithRSA, ECDSAWithSHA512:
653657
hashType = crypto.SHA512
658+
case MD2WithRSA, MD5WithRSA:
659+
return ErrInsecureAlgorithm
654660
default:
655661
return ErrUnsupportedAlgorithm
656662
}

src/crypto/x509/x509_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -1220,3 +1220,36 @@ var csrBase64Array = [...]string{
12201220
// Both [ v3_req ] and [ req_attributes ]
12211221
"MIIDaTCCAlECAQAwfjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIGA1UEAwwLQ29tbW9uIE5hbWUxITAfBgkqhkiG9w0BCQEWEnRlc3RAZW1haWwuYWRkcmVzczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1GY4YFx2ujlZEOJxQVYmsjUnLsd5nFVnNpLE4cV+77sgv9NPNlB8uhn3MXt5leD34rm/2BisCHOifPucYlSrszo2beuKhvwn4+2FxDmWtBEMu/QA16L5IvoOfYZm/gJTsPwKDqvaR0tTU67a9OtxwNTBMI56YKtmwd/o8d3hYv9cg+9ZGAZ/gKONcg/OWYx/XRh6bd0g8DMbCikpWgXKDsvvK1Nk+VtkDO1JxuBaj4Lz/p/MifTfnHoqHxWOWl4EaTs4Ychxsv34/rSj1KD1tJqorIv5Xv2aqv4sjxfbrYzX4kvS5SC1goIovLnhj5UjmQ3Qy8u65eow/LLWw+YFcCAwEAAaCBpTAgBgkqhkiG9w0BCQcxEwwRaWdub3JlZCBjaGFsbGVuZ2UwKAYJKoZIhvcNAQkCMRsMGWlnbm9yZWQgdW5zdHJ1Y3R1cmVkIG5hbWUwVwYJKoZIhvcNAQkOMUowSDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAuBgNVHREEJzAlgRFnb3BoZXJAZ29sYW5nLm9yZ4IQdGVzdC5leGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAgxe2N5O48EMsYE7o0rZBB0wi3Ov5/yYfnmmVI22Y3sP6VXbLDW0+UWIeSccOhzUCcZ/G4qcrfhhx6gTZTeA01nP7TdTJURvWAH5iFqj9sQ0qnLq6nEcVHij3sG6M5+BxAIVClQBk6lTCzgphc835Fjj6qSLuJ20XHdL5UfUbiJxx299CHgyBRL+hBUIPfz8p+ZgamyAuDLfnj54zzcRVyLlrmMLNPZNll1Q70RxoU6uWvLH8wB8vQe3Q/guSGubLyLRTUQVPh+dw1L4t8MKFWfX/48jwRM4gIRHFHPeAAE9D9YAoqdIvj/iFm/eQ++7DP8MDwOZWsXeB6jjwHuLmkQ==",
12221222
}
1223+
1224+
var md5cert = `
1225+
-----BEGIN CERTIFICATE-----
1226+
MIIB4TCCAUoCCQCfmw3vMgPS5TANBgkqhkiG9w0BAQQFADA1MQswCQYDVQQGEwJB
1227+
VTETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEChMITUQ1IEluYy4wHhcNMTUx
1228+
MjAzMTkyOTMyWhcNMjkwODEyMTkyOTMyWjA1MQswCQYDVQQGEwJBVTETMBEGA1UE
1229+
CBMKU29tZS1TdGF0ZTERMA8GA1UEChMITUQ1IEluYy4wgZ8wDQYJKoZIhvcNAQEB
1230+
BQADgY0AMIGJAoGBANrq2nhLQj5mlXbpVX3QUPhfEm/vdEqPkoWtR/jRZIWm4WGf
1231+
Wpq/LKHJx2Pqwn+t117syN8l4U5unyAi1BJSXjBwPZNd7dXjcuJ+bRLV7FZ/iuvs
1232+
cfYyQQFTxan4TaJMd0x1HoNDbNbjHa02IyjjYE/r3mb/PIg+J2t5AZEh80lPAgMB
1233+
AAEwDQYJKoZIhvcNAQEEBQADgYEAjGzp3K3ey/YfKHohf33yHHWd695HQxDAP+wY
1234+
cs9/TAyLR+gJzJP7d18EcDDLJWVi7bhfa4EAD86di05azOh9kWSn4b3o9QYRGCSw
1235+
GNnI3Zk0cwNKA49hZntKKiy22DhRk7JAHF01d6Bu3KkHkmENrtJ+zj/+159WAnUa
1236+
qViorq4=
1237+
-----END CERTIFICATE-----
1238+
`
1239+
1240+
func TestMD5(t *testing.T) {
1241+
pemBlock, _ := pem.Decode([]byte(md5cert))
1242+
cert, err := ParseCertificate(pemBlock.Bytes)
1243+
if err != nil {
1244+
t.Fatalf("failed to parse certificate: %s", err)
1245+
}
1246+
if sa := cert.SignatureAlgorithm; sa != MD5WithRSA {
1247+
t.Errorf("signature algorithm is %v, want %v", sa, MD5WithRSA)
1248+
}
1249+
if err = cert.CheckSignatureFrom(cert); err == nil {
1250+
t.Fatalf("certificate verification succeeded incorrectly")
1251+
}
1252+
if err != ErrInsecureAlgorithm {
1253+
t.Fatalf("certificate verification returned %q, wanted %q", err, ErrInsecureAlgorithm)
1254+
}
1255+
}

0 commit comments

Comments
 (0)