...

Source file src/crypto/x509/pkcs1.go

     1	// Copyright 2011 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
     6	
     7	import (
     8		"crypto/rsa"
     9		"encoding/asn1"
    10		"errors"
    11		"math/big"
    12	)
    13	
    14	// pkcs1PrivateKey is a structure which mirrors the PKCS#1 ASN.1 for an RSA private key.
    15	type pkcs1PrivateKey struct {
    16		Version int
    17		N       *big.Int
    18		E       int
    19		D       *big.Int
    20		P       *big.Int
    21		Q       *big.Int
    22		// We ignore these values, if present, because rsa will calculate them.
    23		Dp   *big.Int `asn1:"optional"`
    24		Dq   *big.Int `asn1:"optional"`
    25		Qinv *big.Int `asn1:"optional"`
    26	
    27		AdditionalPrimes []pkcs1AdditionalRSAPrime `asn1:"optional,omitempty"`
    28	}
    29	
    30	type pkcs1AdditionalRSAPrime struct {
    31		Prime *big.Int
    32	
    33		// We ignore these values because rsa will calculate them.
    34		Exp   *big.Int
    35		Coeff *big.Int
    36	}
    37	
    38	// pkcs1PublicKey reflects the ASN.1 structure of a PKCS#1 public key.
    39	type pkcs1PublicKey struct {
    40		N *big.Int
    41		E int
    42	}
    43	
    44	// ParsePKCS1PrivateKey parses an RSA private key in PKCS#1, ASN.1 DER form.
    45	//
    46	// This kind of key is commonly encoded in PEM blocks of type "RSA PRIVATE KEY".
    47	func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error) {
    48		var priv pkcs1PrivateKey
    49		rest, err := asn1.Unmarshal(der, &priv)
    50		if len(rest) > 0 {
    51			return nil, asn1.SyntaxError{Msg: "trailing data"}
    52		}
    53		if err != nil {
    54			if _, err := asn1.Unmarshal(der, &ecPrivateKey{}); err == nil {
    55				return nil, errors.New("x509: failed to parse private key (use ParseECPrivateKey instead for this key format)")
    56			}
    57			if _, err := asn1.Unmarshal(der, &pkcs8{}); err == nil {
    58				return nil, errors.New("x509: failed to parse private key (use ParsePKCS8PrivateKey instead for this key format)")
    59			}
    60			return nil, err
    61		}
    62	
    63		if priv.Version > 1 {
    64			return nil, errors.New("x509: unsupported private key version")
    65		}
    66	
    67		if priv.N.Sign() <= 0 || priv.D.Sign() <= 0 || priv.P.Sign() <= 0 || priv.Q.Sign() <= 0 {
    68			return nil, errors.New("x509: private key contains zero or negative value")
    69		}
    70	
    71		key := new(rsa.PrivateKey)
    72		key.PublicKey = rsa.PublicKey{
    73			E: priv.E,
    74			N: priv.N,
    75		}
    76	
    77		key.D = priv.D
    78		key.Primes = make([]*big.Int, 2+len(priv.AdditionalPrimes))
    79		key.Primes[0] = priv.P
    80		key.Primes[1] = priv.Q
    81		for i, a := range priv.AdditionalPrimes {
    82			if a.Prime.Sign() <= 0 {
    83				return nil, errors.New("x509: private key contains zero or negative prime")
    84			}
    85			key.Primes[i+2] = a.Prime
    86			// We ignore the other two values because rsa will calculate
    87			// them as needed.
    88		}
    89	
    90		err = key.Validate()
    91		if err != nil {
    92			return nil, err
    93		}
    94		key.Precompute()
    95	
    96		return key, nil
    97	}
    98	
    99	// MarshalPKCS1PrivateKey converts an RSA private key to PKCS#1, ASN.1 DER form.
   100	//
   101	// This kind of key is commonly encoded in PEM blocks of type "RSA PRIVATE KEY".
   102	// For a more flexible key format which is not RSA specific, use
   103	// MarshalPKCS8PrivateKey.
   104	func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte {
   105		key.Precompute()
   106	
   107		version := 0
   108		if len(key.Primes) > 2 {
   109			version = 1
   110		}
   111	
   112		priv := pkcs1PrivateKey{
   113			Version: version,
   114			N:       key.N,
   115			E:       key.PublicKey.E,
   116			D:       key.D,
   117			P:       key.Primes[0],
   118			Q:       key.Primes[1],
   119			Dp:      key.Precomputed.Dp,
   120			Dq:      key.Precomputed.Dq,
   121			Qinv:    key.Precomputed.Qinv,
   122		}
   123	
   124		priv.AdditionalPrimes = make([]pkcs1AdditionalRSAPrime, len(key.Precomputed.CRTValues))
   125		for i, values := range key.Precomputed.CRTValues {
   126			priv.AdditionalPrimes[i].Prime = key.Primes[2+i]
   127			priv.AdditionalPrimes[i].Exp = values.Exp
   128			priv.AdditionalPrimes[i].Coeff = values.Coeff
   129		}
   130	
   131		b, _ := asn1.Marshal(priv)
   132		return b
   133	}
   134	
   135	// ParsePKCS1PublicKey parses an RSA public key in PKCS#1, ASN.1 DER form.
   136	//
   137	// This kind of key is commonly encoded in PEM blocks of type "RSA PUBLIC KEY".
   138	func ParsePKCS1PublicKey(der []byte) (*rsa.PublicKey, error) {
   139		var pub pkcs1PublicKey
   140		rest, err := asn1.Unmarshal(der, &pub)
   141		if err != nil {
   142			if _, err := asn1.Unmarshal(der, &publicKeyInfo{}); err == nil {
   143				return nil, errors.New("x509: failed to parse public key (use ParsePKIXPublicKey instead for this key format)")
   144			}
   145			return nil, err
   146		}
   147		if len(rest) > 0 {
   148			return nil, asn1.SyntaxError{Msg: "trailing data"}
   149		}
   150	
   151		if pub.N.Sign() <= 0 || pub.E <= 0 {
   152			return nil, errors.New("x509: public key contains zero or negative value")
   153		}
   154		if pub.E > 1<<31-1 {
   155			return nil, errors.New("x509: public key contains large public exponent")
   156		}
   157	
   158		return &rsa.PublicKey{
   159			E: pub.E,
   160			N: pub.N,
   161		}, nil
   162	}
   163	
   164	// MarshalPKCS1PublicKey converts an RSA public key to PKCS#1, ASN.1 DER form.
   165	//
   166	// This kind of key is commonly encoded in PEM blocks of type "RSA PUBLIC KEY".
   167	func MarshalPKCS1PublicKey(key *rsa.PublicKey) []byte {
   168		derBytes, _ := asn1.Marshal(pkcs1PublicKey{
   169			N: key.N,
   170			E: key.E,
   171		})
   172		return derBytes
   173	}
   174	

View as plain text