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  }