crypto/keyring: `Keybase` interface gives way to its successor: `Keyring`. `LegacyKeybase` interface is added in order to guarantee limited backward compatibility with the old `Keybase` interface for the sole purpose of migrating keys across the new keyring backends. The package no longer depends on the `github.com/types.Config` singleton. `SupportedAlgos` and `SupportedLedgerAlgos` methods have been removed. The keyring just fails when trying to perform an action with an unsupported algorithm. crypto/ subdirs reorganization: `crypto/keys/hd` was moved to `crypto/hd`, which now groups together all HD wallets related types and utilities. client/input: * Removal of unnecessary `GetCheckPassword`, `PrintPrefixed` functions. * `GetConfirmation`'s signature changed to take in a io.Writer for better integration with `cobra.Command` types. client/context: * In-memory keyring is allocated in the context when `--gen-only` flag is passed in. `GetFromFields` does no longer silently allocate a keyring, it takes one as argument. Co-authored with @jgimeno Co-authored-by: Jonathan Gimeno <jgimeno@gmail.com>
77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
package keys
|
|
|
|
import (
|
|
"bufio"
|
|
"crypto/sha256"
|
|
"fmt"
|
|
|
|
bip39 "github.com/cosmos/go-bip39"
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/input"
|
|
)
|
|
|
|
const (
|
|
flagUserEntropy = "unsafe-entropy"
|
|
|
|
mnemonicEntropySize = 256
|
|
)
|
|
|
|
// MnemonicKeyCommand computes the bip39 memonic for input entropy.
|
|
func MnemonicKeyCommand() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "mnemonic",
|
|
Short: "Compute the bip39 mnemonic for some input entropy",
|
|
Long: "Create a bip39 mnemonic, sometimes called a seed phrase, by reading from the system entropy. To pass your own entropy, use --unsafe-entropy",
|
|
RunE: runMnemonicCmd,
|
|
}
|
|
cmd.Flags().Bool(flagUserEntropy, false, "Prompt the user to supply their own entropy, instead of relying on the system")
|
|
return cmd
|
|
}
|
|
|
|
func runMnemonicCmd(cmd *cobra.Command, args []string) error {
|
|
flags := cmd.Flags()
|
|
|
|
userEntropy, _ := flags.GetBool(flagUserEntropy)
|
|
|
|
var entropySeed []byte
|
|
|
|
if userEntropy {
|
|
// prompt the user to enter some entropy
|
|
buf := bufio.NewReader(cmd.InOrStdin())
|
|
inputEntropy, err := input.GetString("> WARNING: Generate at least 256-bits of entropy and enter the results here:", buf)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(inputEntropy) < 43 {
|
|
return fmt.Errorf("256-bits is 43 characters in Base-64, and 100 in Base-6. You entered %v, and probably want more", len(inputEntropy))
|
|
}
|
|
conf, err := input.GetConfirmation(fmt.Sprintf("> Input length: %d", len(inputEntropy)), buf, cmd.ErrOrStderr())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !conf {
|
|
return nil
|
|
}
|
|
|
|
// hash input entropy to get entropy seed
|
|
hashedEntropy := sha256.Sum256([]byte(inputEntropy))
|
|
entropySeed = hashedEntropy[:]
|
|
} else {
|
|
// read entropy seed straight from crypto.Rand
|
|
var err error
|
|
entropySeed, err = bip39.NewEntropy(mnemonicEntropySize)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
mnemonic, err := bip39.NewMnemonic(entropySeed)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cmd.Println(mnemonic)
|
|
|
|
return nil
|
|
}
|