derhelpers.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Package derhelpers implements common functionality
  2. // on DER encoded data
  3. package derhelpers
  4. import (
  5. "crypto"
  6. "crypto/ecdsa"
  7. "crypto/rsa"
  8. "crypto/x509"
  9. cferr "github.com/cloudflare/cfssl/errors"
  10. )
  11. // ParsePrivateKeyDER parses a PKCS #1, PKCS #8, or elliptic curve
  12. // DER-encoded private key. The key must not be in PEM format.
  13. func ParsePrivateKeyDER(keyDER []byte) (key crypto.Signer, err error) {
  14. generalKey, err := x509.ParsePKCS8PrivateKey(keyDER)
  15. if err != nil {
  16. generalKey, err = x509.ParsePKCS1PrivateKey(keyDER)
  17. if err != nil {
  18. generalKey, err = x509.ParseECPrivateKey(keyDER)
  19. if err != nil {
  20. // We don't include the actual error into
  21. // the final error. The reason might be
  22. // we don't want to leak any info about
  23. // the private key.
  24. return nil, cferr.New(cferr.PrivateKeyError,
  25. cferr.ParseFailed)
  26. }
  27. }
  28. }
  29. switch generalKey.(type) {
  30. case *rsa.PrivateKey:
  31. return generalKey.(*rsa.PrivateKey), nil
  32. case *ecdsa.PrivateKey:
  33. return generalKey.(*ecdsa.PrivateKey), nil
  34. }
  35. // should never reach here
  36. return nil, cferr.New(cferr.PrivateKeyError, cferr.ParseFailed)
  37. }