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 }