-
Notifications
You must be signed in to change notification settings - Fork 1
/
key.go
146 lines (132 loc) · 3.19 KB
/
key.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package rsa
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"github.com/dungeonsnd/gocom/file/fileutil"
)
func ReadRsaPubKey(priKeyFileName string, pubKeyFileName string) (error, string) {
publicKey, err := fileutil.ReadFromFile(pubKeyFileName)
if err != nil {
err1 := GenRsaKey(priKeyFileName, pubKeyFileName, 2048)
if err1 != nil {
return err1, ""
} else {
var err2 error
publicKey, err2 = fileutil.ReadFromFile(pubKeyFileName)
if err2 != nil {
return err2, ""
}
}
}
return nil, string(publicKey)
}
func ReadRsaKeys(priKeyFileName string, pubKeyFileName string) (error, []byte, []byte) {
priKeyBytes, err := fileutil.ReadFromFile(priKeyFileName)
if err != nil {
return err, nil, nil
}
publicKey, err := fileutil.ReadFromFile(pubKeyFileName)
if err != nil {
return err, nil, nil
}
return nil, priKeyBytes, publicKey
}
func GenRsaKey(priKeyFileName string, pubKeyFileName string, bits int) error {
// gen pri
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return err
}
derStream, err := x509.MarshalPKCS8PrivateKey(privateKey)
if err != nil {
return err
}
priBlock := &pem.Block{
Type: "PRIVATE KEY",
Bytes: derStream,
}
priKeyBytes := pem.EncodeToMemory(priBlock)
err = fileutil.WriteToFile(priKeyFileName, priKeyBytes, true)
if err != nil {
return err
}
// gen pub
publicKey := &privateKey.PublicKey
derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
return err
}
publicBlock := &pem.Block{
Type: "PUBLIC KEY",
Bytes: derPkix,
}
pubKeyBytes := pem.EncodeToMemory(publicBlock)
err = fileutil.WriteToFile(pubKeyFileName, pubKeyBytes, true)
if err != nil {
return err
}
return nil
}
func GenRsaKeyToString(bits int) (string, string, error) {
// gen pri
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return "", "", err
}
derStream, err := x509.MarshalPKCS8PrivateKey(privateKey)
if err != nil {
return "", "", err
}
priBlock := &pem.Block{
Type: "PRIVATE KEY",
Bytes: derStream,
}
priKeyBytes := pem.EncodeToMemory(priBlock)
// gen pub
publicKey := &privateKey.PublicKey
derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
return "", "", err
}
publicBlock := &pem.Block{
Type: "PUBLIC KEY",
Bytes: derPkix,
}
pubKeyBytes := pem.EncodeToMemory(publicBlock)
return string(priKeyBytes), string(pubKeyBytes), nil
}
func GenRsaKeyPKCS1(priKeyFileName string, pubKeyFileName string, bits int) error {
// gen pri
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return err
}
derStream := x509.MarshalPKCS1PrivateKey(privateKey)
priBlock := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: derStream,
}
priKeyBytes := pem.EncodeToMemory(priBlock)
err = fileutil.WriteToFile(priKeyFileName, priKeyBytes, true)
if err != nil {
return err
}
// gen pub
publicKey := &privateKey.PublicKey
derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
return err
}
publicBlock := &pem.Block{
Type: "PUBLIC KEY",
Bytes: derPkix,
}
pubKeyBytes := pem.EncodeToMemory(publicBlock)
err = fileutil.WriteToFile(pubKeyFileName, pubKeyBytes, true)
if err != nil {
return err
}
return nil
}