github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/crypto/x509/x509.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package x509 implements a subset of the X.509 standard. 6 // 7 // It allows parsing and generating certificates, certificate signing 8 // requests, certificate revocation lists, and encoded public and private keys. 9 // It provides a certificate verifier, complete with a chain builder. 10 // 11 // The package targets the X.509 technical profile defined by the IETF (RFC 12 // 2459/3280/5280), and as further restricted by the CA/Browser Forum Baseline 13 // Requirements. There is minimal support for features outside of these 14 // profiles, as the primary goal of the package is to provide compatibility 15 // with the publicly trusted TLS certificate ecosystem and its policies and 16 // constraints. 17 // 18 // On macOS and Windows, certificate verification is handled by system APIs, but 19 // the package aims to apply consistent validation rules across operating 20 // systems. 21 package x509 22 23 import ( 24 "bytes" 25 "crypto" 26 "crypto/ecdh" 27 "crypto/ecdsa" 28 "crypto/ed25519" 29 "crypto/elliptic" 30 "crypto/rsa" 31 "crypto/sha1" 32 "crypto/x509/pkix" 33 "encoding/asn1" 34 "encoding/pem" 35 "errors" 36 "fmt" 37 "internal/godebug" 38 "io" 39 "math/big" 40 "net" 41 "net/url" 42 "strconv" 43 "time" 44 "unicode" 45 46 // Explicitly import these for their crypto.RegisterHash init side-effects. 47 // Keep these as blank imports, even if they're imported above. 48 _ "crypto/sha1" 49 _ "crypto/sha256" 50 _ "crypto/sha512" 51 52 "golang.org/x/crypto/cryptobyte" 53 cryptobyte_asn1 "golang.org/x/crypto/cryptobyte/asn1" 54 ) 55 56 // pkixPublicKey reflects a PKIX public key structure. See SubjectPublicKeyInfo 57 // in RFC 3280. 58 type pkixPublicKey struct { 59 Algo pkix.AlgorithmIdentifier 60 BitString asn1.BitString 61 } 62 63 // ParsePKIXPublicKey parses a public key in PKIX, ASN.1 DER form. The encoded 64 // public key is a SubjectPublicKeyInfo structure (see RFC 5280, Section 4.1). 65 // 66 // It returns a *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey, 67 // ed25519.PublicKey (not a pointer), or *ecdh.PublicKey (for X25519). 68 // More types might be supported in the future. 69 // 70 // This kind of key is commonly encoded in PEM blocks of type "PUBLIC KEY". 71 func ParsePKIXPublicKey(derBytes []byte) (pub any, err error) { 72 var pki publicKeyInfo 73 if rest, err := asn1.Unmarshal(derBytes, &pki); err != nil { 74 if _, err := asn1.Unmarshal(derBytes, &pkcs1PublicKey{}); err == nil { 75 return nil, errors.New("x509: failed to parse public key (use ParsePKCS1PublicKey instead for this key format)") 76 } 77 return nil, err 78 } else if len(rest) != 0 { 79 return nil, errors.New("x509: trailing data after ASN.1 of public-key") 80 } 81 return parsePublicKey(&pki) 82 } 83 84 func marshalPublicKey(pub any) (publicKeyBytes []byte, publicKeyAlgorithm pkix.AlgorithmIdentifier, err error) { 85 switch pub := pub.(type) { 86 case *rsa.PublicKey: 87 publicKeyBytes, err = asn1.Marshal(pkcs1PublicKey{ 88 N: pub.N, 89 E: pub.E, 90 }) 91 if err != nil { 92 return nil, pkix.AlgorithmIdentifier{}, err 93 } 94 publicKeyAlgorithm.Algorithm = oidPublicKeyRSA 95 // This is a NULL parameters value which is required by 96 // RFC 3279, Section 2.3.1. 97 publicKeyAlgorithm.Parameters = asn1.NullRawValue 98 case *ecdsa.PublicKey: 99 oid, ok := oidFromNamedCurve(pub.Curve) 100 if !ok { 101 return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: unsupported elliptic curve") 102 } 103 if !pub.Curve.IsOnCurve(pub.X, pub.Y) { 104 return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: invalid elliptic curve public key") 105 } 106 publicKeyBytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) 107 publicKeyAlgorithm.Algorithm = oidPublicKeyECDSA 108 var paramBytes []byte 109 paramBytes, err = asn1.Marshal(oid) 110 if err != nil { 111 return 112 } 113 publicKeyAlgorithm.Parameters.FullBytes = paramBytes 114 case ed25519.PublicKey: 115 publicKeyBytes = pub 116 publicKeyAlgorithm.Algorithm = oidPublicKeyEd25519 117 case *ecdh.PublicKey: 118 publicKeyBytes = pub.Bytes() 119 if pub.Curve() == ecdh.X25519() { 120 publicKeyAlgorithm.Algorithm = oidPublicKeyX25519 121 } else { 122 oid, ok := oidFromECDHCurve(pub.Curve()) 123 if !ok { 124 return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: unsupported elliptic curve") 125 } 126 publicKeyAlgorithm.Algorithm = oidPublicKeyECDSA 127 var paramBytes []byte 128 paramBytes, err = asn1.Marshal(oid) 129 if err != nil { 130 return 131 } 132 publicKeyAlgorithm.Parameters.FullBytes = paramBytes 133 } 134 default: 135 return nil, pkix.AlgorithmIdentifier{}, fmt.Errorf("x509: unsupported public key type: %T", pub) 136 } 137 138 return publicKeyBytes, publicKeyAlgorithm, nil 139 } 140 141 // MarshalPKIXPublicKey converts a public key to PKIX, ASN.1 DER form. 142 // The encoded public key is a SubjectPublicKeyInfo structure 143 // (see RFC 5280, Section 4.1). 144 // 145 // The following key types are currently supported: *rsa.PublicKey, 146 // *ecdsa.PublicKey, ed25519.PublicKey (not a pointer), and *ecdh.PublicKey. 147 // Unsupported key types result in an error. 148 // 149 // This kind of key is commonly encoded in PEM blocks of type "PUBLIC KEY". 150 func MarshalPKIXPublicKey(pub any) ([]byte, error) { 151 var publicKeyBytes []byte 152 var publicKeyAlgorithm pkix.AlgorithmIdentifier 153 var err error 154 155 if publicKeyBytes, publicKeyAlgorithm, err = marshalPublicKey(pub); err != nil { 156 return nil, err 157 } 158 159 pkix := pkixPublicKey{ 160 Algo: publicKeyAlgorithm, 161 BitString: asn1.BitString{ 162 Bytes: publicKeyBytes, 163 BitLength: 8 * len(publicKeyBytes), 164 }, 165 } 166 167 ret, _ := asn1.Marshal(pkix) 168 return ret, nil 169 } 170 171 // These structures reflect the ASN.1 structure of X.509 certificates.: 172 173 type certificate struct { 174 TBSCertificate tbsCertificate 175 SignatureAlgorithm pkix.AlgorithmIdentifier 176 SignatureValue asn1.BitString 177 } 178 179 type tbsCertificate struct { 180 Raw asn1.RawContent 181 Version int `asn1:"optional,explicit,default:0,tag:0"` 182 SerialNumber *big.Int 183 SignatureAlgorithm pkix.AlgorithmIdentifier 184 Issuer asn1.RawValue 185 Validity validity 186 Subject asn1.RawValue 187 PublicKey publicKeyInfo 188 UniqueId asn1.BitString `asn1:"optional,tag:1"` 189 SubjectUniqueId asn1.BitString `asn1:"optional,tag:2"` 190 Extensions []pkix.Extension `asn1:"omitempty,optional,explicit,tag:3"` 191 } 192 193 type dsaAlgorithmParameters struct { 194 P, Q, G *big.Int 195 } 196 197 type validity struct { 198 NotBefore, NotAfter time.Time 199 } 200 201 type publicKeyInfo struct { 202 Raw asn1.RawContent 203 Algorithm pkix.AlgorithmIdentifier 204 PublicKey asn1.BitString 205 } 206 207 // RFC 5280, 4.2.1.1 208 type authKeyId struct { 209 Id []byte `asn1:"optional,tag:0"` 210 } 211 212 type SignatureAlgorithm int 213 214 const ( 215 UnknownSignatureAlgorithm SignatureAlgorithm = iota 216 217 MD2WithRSA // Unsupported. 218 MD5WithRSA // Only supported for signing, not verification. 219 SHA1WithRSA // Only supported for signing, and verification of CRLs, CSRs, and OCSP responses. 220 SHA256WithRSA 221 SHA384WithRSA 222 SHA512WithRSA 223 DSAWithSHA1 // Unsupported. 224 DSAWithSHA256 // Unsupported. 225 ECDSAWithSHA1 // Only supported for signing, and verification of CRLs, CSRs, and OCSP responses. 226 ECDSAWithSHA256 227 ECDSAWithSHA384 228 ECDSAWithSHA512 229 SHA256WithRSAPSS 230 SHA384WithRSAPSS 231 SHA512WithRSAPSS 232 PureEd25519 233 ) 234 235 func (algo SignatureAlgorithm) isRSAPSS() bool { 236 switch algo { 237 case SHA256WithRSAPSS, SHA384WithRSAPSS, SHA512WithRSAPSS: 238 return true 239 default: 240 return false 241 } 242 } 243 244 func (algo SignatureAlgorithm) String() string { 245 for _, details := range signatureAlgorithmDetails { 246 if details.algo == algo { 247 return details.name 248 } 249 } 250 return strconv.Itoa(int(algo)) 251 } 252 253 type PublicKeyAlgorithm int 254 255 const ( 256 UnknownPublicKeyAlgorithm PublicKeyAlgorithm = iota 257 RSA 258 DSA // Only supported for parsing. 259 ECDSA 260 Ed25519 261 ) 262 263 var publicKeyAlgoName = [...]string{ 264 RSA: "RSA", 265 DSA: "DSA", 266 ECDSA: "ECDSA", 267 Ed25519: "Ed25519", 268 } 269 270 func (algo PublicKeyAlgorithm) String() string { 271 if 0 < algo && int(algo) < len(publicKeyAlgoName) { 272 return publicKeyAlgoName[algo] 273 } 274 return strconv.Itoa(int(algo)) 275 } 276 277 // OIDs for signature algorithms 278 // 279 // pkcs-1 OBJECT IDENTIFIER ::= { 280 // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } 281 // 282 // RFC 3279 2.2.1 RSA Signature Algorithms 283 // 284 // md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } 285 // 286 // md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } 287 // 288 // sha-1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } 289 // 290 // dsaWithSha1 OBJECT IDENTIFIER ::= { 291 // iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 3 } 292 // 293 // RFC 3279 2.2.3 ECDSA Signature Algorithm 294 // 295 // ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { 296 // iso(1) member-body(2) us(840) ansi-x962(10045) 297 // signatures(4) ecdsa-with-SHA1(1)} 298 // 299 // RFC 4055 5 PKCS #1 Version 1.5 300 // 301 // sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } 302 // 303 // sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } 304 // 305 // sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } 306 // 307 // RFC 5758 3.1 DSA Signature Algorithms 308 // 309 // dsaWithSha256 OBJECT IDENTIFIER ::= { 310 // joint-iso-ccitt(2) country(16) us(840) organization(1) gov(101) 311 // csor(3) algorithms(4) id-dsa-with-sha2(3) 2} 312 // 313 // RFC 5758 3.2 ECDSA Signature Algorithm 314 // 315 // ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) 316 // us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } 317 // 318 // ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) 319 // us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } 320 // 321 // ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) 322 // us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } 323 // 324 // RFC 8410 3 Curve25519 and Curve448 Algorithm Identifiers 325 // 326 // id-Ed25519 OBJECT IDENTIFIER ::= { 1 3 101 112 } 327 var ( 328 oidSignatureMD2WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 2} 329 oidSignatureMD5WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 4} 330 oidSignatureSHA1WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5} 331 oidSignatureSHA256WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 11} 332 oidSignatureSHA384WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 12} 333 oidSignatureSHA512WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 13} 334 oidSignatureRSAPSS = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 10} 335 oidSignatureDSAWithSHA1 = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 3} 336 oidSignatureDSAWithSHA256 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 3, 2} 337 oidSignatureECDSAWithSHA1 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 1} 338 oidSignatureECDSAWithSHA256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 2} 339 oidSignatureECDSAWithSHA384 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 3} 340 oidSignatureECDSAWithSHA512 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 4} 341 oidSignatureEd25519 = asn1.ObjectIdentifier{1, 3, 101, 112} 342 343 oidSHA256 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 1} 344 oidSHA384 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 2} 345 oidSHA512 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 3} 346 347 oidMGF1 = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 8} 348 349 // oidISOSignatureSHA1WithRSA means the same as oidSignatureSHA1WithRSA 350 // but it's specified by ISO. Microsoft's makecert.exe has been known 351 // to produce certificates with this OID. 352 oidISOSignatureSHA1WithRSA = asn1.ObjectIdentifier{1, 3, 14, 3, 2, 29} 353 ) 354 355 var signatureAlgorithmDetails = []struct { 356 algo SignatureAlgorithm 357 name string 358 oid asn1.ObjectIdentifier 359 pubKeyAlgo PublicKeyAlgorithm 360 hash crypto.Hash 361 }{ 362 {MD2WithRSA, "MD2-RSA", oidSignatureMD2WithRSA, RSA, crypto.Hash(0) /* no value for MD2 */}, 363 {MD5WithRSA, "MD5-RSA", oidSignatureMD5WithRSA, RSA, crypto.MD5}, 364 {SHA1WithRSA, "SHA1-RSA", oidSignatureSHA1WithRSA, RSA, crypto.SHA1}, 365 {SHA1WithRSA, "SHA1-RSA", oidISOSignatureSHA1WithRSA, RSA, crypto.SHA1}, 366 {SHA256WithRSA, "SHA256-RSA", oidSignatureSHA256WithRSA, RSA, crypto.SHA256}, 367 {SHA384WithRSA, "SHA384-RSA", oidSignatureSHA384WithRSA, RSA, crypto.SHA384}, 368 {SHA512WithRSA, "SHA512-RSA", oidSignatureSHA512WithRSA, RSA, crypto.SHA512}, 369 {SHA256WithRSAPSS, "SHA256-RSAPSS", oidSignatureRSAPSS, RSA, crypto.SHA256}, 370 {SHA384WithRSAPSS, "SHA384-RSAPSS", oidSignatureRSAPSS, RSA, crypto.SHA384}, 371 {SHA512WithRSAPSS, "SHA512-RSAPSS", oidSignatureRSAPSS, RSA, crypto.SHA512}, 372 {DSAWithSHA1, "DSA-SHA1", oidSignatureDSAWithSHA1, DSA, crypto.SHA1}, 373 {DSAWithSHA256, "DSA-SHA256", oidSignatureDSAWithSHA256, DSA, crypto.SHA256}, 374 {ECDSAWithSHA1, "ECDSA-SHA1", oidSignatureECDSAWithSHA1, ECDSA, crypto.SHA1}, 375 {ECDSAWithSHA256, "ECDSA-SHA256", oidSignatureECDSAWithSHA256, ECDSA, crypto.SHA256}, 376 {ECDSAWithSHA384, "ECDSA-SHA384", oidSignatureECDSAWithSHA384, ECDSA, crypto.SHA384}, 377 {ECDSAWithSHA512, "ECDSA-SHA512", oidSignatureECDSAWithSHA512, ECDSA, crypto.SHA512}, 378 {PureEd25519, "Ed25519", oidSignatureEd25519, Ed25519, crypto.Hash(0) /* no pre-hashing */}, 379 } 380 381 // hashToPSSParameters contains the DER encoded RSA PSS parameters for the 382 // SHA256, SHA384, and SHA512 hashes as defined in RFC 3447, Appendix A.2.3. 383 // The parameters contain the following values: 384 // - hashAlgorithm contains the associated hash identifier with NULL parameters 385 // - maskGenAlgorithm always contains the default mgf1SHA1 identifier 386 // - saltLength contains the length of the associated hash 387 // - trailerField always contains the default trailerFieldBC value 388 var hashToPSSParameters = map[crypto.Hash]asn1.RawValue{ 389 crypto.SHA256: asn1.RawValue{FullBytes: []byte{48, 52, 160, 15, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 5, 0, 161, 28, 48, 26, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 8, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 1, 5, 0, 162, 3, 2, 1, 32}}, 390 crypto.SHA384: asn1.RawValue{FullBytes: []byte{48, 52, 160, 15, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 2, 5, 0, 161, 28, 48, 26, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 8, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 2, 5, 0, 162, 3, 2, 1, 48}}, 391 crypto.SHA512: asn1.RawValue{FullBytes: []byte{48, 52, 160, 15, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 3, 5, 0, 161, 28, 48, 26, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 8, 48, 13, 6, 9, 96, 134, 72, 1, 101, 3, 4, 2, 3, 5, 0, 162, 3, 2, 1, 64}}, 392 } 393 394 // pssParameters reflects the parameters in an AlgorithmIdentifier that 395 // specifies RSA PSS. See RFC 3447, Appendix A.2.3. 396 type pssParameters struct { 397 // The following three fields are not marked as 398 // optional because the default values specify SHA-1, 399 // which is no longer suitable for use in signatures. 400 Hash pkix.AlgorithmIdentifier `asn1:"explicit,tag:0"` 401 MGF pkix.AlgorithmIdentifier `asn1:"explicit,tag:1"` 402 SaltLength int `asn1:"explicit,tag:2"` 403 TrailerField int `asn1:"optional,explicit,tag:3,default:1"` 404 } 405 406 func getSignatureAlgorithmFromAI(ai pkix.AlgorithmIdentifier) SignatureAlgorithm { 407 if ai.Algorithm.Equal(oidSignatureEd25519) { 408 // RFC 8410, Section 3 409 // > For all of the OIDs, the parameters MUST be absent. 410 if len(ai.Parameters.FullBytes) != 0 { 411 return UnknownSignatureAlgorithm 412 } 413 } 414 415 if !ai.Algorithm.Equal(oidSignatureRSAPSS) { 416 for _, details := range signatureAlgorithmDetails { 417 if ai.Algorithm.Equal(details.oid) { 418 return details.algo 419 } 420 } 421 return UnknownSignatureAlgorithm 422 } 423 424 // RSA PSS is special because it encodes important parameters 425 // in the Parameters. 426 427 var params pssParameters 428 if _, err := asn1.Unmarshal(ai.Parameters.FullBytes, ¶ms); err != nil { 429 return UnknownSignatureAlgorithm 430 } 431 432 var mgf1HashFunc pkix.AlgorithmIdentifier 433 if _, err := asn1.Unmarshal(params.MGF.Parameters.FullBytes, &mgf1HashFunc); err != nil { 434 return UnknownSignatureAlgorithm 435 } 436 437 // PSS is greatly overburdened with options. This code forces them into 438 // three buckets by requiring that the MGF1 hash function always match the 439 // message hash function (as recommended in RFC 3447, Section 8.1), that the 440 // salt length matches the hash length, and that the trailer field has the 441 // default value. 442 if (len(params.Hash.Parameters.FullBytes) != 0 && !bytes.Equal(params.Hash.Parameters.FullBytes, asn1.NullBytes)) || 443 !params.MGF.Algorithm.Equal(oidMGF1) || 444 !mgf1HashFunc.Algorithm.Equal(params.Hash.Algorithm) || 445 (len(mgf1HashFunc.Parameters.FullBytes) != 0 && !bytes.Equal(mgf1HashFunc.Parameters.FullBytes, asn1.NullBytes)) || 446 params.TrailerField != 1 { 447 return UnknownSignatureAlgorithm 448 } 449 450 switch { 451 case params.Hash.Algorithm.Equal(oidSHA256) && params.SaltLength == 32: 452 return SHA256WithRSAPSS 453 case params.Hash.Algorithm.Equal(oidSHA384) && params.SaltLength == 48: 454 return SHA384WithRSAPSS 455 case params.Hash.Algorithm.Equal(oidSHA512) && params.SaltLength == 64: 456 return SHA512WithRSAPSS 457 } 458 459 return UnknownSignatureAlgorithm 460 } 461 462 var ( 463 // RFC 3279, 2.3 Public Key Algorithms 464 // 465 // pkcs-1 OBJECT IDENTIFIER ::== { iso(1) member-body(2) us(840) 466 // rsadsi(113549) pkcs(1) 1 } 467 // 468 // rsaEncryption OBJECT IDENTIFIER ::== { pkcs1-1 1 } 469 // 470 // id-dsa OBJECT IDENTIFIER ::== { iso(1) member-body(2) us(840) 471 // x9-57(10040) x9cm(4) 1 } 472 oidPublicKeyRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1} 473 oidPublicKeyDSA = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 1} 474 // RFC 5480, 2.1.1 Unrestricted Algorithm Identifier and Parameters 475 // 476 // id-ecPublicKey OBJECT IDENTIFIER ::= { 477 // iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } 478 oidPublicKeyECDSA = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1} 479 // RFC 8410, Section 3 480 // 481 // id-X25519 OBJECT IDENTIFIER ::= { 1 3 101 110 } 482 // id-Ed25519 OBJECT IDENTIFIER ::= { 1 3 101 112 } 483 oidPublicKeyX25519 = asn1.ObjectIdentifier{1, 3, 101, 110} 484 oidPublicKeyEd25519 = asn1.ObjectIdentifier{1, 3, 101, 112} 485 ) 486 487 // getPublicKeyAlgorithmFromOID returns the exposed PublicKeyAlgorithm 488 // identifier for public key types supported in certificates and CSRs. Marshal 489 // and Parse functions may support a different set of public key types. 490 func getPublicKeyAlgorithmFromOID(oid asn1.ObjectIdentifier) PublicKeyAlgorithm { 491 switch { 492 case oid.Equal(oidPublicKeyRSA): 493 return RSA 494 case oid.Equal(oidPublicKeyDSA): 495 return DSA 496 case oid.Equal(oidPublicKeyECDSA): 497 return ECDSA 498 case oid.Equal(oidPublicKeyEd25519): 499 return Ed25519 500 } 501 return UnknownPublicKeyAlgorithm 502 } 503 504 // RFC 5480, 2.1.1.1. Named Curve 505 // 506 // secp224r1 OBJECT IDENTIFIER ::= { 507 // iso(1) identified-organization(3) certicom(132) curve(0) 33 } 508 // 509 // secp256r1 OBJECT IDENTIFIER ::= { 510 // iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) 511 // prime(1) 7 } 512 // 513 // secp384r1 OBJECT IDENTIFIER ::= { 514 // iso(1) identified-organization(3) certicom(132) curve(0) 34 } 515 // 516 // secp521r1 OBJECT IDENTIFIER ::= { 517 // iso(1) identified-organization(3) certicom(132) curve(0) 35 } 518 // 519 // NB: secp256r1 is equivalent to prime256v1 520 var ( 521 oidNamedCurveP224 = asn1.ObjectIdentifier{1, 3, 132, 0, 33} 522 oidNamedCurveP256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 3, 1, 7} 523 oidNamedCurveP384 = asn1.ObjectIdentifier{1, 3, 132, 0, 34} 524 oidNamedCurveP521 = asn1.ObjectIdentifier{1, 3, 132, 0, 35} 525 ) 526 527 func namedCurveFromOID(oid asn1.ObjectIdentifier) elliptic.Curve { 528 switch { 529 case oid.Equal(oidNamedCurveP224): 530 return elliptic.P224() 531 case oid.Equal(oidNamedCurveP256): 532 return elliptic.P256() 533 case oid.Equal(oidNamedCurveP384): 534 return elliptic.P384() 535 case oid.Equal(oidNamedCurveP521): 536 return elliptic.P521() 537 } 538 return nil 539 } 540 541 func oidFromNamedCurve(curve elliptic.Curve) (asn1.ObjectIdentifier, bool) { 542 switch curve { 543 case elliptic.P224(): 544 return oidNamedCurveP224, true 545 case elliptic.P256(): 546 return oidNamedCurveP256, true 547 case elliptic.P384(): 548 return oidNamedCurveP384, true 549 case elliptic.P521(): 550 return oidNamedCurveP521, true 551 } 552 553 return nil, false 554 } 555 556 func oidFromECDHCurve(curve ecdh.Curve) (asn1.ObjectIdentifier, bool) { 557 switch curve { 558 case ecdh.X25519(): 559 return oidPublicKeyX25519, true 560 case ecdh.P256(): 561 return oidNamedCurveP256, true 562 case ecdh.P384(): 563 return oidNamedCurveP384, true 564 case ecdh.P521(): 565 return oidNamedCurveP521, true 566 } 567 568 return nil, false 569 } 570 571 // KeyUsage represents the set of actions that are valid for a given key. It's 572 // a bitmap of the KeyUsage* constants. 573 type KeyUsage int 574 575 const ( 576 KeyUsageDigitalSignature KeyUsage = 1 << iota 577 KeyUsageContentCommitment 578 KeyUsageKeyEncipherment 579 KeyUsageDataEncipherment 580 KeyUsageKeyAgreement 581 KeyUsageCertSign 582 KeyUsageCRLSign 583 KeyUsageEncipherOnly 584 KeyUsageDecipherOnly 585 ) 586 587 // RFC 5280, 4.2.1.12 Extended Key Usage 588 // 589 // anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } 590 // 591 // id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } 592 // 593 // id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } 594 // id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } 595 // id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } 596 // id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } 597 // id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } 598 // id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } 599 var ( 600 oidExtKeyUsageAny = asn1.ObjectIdentifier{2, 5, 29, 37, 0} 601 oidExtKeyUsageServerAuth = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 1} 602 oidExtKeyUsageClientAuth = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 2} 603 oidExtKeyUsageCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 3} 604 oidExtKeyUsageEmailProtection = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 4} 605 oidExtKeyUsageIPSECEndSystem = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 5} 606 oidExtKeyUsageIPSECTunnel = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 6} 607 oidExtKeyUsageIPSECUser = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 7} 608 oidExtKeyUsageTimeStamping = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 8} 609 oidExtKeyUsageOCSPSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 9} 610 oidExtKeyUsageMicrosoftServerGatedCrypto = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 10, 3, 3} 611 oidExtKeyUsageNetscapeServerGatedCrypto = asn1.ObjectIdentifier{2, 16, 840, 1, 113730, 4, 1} 612 oidExtKeyUsageMicrosoftCommercialCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 2, 1, 22} 613 oidExtKeyUsageMicrosoftKernelCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 61, 1, 1} 614 ) 615 616 // ExtKeyUsage represents an extended set of actions that are valid for a given key. 617 // Each of the ExtKeyUsage* constants define a unique action. 618 type ExtKeyUsage int 619 620 const ( 621 ExtKeyUsageAny ExtKeyUsage = iota 622 ExtKeyUsageServerAuth 623 ExtKeyUsageClientAuth 624 ExtKeyUsageCodeSigning 625 ExtKeyUsageEmailProtection 626 ExtKeyUsageIPSECEndSystem 627 ExtKeyUsageIPSECTunnel 628 ExtKeyUsageIPSECUser 629 ExtKeyUsageTimeStamping 630 ExtKeyUsageOCSPSigning 631 ExtKeyUsageMicrosoftServerGatedCrypto 632 ExtKeyUsageNetscapeServerGatedCrypto 633 ExtKeyUsageMicrosoftCommercialCodeSigning 634 ExtKeyUsageMicrosoftKernelCodeSigning 635 ) 636 637 // extKeyUsageOIDs contains the mapping between an ExtKeyUsage and its OID. 638 var extKeyUsageOIDs = []struct { 639 extKeyUsage ExtKeyUsage 640 oid asn1.ObjectIdentifier 641 }{ 642 {ExtKeyUsageAny, oidExtKeyUsageAny}, 643 {ExtKeyUsageServerAuth, oidExtKeyUsageServerAuth}, 644 {ExtKeyUsageClientAuth, oidExtKeyUsageClientAuth}, 645 {ExtKeyUsageCodeSigning, oidExtKeyUsageCodeSigning}, 646 {ExtKeyUsageEmailProtection, oidExtKeyUsageEmailProtection}, 647 {ExtKeyUsageIPSECEndSystem, oidExtKeyUsageIPSECEndSystem}, 648 {ExtKeyUsageIPSECTunnel, oidExtKeyUsageIPSECTunnel}, 649 {ExtKeyUsageIPSECUser, oidExtKeyUsageIPSECUser}, 650 {ExtKeyUsageTimeStamping, oidExtKeyUsageTimeStamping}, 651 {ExtKeyUsageOCSPSigning, oidExtKeyUsageOCSPSigning}, 652 {ExtKeyUsageMicrosoftServerGatedCrypto, oidExtKeyUsageMicrosoftServerGatedCrypto}, 653 {ExtKeyUsageNetscapeServerGatedCrypto, oidExtKeyUsageNetscapeServerGatedCrypto}, 654 {ExtKeyUsageMicrosoftCommercialCodeSigning, oidExtKeyUsageMicrosoftCommercialCodeSigning}, 655 {ExtKeyUsageMicrosoftKernelCodeSigning, oidExtKeyUsageMicrosoftKernelCodeSigning}, 656 } 657 658 func extKeyUsageFromOID(oid asn1.ObjectIdentifier) (eku ExtKeyUsage, ok bool) { 659 for _, pair := range extKeyUsageOIDs { 660 if oid.Equal(pair.oid) { 661 return pair.extKeyUsage, true 662 } 663 } 664 return 665 } 666 667 func oidFromExtKeyUsage(eku ExtKeyUsage) (oid asn1.ObjectIdentifier, ok bool) { 668 for _, pair := range extKeyUsageOIDs { 669 if eku == pair.extKeyUsage { 670 return pair.oid, true 671 } 672 } 673 return 674 } 675 676 // A Certificate represents an X.509 certificate. 677 type Certificate struct { 678 Raw []byte // Complete ASN.1 DER content (certificate, signature algorithm and signature). 679 RawTBSCertificate []byte // Certificate part of raw ASN.1 DER content. 680 RawSubjectPublicKeyInfo []byte // DER encoded SubjectPublicKeyInfo. 681 RawSubject []byte // DER encoded Subject 682 RawIssuer []byte // DER encoded Issuer 683 684 Signature []byte 685 SignatureAlgorithm SignatureAlgorithm 686 687 PublicKeyAlgorithm PublicKeyAlgorithm 688 PublicKey any 689 690 Version int 691 SerialNumber *big.Int 692 Issuer pkix.Name 693 Subject pkix.Name 694 NotBefore, NotAfter time.Time // Validity bounds. 695 KeyUsage KeyUsage 696 697 // Extensions contains raw X.509 extensions. When parsing certificates, 698 // this can be used to extract non-critical extensions that are not 699 // parsed by this package. When marshaling certificates, the Extensions 700 // field is ignored, see ExtraExtensions. 701 Extensions []pkix.Extension 702 703 // ExtraExtensions contains extensions to be copied, raw, into any 704 // marshaled certificates. Values override any extensions that would 705 // otherwise be produced based on the other fields. The ExtraExtensions 706 // field is not populated when parsing certificates, see Extensions. 707 ExtraExtensions []pkix.Extension 708 709 // UnhandledCriticalExtensions contains a list of extension IDs that 710 // were not (fully) processed when parsing. Verify will fail if this 711 // slice is non-empty, unless verification is delegated to an OS 712 // library which understands all the critical extensions. 713 // 714 // Users can access these extensions using Extensions and can remove 715 // elements from this slice if they believe that they have been 716 // handled. 717 UnhandledCriticalExtensions []asn1.ObjectIdentifier 718 719 ExtKeyUsage []ExtKeyUsage // Sequence of extended key usages. 720 UnknownExtKeyUsage []asn1.ObjectIdentifier // Encountered extended key usages unknown to this package. 721 722 // BasicConstraintsValid indicates whether IsCA, MaxPathLen, 723 // and MaxPathLenZero are valid. 724 BasicConstraintsValid bool 725 IsCA bool 726 727 // MaxPathLen and MaxPathLenZero indicate the presence and 728 // value of the BasicConstraints' "pathLenConstraint". 729 // 730 // When parsing a certificate, a positive non-zero MaxPathLen 731 // means that the field was specified, -1 means it was unset, 732 // and MaxPathLenZero being true mean that the field was 733 // explicitly set to zero. The case of MaxPathLen==0 with MaxPathLenZero==false 734 // should be treated equivalent to -1 (unset). 735 // 736 // When generating a certificate, an unset pathLenConstraint 737 // can be requested with either MaxPathLen == -1 or using the 738 // zero value for both MaxPathLen and MaxPathLenZero. 739 MaxPathLen int 740 // MaxPathLenZero indicates that BasicConstraintsValid==true 741 // and MaxPathLen==0 should be interpreted as an actual 742 // maximum path length of zero. Otherwise, that combination is 743 // interpreted as MaxPathLen not being set. 744 MaxPathLenZero bool 745 746 SubjectKeyId []byte 747 AuthorityKeyId []byte 748 749 // RFC 5280, 4.2.2.1 (Authority Information Access) 750 OCSPServer []string 751 IssuingCertificateURL []string 752 753 // Subject Alternate Name values. (Note that these values may not be valid 754 // if invalid values were contained within a parsed certificate. For 755 // example, an element of DNSNames may not be a valid DNS domain name.) 756 DNSNames []string 757 EmailAddresses []string 758 IPAddresses []net.IP 759 URIs []*url.URL 760 761 // Name constraints 762 PermittedDNSDomainsCritical bool // if true then the name constraints are marked critical. 763 PermittedDNSDomains []string 764 ExcludedDNSDomains []string 765 PermittedIPRanges []*net.IPNet 766 ExcludedIPRanges []*net.IPNet 767 PermittedEmailAddresses []string 768 ExcludedEmailAddresses []string 769 PermittedURIDomains []string 770 ExcludedURIDomains []string 771 772 // CRL Distribution Points 773 CRLDistributionPoints []string 774 775 PolicyIdentifiers []asn1.ObjectIdentifier 776 } 777 778 // ErrUnsupportedAlgorithm results from attempting to perform an operation that 779 // involves algorithms that are not currently implemented. 780 var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented") 781 782 // An InsecureAlgorithmError indicates that the SignatureAlgorithm used to 783 // generate the signature is not secure, and the signature has been rejected. 784 // 785 // To temporarily restore support for SHA-1 signatures, include the value 786 // "x509sha1=1" in the GODEBUG environment variable. Note that this option will 787 // be removed in a future release. 788 type InsecureAlgorithmError SignatureAlgorithm 789 790 func (e InsecureAlgorithmError) Error() string { 791 var override string 792 if SignatureAlgorithm(e) == SHA1WithRSA || SignatureAlgorithm(e) == ECDSAWithSHA1 { 793 override = " (temporarily override with GODEBUG=x509sha1=1)" 794 } 795 return fmt.Sprintf("x509: cannot verify signature: insecure algorithm %v", SignatureAlgorithm(e)) + override 796 } 797 798 // ConstraintViolationError results when a requested usage is not permitted by 799 // a certificate. For example: checking a signature when the public key isn't a 800 // certificate signing key. 801 type ConstraintViolationError struct{} 802 803 func (ConstraintViolationError) Error() string { 804 return "x509: invalid signature: parent certificate cannot sign this kind of certificate" 805 } 806 807 func (c *Certificate) Equal(other *Certificate) bool { 808 if c == nil || other == nil { 809 return c == other 810 } 811 return bytes.Equal(c.Raw, other.Raw) 812 } 813 814 func (c *Certificate) hasSANExtension() bool { 815 return oidInExtensions(oidExtensionSubjectAltName, c.Extensions) 816 } 817 818 // CheckSignatureFrom verifies that the signature on c is a valid signature from parent. 819 // 820 // This is a low-level API that performs very limited checks, and not a full 821 // path verifier. Most users should use [Certificate.Verify] instead. 822 func (c *Certificate) CheckSignatureFrom(parent *Certificate) error { 823 // RFC 5280, 4.2.1.9: 824 // "If the basic constraints extension is not present in a version 3 825 // certificate, or the extension is present but the cA boolean is not 826 // asserted, then the certified public key MUST NOT be used to verify 827 // certificate signatures." 828 if parent.Version == 3 && !parent.BasicConstraintsValid || 829 parent.BasicConstraintsValid && !parent.IsCA { 830 return ConstraintViolationError{} 831 } 832 833 if parent.KeyUsage != 0 && parent.KeyUsage&KeyUsageCertSign == 0 { 834 return ConstraintViolationError{} 835 } 836 837 if parent.PublicKeyAlgorithm == UnknownPublicKeyAlgorithm { 838 return ErrUnsupportedAlgorithm 839 } 840 841 return checkSignature(c.SignatureAlgorithm, c.RawTBSCertificate, c.Signature, parent.PublicKey, false) 842 } 843 844 // CheckSignature verifies that signature is a valid signature over signed from 845 // c's public key. 846 // 847 // This is a low-level API that performs no validity checks on the certificate. 848 // 849 // [MD5WithRSA] signatures are rejected, while [SHA1WithRSA] and [ECDSAWithSHA1] 850 // signatures are currently accepted. 851 func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) error { 852 return checkSignature(algo, signed, signature, c.PublicKey, true) 853 } 854 855 func (c *Certificate) hasNameConstraints() bool { 856 return oidInExtensions(oidExtensionNameConstraints, c.Extensions) 857 } 858 859 func (c *Certificate) getSANExtension() []byte { 860 for _, e := range c.Extensions { 861 if e.Id.Equal(oidExtensionSubjectAltName) { 862 return e.Value 863 } 864 } 865 return nil 866 } 867 868 func signaturePublicKeyAlgoMismatchError(expectedPubKeyAlgo PublicKeyAlgorithm, pubKey any) error { 869 return fmt.Errorf("x509: signature algorithm specifies an %s public key, but have public key of type %T", expectedPubKeyAlgo.String(), pubKey) 870 } 871 872 var x509sha1 = godebug.New("x509sha1") 873 874 // checkSignature verifies that signature is a valid signature over signed from 875 // a crypto.PublicKey. 876 func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey crypto.PublicKey, allowSHA1 bool) (err error) { 877 var hashType crypto.Hash 878 var pubKeyAlgo PublicKeyAlgorithm 879 880 for _, details := range signatureAlgorithmDetails { 881 if details.algo == algo { 882 hashType = details.hash 883 pubKeyAlgo = details.pubKeyAlgo 884 } 885 } 886 887 switch hashType { 888 case crypto.Hash(0): 889 if pubKeyAlgo != Ed25519 { 890 return ErrUnsupportedAlgorithm 891 } 892 case crypto.MD5: 893 return InsecureAlgorithmError(algo) 894 case crypto.SHA1: 895 // SHA-1 signatures are mostly disabled. See go.dev/issue/41682. 896 if !allowSHA1 { 897 if x509sha1.Value() != "1" { 898 return InsecureAlgorithmError(algo) 899 } 900 x509sha1.IncNonDefault() 901 } 902 fallthrough 903 default: 904 if !hashType.Available() { 905 return ErrUnsupportedAlgorithm 906 } 907 h := hashType.New() 908 h.Write(signed) 909 signed = h.Sum(nil) 910 } 911 912 switch pub := publicKey.(type) { 913 case *rsa.PublicKey: 914 if pubKeyAlgo != RSA { 915 return signaturePublicKeyAlgoMismatchError(pubKeyAlgo, pub) 916 } 917 if algo.isRSAPSS() { 918 return rsa.VerifyPSS(pub, hashType, signed, signature, &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash}) 919 } else { 920 return rsa.VerifyPKCS1v15(pub, hashType, signed, signature) 921 } 922 case *ecdsa.PublicKey: 923 if pubKeyAlgo != ECDSA { 924 return signaturePublicKeyAlgoMismatchError(pubKeyAlgo, pub) 925 } 926 if !ecdsa.VerifyASN1(pub, signed, signature) { 927 return errors.New("x509: ECDSA verification failure") 928 } 929 return 930 case ed25519.PublicKey: 931 if pubKeyAlgo != Ed25519 { 932 return signaturePublicKeyAlgoMismatchError(pubKeyAlgo, pub) 933 } 934 if !ed25519.Verify(pub, signed, signature) { 935 return errors.New("x509: Ed25519 verification failure") 936 } 937 return 938 } 939 return ErrUnsupportedAlgorithm 940 } 941 942 // CheckCRLSignature checks that the signature in crl is from c. 943 // 944 // Deprecated: Use RevocationList.CheckSignatureFrom instead. 945 func (c *Certificate) CheckCRLSignature(crl *pkix.CertificateList) error { 946 algo := getSignatureAlgorithmFromAI(crl.SignatureAlgorithm) 947 return c.CheckSignature(algo, crl.TBSCertList.Raw, crl.SignatureValue.RightAlign()) 948 } 949 950 type UnhandledCriticalExtension struct{} 951 952 func (h UnhandledCriticalExtension) Error() string { 953 return "x509: unhandled critical extension" 954 } 955 956 type basicConstraints struct { 957 IsCA bool `asn1:"optional"` 958 MaxPathLen int `asn1:"optional,default:-1"` 959 } 960 961 // RFC 5280 4.2.1.4 962 type policyInformation struct { 963 Policy asn1.ObjectIdentifier 964 // policyQualifiers omitted 965 } 966 967 const ( 968 nameTypeEmail = 1 969 nameTypeDNS = 2 970 nameTypeURI = 6 971 nameTypeIP = 7 972 ) 973 974 // RFC 5280, 4.2.2.1 975 type authorityInfoAccess struct { 976 Method asn1.ObjectIdentifier 977 Location asn1.RawValue 978 } 979 980 // RFC 5280, 4.2.1.14 981 type distributionPoint struct { 982 DistributionPoint distributionPointName `asn1:"optional,tag:0"` 983 Reason asn1.BitString `asn1:"optional,tag:1"` 984 CRLIssuer asn1.RawValue `asn1:"optional,tag:2"` 985 } 986 987 type distributionPointName struct { 988 FullName []asn1.RawValue `asn1:"optional,tag:0"` 989 RelativeName pkix.RDNSequence `asn1:"optional,tag:1"` 990 } 991 992 func reverseBitsInAByte(in byte) byte { 993 b1 := in>>4 | in<<4 994 b2 := b1>>2&0x33 | b1<<2&0xcc 995 b3 := b2>>1&0x55 | b2<<1&0xaa 996 return b3 997 } 998 999 // asn1BitLength returns the bit-length of bitString by considering the 1000 // most-significant bit in a byte to be the "first" bit. This convention 1001 // matches ASN.1, but differs from almost everything else. 1002 func asn1BitLength(bitString []byte) int { 1003 bitLen := len(bitString) * 8 1004 1005 for i := range bitString { 1006 b := bitString[len(bitString)-i-1] 1007 1008 for bit := uint(0); bit < 8; bit++ { 1009 if (b>>bit)&1 == 1 { 1010 return bitLen 1011 } 1012 bitLen-- 1013 } 1014 } 1015 1016 return 0 1017 } 1018 1019 var ( 1020 oidExtensionSubjectKeyId = []int{2, 5, 29, 14} 1021 oidExtensionKeyUsage = []int{2, 5, 29, 15} 1022 oidExtensionExtendedKeyUsage = []int{2, 5, 29, 37} 1023 oidExtensionAuthorityKeyId = []int{2, 5, 29, 35} 1024 oidExtensionBasicConstraints = []int{2, 5, 29, 19} 1025 oidExtensionSubjectAltName = []int{2, 5, 29, 17} 1026 oidExtensionCertificatePolicies = []int{2, 5, 29, 32} 1027 oidExtensionNameConstraints = []int{2, 5, 29, 30} 1028 oidExtensionCRLDistributionPoints = []int{2, 5, 29, 31} 1029 oidExtensionAuthorityInfoAccess = []int{1, 3, 6, 1, 5, 5, 7, 1, 1} 1030 oidExtensionCRLNumber = []int{2, 5, 29, 20} 1031 oidExtensionReasonCode = []int{2, 5, 29, 21} 1032 ) 1033 1034 var ( 1035 oidAuthorityInfoAccessOcsp = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 1} 1036 oidAuthorityInfoAccessIssuers = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 2} 1037 ) 1038 1039 // oidInExtensions reports whether an extension with the given oid exists in 1040 // extensions. 1041 func oidInExtensions(oid asn1.ObjectIdentifier, extensions []pkix.Extension) bool { 1042 for _, e := range extensions { 1043 if e.Id.Equal(oid) { 1044 return true 1045 } 1046 } 1047 return false 1048 } 1049 1050 // marshalSANs marshals a list of addresses into a the contents of an X.509 1051 // SubjectAlternativeName extension. 1052 func marshalSANs(dnsNames, emailAddresses []string, ipAddresses []net.IP, uris []*url.URL) (derBytes []byte, err error) { 1053 var rawValues []asn1.RawValue 1054 for _, name := range dnsNames { 1055 if err := isIA5String(name); err != nil { 1056 return nil, err 1057 } 1058 rawValues = append(rawValues, asn1.RawValue{Tag: nameTypeDNS, Class: 2, Bytes: []byte(name)}) 1059 } 1060 for _, email := range emailAddresses { 1061 if err := isIA5String(email); err != nil { 1062 return nil, err 1063 } 1064 rawValues = append(rawValues, asn1.RawValue{Tag: nameTypeEmail, Class: 2, Bytes: []byte(email)}) 1065 } 1066 for _, rawIP := range ipAddresses { 1067 // If possible, we always want to encode IPv4 addresses in 4 bytes. 1068 ip := rawIP.To4() 1069 if ip == nil { 1070 ip = rawIP 1071 } 1072 rawValues = append(rawValues, asn1.RawValue{Tag: nameTypeIP, Class: 2, Bytes: ip}) 1073 } 1074 for _, uri := range uris { 1075 uriStr := uri.String() 1076 if err := isIA5String(uriStr); err != nil { 1077 return nil, err 1078 } 1079 rawValues = append(rawValues, asn1.RawValue{Tag: nameTypeURI, Class: 2, Bytes: []byte(uriStr)}) 1080 } 1081 return asn1.Marshal(rawValues) 1082 } 1083 1084 func isIA5String(s string) error { 1085 for _, r := range s { 1086 // Per RFC5280 "IA5String is limited to the set of ASCII characters" 1087 if r > unicode.MaxASCII { 1088 return fmt.Errorf("x509: %q cannot be encoded as an IA5String", s) 1089 } 1090 } 1091 1092 return nil 1093 } 1094 1095 func buildCertExtensions(template *Certificate, subjectIsEmpty bool, authorityKeyId []byte, subjectKeyId []byte) (ret []pkix.Extension, err error) { 1096 ret = make([]pkix.Extension, 10 /* maximum number of elements. */) 1097 n := 0 1098 1099 if template.KeyUsage != 0 && 1100 !oidInExtensions(oidExtensionKeyUsage, template.ExtraExtensions) { 1101 ret[n], err = marshalKeyUsage(template.KeyUsage) 1102 if err != nil { 1103 return nil, err 1104 } 1105 n++ 1106 } 1107 1108 if (len(template.ExtKeyUsage) > 0 || len(template.UnknownExtKeyUsage) > 0) && 1109 !oidInExtensions(oidExtensionExtendedKeyUsage, template.ExtraExtensions) { 1110 ret[n], err = marshalExtKeyUsage(template.ExtKeyUsage, template.UnknownExtKeyUsage) 1111 if err != nil { 1112 return nil, err 1113 } 1114 n++ 1115 } 1116 1117 if template.BasicConstraintsValid && !oidInExtensions(oidExtensionBasicConstraints, template.ExtraExtensions) { 1118 ret[n], err = marshalBasicConstraints(template.IsCA, template.MaxPathLen, template.MaxPathLenZero) 1119 if err != nil { 1120 return nil, err 1121 } 1122 n++ 1123 } 1124 1125 if len(subjectKeyId) > 0 && !oidInExtensions(oidExtensionSubjectKeyId, template.ExtraExtensions) { 1126 ret[n].Id = oidExtensionSubjectKeyId 1127 ret[n].Value, err = asn1.Marshal(subjectKeyId) 1128 if err != nil { 1129 return 1130 } 1131 n++ 1132 } 1133 1134 if len(authorityKeyId) > 0 && !oidInExtensions(oidExtensionAuthorityKeyId, template.ExtraExtensions) { 1135 ret[n].Id = oidExtensionAuthorityKeyId 1136 ret[n].Value, err = asn1.Marshal(authKeyId{authorityKeyId}) 1137 if err != nil { 1138 return 1139 } 1140 n++ 1141 } 1142 1143 if (len(template.OCSPServer) > 0 || len(template.IssuingCertificateURL) > 0) && 1144 !oidInExtensions(oidExtensionAuthorityInfoAccess, template.ExtraExtensions) { 1145 ret[n].Id = oidExtensionAuthorityInfoAccess 1146 var aiaValues []authorityInfoAccess 1147 for _, name := range template.OCSPServer { 1148 aiaValues = append(aiaValues, authorityInfoAccess{ 1149 Method: oidAuthorityInfoAccessOcsp, 1150 Location: asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)}, 1151 }) 1152 } 1153 for _, name := range template.IssuingCertificateURL { 1154 aiaValues = append(aiaValues, authorityInfoAccess{ 1155 Method: oidAuthorityInfoAccessIssuers, 1156 Location: asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)}, 1157 }) 1158 } 1159 ret[n].Value, err = asn1.Marshal(aiaValues) 1160 if err != nil { 1161 return 1162 } 1163 n++ 1164 } 1165 1166 if (len(template.DNSNames) > 0 || len(template.EmailAddresses) > 0 || len(template.IPAddresses) > 0 || len(template.URIs) > 0) && 1167 !oidInExtensions(oidExtensionSubjectAltName, template.ExtraExtensions) { 1168 ret[n].Id = oidExtensionSubjectAltName 1169 // From RFC 5280, Section 4.2.1.6: 1170 // “If the subject field contains an empty sequence ... then 1171 // subjectAltName extension ... is marked as critical” 1172 ret[n].Critical = subjectIsEmpty 1173 ret[n].Value, err = marshalSANs(template.DNSNames, template.EmailAddresses, template.IPAddresses, template.URIs) 1174 if err != nil { 1175 return 1176 } 1177 n++ 1178 } 1179 1180 if len(template.PolicyIdentifiers) > 0 && 1181 !oidInExtensions(oidExtensionCertificatePolicies, template.ExtraExtensions) { 1182 ret[n], err = marshalCertificatePolicies(template.PolicyIdentifiers) 1183 if err != nil { 1184 return nil, err 1185 } 1186 n++ 1187 } 1188 1189 if (len(template.PermittedDNSDomains) > 0 || len(template.ExcludedDNSDomains) > 0 || 1190 len(template.PermittedIPRanges) > 0 || len(template.ExcludedIPRanges) > 0 || 1191 len(template.PermittedEmailAddresses) > 0 || len(template.ExcludedEmailAddresses) > 0 || 1192 len(template.PermittedURIDomains) > 0 || len(template.ExcludedURIDomains) > 0) && 1193 !oidInExtensions(oidExtensionNameConstraints, template.ExtraExtensions) { 1194 ret[n].Id = oidExtensionNameConstraints 1195 ret[n].Critical = template.PermittedDNSDomainsCritical 1196 1197 ipAndMask := func(ipNet *net.IPNet) []byte { 1198 maskedIP := ipNet.IP.Mask(ipNet.Mask) 1199 ipAndMask := make([]byte, 0, len(maskedIP)+len(ipNet.Mask)) 1200 ipAndMask = append(ipAndMask, maskedIP...) 1201 ipAndMask = append(ipAndMask, ipNet.Mask...) 1202 return ipAndMask 1203 } 1204 1205 serialiseConstraints := func(dns []string, ips []*net.IPNet, emails []string, uriDomains []string) (der []byte, err error) { 1206 var b cryptobyte.Builder 1207 1208 for _, name := range dns { 1209 if err = isIA5String(name); err != nil { 1210 return nil, err 1211 } 1212 1213 b.AddASN1(cryptobyte_asn1.SEQUENCE, func(b *cryptobyte.Builder) { 1214 b.AddASN1(cryptobyte_asn1.Tag(2).ContextSpecific(), func(b *cryptobyte.Builder) { 1215 b.AddBytes([]byte(name)) 1216 }) 1217 }) 1218 } 1219 1220 for _, ipNet := range ips { 1221 b.AddASN1(cryptobyte_asn1.SEQUENCE, func(b *cryptobyte.Builder) { 1222 b.AddASN1(cryptobyte_asn1.Tag(7).ContextSpecific(), func(b *cryptobyte.Builder) { 1223 b.AddBytes(ipAndMask(ipNet)) 1224 }) 1225 }) 1226 } 1227 1228 for _, email := range emails { 1229 if err = isIA5String(email); err != nil { 1230 return nil, err 1231 } 1232 1233 b.AddASN1(cryptobyte_asn1.SEQUENCE, func(b *cryptobyte.Builder) { 1234 b.AddASN1(cryptobyte_asn1.Tag(1).ContextSpecific(), func(b *cryptobyte.Builder) { 1235 b.AddBytes([]byte(email)) 1236 }) 1237 }) 1238 } 1239 1240 for _, uriDomain := range uriDomains { 1241 if err = isIA5String(uriDomain); err != nil { 1242 return nil, err 1243 } 1244 1245 b.AddASN1(cryptobyte_asn1.SEQUENCE, func(b *cryptobyte.Builder) { 1246 b.AddASN1(cryptobyte_asn1.Tag(6).ContextSpecific(), func(b *cryptobyte.Builder) { 1247 b.AddBytes([]byte(uriDomain)) 1248 }) 1249 }) 1250 } 1251 1252 return b.Bytes() 1253 } 1254 1255 permitted, err := serialiseConstraints(template.PermittedDNSDomains, template.PermittedIPRanges, template.PermittedEmailAddresses, template.PermittedURIDomains) 1256 if err != nil { 1257 return nil, err 1258 } 1259 1260 excluded, err := serialiseConstraints(template.ExcludedDNSDomains, template.ExcludedIPRanges, template.ExcludedEmailAddresses, template.ExcludedURIDomains) 1261 if err != nil { 1262 return nil, err 1263 } 1264 1265 var b cryptobyte.Builder 1266 b.AddASN1(cryptobyte_asn1.SEQUENCE, func(b *cryptobyte.Builder) { 1267 if len(permitted) > 0 { 1268 b.AddASN1(cryptobyte_asn1.Tag(0).ContextSpecific().Constructed(), func(b *cryptobyte.Builder) { 1269 b.AddBytes(permitted) 1270 }) 1271 } 1272 1273 if len(excluded) > 0 { 1274 b.AddASN1(cryptobyte_asn1.Tag(1).ContextSpecific().Constructed(), func(b *cryptobyte.Builder) { 1275 b.AddBytes(excluded) 1276 }) 1277 } 1278 }) 1279 1280 ret[n].Value, err = b.Bytes() 1281 if err != nil { 1282 return nil, err 1283 } 1284 n++ 1285 } 1286 1287 if len(template.CRLDistributionPoints) > 0 && 1288 !oidInExtensions(oidExtensionCRLDistributionPoints, template.ExtraExtensions) { 1289 ret[n].Id = oidExtensionCRLDistributionPoints 1290 1291 var crlDp []distributionPoint 1292 for _, name := range template.CRLDistributionPoints { 1293 dp := distributionPoint{ 1294 DistributionPoint: distributionPointName{ 1295 FullName: []asn1.RawValue{ 1296 {Tag: 6, Class: 2, Bytes: []byte(name)}, 1297 }, 1298 }, 1299 } 1300 crlDp = append(crlDp, dp) 1301 } 1302 1303 ret[n].Value, err = asn1.Marshal(crlDp) 1304 if err != nil { 1305 return 1306 } 1307 n++ 1308 } 1309 1310 // Adding another extension here? Remember to update the maximum number 1311 // of elements in the make() at the top of the function and the list of 1312 // template fields used in CreateCertificate documentation. 1313 1314 return append(ret[:n], template.ExtraExtensions...), nil 1315 } 1316 1317 func marshalKeyUsage(ku KeyUsage) (pkix.Extension, error) { 1318 ext := pkix.Extension{Id: oidExtensionKeyUsage, Critical: true} 1319 1320 var a [2]byte 1321 a[0] = reverseBitsInAByte(byte(ku)) 1322 a[1] = reverseBitsInAByte(byte(ku >> 8)) 1323 1324 l := 1 1325 if a[1] != 0 { 1326 l = 2 1327 } 1328 1329 bitString := a[:l] 1330 var err error 1331 ext.Value, err = asn1.Marshal(asn1.BitString{Bytes: bitString, BitLength: asn1BitLength(bitString)}) 1332 return ext, err 1333 } 1334 1335 func marshalExtKeyUsage(extUsages []ExtKeyUsage, unknownUsages []asn1.ObjectIdentifier) (pkix.Extension, error) { 1336 ext := pkix.Extension{Id: oidExtensionExtendedKeyUsage} 1337 1338 oids := make([]asn1.ObjectIdentifier, len(extUsages)+len(unknownUsages)) 1339 for i, u := range extUsages { 1340 if oid, ok := oidFromExtKeyUsage(u); ok { 1341 oids[i] = oid 1342 } else { 1343 return ext, errors.New("x509: unknown extended key usage") 1344 } 1345 } 1346 1347 copy(oids[len(extUsages):], unknownUsages) 1348 1349 var err error 1350 ext.Value, err = asn1.Marshal(oids) 1351 return ext, err 1352 } 1353 1354 func marshalBasicConstraints(isCA bool, maxPathLen int, maxPathLenZero bool) (pkix.Extension, error) { 1355 ext := pkix.Extension{Id: oidExtensionBasicConstraints, Critical: true} 1356 // Leaving MaxPathLen as zero indicates that no maximum path 1357 // length is desired, unless MaxPathLenZero is set. A value of 1358 // -1 causes encoding/asn1 to omit the value as desired. 1359 if maxPathLen == 0 && !maxPathLenZero { 1360 maxPathLen = -1 1361 } 1362 var err error 1363 ext.Value, err = asn1.Marshal(basicConstraints{isCA, maxPathLen}) 1364 return ext, err 1365 } 1366 1367 func marshalCertificatePolicies(policyIdentifiers []asn1.ObjectIdentifier) (pkix.Extension, error) { 1368 ext := pkix.Extension{Id: oidExtensionCertificatePolicies} 1369 policies := make([]policyInformation, len(policyIdentifiers)) 1370 for i, policy := range policyIdentifiers { 1371 policies[i].Policy = policy 1372 } 1373 var err error 1374 ext.Value, err = asn1.Marshal(policies) 1375 return ext, err 1376 } 1377 1378 func buildCSRExtensions(template *CertificateRequest) ([]pkix.Extension, error) { 1379 var ret []pkix.Extension 1380 1381 if (len(template.DNSNames) > 0 || len(template.EmailAddresses) > 0 || len(template.IPAddresses) > 0 || len(template.URIs) > 0) && 1382 !oidInExtensions(oidExtensionSubjectAltName, template.ExtraExtensions) { 1383 sanBytes, err := marshalSANs(template.DNSNames, template.EmailAddresses, template.IPAddresses, template.URIs) 1384 if err != nil { 1385 return nil, err 1386 } 1387 1388 ret = append(ret, pkix.Extension{ 1389 Id: oidExtensionSubjectAltName, 1390 Value: sanBytes, 1391 }) 1392 } 1393 1394 return append(ret, template.ExtraExtensions...), nil 1395 } 1396 1397 func subjectBytes(cert *Certificate) ([]byte, error) { 1398 if len(cert.RawSubject) > 0 { 1399 return cert.RawSubject, nil 1400 } 1401 1402 return asn1.Marshal(cert.Subject.ToRDNSequence()) 1403 } 1404 1405 // signingParamsForPublicKey returns the parameters to use for signing with 1406 // priv. If requestedSigAlgo is not zero then it overrides the default 1407 // signature algorithm. 1408 func signingParamsForPublicKey(pub any, requestedSigAlgo SignatureAlgorithm) (hashFunc crypto.Hash, sigAlgo pkix.AlgorithmIdentifier, err error) { 1409 var pubType PublicKeyAlgorithm 1410 1411 switch pub := pub.(type) { 1412 case *rsa.PublicKey: 1413 pubType = RSA 1414 hashFunc = crypto.SHA256 1415 sigAlgo.Algorithm = oidSignatureSHA256WithRSA 1416 sigAlgo.Parameters = asn1.NullRawValue 1417 1418 case *ecdsa.PublicKey: 1419 pubType = ECDSA 1420 1421 switch pub.Curve { 1422 case elliptic.P224(), elliptic.P256(): 1423 hashFunc = crypto.SHA256 1424 sigAlgo.Algorithm = oidSignatureECDSAWithSHA256 1425 case elliptic.P384(): 1426 hashFunc = crypto.SHA384 1427 sigAlgo.Algorithm = oidSignatureECDSAWithSHA384 1428 case elliptic.P521(): 1429 hashFunc = crypto.SHA512 1430 sigAlgo.Algorithm = oidSignatureECDSAWithSHA512 1431 default: 1432 err = errors.New("x509: unknown elliptic curve") 1433 } 1434 1435 case ed25519.PublicKey: 1436 pubType = Ed25519 1437 sigAlgo.Algorithm = oidSignatureEd25519 1438 1439 default: 1440 err = errors.New("x509: only RSA, ECDSA and Ed25519 keys supported") 1441 } 1442 1443 if err != nil { 1444 return 1445 } 1446 1447 if requestedSigAlgo == 0 { 1448 return 1449 } 1450 1451 found := false 1452 for _, details := range signatureAlgorithmDetails { 1453 if details.algo == requestedSigAlgo { 1454 if details.pubKeyAlgo != pubType { 1455 err = errors.New("x509: requested SignatureAlgorithm does not match private key type") 1456 return 1457 } 1458 sigAlgo.Algorithm, hashFunc = details.oid, details.hash 1459 if hashFunc == 0 && pubType != Ed25519 { 1460 err = errors.New("x509: cannot sign with hash function requested") 1461 return 1462 } 1463 if hashFunc == crypto.MD5 { 1464 err = errors.New("x509: signing with MD5 is not supported") 1465 return 1466 } 1467 if requestedSigAlgo.isRSAPSS() { 1468 sigAlgo.Parameters = hashToPSSParameters[hashFunc] 1469 } 1470 found = true 1471 break 1472 } 1473 } 1474 1475 if !found { 1476 err = errors.New("x509: unknown SignatureAlgorithm") 1477 } 1478 1479 return 1480 } 1481 1482 // emptyASN1Subject is the ASN.1 DER encoding of an empty Subject, which is 1483 // just an empty SEQUENCE. 1484 var emptyASN1Subject = []byte{0x30, 0} 1485 1486 // CreateCertificate creates a new X.509 v3 certificate based on a template. 1487 // The following members of template are currently used: 1488 // 1489 // - AuthorityKeyId 1490 // - BasicConstraintsValid 1491 // - CRLDistributionPoints 1492 // - DNSNames 1493 // - EmailAddresses 1494 // - ExcludedDNSDomains 1495 // - ExcludedEmailAddresses 1496 // - ExcludedIPRanges 1497 // - ExcludedURIDomains 1498 // - ExtKeyUsage 1499 // - ExtraExtensions 1500 // - IPAddresses 1501 // - IsCA 1502 // - IssuingCertificateURL 1503 // - KeyUsage 1504 // - MaxPathLen 1505 // - MaxPathLenZero 1506 // - NotAfter 1507 // - NotBefore 1508 // - OCSPServer 1509 // - PermittedDNSDomains 1510 // - PermittedDNSDomainsCritical 1511 // - PermittedEmailAddresses 1512 // - PermittedIPRanges 1513 // - PermittedURIDomains 1514 // - PolicyIdentifiers 1515 // - SerialNumber 1516 // - SignatureAlgorithm 1517 // - Subject 1518 // - SubjectKeyId 1519 // - URIs 1520 // - UnknownExtKeyUsage 1521 // 1522 // The certificate is signed by parent. If parent is equal to template then the 1523 // certificate is self-signed. The parameter pub is the public key of the 1524 // certificate to be generated and priv is the private key of the signer. 1525 // 1526 // The returned slice is the certificate in DER encoding. 1527 // 1528 // The currently supported key types are *rsa.PublicKey, *ecdsa.PublicKey and 1529 // ed25519.PublicKey. pub must be a supported key type, and priv must be a 1530 // crypto.Signer with a supported public key. 1531 // 1532 // The AuthorityKeyId will be taken from the SubjectKeyId of parent, if any, 1533 // unless the resulting certificate is self-signed. Otherwise the value from 1534 // template will be used. 1535 // 1536 // If SubjectKeyId from template is empty and the template is a CA, SubjectKeyId 1537 // will be generated from the hash of the public key. 1538 func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv any) ([]byte, error) { 1539 key, ok := priv.(crypto.Signer) 1540 if !ok { 1541 return nil, errors.New("x509: certificate private key does not implement crypto.Signer") 1542 } 1543 1544 if template.SerialNumber == nil { 1545 return nil, errors.New("x509: no SerialNumber given") 1546 } 1547 1548 // RFC 5280 Section 4.1.2.2: serial number must positive 1549 // 1550 // We _should_ also restrict serials to <= 20 octets, but it turns out a lot of people 1551 // get this wrong, in part because the encoding can itself alter the length of the 1552 // serial. For now we accept these non-conformant serials. 1553 if template.SerialNumber.Sign() == -1 { 1554 return nil, errors.New("x509: serial number must be positive") 1555 } 1556 1557 if template.BasicConstraintsValid && !template.IsCA && template.MaxPathLen != -1 && (template.MaxPathLen != 0 || template.MaxPathLenZero) { 1558 return nil, errors.New("x509: only CAs are allowed to specify MaxPathLen") 1559 } 1560 1561 hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(key.Public(), template.SignatureAlgorithm) 1562 if err != nil { 1563 return nil, err 1564 } 1565 1566 publicKeyBytes, publicKeyAlgorithm, err := marshalPublicKey(pub) 1567 if err != nil { 1568 return nil, err 1569 } 1570 if getPublicKeyAlgorithmFromOID(publicKeyAlgorithm.Algorithm) == UnknownPublicKeyAlgorithm { 1571 return nil, fmt.Errorf("x509: unsupported public key type: %T", pub) 1572 } 1573 1574 asn1Issuer, err := subjectBytes(parent) 1575 if err != nil { 1576 return nil, err 1577 } 1578 1579 asn1Subject, err := subjectBytes(template) 1580 if err != nil { 1581 return nil, err 1582 } 1583 1584 authorityKeyId := template.AuthorityKeyId 1585 if !bytes.Equal(asn1Issuer, asn1Subject) && len(parent.SubjectKeyId) > 0 { 1586 authorityKeyId = parent.SubjectKeyId 1587 } 1588 1589 subjectKeyId := template.SubjectKeyId 1590 if len(subjectKeyId) == 0 && template.IsCA { 1591 // SubjectKeyId generated using method 1 in RFC 5280, Section 4.2.1.2: 1592 // (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the 1593 // value of the BIT STRING subjectPublicKey (excluding the tag, 1594 // length, and number of unused bits). 1595 h := sha1.Sum(publicKeyBytes) 1596 subjectKeyId = h[:] 1597 } 1598 1599 // Check that the signer's public key matches the private key, if available. 1600 type privateKey interface { 1601 Equal(crypto.PublicKey) bool 1602 } 1603 if privPub, ok := key.Public().(privateKey); !ok { 1604 return nil, errors.New("x509: internal error: supported public key does not implement Equal") 1605 } else if parent.PublicKey != nil && !privPub.Equal(parent.PublicKey) { 1606 return nil, errors.New("x509: provided PrivateKey doesn't match parent's PublicKey") 1607 } 1608 1609 extensions, err := buildCertExtensions(template, bytes.Equal(asn1Subject, emptyASN1Subject), authorityKeyId, subjectKeyId) 1610 if err != nil { 1611 return nil, err 1612 } 1613 1614 encodedPublicKey := asn1.BitString{BitLength: len(publicKeyBytes) * 8, Bytes: publicKeyBytes} 1615 c := tbsCertificate{ 1616 Version: 2, 1617 SerialNumber: template.SerialNumber, 1618 SignatureAlgorithm: signatureAlgorithm, 1619 Issuer: asn1.RawValue{FullBytes: asn1Issuer}, 1620 Validity: validity{template.NotBefore.UTC(), template.NotAfter.UTC()}, 1621 Subject: asn1.RawValue{FullBytes: asn1Subject}, 1622 PublicKey: publicKeyInfo{nil, publicKeyAlgorithm, encodedPublicKey}, 1623 Extensions: extensions, 1624 } 1625 1626 tbsCertContents, err := asn1.Marshal(c) 1627 if err != nil { 1628 return nil, err 1629 } 1630 c.Raw = tbsCertContents 1631 1632 signed := tbsCertContents 1633 if hashFunc != 0 { 1634 h := hashFunc.New() 1635 h.Write(signed) 1636 signed = h.Sum(nil) 1637 } 1638 1639 var signerOpts crypto.SignerOpts = hashFunc 1640 if template.SignatureAlgorithm != 0 && template.SignatureAlgorithm.isRSAPSS() { 1641 signerOpts = &rsa.PSSOptions{ 1642 SaltLength: rsa.PSSSaltLengthEqualsHash, 1643 Hash: hashFunc, 1644 } 1645 } 1646 1647 var signature []byte 1648 signature, err = key.Sign(rand, signed, signerOpts) 1649 if err != nil { 1650 return nil, err 1651 } 1652 1653 signedCert, err := asn1.Marshal(certificate{ 1654 c, 1655 signatureAlgorithm, 1656 asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, 1657 }) 1658 if err != nil { 1659 return nil, err 1660 } 1661 1662 // Check the signature to ensure the crypto.Signer behaved correctly. 1663 if err := checkSignature(getSignatureAlgorithmFromAI(signatureAlgorithm), c.Raw, signature, key.Public(), true); err != nil { 1664 return nil, fmt.Errorf("x509: signature over certificate returned by signer is invalid: %w", err) 1665 } 1666 1667 return signedCert, nil 1668 } 1669 1670 // pemCRLPrefix is the magic string that indicates that we have a PEM encoded 1671 // CRL. 1672 var pemCRLPrefix = []byte("-----BEGIN X509 CRL") 1673 1674 // pemType is the type of a PEM encoded CRL. 1675 var pemType = "X509 CRL" 1676 1677 // ParseCRL parses a CRL from the given bytes. It's often the case that PEM 1678 // encoded CRLs will appear where they should be DER encoded, so this function 1679 // will transparently handle PEM encoding as long as there isn't any leading 1680 // garbage. 1681 // 1682 // Deprecated: Use ParseRevocationList instead. 1683 func ParseCRL(crlBytes []byte) (*pkix.CertificateList, error) { 1684 if bytes.HasPrefix(crlBytes, pemCRLPrefix) { 1685 block, _ := pem.Decode(crlBytes) 1686 if block != nil && block.Type == pemType { 1687 crlBytes = block.Bytes 1688 } 1689 } 1690 return ParseDERCRL(crlBytes) 1691 } 1692 1693 // ParseDERCRL parses a DER encoded CRL from the given bytes. 1694 // 1695 // Deprecated: Use ParseRevocationList instead. 1696 func ParseDERCRL(derBytes []byte) (*pkix.CertificateList, error) { 1697 certList := new(pkix.CertificateList) 1698 if rest, err := asn1.Unmarshal(derBytes, certList); err != nil { 1699 return nil, err 1700 } else if len(rest) != 0 { 1701 return nil, errors.New("x509: trailing data after CRL") 1702 } 1703 return certList, nil 1704 } 1705 1706 // CreateCRL returns a DER encoded CRL, signed by this Certificate, that 1707 // contains the given list of revoked certificates. 1708 // 1709 // Deprecated: this method does not generate an RFC 5280 conformant X.509 v2 CRL. 1710 // To generate a standards compliant CRL, use CreateRevocationList instead. 1711 func (c *Certificate) CreateCRL(rand io.Reader, priv any, revokedCerts []pkix.RevokedCertificate, now, expiry time.Time) (crlBytes []byte, err error) { 1712 key, ok := priv.(crypto.Signer) 1713 if !ok { 1714 return nil, errors.New("x509: certificate private key does not implement crypto.Signer") 1715 } 1716 1717 hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(key.Public(), 0) 1718 if err != nil { 1719 return nil, err 1720 } 1721 1722 // Force revocation times to UTC per RFC 5280. 1723 revokedCertsUTC := make([]pkix.RevokedCertificate, len(revokedCerts)) 1724 for i, rc := range revokedCerts { 1725 rc.RevocationTime = rc.RevocationTime.UTC() 1726 revokedCertsUTC[i] = rc 1727 } 1728 1729 tbsCertList := pkix.TBSCertificateList{ 1730 Version: 1, 1731 Signature: signatureAlgorithm, 1732 Issuer: c.Subject.ToRDNSequence(), 1733 ThisUpdate: now.UTC(), 1734 NextUpdate: expiry.UTC(), 1735 RevokedCertificates: revokedCertsUTC, 1736 } 1737 1738 // Authority Key Id 1739 if len(c.SubjectKeyId) > 0 { 1740 var aki pkix.Extension 1741 aki.Id = oidExtensionAuthorityKeyId 1742 aki.Value, err = asn1.Marshal(authKeyId{Id: c.SubjectKeyId}) 1743 if err != nil { 1744 return 1745 } 1746 tbsCertList.Extensions = append(tbsCertList.Extensions, aki) 1747 } 1748 1749 tbsCertListContents, err := asn1.Marshal(tbsCertList) 1750 if err != nil { 1751 return 1752 } 1753 1754 signed := tbsCertListContents 1755 if hashFunc != 0 { 1756 h := hashFunc.New() 1757 h.Write(signed) 1758 signed = h.Sum(nil) 1759 } 1760 1761 var signature []byte 1762 signature, err = key.Sign(rand, signed, hashFunc) 1763 if err != nil { 1764 return 1765 } 1766 1767 return asn1.Marshal(pkix.CertificateList{ 1768 TBSCertList: tbsCertList, 1769 SignatureAlgorithm: signatureAlgorithm, 1770 SignatureValue: asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, 1771 }) 1772 } 1773 1774 // CertificateRequest represents a PKCS #10, certificate signature request. 1775 type CertificateRequest struct { 1776 Raw []byte // Complete ASN.1 DER content (CSR, signature algorithm and signature). 1777 RawTBSCertificateRequest []byte // Certificate request info part of raw ASN.1 DER content. 1778 RawSubjectPublicKeyInfo []byte // DER encoded SubjectPublicKeyInfo. 1779 RawSubject []byte // DER encoded Subject. 1780 1781 Version int 1782 Signature []byte 1783 SignatureAlgorithm SignatureAlgorithm 1784 1785 PublicKeyAlgorithm PublicKeyAlgorithm 1786 PublicKey any 1787 1788 Subject pkix.Name 1789 1790 // Attributes contains the CSR attributes that can parse as 1791 // pkix.AttributeTypeAndValueSET. 1792 // 1793 // Deprecated: Use Extensions and ExtraExtensions instead for parsing and 1794 // generating the requestedExtensions attribute. 1795 Attributes []pkix.AttributeTypeAndValueSET 1796 1797 // Extensions contains all requested extensions, in raw form. When parsing 1798 // CSRs, this can be used to extract extensions that are not parsed by this 1799 // package. 1800 Extensions []pkix.Extension 1801 1802 // ExtraExtensions contains extensions to be copied, raw, into any CSR 1803 // marshaled by CreateCertificateRequest. Values override any extensions 1804 // that would otherwise be produced based on the other fields but are 1805 // overridden by any extensions specified in Attributes. 1806 // 1807 // The ExtraExtensions field is not populated by ParseCertificateRequest, 1808 // see Extensions instead. 1809 ExtraExtensions []pkix.Extension 1810 1811 // Subject Alternate Name values. 1812 DNSNames []string 1813 EmailAddresses []string 1814 IPAddresses []net.IP 1815 URIs []*url.URL 1816 } 1817 1818 // These structures reflect the ASN.1 structure of X.509 certificate 1819 // signature requests (see RFC 2986): 1820 1821 type tbsCertificateRequest struct { 1822 Raw asn1.RawContent 1823 Version int 1824 Subject asn1.RawValue 1825 PublicKey publicKeyInfo 1826 RawAttributes []asn1.RawValue `asn1:"tag:0"` 1827 } 1828 1829 type certificateRequest struct { 1830 Raw asn1.RawContent 1831 TBSCSR tbsCertificateRequest 1832 SignatureAlgorithm pkix.AlgorithmIdentifier 1833 SignatureValue asn1.BitString 1834 } 1835 1836 // oidExtensionRequest is a PKCS #9 OBJECT IDENTIFIER that indicates requested 1837 // extensions in a CSR. 1838 var oidExtensionRequest = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 14} 1839 1840 // newRawAttributes converts AttributeTypeAndValueSETs from a template 1841 // CertificateRequest's Attributes into tbsCertificateRequest RawAttributes. 1842 func newRawAttributes(attributes []pkix.AttributeTypeAndValueSET) ([]asn1.RawValue, error) { 1843 var rawAttributes []asn1.RawValue 1844 b, err := asn1.Marshal(attributes) 1845 if err != nil { 1846 return nil, err 1847 } 1848 rest, err := asn1.Unmarshal(b, &rawAttributes) 1849 if err != nil { 1850 return nil, err 1851 } 1852 if len(rest) != 0 { 1853 return nil, errors.New("x509: failed to unmarshal raw CSR Attributes") 1854 } 1855 return rawAttributes, nil 1856 } 1857 1858 // parseRawAttributes Unmarshals RawAttributes into AttributeTypeAndValueSETs. 1859 func parseRawAttributes(rawAttributes []asn1.RawValue) []pkix.AttributeTypeAndValueSET { 1860 var attributes []pkix.AttributeTypeAndValueSET 1861 for _, rawAttr := range rawAttributes { 1862 var attr pkix.AttributeTypeAndValueSET 1863 rest, err := asn1.Unmarshal(rawAttr.FullBytes, &attr) 1864 // Ignore attributes that don't parse into pkix.AttributeTypeAndValueSET 1865 // (i.e.: challengePassword or unstructuredName). 1866 if err == nil && len(rest) == 0 { 1867 attributes = append(attributes, attr) 1868 } 1869 } 1870 return attributes 1871 } 1872 1873 // parseCSRExtensions parses the attributes from a CSR and extracts any 1874 // requested extensions. 1875 func parseCSRExtensions(rawAttributes []asn1.RawValue) ([]pkix.Extension, error) { 1876 // pkcs10Attribute reflects the Attribute structure from RFC 2986, Section 4.1. 1877 type pkcs10Attribute struct { 1878 Id asn1.ObjectIdentifier 1879 Values []asn1.RawValue `asn1:"set"` 1880 } 1881 1882 var ret []pkix.Extension 1883 requestedExts := make(map[string]bool) 1884 for _, rawAttr := range rawAttributes { 1885 var attr pkcs10Attribute 1886 if rest, err := asn1.Unmarshal(rawAttr.FullBytes, &attr); err != nil || len(rest) != 0 || len(attr.Values) == 0 { 1887 // Ignore attributes that don't parse. 1888 continue 1889 } 1890 1891 if !attr.Id.Equal(oidExtensionRequest) { 1892 continue 1893 } 1894 1895 var extensions []pkix.Extension 1896 if _, err := asn1.Unmarshal(attr.Values[0].FullBytes, &extensions); err != nil { 1897 return nil, err 1898 } 1899 for _, ext := range extensions { 1900 oidStr := ext.Id.String() 1901 if requestedExts[oidStr] { 1902 return nil, errors.New("x509: certificate request contains duplicate requested extensions") 1903 } 1904 requestedExts[oidStr] = true 1905 } 1906 ret = append(ret, extensions...) 1907 } 1908 1909 return ret, nil 1910 } 1911 1912 // CreateCertificateRequest creates a new certificate request based on a 1913 // template. The following members of template are used: 1914 // 1915 // - SignatureAlgorithm 1916 // - Subject 1917 // - DNSNames 1918 // - EmailAddresses 1919 // - IPAddresses 1920 // - URIs 1921 // - ExtraExtensions 1922 // - Attributes (deprecated) 1923 // 1924 // priv is the private key to sign the CSR with, and the corresponding public 1925 // key will be included in the CSR. It must implement crypto.Signer and its 1926 // Public() method must return a *rsa.PublicKey or a *ecdsa.PublicKey or a 1927 // ed25519.PublicKey. (A *rsa.PrivateKey, *ecdsa.PrivateKey or 1928 // ed25519.PrivateKey satisfies this.) 1929 // 1930 // The returned slice is the certificate request in DER encoding. 1931 func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv any) (csr []byte, err error) { 1932 key, ok := priv.(crypto.Signer) 1933 if !ok { 1934 return nil, errors.New("x509: certificate private key does not implement crypto.Signer") 1935 } 1936 1937 var hashFunc crypto.Hash 1938 var sigAlgo pkix.AlgorithmIdentifier 1939 hashFunc, sigAlgo, err = signingParamsForPublicKey(key.Public(), template.SignatureAlgorithm) 1940 if err != nil { 1941 return nil, err 1942 } 1943 1944 var publicKeyBytes []byte 1945 var publicKeyAlgorithm pkix.AlgorithmIdentifier 1946 publicKeyBytes, publicKeyAlgorithm, err = marshalPublicKey(key.Public()) 1947 if err != nil { 1948 return nil, err 1949 } 1950 1951 extensions, err := buildCSRExtensions(template) 1952 if err != nil { 1953 return nil, err 1954 } 1955 1956 // Make a copy of template.Attributes because we may alter it below. 1957 attributes := make([]pkix.AttributeTypeAndValueSET, 0, len(template.Attributes)) 1958 for _, attr := range template.Attributes { 1959 values := make([][]pkix.AttributeTypeAndValue, len(attr.Value)) 1960 copy(values, attr.Value) 1961 attributes = append(attributes, pkix.AttributeTypeAndValueSET{ 1962 Type: attr.Type, 1963 Value: values, 1964 }) 1965 } 1966 1967 extensionsAppended := false 1968 if len(extensions) > 0 { 1969 // Append the extensions to an existing attribute if possible. 1970 for _, atvSet := range attributes { 1971 if !atvSet.Type.Equal(oidExtensionRequest) || len(atvSet.Value) == 0 { 1972 continue 1973 } 1974 1975 // specifiedExtensions contains all the extensions that we 1976 // found specified via template.Attributes. 1977 specifiedExtensions := make(map[string]bool) 1978 1979 for _, atvs := range atvSet.Value { 1980 for _, atv := range atvs { 1981 specifiedExtensions[atv.Type.String()] = true 1982 } 1983 } 1984 1985 newValue := make([]pkix.AttributeTypeAndValue, 0, len(atvSet.Value[0])+len(extensions)) 1986 newValue = append(newValue, atvSet.Value[0]...) 1987 1988 for _, e := range extensions { 1989 if specifiedExtensions[e.Id.String()] { 1990 // Attributes already contained a value for 1991 // this extension and it takes priority. 1992 continue 1993 } 1994 1995 newValue = append(newValue, pkix.AttributeTypeAndValue{ 1996 // There is no place for the critical 1997 // flag in an AttributeTypeAndValue. 1998 Type: e.Id, 1999 Value: e.Value, 2000 }) 2001 } 2002 2003 atvSet.Value[0] = newValue 2004 extensionsAppended = true 2005 break 2006 } 2007 } 2008 2009 rawAttributes, err := newRawAttributes(attributes) 2010 if err != nil { 2011 return 2012 } 2013 2014 // If not included in attributes, add a new attribute for the 2015 // extensions. 2016 if len(extensions) > 0 && !extensionsAppended { 2017 attr := struct { 2018 Type asn1.ObjectIdentifier 2019 Value [][]pkix.Extension `asn1:"set"` 2020 }{ 2021 Type: oidExtensionRequest, 2022 Value: [][]pkix.Extension{extensions}, 2023 } 2024 2025 b, err := asn1.Marshal(attr) 2026 if err != nil { 2027 return nil, errors.New("x509: failed to serialise extensions attribute: " + err.Error()) 2028 } 2029 2030 var rawValue asn1.RawValue 2031 if _, err := asn1.Unmarshal(b, &rawValue); err != nil { 2032 return nil, err 2033 } 2034 2035 rawAttributes = append(rawAttributes, rawValue) 2036 } 2037 2038 asn1Subject := template.RawSubject 2039 if len(asn1Subject) == 0 { 2040 asn1Subject, err = asn1.Marshal(template.Subject.ToRDNSequence()) 2041 if err != nil { 2042 return nil, err 2043 } 2044 } 2045 2046 tbsCSR := tbsCertificateRequest{ 2047 Version: 0, // PKCS #10, RFC 2986 2048 Subject: asn1.RawValue{FullBytes: asn1Subject}, 2049 PublicKey: publicKeyInfo{ 2050 Algorithm: publicKeyAlgorithm, 2051 PublicKey: asn1.BitString{ 2052 Bytes: publicKeyBytes, 2053 BitLength: len(publicKeyBytes) * 8, 2054 }, 2055 }, 2056 RawAttributes: rawAttributes, 2057 } 2058 2059 tbsCSRContents, err := asn1.Marshal(tbsCSR) 2060 if err != nil { 2061 return 2062 } 2063 tbsCSR.Raw = tbsCSRContents 2064 2065 signed := tbsCSRContents 2066 if hashFunc != 0 { 2067 h := hashFunc.New() 2068 h.Write(signed) 2069 signed = h.Sum(nil) 2070 } 2071 2072 var signature []byte 2073 signature, err = key.Sign(rand, signed, hashFunc) 2074 if err != nil { 2075 return 2076 } 2077 2078 return asn1.Marshal(certificateRequest{ 2079 TBSCSR: tbsCSR, 2080 SignatureAlgorithm: sigAlgo, 2081 SignatureValue: asn1.BitString{ 2082 Bytes: signature, 2083 BitLength: len(signature) * 8, 2084 }, 2085 }) 2086 } 2087 2088 // ParseCertificateRequest parses a single certificate request from the 2089 // given ASN.1 DER data. 2090 func ParseCertificateRequest(asn1Data []byte) (*CertificateRequest, error) { 2091 var csr certificateRequest 2092 2093 rest, err := asn1.Unmarshal(asn1Data, &csr) 2094 if err != nil { 2095 return nil, err 2096 } else if len(rest) != 0 { 2097 return nil, asn1.SyntaxError{Msg: "trailing data"} 2098 } 2099 2100 return parseCertificateRequest(&csr) 2101 } 2102 2103 func parseCertificateRequest(in *certificateRequest) (*CertificateRequest, error) { 2104 out := &CertificateRequest{ 2105 Raw: in.Raw, 2106 RawTBSCertificateRequest: in.TBSCSR.Raw, 2107 RawSubjectPublicKeyInfo: in.TBSCSR.PublicKey.Raw, 2108 RawSubject: in.TBSCSR.Subject.FullBytes, 2109 2110 Signature: in.SignatureValue.RightAlign(), 2111 SignatureAlgorithm: getSignatureAlgorithmFromAI(in.SignatureAlgorithm), 2112 2113 PublicKeyAlgorithm: getPublicKeyAlgorithmFromOID(in.TBSCSR.PublicKey.Algorithm.Algorithm), 2114 2115 Version: in.TBSCSR.Version, 2116 Attributes: parseRawAttributes(in.TBSCSR.RawAttributes), 2117 } 2118 2119 var err error 2120 if out.PublicKeyAlgorithm != UnknownPublicKeyAlgorithm { 2121 out.PublicKey, err = parsePublicKey(&in.TBSCSR.PublicKey) 2122 if err != nil { 2123 return nil, err 2124 } 2125 } 2126 2127 var subject pkix.RDNSequence 2128 if rest, err := asn1.Unmarshal(in.TBSCSR.Subject.FullBytes, &subject); err != nil { 2129 return nil, err 2130 } else if len(rest) != 0 { 2131 return nil, errors.New("x509: trailing data after X.509 Subject") 2132 } 2133 2134 out.Subject.FillFromRDNSequence(&subject) 2135 2136 if out.Extensions, err = parseCSRExtensions(in.TBSCSR.RawAttributes); err != nil { 2137 return nil, err 2138 } 2139 2140 for _, extension := range out.Extensions { 2141 switch { 2142 case extension.Id.Equal(oidExtensionSubjectAltName): 2143 out.DNSNames, out.EmailAddresses, out.IPAddresses, out.URIs, err = parseSANExtension(extension.Value) 2144 if err != nil { 2145 return nil, err 2146 } 2147 } 2148 } 2149 2150 return out, nil 2151 } 2152 2153 // CheckSignature reports whether the signature on c is valid. 2154 func (c *CertificateRequest) CheckSignature() error { 2155 return checkSignature(c.SignatureAlgorithm, c.RawTBSCertificateRequest, c.Signature, c.PublicKey, true) 2156 } 2157 2158 // RevocationListEntry represents an entry in the revokedCertificates 2159 // sequence of a CRL. 2160 type RevocationListEntry struct { 2161 // Raw contains the raw bytes of the revokedCertificates entry. It is set when 2162 // parsing a CRL; it is ignored when generating a CRL. 2163 Raw []byte 2164 2165 // SerialNumber represents the serial number of a revoked certificate. It is 2166 // both used when creating a CRL and populated when parsing a CRL. It must not 2167 // be nil. 2168 SerialNumber *big.Int 2169 // RevocationTime represents the time at which the certificate was revoked. It 2170 // is both used when creating a CRL and populated when parsing a CRL. It must 2171 // not be the zero time. 2172 RevocationTime time.Time 2173 // ReasonCode represents the reason for revocation, using the integer enum 2174 // values specified in RFC 5280 Section 5.3.1. When creating a CRL, the zero 2175 // value will result in the reasonCode extension being omitted. When parsing a 2176 // CRL, the zero value may represent either the reasonCode extension being 2177 // absent (which implies the default revocation reason of 0/Unspecified), or 2178 // it may represent the reasonCode extension being present and explicitly 2179 // containing a value of 0/Unspecified (which should not happen according to 2180 // the DER encoding rules, but can and does happen anyway). 2181 ReasonCode int 2182 2183 // Extensions contains raw X.509 extensions. When parsing CRL entries, 2184 // this can be used to extract non-critical extensions that are not 2185 // parsed by this package. When marshaling CRL entries, the Extensions 2186 // field is ignored, see ExtraExtensions. 2187 Extensions []pkix.Extension 2188 // ExtraExtensions contains extensions to be copied, raw, into any 2189 // marshaled CRL entries. Values override any extensions that would 2190 // otherwise be produced based on the other fields. The ExtraExtensions 2191 // field is not populated when parsing CRL entries, see Extensions. 2192 ExtraExtensions []pkix.Extension 2193 } 2194 2195 // RevocationList represents a Certificate Revocation List (CRL) as specified 2196 // by RFC 5280. 2197 type RevocationList struct { 2198 // Raw contains the complete ASN.1 DER content of the CRL (tbsCertList, 2199 // signatureAlgorithm, and signatureValue.) 2200 Raw []byte 2201 // RawTBSRevocationList contains just the tbsCertList portion of the ASN.1 2202 // DER. 2203 RawTBSRevocationList []byte 2204 // RawIssuer contains the DER encoded Issuer. 2205 RawIssuer []byte 2206 2207 // Issuer contains the DN of the issuing certificate. 2208 Issuer pkix.Name 2209 // AuthorityKeyId is used to identify the public key associated with the 2210 // issuing certificate. It is populated from the authorityKeyIdentifier 2211 // extension when parsing a CRL. It is ignored when creating a CRL; the 2212 // extension is populated from the issuing certificate itself. 2213 AuthorityKeyId []byte 2214 2215 Signature []byte 2216 // SignatureAlgorithm is used to determine the signature algorithm to be 2217 // used when signing the CRL. If 0 the default algorithm for the signing 2218 // key will be used. 2219 SignatureAlgorithm SignatureAlgorithm 2220 2221 // RevokedCertificateEntries represents the revokedCertificates sequence in 2222 // the CRL. It is used when creating a CRL and also populated when parsing a 2223 // CRL. When creating a CRL, it may be empty or nil, in which case the 2224 // revokedCertificates ASN.1 sequence will be omitted from the CRL entirely. 2225 RevokedCertificateEntries []RevocationListEntry 2226 2227 // RevokedCertificates is used to populate the revokedCertificates 2228 // sequence in the CRL if RevokedCertificateEntries is empty. It may be empty 2229 // or nil, in which case an empty CRL will be created. 2230 // 2231 // Deprecated: Use RevokedCertificateEntries instead. 2232 RevokedCertificates []pkix.RevokedCertificate 2233 2234 // Number is used to populate the X.509 v2 cRLNumber extension in the CRL, 2235 // which should be a monotonically increasing sequence number for a given 2236 // CRL scope and CRL issuer. It is also populated from the cRLNumber 2237 // extension when parsing a CRL. 2238 Number *big.Int 2239 2240 // ThisUpdate is used to populate the thisUpdate field in the CRL, which 2241 // indicates the issuance date of the CRL. 2242 ThisUpdate time.Time 2243 // NextUpdate is used to populate the nextUpdate field in the CRL, which 2244 // indicates the date by which the next CRL will be issued. NextUpdate 2245 // must be greater than ThisUpdate. 2246 NextUpdate time.Time 2247 2248 // Extensions contains raw X.509 extensions. When creating a CRL, 2249 // the Extensions field is ignored, see ExtraExtensions. 2250 Extensions []pkix.Extension 2251 2252 // ExtraExtensions contains any additional extensions to add directly to 2253 // the CRL. 2254 ExtraExtensions []pkix.Extension 2255 } 2256 2257 // These structures reflect the ASN.1 structure of X.509 CRLs better than 2258 // the existing crypto/x509/pkix variants do. These mirror the existing 2259 // certificate structs in this file. 2260 // 2261 // Notably, we include issuer as an asn1.RawValue, mirroring the behavior of 2262 // tbsCertificate and allowing raw (unparsed) subjects to be passed cleanly. 2263 type certificateList struct { 2264 TBSCertList tbsCertificateList 2265 SignatureAlgorithm pkix.AlgorithmIdentifier 2266 SignatureValue asn1.BitString 2267 } 2268 2269 type tbsCertificateList struct { 2270 Raw asn1.RawContent 2271 Version int `asn1:"optional,default:0"` 2272 Signature pkix.AlgorithmIdentifier 2273 Issuer asn1.RawValue 2274 ThisUpdate time.Time 2275 NextUpdate time.Time `asn1:"optional"` 2276 RevokedCertificates []pkix.RevokedCertificate `asn1:"optional"` 2277 Extensions []pkix.Extension `asn1:"tag:0,optional,explicit"` 2278 } 2279 2280 // CreateRevocationList creates a new X.509 v2 Certificate Revocation List, 2281 // according to RFC 5280, based on template. 2282 // 2283 // The CRL is signed by priv which should be the private key associated with 2284 // the public key in the issuer certificate. 2285 // 2286 // The issuer may not be nil, and the crlSign bit must be set in KeyUsage in 2287 // order to use it as a CRL issuer. 2288 // 2289 // The issuer distinguished name CRL field and authority key identifier 2290 // extension are populated using the issuer certificate. issuer must have 2291 // SubjectKeyId set. 2292 func CreateRevocationList(rand io.Reader, template *RevocationList, issuer *Certificate, priv crypto.Signer) ([]byte, error) { 2293 if template == nil { 2294 return nil, errors.New("x509: template can not be nil") 2295 } 2296 if issuer == nil { 2297 return nil, errors.New("x509: issuer can not be nil") 2298 } 2299 if (issuer.KeyUsage & KeyUsageCRLSign) == 0 { 2300 return nil, errors.New("x509: issuer must have the crlSign key usage bit set") 2301 } 2302 if len(issuer.SubjectKeyId) == 0 { 2303 return nil, errors.New("x509: issuer certificate doesn't contain a subject key identifier") 2304 } 2305 if template.NextUpdate.Before(template.ThisUpdate) { 2306 return nil, errors.New("x509: template.ThisUpdate is after template.NextUpdate") 2307 } 2308 if template.Number == nil { 2309 return nil, errors.New("x509: template contains nil Number field") 2310 } 2311 2312 hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(priv.Public(), template.SignatureAlgorithm) 2313 if err != nil { 2314 return nil, err 2315 } 2316 2317 var revokedCerts []pkix.RevokedCertificate 2318 // Only process the deprecated RevokedCertificates field if it is populated 2319 // and the new RevokedCertificateEntries field is not populated. 2320 if len(template.RevokedCertificates) > 0 && len(template.RevokedCertificateEntries) == 0 { 2321 // Force revocation times to UTC per RFC 5280. 2322 revokedCerts = make([]pkix.RevokedCertificate, len(template.RevokedCertificates)) 2323 for i, rc := range template.RevokedCertificates { 2324 rc.RevocationTime = rc.RevocationTime.UTC() 2325 revokedCerts[i] = rc 2326 } 2327 } else { 2328 // Convert the ReasonCode field to a proper extension, and force revocation 2329 // times to UTC per RFC 5280. 2330 revokedCerts = make([]pkix.RevokedCertificate, len(template.RevokedCertificateEntries)) 2331 for i, rce := range template.RevokedCertificateEntries { 2332 if rce.SerialNumber == nil { 2333 return nil, errors.New("x509: template contains entry with nil SerialNumber field") 2334 } 2335 if rce.RevocationTime.IsZero() { 2336 return nil, errors.New("x509: template contains entry with zero RevocationTime field") 2337 } 2338 2339 rc := pkix.RevokedCertificate{ 2340 SerialNumber: rce.SerialNumber, 2341 RevocationTime: rce.RevocationTime.UTC(), 2342 } 2343 2344 // Copy over any extra extensions, except for a Reason Code extension, 2345 // because we'll synthesize that ourselves to ensure it is correct. 2346 exts := make([]pkix.Extension, 0, len(rce.ExtraExtensions)) 2347 for _, ext := range rce.ExtraExtensions { 2348 if ext.Id.Equal(oidExtensionReasonCode) { 2349 return nil, errors.New("x509: template contains entry with ReasonCode ExtraExtension; use ReasonCode field instead") 2350 } 2351 exts = append(exts, ext) 2352 } 2353 2354 // Only add a reasonCode extension if the reason is non-zero, as per 2355 // RFC 5280 Section 5.3.1. 2356 if rce.ReasonCode != 0 { 2357 reasonBytes, err := asn1.Marshal(asn1.Enumerated(rce.ReasonCode)) 2358 if err != nil { 2359 return nil, err 2360 } 2361 2362 exts = append(exts, pkix.Extension{ 2363 Id: oidExtensionReasonCode, 2364 Value: reasonBytes, 2365 }) 2366 } 2367 2368 if len(exts) > 0 { 2369 rc.Extensions = exts 2370 } 2371 revokedCerts[i] = rc 2372 } 2373 } 2374 2375 aki, err := asn1.Marshal(authKeyId{Id: issuer.SubjectKeyId}) 2376 if err != nil { 2377 return nil, err 2378 } 2379 2380 if numBytes := template.Number.Bytes(); len(numBytes) > 20 || (len(numBytes) == 20 && numBytes[0]&0x80 != 0) { 2381 return nil, errors.New("x509: CRL number exceeds 20 octets") 2382 } 2383 crlNum, err := asn1.Marshal(template.Number) 2384 if err != nil { 2385 return nil, err 2386 } 2387 2388 // Correctly use the issuer's subject sequence if one is specified. 2389 issuerSubject, err := subjectBytes(issuer) 2390 if err != nil { 2391 return nil, err 2392 } 2393 2394 tbsCertList := tbsCertificateList{ 2395 Version: 1, // v2 2396 Signature: signatureAlgorithm, 2397 Issuer: asn1.RawValue{FullBytes: issuerSubject}, 2398 ThisUpdate: template.ThisUpdate.UTC(), 2399 NextUpdate: template.NextUpdate.UTC(), 2400 Extensions: []pkix.Extension{ 2401 { 2402 Id: oidExtensionAuthorityKeyId, 2403 Value: aki, 2404 }, 2405 { 2406 Id: oidExtensionCRLNumber, 2407 Value: crlNum, 2408 }, 2409 }, 2410 } 2411 if len(revokedCerts) > 0 { 2412 tbsCertList.RevokedCertificates = revokedCerts 2413 } 2414 2415 if len(template.ExtraExtensions) > 0 { 2416 tbsCertList.Extensions = append(tbsCertList.Extensions, template.ExtraExtensions...) 2417 } 2418 2419 tbsCertListContents, err := asn1.Marshal(tbsCertList) 2420 if err != nil { 2421 return nil, err 2422 } 2423 2424 // Optimization to only marshal this struct once, when signing and 2425 // then embedding in certificateList below. 2426 tbsCertList.Raw = tbsCertListContents 2427 2428 input := tbsCertListContents 2429 if hashFunc != 0 { 2430 h := hashFunc.New() 2431 h.Write(tbsCertListContents) 2432 input = h.Sum(nil) 2433 } 2434 var signerOpts crypto.SignerOpts = hashFunc 2435 if template.SignatureAlgorithm.isRSAPSS() { 2436 signerOpts = &rsa.PSSOptions{ 2437 SaltLength: rsa.PSSSaltLengthEqualsHash, 2438 Hash: hashFunc, 2439 } 2440 } 2441 2442 signature, err := priv.Sign(rand, input, signerOpts) 2443 if err != nil { 2444 return nil, err 2445 } 2446 2447 return asn1.Marshal(certificateList{ 2448 TBSCertList: tbsCertList, 2449 SignatureAlgorithm: signatureAlgorithm, 2450 SignatureValue: asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, 2451 }) 2452 } 2453 2454 // CheckSignatureFrom verifies that the signature on rl is a valid signature 2455 // from issuer. 2456 func (rl *RevocationList) CheckSignatureFrom(parent *Certificate) error { 2457 if parent.Version == 3 && !parent.BasicConstraintsValid || 2458 parent.BasicConstraintsValid && !parent.IsCA { 2459 return ConstraintViolationError{} 2460 } 2461 2462 if parent.KeyUsage != 0 && parent.KeyUsage&KeyUsageCRLSign == 0 { 2463 return ConstraintViolationError{} 2464 } 2465 2466 if parent.PublicKeyAlgorithm == UnknownPublicKeyAlgorithm { 2467 return ErrUnsupportedAlgorithm 2468 } 2469 2470 return parent.CheckSignature(rl.SignatureAlgorithm, rl.RawTBSRevocationList, rl.Signature) 2471 }