utils.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package sm4
  2. import (
  3. "crypto/rand"
  4. "crypto/x509"
  5. "encoding/pem"
  6. "errors"
  7. "io/ioutil"
  8. )
  9. // ReadKeyFromPem will return SM4Key from PEM format data.
  10. func ReadKeyFromPem(data []byte, pwd []byte) (SM4Key, error) {
  11. block, _ := pem.Decode(data)
  12. if block == nil {
  13. return nil, errors.New("SM4: pem decode failed")
  14. }
  15. if x509.IsEncryptedPEMBlock(block) {
  16. if block.Type != "SM4 ENCRYPTED KEY" {
  17. return nil, errors.New("SM4: unknown type")
  18. }
  19. if pwd == nil {
  20. return nil, errors.New("SM4: need passwd")
  21. }
  22. data, err := x509.DecryptPEMBlock(block, pwd)
  23. if err != nil {
  24. return nil, err
  25. }
  26. return data, nil
  27. }
  28. if block.Type != "SM4 KEY" {
  29. return nil, errors.New("SM4: unknown type")
  30. }
  31. return block.Bytes, nil
  32. }
  33. // ReadKeyFromPemFile will return SM4Key from filename that saved PEM format data.
  34. func ReadKeyFromPemFile(FileName string, pwd []byte) (SM4Key, error) {
  35. data, err := ioutil.ReadFile(FileName)
  36. if err != nil {
  37. return nil, err
  38. }
  39. return ReadKeyFromPem(data, pwd)
  40. }
  41. // WriteKeyToPem will convert SM4Key to PEM format data and return it.
  42. func WriteKeyToPem(key SM4Key, pwd []byte) ([]byte, error) {
  43. if pwd != nil {
  44. block, err := x509.EncryptPEMBlock(rand.Reader,
  45. "SM4 ENCRYPTED KEY", key, pwd, x509.PEMCipherAES256) //Use AES256 algorithms to encrypt SM4KEY
  46. if err != nil {
  47. return nil, err
  48. }
  49. return pem.EncodeToMemory(block), nil
  50. } else {
  51. block := &pem.Block{
  52. Type: "SM4 KEY",
  53. Bytes: key,
  54. }
  55. return pem.EncodeToMemory(block), nil
  56. }
  57. }
  58. // WriteKeyToPemFile will convert SM4Key to PEM format data, then write it
  59. // into the input filename.
  60. func WriteKeyToPemFile(FileName string, key SM4Key, pwd []byte) error {
  61. var block *pem.Block
  62. var err error
  63. if pwd != nil {
  64. block, err = x509.EncryptPEMBlock(rand.Reader,
  65. "SM4 ENCRYPTED KEY", key, pwd, x509.PEMCipherAES256)
  66. if err != nil {
  67. return err
  68. }
  69. } else {
  70. block = &pem.Block{
  71. Type: "SM4 KEY",
  72. Bytes: key,
  73. }
  74. }
  75. pemBytes := pem.EncodeToMemory(block)
  76. err = ioutil.WriteFile(FileName, pemBytes, 0666)
  77. if err != nil {
  78. return err
  79. }
  80. return nil
  81. }