@onekeyfe/hd-core 1.2.0-alpha.110 → 1.2.0-alpha.112

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.
Files changed (35) hide show
  1. package/__tests__/DeviceCommands.test.ts +2 -2
  2. package/__tests__/device-lifecycle-events.test.ts +1 -1
  3. package/__tests__/device-state-mapper.test.ts +4 -4
  4. package/__tests__/device-utils.test.ts +1 -1
  5. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +0 -54
  6. package/__tests__/firmware-update/firmware-update-v4-install-poll.test.ts +36 -89
  7. package/__tests__/get-device-state.test.ts +8 -8
  8. package/__tests__/protocol-v2-resources.test.ts +20 -0
  9. package/__tests__/protocol-v2.test.ts +219 -240
  10. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  11. package/dist/api/FirmwareUpdateV4.d.ts +0 -3
  12. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  13. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +1 -1
  14. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -1
  15. package/dist/index.d.ts +5 -20
  16. package/dist/index.js +139 -226
  17. package/dist/protocols/protocol-v2/features.d.ts +4 -4
  18. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -1
  19. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -1
  20. package/dist/types/settings.d.ts +4 -19
  21. package/dist/types/settings.d.ts.map +1 -1
  22. package/dist/utils/patch.d.ts +1 -1
  23. package/dist/utils/patch.d.ts.map +1 -1
  24. package/package.json +4 -4
  25. package/src/api/FirmwareUpdateV3.ts +16 -23
  26. package/src/api/FirmwareUpdateV4.ts +85 -178
  27. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +1 -1
  28. package/src/api/protocol-v2/DeviceInfoGet.ts +3 -3
  29. package/src/data/messages/messages-protocol-v2.json +31 -14
  30. package/src/device/DeviceStateMapper.ts +15 -15
  31. package/src/deviceProfile/buildDeviceFeatures.ts +3 -3
  32. package/src/protocols/protocol-v2/features.ts +6 -6
  33. package/src/protocols/protocol-v2/resources.ts +10 -49
  34. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +1 -0
  35. package/src/types/settings.ts +4 -19
