return
}
+func parseAuthorityKeyIdentifier(e pkix.Extension) ([]byte, error) {
+ // RFC 5280, Section 4.2.1.1
+ if e.Critical {
+ // Conforming CAs MUST mark this extension as non-critical
+ return nil, errors.New("x509: authority key identifier incorrectly marked critical")
+ }
+ val := cryptobyte.String(e.Value)
+ var akid cryptobyte.String
+ if !val.ReadASN1(&akid, cryptobyte_asn1.SEQUENCE) {
+ return nil, errors.New("x509: invalid authority key identifier")
+ }
+ if akid.PeekASN1Tag(cryptobyte_asn1.Tag(0).ContextSpecific()) {
+ if !akid.ReadASN1(&akid, cryptobyte_asn1.Tag(0).ContextSpecific()) {
+ return nil, errors.New("x509: invalid authority key identifier")
+ }
+ return akid, nil
+ }
+ return nil, nil
+}
+
func parseExtKeyUsageExtension(der cryptobyte.String) ([]ExtKeyUsage, []asn1.ObjectIdentifier, error) {
var extKeyUsages []ExtKeyUsage
var unknownUsages []asn1.ObjectIdentifier
}
case 35:
- // RFC 5280, 4.2.1.1
- if e.Critical {
- // Conforming CAs MUST mark this extension as non-critical
- return errors.New("x509: authority key identifier incorrectly marked critical")
- }
- val := cryptobyte.String(e.Value)
- var akid cryptobyte.String
- if !val.ReadASN1(&akid, cryptobyte_asn1.SEQUENCE) {
- return errors.New("x509: invalid authority key identifier")
- }
- if akid.PeekASN1Tag(cryptobyte_asn1.Tag(0).ContextSpecific()) {
- if !akid.ReadASN1(&akid, cryptobyte_asn1.Tag(0).ContextSpecific()) {
- return errors.New("x509: invalid authority key identifier")
- }
- out.AuthorityKeyId = akid
+ out.AuthorityKeyId, err = parseAuthorityKeyIdentifier(e)
+ if err != nil {
+ return err
}
case 37:
out.ExtKeyUsage, out.UnknownExtKeyUsage, err = parseExtKeyUsageExtension(e.Value)
return nil, err
}
if ext.Id.Equal(oidExtensionAuthorityKeyId) {
- rl.AuthorityKeyId = ext.Value
+ rl.AuthorityKeyId, err = parseAuthorityKeyIdentifier(ext)
+ if err != nil {
+ return nil, err
+ }
} else if ext.Id.Equal(oidExtensionCRLNumber) {
value := cryptobyte.String(ext.Value)
rl.Number = new(big.Int)
t.Fatalf("Generated CRL has wrong Number: got %s, want %s",
parsedCRL.Number.String(), tc.template.Number.String())
}
- if !bytes.Equal(parsedCRL.AuthorityKeyId, expectedAKI) {
- t.Fatalf("Generated CRL has wrong Number: got %x, want %x",
- parsedCRL.AuthorityKeyId, expectedAKI)
+ if !bytes.Equal(parsedCRL.AuthorityKeyId, tc.issuer.SubjectKeyId) {
+ t.Fatalf("Generated CRL has wrong AuthorityKeyId: got %x, want %x",
+ parsedCRL.AuthorityKeyId, tc.issuer.SubjectKeyId)
}
})
}