/
genkeys.go
60 lines (55 loc) · 1.83 KB
/
genkeys.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
package main
import (
"encoding/base32"
"fmt"
"os"
"chainspace.io/chainspace-go/config"
"chainspace.io/chainspace-go/internal/crypto/signature"
"chainspace.io/chainspace-go/internal/crypto/transport"
"chainspace.io/chainspace-go/internal/log"
"chainspace.io/chainspace-go/internal/log/fld"
"gopkg.in/yaml.v2"
)
var b32 = base32.StdEncoding.WithPadding(base32.NoPadding)
func genKeys(path string, networkID string, nodeID uint64) (signature.KeyPair, *transport.Cert, error) {
signingKey, err := signature.GenKeyPair(signature.Ed25519)
if err != nil {
return nil, nil, fmt.Errorf("could not generate signing key: %s", err)
}
cert, err := transport.GenCert(transport.ECDSA, networkID, nodeID)
if err != nil {
return nil, nil, fmt.Errorf("could not generate transport cert: %s", err)
}
f, err := os.Create(path)
if err != nil {
return nil, nil, err
}
defer f.Close()
cfg := config.Keys{
SigningKey: &config.Key{
Private: b32.EncodeToString(signingKey.PrivateKey().Value()),
Public: b32.EncodeToString(signingKey.PublicKey().Value()),
Type: signingKey.Algorithm().String(),
},
TransportCert: &config.Key{
Private: cert.Private,
Public: cert.Public,
Type: cert.Type.String(),
},
}
enc := yaml.NewEncoder(f)
err = enc.Encode(cfg)
if err != nil {
return nil, nil, fmt.Errorf("could not write data to %s: %s", path, err)
}
return signingKey, cert, nil
}
func cmdGenKeys(args []string, usage string) {
opts := newOpts("genkey NETWORK_NAME NODE_ID [OPTIONS]", usage)
path := opts.Flags("--output").Label("PATH").String("Path to write the generated keys [keys.yaml]")
networkName, nodeID := getNetworkNameAndNodeID(opts, args)
if _, _, err := genKeys(*path, networkName, nodeID); err != nil {
log.Fatal("Could not generate keys", fld.Err(err))
}
log.Info("Generated keys successfully", fld.Path(*path))
}