From f77635be243ef9a6f1cfabfa6edecf2618ca8fb7 Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Wed, 22 Jul 2020 09:07:15 -0700 Subject: [PATCH 1/3] encoding: Better bip39 error --- encoding/bip39.go | 12 +++++++++++- encoding/encode_test.go | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/encoding/bip39.go b/encoding/bip39.go index 7cd1dd5..91e5ae2 100644 --- a/encoding/bip39.go +++ b/encoding/bip39.go @@ -12,6 +12,9 @@ type ErrInvalidPhrase struct { cause error } +// ErrInvalidNumBytesForBIP39 if invalid number of bytes for encoding. +var ErrInvalidNumBytesForBIP39 = errors.New("bip39 only accepts 16, 20, 24, 28, 32 bytes") + func (e ErrInvalidPhrase) Error() string { return "invalid phrase" } @@ -23,7 +26,14 @@ func (e ErrInvalidPhrase) Cause() error { // BytesToPhrase returns a phrase for bytes func BytesToPhrase(b []byte) (string, error) { - return bip39.NewMnemonic(b) + out, err := bip39.NewMnemonic(b) + if err != nil { + if err == bip39.ErrEntropyLengthInvalid { + return "", ErrInvalidNumBytesForBIP39 + } + return "", err + } + return out, nil } // PhraseToBytes decodes a bip39 mnemonic into bytes diff --git a/encoding/encode_test.go b/encoding/encode_test.go index ee7ccc4..fe7f17f 100644 --- a/encoding/encode_test.go +++ b/encoding/encode_test.go @@ -78,6 +78,49 @@ func TestEncodeBase64(t *testing.T) { require.EqualError(t, err, "invalid option: lowercase") } +func TestEncodeBIP39(t *testing.T) { + var b []byte + var out string + var err error + + b = bytes.Repeat([]byte{0x01}, 16) + out, err = encoding.Encode(b, encoding.BIP39) + require.NoError(t, err) + require.Equal(t, "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor adjust", out) + + b = bytes.Repeat([]byte{0x01}, 20) + out, err = encoding.Encode(b, encoding.BIP39) + require.NoError(t, err) + require.Equal(t, "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter all", out) + + b = bytes.Repeat([]byte{0x01}, 24) + out, err = encoding.Encode(b, encoding.BIP39) + require.NoError(t, err) + require.Equal(t, "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd approve", out) + + b = bytes.Repeat([]byte{0x01}, 28) + out, err = encoding.Encode(b, encoding.BIP39) + require.NoError(t, err) + require.Equal(t, "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic banana", out) + + b = bytes.Repeat([]byte{0x01}, 32) + out, err = encoding.Encode(b, encoding.BIP39) + require.NoError(t, err) + require.Equal(t, "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice comic", out) + + b = bytes.Repeat([]byte{0x01}, 8) + out, err = encoding.Encode(b, encoding.BIP39) + require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) + + b = bytes.Repeat([]byte{0x01}, 40) + out, err = encoding.Encode(b, encoding.BIP39) + require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) + + b = bytes.Repeat([]byte{0x01}, 64) + out, err = encoding.Encode(b, encoding.BIP39) + require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) +} + func TestMustEncodeDecode(t *testing.T) { in := bytes.Repeat([]byte{0x01}, 32) out, err := encoding.DecodeBase32(encoding.EncodeBase32(in)) From e27093de36e4767da76ce595b2135c298d0d6c92 Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Wed, 22 Jul 2020 11:54:25 -0700 Subject: [PATCH 2/3] Update encode_test.go --- encoding/encode_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/encoding/encode_test.go b/encoding/encode_test.go index fe7f17f..93e521c 100644 --- a/encoding/encode_test.go +++ b/encoding/encode_test.go @@ -109,15 +109,15 @@ func TestEncodeBIP39(t *testing.T) { require.Equal(t, "absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice comic", out) b = bytes.Repeat([]byte{0x01}, 8) - out, err = encoding.Encode(b, encoding.BIP39) + _, err = encoding.Encode(b, encoding.BIP39) require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) b = bytes.Repeat([]byte{0x01}, 40) - out, err = encoding.Encode(b, encoding.BIP39) + _, err = encoding.Encode(b, encoding.BIP39) require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) b = bytes.Repeat([]byte{0x01}, 64) - out, err = encoding.Encode(b, encoding.BIP39) + _, err = encoding.Encode(b, encoding.BIP39) require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) } From 8cb853fb325e4cc156914937128427de9930ef51 Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Wed, 22 Jul 2020 13:27:11 -0700 Subject: [PATCH 3/3] ErrInvalidBIP39Input --- encoding/bip39.go | 6 +++--- encoding/encode_test.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/encoding/bip39.go b/encoding/bip39.go index 91e5ae2..7f8446a 100644 --- a/encoding/bip39.go +++ b/encoding/bip39.go @@ -12,8 +12,8 @@ type ErrInvalidPhrase struct { cause error } -// ErrInvalidNumBytesForBIP39 if invalid number of bytes for encoding. -var ErrInvalidNumBytesForBIP39 = errors.New("bip39 only accepts 16, 20, 24, 28, 32 bytes") +// ErrInvalidBIP39Input if invalid number of bytes for encoding. +var ErrInvalidBIP39Input = errors.New("bip39 only accepts 16, 20, 24, 28, 32 bytes") func (e ErrInvalidPhrase) Error() string { return "invalid phrase" @@ -29,7 +29,7 @@ func BytesToPhrase(b []byte) (string, error) { out, err := bip39.NewMnemonic(b) if err != nil { if err == bip39.ErrEntropyLengthInvalid { - return "", ErrInvalidNumBytesForBIP39 + return "", ErrInvalidBIP39Input } return "", err } diff --git a/encoding/encode_test.go b/encoding/encode_test.go index 93e521c..e3a385e 100644 --- a/encoding/encode_test.go +++ b/encoding/encode_test.go @@ -110,15 +110,15 @@ func TestEncodeBIP39(t *testing.T) { b = bytes.Repeat([]byte{0x01}, 8) _, err = encoding.Encode(b, encoding.BIP39) - require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) + require.Equal(t, err, encoding.ErrInvalidBIP39Input) b = bytes.Repeat([]byte{0x01}, 40) _, err = encoding.Encode(b, encoding.BIP39) - require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) + require.Equal(t, err, encoding.ErrInvalidBIP39Input) b = bytes.Repeat([]byte{0x01}, 64) _, err = encoding.Encode(b, encoding.BIP39) - require.Equal(t, err, encoding.ErrInvalidNumBytesForBIP39) + require.Equal(t, err, encoding.ErrInvalidBIP39Input) } func TestMustEncodeDecode(t *testing.T) {