@onekeyfe/hd-shared 1.1.32-alpha.4 → 1.1.34-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HardwareError.d.ts +1 -0
- package/dist/HardwareError.d.ts.map +1 -1
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +39 -6
- package/package.json +2 -2
- package/src/HardwareError.ts +6 -0
- package/src/constants.test.ts +60 -0
- package/src/constants.ts +44 -6
package/dist/HardwareError.d.ts
CHANGED
|
@@ -115,6 +115,7 @@ export declare const HardwareErrorCode: {
|
|
|
115
115
|
readonly DeviceSettingsLanguageNotSupport: 826;
|
|
116
116
|
readonly TooManyInputs: 827;
|
|
117
117
|
readonly PinMismatch: 828;
|
|
118
|
+
readonly KaspaPrevTxIdMismatch: 829;
|
|
118
119
|
readonly LowlevelTrasnportConnectError: 900;
|
|
119
120
|
readonly WebDeviceNotFoundOrNeedsPermission: 901;
|
|
120
121
|
readonly WebDevicePromptAccessError: 902;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HardwareError.d.ts","sourceRoot":"","sources":["../src/HardwareError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,KAAK,+BAA+B,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM;CAAE,CAAC;AAE5F,KAAK,cAAc,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAsCxD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,EAAE,cAAc,CAAkC;IAE3D,OAAO,SAAM;IAEb,MAAM,EAAE,GAAG,CAAM;gBAEL,aAAa,EAAE,cAAc,GAAG,MAAM;CAmBnD;AAED,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"HardwareError.d.ts","sourceRoot":"","sources":["../src/HardwareError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,KAAK,+BAA+B,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM;CAAE,CAAC;AAE5F,KAAK,cAAc,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAsCxD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,EAAE,cAAc,CAAkC;IAE3D,OAAO,SAAM;IAEb,MAAM,EAAE,GAAG,CAAM;gBAEL,aAAa,EAAE,cAAc,GAAG,MAAM;CAmBnD;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2apB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,+BAiJ7B,CAAC;AAEX,eAAO,MAAM,UAAU,kBACN,cAAc,GAAG,MAAM,YAC5B,MAAM,WACP,GAAG,kBAMb,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,GAAG,QAe1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,aAOtD,CAAC;AAGF,eAAO,MAAM,gCAAgC,QAAS,MAAM,KAAG,aAQ9D,CAAC;AAEF,QAAA,MAAM,uCAAuC;oBAM3B,MAAM;oBACN,MAAM;;;mBAcvB,CAAC;AAEF,QAAA,MAAM,sCAAsC;oBAM1B,MAAM;oBACN,MAAM;;;mBAcvB,CAAC;AAEF,QAAA,MAAM,yCAAyC,cAClC,MAAM,GAAG,SAAS,YACnB,MAAM,GAAG,SAAS,iBACb,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,oBACnB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,kBAsBF,CAAC;AAEF,QAAA,MAAM,6BAA6B,mBACjB,MAAM,qBACH,MAAM,eACZ,MAAM,kBAQpB,CAAC;AAEF,QAAA,MAAM,4BAA4B,aACtB,MAAM,aACL,MAAM,cACL,MAAM,cACN,MAAM,aACP,MAAM,kBAWlB,CAAC;AAEF,QAAA,MAAM,iCAAiC,eAAgB,MAAM,gBAAgB,aAAa,kBAItF,CAAC;AAEL,OAAO,EACL,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,6BAA6B,EAC7B,4BAA4B,EAC5B,iCAAiC,GAClC,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ export declare const ONEKEY_WEBUSB_FILTER: {
|
|
|
3
3
|
vendorId: number;
|
|
4
4
|
productId: number;
|
|
5
5
|
}[];
|
|
6
|
+
type WebUsbIdentityDescriptor = {
|
|
7
|
+
vendorId?: number;
|
|
8
|
+
productId?: number;
|
|
9
|
+
manufacturerName?: string | null;
|
|
10
|
+
};
|
|
11
|
+
export declare const isKnownTrezorWebUsbDevice: (descriptor: WebUsbIdentityDescriptor) => boolean;
|
|
6
12
|
export declare const ERROR_CODES_REQUIRE_RELEASE: readonly [106, 107, 109, 112, 805, 801, 802, 812];
|
|
7
13
|
export declare const ERROR_CODES_REQUIRE_DISCONNECT: readonly [106, 805];
|
|
8
14
|
export declare enum EOneKeyBleMessageKeys {
|
|
@@ -34,4 +40,5 @@ export declare const ONEKEY_WRITE_CHARACTERISTIC_UUID = "00000002-0000-1000-8000
|
|
|
34
40
|
export declare const ONEKEY_NOTIFY_CHARACTERISTIC_UUID = "00000003-0000-1000-8000-00805f9b34fb";
|
|
35
41
|
export declare const isHeaderChunk: (chunk: Buffer | Uint8Array) => boolean;
|
|
36
42
|
export declare const isOnekeyDevice: (name: string | null, id?: string) => boolean;
|
|
43
|
+
export {};
|
|
37
44
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,oBAAoB;;;GAOhC,CAAC;AAMF,eAAO,MAAM,2BAA2B,mDAS9B,CAAC;AAMX,eAAO,MAAM,8BAA8B,qBAGjC,CAAC;AAGX,oBAAY,qBAAqB;IAE/B,UAAU,uBAAuB;IACjC,iBAAiB,8BAA8B;IAC/C,aAAa,0BAA0B;IACvC,kBAAkB,+BAA+B;IACjD,cAAc,2BAA2B;IACzC,oBAAoB,iCAAiC;IAGrD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IAGrD,aAAa,0BAA0B;IACvC,oBAAoB,iCAAiC;IAGrD,uBAAuB,oCAAoC;IAC3D,sBAAsB,mCAAmC;IAGzD,mBAAmB,gCAAgC;IACnD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IACrD,iBAAiB,8BAA8B;IAC/C,oBAAoB,iCAAiC;IACrD,eAAe,4BAA4B;IAC3C,mBAAmB,gCAAgC;IACnD,qBAAqB,kCAAkC;IACvD,sBAAsB,mCAAmC;IACzD,wBAAwB,qCAAqC;CAC9D;AAED,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAC1E,eAAO,MAAM,gCAAgC,yCAAyC,CAAC;AACvF,eAAO,MAAM,iCAAiC,yCAAyC,CAAC;AAIxF,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,UAAU,KAAG,OAa1D,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,oBAAoB;;;GAOhC,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAIF,eAAO,MAAM,yBAAyB,eAAgB,wBAAwB,KAAG,OAQhF,CAAC;AAMF,eAAO,MAAM,2BAA2B,mDAS9B,CAAC;AAMX,eAAO,MAAM,8BAA8B,qBAGjC,CAAC;AAGX,oBAAY,qBAAqB;IAE/B,UAAU,uBAAuB;IACjC,iBAAiB,8BAA8B;IAC/C,aAAa,0BAA0B;IACvC,kBAAkB,+BAA+B;IACjD,cAAc,2BAA2B;IACzC,oBAAoB,iCAAiC;IAGrD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IAGrD,aAAa,0BAA0B;IACvC,oBAAoB,iCAAiC;IAGrD,uBAAuB,oCAAoC;IAC3D,sBAAsB,mCAAmC;IAGzD,mBAAmB,gCAAgC;IACnD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IACrD,iBAAiB,8BAA8B;IAC/C,oBAAoB,iCAAiC;IACrD,eAAe,4BAA4B;IAC3C,mBAAmB,gCAAgC;IACnD,qBAAqB,kCAAkC;IACvD,sBAAsB,mCAAmC;IACzD,wBAAwB,qCAAqC;CAC9D;AAED,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAC1E,eAAO,MAAM,gCAAgC,yCAAyC,CAAC;AACvF,eAAO,MAAM,iCAAiC,yCAAyC,CAAC;AAIxF,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,UAAU,KAAG,OAa1D,CAAC;AAkBF,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,IAAI,OAAO,MAAM,KAAG,OAgBjE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,12 @@ declare const ONEKEY_WEBUSB_FILTER: {
|
|
|
2
2
|
vendorId: number;
|
|
3
3
|
productId: number;
|
|
4
4
|
}[];
|
|
5
|
+
type WebUsbIdentityDescriptor = {
|
|
6
|
+
vendorId?: number;
|
|
7
|
+
productId?: number;
|
|
8
|
+
manufacturerName?: string | null;
|
|
9
|
+
};
|
|
10
|
+
declare const isKnownTrezorWebUsbDevice: (descriptor: WebUsbIdentityDescriptor) => boolean;
|
|
5
11
|
declare const ERROR_CODES_REQUIRE_RELEASE: readonly [106, 107, 109, 112, 805, 801, 802, 812];
|
|
6
12
|
declare const ERROR_CODES_REQUIRE_DISCONNECT: readonly [106, 805];
|
|
7
13
|
declare enum EOneKeyBleMessageKeys {
|
|
@@ -164,6 +170,7 @@ declare const HardwareErrorCode: {
|
|
|
164
170
|
readonly DeviceSettingsLanguageNotSupport: 826;
|
|
165
171
|
readonly TooManyInputs: 827;
|
|
166
172
|
readonly PinMismatch: 828;
|
|
173
|
+
readonly KaspaPrevTxIdMismatch: 829;
|
|
167
174
|
readonly LowlevelTrasnportConnectError: 900;
|
|
168
175
|
readonly WebDeviceNotFoundOrNeedsPermission: 901;
|
|
169
176
|
readonly WebDevicePromptAccessError: 902;
|
|
@@ -239,4 +246,4 @@ declare enum EDeviceType {
|
|
|
239
246
|
Pro = "pro"
|
|
240
247
|
}
|
|
241
248
|
|
|
242
|
-
export { CreateErrorByMessage, CreateHardwareErrorByBridgeError, Deferred, EDeviceType, EFirmwareType, EOneKeyBleMessageKeys, HardwareError$1 as ERRORS, ERROR_CODES_REQUIRE_DISCONNECT, ERROR_CODES_REQUIRE_RELEASE, HardwareError, HardwareErrorCode, HardwareErrorCodeMessage, IHardwareError, ONEKEY_NOTIFY_CHARACTERISTIC_UUID, ONEKEY_SERVICE_UUID, ONEKEY_WEBUSB_FILTER, ONEKEY_WRITE_CHARACTERISTIC_UUID, TypedError, createDefectiveFirmwareError, createDeferred, createDeprecatedHardwareError, createDeviceNotSupportMethodError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createNewFirmwareUnReleaseHardwareError, isHeaderChunk, isOnekeyDevice, serializeError, wait };
|
|
249
|
+
export { CreateErrorByMessage, CreateHardwareErrorByBridgeError, Deferred, EDeviceType, EFirmwareType, EOneKeyBleMessageKeys, HardwareError$1 as ERRORS, ERROR_CODES_REQUIRE_DISCONNECT, ERROR_CODES_REQUIRE_RELEASE, HardwareError, HardwareErrorCode, HardwareErrorCodeMessage, IHardwareError, ONEKEY_NOTIFY_CHARACTERISTIC_UUID, ONEKEY_SERVICE_UUID, ONEKEY_WEBUSB_FILTER, ONEKEY_WRITE_CHARACTERISTIC_UUID, TypedError, createDefectiveFirmwareError, createDeferred, createDeprecatedHardwareError, createDeviceNotSupportMethodError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createNewFirmwareUnReleaseHardwareError, isHeaderChunk, isKnownTrezorWebUsbDevice, isOnekeyDevice, serializeError, wait };
|
package/dist/index.js
CHANGED
|
@@ -164,6 +164,7 @@ const HardwareErrorCode = {
|
|
|
164
164
|
DeviceSettingsLanguageNotSupport: 826,
|
|
165
165
|
TooManyInputs: 827,
|
|
166
166
|
PinMismatch: 828,
|
|
167
|
+
KaspaPrevTxIdMismatch: 829,
|
|
167
168
|
LowlevelTrasnportConnectError: 900,
|
|
168
169
|
WebDeviceNotFoundOrNeedsPermission: 901,
|
|
169
170
|
WebDevicePromptAccessError: 902,
|
|
@@ -268,6 +269,7 @@ const HardwareErrorCodeMessage = {
|
|
|
268
269
|
[HardwareErrorCode.DeviceSettingsLanguageNotSupport]: 'Language not supported',
|
|
269
270
|
[HardwareErrorCode.TooManyInputs]: 'Too many inputs',
|
|
270
271
|
[HardwareErrorCode.PinMismatch]: 'PIN mismatch',
|
|
272
|
+
[HardwareErrorCode.KaspaPrevTxIdMismatch]: 'Kaspa previous transaction id mismatch',
|
|
271
273
|
[HardwareErrorCode.LowlevelTrasnportConnectError]: 'Lowlevel transport connect error',
|
|
272
274
|
[HardwareErrorCode.WebDeviceNotFoundOrNeedsPermission]: 'Web-USB or Web-Bluetooth device not found or needs permission',
|
|
273
275
|
[HardwareErrorCode.WebDevicePromptAccessError]: 'Web-USB or Web-Bluetooth device prompt access error',
|
|
@@ -386,6 +388,15 @@ const ONEKEY_WEBUSB_FILTER = [
|
|
|
386
388
|
{ vendorId: 0x1209, productId: 0x4f4a },
|
|
387
389
|
{ vendorId: 0x1209, productId: 0x4f4b },
|
|
388
390
|
];
|
|
391
|
+
const TREZOR_WEBUSB_MANUFACTURER_NAMES = new Set(['trezor', 'trezor company', 'satoshilabs']);
|
|
392
|
+
const isKnownTrezorWebUsbDevice = (descriptor) => {
|
|
393
|
+
var _a;
|
|
394
|
+
const isSharedWebUsbId = ONEKEY_WEBUSB_FILTER.some(filter => descriptor.vendorId === filter.vendorId && descriptor.productId === filter.productId);
|
|
395
|
+
if (!isSharedWebUsbId)
|
|
396
|
+
return false;
|
|
397
|
+
const manufacturerName = (_a = descriptor.manufacturerName) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase();
|
|
398
|
+
return manufacturerName != null && TREZOR_WEBUSB_MANUFACTURER_NAMES.has(manufacturerName);
|
|
399
|
+
};
|
|
389
400
|
const ERROR_CODES_REQUIRE_RELEASE = [
|
|
390
401
|
HardwareErrorCode.DeviceInitializeFailed,
|
|
391
402
|
HardwareErrorCode.DeviceInterruptedFromOutside,
|
|
@@ -441,16 +452,37 @@ const isHeaderChunk = (chunk) => {
|
|
|
441
452
|
}
|
|
442
453
|
return false;
|
|
443
454
|
};
|
|
444
|
-
const
|
|
445
|
-
|
|
446
|
-
|
|
455
|
+
const isKnownNonOneKeyDeviceName = (normalizedName) => normalizedName.startsWith('trezor') ||
|
|
456
|
+
normalizedName.startsWith('ledger') ||
|
|
457
|
+
normalizedName.startsWith('nano ') ||
|
|
458
|
+
normalizedName.startsWith('stax') ||
|
|
459
|
+
normalizedName.startsWith('flex');
|
|
460
|
+
const ONEKEY_EXACT_SHORT_NAMES = new Set(['s8']);
|
|
461
|
+
const isOneKeyShortName = (normalizedName) => {
|
|
462
|
+
if (ONEKEY_EXACT_SHORT_NAMES.has(normalizedName))
|
|
447
463
|
return true;
|
|
464
|
+
if (normalizedName.length !== 5)
|
|
465
|
+
return false;
|
|
466
|
+
const firstChar = normalizedName[0];
|
|
467
|
+
return (firstChar === 'k' || firstChar === 't') && /^\d{4}$/.test(normalizedName.slice(1));
|
|
468
|
+
};
|
|
469
|
+
const isOnekeyDevice = (name, id) => {
|
|
470
|
+
var _a, _b;
|
|
471
|
+
const normalizedName = (_a = name === null || name === void 0 ? void 0 : name.trim().toLowerCase()) !== null && _a !== void 0 ? _a : '';
|
|
472
|
+
if (isKnownNonOneKeyDeviceName(normalizedName)) {
|
|
473
|
+
return false;
|
|
448
474
|
}
|
|
449
|
-
|
|
450
|
-
if (name && re.exec(name)) {
|
|
475
|
+
if ((_b = id === null || id === void 0 ? void 0 : id.startsWith) === null || _b === void 0 ? void 0 : _b.call(id, 'MI')) {
|
|
451
476
|
return true;
|
|
452
477
|
}
|
|
453
|
-
|
|
478
|
+
if (!name) {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
if (normalizedName.startsWith('onekey') || normalizedName.startsWith('bixinkey'))
|
|
482
|
+
return true;
|
|
483
|
+
if (normalizedName.startsWith('touch ') || normalizedName.startsWith('pro '))
|
|
484
|
+
return true;
|
|
485
|
+
return isOneKeyShortName(normalizedName);
|
|
454
486
|
};
|
|
455
487
|
|
|
456
488
|
/******************************************************************************
|
|
@@ -546,6 +578,7 @@ exports.createNeedUpgradeFirmwareHardwareError = createNeedUpgradeFirmwareHardwa
|
|
|
546
578
|
exports.createNewFirmwareForceUpdateHardwareError = createNewFirmwareForceUpdateHardwareError;
|
|
547
579
|
exports.createNewFirmwareUnReleaseHardwareError = createNewFirmwareUnReleaseHardwareError;
|
|
548
580
|
exports.isHeaderChunk = isHeaderChunk;
|
|
581
|
+
exports.isKnownTrezorWebUsbDevice = isKnownTrezorWebUsbDevice;
|
|
549
582
|
exports.isOnekeyDevice = isOnekeyDevice;
|
|
550
583
|
exports.serializeError = serializeError;
|
|
551
584
|
exports.wait = wait;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-shared",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.34-alpha.0",
|
|
4
4
|
"description": "Hardware SDK's shared tool library",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Hardware-SDK",
|
|
@@ -25,5 +25,5 @@
|
|
|
25
25
|
"lint": "eslint .",
|
|
26
26
|
"lint:fix": "eslint . --fix"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "178851631a3d06dd52c8dd9df24cbaaff7aa6390"
|
|
29
29
|
}
|
package/src/HardwareError.ts
CHANGED
|
@@ -484,6 +484,11 @@ export const HardwareErrorCode = {
|
|
|
484
484
|
*/
|
|
485
485
|
PinMismatch: 828,
|
|
486
486
|
|
|
487
|
+
/**
|
|
488
|
+
* Device refused to sign: refTxs don't match the spent input's outpoint
|
|
489
|
+
*/
|
|
490
|
+
KaspaPrevTxIdMismatch: 829,
|
|
491
|
+
|
|
487
492
|
/**
|
|
488
493
|
* Lowlevel transport connect error
|
|
489
494
|
*/
|
|
@@ -635,6 +640,7 @@ export const HardwareErrorCodeMessage: HardwareErrorCodeMessageMapping = {
|
|
|
635
640
|
[HardwareErrorCode.DeviceSettingsLanguageNotSupport]: 'Language not supported',
|
|
636
641
|
[HardwareErrorCode.TooManyInputs]: 'Too many inputs',
|
|
637
642
|
[HardwareErrorCode.PinMismatch]: 'PIN mismatch',
|
|
643
|
+
[HardwareErrorCode.KaspaPrevTxIdMismatch]: 'Kaspa previous transaction id mismatch',
|
|
638
644
|
|
|
639
645
|
/**
|
|
640
646
|
* Lowlevel transport
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { isKnownTrezorWebUsbDevice, isOnekeyDevice } from './constants';
|
|
2
|
+
|
|
3
|
+
describe('hardware device identity filters', () => {
|
|
4
|
+
it('accepts known OneKey BLE names', () => {
|
|
5
|
+
expect(isOnekeyDevice('Touch A1B2')).toBe(true);
|
|
6
|
+
expect(isOnekeyDevice('Pro A1B2')).toBe(true);
|
|
7
|
+
expect(isOnekeyDevice('K1234')).toBe(true);
|
|
8
|
+
expect(isOnekeyDevice('S8')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('rejects known Trezor and Ledger BLE names from OneKey discovery', () => {
|
|
12
|
+
expect(isOnekeyDevice('Trezor Safe 7')).toBe(false);
|
|
13
|
+
expect(isOnekeyDevice('Ledger Nano X')).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('only filters WebUSB descriptors that are explicitly identified as Trezor', () => {
|
|
17
|
+
expect(
|
|
18
|
+
isKnownTrezorWebUsbDevice({
|
|
19
|
+
vendorId: 0x1209,
|
|
20
|
+
productId: 0x53c1,
|
|
21
|
+
manufacturerName: 'Trezor Company',
|
|
22
|
+
})
|
|
23
|
+
).toBe(true);
|
|
24
|
+
expect(
|
|
25
|
+
isKnownTrezorWebUsbDevice({
|
|
26
|
+
vendorId: 0x1209,
|
|
27
|
+
productId: 0x53c1,
|
|
28
|
+
manufacturerName: 'Trezor',
|
|
29
|
+
})
|
|
30
|
+
).toBe(true);
|
|
31
|
+
expect(
|
|
32
|
+
isKnownTrezorWebUsbDevice({
|
|
33
|
+
vendorId: 0x1209,
|
|
34
|
+
productId: 0x53c1,
|
|
35
|
+
manufacturerName: 'SatoshiLabs',
|
|
36
|
+
})
|
|
37
|
+
).toBe(true);
|
|
38
|
+
|
|
39
|
+
expect(
|
|
40
|
+
isKnownTrezorWebUsbDevice({
|
|
41
|
+
vendorId: 0x1209,
|
|
42
|
+
productId: 0x53c1,
|
|
43
|
+
manufacturerName: 'OneKey',
|
|
44
|
+
})
|
|
45
|
+
).toBe(false);
|
|
46
|
+
expect(
|
|
47
|
+
isKnownTrezorWebUsbDevice({
|
|
48
|
+
vendorId: 0x1209,
|
|
49
|
+
productId: 0x53c1,
|
|
50
|
+
})
|
|
51
|
+
).toBe(false);
|
|
52
|
+
expect(
|
|
53
|
+
isKnownTrezorWebUsbDevice({
|
|
54
|
+
vendorId: 0x1209,
|
|
55
|
+
productId: 0x53c1,
|
|
56
|
+
productName: 'Trezor Safe 7',
|
|
57
|
+
})
|
|
58
|
+
).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
});
|
package/src/constants.ts
CHANGED
|
@@ -9,6 +9,24 @@ export const ONEKEY_WEBUSB_FILTER = [
|
|
|
9
9
|
// { vendorId: 0x1209, productId: 0x4f50 }, // Touch Board
|
|
10
10
|
];
|
|
11
11
|
|
|
12
|
+
type WebUsbIdentityDescriptor = {
|
|
13
|
+
vendorId?: number;
|
|
14
|
+
productId?: number;
|
|
15
|
+
manufacturerName?: string | null;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const TREZOR_WEBUSB_MANUFACTURER_NAMES = new Set(['trezor', 'trezor company', 'satoshilabs']);
|
|
19
|
+
|
|
20
|
+
export const isKnownTrezorWebUsbDevice = (descriptor: WebUsbIdentityDescriptor): boolean => {
|
|
21
|
+
const isSharedWebUsbId = ONEKEY_WEBUSB_FILTER.some(
|
|
22
|
+
filter => descriptor.vendorId === filter.vendorId && descriptor.productId === filter.productId
|
|
23
|
+
);
|
|
24
|
+
if (!isSharedWebUsbId) return false;
|
|
25
|
+
|
|
26
|
+
const manufacturerName = descriptor.manufacturerName?.trim().toLowerCase();
|
|
27
|
+
return manufacturerName != null && TREZOR_WEBUSB_MANUFACTURER_NAMES.has(manufacturerName);
|
|
28
|
+
};
|
|
29
|
+
|
|
12
30
|
/**
|
|
13
31
|
* Error codes that require device release after occurrence
|
|
14
32
|
* These errors indicate the device is in an invalid state and needs to be released
|
|
@@ -89,16 +107,36 @@ export const isHeaderChunk = (chunk: Buffer | Uint8Array): boolean => {
|
|
|
89
107
|
return false;
|
|
90
108
|
};
|
|
91
109
|
|
|
110
|
+
const isKnownNonOneKeyDeviceName = (normalizedName: string): boolean =>
|
|
111
|
+
normalizedName.startsWith('trezor') ||
|
|
112
|
+
normalizedName.startsWith('ledger') ||
|
|
113
|
+
normalizedName.startsWith('nano ') ||
|
|
114
|
+
normalizedName.startsWith('stax') ||
|
|
115
|
+
normalizedName.startsWith('flex');
|
|
116
|
+
|
|
117
|
+
const ONEKEY_EXACT_SHORT_NAMES = new Set(['s8']);
|
|
118
|
+
|
|
119
|
+
const isOneKeyShortName = (normalizedName: string): boolean => {
|
|
120
|
+
if (ONEKEY_EXACT_SHORT_NAMES.has(normalizedName)) return true;
|
|
121
|
+
if (normalizedName.length !== 5) return false;
|
|
122
|
+
const firstChar = normalizedName[0];
|
|
123
|
+
return (firstChar === 'k' || firstChar === 't') && /^\d{4}$/.test(normalizedName.slice(1));
|
|
124
|
+
};
|
|
125
|
+
|
|
92
126
|
export const isOnekeyDevice = (name: string | null, id?: string): boolean => {
|
|
127
|
+
const normalizedName = name?.trim().toLowerCase() ?? '';
|
|
128
|
+
if (isKnownNonOneKeyDeviceName(normalizedName)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
|
|
93
132
|
if (id?.startsWith?.('MI')) {
|
|
94
133
|
return true;
|
|
95
134
|
}
|
|
96
135
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const re = /(BixinKey\d{10})|(K\d{4})|(T\d{4})|(Touch\s\w{4})|(Pro\s\w{4})/i;
|
|
100
|
-
if (name && re.exec(name)) {
|
|
101
|
-
return true;
|
|
136
|
+
if (!name) {
|
|
137
|
+
return false;
|
|
102
138
|
}
|
|
103
|
-
return
|
|
139
|
+
if (normalizedName.startsWith('onekey') || normalizedName.startsWith('bixinkey')) return true;
|
|
140
|
+
if (normalizedName.startsWith('touch ') || normalizedName.startsWith('pro ')) return true;
|
|
141
|
+
return isOneKeyShortName(normalizedName);
|
|
104
142
|
};
|