1
0
mirror of https://github.com/golang/go synced 2024-11-12 05:30:21 -07:00

crypto/x509: convert ErrInsecureAlgorithm into a type

Change-Id: I411aeaf0cf75eb8b1c9005b622f664e9f25e4a68
Reviewed-on: https://go-review.googlesource.com/17400
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Brad Fitzpatrick 2015-12-03 15:23:24 -08:00
parent a6869d1c5c
commit c34bc90ffc
2 changed files with 52 additions and 8 deletions

View File

@ -19,6 +19,7 @@ import (
"encoding/asn1" "encoding/asn1"
"encoding/pem" "encoding/pem"
"errors" "errors"
"fmt"
"io" "io"
"math/big" "math/big"
"net" "net"
@ -174,6 +175,28 @@ const (
ECDSAWithSHA512 ECDSAWithSHA512
) )
var algoName = [...]string{
MD2WithRSA: "MD2-RSA",
MD5WithRSA: "MD5-RSA",
SHA1WithRSA: "SHA1-RSA",
SHA256WithRSA: "SHA256-RSA",
SHA384WithRSA: "SHA384-RSA",
SHA512WithRSA: "SHA512-RSA",
DSAWithSHA1: "DSA-SHA1",
DSAWithSHA256: "DSA-SHA256",
ECDSAWithSHA1: "ECDSA-SHA1",
ECDSAWithSHA256: "ECDSA-SHA256",
ECDSAWithSHA384: "ECDSA-SHA384",
ECDSAWithSHA512: "ECDSA-SHA512",
}
func (algo SignatureAlgorithm) String() string {
if 0 < algo && int(algo) < len(algoName) {
return algoName[algo]
}
return strconv.Itoa(int(algo))
}
type PublicKeyAlgorithm int type PublicKeyAlgorithm int
const ( const (
@ -541,9 +564,12 @@ type Certificate struct {
// involves algorithms that are not currently implemented. // involves algorithms that are not currently implemented.
var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented") var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented")
// ErrInsecureAlgorithm results from attempting to perform an operation that // An InsecureAlgorithmError
// involves algorithms that are deemed insecure, notably MD5. type InsecureAlgorithmError SignatureAlgorithm
var ErrInsecureAlgorithm = errors.New("x509: cannot verify signature: insecure algorithm")
func (e InsecureAlgorithmError) Error() string {
return fmt.Sprintf("x509: cannot verify signature: insecure algorithm %v", SignatureAlgorithm(e))
}
// ConstraintViolationError results when a requested usage is not permitted by // ConstraintViolationError results when a requested usage is not permitted by
// a certificate. For example: checking a signature when the public key isn't a // a certificate. For example: checking a signature when the public key isn't a
@ -656,7 +682,7 @@ func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey
case SHA512WithRSA, ECDSAWithSHA512: case SHA512WithRSA, ECDSAWithSHA512:
hashType = crypto.SHA512 hashType = crypto.SHA512
case MD2WithRSA, MD5WithRSA: case MD2WithRSA, MD5WithRSA:
return ErrInsecureAlgorithm return InsecureAlgorithmError(algo)
default: default:
return ErrUnsupportedAlgorithm return ErrUnsupportedAlgorithm
} }

View File

@ -18,6 +18,7 @@ import (
"encoding/base64" "encoding/base64"
"encoding/hex" "encoding/hex"
"encoding/pem" "encoding/pem"
"fmt"
"internal/testenv" "internal/testenv"
"math/big" "math/big"
"net" "net"
@ -1089,8 +1090,8 @@ func TestCriticalFlagInCSRRequestedExtensions(t *testing.T) {
t.Fatalf("failed to parse CSR: %s", err) t.Fatalf("failed to parse CSR: %s", err)
} }
expected := []struct{ expected := []struct {
Id asn1.ObjectIdentifier Id asn1.ObjectIdentifier
Value []byte Value []byte
}{ }{
{oidExtensionBasicConstraints, fromBase64("MAYBAf8CAQA=")}, {oidExtensionBasicConstraints, fromBase64("MAYBAf8CAQA=")},
@ -1203,6 +1204,23 @@ func TestVerifyEmptyCertificate(t *testing.T) {
} }
} }
func TestInsecureAlgorithmErrorString(t *testing.T) {
tests := []struct {
sa SignatureAlgorithm
want string
}{
{MD2WithRSA, "x509: cannot verify signature: insecure algorithm MD2-RSA"},
{-1, "x509: cannot verify signature: insecure algorithm -1"},
{0, "x509: cannot verify signature: insecure algorithm 0"},
{9999, "x509: cannot verify signature: insecure algorithm 9999"},
}
for i, tt := range tests {
if got := fmt.Sprint(InsecureAlgorithmError(tt.sa)); got != tt.want {
t.Errorf("%d. mismatch.\n got: %s\nwant: %s\n", i, got, tt.want)
}
}
}
// These CSR was generated with OpenSSL: // These CSR was generated with OpenSSL:
// openssl req -out CSR.csr -new -sha256 -nodes -keyout privateKey.key -config openssl.cnf // openssl req -out CSR.csr -new -sha256 -nodes -keyout privateKey.key -config openssl.cnf
// //
@ -1249,7 +1267,7 @@ func TestMD5(t *testing.T) {
if err = cert.CheckSignatureFrom(cert); err == nil { if err = cert.CheckSignatureFrom(cert); err == nil {
t.Fatalf("certificate verification succeeded incorrectly") t.Fatalf("certificate verification succeeded incorrectly")
} }
if err != ErrInsecureAlgorithm { if _, ok := err.(InsecureAlgorithmError); !ok {
t.Fatalf("certificate verification returned %q, wanted %q", err, ErrInsecureAlgorithm) t.Fatalf("certificate verification returned %v (%T), wanted InsecureAlgorithmError", err, err)
} }
} }