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 }