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  }