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