github.com/algorand/go-algorand-sdk@v1.24.0/mnemonic/mnemonic_test.go (about) 1 package mnemonic 2 3 import ( 4 "crypto/rand" 5 "strings" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 10 "github.com/algorand/go-algorand-sdk/crypto" 11 "github.com/algorand/go-algorand-sdk/types" 12 ) 13 14 func TestGenerateAndRecovery(t *testing.T) { 15 key := make([]byte, 32) 16 for i := 0; i < 1000; i++ { 17 // Generate a key 18 _, err := rand.Read(key) 19 require.NoError(t, err) 20 // Go from key -> mnemonic 21 m, err := FromKey(key) 22 // Go from mnemonic -> key 23 recovered, err := ToKey(m) 24 require.NoError(t, err) 25 require.Equal(t, recovered, key) 26 } 27 28 var mdk types.MasterDerivationKey 29 for i := 0; i < 1000; i++ { 30 // Generate a mdk 31 _, err := rand.Read(key) 32 require.NoError(t, err) 33 copy(mdk[:], key) 34 // Go from mdk -> mnemonic 35 m, err := FromMasterDerivationKey(mdk) 36 // Go from mnemonic -> mdk 37 recovered, err := ToMasterDerivationKey(m) 38 require.NoError(t, err) 39 require.Equal(t, recovered, mdk) 40 } 41 42 for i := 0; i < 1000; i++ { 43 // Generate a private key 44 acct := crypto.GenerateAccount() 45 // Go from sk -> mnemonic 46 m, err := FromPrivateKey(acct.PrivateKey) 47 // Go from mnemonic -> sk 48 recovered, err := ToPrivateKey(m) 49 require.NoError(t, err) 50 require.Equal(t, recovered, acct.PrivateKey) 51 } 52 } 53 54 func TestZeroVector(t *testing.T) { 55 zeroVector := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 56 mn := "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon invest" 57 58 m, err := FromKey(zeroVector) 59 require.NoError(t, err) 60 require.Equal(t, mn, m) 61 return 62 } 63 64 func TestWordNotInList(t *testing.T) { 65 mn := "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon zzz invest" 66 _, err := ToKey(mn) 67 require.Error(t, err) 68 return 69 } 70 71 func TestCorruptedChecksum(t *testing.T) { 72 key := make([]byte, 32) 73 _, err := rand.Read(key) 74 require.NoError(t, err) 75 m, err := FromKey(key) 76 wl := strings.Split(m, sepStr) 77 lastWord := wl[len(wl)-1] 78 // Shuffle the last word (last 11 bits of checksum) 79 wl[len(wl)-1] = wordlist[(indexOf(wordlist, lastWord)+1)%len(wordlist)] 80 recovered, err := ToKey(strings.Join(wl, sepStr)) 81 require.Error(t, err) 82 require.Empty(t, recovered) 83 } 84 85 func TestInvalidKeyLen(t *testing.T) { 86 badLens := []int{0, 31, 33, 100} 87 for _, l := range badLens { 88 key := make([]byte, l) 89 _, err := rand.Read(key) 90 require.NoError(t, err) 91 m, err := FromKey(key) 92 require.Error(t, err) 93 require.Empty(t, m) 94 } 95 }