github.com/cosmos/cosmos-sdk@v0.50.1/crypto/keyring/keyring_ledger_test.go (about)

     1  //go:build ledger || test_ledger_mock
     2  // +build ledger test_ledger_mock
     3  
     4  package keyring
     5  
     6  import (
     7  	"bytes"
     8  	"testing"
     9  
    10  	"github.com/cockroachdb/errors"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/cosmos/cosmos-sdk/crypto/hd"
    14  	"github.com/cosmos/cosmos-sdk/types"
    15  	"github.com/cosmos/cosmos-sdk/types/tx/signing"
    16  )
    17  
    18  func TestInMemoryCreateLedger(t *testing.T) {
    19  	cdc := getCodec()
    20  	kb := NewInMemory(cdc)
    21  
    22  	k, err := kb.SaveLedgerKey("some_account", hd.Secp256k1, "cosmos", 118, 3, 1)
    23  	if err != nil {
    24  		require.Error(t, err)
    25  		require.Equal(t, "ledger nano S: support for ledger devices is not available in this executable", err.Error())
    26  		require.Nil(t, k)
    27  		t.Skip("ledger nano S: support for ledger devices is not available in this executable")
    28  		return
    29  	}
    30  
    31  	// The mock is available, check that the address is correct
    32  	pubKey, err := k.GetPubKey()
    33  	require.NoError(t, err)
    34  	expectedPkStr := "PubKeySecp256k1{03602C0CB4D8C0081FEE794BDE96E7B95FA16F2B5283B764AC070584327B2C7202}"
    35  	require.Equal(t, expectedPkStr, pubKey.String())
    36  
    37  	// Check that restoring the key gets the same results
    38  	restoredRecord, err := kb.Key("some_account")
    39  	require.NoError(t, err)
    40  	require.NotNil(t, restoredRecord)
    41  	require.Equal(t, "some_account", restoredRecord.Name)
    42  	pubKey, err = restoredRecord.GetPubKey()
    43  	require.NoError(t, err)
    44  	require.Equal(t, expectedPkStr, pubKey.String())
    45  
    46  	ledgerInfo := restoredRecord.GetLedger()
    47  	require.NotNil(t, ledgerInfo)
    48  	path := ledgerInfo.GetPath()
    49  	require.Equal(t, "m/44'/118'/3'/0/1", path.String())
    50  }
    51  
    52  // TestSignVerify does some detailed checks on how we sign and validate
    53  // signatures
    54  func TestSignVerifyKeyRingWithLedger(t *testing.T) {
    55  	dir := t.TempDir()
    56  	cdc := getCodec()
    57  
    58  	kb, err := New("keybasename", "test", dir, nil, cdc)
    59  	require.NoError(t, err)
    60  
    61  	k, err := kb.SaveLedgerKey("key", hd.Secp256k1, "cosmos", 118, 0, 0)
    62  	if err != nil {
    63  		require.Equal(t, "ledger nano S: support for ledger devices is not available in this executable", err.Error())
    64  		t.Skip("ledger nano S: support for ledger devices is not available in this executable")
    65  		return
    66  	}
    67  	require.Equal(t, "key", k.Name)
    68  
    69  	d1 := []byte("my first message")
    70  	s1, pub1, err := kb.Sign("key", d1, signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON)
    71  	require.NoError(t, err)
    72  
    73  	s2, pub2, err := SignWithLedger(k, d1, signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON)
    74  	require.NoError(t, err)
    75  
    76  	require.True(t, pub1.Equals(pub2))
    77  	require.True(t, bytes.Equal(s1, s2))
    78  
    79  	key1, err := k.GetPubKey()
    80  	require.NoError(t, err)
    81  
    82  	require.Equal(t, key1, pub1)
    83  	require.Equal(t, key1, pub2)
    84  	require.True(t, pub1.VerifySignature(d1, s1))
    85  	require.True(t, key1.VerifySignature(d1, s1))
    86  	require.True(t, bytes.Equal(s1, s2))
    87  
    88  	k, _, err = kb.NewMnemonic("test", English, types.FullFundraiserPath, DefaultBIP39Passphrase, hd.Secp256k1)
    89  	require.NoError(t, err)
    90  	_, _, err = SignWithLedger(k, d1, signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON)
    91  	require.Error(t, err)
    92  	require.Equal(t, "not a ledger object", err.Error())
    93  }
    94  
    95  func TestAltKeyring_SaveLedgerKey(t *testing.T) {
    96  	dir := t.TempDir()
    97  	cdc := getCodec()
    98  
    99  	kr, err := New(t.Name(), BackendTest, dir, nil, cdc)
   100  	require.NoError(t, err)
   101  
   102  	// Test unsupported Algo
   103  	_, err = kr.SaveLedgerKey("key", notSupportedAlgo{}, "cosmos", 118, 0, 0)
   104  	require.True(t, errors.Is(err, ErrUnsupportedSigningAlgo))
   105  
   106  	k, err := kr.SaveLedgerKey("some_account", hd.Secp256k1, "cosmos", 118, 3, 1)
   107  	if err != nil {
   108  		require.Equal(t, "ledger nano S: support for ledger devices is not available in this executable", err.Error())
   109  		t.Skip("ledger nano S: support for ledger devices is not available in this executable")
   110  		return
   111  	}
   112  
   113  	// The mock is available, check that the address is correct
   114  	require.Equal(t, "some_account", k.Name)
   115  	pubKey, err := k.GetPubKey()
   116  	require.NoError(t, err)
   117  	expectedPkStr := "PubKeySecp256k1{03602C0CB4D8C0081FEE794BDE96E7B95FA16F2B5283B764AC070584327B2C7202}"
   118  	require.Equal(t, expectedPkStr, pubKey.String())
   119  
   120  	// Check that restoring the key gets the same results
   121  	restoredRecord, err := kr.Key("some_account")
   122  	require.NoError(t, err)
   123  	require.NotNil(t, restoredRecord)
   124  	require.Equal(t, "some_account", restoredRecord.Name)
   125  	//	require.Equal(t, TypeLedger, restoredRecord.GetType())
   126  	pubKey, err = restoredRecord.GetPubKey()
   127  	require.NoError(t, err)
   128  	require.Equal(t, expectedPkStr, pubKey.String())
   129  
   130  	ledgerInfo := k.GetLedger()
   131  	require.NotNil(t, ledgerInfo)
   132  
   133  	path := ledgerInfo.GetPath()
   134  	require.Equal(t, "m/44'/118'/3'/0/1", path.String())
   135  }