-
Notifications
You must be signed in to change notification settings - Fork 1
/
keystore.go
53 lines (43 loc) · 1.34 KB
/
keystore.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
package keystore
import (
"encoding/hex"
"fmt"
"os"
)
type createFn func() ([]byte, error)
// CreateIfNotExists generates a private key at the specified path,
// or reads the file on that path if it is present
func CreateIfNotExists(path string, create createFn) ([]byte, error) {
_, err := os.Stat(path)
if err != nil && !os.IsNotExist(err) {
return nil, fmt.Errorf("failed to stat (%s): %w", path, err)
}
var keyBuff []byte
if !os.IsNotExist(err) {
// Key exists
keyBuff, err = os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("unable to read private key from disk (%s), %w", path, err)
}
return keyBuff, nil
}
// Key doesn't exist yet, generate it
keyBuff, err = create()
if err != nil {
return nil, fmt.Errorf("unable to generate private key, %w", err)
}
// Encode it to a readable format (Base64) and write to disk
keyBuff = []byte(hex.EncodeToString(keyBuff))
if err = os.WriteFile(path, keyBuff, os.ModePerm); err != nil {
return nil, fmt.Errorf("unable to write private key to disk (%s), %w", path, err)
}
return keyBuff, nil
}
func CreatePrivateKey(create createFn) ([]byte, error) {
keyBuff, err := create()
if err != nil {
return nil, fmt.Errorf("unable to generate private key, %w", err)
}
// Encode it to a readable format (Base64) and return
return []byte(hex.EncodeToString(keyBuff)), nil
}