package/dist/index.js CHANGED
@@ -27499,9 +27499,10 @@ var nested = {
27499
27499
  MessageType_FilesystemDirMake: 60809,
27500
27500
  MessageType_FilesystemDirRemove: 60810,
27501
27501
  MessageType_FilesystemFormat: 60811,
27502
- MessageType_DeviceFirmwareUpdateRequest: 61000,
27503
- MessageType_DeviceFirmwareUpdateStatusGet: 61001,
27504
- MessageType_DeviceFirmwareUpdateStatus: 61002,
27502
+ MessageType_DeviceFirmwareUpdateStage: 61000,
27503
+ MessageType_DeviceFirmwareUpdateRequest: 61001,
27504
+ MessageType_DeviceFirmwareUpdateStatusGet: 61002,
27505
+ MessageType_DeviceFirmwareUpdateStatus: 61003,
27505
27506
  MessageType_DeviceSessionGet: 61200,
27506
27507
  MessageType_DeviceSession: 61201,
27507
27508
  MessageType_DeviceSessionAskPin: 61202,
@@ -38003,7 +38004,7 @@ var nested = {
38003
38004
  type: "bytes",
38004
38005
  id: 1
38005
38006
  },
38006
- signing_message: {
38007
+ signning_message: {
38007
38008
  type: "bytes",
38008
38009
  id: 2
38009
38010
  },
@@ -38897,14 +38898,14 @@ var nested = {
38897
38898
  type: "string",
38898
38899
  id: 2
38899
38900
  },
38900
- burn_in_completed: {
38901
- type: "bool",
38902
- id: 3
38903
- },
38904
38901
  factory_test_completed: {
38905
38902
  type: "bool",
38906
38903
  id: 4
38907
38904
  },
38905
+ factory_burn_in_completed: {
38906
+ type: "bool",
38907
+ id: 3
38908
+ },
38908
38909
  manufacture_time: {
38909
38910
  type: "DeviceFactoryInfoManufactureTime",
38910
38911
  id: 5
@@ -38991,7 +38992,7 @@ var nested = {
38991
38992
  }
38992
38993
  }
38993
38994
  },
38994
- DeviceFirmwareUpdateRequest: {
38995
+ DeviceFirmwareUpdateStage: {
38995
38996
  fields: {
38996
38997
  targets: {
38997
38998
  rule: "repeated",
@@ -39000,6 +39001,10 @@ var nested = {
39000
39001
  }
39001
39002
  }
39002
39003
  },
39004
+ DeviceFirmwareUpdateRequest: {
39005
+ fields: {
39006
+ }
39007
+ },
39003
39008
  DeviceFirmwareUpdateRecord: {
39004
39009
  fields: {
39005
39010
  target_id: {
@@ -39181,7 +39186,7 @@ var nested = {
39181
39186
  type: "bool",
39182
39187
  id: 100
39183
39188
  },
39184
- fw: {
39189
+ main_mcu: {
39185
39190
  type: "bool",
39186
39191
  id: 200
39187
39192
  },
@@ -39250,7 +39255,7 @@ var nested = {
39250
39255
  type: "DeviceHardwareInfo",
39251
39256
  id: 100
39252
39257
  },
39253
- fw: {
39258
+ main_mcu: {
39254
39259
  type: "DeviceMainMcuInfo",
39255
39260
  id: 200
39256
39261
  },
@@ -39792,9 +39797,12 @@ var nested = {
39792
39797
  id: 1
39793
39798
  },
39794
39799
  text: {
39795
- rule: "required",
39796
39800
  type: "string",
39797
39801
  id: 2
39802
+ },
39803
+ text_id: {
39804
+ type: "uint32",
39805
+ id: 3
39798
39806
  }
39799
39807
  }
39800
39808
  },
@@ -39825,7 +39833,6 @@ var nested = {
39825
39833
  ViewSignPage: {
39826
39834
  fields: {
39827
39835
  title: {
39828
- rule: "required",
39829
39836
  type: "string",
39830
39837
  id: 1
39831
39838
  },
@@ -39859,13 +39866,16 @@ var nested = {
39859
39866
  options: {
39860
39867
  "default": "LayoutDefault"
39861
39868
  }
39869
+ },
39870
+ title_id: {
39871
+ type: "uint32",
39872
+ id: 8
39862
39873
  }
39863
39874
  }
39864
39875
  },
39865
39876
  ViewVerifyPage: {
39866
39877
  fields: {
39867
39878
  title: {
39868
- rule: "required",
39869
39879
  type: "string",
39870
39880
  id: 1
39871
39881
  },
@@ -39890,6 +39900,14 @@ var nested = {
39890
39900
  value_key: {
39891
39901
  type: "uint32",
39892
39902
  id: 6
39903
+ },
39904
+ title_id: {
39905
+ type: "uint32",
39906
+ id: 7
39907
+ },
39908
+ chain_id: {
39909
+ type: "uint32",
39910
+ id: 8
39893
39911
  }
39894
39912
  }
39895
39913
  },
@@ -40736,7 +40754,9 @@ function parseProtocolV2ResourceManifestFile(value, index) {
40736
40754
  }
40737
40755
  const file = value;
40738
40756
  const archivePath = assertManifestRelativePath(file.archive_path, `files[${index}].archive_path`);
40739
- const originalName = assertManifestRelativePath(file.original_name, `files[${index}].original_name`);
40757
+ const originalName = file.original_name === undefined
40758
+ ? (_a = archivePath.split('/').pop()) !== null && _a !== void 0 ? _a : archivePath
40759
+ : assertManifestRelativePath(file.original_name, `files[${index}].original_name`);
40740
40760
  if (originalName.includes('/')) {
40741
40761
  throw new Error(`Invalid Pro2 resource manifest files[${index}].original_name`);
40742
40762
  }
@@ -40748,74 +40768,28 @@ function parseProtocolV2ResourceManifestFile(value, index) {
40748
40768
  throw new Error(`Invalid Pro2 resource manifest files[${index}].size`);
40749
40769
  }
40750
40770
  const digest = normalizeHex$1(file.sha256, SHA256_HEX_LENGTH, `files[${index}].sha256`);
40751
- if (file.signed !== true) {
40752
- throw new Error(`Invalid Pro2 resource manifest files[${index}].signed`);
40753
- }
40754
- if (file.sig_algo !== 'ed25519' && file.sig_algo !== 'mldsa65') {
40755
- throw new Error(`Invalid Pro2 resource manifest files[${index}].sig_algo`);
40756
- }
40757
- if (file.payload_version !== null && typeof file.payload_version !== 'string') {
40758
- throw new Error(`Invalid Pro2 resource manifest files[${index}].payload_version`);
40759
- }
40760
40771
  if (!archivePath.endsWith('.okpkg') || !originalName.endsWith('.okpkg')) {
40761
40772
  throw new Error(`Invalid Pro2 resource manifest files[${index}] package extension`);
40762
40773
  }
40763
- return {
40764
- archive_path: archivePath,
40765
- original_name: originalName,
40766
- device_path: devicePath,
40767
- size: Number(file.size),
40768
- sha256: digest,
40769
- signed: true,
40770
- sig_algo: file.sig_algo,
40771
- payload_version: (_a = file.payload_version) !== null && _a !== void 0 ? _a : null,
40772
- };
40774
+ return Object.assign(Object.assign(Object.assign({ archive_path: archivePath, original_name: originalName, device_path: devicePath, size: Number(file.size), sha256: digest }, (file.signed === undefined ? {} : { signed: file.signed })), (file.sig_algo === undefined ? {} : { sig_algo: file.sig_algo })), (file.payload_version === undefined ? {} : { payload_version: file.payload_version }));
40773
40775
  }
40774
40776
  function parseProtocolV2ResourceManifest(value) {
40775
40777
  if (!value || typeof value !== 'object' || Array.isArray(value)) {
40776
40778
  throw new Error('Invalid Pro2 resource manifest');
40777
40779
  }
40778
40780
  const manifest = value;
40779
- if (manifest.schema !== 1 ||
40780
- manifest.variant !== 'resource' ||
40781
- manifest.device_root !== 'vol0:' ||
40782
- manifest.restore_mode !== 'bootloader_update' ||
40783
- !Array.isArray(manifest.trees) ||
40784
- !Array.isArray(manifest.files)) {
40785
- throw new Error('Invalid Pro2 resource manifest contract');
40781
+ if (!Array.isArray(manifest.files)) {
40782
+ throw new Error('Invalid Pro2 resource manifest files');
40786
40783
  }
40787
40784
  const files = manifest.files.map(parseProtocolV2ResourceManifestFile);
40788
40785
  const devicePaths = new Set(files.map(file => file.device_path));
40789
40786
  const archivePaths = new Set(files.map(file => file.archive_path));
40790
40787
  if (files.length === 0 ||
40791
40788
  devicePaths.size !== files.length ||
40792
- archivePaths.size !== files.length ||
40793
- !devicePaths.has(PROTOCOL_V2_BOOT_RESOURCE_PACKAGE_PATH$1) ||
40794
- !files.some(file => file.device_path.startsWith('vol0:/bundles/'))) {
40789
+ archivePaths.size !== files.length) {
40795
40790
  throw new Error('Invalid Pro2 resource manifest file set');
40796
40791
  }
40797
40792
  return {
40798
- schema: 1,
40799
- artifact_name: assertManifestString(manifest.artifact_name, 'artifact_name'),
40800
- release_name: assertManifestString(manifest.release_name, 'release_name'),
40801
- variant: 'resource',
40802
- commit: assertManifestString(manifest.commit, 'commit'),
40803
- short_sha: assertManifestString(manifest.short_sha, 'short_sha'),
40804
- timestamp_utc: assertManifestString(manifest.timestamp_utc, 'timestamp_utc'),
40805
- core_version: assertManifestString(manifest.core_version, 'core_version'),
40806
- key_set: assertManifestString(manifest.key_set, 'key_set'),
40807
- device_root: 'vol0:',
40808
- restore_mode: 'bootloader_update',
40809
- trees: manifest.trees.map((tree, index) => {
40810
- if (!tree || typeof tree !== 'object') {
40811
- throw new Error(`Invalid Pro2 resource manifest trees[${index}]`);
40812
- }
40813
- const item = tree;
40814
- return {
40815
- path: assertManifestRelativePath(item.path, `trees[${index}].path`),
40816
- device: assertManifestString(item.device, `trees[${index}].device`),
40817
- };
40818
- }),
40819
40793
  files,
40820
40794
  };
40821
40795
  }
@@ -44250,10 +44224,10 @@ const getProtocolV2RuntimeMode = (protocolInfo, deviceInfo) => {
44250
44224
  return 'normal';
44251
44225
  if (binary)
44252
44226
  return binary;
44253
- if (isLegacyProtocolV2ProtocolInfo(protocolInfo) && !((_b = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.fw) === null || _b === void 0 ? void 0 : _b.application)) {
44254
- if ((_c = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.fw) === null || _c === void 0 ? void 0 : _c.romloader)
44227
+ if (isLegacyProtocolV2ProtocolInfo(protocolInfo) && !((_b = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.main_mcu) === null || _b === void 0 ? void 0 : _b.application)) {
44228
+ if ((_c = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.main_mcu) === null || _c === void 0 ? void 0 : _c.romloader)
44255
44229
  return 'romloader';
44256
- if ((_d = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.fw) === null || _d === void 0 ? void 0 : _d.bootloader)
44230
+ if ((_d = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.main_mcu) === null || _d === void 0 ? void 0 : _d.bootloader)
44257
44231
  return 'bootloader';
44258
44232
  }
44259
44233
  return undefined;
@@ -44263,7 +44237,7 @@ const supportsProtocolV2Message = (protocolInfo, messageType) => protocolInfo.su
44263
44237
  const PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST = {
44264
44238
  targets: {
44265
44239
  hw: true,
44266
- fw: true,
44240
+ main_mcu: true,
44267
44241
  coprocessor: true,
44268
44242
  },
44269
44243
  types: {
@@ -44274,7 +44248,7 @@ const PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST = {
44274
44248
  const PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST = {
44275
44249
  targets: {
44276
44250
  hw: true,
44277
- fw: true,
44251
+ main_mcu: true,
44278
44252
  coprocessor: true,
44279
44253
  se1: true,
44280
44254
  se2: true,
@@ -44289,7 +44263,7 @@ const PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST = {
44289
44263
  const PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST = {
44290
44264
  targets: {
44291
44265
  hw: true,
44292
- fw: true,
44266
+ main_mcu: true,
44293
44267
  coprocessor: true,
44294
44268
  se1: true,
44295
44269
  se2: true,
@@ -44556,11 +44530,11 @@ const mapProtocolV2DeviceInfoToState = (info, mode = 'unknown') => {
44556
44530
  }
44557
44531
  : { mode },
44558
44532
  versions: definedEntries({
44559
- firmware: imageVersion((_d = info.fw) === null || _d === void 0 ? void 0 : _d.application),
44560
- applicationP1: imageVersion((_e = info.fw) === null || _e === void 0 ? void 0 : _e.application),
44561
- applicationP2: imageVersion((_f = info.fw) === null || _f === void 0 ? void 0 : _f.application_data),
44562
- bootloader: imageVersion((_g = info.fw) === null || _g === void 0 ? void 0 : _g.bootloader),
44563
- board: imageVersion((_h = info.fw) === null || _h === void 0 ? void 0 : _h.romloader),
44533
+ firmware: imageVersion((_d = info.main_mcu) === null || _d === void 0 ? void 0 : _d.application),
44534
+ applicationP1: imageVersion((_e = info.main_mcu) === null || _e === void 0 ? void 0 : _e.application),
44535
+ applicationP2: imageVersion((_f = info.main_mcu) === null || _f === void 0 ? void 0 : _f.application_data),
44536
+ bootloader: imageVersion((_g = info.main_mcu) === null || _g === void 0 ? void 0 : _g.bootloader),
44537
+ board: imageVersion((_h = info.main_mcu) === null || _h === void 0 ? void 0 : _h.romloader),
44564
44538
  ble: imageVersion((_j = info.coprocessor) === null || _j === void 0 ? void 0 : _j.application),
44565
44539
  se01: imageVersion((_k = info.se1) === null || _k === void 0 ? void 0 : _k.application),
44566
44540
  se02: imageVersion((_l = info.se2) === null || _l === void 0 ? void 0 : _l.application),
@@ -44572,16 +44546,16 @@ const mapProtocolV2DeviceInfoToState = (info, mode = 'unknown') => {
44572
44546
  se04Boot: imageVersion((_s = info.se4) === null || _s === void 0 ? void 0 : _s.bootloader),
44573
44547
  }),
44574
44548
  verification: definedEntries({
44575
- firmwareBuildId: imageBuildId((_t = info.fw) === null || _t === void 0 ? void 0 : _t.application),
44576
- firmwareHash: imageHash((_u = info.fw) === null || _u === void 0 ? void 0 : _u.application),
44577
- applicationP1BuildId: imageBuildId((_v = info.fw) === null || _v === void 0 ? void 0 : _v.application),
44578
- applicationP1Hash: imageHash((_w = info.fw) === null || _w === void 0 ? void 0 : _w.application),
44579
- applicationP2BuildId: imageBuildId((_x = info.fw) === null || _x === void 0 ? void 0 : _x.application_data),
44580
- applicationP2Hash: imageHash((_y = info.fw) === null || _y === void 0 ? void 0 : _y.application_data),
44581
- bootloaderBuildId: imageBuildId((_z = info.fw) === null || _z === void 0 ? void 0 : _z.bootloader),
44582
- bootloaderHash: imageHash((_0 = info.fw) === null || _0 === void 0 ? void 0 : _0.bootloader),
44583
- boardBuildId: imageBuildId((_1 = info.fw) === null || _1 === void 0 ? void 0 : _1.romloader),
44584
- boardHash: imageHash((_2 = info.fw) === null || _2 === void 0 ? void 0 : _2.romloader),
44549
+ firmwareBuildId: imageBuildId((_t = info.main_mcu) === null || _t === void 0 ? void 0 : _t.application),
44550
+ firmwareHash: imageHash((_u = info.main_mcu) === null || _u === void 0 ? void 0 : _u.application),
44551
+ applicationP1BuildId: imageBuildId((_v = info.main_mcu) === null || _v === void 0 ? void 0 : _v.application),
44552
+ applicationP1Hash: imageHash((_w = info.main_mcu) === null || _w === void 0 ? void 0 : _w.application),
44553
+ applicationP2BuildId: imageBuildId((_x = info.main_mcu) === null || _x === void 0 ? void 0 : _x.application_data),
44554
+ applicationP2Hash: imageHash((_y = info.main_mcu) === null || _y === void 0 ? void 0 : _y.application_data),
44555
+ bootloaderBuildId: imageBuildId((_z = info.main_mcu) === null || _z === void 0 ? void 0 : _z.bootloader),
44556
+ bootloaderHash: imageHash((_0 = info.main_mcu) === null || _0 === void 0 ? void 0 : _0.bootloader),
44557
+ boardBuildId: imageBuildId((_1 = info.main_mcu) === null || _1 === void 0 ? void 0 : _1.romloader),
44558
+ boardHash: imageHash((_2 = info.main_mcu) === null || _2 === void 0 ? void 0 : _2.romloader),
44585
44559
  bleBuildId: imageBuildId((_3 = info.coprocessor) === null || _3 === void 0 ? void 0 : _3.application),
44586
44560
  bleHash: imageHash((_4 = info.coprocessor) === null || _4 === void 0 ? void 0 : _4.application),
44587
44561
  se01BuildId: imageBuildId((_5 = info.se1) === null || _5 === void 0 ? void 0 : _5.application),
@@ -51318,18 +51292,12 @@ class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod {
51318
51292
  try {
51319
51293
  const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
51320
51294
  const timeoutMs = 3000;
51321
- const isBrowserWebUsb = DataManager.isBrowserWebUsb(DataManager.getSettings('env'));
51322
- const getFeaturesPromise = isBrowserWebUsb
51323
- ? typedCall('GetFeatures', 'Features', {}, { timeoutMs })
51324
- : typedCall('GetFeatures', 'Features', {});
51325
- const featuresRes = isBrowserWebUsb
51326
- ? yield getFeaturesPromise
51327
- : yield Promise.race([
51328
- getFeaturesPromise,
51329
- new Promise((_, reject) => {
51330
- setTimeout(() => reject(hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.CallMethodNotResponse, 'GetFeatures timeout', { method: 'GetFeatures', timeoutMs })), timeoutMs);
51331
- }),
51332
- ]);
51295
+ const featuresRes = yield Promise.race([
51296
+ typedCall('GetFeatures', 'Features', {}),
51297
+ new Promise((_, reject) => {
51298
+ setTimeout(() => reject(hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.CallMethodNotResponse, 'GetFeatures timeout', { method: 'GetFeatures', timeoutMs })), timeoutMs);
51299
+ }),
51300
+ ]);
51333
51301
  getFeaturesTimeoutCount = 0;
51334
51302
  const features = buildProtocolV1FeaturesPayload(featuresRes.message, this.device.features);
51335
51303
  const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
@@ -51676,7 +51644,6 @@ const PROTOCOL_V2_BOOTLOADER_RECONNECT_TIMEOUT = 90 * 1000;
51676
51644
  const PROTOCOL_V2_FINAL_RECONNECT_TIMEOUT = 3 * 60 * 1000;
51677
51645
  const PROTOCOL_V2_SHORT_RESPONSE_TIMEOUT = 5 * 1000;
51678
51646
  const PROTOCOL_V2_FIRMWARE_STATUS_RESPONSE_TIMEOUT = 15 * 1000;
51679
- const PROTOCOL_V2_START_UPDATE_TIMEOUT = 3 * 60 * 1000;
51680
51647
  const PROTOCOL_V2_INSTALL_TIMEOUT = 8 * 60 * 1000;
51681
51648
  const PROTOCOL_V2_MISSING_TARGET_STATUS_GRACE_TIMEOUT = 30 * 1000;
51682
51649
  const PROTOCOL_V2_TARGET_STATUS_PENDING = 0;
@@ -51699,6 +51666,10 @@ const PROTOCOL_V2_OKPP_HASH_SIZE = 64;
51699
51666
  const PROTOCOL_V2_RESOURCE_MANIFEST_MAX_BYTES = 1024 * 1024;
51700
51667
  const PROTOCOL_V2_RESOURCE_FILE_MAX_COUNT = 512;
51701
51668
  const PROTOCOL_V2_RESOURCE_TOTAL_MAX_BYTES = 256 * 1024 * 1024;
51669
+ const getProtocolV2LocalResourceArchivePath = (entryName) => {
51670
+ const match = entryName.match(/(?:^|\/)((?:bundles\/|loaders\/(?:bootloader|rom)\/).+\.okpkg)$/iu);
51671
+ return match === null || match === void 0 ? void 0 : match[1];
51672
+ };
51702
51673
  const PROTOCOL_V2_NEO_UNSUPPORTED_TARGETS = new Set(['se03', 'se04']);
51703
51674
  const getProtocolV2ZipEntrySizes = (entry) => {
51704
51675
  var _a;
@@ -51742,14 +51713,11 @@ function assertProtocolV2FirmwareTargetsSupported(deviceType, params, hasExplici
51742
51713
  }
51743
51714
  const getProtocolV2DeviceTransferProgress = (bytesBeforeChunk, bytesAfterChunk, totalBytes) => {
51744
51715
  if (!Number.isFinite(totalBytes) || totalBytes <= 0) {
51745
- return 100;
51716
+ return 0;
51746
51717
  }
51747
51718
  if (bytesBeforeChunk <= 0 && bytesAfterChunk < totalBytes) {
51748
51719
  return 0;
51749
51720
  }
51750
- if (bytesAfterChunk >= totalBytes) {
51751
- return 100;
51752
- }
51753
51721
  return Math.min(Math.max(Math.ceil((bytesAfterChunk / totalBytes) * 100), 1), 99);
51754
51722
  };
51755
51723
  const PROTOCOL_V2_REMOTE_COMPONENT_TARGETS = {
@@ -51837,36 +51805,12 @@ const isProtocolV2ReconnectProbeError = (error) => {
51837
51805
  return ((message.includes('device protocol mismatch') && message.includes('expected v2')) ||
51838
51806
  message.includes('did not respond to expected protocol'));
51839
51807
  };
51840
- const PROTOCOL_V2_BLE_INSTALL_INTERRUPTION_ERROR_CODES = new Set([
51841
- hdShared.HardwareErrorCode.BleConnectedError,
51842
- hdShared.HardwareErrorCode.BleCharacteristicNotifyError,
51843
- hdShared.HardwareErrorCode.BleForceCleanRunPromise,
51844
- hdShared.HardwareErrorCode.BleDeviceDisconnected,
51845
- ]);
51846
- const isProtocolV2BleInstallInterruptionError = (error) => {
51847
- if (error instanceof hdShared.HardwareError &&
51848
- PROTOCOL_V2_BLE_INSTALL_INTERRUPTION_ERROR_CODES.has(error.errorCode)) {
51849
- return true;
51850
- }
51851
- const message = getProtocolV2UnknownErrorText(error).toLowerCase();
51852
- const compactMessage = message.replace(/\s+/gu, '');
51853
- return (/react native ble transport (?:released|disconnected)/u.test(message) ||
51854
- (compactMessage.includes('rxerrorerror6') &&
51855
- (compactMessage.includes('multiplatformbleadapter') ||
51856
- compactMessage.includes('multipalformebleadapter'))));
51857
- };
51858
51808
  const isProtocolV2FirmwareStatusEndpointUnavailable = (error) => {
51859
51809
  const message = getProtocolV2UnknownErrorText(error).toLowerCase();
51860
51810
  return (message.includes('handler not registered') ||
51861
51811
  message.includes('message handler not found') ||
51862
51812
  message.includes('unsupported message'));
51863
51813
  };
51864
- const isProtocolV2FirmwareUpdateEndpointUnavailable = (error) => {
51865
- const message = getProtocolV2UnknownErrorText(error).toLowerCase();
51866
- return (message.includes('handler not registered') ||
51867
- message.includes('message handler not found') ||
51868
- message.includes('unsupported message'));
51869
- };
51870
51814
  const isProtocolV2TerminalInstallStatusError = (error) => {
51871
51815
  var _a;
51872
51816
  return error instanceof hdShared.HardwareError &&
@@ -51999,11 +51943,9 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
51999
51943
  this.protocolV2HasExplicitTargetSelection = false;
52000
51944
  this.protocolV2PreparedSources = [];
52001
51945
  this.protocolV2ExecutionInLoader = false;
52002
- this.protocolV2LegacyDirectUpdate = false;
52003
51946
  this.protocolV2BootResourceStagingSafe = false;
52004
51947
  this.protocolV2CompletedTargetVersions = new Map();
52005
51948
  this.protocolV2FinalStatusVerified = false;
52006
- this.protocolV2InstallAckReceived = false;
52007
51949
  this.protocolV2InstallBaselineVersions = new Map();
52008
51950
  }
52009
51951
  getSupportedProtocols() {
@@ -52499,60 +52441,63 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
52499
52441
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource ZIP contains an unsafe entry path', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52500
52442
  }
52501
52443
  const entries = zipEntries.filter(entry => !entry.dir);
52502
- if (entries.length === 0 || entries.length > PROTOCOL_V2_RESOURCE_FILE_MAX_COUNT + 1) {
52444
+ if (entries.length === 0) {
52503
52445
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource ZIP entry set is invalid', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52504
52446
  }
52505
- let declaredUncompressedSize = 0;
52506
- let declaredCompressedSize = 0;
52507
- for (const entry of entries) {
52508
- const sizes = getProtocolV2ZipEntrySizes(entry);
52509
- declaredCompressedSize += sizes.compressedSize;
52510
- declaredUncompressedSize += sizes.uncompressedSize;
52511
- const entryLimit = entry.name === 'manifest.json'
52512
- ? PROTOCOL_V2_RESOURCE_MANIFEST_MAX_BYTES
52513
- : PROTOCOL_V2_RESOURCE_TOTAL_MAX_BYTES;
52514
- if (sizes.uncompressedSize > entryLimit ||
52515
- declaredCompressedSize > binary.byteLength ||
52516
- declaredUncompressedSize >
52517
- PROTOCOL_V2_RESOURCE_TOTAL_MAX_BYTES + PROTOCOL_V2_RESOURCE_MANIFEST_MAX_BYTES) {
52518
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource ZIP declared size exceeds the allowed limit', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52447
+ const manifestEntry = entries.find(entry => entry.name.split('/').pop() === 'manifest.json');
52448
+ let manifestBinary;
52449
+ let manifestDirectory = '';
52450
+ let selectedFiles;
52451
+ if (manifestEntry) {
52452
+ if (getProtocolV2ZipEntrySizes(manifestEntry).uncompressedSize >
52453
+ PROTOCOL_V2_RESOURCE_MANIFEST_MAX_BYTES) {
52454
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource manifest size is invalid', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52519
52455
  }
52456
+ manifestBinary = yield manifestEntry.async('arraybuffer');
52457
+ if (manifestBinary.byteLength <= 0 ||
52458
+ manifestBinary.byteLength > PROTOCOL_V2_RESOURCE_MANIFEST_MAX_BYTES) {
52459
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource manifest size is invalid', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52460
+ }
52461
+ let manifestValue;
52462
+ try {
52463
+ manifestValue = JSON.parse(new TextDecoder().decode(manifestBinary));
52464
+ }
52465
+ catch (error) {
52466
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 local resource manifest is invalid: ${String(error)}`, { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52467
+ }
52468
+ selectedFiles = selectProtocolV2ResourceManifestFiles({
52469
+ manifest: parseProtocolV2ResourceManifest(manifestValue),
52470
+ targetsToUpdate: (_a = this.params.targetsToUpdate) !== null && _a !== void 0 ? _a : [],
52471
+ });
52472
+ manifestDirectory = manifestEntry.name.slice(0, -'manifest.json'.length);
52520
52473
  }
52521
- const manifestEntry = zip.file('manifest.json');
52522
- if (!manifestEntry) {
52523
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource ZIP has no manifest.json', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52524
- }
52525
- const manifestBinary = yield manifestEntry.async('arraybuffer');
52526
- if (manifestBinary.byteLength <= 0 ||
52527
- manifestBinary.byteLength > PROTOCOL_V2_RESOURCE_MANIFEST_MAX_BYTES) {
52528
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource manifest size is invalid', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52529
- }
52530
- let manifestValue;
52531
- try {
52532
- manifestValue = JSON.parse(new TextDecoder().decode(manifestBinary));
52533
- }
52534
- catch (error) {
52535
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 local resource manifest is invalid: ${String(error)}`, { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52474
+ else {
52475
+ selectedFiles = entries.flatMap(entry => {
52476
+ var _a;
52477
+ const archivePath = getProtocolV2LocalResourceArchivePath(entry.name);
52478
+ if (!archivePath)
52479
+ return [];
52480
+ return [
52481
+ {
52482
+ archive_path: archivePath,
52483
+ original_name: (_a = archivePath.split('/').pop()) !== null && _a !== void 0 ? _a : archivePath,
52484
+ device_path: `vol0:/${archivePath}`,
52485
+ size: getProtocolV2ZipEntrySizes(entry).uncompressedSize,
52486
+ sha256: '',
52487
+ },
52488
+ ];
52489
+ });
52536
52490
  }
52537
- const manifest = parseProtocolV2ResourceManifest(manifestValue);
52538
- const selectedFiles = selectProtocolV2ResourceManifestFiles({
52539
- manifest,
52540
- targetsToUpdate: (_a = this.params.targetsToUpdate) !== null && _a !== void 0 ? _a : [],
52541
- });
52542
- const expectedEntryNames = new Set([
52543
- 'manifest.json',
52544
- ...selectedFiles.map(file => file.archive_path),
52545
- ]);
52546
- if (entries.length !== expectedEntryNames.size ||
52547
- entries.some(entry => !expectedEntryNames.has(entry.name))) {
52548
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource ZIP contains an unexpected entry', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52491
+ if (selectedFiles.length === 0 || selectedFiles.length > PROTOCOL_V2_RESOURCE_FILE_MAX_COUNT) {
52492
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Protocol V2 local resource ZIP has no resource packages', { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52549
52493
  }
52550
52494
  let totalSize = 0;
52551
- const materializedEntries = [
52552
- { entryName: 'manifest.json', binary: manifestBinary },
52553
- ];
52495
+ const materializedEntries = [];
52496
+ const normalizedFiles = [];
52554
52497
  for (const file of selectedFiles) {
52555
- const entry = zip.file(file.archive_path);
52498
+ const entry = manifestEntry
52499
+ ? zip.file(`${manifestDirectory}${file.archive_path}`)
52500
+ : entries.find(candidate => getProtocolV2LocalResourceArchivePath(candidate.name) === file.archive_path);
52556
52501
  if (!entry) {
52557
52502
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 local resource ZIP is missing ${file.archive_path}`, { firmwareUpdateCode: 'FirmwareArtifactsNotPrepared' });
52558
52503
  }
@@ -52563,11 +52508,15 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
52563
52508
  }
52564
52509
  const fileBinary = yield entry.async('arraybuffer');
52565
52510
  const digest = bytesToHex(sha256.sha256(new Uint8Array(fileBinary)));
52566
- if (fileBinary.byteLength !== file.size || digest !== file.sha256.toLowerCase()) {
52511
+ if (fileBinary.byteLength !== file.size ||
52512
+ (file.sha256 && digest !== file.sha256.toLowerCase())) {
52567
52513
  throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, `Protocol V2 local resource file does not match manifest: ${file.archive_path}`, { firmwareUpdateCode: 'FirmwareArtifactReceiptMismatch' });
52568
52514
  }
52515
+ normalizedFiles.push(Object.assign(Object.assign({}, file), { sha256: digest }));
52569
52516
  materializedEntries.push({ entryName: file.archive_path, binary: fileBinary });
52570
52517
  }
52518
+ manifestBinary !== null && manifestBinary !== void 0 ? manifestBinary : (manifestBinary = new TextEncoder().encode(JSON.stringify({ files: normalizedFiles })).buffer);
52519
+ materializedEntries.unshift({ entryName: 'manifest.json', binary: manifestBinary });
52571
52520
  return { binary, materializedEntries };
52572
52521
  });
52573
52522
  }
@@ -53154,11 +53103,6 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
53154
53103
  }
53155
53104
  return ((_a = this.device.features) === null || _a === void 0 ? void 0 : _a.mode) === 'romloader';
53156
53105
  }
53157
- isLegacyProtocolV2Runtime() {
53158
- var _a, _b;
53159
- const protocolInfo = (_b = (_a = this.device.state) === null || _a === void 0 ? void 0 : _a.raw) === null || _b === void 0 ? void 0 : _b.protocolV2ProtocolInfo;
53160
- return protocolInfo ? isLegacyProtocolV2ProtocolInfo(protocolInfo) : false;
53161
- }
53162
53106
  rebootProtocolV2ToBootloader() {
53163
53107
  return __awaiter(this, void 0, void 0, function* () {
53164
53108
  try {
@@ -53181,16 +53125,13 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
53181
53125
  }
53182
53126
  enterProtocolV2BootloaderMode() {
53183
53127
  return __awaiter(this, void 0, void 0, function* () {
53184
- this.protocolV2LegacyDirectUpdate = false;
53185
53128
  if (this.isProtocolV2RomloaderMode()) {
53186
53129
  Log$6.debug('Protocol V2 device is in romloader mode; start firmware update directly');
53187
- this.protocolV2LegacyDirectUpdate = this.isLegacyProtocolV2Runtime();
53188
53130
  this.protocolV2ExecutionInLoader = true;
53189
53131
  return false;
53190
53132
  }
53191
53133
  if (this.isProtocolV2BootloaderMode()) {
53192
53134
  Log$6.debug('Protocol V2 device is already in bootloader mode, skip reboot');
53193
- this.protocolV2LegacyDirectUpdate = this.isLegacyProtocolV2Runtime();
53194
53135
  this.protocolV2ExecutionInLoader = true;
53195
53136
  this.postTipMessage(exports.FirmwareUpdateTipMessage.GoToBootloaderSuccess);
53196
53137
  return false;
@@ -53550,7 +53491,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
53550
53491
  let missingTargetStatusSince;
53551
53492
  let missingTargetStatusKey;
53552
53493
  let normalModeWithoutInstallEvidenceSince;
53553
- let installEvidenceObserved = this.protocolV2InstallAckReceived;
53494
+ let installEvidenceObserved = false;
53554
53495
  const resetMissingTargetStatusGrace = () => {
53555
53496
  missingTargetStatusSince = undefined;
53556
53497
  missingTargetStatusKey = undefined;
@@ -53565,13 +53506,18 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
53565
53506
  }
53566
53507
  const currentDeviceInfo = deviceInfo;
53567
53508
  try {
53568
- const statusResponse = yield this.device.getCommands().typedCall('DeviceFirmwareUpdateStatusGet', 'DeviceFirmwareUpdateStatus', {
53509
+ const statusResponse = yield this.device.getCommands().typedCall('DeviceFirmwareUpdateStatusGet', ['DeviceFirmwareUpdateStatus', 'Success'], {
53569
53510
  fields: {
53570
53511
  status: true,
53571
53512
  payload_version: true,
53572
53513
  path: true,
53573
53514
  },
53574
53515
  }, { timeoutMs: PROTOCOL_V2_FIRMWARE_STATUS_RESPONSE_TIMEOUT });
53516
+ if (statusResponse.type === 'Success') {
53517
+ this.protocolV2FinalStatusVerified = true;
53518
+ this.postProgressMessage(100, 'installingFirmware');
53519
+ return;
53520
+ }
53575
53521
  const statusTargets = ((_a = statusResponse.message.records) !== null && _a !== void 0 ? _a : []);
53576
53522
  if (statusTargets.some(target => {
53577
53523
  const targetId = normalizeProtocolV2TargetId(target.target_id);
@@ -53876,46 +53822,12 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
53876
53822
  }
53877
53823
  protocolV2StartFirmwareUpdate({ targets, }) {
53878
53824
  return __awaiter(this, void 0, void 0, function* () {
53879
- this.protocolV2InstallAckReceived = false;
53880
53825
  this.protocolV2LastRuntimeProbeFeatures = undefined;
53881
- const startUpdate = () => this.device
53882
- .getCommands()
53883
- .typedCall('DeviceFirmwareUpdateRequest', 'Success', { targets }, { timeoutMs: PROTOCOL_V2_START_UPDATE_TIMEOUT });
53884
- let response;
53885
- try {
53886
- response = yield startUpdate();
53887
- this.protocolV2InstallAckReceived = true;
53888
- }
53889
- catch (error) {
53890
- if (this.isBleReconnect() && isProtocolV2BleInstallInterruptionError(error)) {
53891
- this.throwIfAborted();
53892
- Log$6.log('[FirmwareUpdateV4] install request interrupted by device reboot; continue status polling: ', error);
53893
- }
53894
- else if (this.protocolV2LegacyDirectUpdate &&
53895
- isProtocolV2FirmwareUpdateEndpointUnavailable(error)) {
53896
- this.protocolV2LegacyDirectUpdate = false;
53897
- Log$6.debug('[FirmwareUpdateV4] legacy App does not expose DeviceFirmwareUpdateRequest; rebooting to bootloader');
53898
- yield this.rebootProtocolV2ToBootloader();
53899
- try {
53900
- response = yield startUpdate();
53901
- this.protocolV2InstallAckReceived = true;
53902
- }
53903
- catch (retryError) {
53904
- if (!(this.isBleReconnect() && isProtocolV2BleInstallInterruptionError(retryError))) {
53905
- throw retryError;
53906
- }
53907
- this.throwIfAborted();
53908
- Log$6.log('[FirmwareUpdateV4] install request interrupted after legacy reboot; continue status polling: ', retryError);
53909
- }
53910
- }
53911
- else {
53912
- throw error;
53913
- }
53914
- }
53915
- this.protocolV2LegacyDirectUpdate = false;
53826
+ const commands = this.device.getCommands();
53827
+ yield commands.typedCall('DeviceFirmwareUpdateStage', 'Success', { targets });
53828
+ yield commands.call('DeviceFirmwareUpdateRequest', {}, { returnAfterWrite: true });
53916
53829
  this.postTipMessage(exports.FirmwareUpdateTipMessage.FirmwareUpdating);
53917
53830
  this.postProgressMessage(0, 'installingFirmware');
53918
- return response;
53919
53831
  });
53920
53832
  }
53921
53833
  protocolV2Reboot(rebootType) {
@@ -54935,7 +54847,7 @@ const resolvePreUnlockPinType = (method) => {
54935
54847
  return targetsKnownHiddenWallet ? hdTransport.DeviceSessionPinType.Any : hdTransport.DeviceSessionPinType.Main;
54936
54848
  };
54937
54849
  function runMethodWithUnlockPolicy(method, device, options = {}) {
54938
- var _a, _b;
54850
+ var _a, _b, _c;
54939
54851
  return __awaiter(this, void 0, void 0, function* () {
54940
54852
  const { context = createProtocolV2UnlockContext(), uiCoordinator, afterStatusBeforeUnlock, prepare, run: configuredRun, } = options;
54941
54853
  const run = configuredRun !== null && configuredRun !== void 0 ? configuredRun : (() => method.run());
@@ -54944,8 +54856,9 @@ function runMethodWithUnlockPolicy(method, device, options = {}) {
54944
54856
  const shouldCoordinateUi = shouldEmitUi && uiCoordinator !== undefined;
54945
54857
  const requiresPreUnlock = device.isProtocolV2() &&
54946
54858
  (method.useDevicePassphraseState || method.unlockPolicy === 'unlock-before-run') &&
54947
- !((_a = device.isBootloader) === null || _a === void 0 ? void 0 : _a.call(device)) &&
54948
- !((_b = device.isRomloader) === null || _b === void 0 ? void 0 : _b.call(device));
54859
+ ((_a = device.state) === null || _a === void 0 ? void 0 : _a.status.initialized) !== false &&
54860
+ !((_b = device.isBootloader) === null || _b === void 0 ? void 0 : _b.call(device)) &&
54861
+ !((_c = device.isRomloader) === null || _c === void 0 ? void 0 : _c.call(device));
54949
54862
  if (requiresPreUnlock && !context.preflightCompleted) {
54950
54863
  const status = yield refreshProtocolV2DeviceStatus(device);
54951
54864
  if (typeof (status === null || status === void 0 ? void 0 : status.unlocked) !== 'boolean') {