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