github.com/sean-/go@v0.0.0-20151219100004-97f854cd7bb6/src/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 parses X.509-encoded keys and certificates. 6 package x509 7 8 import ( 9 "bytes" 10 "crypto" 11 "crypto/dsa" 12 "crypto/ecdsa" 13 "crypto/elliptic" 14 "crypto/rsa" 15 _ "crypto/sha1" 16 _ "crypto/sha256" 17 _ "crypto/sha512" 18 "crypto/x509/pkix" 19 "encoding/asn1" 20 "encoding/pem" 21 "errors" 22 "fmt" 23 "io" 24 "math/big" 25 "net" 26 "strconv" 27 "time" 28 ) 29 30 // pkixPublicKey reflects a PKIX public key structure. See SubjectPublicKeyInfo 31 // in RFC 3280. 32 type pkixPublicKey struct { 33 Algo pkix.AlgorithmIdentifier 34 BitString asn1.BitString 35 } 36 37 // ParsePKIXPublicKey parses a DER encoded public key. These values are 38 // typically found in PEM blocks with "BEGIN PUBLIC KEY". 39 func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error) { 40 var pki publicKeyInfo 41 if rest, err := asn1.Unmarshal(derBytes, &pki); err != nil { 42 return nil, err 43 } else if len(rest) != 0 { 44 return nil, errors.New("x509: trailing data after ASN.1 of public-key") 45 } 46 algo := getPublicKeyAlgorithmFromOID(pki.Algorithm.Algorithm) 47 if algo == UnknownPublicKeyAlgorithm { 48 return nil, errors.New("x509: unknown public key algorithm") 49 } 50 return parsePublicKey(algo, &pki) 51 } 52 53 func marshalPublicKey(pub interface{}) (publicKeyBytes []byte, publicKeyAlgorithm pkix.AlgorithmIdentifier, err error) { 54 switch pub := pub.(type) { 55 case *rsa.PublicKey: 56 publicKeyBytes, err = asn1.Marshal(rsaPublicKey{ 57 N: pub.N, 58 E: pub.E, 59 }) 60 if err != nil { 61 return nil, pkix.AlgorithmIdentifier{}, err 62 } 63 publicKeyAlgorithm.Algorithm = oidPublicKeyRSA 64 // This is a NULL parameters value which is technically 65 // superfluous, but most other code includes it and, by 66 // doing this, we match their public key hashes. 67 publicKeyAlgorithm.Parameters = asn1.RawValue{ 68 Tag: 5, 69 } 70 case *ecdsa.PublicKey: 71 publicKeyBytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) 72 oid, ok := oidFromNamedCurve(pub.Curve) 73 if !ok { 74 return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: unsupported elliptic curve") 75 } 76 publicKeyAlgorithm.Algorithm = oidPublicKeyECDSA 77 var paramBytes []byte 78 paramBytes, err = asn1.Marshal(oid) 79 if err != nil { 80 return 81 } 82 publicKeyAlgorithm.Parameters.FullBytes = paramBytes 83 default: 84 return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: only RSA and ECDSA public keys supported") 85 } 86 87 return publicKeyBytes, publicKeyAlgorithm, nil 88 } 89 90 // MarshalPKIXPublicKey serialises a public key to DER-encoded PKIX format. 91 func MarshalPKIXPublicKey(pub interface{}) ([]byte, error) { 92 var publicKeyBytes []byte 93 var publicKeyAlgorithm pkix.AlgorithmIdentifier 94 var err error 95 96 if publicKeyBytes, publicKeyAlgorithm, err = marshalPublicKey(pub); err != nil { 97 return nil, err 98 } 99 100 pkix := pkixPublicKey{ 101 Algo: publicKeyAlgorithm, 102 BitString: asn1.BitString{ 103 Bytes: publicKeyBytes, 104 BitLength: 8 * len(publicKeyBytes), 105 }, 106 } 107 108 ret, _ := asn1.Marshal(pkix) 109 return ret, nil 110 } 111 112 // These structures reflect the ASN.1 structure of X.509 certificates.: 113 114 type certificate struct { 115 Raw asn1.RawContent 116 TBSCertificate tbsCertificate 117 SignatureAlgorithm pkix.AlgorithmIdentifier 118 SignatureValue asn1.BitString 119 } 120 121 type tbsCertificate struct { 122 Raw asn1.RawContent 123 Version int `asn1:"optional,explicit,default:1,tag:0"` 124 SerialNumber *big.Int 125 SignatureAlgorithm pkix.AlgorithmIdentifier 126 Issuer asn1.RawValue 127 Validity validity 128 Subject asn1.RawValue 129 PublicKey publicKeyInfo 130 UniqueId asn1.BitString `asn1:"optional,tag:1"` 131 SubjectUniqueId asn1.BitString `asn1:"optional,tag:2"` 132 Extensions []pkix.Extension `asn1:"optional,explicit,tag:3"` 133 } 134 135 type dsaAlgorithmParameters struct { 136 P, Q, G *big.Int 137 } 138 139 type dsaSignature struct { 140 R, S *big.Int 141 } 142 143 type ecdsaSignature dsaSignature 144 145 type validity struct { 146 NotBefore, NotAfter time.Time 147 } 148 149 type publicKeyInfo struct { 150 Raw asn1.RawContent 151 Algorithm pkix.AlgorithmIdentifier 152 PublicKey asn1.BitString 153 } 154 155 // RFC 5280, 4.2.1.1 156 type authKeyId struct { 157 Id []byte `asn1:"optional,tag:0"` 158 } 159 160 type SignatureAlgorithm int 161 162 const ( 163 UnknownSignatureAlgorithm SignatureAlgorithm = iota 164 MD2WithRSA 165 MD5WithRSA 166 SHA1WithRSA 167 SHA256WithRSA 168 SHA384WithRSA 169 SHA512WithRSA 170 DSAWithSHA1 171 DSAWithSHA256 172 ECDSAWithSHA1 173 ECDSAWithSHA256 174 ECDSAWithSHA384 175 ECDSAWithSHA512 176 ) 177 178 var algoName = [...]string{ 179 MD2WithRSA: "MD2-RSA", 180 MD5WithRSA: "MD5-RSA", 181 SHA1WithRSA: "SHA1-RSA", 182 SHA256WithRSA: "SHA256-RSA", 183 SHA384WithRSA: "SHA384-RSA", 184 SHA512WithRSA: "SHA512-RSA", 185 DSAWithSHA1: "DSA-SHA1", 186 DSAWithSHA256: "DSA-SHA256", 187 ECDSAWithSHA1: "ECDSA-SHA1", 188 ECDSAWithSHA256: "ECDSA-SHA256", 189 ECDSAWithSHA384: "ECDSA-SHA384", 190 ECDSAWithSHA512: "ECDSA-SHA512", 191 } 192 193 func (algo SignatureAlgorithm) String() string { 194 if 0 < algo && int(algo) < len(algoName) { 195 return algoName[algo] 196 } 197 return strconv.Itoa(int(algo)) 198 } 199 200 type PublicKeyAlgorithm int 201 202 const ( 203 UnknownPublicKeyAlgorithm PublicKeyAlgorithm = iota 204 RSA 205 DSA 206 ECDSA 207 ) 208 209 // OIDs for signature algorithms 210 // 211 // pkcs-1 OBJECT IDENTIFIER ::= { 212 // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } 213 // 214 // 215 // RFC 3279 2.2.1 RSA Signature Algorithms 216 // 217 // md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } 218 // 219 // md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } 220 // 221 // sha-1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } 222 // 223 // dsaWithSha1 OBJECT IDENTIFIER ::= { 224 // iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 3 } 225 // 226 // RFC 3279 2.2.3 ECDSA Signature Algorithm 227 // 228 // ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { 229 // iso(1) member-body(2) us(840) ansi-x962(10045) 230 // signatures(4) ecdsa-with-SHA1(1)} 231 // 232 // 233 // RFC 4055 5 PKCS #1 Version 1.5 234 // 235 // sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } 236 // 237 // sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } 238 // 239 // sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } 240 // 241 // 242 // RFC 5758 3.1 DSA Signature Algorithms 243 // 244 // dsaWithSha256 OBJECT IDENTIFIER ::= { 245 // joint-iso-ccitt(2) country(16) us(840) organization(1) gov(101) 246 // csor(3) algorithms(4) id-dsa-with-sha2(3) 2} 247 // 248 // RFC 5758 3.2 ECDSA Signature Algorithm 249 // 250 // ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) 251 // us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } 252 // 253 // ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) 254 // us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } 255 // 256 // ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) 257 // us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } 258 259 var ( 260 oidSignatureMD2WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 2} 261 oidSignatureMD5WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 4} 262 oidSignatureSHA1WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5} 263 oidSignatureSHA256WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 11} 264 oidSignatureSHA384WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 12} 265 oidSignatureSHA512WithRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 13} 266 oidSignatureDSAWithSHA1 = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 3} 267 oidSignatureDSAWithSHA256 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 4, 3, 2} 268 oidSignatureECDSAWithSHA1 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 1} 269 oidSignatureECDSAWithSHA256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 2} 270 oidSignatureECDSAWithSHA384 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 3} 271 oidSignatureECDSAWithSHA512 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 4} 272 ) 273 274 var signatureAlgorithmDetails = []struct { 275 algo SignatureAlgorithm 276 oid asn1.ObjectIdentifier 277 pubKeyAlgo PublicKeyAlgorithm 278 hash crypto.Hash 279 }{ 280 {MD2WithRSA, oidSignatureMD2WithRSA, RSA, crypto.Hash(0) /* no value for MD2 */}, 281 {MD5WithRSA, oidSignatureMD5WithRSA, RSA, crypto.MD5}, 282 {SHA1WithRSA, oidSignatureSHA1WithRSA, RSA, crypto.SHA1}, 283 {SHA256WithRSA, oidSignatureSHA256WithRSA, RSA, crypto.SHA256}, 284 {SHA384WithRSA, oidSignatureSHA384WithRSA, RSA, crypto.SHA384}, 285 {SHA512WithRSA, oidSignatureSHA512WithRSA, RSA, crypto.SHA512}, 286 {DSAWithSHA1, oidSignatureDSAWithSHA1, DSA, crypto.SHA1}, 287 {DSAWithSHA256, oidSignatureDSAWithSHA256, DSA, crypto.SHA256}, 288 {ECDSAWithSHA1, oidSignatureECDSAWithSHA1, ECDSA, crypto.SHA1}, 289 {ECDSAWithSHA256, oidSignatureECDSAWithSHA256, ECDSA, crypto.SHA256}, 290 {ECDSAWithSHA384, oidSignatureECDSAWithSHA384, ECDSA, crypto.SHA384}, 291 {ECDSAWithSHA512, oidSignatureECDSAWithSHA512, ECDSA, crypto.SHA512}, 292 } 293 294 func getSignatureAlgorithmFromOID(oid asn1.ObjectIdentifier) SignatureAlgorithm { 295 for _, details := range signatureAlgorithmDetails { 296 if oid.Equal(details.oid) { 297 return details.algo 298 } 299 } 300 return UnknownSignatureAlgorithm 301 } 302 303 // RFC 3279, 2.3 Public Key Algorithms 304 // 305 // pkcs-1 OBJECT IDENTIFIER ::== { iso(1) member-body(2) us(840) 306 // rsadsi(113549) pkcs(1) 1 } 307 // 308 // rsaEncryption OBJECT IDENTIFIER ::== { pkcs1-1 1 } 309 // 310 // id-dsa OBJECT IDENTIFIER ::== { iso(1) member-body(2) us(840) 311 // x9-57(10040) x9cm(4) 1 } 312 // 313 // RFC 5480, 2.1.1 Unrestricted Algorithm Identifier and Parameters 314 // 315 // id-ecPublicKey OBJECT IDENTIFIER ::= { 316 // iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } 317 var ( 318 oidPublicKeyRSA = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1} 319 oidPublicKeyDSA = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 1} 320 oidPublicKeyECDSA = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1} 321 ) 322 323 func getPublicKeyAlgorithmFromOID(oid asn1.ObjectIdentifier) PublicKeyAlgorithm { 324 switch { 325 case oid.Equal(oidPublicKeyRSA): 326 return RSA 327 case oid.Equal(oidPublicKeyDSA): 328 return DSA 329 case oid.Equal(oidPublicKeyECDSA): 330 return ECDSA 331 } 332 return UnknownPublicKeyAlgorithm 333 } 334 335 // RFC 5480, 2.1.1.1. Named Curve 336 // 337 // secp224r1 OBJECT IDENTIFIER ::= { 338 // iso(1) identified-organization(3) certicom(132) curve(0) 33 } 339 // 340 // secp256r1 OBJECT IDENTIFIER ::= { 341 // iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) 342 // prime(1) 7 } 343 // 344 // secp384r1 OBJECT IDENTIFIER ::= { 345 // iso(1) identified-organization(3) certicom(132) curve(0) 34 } 346 // 347 // secp521r1 OBJECT IDENTIFIER ::= { 348 // iso(1) identified-organization(3) certicom(132) curve(0) 35 } 349 // 350 // NB: secp256r1 is equivalent to prime256v1 351 var ( 352 oidNamedCurveP224 = asn1.ObjectIdentifier{1, 3, 132, 0, 33} 353 oidNamedCurveP256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 3, 1, 7} 354 oidNamedCurveP384 = asn1.ObjectIdentifier{1, 3, 132, 0, 34} 355 oidNamedCurveP521 = asn1.ObjectIdentifier{1, 3, 132, 0, 35} 356 ) 357 358 func namedCurveFromOID(oid asn1.ObjectIdentifier) elliptic.Curve { 359 switch { 360 case oid.Equal(oidNamedCurveP224): 361 return elliptic.P224() 362 case oid.Equal(oidNamedCurveP256): 363 return elliptic.P256() 364 case oid.Equal(oidNamedCurveP384): 365 return elliptic.P384() 366 case oid.Equal(oidNamedCurveP521): 367 return elliptic.P521() 368 } 369 return nil 370 } 371 372 func oidFromNamedCurve(curve elliptic.Curve) (asn1.ObjectIdentifier, bool) { 373 switch curve { 374 case elliptic.P224(): 375 return oidNamedCurveP224, true 376 case elliptic.P256(): 377 return oidNamedCurveP256, true 378 case elliptic.P384(): 379 return oidNamedCurveP384, true 380 case elliptic.P521(): 381 return oidNamedCurveP521, true 382 } 383 384 return nil, false 385 } 386 387 // KeyUsage represents the set of actions that are valid for a given key. It's 388 // a bitmap of the KeyUsage* constants. 389 type KeyUsage int 390 391 const ( 392 KeyUsageDigitalSignature KeyUsage = 1 << iota 393 KeyUsageContentCommitment 394 KeyUsageKeyEncipherment 395 KeyUsageDataEncipherment 396 KeyUsageKeyAgreement 397 KeyUsageCertSign 398 KeyUsageCRLSign 399 KeyUsageEncipherOnly 400 KeyUsageDecipherOnly 401 ) 402 403 // RFC 5280, 4.2.1.12 Extended Key Usage 404 // 405 // anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } 406 // 407 // id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } 408 // 409 // id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } 410 // id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } 411 // id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } 412 // id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } 413 // id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } 414 // id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } 415 var ( 416 oidExtKeyUsageAny = asn1.ObjectIdentifier{2, 5, 29, 37, 0} 417 oidExtKeyUsageServerAuth = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 1} 418 oidExtKeyUsageClientAuth = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 2} 419 oidExtKeyUsageCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 3} 420 oidExtKeyUsageEmailProtection = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 4} 421 oidExtKeyUsageIPSECEndSystem = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 5} 422 oidExtKeyUsageIPSECTunnel = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 6} 423 oidExtKeyUsageIPSECUser = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 7} 424 oidExtKeyUsageTimeStamping = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 8} 425 oidExtKeyUsageOCSPSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 9} 426 oidExtKeyUsageMicrosoftServerGatedCrypto = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 10, 3, 3} 427 oidExtKeyUsageNetscapeServerGatedCrypto = asn1.ObjectIdentifier{2, 16, 840, 1, 113730, 4, 1} 428 ) 429 430 // ExtKeyUsage represents an extended set of actions that are valid for a given key. 431 // Each of the ExtKeyUsage* constants define a unique action. 432 type ExtKeyUsage int 433 434 const ( 435 ExtKeyUsageAny ExtKeyUsage = iota 436 ExtKeyUsageServerAuth 437 ExtKeyUsageClientAuth 438 ExtKeyUsageCodeSigning 439 ExtKeyUsageEmailProtection 440 ExtKeyUsageIPSECEndSystem 441 ExtKeyUsageIPSECTunnel 442 ExtKeyUsageIPSECUser 443 ExtKeyUsageTimeStamping 444 ExtKeyUsageOCSPSigning 445 ExtKeyUsageMicrosoftServerGatedCrypto 446 ExtKeyUsageNetscapeServerGatedCrypto 447 ) 448 449 // extKeyUsageOIDs contains the mapping between an ExtKeyUsage and its OID. 450 var extKeyUsageOIDs = []struct { 451 extKeyUsage ExtKeyUsage 452 oid asn1.ObjectIdentifier 453 }{ 454 {ExtKeyUsageAny, oidExtKeyUsageAny}, 455 {ExtKeyUsageServerAuth, oidExtKeyUsageServerAuth}, 456 {ExtKeyUsageClientAuth, oidExtKeyUsageClientAuth}, 457 {ExtKeyUsageCodeSigning, oidExtKeyUsageCodeSigning}, 458 {ExtKeyUsageEmailProtection, oidExtKeyUsageEmailProtection}, 459 {ExtKeyUsageIPSECEndSystem, oidExtKeyUsageIPSECEndSystem}, 460 {ExtKeyUsageIPSECTunnel, oidExtKeyUsageIPSECTunnel}, 461 {ExtKeyUsageIPSECUser, oidExtKeyUsageIPSECUser}, 462 {ExtKeyUsageTimeStamping, oidExtKeyUsageTimeStamping}, 463 {ExtKeyUsageOCSPSigning, oidExtKeyUsageOCSPSigning}, 464 {ExtKeyUsageMicrosoftServerGatedCrypto, oidExtKeyUsageMicrosoftServerGatedCrypto}, 465 {ExtKeyUsageNetscapeServerGatedCrypto, oidExtKeyUsageNetscapeServerGatedCrypto}, 466 } 467 468 func extKeyUsageFromOID(oid asn1.ObjectIdentifier) (eku ExtKeyUsage, ok bool) { 469 for _, pair := range extKeyUsageOIDs { 470 if oid.Equal(pair.oid) { 471 return pair.extKeyUsage, true 472 } 473 } 474 return 475 } 476 477 func oidFromExtKeyUsage(eku ExtKeyUsage) (oid asn1.ObjectIdentifier, ok bool) { 478 for _, pair := range extKeyUsageOIDs { 479 if eku == pair.extKeyUsage { 480 return pair.oid, true 481 } 482 } 483 return 484 } 485 486 // A Certificate represents an X.509 certificate. 487 type Certificate struct { 488 Raw []byte // Complete ASN.1 DER content (certificate, signature algorithm and signature). 489 RawTBSCertificate []byte // Certificate part of raw ASN.1 DER content. 490 RawSubjectPublicKeyInfo []byte // DER encoded SubjectPublicKeyInfo. 491 RawSubject []byte // DER encoded Subject 492 RawIssuer []byte // DER encoded Issuer 493 494 Signature []byte 495 SignatureAlgorithm SignatureAlgorithm 496 497 PublicKeyAlgorithm PublicKeyAlgorithm 498 PublicKey interface{} 499 500 Version int 501 SerialNumber *big.Int 502 Issuer pkix.Name 503 Subject pkix.Name 504 NotBefore, NotAfter time.Time // Validity bounds. 505 KeyUsage KeyUsage 506 507 // Extensions contains raw X.509 extensions. When parsing certificates, 508 // this can be used to extract non-critical extensions that are not 509 // parsed by this package. When marshaling certificates, the Extensions 510 // field is ignored, see ExtraExtensions. 511 Extensions []pkix.Extension 512 513 // ExtraExtensions contains extensions to be copied, raw, into any 514 // marshaled certificates. Values override any extensions that would 515 // otherwise be produced based on the other fields. The ExtraExtensions 516 // field is not populated when parsing certificates, see Extensions. 517 ExtraExtensions []pkix.Extension 518 519 // UnhandledCriticalExtensions contains a list of extension IDs that 520 // were not (fully) processed when parsing. Verify will fail if this 521 // slice is non-empty, unless verification is delegated to an OS 522 // library which understands all the critical extensions. 523 // 524 // Users can access these extensions using Extensions and can remove 525 // elements from this slice if they believe that they have been 526 // handled. 527 UnhandledCriticalExtensions []asn1.ObjectIdentifier 528 529 ExtKeyUsage []ExtKeyUsage // Sequence of extended key usages. 530 UnknownExtKeyUsage []asn1.ObjectIdentifier // Encountered extended key usages unknown to this package. 531 532 BasicConstraintsValid bool // if true then the next two fields are valid. 533 IsCA bool 534 MaxPathLen int 535 // MaxPathLenZero indicates that BasicConstraintsValid==true and 536 // MaxPathLen==0 should be interpreted as an actual maximum path length 537 // of zero. Otherwise, that combination is interpreted as MaxPathLen 538 // not being set. 539 MaxPathLenZero bool 540 541 SubjectKeyId []byte 542 AuthorityKeyId []byte 543 544 // RFC 5280, 4.2.2.1 (Authority Information Access) 545 OCSPServer []string 546 IssuingCertificateURL []string 547 548 // Subject Alternate Name values 549 DNSNames []string 550 EmailAddresses []string 551 IPAddresses []net.IP 552 553 // Name constraints 554 PermittedDNSDomainsCritical bool // if true then the name constraints are marked critical. 555 PermittedDNSDomains []string 556 557 // CRL Distribution Points 558 CRLDistributionPoints []string 559 560 PolicyIdentifiers []asn1.ObjectIdentifier 561 } 562 563 // ErrUnsupportedAlgorithm results from attempting to perform an operation that 564 // involves algorithms that are not currently implemented. 565 var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented") 566 567 // An InsecureAlgorithmError 568 type InsecureAlgorithmError SignatureAlgorithm 569 570 func (e InsecureAlgorithmError) Error() string { 571 return fmt.Sprintf("x509: cannot verify signature: insecure algorithm %v", SignatureAlgorithm(e)) 572 } 573 574 // ConstraintViolationError results when a requested usage is not permitted by 575 // a certificate. For example: checking a signature when the public key isn't a 576 // certificate signing key. 577 type ConstraintViolationError struct{} 578 579 func (ConstraintViolationError) Error() string { 580 return "x509: invalid signature: parent certificate cannot sign this kind of certificate" 581 } 582 583 func (c *Certificate) Equal(other *Certificate) bool { 584 return bytes.Equal(c.Raw, other.Raw) 585 } 586 587 // Entrust have a broken root certificate (CN=Entrust.net Certification 588 // Authority (2048)) which isn't marked as a CA certificate and is thus invalid 589 // according to PKIX. 590 // We recognise this certificate by its SubjectPublicKeyInfo and exempt it 591 // from the Basic Constraints requirement. 592 // See http://www.entrust.net/knowledge-base/technote.cfm?tn=7869 593 // 594 // TODO(agl): remove this hack once their reissued root is sufficiently 595 // widespread. 596 var entrustBrokenSPKI = []byte{ 597 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 598 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 599 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 600 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 601 0x00, 0x97, 0xa3, 0x2d, 0x3c, 0x9e, 0xde, 0x05, 602 0xda, 0x13, 0xc2, 0x11, 0x8d, 0x9d, 0x8e, 0xe3, 603 0x7f, 0xc7, 0x4b, 0x7e, 0x5a, 0x9f, 0xb3, 0xff, 604 0x62, 0xab, 0x73, 0xc8, 0x28, 0x6b, 0xba, 0x10, 605 0x64, 0x82, 0x87, 0x13, 0xcd, 0x57, 0x18, 0xff, 606 0x28, 0xce, 0xc0, 0xe6, 0x0e, 0x06, 0x91, 0x50, 607 0x29, 0x83, 0xd1, 0xf2, 0xc3, 0x2a, 0xdb, 0xd8, 608 0xdb, 0x4e, 0x04, 0xcc, 0x00, 0xeb, 0x8b, 0xb6, 609 0x96, 0xdc, 0xbc, 0xaa, 0xfa, 0x52, 0x77, 0x04, 610 0xc1, 0xdb, 0x19, 0xe4, 0xae, 0x9c, 0xfd, 0x3c, 611 0x8b, 0x03, 0xef, 0x4d, 0xbc, 0x1a, 0x03, 0x65, 612 0xf9, 0xc1, 0xb1, 0x3f, 0x72, 0x86, 0xf2, 0x38, 613 0xaa, 0x19, 0xae, 0x10, 0x88, 0x78, 0x28, 0xda, 614 0x75, 0xc3, 0x3d, 0x02, 0x82, 0x02, 0x9c, 0xb9, 615 0xc1, 0x65, 0x77, 0x76, 0x24, 0x4c, 0x98, 0xf7, 616 0x6d, 0x31, 0x38, 0xfb, 0xdb, 0xfe, 0xdb, 0x37, 617 0x02, 0x76, 0xa1, 0x18, 0x97, 0xa6, 0xcc, 0xde, 618 0x20, 0x09, 0x49, 0x36, 0x24, 0x69, 0x42, 0xf6, 619 0xe4, 0x37, 0x62, 0xf1, 0x59, 0x6d, 0xa9, 0x3c, 620 0xed, 0x34, 0x9c, 0xa3, 0x8e, 0xdb, 0xdc, 0x3a, 621 0xd7, 0xf7, 0x0a, 0x6f, 0xef, 0x2e, 0xd8, 0xd5, 622 0x93, 0x5a, 0x7a, 0xed, 0x08, 0x49, 0x68, 0xe2, 623 0x41, 0xe3, 0x5a, 0x90, 0xc1, 0x86, 0x55, 0xfc, 624 0x51, 0x43, 0x9d, 0xe0, 0xb2, 0xc4, 0x67, 0xb4, 625 0xcb, 0x32, 0x31, 0x25, 0xf0, 0x54, 0x9f, 0x4b, 626 0xd1, 0x6f, 0xdb, 0xd4, 0xdd, 0xfc, 0xaf, 0x5e, 627 0x6c, 0x78, 0x90, 0x95, 0xde, 0xca, 0x3a, 0x48, 628 0xb9, 0x79, 0x3c, 0x9b, 0x19, 0xd6, 0x75, 0x05, 629 0xa0, 0xf9, 0x88, 0xd7, 0xc1, 0xe8, 0xa5, 0x09, 630 0xe4, 0x1a, 0x15, 0xdc, 0x87, 0x23, 0xaa, 0xb2, 631 0x75, 0x8c, 0x63, 0x25, 0x87, 0xd8, 0xf8, 0x3d, 632 0xa6, 0xc2, 0xcc, 0x66, 0xff, 0xa5, 0x66, 0x68, 633 0x55, 0x02, 0x03, 0x01, 0x00, 0x01, 634 } 635 636 // CheckSignatureFrom verifies that the signature on c is a valid signature 637 // from parent. 638 func (c *Certificate) CheckSignatureFrom(parent *Certificate) (err error) { 639 // RFC 5280, 4.2.1.9: 640 // "If the basic constraints extension is not present in a version 3 641 // certificate, or the extension is present but the cA boolean is not 642 // asserted, then the certified public key MUST NOT be used to verify 643 // certificate signatures." 644 // (except for Entrust, see comment above entrustBrokenSPKI) 645 if (parent.Version == 3 && !parent.BasicConstraintsValid || 646 parent.BasicConstraintsValid && !parent.IsCA) && 647 !bytes.Equal(c.RawSubjectPublicKeyInfo, entrustBrokenSPKI) { 648 return ConstraintViolationError{} 649 } 650 651 if parent.KeyUsage != 0 && parent.KeyUsage&KeyUsageCertSign == 0 { 652 return ConstraintViolationError{} 653 } 654 655 if parent.PublicKeyAlgorithm == UnknownPublicKeyAlgorithm { 656 return ErrUnsupportedAlgorithm 657 } 658 659 // TODO(agl): don't ignore the path length constraint. 660 661 return parent.CheckSignature(c.SignatureAlgorithm, c.RawTBSCertificate, c.Signature) 662 } 663 664 // CheckSignature verifies that signature is a valid signature over signed from 665 // c's public key. 666 func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) (err error) { 667 return checkSignature(algo, signed, signature, c.PublicKey) 668 } 669 670 // CheckSignature verifies that signature is a valid signature over signed from 671 // a crypto.PublicKey. 672 func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey crypto.PublicKey) (err error) { 673 var hashType crypto.Hash 674 675 switch algo { 676 case SHA1WithRSA, DSAWithSHA1, ECDSAWithSHA1: 677 hashType = crypto.SHA1 678 case SHA256WithRSA, DSAWithSHA256, ECDSAWithSHA256: 679 hashType = crypto.SHA256 680 case SHA384WithRSA, ECDSAWithSHA384: 681 hashType = crypto.SHA384 682 case SHA512WithRSA, ECDSAWithSHA512: 683 hashType = crypto.SHA512 684 case MD2WithRSA, MD5WithRSA: 685 return InsecureAlgorithmError(algo) 686 default: 687 return ErrUnsupportedAlgorithm 688 } 689 690 if !hashType.Available() { 691 return ErrUnsupportedAlgorithm 692 } 693 h := hashType.New() 694 695 h.Write(signed) 696 digest := h.Sum(nil) 697 698 switch pub := publicKey.(type) { 699 case *rsa.PublicKey: 700 return rsa.VerifyPKCS1v15(pub, hashType, digest, signature) 701 case *dsa.PublicKey: 702 dsaSig := new(dsaSignature) 703 if rest, err := asn1.Unmarshal(signature, dsaSig); err != nil { 704 return err 705 } else if len(rest) != 0 { 706 return errors.New("x509: trailing data after DSA signature") 707 } 708 if dsaSig.R.Sign() <= 0 || dsaSig.S.Sign() <= 0 { 709 return errors.New("x509: DSA signature contained zero or negative values") 710 } 711 if !dsa.Verify(pub, digest, dsaSig.R, dsaSig.S) { 712 return errors.New("x509: DSA verification failure") 713 } 714 return 715 case *ecdsa.PublicKey: 716 ecdsaSig := new(ecdsaSignature) 717 if rest, err := asn1.Unmarshal(signature, ecdsaSig); err != nil { 718 return err 719 } else if len(rest) != 0 { 720 return errors.New("x509: trailing data after ECDSA signature") 721 } 722 if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 { 723 return errors.New("x509: ECDSA signature contained zero or negative values") 724 } 725 if !ecdsa.Verify(pub, digest, ecdsaSig.R, ecdsaSig.S) { 726 return errors.New("x509: ECDSA verification failure") 727 } 728 return 729 } 730 return ErrUnsupportedAlgorithm 731 } 732 733 // CheckCRLSignature checks that the signature in crl is from c. 734 func (c *Certificate) CheckCRLSignature(crl *pkix.CertificateList) (err error) { 735 algo := getSignatureAlgorithmFromOID(crl.SignatureAlgorithm.Algorithm) 736 return c.CheckSignature(algo, crl.TBSCertList.Raw, crl.SignatureValue.RightAlign()) 737 } 738 739 type UnhandledCriticalExtension struct{} 740 741 func (h UnhandledCriticalExtension) Error() string { 742 return "x509: unhandled critical extension" 743 } 744 745 type basicConstraints struct { 746 IsCA bool `asn1:"optional"` 747 MaxPathLen int `asn1:"optional,default:-1"` 748 } 749 750 // RFC 5280 4.2.1.4 751 type policyInformation struct { 752 Policy asn1.ObjectIdentifier 753 // policyQualifiers omitted 754 } 755 756 // RFC 5280, 4.2.1.10 757 type nameConstraints struct { 758 Permitted []generalSubtree `asn1:"optional,tag:0"` 759 Excluded []generalSubtree `asn1:"optional,tag:1"` 760 } 761 762 type generalSubtree struct { 763 Name string `asn1:"tag:2,optional,ia5"` 764 } 765 766 // RFC 5280, 4.2.2.1 767 type authorityInfoAccess struct { 768 Method asn1.ObjectIdentifier 769 Location asn1.RawValue 770 } 771 772 // RFC 5280, 4.2.1.14 773 type distributionPoint struct { 774 DistributionPoint distributionPointName `asn1:"optional,tag:0"` 775 Reason asn1.BitString `asn1:"optional,tag:1"` 776 CRLIssuer asn1.RawValue `asn1:"optional,tag:2"` 777 } 778 779 type distributionPointName struct { 780 FullName asn1.RawValue `asn1:"optional,tag:0"` 781 RelativeName pkix.RDNSequence `asn1:"optional,tag:1"` 782 } 783 784 func parsePublicKey(algo PublicKeyAlgorithm, keyData *publicKeyInfo) (interface{}, error) { 785 asn1Data := keyData.PublicKey.RightAlign() 786 switch algo { 787 case RSA: 788 p := new(rsaPublicKey) 789 rest, err := asn1.Unmarshal(asn1Data, p) 790 if err != nil { 791 return nil, err 792 } 793 if len(rest) != 0 { 794 return nil, errors.New("x509: trailing data after RSA public key") 795 } 796 797 if p.N.Sign() <= 0 { 798 return nil, errors.New("x509: RSA modulus is not a positive number") 799 } 800 if p.E <= 0 { 801 return nil, errors.New("x509: RSA public exponent is not a positive number") 802 } 803 804 pub := &rsa.PublicKey{ 805 E: p.E, 806 N: p.N, 807 } 808 return pub, nil 809 case DSA: 810 var p *big.Int 811 rest, err := asn1.Unmarshal(asn1Data, &p) 812 if err != nil { 813 return nil, err 814 } 815 if len(rest) != 0 { 816 return nil, errors.New("x509: trailing data after DSA public key") 817 } 818 paramsData := keyData.Algorithm.Parameters.FullBytes 819 params := new(dsaAlgorithmParameters) 820 rest, err = asn1.Unmarshal(paramsData, params) 821 if err != nil { 822 return nil, err 823 } 824 if len(rest) != 0 { 825 return nil, errors.New("x509: trailing data after DSA parameters") 826 } 827 if p.Sign() <= 0 || params.P.Sign() <= 0 || params.Q.Sign() <= 0 || params.G.Sign() <= 0 { 828 return nil, errors.New("x509: zero or negative DSA parameter") 829 } 830 pub := &dsa.PublicKey{ 831 Parameters: dsa.Parameters{ 832 P: params.P, 833 Q: params.Q, 834 G: params.G, 835 }, 836 Y: p, 837 } 838 return pub, nil 839 case ECDSA: 840 paramsData := keyData.Algorithm.Parameters.FullBytes 841 namedCurveOID := new(asn1.ObjectIdentifier) 842 rest, err := asn1.Unmarshal(paramsData, namedCurveOID) 843 if err != nil { 844 return nil, err 845 } 846 if len(rest) != 0 { 847 return nil, errors.New("x509: trailing data after ECDSA parameters") 848 } 849 namedCurve := namedCurveFromOID(*namedCurveOID) 850 if namedCurve == nil { 851 return nil, errors.New("x509: unsupported elliptic curve") 852 } 853 x, y := elliptic.Unmarshal(namedCurve, asn1Data) 854 if x == nil { 855 return nil, errors.New("x509: failed to unmarshal elliptic curve point") 856 } 857 pub := &ecdsa.PublicKey{ 858 Curve: namedCurve, 859 X: x, 860 Y: y, 861 } 862 return pub, nil 863 default: 864 return nil, nil 865 } 866 } 867 868 func parseSANExtension(value []byte) (dnsNames, emailAddresses []string, ipAddresses []net.IP, err error) { 869 // RFC 5280, 4.2.1.6 870 871 // SubjectAltName ::= GeneralNames 872 // 873 // GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName 874 // 875 // GeneralName ::= CHOICE { 876 // otherName [0] OtherName, 877 // rfc822Name [1] IA5String, 878 // dNSName [2] IA5String, 879 // x400Address [3] ORAddress, 880 // directoryName [4] Name, 881 // ediPartyName [5] EDIPartyName, 882 // uniformResourceIdentifier [6] IA5String, 883 // iPAddress [7] OCTET STRING, 884 // registeredID [8] OBJECT IDENTIFIER } 885 var seq asn1.RawValue 886 var rest []byte 887 if rest, err = asn1.Unmarshal(value, &seq); err != nil { 888 return 889 } else if len(rest) != 0 { 890 err = errors.New("x509: trailing data after X.509 extension") 891 return 892 } 893 if !seq.IsCompound || seq.Tag != 16 || seq.Class != 0 { 894 err = asn1.StructuralError{Msg: "bad SAN sequence"} 895 return 896 } 897 898 rest = seq.Bytes 899 for len(rest) > 0 { 900 var v asn1.RawValue 901 rest, err = asn1.Unmarshal(rest, &v) 902 if err != nil { 903 return 904 } 905 switch v.Tag { 906 case 1: 907 emailAddresses = append(emailAddresses, string(v.Bytes)) 908 case 2: 909 dnsNames = append(dnsNames, string(v.Bytes)) 910 case 7: 911 switch len(v.Bytes) { 912 case net.IPv4len, net.IPv6len: 913 ipAddresses = append(ipAddresses, v.Bytes) 914 default: 915 err = errors.New("x509: certificate contained IP address of length " + strconv.Itoa(len(v.Bytes))) 916 return 917 } 918 } 919 } 920 921 return 922 } 923 924 func parseCertificate(in *certificate) (*Certificate, error) { 925 out := new(Certificate) 926 out.Raw = in.Raw 927 out.RawTBSCertificate = in.TBSCertificate.Raw 928 out.RawSubjectPublicKeyInfo = in.TBSCertificate.PublicKey.Raw 929 out.RawSubject = in.TBSCertificate.Subject.FullBytes 930 out.RawIssuer = in.TBSCertificate.Issuer.FullBytes 931 932 out.Signature = in.SignatureValue.RightAlign() 933 out.SignatureAlgorithm = 934 getSignatureAlgorithmFromOID(in.TBSCertificate.SignatureAlgorithm.Algorithm) 935 936 out.PublicKeyAlgorithm = 937 getPublicKeyAlgorithmFromOID(in.TBSCertificate.PublicKey.Algorithm.Algorithm) 938 var err error 939 out.PublicKey, err = parsePublicKey(out.PublicKeyAlgorithm, &in.TBSCertificate.PublicKey) 940 if err != nil { 941 return nil, err 942 } 943 944 out.Version = in.TBSCertificate.Version + 1 945 out.SerialNumber = in.TBSCertificate.SerialNumber 946 947 var issuer, subject pkix.RDNSequence 948 if rest, err := asn1.Unmarshal(in.TBSCertificate.Subject.FullBytes, &subject); err != nil { 949 return nil, err 950 } else if len(rest) != 0 { 951 return nil, errors.New("x509: trailing data after X.509 subject") 952 } 953 if rest, err := asn1.Unmarshal(in.TBSCertificate.Issuer.FullBytes, &issuer); err != nil { 954 return nil, err 955 } else if len(rest) != 0 { 956 return nil, errors.New("x509: trailing data after X.509 subject") 957 } 958 959 out.Issuer.FillFromRDNSequence(&issuer) 960 out.Subject.FillFromRDNSequence(&subject) 961 962 out.NotBefore = in.TBSCertificate.Validity.NotBefore 963 out.NotAfter = in.TBSCertificate.Validity.NotAfter 964 965 for _, e := range in.TBSCertificate.Extensions { 966 out.Extensions = append(out.Extensions, e) 967 unhandled := false 968 969 if len(e.Id) == 4 && e.Id[0] == 2 && e.Id[1] == 5 && e.Id[2] == 29 { 970 switch e.Id[3] { 971 case 15: 972 // RFC 5280, 4.2.1.3 973 var usageBits asn1.BitString 974 if rest, err := asn1.Unmarshal(e.Value, &usageBits); err != nil { 975 return nil, err 976 } else if len(rest) != 0 { 977 return nil, errors.New("x509: trailing data after X.509 KeyUsage") 978 } 979 980 var usage int 981 for i := 0; i < 9; i++ { 982 if usageBits.At(i) != 0 { 983 usage |= 1 << uint(i) 984 } 985 } 986 out.KeyUsage = KeyUsage(usage) 987 988 case 19: 989 // RFC 5280, 4.2.1.9 990 var constraints basicConstraints 991 if rest, err := asn1.Unmarshal(e.Value, &constraints); err != nil { 992 return nil, err 993 } else if len(rest) != 0 { 994 return nil, errors.New("x509: trailing data after X.509 BasicConstraints") 995 } 996 997 out.BasicConstraintsValid = true 998 out.IsCA = constraints.IsCA 999 out.MaxPathLen = constraints.MaxPathLen 1000 out.MaxPathLenZero = out.MaxPathLen == 0 1001 1002 case 17: 1003 out.DNSNames, out.EmailAddresses, out.IPAddresses, err = parseSANExtension(e.Value) 1004 if err != nil { 1005 return nil, err 1006 } 1007 1008 if len(out.DNSNames) == 0 && len(out.EmailAddresses) == 0 && len(out.IPAddresses) == 0 { 1009 // If we didn't parse anything then we do the critical check, below. 1010 unhandled = true 1011 } 1012 1013 case 30: 1014 // RFC 5280, 4.2.1.10 1015 1016 // NameConstraints ::= SEQUENCE { 1017 // permittedSubtrees [0] GeneralSubtrees OPTIONAL, 1018 // excludedSubtrees [1] GeneralSubtrees OPTIONAL } 1019 // 1020 // GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree 1021 // 1022 // GeneralSubtree ::= SEQUENCE { 1023 // base GeneralName, 1024 // minimum [0] BaseDistance DEFAULT 0, 1025 // maximum [1] BaseDistance OPTIONAL } 1026 // 1027 // BaseDistance ::= INTEGER (0..MAX) 1028 1029 var constraints nameConstraints 1030 if rest, err := asn1.Unmarshal(e.Value, &constraints); err != nil { 1031 return nil, err 1032 } else if len(rest) != 0 { 1033 return nil, errors.New("x509: trailing data after X.509 NameConstraints") 1034 } 1035 1036 if len(constraints.Excluded) > 0 && e.Critical { 1037 return out, UnhandledCriticalExtension{} 1038 } 1039 1040 for _, subtree := range constraints.Permitted { 1041 if len(subtree.Name) == 0 { 1042 if e.Critical { 1043 return out, UnhandledCriticalExtension{} 1044 } 1045 continue 1046 } 1047 out.PermittedDNSDomains = append(out.PermittedDNSDomains, subtree.Name) 1048 } 1049 1050 case 31: 1051 // RFC 5280, 4.2.1.13 1052 1053 // CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint 1054 // 1055 // DistributionPoint ::= SEQUENCE { 1056 // distributionPoint [0] DistributionPointName OPTIONAL, 1057 // reasons [1] ReasonFlags OPTIONAL, 1058 // cRLIssuer [2] GeneralNames OPTIONAL } 1059 // 1060 // DistributionPointName ::= CHOICE { 1061 // fullName [0] GeneralNames, 1062 // nameRelativeToCRLIssuer [1] RelativeDistinguishedName } 1063 1064 var cdp []distributionPoint 1065 if rest, err := asn1.Unmarshal(e.Value, &cdp); err != nil { 1066 return nil, err 1067 } else if len(rest) != 0 { 1068 return nil, errors.New("x509: trailing data after X.509 CRL distribution point") 1069 } 1070 1071 for _, dp := range cdp { 1072 // Per RFC 5280, 4.2.1.13, one of distributionPoint or cRLIssuer may be empty. 1073 if len(dp.DistributionPoint.FullName.Bytes) == 0 { 1074 continue 1075 } 1076 1077 var n asn1.RawValue 1078 if _, err := asn1.Unmarshal(dp.DistributionPoint.FullName.Bytes, &n); err != nil { 1079 return nil, err 1080 } 1081 // Trailing data after the fullName is 1082 // allowed because other elements of 1083 // the SEQUENCE can appear. 1084 1085 if n.Tag == 6 { 1086 out.CRLDistributionPoints = append(out.CRLDistributionPoints, string(n.Bytes)) 1087 } 1088 } 1089 1090 case 35: 1091 // RFC 5280, 4.2.1.1 1092 var a authKeyId 1093 if rest, err := asn1.Unmarshal(e.Value, &a); err != nil { 1094 return nil, err 1095 } else if len(rest) != 0 { 1096 return nil, errors.New("x509: trailing data after X.509 authority key-id") 1097 } 1098 out.AuthorityKeyId = a.Id 1099 1100 case 37: 1101 // RFC 5280, 4.2.1.12. Extended Key Usage 1102 1103 // id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } 1104 // 1105 // ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId 1106 // 1107 // KeyPurposeId ::= OBJECT IDENTIFIER 1108 1109 var keyUsage []asn1.ObjectIdentifier 1110 if rest, err := asn1.Unmarshal(e.Value, &keyUsage); err != nil { 1111 return nil, err 1112 } else if len(rest) != 0 { 1113 return nil, errors.New("x509: trailing data after X.509 ExtendedKeyUsage") 1114 } 1115 1116 for _, u := range keyUsage { 1117 if extKeyUsage, ok := extKeyUsageFromOID(u); ok { 1118 out.ExtKeyUsage = append(out.ExtKeyUsage, extKeyUsage) 1119 } else { 1120 out.UnknownExtKeyUsage = append(out.UnknownExtKeyUsage, u) 1121 } 1122 } 1123 1124 case 14: 1125 // RFC 5280, 4.2.1.2 1126 var keyid []byte 1127 if rest, err := asn1.Unmarshal(e.Value, &keyid); err != nil { 1128 return nil, err 1129 } else if len(rest) != 0 { 1130 return nil, errors.New("x509: trailing data after X.509 authority key-id") 1131 } 1132 out.SubjectKeyId = keyid 1133 1134 case 32: 1135 // RFC 5280 4.2.1.4: Certificate Policies 1136 var policies []policyInformation 1137 if rest, err := asn1.Unmarshal(e.Value, &policies); err != nil { 1138 return nil, err 1139 } else if len(rest) != 0 { 1140 return nil, errors.New("x509: trailing data after X.509 certificate policies") 1141 } 1142 out.PolicyIdentifiers = make([]asn1.ObjectIdentifier, len(policies)) 1143 for i, policy := range policies { 1144 out.PolicyIdentifiers[i] = policy.Policy 1145 } 1146 1147 default: 1148 // Unknown extensions are recorded if critical. 1149 unhandled = true 1150 } 1151 } else if e.Id.Equal(oidExtensionAuthorityInfoAccess) { 1152 // RFC 5280 4.2.2.1: Authority Information Access 1153 var aia []authorityInfoAccess 1154 if rest, err := asn1.Unmarshal(e.Value, &aia); err != nil { 1155 return nil, err 1156 } else if len(rest) != 0 { 1157 return nil, errors.New("x509: trailing data after X.509 authority information") 1158 } 1159 1160 for _, v := range aia { 1161 // GeneralName: uniformResourceIdentifier [6] IA5String 1162 if v.Location.Tag != 6 { 1163 continue 1164 } 1165 if v.Method.Equal(oidAuthorityInfoAccessOcsp) { 1166 out.OCSPServer = append(out.OCSPServer, string(v.Location.Bytes)) 1167 } else if v.Method.Equal(oidAuthorityInfoAccessIssuers) { 1168 out.IssuingCertificateURL = append(out.IssuingCertificateURL, string(v.Location.Bytes)) 1169 } 1170 } 1171 } else { 1172 // Unknown extensions are recorded if critical. 1173 unhandled = true 1174 } 1175 1176 if e.Critical && unhandled { 1177 out.UnhandledCriticalExtensions = append(out.UnhandledCriticalExtensions, e.Id) 1178 } 1179 } 1180 1181 return out, nil 1182 } 1183 1184 // ParseCertificate parses a single certificate from the given ASN.1 DER data. 1185 func ParseCertificate(asn1Data []byte) (*Certificate, error) { 1186 var cert certificate 1187 rest, err := asn1.Unmarshal(asn1Data, &cert) 1188 if err != nil { 1189 return nil, err 1190 } 1191 if len(rest) > 0 { 1192 return nil, asn1.SyntaxError{Msg: "trailing data"} 1193 } 1194 1195 return parseCertificate(&cert) 1196 } 1197 1198 // ParseCertificates parses one or more certificates from the given ASN.1 DER 1199 // data. The certificates must be concatenated with no intermediate padding. 1200 func ParseCertificates(asn1Data []byte) ([]*Certificate, error) { 1201 var v []*certificate 1202 1203 for len(asn1Data) > 0 { 1204 cert := new(certificate) 1205 var err error 1206 asn1Data, err = asn1.Unmarshal(asn1Data, cert) 1207 if err != nil { 1208 return nil, err 1209 } 1210 v = append(v, cert) 1211 } 1212 1213 ret := make([]*Certificate, len(v)) 1214 for i, ci := range v { 1215 cert, err := parseCertificate(ci) 1216 if err != nil { 1217 return nil, err 1218 } 1219 ret[i] = cert 1220 } 1221 1222 return ret, nil 1223 } 1224 1225 func reverseBitsInAByte(in byte) byte { 1226 b1 := in>>4 | in<<4 1227 b2 := b1>>2&0x33 | b1<<2&0xcc 1228 b3 := b2>>1&0x55 | b2<<1&0xaa 1229 return b3 1230 } 1231 1232 // asn1BitLength returns the bit-length of bitString by considering the 1233 // most-significant bit in a byte to be the "first" bit. This convention 1234 // matches ASN.1, but differs from almost everything else. 1235 func asn1BitLength(bitString []byte) int { 1236 bitLen := len(bitString) * 8 1237 1238 for i := range bitString { 1239 b := bitString[len(bitString)-i-1] 1240 1241 for bit := uint(0); bit < 8; bit++ { 1242 if (b>>bit)&1 == 1 { 1243 return bitLen 1244 } 1245 bitLen-- 1246 } 1247 } 1248 1249 return 0 1250 } 1251 1252 var ( 1253 oidExtensionSubjectKeyId = []int{2, 5, 29, 14} 1254 oidExtensionKeyUsage = []int{2, 5, 29, 15} 1255 oidExtensionExtendedKeyUsage = []int{2, 5, 29, 37} 1256 oidExtensionAuthorityKeyId = []int{2, 5, 29, 35} 1257 oidExtensionBasicConstraints = []int{2, 5, 29, 19} 1258 oidExtensionSubjectAltName = []int{2, 5, 29, 17} 1259 oidExtensionCertificatePolicies = []int{2, 5, 29, 32} 1260 oidExtensionNameConstraints = []int{2, 5, 29, 30} 1261 oidExtensionCRLDistributionPoints = []int{2, 5, 29, 31} 1262 oidExtensionAuthorityInfoAccess = []int{1, 3, 6, 1, 5, 5, 7, 1, 1} 1263 ) 1264 1265 var ( 1266 oidAuthorityInfoAccessOcsp = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 1} 1267 oidAuthorityInfoAccessIssuers = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 2} 1268 ) 1269 1270 // oidNotInExtensions returns whether an extension with the given oid exists in 1271 // extensions. 1272 func oidInExtensions(oid asn1.ObjectIdentifier, extensions []pkix.Extension) bool { 1273 for _, e := range extensions { 1274 if e.Id.Equal(oid) { 1275 return true 1276 } 1277 } 1278 return false 1279 } 1280 1281 // marshalSANs marshals a list of addresses into a the contents of an X.509 1282 // SubjectAlternativeName extension. 1283 func marshalSANs(dnsNames, emailAddresses []string, ipAddresses []net.IP) (derBytes []byte, err error) { 1284 var rawValues []asn1.RawValue 1285 for _, name := range dnsNames { 1286 rawValues = append(rawValues, asn1.RawValue{Tag: 2, Class: 2, Bytes: []byte(name)}) 1287 } 1288 for _, email := range emailAddresses { 1289 rawValues = append(rawValues, asn1.RawValue{Tag: 1, Class: 2, Bytes: []byte(email)}) 1290 } 1291 for _, rawIP := range ipAddresses { 1292 // If possible, we always want to encode IPv4 addresses in 4 bytes. 1293 ip := rawIP.To4() 1294 if ip == nil { 1295 ip = rawIP 1296 } 1297 rawValues = append(rawValues, asn1.RawValue{Tag: 7, Class: 2, Bytes: ip}) 1298 } 1299 return asn1.Marshal(rawValues) 1300 } 1301 1302 func buildExtensions(template *Certificate) (ret []pkix.Extension, err error) { 1303 ret = make([]pkix.Extension, 10 /* maximum number of elements. */) 1304 n := 0 1305 1306 if template.KeyUsage != 0 && 1307 !oidInExtensions(oidExtensionKeyUsage, template.ExtraExtensions) { 1308 ret[n].Id = oidExtensionKeyUsage 1309 ret[n].Critical = true 1310 1311 var a [2]byte 1312 a[0] = reverseBitsInAByte(byte(template.KeyUsage)) 1313 a[1] = reverseBitsInAByte(byte(template.KeyUsage >> 8)) 1314 1315 l := 1 1316 if a[1] != 0 { 1317 l = 2 1318 } 1319 1320 bitString := a[:l] 1321 ret[n].Value, err = asn1.Marshal(asn1.BitString{Bytes: bitString, BitLength: asn1BitLength(bitString)}) 1322 if err != nil { 1323 return 1324 } 1325 n++ 1326 } 1327 1328 if (len(template.ExtKeyUsage) > 0 || len(template.UnknownExtKeyUsage) > 0) && 1329 !oidInExtensions(oidExtensionExtendedKeyUsage, template.ExtraExtensions) { 1330 ret[n].Id = oidExtensionExtendedKeyUsage 1331 1332 var oids []asn1.ObjectIdentifier 1333 for _, u := range template.ExtKeyUsage { 1334 if oid, ok := oidFromExtKeyUsage(u); ok { 1335 oids = append(oids, oid) 1336 } else { 1337 panic("internal error") 1338 } 1339 } 1340 1341 oids = append(oids, template.UnknownExtKeyUsage...) 1342 1343 ret[n].Value, err = asn1.Marshal(oids) 1344 if err != nil { 1345 return 1346 } 1347 n++ 1348 } 1349 1350 if template.BasicConstraintsValid && !oidInExtensions(oidExtensionBasicConstraints, template.ExtraExtensions) { 1351 // Leaving MaxPathLen as zero indicates that no maximum path 1352 // length is desired, unless MaxPathLenZero is set. A value of 1353 // -1 causes encoding/asn1 to omit the value as desired. 1354 maxPathLen := template.MaxPathLen 1355 if maxPathLen == 0 && !template.MaxPathLenZero { 1356 maxPathLen = -1 1357 } 1358 ret[n].Id = oidExtensionBasicConstraints 1359 ret[n].Value, err = asn1.Marshal(basicConstraints{template.IsCA, maxPathLen}) 1360 ret[n].Critical = true 1361 if err != nil { 1362 return 1363 } 1364 n++ 1365 } 1366 1367 if len(template.SubjectKeyId) > 0 && !oidInExtensions(oidExtensionSubjectKeyId, template.ExtraExtensions) { 1368 ret[n].Id = oidExtensionSubjectKeyId 1369 ret[n].Value, err = asn1.Marshal(template.SubjectKeyId) 1370 if err != nil { 1371 return 1372 } 1373 n++ 1374 } 1375 1376 if len(template.AuthorityKeyId) > 0 && !oidInExtensions(oidExtensionAuthorityKeyId, template.ExtraExtensions) { 1377 ret[n].Id = oidExtensionAuthorityKeyId 1378 ret[n].Value, err = asn1.Marshal(authKeyId{template.AuthorityKeyId}) 1379 if err != nil { 1380 return 1381 } 1382 n++ 1383 } 1384 1385 if (len(template.OCSPServer) > 0 || len(template.IssuingCertificateURL) > 0) && 1386 !oidInExtensions(oidExtensionAuthorityInfoAccess, template.ExtraExtensions) { 1387 ret[n].Id = oidExtensionAuthorityInfoAccess 1388 var aiaValues []authorityInfoAccess 1389 for _, name := range template.OCSPServer { 1390 aiaValues = append(aiaValues, authorityInfoAccess{ 1391 Method: oidAuthorityInfoAccessOcsp, 1392 Location: asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)}, 1393 }) 1394 } 1395 for _, name := range template.IssuingCertificateURL { 1396 aiaValues = append(aiaValues, authorityInfoAccess{ 1397 Method: oidAuthorityInfoAccessIssuers, 1398 Location: asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)}, 1399 }) 1400 } 1401 ret[n].Value, err = asn1.Marshal(aiaValues) 1402 if err != nil { 1403 return 1404 } 1405 n++ 1406 } 1407 1408 if (len(template.DNSNames) > 0 || len(template.EmailAddresses) > 0 || len(template.IPAddresses) > 0) && 1409 !oidInExtensions(oidExtensionSubjectAltName, template.ExtraExtensions) { 1410 ret[n].Id = oidExtensionSubjectAltName 1411 ret[n].Value, err = marshalSANs(template.DNSNames, template.EmailAddresses, template.IPAddresses) 1412 if err != nil { 1413 return 1414 } 1415 n++ 1416 } 1417 1418 if len(template.PolicyIdentifiers) > 0 && 1419 !oidInExtensions(oidExtensionCertificatePolicies, template.ExtraExtensions) { 1420 ret[n].Id = oidExtensionCertificatePolicies 1421 policies := make([]policyInformation, len(template.PolicyIdentifiers)) 1422 for i, policy := range template.PolicyIdentifiers { 1423 policies[i].Policy = policy 1424 } 1425 ret[n].Value, err = asn1.Marshal(policies) 1426 if err != nil { 1427 return 1428 } 1429 n++ 1430 } 1431 1432 if len(template.PermittedDNSDomains) > 0 && 1433 !oidInExtensions(oidExtensionNameConstraints, template.ExtraExtensions) { 1434 ret[n].Id = oidExtensionNameConstraints 1435 ret[n].Critical = template.PermittedDNSDomainsCritical 1436 1437 var out nameConstraints 1438 out.Permitted = make([]generalSubtree, len(template.PermittedDNSDomains)) 1439 for i, permitted := range template.PermittedDNSDomains { 1440 out.Permitted[i] = generalSubtree{Name: permitted} 1441 } 1442 ret[n].Value, err = asn1.Marshal(out) 1443 if err != nil { 1444 return 1445 } 1446 n++ 1447 } 1448 1449 if len(template.CRLDistributionPoints) > 0 && 1450 !oidInExtensions(oidExtensionCRLDistributionPoints, template.ExtraExtensions) { 1451 ret[n].Id = oidExtensionCRLDistributionPoints 1452 1453 var crlDp []distributionPoint 1454 for _, name := range template.CRLDistributionPoints { 1455 rawFullName, _ := asn1.Marshal(asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)}) 1456 1457 dp := distributionPoint{ 1458 DistributionPoint: distributionPointName{ 1459 FullName: asn1.RawValue{Tag: 0, Class: 2, IsCompound: true, Bytes: rawFullName}, 1460 }, 1461 } 1462 crlDp = append(crlDp, dp) 1463 } 1464 1465 ret[n].Value, err = asn1.Marshal(crlDp) 1466 if err != nil { 1467 return 1468 } 1469 n++ 1470 } 1471 1472 // Adding another extension here? Remember to update the maximum number 1473 // of elements in the make() at the top of the function. 1474 1475 return append(ret[:n], template.ExtraExtensions...), nil 1476 } 1477 1478 func subjectBytes(cert *Certificate) ([]byte, error) { 1479 if len(cert.RawSubject) > 0 { 1480 return cert.RawSubject, nil 1481 } 1482 1483 return asn1.Marshal(cert.Subject.ToRDNSequence()) 1484 } 1485 1486 // signingParamsForPublicKey returns the parameters to use for signing with 1487 // priv. If requestedSigAlgo is not zero then it overrides the default 1488 // signature algorithm. 1489 func signingParamsForPublicKey(pub interface{}, requestedSigAlgo SignatureAlgorithm) (hashFunc crypto.Hash, sigAlgo pkix.AlgorithmIdentifier, err error) { 1490 var pubType PublicKeyAlgorithm 1491 1492 switch pub := pub.(type) { 1493 case *rsa.PublicKey: 1494 pubType = RSA 1495 hashFunc = crypto.SHA256 1496 sigAlgo.Algorithm = oidSignatureSHA256WithRSA 1497 sigAlgo.Parameters = asn1.RawValue{ 1498 Tag: 5, 1499 } 1500 1501 case *ecdsa.PublicKey: 1502 pubType = ECDSA 1503 1504 switch pub.Curve { 1505 case elliptic.P224(), elliptic.P256(): 1506 hashFunc = crypto.SHA256 1507 sigAlgo.Algorithm = oidSignatureECDSAWithSHA256 1508 case elliptic.P384(): 1509 hashFunc = crypto.SHA384 1510 sigAlgo.Algorithm = oidSignatureECDSAWithSHA384 1511 case elliptic.P521(): 1512 hashFunc = crypto.SHA512 1513 sigAlgo.Algorithm = oidSignatureECDSAWithSHA512 1514 default: 1515 err = errors.New("x509: unknown elliptic curve") 1516 } 1517 1518 default: 1519 err = errors.New("x509: only RSA and ECDSA keys supported") 1520 } 1521 1522 if err != nil { 1523 return 1524 } 1525 1526 if requestedSigAlgo == 0 { 1527 return 1528 } 1529 1530 found := false 1531 for _, details := range signatureAlgorithmDetails { 1532 if details.algo == requestedSigAlgo { 1533 if details.pubKeyAlgo != pubType { 1534 err = errors.New("x509: requested SignatureAlgorithm does not match private key type") 1535 return 1536 } 1537 sigAlgo.Algorithm, hashFunc = details.oid, details.hash 1538 if hashFunc == 0 { 1539 err = errors.New("x509: cannot sign with hash function requested") 1540 return 1541 } 1542 found = true 1543 break 1544 } 1545 } 1546 1547 if !found { 1548 err = errors.New("x509: unknown SignatureAlgorithm") 1549 } 1550 1551 return 1552 } 1553 1554 // CreateCertificate creates a new certificate based on a template. The 1555 // following members of template are used: SerialNumber, Subject, NotBefore, 1556 // NotAfter, KeyUsage, ExtKeyUsage, UnknownExtKeyUsage, BasicConstraintsValid, 1557 // IsCA, MaxPathLen, SubjectKeyId, DNSNames, PermittedDNSDomainsCritical, 1558 // PermittedDNSDomains, SignatureAlgorithm. 1559 // 1560 // The certificate is signed by parent. If parent is equal to template then the 1561 // certificate is self-signed. The parameter pub is the public key of the 1562 // signee and priv is the private key of the signer. 1563 // 1564 // The returned slice is the certificate in DER encoding. 1565 // 1566 // All keys types that are implemented via crypto.Signer are supported (This 1567 // includes *rsa.PublicKey and *ecdsa.PublicKey.) 1568 func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv interface{}) (cert []byte, err error) { 1569 key, ok := priv.(crypto.Signer) 1570 if !ok { 1571 return nil, errors.New("x509: certificate private key does not implement crypto.Signer") 1572 } 1573 1574 hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(key.Public(), template.SignatureAlgorithm) 1575 if err != nil { 1576 return nil, err 1577 } 1578 1579 publicKeyBytes, publicKeyAlgorithm, err := marshalPublicKey(pub) 1580 if err != nil { 1581 return nil, err 1582 } 1583 1584 if len(parent.SubjectKeyId) > 0 { 1585 template.AuthorityKeyId = parent.SubjectKeyId 1586 } 1587 1588 extensions, err := buildExtensions(template) 1589 if err != nil { 1590 return 1591 } 1592 1593 asn1Issuer, err := subjectBytes(parent) 1594 if err != nil { 1595 return 1596 } 1597 1598 asn1Subject, err := subjectBytes(template) 1599 if err != nil { 1600 return 1601 } 1602 1603 encodedPublicKey := asn1.BitString{BitLength: len(publicKeyBytes) * 8, Bytes: publicKeyBytes} 1604 c := tbsCertificate{ 1605 Version: 2, 1606 SerialNumber: template.SerialNumber, 1607 SignatureAlgorithm: signatureAlgorithm, 1608 Issuer: asn1.RawValue{FullBytes: asn1Issuer}, 1609 Validity: validity{template.NotBefore.UTC(), template.NotAfter.UTC()}, 1610 Subject: asn1.RawValue{FullBytes: asn1Subject}, 1611 PublicKey: publicKeyInfo{nil, publicKeyAlgorithm, encodedPublicKey}, 1612 Extensions: extensions, 1613 } 1614 1615 tbsCertContents, err := asn1.Marshal(c) 1616 if err != nil { 1617 return 1618 } 1619 1620 c.Raw = tbsCertContents 1621 1622 h := hashFunc.New() 1623 h.Write(tbsCertContents) 1624 digest := h.Sum(nil) 1625 1626 var signature []byte 1627 signature, err = key.Sign(rand, digest, hashFunc) 1628 if err != nil { 1629 return 1630 } 1631 1632 return asn1.Marshal(certificate{ 1633 nil, 1634 c, 1635 signatureAlgorithm, 1636 asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, 1637 }) 1638 } 1639 1640 // pemCRLPrefix is the magic string that indicates that we have a PEM encoded 1641 // CRL. 1642 var pemCRLPrefix = []byte("-----BEGIN X509 CRL") 1643 1644 // pemType is the type of a PEM encoded CRL. 1645 var pemType = "X509 CRL" 1646 1647 // ParseCRL parses a CRL from the given bytes. It's often the case that PEM 1648 // encoded CRLs will appear where they should be DER encoded, so this function 1649 // will transparently handle PEM encoding as long as there isn't any leading 1650 // garbage. 1651 func ParseCRL(crlBytes []byte) (certList *pkix.CertificateList, err error) { 1652 if bytes.HasPrefix(crlBytes, pemCRLPrefix) { 1653 block, _ := pem.Decode(crlBytes) 1654 if block != nil && block.Type == pemType { 1655 crlBytes = block.Bytes 1656 } 1657 } 1658 return ParseDERCRL(crlBytes) 1659 } 1660 1661 // ParseDERCRL parses a DER encoded CRL from the given bytes. 1662 func ParseDERCRL(derBytes []byte) (certList *pkix.CertificateList, err error) { 1663 certList = new(pkix.CertificateList) 1664 if rest, err := asn1.Unmarshal(derBytes, certList); err != nil { 1665 return nil, err 1666 } else if len(rest) != 0 { 1667 return nil, errors.New("x509: trailing data after CRL") 1668 } 1669 return certList, nil 1670 } 1671 1672 // CreateCRL returns a DER encoded CRL, signed by this Certificate, that 1673 // contains the given list of revoked certificates. 1674 func (c *Certificate) CreateCRL(rand io.Reader, priv interface{}, revokedCerts []pkix.RevokedCertificate, now, expiry time.Time) (crlBytes []byte, err error) { 1675 key, ok := priv.(crypto.Signer) 1676 if !ok { 1677 return nil, errors.New("x509: certificate private key does not implement crypto.Signer") 1678 } 1679 1680 hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(key.Public(), 0) 1681 if err != nil { 1682 return nil, err 1683 } 1684 1685 tbsCertList := pkix.TBSCertificateList{ 1686 Version: 1, 1687 Signature: signatureAlgorithm, 1688 Issuer: c.Subject.ToRDNSequence(), 1689 ThisUpdate: now.UTC(), 1690 NextUpdate: expiry.UTC(), 1691 RevokedCertificates: revokedCerts, 1692 } 1693 1694 // Authority Key Id 1695 if len(c.SubjectKeyId) > 0 { 1696 var aki pkix.Extension 1697 aki.Id = oidExtensionAuthorityKeyId 1698 aki.Value, err = asn1.Marshal(authKeyId{Id: c.SubjectKeyId}) 1699 if err != nil { 1700 return 1701 } 1702 tbsCertList.Extensions = append(tbsCertList.Extensions, aki) 1703 } 1704 1705 tbsCertListContents, err := asn1.Marshal(tbsCertList) 1706 if err != nil { 1707 return 1708 } 1709 1710 h := hashFunc.New() 1711 h.Write(tbsCertListContents) 1712 digest := h.Sum(nil) 1713 1714 var signature []byte 1715 signature, err = key.Sign(rand, digest, hashFunc) 1716 if err != nil { 1717 return 1718 } 1719 1720 return asn1.Marshal(pkix.CertificateList{ 1721 TBSCertList: tbsCertList, 1722 SignatureAlgorithm: signatureAlgorithm, 1723 SignatureValue: asn1.BitString{Bytes: signature, BitLength: len(signature) * 8}, 1724 }) 1725 } 1726 1727 // CertificateRequest represents a PKCS #10, certificate signature request. 1728 type CertificateRequest struct { 1729 Raw []byte // Complete ASN.1 DER content (CSR, signature algorithm and signature). 1730 RawTBSCertificateRequest []byte // Certificate request info part of raw ASN.1 DER content. 1731 RawSubjectPublicKeyInfo []byte // DER encoded SubjectPublicKeyInfo. 1732 RawSubject []byte // DER encoded Subject. 1733 1734 Version int 1735 Signature []byte 1736 SignatureAlgorithm SignatureAlgorithm 1737 1738 PublicKeyAlgorithm PublicKeyAlgorithm 1739 PublicKey interface{} 1740 1741 Subject pkix.Name 1742 1743 // Attributes is the dried husk of a bug and shouldn't be used. 1744 Attributes []pkix.AttributeTypeAndValueSET 1745 1746 // Extensions contains raw X.509 extensions. When parsing CSRs, this 1747 // can be used to extract extensions that are not parsed by this 1748 // package. 1749 Extensions []pkix.Extension 1750 1751 // ExtraExtensions contains extensions to be copied, raw, into any 1752 // marshaled CSR. Values override any extensions that would otherwise 1753 // be produced based on the other fields but are overridden by any 1754 // extensions specified in Attributes. 1755 // 1756 // The ExtraExtensions field is not populated when parsing CSRs, see 1757 // Extensions. 1758 ExtraExtensions []pkix.Extension 1759 1760 // Subject Alternate Name values. 1761 DNSNames []string 1762 EmailAddresses []string 1763 IPAddresses []net.IP 1764 } 1765 1766 // These structures reflect the ASN.1 structure of X.509 certificate 1767 // signature requests (see RFC 2986): 1768 1769 type tbsCertificateRequest struct { 1770 Raw asn1.RawContent 1771 Version int 1772 Subject asn1.RawValue 1773 PublicKey publicKeyInfo 1774 RawAttributes []asn1.RawValue `asn1:"tag:0"` 1775 } 1776 1777 type certificateRequest struct { 1778 Raw asn1.RawContent 1779 TBSCSR tbsCertificateRequest 1780 SignatureAlgorithm pkix.AlgorithmIdentifier 1781 SignatureValue asn1.BitString 1782 } 1783 1784 // oidExtensionRequest is a PKCS#9 OBJECT IDENTIFIER that indicates requested 1785 // extensions in a CSR. 1786 var oidExtensionRequest = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 14} 1787 1788 // newRawAttributes converts AttributeTypeAndValueSETs from a template 1789 // CertificateRequest's Attributes into tbsCertificateRequest RawAttributes. 1790 func newRawAttributes(attributes []pkix.AttributeTypeAndValueSET) ([]asn1.RawValue, error) { 1791 var rawAttributes []asn1.RawValue 1792 b, err := asn1.Marshal(attributes) 1793 rest, err := asn1.Unmarshal(b, &rawAttributes) 1794 if err != nil { 1795 return nil, err 1796 } 1797 if len(rest) != 0 { 1798 return nil, errors.New("x509: failed to unmarshall raw CSR Attributes") 1799 } 1800 return rawAttributes, nil 1801 } 1802 1803 // parseRawAttributes Unmarshals RawAttributes intos AttributeTypeAndValueSETs. 1804 func parseRawAttributes(rawAttributes []asn1.RawValue) []pkix.AttributeTypeAndValueSET { 1805 var attributes []pkix.AttributeTypeAndValueSET 1806 for _, rawAttr := range rawAttributes { 1807 var attr pkix.AttributeTypeAndValueSET 1808 rest, err := asn1.Unmarshal(rawAttr.FullBytes, &attr) 1809 // Ignore attributes that don't parse into pkix.AttributeTypeAndValueSET 1810 // (i.e.: challengePassword or unstructuredName). 1811 if err == nil && len(rest) == 0 { 1812 attributes = append(attributes, attr) 1813 } 1814 } 1815 return attributes 1816 } 1817 1818 // parseCSRExtensions parses the attributes from a CSR and extracts any 1819 // requested extensions. 1820 func parseCSRExtensions(rawAttributes []asn1.RawValue) ([]pkix.Extension, error) { 1821 // pkcs10Attribute reflects the Attribute structure from section 4.1 of 1822 // https://tools.ietf.org/html/rfc2986. 1823 type pkcs10Attribute struct { 1824 Id asn1.ObjectIdentifier 1825 Values []asn1.RawValue `asn1:"set"` 1826 } 1827 1828 var ret []pkix.Extension 1829 for _, rawAttr := range rawAttributes { 1830 var attr pkcs10Attribute 1831 if rest, err := asn1.Unmarshal(rawAttr.FullBytes, &attr); err != nil || len(rest) != 0 || len(attr.Values) == 0 { 1832 // Ignore attributes that don't parse. 1833 continue 1834 } 1835 1836 if !attr.Id.Equal(oidExtensionRequest) { 1837 continue 1838 } 1839 1840 var extensions []pkix.Extension 1841 if _, err := asn1.Unmarshal(attr.Values[0].FullBytes, &extensions); err != nil { 1842 return nil, err 1843 } 1844 ret = append(ret, extensions...) 1845 } 1846 1847 return ret, nil 1848 } 1849 1850 // CreateCertificateRequest creates a new certificate based on a template. The 1851 // following members of template are used: Subject, Attributes, 1852 // SignatureAlgorithm, Extensions, DNSNames, EmailAddresses, and IPAddresses. 1853 // The private key is the private key of the signer. 1854 // 1855 // The returned slice is the certificate request in DER encoding. 1856 // 1857 // All keys types that are implemented via crypto.Signer are supported (This 1858 // includes *rsa.PublicKey and *ecdsa.PublicKey.) 1859 func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv interface{}) (csr []byte, err error) { 1860 key, ok := priv.(crypto.Signer) 1861 if !ok { 1862 return nil, errors.New("x509: certificate private key does not implement crypto.Signer") 1863 } 1864 1865 var hashFunc crypto.Hash 1866 var sigAlgo pkix.AlgorithmIdentifier 1867 hashFunc, sigAlgo, err = signingParamsForPublicKey(key.Public(), template.SignatureAlgorithm) 1868 if err != nil { 1869 return nil, err 1870 } 1871 1872 var publicKeyBytes []byte 1873 var publicKeyAlgorithm pkix.AlgorithmIdentifier 1874 publicKeyBytes, publicKeyAlgorithm, err = marshalPublicKey(key.Public()) 1875 if err != nil { 1876 return nil, err 1877 } 1878 1879 var extensions []pkix.Extension 1880 1881 if (len(template.DNSNames) > 0 || len(template.EmailAddresses) > 0 || len(template.IPAddresses) > 0) && 1882 !oidInExtensions(oidExtensionSubjectAltName, template.ExtraExtensions) { 1883 sanBytes, err := marshalSANs(template.DNSNames, template.EmailAddresses, template.IPAddresses) 1884 if err != nil { 1885 return nil, err 1886 } 1887 1888 extensions = append(extensions, pkix.Extension{ 1889 Id: oidExtensionSubjectAltName, 1890 Value: sanBytes, 1891 }) 1892 } 1893 1894 extensions = append(extensions, template.ExtraExtensions...) 1895 1896 var attributes []pkix.AttributeTypeAndValueSET 1897 attributes = append(attributes, template.Attributes...) 1898 1899 if len(extensions) > 0 { 1900 // specifiedExtensions contains all the extensions that we 1901 // found specified via template.Attributes. 1902 specifiedExtensions := make(map[string]bool) 1903 1904 for _, atvSet := range template.Attributes { 1905 if !atvSet.Type.Equal(oidExtensionRequest) { 1906 continue 1907 } 1908 1909 for _, atvs := range atvSet.Value { 1910 for _, atv := range atvs { 1911 specifiedExtensions[atv.Type.String()] = true 1912 } 1913 } 1914 } 1915 1916 atvs := make([]pkix.AttributeTypeAndValue, 0, len(extensions)) 1917 for _, e := range extensions { 1918 if specifiedExtensions[e.Id.String()] { 1919 // Attributes already contained a value for 1920 // this extension and it takes priority. 1921 continue 1922 } 1923 1924 atvs = append(atvs, pkix.AttributeTypeAndValue{ 1925 // There is no place for the critical flag in a CSR. 1926 Type: e.Id, 1927 Value: e.Value, 1928 }) 1929 } 1930 1931 // Append the extensions to an existing attribute if possible. 1932 appended := false 1933 for _, atvSet := range attributes { 1934 if !atvSet.Type.Equal(oidExtensionRequest) || len(atvSet.Value) == 0 { 1935 continue 1936 } 1937 1938 atvSet.Value[0] = append(atvSet.Value[0], atvs...) 1939 appended = true 1940 break 1941 } 1942 1943 // Otherwise, add a new attribute for the extensions. 1944 if !appended { 1945 attributes = append(attributes, pkix.AttributeTypeAndValueSET{ 1946 Type: oidExtensionRequest, 1947 Value: [][]pkix.AttributeTypeAndValue{ 1948 atvs, 1949 }, 1950 }) 1951 } 1952 } 1953 1954 asn1Subject := template.RawSubject 1955 if len(asn1Subject) == 0 { 1956 asn1Subject, err = asn1.Marshal(template.Subject.ToRDNSequence()) 1957 if err != nil { 1958 return 1959 } 1960 } 1961 1962 rawAttributes, err := newRawAttributes(attributes) 1963 if err != nil { 1964 return 1965 } 1966 1967 tbsCSR := tbsCertificateRequest{ 1968 Version: 0, // PKCS #10, RFC 2986 1969 Subject: asn1.RawValue{FullBytes: asn1Subject}, 1970 PublicKey: publicKeyInfo{ 1971 Algorithm: publicKeyAlgorithm, 1972 PublicKey: asn1.BitString{ 1973 Bytes: publicKeyBytes, 1974 BitLength: len(publicKeyBytes) * 8, 1975 }, 1976 }, 1977 RawAttributes: rawAttributes, 1978 } 1979 1980 tbsCSRContents, err := asn1.Marshal(tbsCSR) 1981 if err != nil { 1982 return 1983 } 1984 tbsCSR.Raw = tbsCSRContents 1985 1986 h := hashFunc.New() 1987 h.Write(tbsCSRContents) 1988 digest := h.Sum(nil) 1989 1990 var signature []byte 1991 signature, err = key.Sign(rand, digest, hashFunc) 1992 if err != nil { 1993 return 1994 } 1995 1996 return asn1.Marshal(certificateRequest{ 1997 TBSCSR: tbsCSR, 1998 SignatureAlgorithm: sigAlgo, 1999 SignatureValue: asn1.BitString{ 2000 Bytes: signature, 2001 BitLength: len(signature) * 8, 2002 }, 2003 }) 2004 } 2005 2006 // ParseCertificateRequest parses a single certificate request from the 2007 // given ASN.1 DER data. 2008 func ParseCertificateRequest(asn1Data []byte) (*CertificateRequest, error) { 2009 var csr certificateRequest 2010 2011 rest, err := asn1.Unmarshal(asn1Data, &csr) 2012 if err != nil { 2013 return nil, err 2014 } else if len(rest) != 0 { 2015 return nil, asn1.SyntaxError{Msg: "trailing data"} 2016 } 2017 2018 return parseCertificateRequest(&csr) 2019 } 2020 2021 func parseCertificateRequest(in *certificateRequest) (*CertificateRequest, error) { 2022 out := &CertificateRequest{ 2023 Raw: in.Raw, 2024 RawTBSCertificateRequest: in.TBSCSR.Raw, 2025 RawSubjectPublicKeyInfo: in.TBSCSR.PublicKey.Raw, 2026 RawSubject: in.TBSCSR.Subject.FullBytes, 2027 2028 Signature: in.SignatureValue.RightAlign(), 2029 SignatureAlgorithm: getSignatureAlgorithmFromOID(in.SignatureAlgorithm.Algorithm), 2030 2031 PublicKeyAlgorithm: getPublicKeyAlgorithmFromOID(in.TBSCSR.PublicKey.Algorithm.Algorithm), 2032 2033 Version: in.TBSCSR.Version, 2034 Attributes: parseRawAttributes(in.TBSCSR.RawAttributes), 2035 } 2036 2037 var err error 2038 out.PublicKey, err = parsePublicKey(out.PublicKeyAlgorithm, &in.TBSCSR.PublicKey) 2039 if err != nil { 2040 return nil, err 2041 } 2042 2043 var subject pkix.RDNSequence 2044 if rest, err := asn1.Unmarshal(in.TBSCSR.Subject.FullBytes, &subject); err != nil { 2045 return nil, err 2046 } else if len(rest) != 0 { 2047 return nil, errors.New("x509: trailing data after X.509 Subject") 2048 } 2049 2050 out.Subject.FillFromRDNSequence(&subject) 2051 2052 if out.Extensions, err = parseCSRExtensions(in.TBSCSR.RawAttributes); err != nil { 2053 return nil, err 2054 } 2055 2056 for _, extension := range out.Extensions { 2057 if extension.Id.Equal(oidExtensionSubjectAltName) { 2058 out.DNSNames, out.EmailAddresses, out.IPAddresses, err = parseSANExtension(extension.Value) 2059 if err != nil { 2060 return nil, err 2061 } 2062 } 2063 } 2064 2065 return out, nil 2066 } 2067 2068 // CheckSignature verifies that the signature on c is a valid signature 2069 func (c *CertificateRequest) CheckSignature() (err error) { 2070 return checkSignature(c.SignatureAlgorithm, c.RawTBSCertificateRequest, c.Signature, c.PublicKey) 2071 }