mirror of
https://github.com/ipfs/kubo.git
synced 2026-03-09 10:18:04 +08:00
159 lines
3.2 KiB
Go
159 lines
3.2 KiB
Go
package commands
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"fmt"
|
|
"io"
|
|
"sort"
|
|
"strings"
|
|
|
|
cmds "github.com/ipfs/go-ipfs/commands"
|
|
|
|
peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer"
|
|
ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto"
|
|
)
|
|
|
|
var KeyCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "Create and manipulate keypairs",
|
|
},
|
|
Subcommands: map[string]*cmds.Command{
|
|
"gen": KeyGenCmd,
|
|
"list": KeyListCmd,
|
|
},
|
|
}
|
|
|
|
type KeyOutput struct {
|
|
Name string
|
|
Id string
|
|
}
|
|
|
|
var KeyGenCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "Create a new keypair",
|
|
},
|
|
Options: []cmds.Option{
|
|
cmds.StringOption("type", "t", "type of the key to create"),
|
|
cmds.IntOption("size", "s", "size of the key to generate"),
|
|
},
|
|
Arguments: []cmds.Argument{
|
|
cmds.StringArg("name", true, false, "name of key to create"),
|
|
},
|
|
Run: func(req cmds.Request, res cmds.Response) {
|
|
n, err := req.InvocContext().GetNode()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
typ, f, err := req.Option("type").String()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
if !f {
|
|
res.SetError(fmt.Errorf("please specify a key type with --type"), cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
size, sizefound, err := req.Option("size").Int()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
name := req.Arguments()[0]
|
|
if name == "self" {
|
|
res.SetError(fmt.Errorf("cannot create key with name 'self'"), cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
var sk ci.PrivKey
|
|
var pk ci.PubKey
|
|
|
|
switch typ {
|
|
case "rsa":
|
|
if !sizefound {
|
|
res.SetError(fmt.Errorf("please specify a key size with --size"), cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, size, rand.Reader)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
sk = priv
|
|
pk = pub
|
|
case "ed25519":
|
|
priv, pub, err := ci.GenerateEd25519Key(rand.Reader)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
sk = priv
|
|
pk = pub
|
|
default:
|
|
res.SetError(fmt.Errorf("unrecognized key type: %s", typ), cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
err = n.Repo.Keystore().Put(name, sk)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
pid, err := peer.IDFromPublicKey(pk)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
res.SetOutput(&KeyOutput{
|
|
Name: name,
|
|
Id: pid.Pretty(),
|
|
})
|
|
},
|
|
Marshalers: cmds.MarshalerMap{
|
|
cmds.Text: func(res cmds.Response) (io.Reader, error) {
|
|
k, ok := res.Output().(*KeyOutput)
|
|
if !ok {
|
|
return nil, fmt.Errorf("expected a KeyOutput as command result")
|
|
}
|
|
|
|
return strings.NewReader(k.Id), nil
|
|
},
|
|
},
|
|
Type: KeyOutput{},
|
|
}
|
|
|
|
var KeyListCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "List all local keypairs",
|
|
},
|
|
Run: func(req cmds.Request, res cmds.Response) {
|
|
n, err := req.InvocContext().GetNode()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
keys, err := n.Repo.Keystore().List()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
sort.Strings(keys)
|
|
res.SetOutput(&stringList{keys})
|
|
},
|
|
Marshalers: cmds.MarshalerMap{
|
|
cmds.Text: stringListMarshaler,
|
|
},
|
|
Type: stringList{},
|
|
}
|