Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/keyring-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
### Changed
- Bump `@metamask/eth-keyring-controller` to `^15.1.0` ([#3617](https://github.com/MetaMask/core/pull/3617))

## [10.0.0]
### Changed
Expand Down
2 changes: 1 addition & 1 deletion packages/keyring-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"dependencies": {
"@keystonehq/metamask-airgapped-keyring": "^0.13.1",
"@metamask/base-controller": "^4.0.0",
"@metamask/eth-keyring-controller": "^15.0.0",
"@metamask/eth-keyring-controller": "^15.1.0",
"@metamask/message-manager": "^7.3.6",
"@metamask/preferences-controller": "^5.0.0",
"@metamask/utils": "^8.2.0",
Expand Down
8 changes: 5 additions & 3 deletions packages/keyring-controller/src/KeyringController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ import { bufferToHex } from 'ethereumjs-util';
import * as sinon from 'sinon';
import * as uuid from 'uuid';

import MockEncryptor, { mockKey } from '../tests/mocks/mockEncryptor';
import MockEncryptor, {
MOCK_ENCRYPTION_KEY,
} from '../tests/mocks/mockEncryptor';
import MockShallowGetAccountsKeyring from '../tests/mocks/mockShallowGetAccountsKeyring';
import type {
KeyringControllerEvents,
Expand Down Expand Up @@ -1411,7 +1413,7 @@ describe('KeyringController', () => {
{ cacheEncryptionKey: true },
async ({ controller, initialState }) => {
await controller.submitEncryptionKey(
mockKey.toString('hex'),
MOCK_ENCRYPTION_KEY,
initialState.encryptionSalt as string,
);
expect(controller.state).toStrictEqual(initialState);
Expand Down Expand Up @@ -2023,7 +2025,7 @@ describe('KeyringController', () => {
await signProcessKeyringController.setLocked();
// ..and unlocking it should add a new instance of QRKeyring
await signProcessKeyringController.submitEncryptionKey(
mockKey.toString('hex'),
MOCK_ENCRYPTION_KEY,
salt,
);
// We call `getQRKeyring` instead of `getOrAddQRKeyring` so that
Expand Down
59 changes: 46 additions & 13 deletions packages/keyring-controller/tests/mocks/mockEncryptor.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,61 @@
import type { ExportableKeyEncryptor } from '@metamask/eth-keyring-controller/dist/types';
import type { Json } from '@metamask/utils';

const mockHex = '0xabcdef0123456789';
export const mockKey = Buffer.alloc(32);
let cacheVal: any;
export const PASSWORD = 'password123';
export const MOCK_ENCRYPTION_KEY = JSON.stringify({
alg: 'A256GCM',
ext: true,
k: 'wYmxkxOOFBDP6F6VuuYFcRt_Po-tSLFHCWVolsHs4VI',
// eslint-disable-next-line @typescript-eslint/naming-convention
key_ops: ['encrypt', 'decrypt'],
kty: 'oct',
});
export const MOCK_ENCRYPTION_SALT =
'HQ5sfhsb8XAQRJtD+UqcImT7Ve4n3YMagrh05YTOsjk=';
export const MOCK_HARDCODED_KEY = 'key';
export const MOCK_HEX = '0xabcdef0123456789';
// eslint-disable-next-line no-restricted-globals
const MOCK_KEY = Buffer.alloc(32);
const INVALID_PASSWORD_ERROR = 'Incorrect password.';

let cacheVal: Json;

export default class MockEncryptor implements ExportableKeyEncryptor {
async encrypt(password: string, dataObj: any) {
return JSON.stringify({
...this.encryptWithKey(password, dataObj),
...(await this.encryptWithKey(password, dataObj)),
salt: this.generateSalt(),
});
}

async decrypt(_password: string, _text: string) {
return cacheVal || {};
if (_password && _password !== PASSWORD) {
throw new Error(INVALID_PASSWORD_ERROR);
}

return cacheVal ?? {};
}

async encryptWithKey(_key: unknown, dataObj: any) {
cacheVal = dataObj;
return {
data: mockHex,
data: MOCK_HEX,
iv: 'anIv',
};
}

async encryptWithDetail(key: string, dataObj: any) {
return {
vault: await this.encrypt(key, dataObj),
exportedKeyString: mockKey.toString('hex'),
exportedKeyString: MOCK_ENCRYPTION_KEY,
};
}

async decryptWithDetail(key: string, text: string) {
return {
vault: await this.decrypt(key, text),
salt: this.generateSalt(),
exportedKeyString: mockKey.toString('hex'),
salt: MOCK_ENCRYPTION_SALT,
exportedKeyString: MOCK_ENCRYPTION_KEY,
};
}

Expand All @@ -44,14 +64,27 @@ export default class MockEncryptor implements ExportableKeyEncryptor {
}

async keyFromPassword(_password: string) {
return mockKey;
return MOCK_KEY;
}

async importKey(key: string) {
if (key === '{}') {
throw new TypeError(
`Failed to execute 'importKey' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView or JsonWebKey)'.`,
);
}
return null;
}

async updateVault(_vault: string, _password: string) {
return _vault;
}

async importKey(_key: string) {
return {};
isVaultUpdated(_vault: string) {
return true;
}

generateSalt() {
return 'WHADDASALT!';
return MOCK_ENCRYPTION_SALT;
}
}
20 changes: 10 additions & 10 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1561,12 +1561,12 @@ __metadata:
languageName: node
linkType: hard

"@metamask/browser-passworder@npm:^4.2.0":
version: 4.2.0
resolution: "@metamask/browser-passworder@npm:4.2.0"
"@metamask/browser-passworder@npm:^4.3.0":
version: 4.3.0
resolution: "@metamask/browser-passworder@npm:4.3.0"
dependencies:
"@metamask/utils": ^8.2.0
checksum: 03b76357942d25a6316d6a03a8bc839cb18e53d9f95fc2787e0fbbcf13eeb2485ece47a2758e928d04635f8dbaa598794f2ecd0313e7c91f989bf11f2a0adec5
checksum: 7992553a0cd91902aa316a931d36c2628cb5a73fcbc28a31dce4177704036d739214c580ed833079003b2c7dfd60c5648a20734badf91e2c665cfe2f56012a8c
languageName: node
linkType: hard

Expand Down Expand Up @@ -1848,18 +1848,18 @@ __metadata:
languageName: unknown
linkType: soft

"@metamask/eth-keyring-controller@npm:^15.0.0":
version: 15.0.0
resolution: "@metamask/eth-keyring-controller@npm:15.0.0"
"@metamask/eth-keyring-controller@npm:^15.1.0":
version: 15.1.0
resolution: "@metamask/eth-keyring-controller@npm:15.1.0"
dependencies:
"@ethereumjs/tx": ^4.2.0
"@metamask/browser-passworder": ^4.2.0
"@metamask/browser-passworder": ^4.3.0
"@metamask/eth-hd-keyring": ^7.0.1
"@metamask/eth-sig-util": ^7.0.0
"@metamask/eth-simple-keyring": ^6.0.1
"@metamask/obs-store": ^8.1.0
"@metamask/utils": ^8.2.0
checksum: b878c47f58b06833584e933d4886be17c20766398e007d221bd252badf58ded8012ee41922116e9e8962ec3de00722d85a9e361f4d066c9c7d727a715c6831f7
checksum: edb0d4f393daac193d6d7a0a1ae5576990f0e262a64b88339b31fa5b5bc7f177a94c978a1f1c76d54880b497f869ba78db8fd09c52ea24d5cfbb296f16be64c0
languageName: node
linkType: hard

Expand Down Expand Up @@ -2059,7 +2059,7 @@ __metadata:
"@keystonehq/metamask-airgapped-keyring": ^0.13.1
"@metamask/auto-changelog": ^3.4.3
"@metamask/base-controller": ^4.0.0
"@metamask/eth-keyring-controller": ^15.0.0
"@metamask/eth-keyring-controller": ^15.1.0
"@metamask/eth-sig-util": ^7.0.1
"@metamask/message-manager": ^7.3.6
"@metamask/preferences-controller": ^5.0.0
Expand Down