privkey.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package sign
  2. import (
  3. "crypto/rsa"
  4. "crypto/x509"
  5. "encoding/pem"
  6. "fmt"
  7. "io"
  8. "io/ioutil"
  9. "os"
  10. )
  11. // LoadPEMPrivKeyFile reads a PEM encoded RSA private key from the file name.
  12. // A new RSA private key will be returned if no error.
  13. func LoadPEMPrivKeyFile(name string) (*rsa.PrivateKey, error) {
  14. file, err := os.Open(name)
  15. if err != nil {
  16. return nil, err
  17. }
  18. defer file.Close()
  19. return LoadPEMPrivKey(file)
  20. }
  21. // LoadPEMPrivKey reads a PEM encoded RSA private key from the io.Reader.
  22. // A new RSA private key will be returned if no error.
  23. func LoadPEMPrivKey(reader io.Reader) (*rsa.PrivateKey, error) {
  24. block, err := loadPem(reader)
  25. if err != nil {
  26. return nil, err
  27. }
  28. return x509.ParsePKCS1PrivateKey(block.Bytes)
  29. }
  30. // LoadEncryptedPEMPrivKey decrypts the PEM encoded private key using the
  31. // password provided returning a RSA private key. If the PEM data is invalid,
  32. // or unable to decrypt an error will be returned.
  33. func LoadEncryptedPEMPrivKey(reader io.Reader, password []byte) (*rsa.PrivateKey, error) {
  34. block, err := loadPem(reader)
  35. if err != nil {
  36. return nil, err
  37. }
  38. decryptedBlock, err := x509.DecryptPEMBlock(block, password)
  39. if err != nil {
  40. return nil, err
  41. }
  42. return x509.ParsePKCS1PrivateKey(decryptedBlock)
  43. }
  44. func loadPem(reader io.Reader) (*pem.Block, error) {
  45. b, err := ioutil.ReadAll(reader)
  46. if err != nil {
  47. return nil, err
  48. }
  49. block, _ := pem.Decode(b)
  50. if block == nil {
  51. // pem.Decode will set block to nil if there is no PEM data in the input
  52. // the second parameter will contain the provided bytes that failed
  53. // to be decoded.
  54. return nil, fmt.Errorf("no valid PEM data provided")
  55. }
  56. return block, nil
  57. }