github.com/cosmos/cosmos-sdk@v0.50.1/crypto/keyring/migration_test.go (about) 1 package keyring 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/99designs/keyring" 8 "github.com/stretchr/testify/suite" 9 10 errorsmod "cosmossdk.io/errors" 11 12 "github.com/cosmos/cosmos-sdk/codec/legacy" 13 "github.com/cosmos/cosmos-sdk/crypto/hd" 14 "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" 15 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" 16 cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" 17 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" 18 ) 19 20 const n1 = "cosmos.info" 21 22 type MigrationTestSuite struct { 23 suite.Suite 24 25 kb Keyring 26 priv cryptotypes.PrivKey 27 pub cryptotypes.PubKey 28 ks keystore 29 } 30 31 func (s *MigrationTestSuite) SetupSuite() { 32 dir := s.T().TempDir() 33 mockIn := strings.NewReader("") 34 cdc := getCodec() 35 36 kb, err := New(n1, BackendTest, dir, mockIn, cdc) 37 s.Require().NoError(err) 38 39 ks, ok := kb.(keystore) 40 s.Require().True(ok) 41 42 s.kb = kb 43 s.ks = ks 44 45 s.priv = cryptotypes.PrivKey(secp256k1.GenPrivKey()) 46 s.pub = s.priv.PubKey() 47 } 48 49 func (s *MigrationTestSuite) TestMigrateLegacyLocalKey() { 50 legacyLocalInfo := newLegacyLocalInfo(n1, s.pub, string(legacy.Cdc.MustMarshal(s.priv)), hd.Secp256k1.Name()) 51 serializedLegacyLocalInfo := MarshalInfo(legacyLocalInfo) 52 53 item := keyring.Item{ 54 Key: n1, 55 Data: serializedLegacyLocalInfo, 56 Description: "SDK kerying version", 57 } 58 59 s.Require().NoError(s.ks.SetItem(item)) 60 61 _, err := s.ks.migrate(n1) 62 s.Require().NoError(err) 63 } 64 65 func (s *MigrationTestSuite) TestMigrateLegacyLedgerKey() { 66 account, coinType, index := uint32(118), uint32(0), uint32(0) 67 hdPath := hd.NewFundraiserParams(account, coinType, index) 68 legacyLedgerInfo := newLegacyLedgerInfo(n1, s.pub, *hdPath, hd.Secp256k1.Name()) 69 serializedLegacyLedgerInfo := MarshalInfo(legacyLedgerInfo) 70 71 item := keyring.Item{ 72 Key: n1, 73 Data: serializedLegacyLedgerInfo, 74 Description: "SDK kerying version", 75 } 76 77 s.Require().NoError(s.ks.SetItem(item)) 78 79 _, err := s.ks.migrate(n1) 80 s.Require().NoError(err) 81 } 82 83 func (s *MigrationTestSuite) TestMigrateLegacyOfflineKey() { 84 legacyOfflineInfo := newLegacyOfflineInfo(n1, s.pub, hd.Secp256k1.Name()) 85 serializedLegacyOfflineInfo := MarshalInfo(legacyOfflineInfo) 86 87 item := keyring.Item{ 88 Key: n1, 89 Data: serializedLegacyOfflineInfo, 90 Description: "SDK kerying version", 91 } 92 93 s.Require().NoError(s.ks.SetItem(item)) 94 95 _, err := s.ks.migrate(n1) 96 s.Require().NoError(err) 97 } 98 99 func (s *MigrationTestSuite) TestMigrateLegacyMultiKey() { 100 multi := multisig.NewLegacyAminoPubKey( 101 1, []cryptotypes.PubKey{ 102 s.pub, 103 }, 104 ) 105 106 LegacyMultiInfo, err := NewLegacyMultiInfo(n1, multi) 107 s.Require().NoError(err) 108 serializedLegacyMultiInfo := MarshalInfo(LegacyMultiInfo) 109 110 item := keyring.Item{ 111 Key: n1, 112 Data: serializedLegacyMultiInfo, 113 Description: "SDK kerying version", 114 } 115 116 s.Require().NoError(s.ks.SetItem(item)) 117 118 _, err = s.ks.migrate(n1) 119 s.Require().NoError(err) 120 } 121 122 func (s *MigrationTestSuite) TestMigrateLocalRecord() { 123 k1, err := NewLocalRecord("test record", s.priv, s.pub) 124 s.Require().NoError(err) 125 126 serializedRecord, err := s.ks.cdc.Marshal(k1) 127 s.Require().NoError(err) 128 129 item := keyring.Item{ 130 Key: n1, 131 Data: serializedRecord, 132 Description: "SDK kerying version", 133 } 134 135 s.Require().NoError(s.ks.SetItem(item)) 136 137 k2, err := s.ks.migrate(n1) 138 s.Require().NoError(err) 139 s.Require().Equal(k2.Name, k1.Name) 140 141 pub, err := k2.GetPubKey() 142 s.Require().NoError(err) 143 s.Require().Equal(pub, s.pub) 144 145 priv, err := extractPrivKeyFromRecord(k2) 146 s.Require().NoError(err) 147 s.Require().Equal(priv, s.priv) 148 149 s.Require().NoError(err) 150 } 151 152 func (s *MigrationTestSuite) TestMigrateOneRandomItemError() { 153 randomBytes := []byte("abckd0s03l") 154 errItem := keyring.Item{ 155 Key: n1, 156 Data: randomBytes, 157 Description: "SDK kerying version", 158 } 159 160 s.Require().NoError(s.ks.SetItem(errItem)) 161 162 _, err := s.ks.migrate(n1) 163 s.Require().Error(err) 164 } 165 166 func (s *MigrationTestSuite) TestMigrateAllLegacyMultiOffline() { 167 multi := multisig.NewLegacyAminoPubKey( 168 1, []cryptotypes.PubKey{ 169 s.pub, 170 }, 171 ) 172 173 LegacyMultiInfo, err := NewLegacyMultiInfo(n1, multi) 174 s.Require().NoError(err) 175 serializedLegacyMultiInfo := MarshalInfo(LegacyMultiInfo) 176 177 item := keyring.Item{ 178 Key: n1, 179 Data: serializedLegacyMultiInfo, 180 Description: "SDK kerying version", 181 } 182 183 s.Require().NoError(s.ks.SetItem(item)) 184 185 legacyOfflineInfo := newLegacyOfflineInfo(n1, s.pub, hd.Secp256k1.Name()) 186 serializedLegacyOfflineInfo := MarshalInfo(legacyOfflineInfo) 187 188 item = keyring.Item{ 189 Key: n1, 190 Data: serializedLegacyOfflineInfo, 191 Description: "SDK kerying version", 192 } 193 194 s.Require().NoError(s.ks.SetItem(item)) 195 196 _, err = s.kb.MigrateAll() 197 s.Require().NoError(err) 198 } 199 200 func (s *MigrationTestSuite) TestMigrateAllNoItem() { 201 _, err := s.kb.MigrateAll() 202 s.Require().NoError(err) 203 } 204 205 func (s *MigrationTestSuite) TestMigrateErrUnknownItemKey() { 206 legacyOfflineInfo := newLegacyOfflineInfo(n1, s.pub, hd.Secp256k1.Name()) 207 serializedLegacyOfflineInfo := MarshalInfo(legacyOfflineInfo) 208 209 item := keyring.Item{ 210 Key: n1, 211 Data: serializedLegacyOfflineInfo, 212 Description: "SDK kerying version", 213 } 214 215 s.Require().NoError(s.ks.SetItem(item)) 216 217 incorrectItemKey := n1 + "1" 218 _, err := s.ks.migrate(incorrectItemKey) 219 s.Require().EqualError(err, errorsmod.Wrap(sdkerrors.ErrKeyNotFound, infoKey(incorrectItemKey)).Error()) 220 } 221 222 func (s *MigrationTestSuite) TestMigrateErrEmptyItemData() { 223 item := keyring.Item{ 224 Key: n1, 225 Data: []byte{}, 226 Description: "SDK kerying version", 227 } 228 229 s.Require().NoError(s.ks.SetItem(item)) 230 231 _, err := s.ks.migrate(n1) 232 s.Require().EqualError(err, errorsmod.Wrap(sdkerrors.ErrKeyNotFound, n1).Error()) 233 } 234 235 func TestMigrationTestSuite(t *testing.T) { 236 suite.Run(t, new(MigrationTestSuite)) 237 } 238 239 // newLegacyLocalInfo creates a new legacyLocalInfo instance 240 func newLegacyLocalInfo(name string, pub cryptotypes.PubKey, privArmor string, algo hd.PubKeyType) LegacyInfo { 241 return &legacyLocalInfo{ 242 Name: name, 243 PubKey: pub, 244 PrivKeyArmor: privArmor, 245 Algo: algo, 246 } 247 } 248 249 // newLegacyOfflineInfo creates a new legacyLedgerInfo instance 250 func newLegacyLedgerInfo(name string, pub cryptotypes.PubKey, path hd.BIP44Params, algo hd.PubKeyType) LegacyInfo { 251 return &legacyLedgerInfo{ 252 Name: name, 253 PubKey: pub, 254 Path: path, 255 Algo: algo, 256 } 257 } 258 259 // newLegacyOfflineInfo creates a new legacyOfflineInfo instance 260 func newLegacyOfflineInfo(name string, pub cryptotypes.PubKey, algo hd.PubKeyType) LegacyInfo { 261 return &legacyOfflineInfo{ 262 Name: name, 263 PubKey: pub, 264 Algo: algo, 265 } 266 }