}
case 14:
// RFC 5280, 4.2.1.2
+ if e.Critical {
+ // Conforming CAs MUST mark this extension as non-critical
+ return errors.New("x509: subject key identifier incorrectly marked critical")
+ }
val := cryptobyte.String(e.Value)
var skid cryptobyte.String
if !val.ReadASN1(&skid, cryptobyte_asn1.OCTET_STRING) {
t.Fatalf("ParseCertificate() unexpected error: %v, want: %s", err, expectedErr)
}
}
+
+func TestRejectCriticalSKI(t *testing.T) {
+ template := Certificate{
+ SerialNumber: big.NewInt(1),
+ Subject: pkix.Name{CommonName: "Cert"},
+ NotBefore: time.Unix(1000, 0),
+ NotAfter: time.Unix(100000, 0),
+ ExtraExtensions: []pkix.Extension{
+ {
+ Id: asn1.ObjectIdentifier{2, 5, 29, 14},
+ Critical: true,
+ Value: []byte{1, 2, 3},
+ },
+ },
+ }
+ certDER, err := CreateCertificate(rand.Reader, &template, &template, rsaPrivateKey.Public(), rsaPrivateKey)
+ if err != nil {
+ t.Fatalf("CreateCertificate() unexpected error: %v", err)
+ }
+ expectedErr := "x509: subject key identifier incorrectly marked critical"
+ _, err = ParseCertificate(certDER)
+ if err == nil || err.Error() != expectedErr {
+ t.Fatalf("ParseCertificate() unexpected error: %v, want: %s", err, expectedErr)
+ }
+}