forked from tjfoc/gmsm
-
Notifications
You must be signed in to change notification settings - Fork 17
/
utils.go
62 lines (57 loc) · 1.21 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package sm4
import (
"crypto/rand"
"crypto/x509"
"encoding/pem"
"errors"
"io/ioutil"
)
func ReadKeyFromPem(FileName string, pwd []byte) (SM4Key, error) {
data, err := ioutil.ReadFile(FileName)
if err != nil {
return nil, err
}
block, _ := pem.Decode(data)
if block == nil {
return nil, errors.New("SM4: pem decode failed")
}
if x509.IsEncryptedPEMBlock(block) {
if block.Type != "SM4 ENCRYPTED KEY" {
return nil, errors.New("SM4: unknown type")
}
if pwd == nil {
return nil, errors.New("SM4: need passwd")
}
data, err := x509.DecryptPEMBlock(block, pwd)
if err != nil {
return nil, err
}
return data, nil
}
if block.Type != "SM4 KEY" {
return nil, errors.New("SM4: unknown type")
}
return block.Bytes, nil
}
func WriteKeyToPem(FileName string, key SM4Key, pwd []byte) error {
var block *pem.Block
var err error
if pwd != nil {
block, err = x509.EncryptPEMBlock(rand.Reader,
"SM4 ENCRYPTED KEY", key, pwd, x509.PEMCipherAES256)
if err != nil {
return err
}
} else {
block = &pem.Block{
Type: "SM4 KEY",
Bytes: key,
}
}
pemBytes := pem.EncodeToMemory(block)
err = ioutil.WriteFile(FileName, pemBytes, 0666)
if err != nil {
return err
}
return nil
}