Skip to content

Commit

Permalink
Merge PR cosmos#2090: Improve crypto/keys and add keys mnemonic and…
Browse files Browse the repository at this point in the history
… `keys new` commands

* crypto/keys/hd: use btcec to remove dep on tendermint

* crypto/keys/bcrypt: improve comment about fork

* crypto/keys/bip39 -> crypto/keys/bip39/fundraiser

* crypto/keys/bip39: bring in fork of tyler-smith

* crypto/keys/hd: update dep

* crypto/keys: update deps

* crypto/keys: move mintkey.go into new crypto/keys/mintkey

* crypto/keys/hd: NewParamsFromPath

* crypto/keys: keybase.Derive takes a bip39 passphrase too

* crypto/keys/hd: BIP44Params.DerivationPath

* gaiacli keys: add commands new and mnemonic

* fix lints

* minor fixes from review

* update Gopkg.toml

* add tendermint fork of golang.org/x/crypto
* pin some transitive deps

* crypto/keys/bcrypt: remove

* remove in favour of fork of golang.org/x/crypto/bcrypt at github.com/tendermint/crypto/bcrypt

* crypto/keys/bip39: remove completely

* use fork cosmos/go-bip39 instead

* Gopkg.toml: dont use master

* Pull in changes from my PR

* fixes from review

* enforce min len for --unsafe-entropy

* lint fix

* feedback from review

* fix dep
  • Loading branch information
ebuchman authored and rigelrozanski committed Oct 17, 2018
1 parent c961a68 commit 1ee8dee
Show file tree
Hide file tree
Showing 18 changed files with 573 additions and 501 deletions.
38 changes: 22 additions & 16 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 34 additions & 5 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,22 +59,51 @@
name = "github.com/tendermint/tendermint"
version = "=0.25.0"

## deps without releases:

[[constraint]]
name = "golang.org/x/crypto"
source = "https://github.com/tendermint/crypto"
revision = "3764759f34a542a3aef74d6b02e35be7ab893bba"

[[constraint]]
name = "github.com/bartekn/go-bip39"
revision = "a05967ea095d81c8fe4833776774cfaff8e5036c"
name = "github.com/cosmos/go-bip39"
revision = "52158e4697b87de16ed390e1bdaf813e581008fa"

[[constraint]]
name = "github.com/zondax/ledger-goclient"
version = "=v0.1.0"

## transitive deps, with releases:

[[override]]
name = "github.com/davecgh/go-spew"
version = "=v1.1.0"

[[constraint]]
name = "github.com/rakyll/statik"
version = "=v0.1.4"

[[constraint]]
name = "github.com/mitchellh/go-homedir"
version = "1.0.0"

## transitive deps, without releases:
#

[[override]]
name = "github.com/syndtr/goleveldb"
revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445"

[[override]]
name = "golang.org/x/sys"
revision = "4e1fef5609515ec7a2cee7b5de30ba6d9b438cbf"

[[override]]
name = "google.golang.org/genproto"
revision = "383e8b2c3b9e36c4076b235b32537292176bae20"

[prune]
go-tests = true
unused-packages = true

[[constraint]]
name = "github.com/mitchellh/go-homedir"
version = "1.0.0"
14 changes: 5 additions & 9 deletions client/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"strings"

"github.com/bgentry/speakeasy"
isatty "github.com/mattn/go-isatty"
"github.com/mattn/go-isatty"
"github.com/pkg/errors"
)

Expand Down Expand Up @@ -44,13 +44,8 @@ func GetPassword(prompt string, buf *bufio.Reader) (pass string, err error) {

// GetSeed will request a seed phrase from stdin and trims off
// leading/trailing spaces
func GetSeed(prompt string, buf *bufio.Reader) (seed string, err error) {
if inputIsTty() {
fmt.Println(prompt)
}
seed, err = readLineFromBuf(buf)
seed = strings.TrimSpace(seed)
return
func GetSeed(prompt string, buf *bufio.Reader) (string, error) {
return GetString(prompt, buf)
}

// GetCheckPassword will prompt for a password twice to verify they
Expand Down Expand Up @@ -133,5 +128,6 @@ func readLineFromBuf(buf *bufio.Reader) (string, error) {

// PrintPrefixed prints a string with > prefixed for use in prompts.
func PrintPrefixed(msg string) {
fmt.Printf("> %s\n", msg)
msg = fmt.Sprintf("> %s\n", msg)
fmt.Fprint(os.Stderr, msg)
}
78 changes: 78 additions & 0 deletions client/keys/mnemonic.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package keys

import (
"crypto/sha256"
"fmt"

"github.com/cosmos/cosmos-sdk/client"
"github.com/spf13/cobra"

bip39 "github.com/bartekn/go-bip39"
)

const (
flagUserEntropy = "unsafe-entropy"

mnemonicEntropySize = 256
)

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 := client.BufferStdin()
inputEntropy, err := client.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 := client.GetConfirmation(
fmt.Sprintf("> Input length: %d", len(inputEntropy)),
buf)
if err != nil {
return err
}
if !conf {
return nil
}

// hash input entropy to get entropy seed
hashedEntropy := sha256.Sum256([]byte(inputEntropy))
entropySeed = hashedEntropy[:]
printStep()
} 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
}

fmt.Println(mnemonic)

return nil
}
Loading

0 comments on commit 1ee8dee

Please sign in to comment.