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