diff --git a/CHANGELOG.md b/CHANGELOG.md index ae78f413a8..c64cadaea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * (versiondb) [#1387](https://github.com/crypto-org-chain/cronos/pull/1387) Add dedicated config section for versiondb, prepare for sdk 0.50 integration. * (e2ee)[#1413](https://github.com/crypto-org-chain/cronos/pull/1413) Add custom keyring implementation for e2ee module. * (e2ee)[#1415](https://github.com/crypto-org-chain/cronos/pull/1415) Add batch keys query for e2ee module. +* (e2ee)[#1421](https://github.com/crypto-org-chain/cronos/pull/1421) Validate e2ee key when register. ### Bug Fixes diff --git a/integration_tests/configs/default.jsonnet b/integration_tests/configs/default.jsonnet index 04dc9271bc..33353020b5 100644 --- a/integration_tests/configs/default.jsonnet +++ b/integration_tests/configs/default.jsonnet @@ -90,7 +90,7 @@ e2ee: { keys: [{ address: 'crc16z0herz998946wr659lr84c8c556da55dc34hh', - key: std.base64('key'), + key: 'age1k3mpspxytgvx6e0jja0xgrtzz7vw2p00c2a3xmq5ygfzhwh4wg0s35z4c8', }], }, gov: { diff --git a/integration_tests/cosmoscli.py b/integration_tests/cosmoscli.py index eba113be43..e6b80e17f4 100644 --- a/integration_tests/cosmoscli.py +++ b/integration_tests/cosmoscli.py @@ -1852,7 +1852,7 @@ def query_e2ee_key(self, address): home=self.data_dir, output="json", ) - )["key"] + ).get("key") def query_e2ee_keys(self, *addresses): return json.loads( @@ -1864,7 +1864,7 @@ def query_e2ee_keys(self, *addresses): home=self.data_dir, output="json", ) - )["keys"] + ).get("keys") def register_e2ee_key(self, key, **kwargs): kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE) diff --git a/integration_tests/test_e2ee.py b/integration_tests/test_e2ee.py index 2c1738c7b4..c1d8a1ace8 100644 --- a/integration_tests/test_e2ee.py +++ b/integration_tests/test_e2ee.py @@ -1,3 +1,10 @@ +def test_register(cronos): + cli = cronos.cosmos_cli() + pubkey0 = cli.keygen(keyring_name="key0") + cli.register_e2ee_key(pubkey0 + "malformed", _from="validator") + assert not cli.query_e2ee_key(cli.address("validator")) + + def test_encrypt_decrypt(cronos): cli = cronos.cosmos_cli() diff --git a/x/e2ee/keeper/keeper.go b/x/e2ee/keeper/keeper.go index 6c04f96390..37c5655fb9 100644 --- a/x/e2ee/keeper/keeper.go +++ b/x/e2ee/keeper/keeper.go @@ -28,16 +28,26 @@ func NewKeeper(storeKey storetypes.StoreKey, addressCodec address.Codec) Keeper } } +func (k Keeper) registerEncryptionKey( + ctx context.Context, + address string, + key []byte, +) error { + bz, err := k.addressCodec.StringToBytes(address) + if err != nil { + return err + } + sdk.UnwrapSDKContext(ctx).KVStore(k.storeKey).Set(types.KeyPrefix(bz), key) + return nil +} + func (k Keeper) RegisterEncryptionKey( ctx context.Context, req *types.MsgRegisterEncryptionKey, ) (*types.MsgRegisterEncryptionKeyResponse, error) { - bz, err := k.addressCodec.StringToBytes(req.Address) - if err != nil { + if err := k.registerEncryptionKey(ctx, req.Address, []byte(req.Key)); err != nil { return nil, err } - sdkCtx := sdk.UnwrapSDKContext(ctx) - sdkCtx.KVStore(k.storeKey).Set(types.KeyPrefix(bz), []byte(req.Key)) return &types.MsgRegisterEncryptionKeyResponse{}, nil } @@ -46,10 +56,7 @@ func (k Keeper) InitGenesis( state *types.GenesisState, ) error { for _, key := range state.Keys { - if _, err := k.RegisterEncryptionKey(ctx, &types.MsgRegisterEncryptionKey{ - Address: key.Address, - Key: key.Key, - }); err != nil { + if err := k.registerEncryptionKey(ctx, key.Address, []byte(key.Key)); err != nil { return err } } diff --git a/x/e2ee/types/keys.go b/x/e2ee/types/keys.go index 5941cbf264..0dacda824f 100644 --- a/x/e2ee/types/keys.go +++ b/x/e2ee/types/keys.go @@ -1,8 +1,6 @@ package types import ( - "errors" - sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -39,8 +37,5 @@ func (e EncryptionKeyEntry) Validate() error { if _, err := sdk.AccAddressFromBech32(e.Address); err != nil { return err } - if len(e.Key) == 0 { - return errors.New("key can't be nil") - } - return nil + return ValidateRecipientKey(e.Key) } diff --git a/x/e2ee/types/msg.go b/x/e2ee/types/msg.go index a18c0b0b4b..316efbdec8 100644 --- a/x/e2ee/types/msg.go +++ b/x/e2ee/types/msg.go @@ -3,19 +3,19 @@ package types import ( fmt "fmt" + "filippo.io/age" sdk "github.com/cosmos/cosmos-sdk/types" ) func (m *MsgRegisterEncryptionKey) ValidateBasic() error { - if m.Address == "" { - return fmt.Errorf("address cannot be empty") - } - if len(m.Key) == 0 { - return fmt.Errorf("key cannot be nil") - } // validate bech32 format of Address if _, err := sdk.AccAddressFromBech32(m.Address); err != nil { return fmt.Errorf("invalid address: %s", err) } - return nil + return ValidateRecipientKey(m.Key) +} + +func ValidateRecipientKey(key string) error { + _, err := age.ParseX25519Recipient(key) + return err }