-
Notifications
You must be signed in to change notification settings - Fork 20
/
genkey.go
95 lines (80 loc) · 1.98 KB
/
genkey.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
package main
import (
"crypto/ecdsa"
"crypto/ed25519"
"crypto/elliptic"
"crypto/rand"
"fmt"
"os"
"text/template"
"github.com/decred/dcrd/dcrec/secp256k1/v4"
"github.com/ecadlabs/goblst/minpk"
"github.com/ecadlabs/gotez/v2/crypt"
"github.com/spf13/cobra"
)
const genkeyTemplateSrc = `{{range . -}}
Private Key: {{.PrivateKey}}
Public Key: {{.PublicKey}}
Public Key Hash: {{.PublicKey.Hash}}
{{end}}
`
var (
genkeyTpl = template.Must(template.New("list").Parse(genkeyTemplateSrc))
)
type tplData struct {
PrivateKey crypt.PrivateKey
PublicKey crypt.PublicKey
}
func NewGenKeyCommand() *cobra.Command {
var (
keyType string
num int
)
cmd := &cobra.Command{
Use: "gen-key",
Short: "Generate a key pair",
RunE: func(cmd *cobra.Command, args []string) error {
var data []*tplData
for i := 0; i < num; i++ {
var (
priv crypt.PrivateKey
err error
)
switch keyType {
case "ed25519":
var k ed25519.PrivateKey
_, k, err = ed25519.GenerateKey(rand.Reader)
priv = crypt.Ed25519PrivateKey(k)
case "secp256k1":
var k *ecdsa.PrivateKey
k, err = ecdsa.GenerateKey(secp256k1.S256(), rand.Reader)
priv = (*crypt.ECDSAPrivateKey)(k)
case "p256":
var k *ecdsa.PrivateKey
k, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
priv = (*crypt.ECDSAPrivateKey)(k)
case "bls":
var k *minpk.PrivateKey
k, err = minpk.GenerateKey(rand.Reader)
priv = (*crypt.BLSPrivateKey)(k)
default:
err = fmt.Errorf("unknown key type: %s", keyType)
}
if err != nil {
return err
}
data = append(data, &tplData{
PrivateKey: priv,
PublicKey: priv.Public(),
})
}
if err := genkeyTpl.Execute(os.Stdout, data); err != nil {
return err
}
return nil
},
}
cmd.Flags().IntVarP(&num, "num", "n", 1, "Number of key pairs to generate")
cmd.Flags().StringVarP(&keyType, "type", "t", "ed25519", "Key type [ed25519, secp256k1, p256, bls]")
return cmd
}