Add PKCS#8 support to ParsePrivateKeyPEM

parent 89d1b09f
...@@ -56,23 +56,39 @@ func EncodeCertPEM(cert *x509.Certificate) []byte { ...@@ -56,23 +56,39 @@ func EncodeCertPEM(cert *x509.Certificate) []byte {
} }
// ParsePrivateKeyPEM returns a private key parsed from a PEM block in the supplied data. // ParsePrivateKeyPEM returns a private key parsed from a PEM block in the supplied data.
// Recognizes PEM blocks for "EC PRIVATE KEY" and "RSA PRIVATE KEY" // Recognizes PEM blocks for "EC PRIVATE KEY", "RSA PRIVATE KEY", or "PRIVATE KEY"
func ParsePrivateKeyPEM(keyData []byte) (interface{}, error) { func ParsePrivateKeyPEM(keyData []byte) (interface{}, error) {
var privateKeyPemBlock *pem.Block
for { for {
var privateKeyPemBlock *pem.Block
privateKeyPemBlock, keyData = pem.Decode(keyData) privateKeyPemBlock, keyData = pem.Decode(keyData)
if privateKeyPemBlock == nil { if privateKeyPemBlock == nil {
// we read all the PEM blocks and didn't recognize one break
return nil, fmt.Errorf("no private key PEM block found")
} }
switch privateKeyPemBlock.Type { switch privateKeyPemBlock.Type {
case "EC PRIVATE KEY": case "EC PRIVATE KEY":
return x509.ParseECPrivateKey(privateKeyPemBlock.Bytes) // ECDSA Private Key in ASN.1 format
if key, err := x509.ParseECPrivateKey(privateKeyPemBlock.Bytes); err == nil {
return key, nil
}
case "RSA PRIVATE KEY": case "RSA PRIVATE KEY":
return x509.ParsePKCS1PrivateKey(privateKeyPemBlock.Bytes) // RSA Private Key in PKCS#1 format
if key, err := x509.ParsePKCS1PrivateKey(privateKeyPemBlock.Bytes); err == nil {
return key, nil
}
case "PRIVATE KEY":
// RSA or ECDSA Private Key in unencrypted PKCS#8 format
if key, err := x509.ParsePKCS8PrivateKey(privateKeyPemBlock.Bytes); err == nil {
return key, nil
}
} }
// tolerate non-key PEM blocks for compatibility with things like "EC PARAMETERS" blocks
// originally, only the first PEM block was parsed and expected to be a key block
} }
// we read all the PEM blocks and didn't recognize one
return nil, fmt.Errorf("data does not contain a valid RSA or ECDSA private key")
} }
// ParseCertsPEM returns the x509.Certificates contained in the given PEM-encoded byte array // ParseCertsPEM returns the x509.Certificates contained in the given PEM-encoded byte array
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment