Skip to content
Open
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
4 changes: 2 additions & 2 deletions packages/connect-examples/electron-example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "hardware-example",
"productName": "HardwareExample",
"executableName": "onekey-hardware-example",
"version": "1.1.26-alpha.12",
"version": "1.1.26-alpha.13",
"author": "OneKey",
"description": "End-to-end encrypted workspaces for teams",
"main": "dist/index.js",
Expand All @@ -22,7 +22,7 @@
"ts:check": "yarn tsc --noEmit"
},
"dependencies": {
"@onekeyfe/hd-transport-electron": "1.1.26-alpha.12",
"@onekeyfe/hd-transport-electron": "1.1.26-alpha.13",
"@stoprocent/noble": "2.3.16",
"debug": "4.3.4",
"electron-is-dev": "^3.0.1",
Expand Down
10 changes: 5 additions & 5 deletions packages/connect-examples/expo-example/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "expo-example",
"version": "1.1.26-alpha.12",
"version": "1.1.26-alpha.13",
"scripts": {
"start": "cross-env CONNECT_SRC=https://localhost:8087/ yarn expo start --dev-client",
"android": "yarn expo run:android",
Expand All @@ -19,10 +19,10 @@
"@noble/ed25519": "^2.1.0",
"@noble/hashes": "^1.3.3",
"@noble/secp256k1": "^1.7.1",
"@onekeyfe/hd-ble-sdk": "1.1.26-alpha.12",
"@onekeyfe/hd-common-connect-sdk": "1.1.26-alpha.12",
"@onekeyfe/hd-core": "1.1.26-alpha.12",
"@onekeyfe/hd-web-sdk": "1.1.26-alpha.12",
"@onekeyfe/hd-ble-sdk": "1.1.26-alpha.13",
"@onekeyfe/hd-common-connect-sdk": "1.1.26-alpha.13",
"@onekeyfe/hd-core": "1.1.26-alpha.13",
"@onekeyfe/hd-web-sdk": "1.1.26-alpha.13",
"@onekeyfe/react-native-ble-utils": "^0.1.3",
"@polkadot/util-crypto": "13.1.1",
"@react-native-async-storage/async-storage": "1.21.0",
Expand Down
8 changes: 4 additions & 4 deletions packages/connect-examples/expo-playground/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "onekey-hardware-playground",
"version": "1.1.26-alpha.12",
"version": "1.1.26-alpha.13",
"private": true,
"sideEffects": [
"app/utils/shim.js",
Expand All @@ -17,9 +17,9 @@
},
"dependencies": {
"@noble/hashes": "^1.8.0",
"@onekeyfe/hd-common-connect-sdk": "1.1.26-alpha.12",
"@onekeyfe/hd-core": "1.1.26-alpha.12",
"@onekeyfe/hd-shared": "1.1.26-alpha.12",
"@onekeyfe/hd-common-connect-sdk": "1.1.26-alpha.13",
"@onekeyfe/hd-core": "1.1.26-alpha.13",
"@onekeyfe/hd-shared": "1.1.26-alpha.13",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
Expand Down
99 changes: 99 additions & 0 deletions packages/core/__tests__/DeviceCommands.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { HardwareErrorCode } from '@onekeyfe/hd-shared';

import { DeviceCommands } from '../src/device/DeviceCommands';

jest.mock('../src/data/config', () => ({
getSDKVersion: jest.fn(() => '1.0.0'),
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
}));

const createCommands = () => {
const commands = Object.create(DeviceCommands.prototype) as DeviceCommands;
commands.device = {
clearCancelableAction: jest.fn(),
} as any;
return commands;
};

describe('DeviceCommands failure mapping', () => {
it.each([
['ButtonAck', 'Not in Ethereum signing mode'],
['PinMatrixAck', 'Not in Conflux signing mode'],
])('keeps %s unexpected message "%s" as firmware runtime error', async (callType, message) => {
const commands = createCommands();

await expect(
commands._filterCommonTypes(
{
type: 'Failure',
message: {
code: 'Failure_UnexpectedMessage',
message,
},
} as any,
callType as any
)
).rejects.toMatchObject({
errorCode: HardwareErrorCode.RuntimeError,
message: `Failure_UnexpectedMessage,${message}`,
});
});

it('keeps the existing NotInSigningMode mapping', async () => {
const commands = createCommands();

await expect(
commands._filterCommonTypes(
{
type: 'Failure',
message: {
code: 'Failure_UnexpectedMessage',
message: 'Not in Signing mode',
},
} as any,
'ButtonAck'
)
).rejects.toMatchObject({
errorCode: HardwareErrorCode.NotInSigningMode,
});
});

it('keeps the existing unexpected passphrase mapping', async () => {
const commands = createCommands();

await expect(
commands._filterCommonTypes(
{
type: 'Failure',
message: {
code: 'Failure_UnexpectedMessage',
message: 'Unexpected message',
},
} as any,
'PassphraseAck'
)
).rejects.toMatchObject({
errorCode: HardwareErrorCode.UnexpectPassphrase,
});
});

it('keeps non signing unexpected messages as runtime errors', async () => {
const commands = createCommands();

await expect(
commands._filterCommonTypes(
{
type: 'Failure',
message: {
code: 'Failure_UnexpectedMessage',
message: 'Not in Reset mode',
},
} as any,
'ButtonAck'
)
).rejects.toMatchObject({
errorCode: HardwareErrorCode.RuntimeError,
message: 'Failure_UnexpectedMessage,Not in Reset mode',
});
});
});
181 changes: 181 additions & 0 deletions packages/core/__tests__/evmLedgerLegacySafety.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
import AllNetworkGetAddressBase from '../src/api/allnetwork/AllNetworkGetAddressBase';
import EvmGetAddress from '../src/api/evm/EVMGetAddress';
import EVMGetPublicKey from '../src/api/evm/EVMGetPublicKey';
import { findMethod } from '../src/api/utils';

jest.mock('../src/data/config', () => ({
getSDKVersion: jest.fn(() => '1.0.0'),
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
}));

jest.mock('../src/api/utils', () => ({
findMethod: jest.fn(),
}));

const createDevice = (onekeyDeviceType: string) => {
const typedCall = jest.fn();
return {
typedCall,
device: {
features: {
onekey_device_type: onekeyDeviceType,
safety_checks: 'Strict',
},
commands: {
typedCall,
},
},
};
};

class TestAllNetworkMethod extends AllNetworkGetAddressBase {
async getAllNetworkAddress() {
return Promise.resolve([]);
}
}

describe('EVM Ledger legacy path safety checks', () => {
it.each([
['evmGetAddress', EvmGetAddress],
['evmGetPublicKey', EVMGetPublicKey],
])(
'temporarily relaxes safety checks for Pro %s on ledger legacy path index greater than 1',
async (methodName, Method) => {
const { device, typedCall } = createDevice('PRO');
const method = new Method({
id: 1,
payload: {
method: methodName,
path: "m/44'/60'/0'/2",
},
});
method.device = device as any;

await method.checkSafetyLevelOnTestNet();

expect(typedCall).toHaveBeenCalledWith('ApplySettings', 'Success', {
safety_checks: 'PromptTemporarily',
});
}
);

it('temporarily relaxes safety checks for Touch get public key on ledger legacy path index greater than 1', async () => {
const { device, typedCall } = createDevice('TOUCH');
const method = new EVMGetPublicKey({
id: 1,
payload: {
method: 'evmGetPublicKey',
path: "m/44'/60'/0'/2",
},
});
method.device = device as any;

await method.checkSafetyLevelOnTestNet();

expect(typedCall).toHaveBeenCalledWith('ApplySettings', 'Success', {
safety_checks: 'PromptTemporarily',
});
});

it('runs EVM safety checks when allNetwork dispatches to the inner get address method', async () => {
const { device, typedCall } = createDevice('PRO');
(findMethod as jest.Mock).mockImplementation(message => new EvmGetAddress(message));
const runSpy = jest.spyOn(EvmGetAddress.prototype, 'run').mockResolvedValue([
{
path: "m/44'/60'/0'/2",
address: '0x0000000000000000000000000000000000000000',
},
]);
const method = new TestAllNetworkMethod({
id: 1,
payload: {
method: 'allNetworkGetAddress',
connectId: 'connect-id',
deviceId: 'device-id',
bundle: [],
},
});
method.device = {
...device,
on: jest.fn(),
off: jest.fn(),
} as any;

await method.callMethod(
'evmGetAddress',
{
bundle: [
{
path: "m/44'/60'/0'/2",
showOnOneKey: false,
chainId: 1,
_originRequestParams: {
network: 'evm',
path: "m/44'/60'/0'/2",
showOnOneKey: false,
chainName: '1',
},
},
],
},
0
);

expect(typedCall).toHaveBeenCalledWith('ApplySettings', 'Success', {
safety_checks: 'PromptTemporarily',
});

runSpy.mockRestore();
});

it.each(["m/44'/60'/0'/0", "m/44'/60'/0'/1"])(
'keeps safety checks unchanged for legal ledger legacy path %s',
async path => {
const { device, typedCall } = createDevice('PRO');
const method = new EvmGetAddress({
id: 1,
payload: {
method: 'evmGetAddress',
path,
},
});
method.device = device as any;

await method.checkSafetyLevelOnTestNet();

expect(typedCall).not.toHaveBeenCalled();
}
);

it('keeps safety checks unchanged for standard 5-segment BIP44 paths', async () => {
const { device, typedCall } = createDevice('PRO');
const method = new EvmGetAddress({
id: 1,
payload: {
method: 'evmGetAddress',
path: "m/44'/60'/0'/0/2",
},
});
method.device = device as any;

await method.checkSafetyLevelOnTestNet();

expect(typedCall).not.toHaveBeenCalled();
});

it('keeps safety checks unchanged on non Pro/Touch devices', async () => {
const { device, typedCall } = createDevice('MINI');
const method = new EvmGetAddress({
id: 1,
payload: {
method: 'evmGetAddress',
path: "m/44'/60'/0'/2",
},
});
method.device = device as any;

await method.checkSafetyLevelOnTestNet();

expect(typedCall).not.toHaveBeenCalled();
});
});
6 changes: 3 additions & 3 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-core",
"version": "1.1.26-alpha.12",
"version": "1.1.26-alpha.13",
"description": "Core processes and APIs for communicating with OneKey hardware devices.",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
Expand All @@ -25,8 +25,8 @@
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
},
"dependencies": {
"@onekeyfe/hd-shared": "1.1.26-alpha.12",
"@onekeyfe/hd-transport": "1.1.26-alpha.12",
"@onekeyfe/hd-shared": "1.1.26-alpha.13",
"@onekeyfe/hd-transport": "1.1.26-alpha.13",
"axios": "1.15.2",
"bignumber.js": "^9.0.2",
"bytebuffer": "^5.0.1",
Expand Down
Loading
Loading