@onekeyfe/hd-core 1.2.0-alpha.44 → 1.2.0-alpha.45

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.
@@ -12,7 +12,12 @@ import {
12
12
  requestProtocolV2ResourceInventory,
13
13
  } from '../src/protocols/protocol-v2/resources';
14
14
 
15
- import type { ConnectSettings, IProtocolV2Resource, RemoteConfigResponse } from '../src/types';
15
+ import type {
16
+ ConnectSettings,
17
+ IProtocolV2BootResources,
18
+ IProtocolV2Resource,
19
+ RemoteConfigResponse,
20
+ } from '../src/types';
16
21
 
17
22
  jest.mock('axios');
18
23
  jest.mock('../src/data/config', () => ({
@@ -31,6 +36,16 @@ const resources: IProtocolV2Resource[] = PROTOCOL_V2_RESOURCE_TYPES.map((type, i
31
36
  headerHash: index.toString(16).padStart(128, '0'),
32
37
  }));
33
38
 
39
+ const bootResources: IProtocolV2BootResources = {
40
+ required: false,
41
+ target: 'CRATE',
42
+ url: 'https://example.com/boot-resources.crate.okpkg',
43
+ size: 1234,
44
+ fileHash: 'ab'.repeat(32),
45
+ payloadHash: 'cd'.repeat(64),
46
+ headerHash: 'ef'.repeat(64),
47
+ };
48
+
34
49
  const createSettings = (configFetcher: ConnectSettings['configFetcher']): ConnectSettings =>
35
50
  ({
36
51
  env: 'node',
@@ -47,7 +62,7 @@ const createRemoteConfig = (): RemoteConfigResponse =>
47
62
  mini: { firmware: [], ble: [] },
48
63
  touch: { firmware: [], ble: [] },
49
64
  pro: { firmware: [], ble: [] },
50
- pro2: { firmware: [], ble: [], resources: { stable: resources } },
65
+ pro2: { firmware: [], ble: [], resources: { stable: resources, boot: bootResources } },
51
66
  bridge: {},
52
67
  } as unknown as RemoteConfigResponse);
53
68
 
@@ -58,9 +73,13 @@ describe('Pro2 resource configuration', () => {
58
73
  });
59
74
 
60
75
  test('accepts exactly six resources and normalizes their deterministic order', () => {
61
- const parsed = parseProtocolV2Resources({ stable: [...resources].reverse() });
76
+ const parsed = parseProtocolV2Resources({
77
+ stable: [...resources].reverse(),
78
+ boot: bootResources,
79
+ });
62
80
 
63
81
  expect(parsed?.stable.map(item => item.type)).toEqual(PROTOCOL_V2_RESOURCE_TYPES);
82
+ expect(parsed?.boot).toEqual(bootResources);
64
83
  expect(PROTOCOL_V2_RESOURCE_DEVICE_PATHS.translations).toBe(
65
84
  'vol0:/bundles/translations/translations.okpkg'
66
85
  );
@@ -82,6 +101,21 @@ describe('Pro2 resource configuration', () => {
82
101
  ).toThrow('headerHash');
83
102
  });
84
103
 
104
+ test('requires boot resources to remain optional and use a CRATE package', () => {
105
+ expect(() =>
106
+ parseProtocolV2Resources({
107
+ stable: resources,
108
+ boot: { ...bootResources, required: true },
109
+ })
110
+ ).toThrow('required flag');
111
+ expect(() =>
112
+ parseProtocolV2Resources({
113
+ stable: resources,
114
+ boot: { ...bootResources, target: 'RESC' },
115
+ })
116
+ ).toThrow('expected CRATE');
117
+ });
118
+
85
119
  test('downloads nothing when all resource identities match', () => {
86
120
  const inventory = resources.map(({ type, size, headerHash }) => ({ type, size, headerHash }));
87
121
 
@@ -186,6 +220,7 @@ describe('Pro2 resource configuration', () => {
186
220
  expect.stringMatching(/^https:\/\/data\.onekey\.so\/pre-config\.json\?noCache=/)
187
221
  );
188
222
  expect(DataManager.getProtocolV2Resources()).toEqual(resources);
223
+ expect(DataManager.getProtocolV2BootResources()).toEqual(bootResources);
189
224
  });
190
225
 
191
226
  test('does not advance the cache timestamp when refresh fails', async () => {
@@ -5,6 +5,7 @@ import {
5
5
  DeviceSettingsPage,
6
6
  DeviceType,
7
7
  } from '@onekeyfe/hd-transport';
8
+ import { sha256 } from '@noble/hashes/sha256';
8
9
 
9
10
  import * as firmwareBinaryApi from '../src/api/firmware/getBinary';
10
11
  import DnxGetAddress from '../src/api/dynex/DnxGetAddress';
@@ -5983,6 +5984,100 @@ describe('Protocol V2 firmware reconnect identity', () => {
5983
5984
  expect((method as any).downloadProtocolV2Resource).toHaveBeenCalledTimes(6);
5984
5985
  resourcesSpy.mockRestore();
5985
5986
  });
5987
+
5988
+ const buildBootResourcesHeader = ({
5989
+ type = 'CRAT',
5990
+ payloadHash = 'ab'.repeat(64),
5991
+ headerHash = 'cd'.repeat(64),
5992
+ }: {
5993
+ type?: string;
5994
+ payloadHash?: string;
5995
+ headerHash?: string;
5996
+ } = {}) => {
5997
+ const header = new Uint8Array(0x52a0);
5998
+ const view = new DataView(header.buffer);
5999
+ 'OKPP'.split('').forEach((char, index) => {
6000
+ header[index] = char.charCodeAt(0);
6001
+ });
6002
+ type.split('').forEach((char, index) => {
6003
+ header[0x08 + index] = char.charCodeAt(0);
6004
+ });
6005
+ view.setUint32(0x0c, header.byteLength, true);
6006
+ const writeHex = (offset: number, hex: string) => {
6007
+ for (let index = 0; index < hex.length / 2; index++) {
6008
+ header[offset + index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);
6009
+ }
6010
+ };
6011
+ writeHex(0x200, payloadHash);
6012
+ writeHex(0x240, headerHash);
6013
+ return header;
6014
+ };
6015
+
6016
+ test('does not resolve boot resources unless the optional target is selected', async () => {
6017
+ const method = new FirmwareUpdateV4({
6018
+ id: 1,
6019
+ payload: { method: 'firmwareUpdateV4', platform: 'web' },
6020
+ });
6021
+ method.init();
6022
+ const configSpy = jest.spyOn(DataManager, 'getProtocolV2BootResources');
6023
+ const downloadSpy = jest.spyOn(firmwareBinaryApi, 'getSysResourceBinary');
6024
+
6025
+ await expect((method as any).prepareProtocolV2BootResources()).resolves.toBeUndefined();
6026
+
6027
+ expect(configSpy).not.toHaveBeenCalled();
6028
+ expect(downloadSpy).not.toHaveBeenCalled();
6029
+ });
6030
+
6031
+ test('downloads and maps the selected boot resources CRATE target', async () => {
6032
+ const payloadHash = 'ab'.repeat(64);
6033
+ const headerHash = 'cd'.repeat(64);
6034
+ const bytes = buildBootResourcesHeader({ payloadHash, headerHash });
6035
+ const binary = bytes.buffer as ArrayBuffer;
6036
+ const fileHash = Array.from(sha256(bytes), byte => byte.toString(16).padStart(2, '0')).join('');
6037
+ const resource = {
6038
+ required: false as const,
6039
+ target: 'CRATE' as const,
6040
+ url: 'https://example.com/boot-resources.crate.okpkg',
6041
+ size: bytes.byteLength,
6042
+ fileHash,
6043
+ payloadHash,
6044
+ headerHash,
6045
+ };
6046
+ const method = new FirmwareUpdateV4({
6047
+ id: 1,
6048
+ payload: {
6049
+ method: 'firmwareUpdateV4',
6050
+ platform: 'web',
6051
+ targetsToUpdate: ['boot_resources'],
6052
+ },
6053
+ });
6054
+ method.init();
6055
+ jest.spyOn(DataManager, 'getProtocolV2BootResources').mockReturnValue(resource);
6056
+ jest.spyOn(firmwareBinaryApi, 'getSysResourceBinary').mockResolvedValue({ binary });
6057
+
6058
+ await expect((method as any).prepareProtocolV2BootResources()).resolves.toEqual({
6059
+ fileName: 'boot_resources.crate.okpkg',
6060
+ binary,
6061
+ targetId: 1,
6062
+ kind: 'boot_resources',
6063
+ });
6064
+ });
6065
+
6066
+ test('rejects a non-CRATE manual boot resources package', async () => {
6067
+ const method = new FirmwareUpdateV4({
6068
+ id: 1,
6069
+ payload: {
6070
+ method: 'firmwareUpdateV4',
6071
+ platform: 'web',
6072
+ bootResourcesBinary: buildBootResourcesHeader({ type: 'RESC' }).buffer,
6073
+ },
6074
+ });
6075
+ method.init();
6076
+
6077
+ await expect((method as any).prepareProtocolV2BootResources()).rejects.toThrow(
6078
+ 'Invalid Pro2 boot resources CRATE header'
6079
+ );
6080
+ });
5986
6081
  });
5987
6082
 
5988
6083
  describe('Protocol V2 explicit USB device selection', () => {
@@ -26,6 +26,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
26
26
  private getRemoteComponentTarget;
27
27
  private downloadRemoteProtocolV2Component;
28
28
  private prepareRemoteProtocolV2Binaries;
29
+ private validateProtocolV2BootResourcesBinary;
30
+ private prepareProtocolV2BootResources;
29
31
  private prepareProtocolV2ResourceBundles;
30
32
  private downloadProtocolV2Resource;
31
33
  private syncProtocolV2ResourceBundles;
@@ -1 +1 @@
1
- {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkB/E,OAAO,KAAK,EAAE,sBAAsB,EAA0B,MAAM,6BAA6B,CAAC;AA+TlG,eAAO,MAAM,oCAAoC,WACvC,WAAW,GAAG,UAAU,eACnB,MAAM,GAAG,SAAS,YAKhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,0BACrB,MAAM,uBACR,MAAM,SAc5B,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,qBAAqB;IAIrB,IAAI;IA2DJ,OAAO,CAAC,8BAA8B;IAiBhC,GAAG;;;;;YAKK,aAAa;YAqEb,2BAA2B;IAWzC,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,kCAAkC;YAO5B,iCAAiC;YAOjC,iCAAiC;YAOjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YAmCjC,+BAA+B;YAqD/B,gCAAgC;YAmDhC,0BAA0B;YAe1B,6BAA6B;IAkC3C,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAU3B,6BAA6B;YA4BrB,+BAA+B;IA6C7C,OAAO,CAAC,6BAA6B;YAkCvB,uBAAuB;IA4GrC,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;YAgEtB,uCAAuC;YA+EvC,gCAAgC;YAQhC,yBAAyB;YAQzB,8BAA8B;IAQ5C,OAAO,CAAC,0BAA0B;YAiBpB,qCAAqC;YA2CrC,yBAAyB;YAiDzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAI5B,6BAA6B;YAwB7B,wBAAwB;IAoDtC,OAAO,CAAC,sCAAsC;YAchC,cAAc;YA+Bd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
1
+ {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkB/E,OAAO,KAAK,EAAE,sBAAsB,EAA0B,MAAM,6BAA6B,CAAC;AAiUlG,eAAO,MAAM,oCAAoC,WACvC,WAAW,GAAG,UAAU,eACnB,MAAM,GAAG,SAAS,YAKhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,0BACrB,MAAM,uBACR,MAAM,SAc5B,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,qBAAqB;IAIrB,IAAI;IA6DJ,OAAO,CAAC,8BAA8B;IAiBhC,GAAG;;;;;YAKK,aAAa;YAqFb,2BAA2B;IAWzC,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,kCAAkC;YAO5B,iCAAiC;YAOjC,iCAAiC;YAOjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YAmCjC,+BAA+B;IAqD7C,OAAO,CAAC,qCAAqC;YAuB/B,8BAA8B;YAyB9B,gCAAgC;YAmDhC,0BAA0B;YAe1B,6BAA6B;IAkC3C,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAU3B,6BAA6B;YA4BrB,+BAA+B;IA6C7C,OAAO,CAAC,6BAA6B;YAkCvB,uBAAuB;IA4GrC,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;YAgEtB,uCAAuC;YA+EvC,gCAAgC;YAQhC,yBAAyB;YAQzB,8BAA8B;IAQ5C,OAAO,CAAC,0BAA0B;YAiBpB,qCAAqC;YA2CrC,yBAAyB;YAiDzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAI5B,6BAA6B;YAwB7B,wBAAwB;IAoDtC,OAAO,CAAC,sCAAsC;YAchC,cAAc;YA+Bd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
@@ -46,6 +46,7 @@ export default class DataManager {
46
46
  static checkAndReloadData(): Promise<void>;
47
47
  static forceReloadData(): Promise<void>;
48
48
  static getProtocolV2Resources(): import("../types").IProtocolV2Resource[] | undefined;
49
+ static getProtocolV2BootResources(): import("../types").IProtocolV2BootResources | undefined;
49
50
  static getProtobufMessages(schema?: ProtobufMessageSchema): JSON;
50
51
  static getSettings(key?: undefined): ConnectSettings;
51
52
  static getSettings<T extends keyof ConnectSettings>(key: T): ConnectSettings[T];
@@ -1 +1 @@
1
- {"version":3,"file":"DataManager.d.ts","sourceRoot":"","sources":["../../src/data-manager/DataManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBjE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,QAAQ,EACR,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EAEd,MAAM,UAAU,CAAC;AAIlB,eAAO,MAAM,eAAe,uFAMlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAC3E,MAAM,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,UAAU,CAAC;AAsBzE,MAAM,CAAC,OAAO,OAAO,WAAW;IAC9B,MAAM,CAAC,SAAS,EAAE,aAAa,GAAG;QAChC,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,aAAa,CAAC,GAAG,SAAS,CAAC;KAC7D,CA6BC;IAEF,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAQ;IAEvC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEjC,MAAM,CAAC,QAAQ,EAAE;SAAG,MAAM,IAAI,qBAAqB,GAAG,IAAI;KAAE,CAI1D;IAEF,MAAM,CAAC,kBAAkB,SAAK;IAE9B,MAAM,CAAC,iBAAiB,aACZ,QAAQ,gBACJ,aAAa,KAC1B,qBAAqB,CAyBtB;IAMF,MAAM,CAAC,4BAA4B;kBAKvB,QAAQ;;sBAEJ,aAAa;6BAqB3B;IAMF,MAAM,CAAC,kBAAkB,aAAc,QAAQ,gBAAgB,aAAa,wBAe1E;IAEF,MAAM,CAAC,qBAAqB,aAAc,QAAQ,gBAAgB,aAAa,wBAmB7E;IAEF,MAAM,CAAC,0BAA0B,aACrB,QAAQ,gBACJ,aAAa,KAC1B,aAAa,GAAG,SAAS,CAa1B;IAEF,MAAM,CAAC,mCAAmC,aAC9B,QAAQ,gBACJ,aAAa,KAC1B,aAAa,GAAG,SAAS,CAgB1B;IAEF,MAAM,CAAC,oBAAoB,aAAc,QAAQ,gBAAgB,aAAa;;;QAuB5E;IAEF,MAAM,CAAC,wBAAwB,aAAc,QAAQ,gBAAgB,aAAa,yDAsBhF;IAEF,MAAM,CAAC,oBAAoB,aAAc,QAAQ,KAAG,wBAAwB,CAc1E;IAEF,MAAM,CAAC,uBAAuB,aAAc,QAAQ;;;QAalD;IAEF,MAAM,CAAC,2BAA2B,aAAc,QAAQ,4DAMtD;IAEF,MAAM,CAAC,kBAAkB,iBAAkB,MAAM,KAAG,gBAAgB,CAKlE;IAEF,MAAM,CAAC,kBAAkB;;;kBAAuC;IAEhE,OAAO,CAAC,MAAM,CAAC,yBAAyB;WA4C3B,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAyE9D,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC;WAalC,kBAAkB;WAUlB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7C,MAAM,CAAC,sBAAsB;IAI7B,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAE,qBAAyC,GAAG,IAAI;IAInF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,eAAe;IAEpD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAU/E,MAAM,CAAC,YAAY,QAAS,eAAe,CAAC,KAAK,CAAC,aAC0B;IAG5E,MAAM,CAAC,eAAe,QAAS,eAAe,CAAC,KAAK,CAAC,aAA8B;IAGnF,MAAM,CAAC,eAAe,QAAS,eAAe,CAAC,KAAK,CAAC,aAAsB;CAC5E"}
1
+ {"version":3,"file":"DataManager.d.ts","sourceRoot":"","sources":["../../src/data-manager/DataManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAmBjE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,QAAQ,EACR,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EAEd,MAAM,UAAU,CAAC;AAIlB,eAAO,MAAM,eAAe,uFAMlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAC3E,MAAM,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,UAAU,CAAC;AAsBzE,MAAM,CAAC,OAAO,OAAO,WAAW;IAC9B,MAAM,CAAC,SAAS,EAAE,aAAa,GAAG;QAChC,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,aAAa,CAAC,GAAG,SAAS,CAAC;KAC7D,CA6BC;IAEF,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAQ;IAEvC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEjC,MAAM,CAAC,QAAQ,EAAE;SAAG,MAAM,IAAI,qBAAqB,GAAG,IAAI;KAAE,CAI1D;IAEF,MAAM,CAAC,kBAAkB,SAAK;IAE9B,MAAM,CAAC,iBAAiB,aACZ,QAAQ,gBACJ,aAAa,KAC1B,qBAAqB,CAyBtB;IAMF,MAAM,CAAC,4BAA4B;kBAKvB,QAAQ;;sBAEJ,aAAa;6BAqB3B;IAMF,MAAM,CAAC,kBAAkB,aAAc,QAAQ,gBAAgB,aAAa,wBAe1E;IAEF,MAAM,CAAC,qBAAqB,aAAc,QAAQ,gBAAgB,aAAa,wBAmB7E;IAEF,MAAM,CAAC,0BAA0B,aACrB,QAAQ,gBACJ,aAAa,KAC1B,aAAa,GAAG,SAAS,CAa1B;IAEF,MAAM,CAAC,mCAAmC,aAC9B,QAAQ,gBACJ,aAAa,KAC1B,aAAa,GAAG,SAAS,CAgB1B;IAEF,MAAM,CAAC,oBAAoB,aAAc,QAAQ,gBAAgB,aAAa;;;QAuB5E;IAEF,MAAM,CAAC,wBAAwB,aAAc,QAAQ,gBAAgB,aAAa,yDAsBhF;IAEF,MAAM,CAAC,oBAAoB,aAAc,QAAQ,KAAG,wBAAwB,CAc1E;IAEF,MAAM,CAAC,uBAAuB,aAAc,QAAQ;;;QAalD;IAEF,MAAM,CAAC,2BAA2B,aAAc,QAAQ,4DAMtD;IAEF,MAAM,CAAC,kBAAkB,iBAAkB,MAAM,KAAG,gBAAgB,CAKlE;IAEF,MAAM,CAAC,kBAAkB;;;kBAAuC;IAEhE,OAAO,CAAC,MAAM,CAAC,yBAAyB;WA4C3B,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAyE9D,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC;WAalC,kBAAkB;WAUlB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7C,MAAM,CAAC,sBAAsB;IAI7B,MAAM,CAAC,0BAA0B;IAIjC,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAE,qBAAyC,GAAG,IAAI;IAInF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,eAAe;IAEpD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAU/E,MAAM,CAAC,YAAY,QAAS,eAAe,CAAC,KAAK,CAAC,aAC0B;IAG5E,MAAM,CAAC,eAAe,QAAS,eAAe,CAAC,KAAK,CAAC,aAA8B;IAGnF,MAAM,CAAC,eAAe,QAAS,eAAe,CAAC,KAAK,CAAC,aAAsB;CAC5E"}
package/dist/index.d.ts CHANGED
@@ -215,8 +215,23 @@ type IProtocolV2Resource = {
215
215
  /** SHA3-512 header_hash from the signed okpkg header. */
216
216
  headerHash: string;
217
217
  };
218
+ /** Optional Pro2 startup-resource CRATE installed by the bootloader updater. */
219
+ type IProtocolV2BootResources = {
220
+ required: false;
221
+ target: 'CRATE';
222
+ url: string;
223
+ /** Complete CRATE file size in bytes. */
224
+ size: number;
225
+ /** SHA-256 of the complete CRATE file. */
226
+ fileHash: string;
227
+ /** SHA3-512 payload_hash from the signed CRATE header. */
228
+ payloadHash: string;
229
+ /** SHA3-512 header_hash from the signed CRATE header. */
230
+ headerHash: string;
231
+ };
218
232
  type IProtocolV2Resources = {
219
233
  stable: IProtocolV2Resource[];
234
+ boot?: IProtocolV2BootResources;
220
235
  };
221
236
  /** Pro2 RESC bundle okpkg descriptor for incremental FileWrite synchronization. */
222
237
  type IProtocolV2ResourceBundle = {
@@ -1251,7 +1266,7 @@ interface FirmwareUpdateV3Params {
1251
1266
  * firmwareUpdateV4 target binaries grouped by DeviceFirmwareTargetType.
1252
1267
  * Except for romloader, each field maps to a target accepted by bootloader.
1253
1268
  */
1254
- type FirmwareUpdateV4Target = 'boot' | 'app_v1' | 'app_v2' | 'coprocessor' | 'resource' | 'se01' | 'se02' | 'se03' | 'se04';
1269
+ type FirmwareUpdateV4Target = 'boot' | 'boot_resources' | 'app_v1' | 'app_v2' | 'coprocessor' | 'resource' | 'se01' | 'se02' | 'se03' | 'se04';
1255
1270
  interface FirmwareUpdateV4Params {
1256
1271
  platform: IPlatform;
1257
1272
  chunkSize?: number;
@@ -1261,6 +1276,8 @@ interface FirmwareUpdateV4Params {
1261
1276
  romloaderBinary?: ArrayBuffer;
1262
1277
  /** FW_MGMT_TARGET_BOOTLOADER = 3 */
1263
1278
  bootloaderBinary?: ArrayBuffer;
1279
+ /** FW_MGMT_TARGET_CRATE = 1; optional Pro2 startup resources. */
1280
+ bootResourcesBinary?: ArrayBuffer;
1264
1281
  /** FW_MGMT_TARGET_APPLICATION_P1 = 4 */
1265
1282
  applicationP1Binary?: ArrayBuffer;
1266
1283
  /** FW_MGMT_TARGET_APPLICATION_P2 = 5 */
@@ -4531,6 +4548,7 @@ declare class DataManager {
4531
4548
  /** Force a fresh remote config before an update is allowed to mutate the device. */
4532
4549
  static forceReloadData(): Promise<void>;
4533
4550
  static getProtocolV2Resources(): IProtocolV2Resource[] | undefined;
4551
+ static getProtocolV2BootResources(): IProtocolV2BootResources | undefined;
4534
4552
  static getProtobufMessages(schema?: ProtobufMessageSchema): JSON;
4535
4553
  static getSettings(key?: undefined): ConnectSettings;
4536
4554
  static getSettings<T extends keyof ConnectSettings>(key: T): ConnectSettings[T];
@@ -4643,4 +4661,4 @@ declare const HardwareSdk: ({ init, call, dispose, eventEmitter, uiResponse, can
4643
4661
  declare const HardwareSDKLowLevel: ({ init, call, dispose, eventEmitter, addHardwareGlobalEventListener, uiResponse, cancel, updateSettings, switchTransport, }: LowLevelInjectApi) => LowLevelCoreApi;
4644
4662
  declare const HardwareTopLevelSdk: () => CoreApi;
4645
4663
 
4646
- export { AccountAddress, AccountAddresses, AlephiumAddress, AlephiumGetAddressParams, AlephiumSignMessageParams, AlephiumSignTransactionParams, AlephiumSignedTx, AlgoAddress, AlgoGetAddressParams, AlgoSignTransactionParams, AlgoSignedTx, AllFirmwareRelease, AllNetworkAddressParams, AllNetworkGetAddressParams, AptosAddress, AptosGetAddressParams, AptosGetPublicKeyParams, AptosMessageSignature, AptosPublicKey, AptosSignInMessageParams, AptosSignInMessageSignature, AptosSignMessageParams, AptosSignTransactionParams, AptosSignedTx, AssetsMap, BTCAddress, BTCGetAddressParams, BTCGetPublicKeyParams, BTCPublicKey, BTCSignMessageParams, BTCSignTransactionParams, BTCVerifyMessageParams, BenfenAddress, BenfenGetAddressParams, BenfenGetPublicKeyParams, BenfenPublicKey, BenfenSignMessageParams, BenfenSignTransactionParams, BenfenSignedTx, BleReleaseInfoEvent, BleReleaseInfoPayload, CORE_EVENT, CallMethod, CallMethodAnyResponse, CallMethodKeys, CallMethodPayload, CallMethodResponse, CallMethodUnion, CardanoAddress, CardanoGetAddressMethodParams, CardanoGetAddressParams, CardanoSignMessageMethodParams, CardanoSignMessageParams, CardanoSignTransaction, CardanoSignedTxData, CipheredKeyValue, CipheredKeyValueParams, ClearSessionCacheParams, ClearSessionCachePayload, CommonParams, ConfluxAddress, ConfluxGetAddressParams, ConfluxSignMessageCIP23Params, ConfluxSignMessageParams, ConfluxSignTransactionParams, ConfluxSignedTx, ConfluxTransaction, ConnectSettings, Core, CoreApi, CoreMessage, CosmosAddress, CosmosGetAddressParams, CosmosGetPublicKeyParams, CosmosPublicKey, CosmosSignTransactionParams, CosmosSignedTx, DEFAULT_PRIORITY, DEVICE, DEVICE_EVENT, DEVICE_SETTINGS_SHARED_FIELDS, DEVICE_SETTINGS_V1_ONLY_FIELDS, DEVICE_SETTINGS_V2_ONLY_FIELDS, DataManager, Device$1 as Device, DeviceButtonRequest, DeviceButtonRequestPayload, DeviceChangePinParams, DeviceConnnectRequest, DeviceDisconnnectRequest, DeviceEvent, DeviceEventListenerFn, DeviceEventMessage, DeviceFeaturesMode, DeviceFeaturesPayload, DeviceFeaturesProtocol, DeviceFeaturesRaw, DeviceFeaturesRawPatch, DeviceFeaturesVerify, DeviceFirmwareRange, DeviceFlagsParams, DeviceModelToTypes, DeviceProgress, DeviceRecoveryParams, DeviceResetParams, DeviceSendFeatures, DeviceSendState, DeviceSendSupportFeatures, DeviceSettingsCapabilities, DeviceSettingsDurationOption, DeviceSettingsField, DeviceSettingsParams, DeviceSettingsProtocol, DeviceSettingsValueOption, DeviceState, DeviceStateEvent, DeviceStateIdentity, DeviceStateMode, DeviceStatePatch, DeviceStateProtocol, DeviceStateScope, DeviceStateSection, DeviceStateSettings, DeviceStateStatus, DeviceStateUpdateSource, DeviceStateVersions, DeviceStatus, DeviceSupportFeatures, DeviceSupportFeaturesPayload, DeviceTypeMap, DeviceTypeToModels, DeviceUploadResourceParams, DeviceUploadResourceResponse, DeviceVerifyParams, DeviceVerifySignature, DnxAddress, DnxGetAddressParams, DnxSignTransactionParams, DnxSignature, DnxTxKey, EOneKeyDeviceMode, EVMAccessList, EVMAddress, EVMAuthorization, EVMAuthorizationSignature, EVMGetAddressParams, EVMGetPublicKeyParams, EVMPublicKey, EVMSignMessageEIP712Params, EVMSignMessageParams, EVMSignTransactionParams, EVMSignTypedDataParams, EVMSignedTx, EVMTransaction, EVMTransactionEIP1559, EVMTransactionEIP7702, EVMVerifyMessageParams, EthereumSignTypedDataMessage, EthereumSignTypedDataTypeProperty, EthereumSignTypedDataTypes, FIRMWARE, FIRMWARE_EVENT, Features, FilecoinAddress, FilecoinGetAddressParams, FilecoinSignTransactionParams, FilecoinSignedTx, FirmwareEvent, FirmwareMessage, FirmwareProcessing, FirmwareProgress, FirmwareRange, FirmwareRelease, FirmwareTip, FirmwareUpdateBinaryParams, FirmwareUpdateParams, FirmwareUpdateTipMessage, FirmwareUpdateV3Params, FirmwareUpdateV4Params, FirmwareUpdateV4Target, GetDeviceStateParams, GetPassphraseStateParams, HardwareSDKLowLevel, HardwareTopLevelSdk, HardwareUiInteractionMeta, IBLEFirmwareReleaseInfo, IDeviceBLEFirmwareStatus, IDeviceFirmwareStatus, IDeviceModel, IDeviceType, IFRAME, IFirmwareField, IFirmwareReleaseInfo, IFirmwareUpdateProgressType, IFirmwareUpdateTipMessage, IFrameBridge, IFrameCallMessage, IFrameCallback, IFrameCallbackMessage, IFrameCancelMessage, IFrameEvent, IFrameEventMessage, IFrameInit, IFrameSwitchTransport, IFrameSwitchTransportMessage, ILocale, IProtocolV2FirmwareComponent, IProtocolV2FirmwareComponentTarget, IProtocolV2Resource, IProtocolV2ResourceBundle, IProtocolV2ResourceType, IProtocolV2Resources, ITransportStatus, IVersionArray, IVersionRange, KaspaAddress, KaspaGetAddressParams, KaspaSignInputParams, KaspaSignOutputParams, KaspaSignTransactionParams, KaspaSignature, KaspaStreamingSignInputParams, KaspaStreamingSignOutputParams, KnownDevice, LOG, LOG_EVENT, LogBlockEvent, LogEvent, LogEventMessage, LogOutput, LoggerNames, LowLevelCoreApi, LowLevelInjectApi, MajorVersion, MethodResponseMessage, NEMAddress, NEMAggregateModificationTransaction, NEMGetAddressParams, NEMImportanceTransaction, NEMMosaic, NEMMosaicCreationTransaction, NEMMultisigTransaction, NEMProvisionNamespaceTransaction, NEMSignTransactionParams, NEMSupplyChangeTransaction, NEMTransaction, NEMTransferTransaction, NearAddress, NearGetAddressParams, NearSignTransactionParams, NervosAddress, NervosGetAddressParams, NervosSignTransactionParams, NervosSignedTx, NexaAddress, NexaGetAddressParams, NexaSignInputParams, NexaSignOutputParams, NexaSignTransactionParams, NexaSignature, NormalizedFeatures, OnekeyFeatures, OpenWalletSessionMode, OpenWalletSessionModeValue, OpenWalletSessionParams, OpenWalletSessionPayload, PRO2_WALLPAPER_HEIGHT, PRO2_WALLPAPER_WIDTH, PROTOCOL_V2_NEVER_TIMEOUT_MS, Params, PassphraseRequestPayload, PolkadotAddress, PolkadotGetAddressParams, PolkadotSignTransactionParams, PolkadotSignedTx, PostMessageEvent, PreviousAddressResult, Pro2WallpaperColorFormat, ProtocolV2FirmwareComponentRelease, ProtocolV2FirmwareComponentReleaseStatus, ProtocolV2FirmwareReleaseStatus, ProtocolV2UiCompletion, ProtocolV2UiEventMetadata, ProtocolV2UiEventSource, RESPONSE_EVENT, RefTransaction, ReleaseInfo, ReleaseInfoEvent, ReleaseInfoPayload, RemoteConfigResponse, RequestContext, Response, ScdoAddress, ScdoGetAddressParams, ScdoSignMessageParams, ScdoSignTransactionParams, ScdoSignedTx, SdkTracingContext, SearchDevice, SignedTransaction, SolSignMessageParams, SolSignMessageResponse, SolSignOffchainMessageParams, SolSignOffchainMessageResponse, SolanaAddress, SolanaGetAddressParams, SolanaSignTransactionParams, SolanaSignedTx, StarcoinAddress, StarcoinGetAddressParams, StarcoinGetPublicKeyParams, StarcoinPublicKey, StarcoinSignMessageParams, StarcoinSignTransactionParams, StarcoinVerifyMessageParams, StellarAddress, StellarAsset, StellarGetAddressParams, StellarOperation, StellarSignTransactionParams, StellarTransaction, StrictFeatures, Success, SuiAddress, SuiGetAddressParams, SuiGetPublicKeyParams, SuiPublicKey, SuiSignMessageParams, SuiSignTransactionParams, SuiSignedTx, SupportFeatureType, SupportFeatures, TestProtocolV2PingParams, TonAddress, TonGetAddressParams, TonSignDataParams, TonSignMessageParams, TonSignProofParams, TopLevelInjectApi, TransactionOptions, TransportReleaseStatus, TronAddress, TronDelegateResourceContract, TronFreezeBalanceV2Contract, TronGetAddressParams, TronSignMessageParams, TronSignTransactionParams, TronTransaction, TronTransactionContract, TronTransferContract, TronTriggerSmartContract, TronUnDelegateResourceContract, TronUnfreezeBalanceV2Contract, TronWithdrawBalanceContract, TronWithdrawExpireUnfreezeContract, UI_EVENT, UI_REQUEST, UI_RESPONSE, UiEvent, UiEventMessage, UiPromise, UiPromiseResponse, UiRequestButton, UiRequestDeviceAction, UiRequestFirmwareProgressing, UiRequestPassphrase, UiRequestPassphraseOnDevice, UiRequestSelectDeviceForSwitchFirmwareWebDevice, UiRequestSelectDeviceInBootloaderForWebDevice, UiRequestWindowClose, UiRequestWithoutPayload, UiResponseEvent, UiResponseMessage, UiResponsePassphrase, UiResponsePin, UiResponseSelectDeviceForSwitchFirmwareWebDevice, UiResponseSelectDeviceInBootloaderForWebDevice, UnavailableCapabilities, UnavailableCapability, Unsuccessful, VersionArray, checkNeedUpdateBootForClassicAndMini, checkNeedUpdateBootForTouch, cleanupCallback, cleanupSdkInstance, completeRequestContext, corsValidator, createDeviceMessage, createErrorMessage, createFirmwareMessage, createIFrameMessage, createLogMessage, createRequestContext, createResponseMessage, createSdkTracingContext, createUiMessage, createUiResponse, HardwareSdk as default, enableLog, encodePro2Wallpaper, executeCallback, formatLogMethodLabel, formatRequestContext, generateInstanceId, generateSdkInstanceId, getActiveRequestsByDeviceInstance, getAutoLockOptions, getAutoShutDownOptions, getDeviceBLEFirmwareVersion, getDeviceBleName, getDeviceBoardloaderVersion, getDeviceBootloaderVersion, getDeviceFirmwareVersion, getDeviceLabel, getDeviceSerialNo, getDeviceSettingsCapabilities, getDeviceType, getDeviceTypeByBleName, getDeviceUUID, getEnv, getFirmwareType, getFirmwareUpdateField, getFirmwareUpdateFieldArray, getHDPath, getHomeScreenDefaultList, getHomeScreenHex, getHomeScreenSize, getLanguageConfig, getLog, getLogBlockLabel, getLogger, getMethodVersionRange, getNftSize, getOutputScriptType, getSDKVersion, getSafeLogPayload, getScriptType, getTimeStamp, httpRequest, init$1 as initCore, isBleConnect, isValidVersionArray, isValidVersionString, normalizeSafetyCheckLevel, normalizeVersionArray, parseConnectSettings, parseMessage, patchFeatures, preloadSessionCache, safeThrowError, setLoggerPostMessage, supportInputPinOnSoftware, switchTransport, transportEnv, updateRequestContext, versionCompare, versionSplit, wait, whitelist, whitelistExtension };
4664
+ export { AccountAddress, AccountAddresses, AlephiumAddress, AlephiumGetAddressParams, AlephiumSignMessageParams, AlephiumSignTransactionParams, AlephiumSignedTx, AlgoAddress, AlgoGetAddressParams, AlgoSignTransactionParams, AlgoSignedTx, AllFirmwareRelease, AllNetworkAddressParams, AllNetworkGetAddressParams, AptosAddress, AptosGetAddressParams, AptosGetPublicKeyParams, AptosMessageSignature, AptosPublicKey, AptosSignInMessageParams, AptosSignInMessageSignature, AptosSignMessageParams, AptosSignTransactionParams, AptosSignedTx, AssetsMap, BTCAddress, BTCGetAddressParams, BTCGetPublicKeyParams, BTCPublicKey, BTCSignMessageParams, BTCSignTransactionParams, BTCVerifyMessageParams, BenfenAddress, BenfenGetAddressParams, BenfenGetPublicKeyParams, BenfenPublicKey, BenfenSignMessageParams, BenfenSignTransactionParams, BenfenSignedTx, BleReleaseInfoEvent, BleReleaseInfoPayload, CORE_EVENT, CallMethod, CallMethodAnyResponse, CallMethodKeys, CallMethodPayload, CallMethodResponse, CallMethodUnion, CardanoAddress, CardanoGetAddressMethodParams, CardanoGetAddressParams, CardanoSignMessageMethodParams, CardanoSignMessageParams, CardanoSignTransaction, CardanoSignedTxData, CipheredKeyValue, CipheredKeyValueParams, ClearSessionCacheParams, ClearSessionCachePayload, CommonParams, ConfluxAddress, ConfluxGetAddressParams, ConfluxSignMessageCIP23Params, ConfluxSignMessageParams, ConfluxSignTransactionParams, ConfluxSignedTx, ConfluxTransaction, ConnectSettings, Core, CoreApi, CoreMessage, CosmosAddress, CosmosGetAddressParams, CosmosGetPublicKeyParams, CosmosPublicKey, CosmosSignTransactionParams, CosmosSignedTx, DEFAULT_PRIORITY, DEVICE, DEVICE_EVENT, DEVICE_SETTINGS_SHARED_FIELDS, DEVICE_SETTINGS_V1_ONLY_FIELDS, DEVICE_SETTINGS_V2_ONLY_FIELDS, DataManager, Device$1 as Device, DeviceButtonRequest, DeviceButtonRequestPayload, DeviceChangePinParams, DeviceConnnectRequest, DeviceDisconnnectRequest, DeviceEvent, DeviceEventListenerFn, DeviceEventMessage, DeviceFeaturesMode, DeviceFeaturesPayload, DeviceFeaturesProtocol, DeviceFeaturesRaw, DeviceFeaturesRawPatch, DeviceFeaturesVerify, DeviceFirmwareRange, DeviceFlagsParams, DeviceModelToTypes, DeviceProgress, DeviceRecoveryParams, DeviceResetParams, DeviceSendFeatures, DeviceSendState, DeviceSendSupportFeatures, DeviceSettingsCapabilities, DeviceSettingsDurationOption, DeviceSettingsField, DeviceSettingsParams, DeviceSettingsProtocol, DeviceSettingsValueOption, DeviceState, DeviceStateEvent, DeviceStateIdentity, DeviceStateMode, DeviceStatePatch, DeviceStateProtocol, DeviceStateScope, DeviceStateSection, DeviceStateSettings, DeviceStateStatus, DeviceStateUpdateSource, DeviceStateVersions, DeviceStatus, DeviceSupportFeatures, DeviceSupportFeaturesPayload, DeviceTypeMap, DeviceTypeToModels, DeviceUploadResourceParams, DeviceUploadResourceResponse, DeviceVerifyParams, DeviceVerifySignature, DnxAddress, DnxGetAddressParams, DnxSignTransactionParams, DnxSignature, DnxTxKey, EOneKeyDeviceMode, EVMAccessList, EVMAddress, EVMAuthorization, EVMAuthorizationSignature, EVMGetAddressParams, EVMGetPublicKeyParams, EVMPublicKey, EVMSignMessageEIP712Params, EVMSignMessageParams, EVMSignTransactionParams, EVMSignTypedDataParams, EVMSignedTx, EVMTransaction, EVMTransactionEIP1559, EVMTransactionEIP7702, EVMVerifyMessageParams, EthereumSignTypedDataMessage, EthereumSignTypedDataTypeProperty, EthereumSignTypedDataTypes, FIRMWARE, FIRMWARE_EVENT, Features, FilecoinAddress, FilecoinGetAddressParams, FilecoinSignTransactionParams, FilecoinSignedTx, FirmwareEvent, FirmwareMessage, FirmwareProcessing, FirmwareProgress, FirmwareRange, FirmwareRelease, FirmwareTip, FirmwareUpdateBinaryParams, FirmwareUpdateParams, FirmwareUpdateTipMessage, FirmwareUpdateV3Params, FirmwareUpdateV4Params, FirmwareUpdateV4Target, GetDeviceStateParams, GetPassphraseStateParams, HardwareSDKLowLevel, HardwareTopLevelSdk, HardwareUiInteractionMeta, IBLEFirmwareReleaseInfo, IDeviceBLEFirmwareStatus, IDeviceFirmwareStatus, IDeviceModel, IDeviceType, IFRAME, IFirmwareField, IFirmwareReleaseInfo, IFirmwareUpdateProgressType, IFirmwareUpdateTipMessage, IFrameBridge, IFrameCallMessage, IFrameCallback, IFrameCallbackMessage, IFrameCancelMessage, IFrameEvent, IFrameEventMessage, IFrameInit, IFrameSwitchTransport, IFrameSwitchTransportMessage, ILocale, IProtocolV2BootResources, IProtocolV2FirmwareComponent, IProtocolV2FirmwareComponentTarget, IProtocolV2Resource, IProtocolV2ResourceBundle, IProtocolV2ResourceType, IProtocolV2Resources, ITransportStatus, IVersionArray, IVersionRange, KaspaAddress, KaspaGetAddressParams, KaspaSignInputParams, KaspaSignOutputParams, KaspaSignTransactionParams, KaspaSignature, KaspaStreamingSignInputParams, KaspaStreamingSignOutputParams, KnownDevice, LOG, LOG_EVENT, LogBlockEvent, LogEvent, LogEventMessage, LogOutput, LoggerNames, LowLevelCoreApi, LowLevelInjectApi, MajorVersion, MethodResponseMessage, NEMAddress, NEMAggregateModificationTransaction, NEMGetAddressParams, NEMImportanceTransaction, NEMMosaic, NEMMosaicCreationTransaction, NEMMultisigTransaction, NEMProvisionNamespaceTransaction, NEMSignTransactionParams, NEMSupplyChangeTransaction, NEMTransaction, NEMTransferTransaction, NearAddress, NearGetAddressParams, NearSignTransactionParams, NervosAddress, NervosGetAddressParams, NervosSignTransactionParams, NervosSignedTx, NexaAddress, NexaGetAddressParams, NexaSignInputParams, NexaSignOutputParams, NexaSignTransactionParams, NexaSignature, NormalizedFeatures, OnekeyFeatures, OpenWalletSessionMode, OpenWalletSessionModeValue, OpenWalletSessionParams, OpenWalletSessionPayload, PRO2_WALLPAPER_HEIGHT, PRO2_WALLPAPER_WIDTH, PROTOCOL_V2_NEVER_TIMEOUT_MS, Params, PassphraseRequestPayload, PolkadotAddress, PolkadotGetAddressParams, PolkadotSignTransactionParams, PolkadotSignedTx, PostMessageEvent, PreviousAddressResult, Pro2WallpaperColorFormat, ProtocolV2FirmwareComponentRelease, ProtocolV2FirmwareComponentReleaseStatus, ProtocolV2FirmwareReleaseStatus, ProtocolV2UiCompletion, ProtocolV2UiEventMetadata, ProtocolV2UiEventSource, RESPONSE_EVENT, RefTransaction, ReleaseInfo, ReleaseInfoEvent, ReleaseInfoPayload, RemoteConfigResponse, RequestContext, Response, ScdoAddress, ScdoGetAddressParams, ScdoSignMessageParams, ScdoSignTransactionParams, ScdoSignedTx, SdkTracingContext, SearchDevice, SignedTransaction, SolSignMessageParams, SolSignMessageResponse, SolSignOffchainMessageParams, SolSignOffchainMessageResponse, SolanaAddress, SolanaGetAddressParams, SolanaSignTransactionParams, SolanaSignedTx, StarcoinAddress, StarcoinGetAddressParams, StarcoinGetPublicKeyParams, StarcoinPublicKey, StarcoinSignMessageParams, StarcoinSignTransactionParams, StarcoinVerifyMessageParams, StellarAddress, StellarAsset, StellarGetAddressParams, StellarOperation, StellarSignTransactionParams, StellarTransaction, StrictFeatures, Success, SuiAddress, SuiGetAddressParams, SuiGetPublicKeyParams, SuiPublicKey, SuiSignMessageParams, SuiSignTransactionParams, SuiSignedTx, SupportFeatureType, SupportFeatures, TestProtocolV2PingParams, TonAddress, TonGetAddressParams, TonSignDataParams, TonSignMessageParams, TonSignProofParams, TopLevelInjectApi, TransactionOptions, TransportReleaseStatus, TronAddress, TronDelegateResourceContract, TronFreezeBalanceV2Contract, TronGetAddressParams, TronSignMessageParams, TronSignTransactionParams, TronTransaction, TronTransactionContract, TronTransferContract, TronTriggerSmartContract, TronUnDelegateResourceContract, TronUnfreezeBalanceV2Contract, TronWithdrawBalanceContract, TronWithdrawExpireUnfreezeContract, UI_EVENT, UI_REQUEST, UI_RESPONSE, UiEvent, UiEventMessage, UiPromise, UiPromiseResponse, UiRequestButton, UiRequestDeviceAction, UiRequestFirmwareProgressing, UiRequestPassphrase, UiRequestPassphraseOnDevice, UiRequestSelectDeviceForSwitchFirmwareWebDevice, UiRequestSelectDeviceInBootloaderForWebDevice, UiRequestWindowClose, UiRequestWithoutPayload, UiResponseEvent, UiResponseMessage, UiResponsePassphrase, UiResponsePin, UiResponseSelectDeviceForSwitchFirmwareWebDevice, UiResponseSelectDeviceInBootloaderForWebDevice, UnavailableCapabilities, UnavailableCapability, Unsuccessful, VersionArray, checkNeedUpdateBootForClassicAndMini, checkNeedUpdateBootForTouch, cleanupCallback, cleanupSdkInstance, completeRequestContext, corsValidator, createDeviceMessage, createErrorMessage, createFirmwareMessage, createIFrameMessage, createLogMessage, createRequestContext, createResponseMessage, createSdkTracingContext, createUiMessage, createUiResponse, HardwareSdk as default, enableLog, encodePro2Wallpaper, executeCallback, formatLogMethodLabel, formatRequestContext, generateInstanceId, generateSdkInstanceId, getActiveRequestsByDeviceInstance, getAutoLockOptions, getAutoShutDownOptions, getDeviceBLEFirmwareVersion, getDeviceBleName, getDeviceBoardloaderVersion, getDeviceBootloaderVersion, getDeviceFirmwareVersion, getDeviceLabel, getDeviceSerialNo, getDeviceSettingsCapabilities, getDeviceType, getDeviceTypeByBleName, getDeviceUUID, getEnv, getFirmwareType, getFirmwareUpdateField, getFirmwareUpdateFieldArray, getHDPath, getHomeScreenDefaultList, getHomeScreenHex, getHomeScreenSize, getLanguageConfig, getLog, getLogBlockLabel, getLogger, getMethodVersionRange, getNftSize, getOutputScriptType, getSDKVersion, getSafeLogPayload, getScriptType, getTimeStamp, httpRequest, init$1 as initCore, isBleConnect, isValidVersionArray, isValidVersionString, normalizeSafetyCheckLevel, normalizeVersionArray, parseConnectSettings, parseMessage, patchFeatures, preloadSessionCache, safeThrowError, setLoggerPostMessage, supportInputPinOnSoftware, switchTransport, transportEnv, updateRequestContext, versionCompare, versionSplit, wait, whitelist, whitelistExtension };
package/dist/index.js CHANGED
@@ -39569,6 +39569,33 @@ function validateResource(value, index) {
39569
39569
  headerHash: normalizeHex$1(resource.headerHash, SHA3_512_HEX_LENGTH, 'headerHash'),
39570
39570
  };
39571
39571
  }
39572
+ function validateBootResources(value) {
39573
+ if (!value || typeof value !== 'object') {
39574
+ throw new Error('Invalid Pro2 boot resources config');
39575
+ }
39576
+ const resource = value;
39577
+ if (resource.required !== false) {
39578
+ throw new Error('Invalid Pro2 boot resources required flag: expected false');
39579
+ }
39580
+ if (resource.target !== 'CRATE') {
39581
+ throw new Error('Invalid Pro2 boot resources target: expected CRATE');
39582
+ }
39583
+ if (typeof resource.url !== 'string' || !resource.url.startsWith('https://')) {
39584
+ throw new Error('Invalid Pro2 boot resources url');
39585
+ }
39586
+ if (!Number.isSafeInteger(resource.size) || Number(resource.size) <= 0) {
39587
+ throw new Error('Invalid Pro2 boot resources size');
39588
+ }
39589
+ return {
39590
+ required: false,
39591
+ target: 'CRATE',
39592
+ url: resource.url,
39593
+ size: Number(resource.size),
39594
+ fileHash: normalizeHex$1(resource.fileHash, SHA256_HEX_LENGTH, 'boot fileHash'),
39595
+ payloadHash: normalizeHex$1(resource.payloadHash, SHA3_512_HEX_LENGTH, 'boot payloadHash'),
39596
+ headerHash: normalizeHex$1(resource.headerHash, SHA3_512_HEX_LENGTH, 'boot headerHash'),
39597
+ };
39598
+ }
39572
39599
  function parseProtocolV2Resources(value) {
39573
39600
  if (value === undefined)
39574
39601
  return undefined;
@@ -39577,7 +39604,8 @@ function parseProtocolV2Resources(value) {
39577
39604
  !Array.isArray(value.stable)) {
39578
39605
  throw new Error('Invalid Pro2 resources config: stable must be an array');
39579
39606
  }
39580
- const stable = value.stable.map(validateResource);
39607
+ const config = value;
39608
+ const stable = config.stable.map(validateResource);
39581
39609
  const types = new Set(stable.map(resource => resource.type));
39582
39610
  if (stable.length !== PROTOCOL_V2_RESOURCE_TYPES.length || types.size !== stable.length) {
39583
39611
  throw new Error('Invalid Pro2 resources config: stable must contain six unique resource types');
@@ -39587,15 +39615,14 @@ function parseProtocolV2Resources(value) {
39587
39615
  throw new Error(`Invalid Pro2 resources config: stable is missing ${type}`);
39588
39616
  }
39589
39617
  }
39590
- return {
39591
- stable: PROTOCOL_V2_RESOURCE_TYPES.map(type => {
39618
+ const boot = config.boot === undefined ? undefined : validateBootResources(config.boot);
39619
+ return Object.assign({ stable: PROTOCOL_V2_RESOURCE_TYPES.map(type => {
39592
39620
  const resource = stable.find(item => item.type === type);
39593
39621
  if (!resource) {
39594
39622
  throw new Error(`Invalid Pro2 resources config: stable is missing ${type}`);
39595
39623
  }
39596
39624
  return resource;
39597
- }),
39598
- };
39625
+ }) }, (boot ? { boot } : undefined));
39599
39626
  }
39600
39627
  function buildProtocolV2ResourceUpdatePlan({ resources, inventory, mode, forced = false, }) {
39601
39628
  if (mode === 'bootloader-recovery' || forced) {
@@ -39777,6 +39804,10 @@ class DataManager {
39777
39804
  var _b, _c;
39778
39805
  return (_c = (_b = this.deviceMap[hdShared.EDeviceType.Pro2]) === null || _b === void 0 ? void 0 : _b.resources) === null || _c === void 0 ? void 0 : _c.stable;
39779
39806
  }
39807
+ static getProtocolV2BootResources() {
39808
+ var _b, _c;
39809
+ return (_c = (_b = this.deviceMap[hdShared.EDeviceType.Pro2]) === null || _b === void 0 ? void 0 : _b.resources) === null || _c === void 0 ? void 0 : _c.boot;
39810
+ }
39780
39811
  static getProtobufMessages(schema = 'v1CurrentSchema') {
39781
39812
  return this.messages[schema];
39782
39813
  }
@@ -49075,6 +49106,7 @@ const PROTOCOL_V2_OKPP_HEADER_SIZE = 0x52a0;
49075
49106
  const PROTOCOL_V2_OKPP_PAYLOAD_HASH_OFFSET = 0x200;
49076
49107
  const PROTOCOL_V2_OKPP_HEADER_HASH_OFFSET = 0x240;
49077
49108
  const PROTOCOL_V2_OKPP_HASH_SIZE = 64;
49109
+ const PROTOCOL_V2_BOOT_RESOURCES_FILE_NAME = 'boot_resources.crate.okpkg';
49078
49110
  const getProtocolV2DeviceTransferProgress = (bytesBeforeChunk, bytesAfterChunk, totalBytes) => {
49079
49111
  if (!Number.isFinite(totalBytes) || totalBytes <= 0) {
49080
49112
  return 100;
@@ -49299,6 +49331,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49299
49331
  { name: 'chunkSize', type: 'number' },
49300
49332
  { name: 'forcedUpdateRes', type: 'boolean' },
49301
49333
  { name: 'bootloaderBinary', type: 'buffer' },
49334
+ { name: 'bootResourcesBinary', type: 'buffer' },
49302
49335
  { name: 'romloaderBinary', type: 'buffer' },
49303
49336
  { name: 'applicationP1Binary', type: 'buffer' },
49304
49337
  { name: 'applicationP2Binary', type: 'buffer' },
@@ -49316,6 +49349,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49316
49349
  chunkSize: payload.chunkSize,
49317
49350
  forcedUpdateRes: payload.forcedUpdateRes,
49318
49351
  bootloaderBinary: payload.bootloaderBinary,
49352
+ bootResourcesBinary: payload.bootResourcesBinary,
49319
49353
  romloaderBinary: payload.romloaderBinary,
49320
49354
  applicationP1Binary: payload.applicationP1Binary,
49321
49355
  applicationP2Binary: payload.applicationP2Binary,
@@ -49351,7 +49385,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49351
49385
  });
49352
49386
  }
49353
49387
  runProtocolV2() {
49354
- var _a, _b, _c, _d;
49388
+ var _a, _b, _c, _d, _e;
49355
49389
  return __awaiter(this, void 0, void 0, function* () {
49356
49390
  yield this.captureProtocolV2PhysicalIdentity();
49357
49391
  const deviceFeatures = yield this.getProtocolV2DeviceFeatures();
@@ -49360,6 +49394,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49360
49394
  const resourceRecoveryMode = Boolean(this.isProtocolV2BootloaderMode() || this.isProtocolV2RomloaderMode());
49361
49395
  let fwBinaryMap = [];
49362
49396
  let bootloaderBinary = null;
49397
+ let bootResourcesInstallItem;
49363
49398
  let installItems;
49364
49399
  let resourceBundles;
49365
49400
  try {
@@ -49369,7 +49404,9 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49369
49404
  const needsRemoteFirmware = !this.hasExplicitProtocolV2Payload(fwBinaryMap);
49370
49405
  const needsRemoteResources = !((_b = this.params.resourceBundleFiles) === null || _b === void 0 ? void 0 : _b.length) &&
49371
49406
  !!((_c = this.params.targetsToUpdate) === null || _c === void 0 ? void 0 : _c.includes('resource'));
49372
- if (needsRemoteFirmware || needsRemoteResources) {
49407
+ const needsRemoteBootResources = !this.params.bootResourcesBinary &&
49408
+ !!((_d = this.params.targetsToUpdate) === null || _d === void 0 ? void 0 : _d.includes('boot_resources'));
49409
+ if (needsRemoteFirmware || needsRemoteResources || needsRemoteBootResources) {
49373
49410
  yield DataManager.forceReloadData();
49374
49411
  }
49375
49412
  if (needsRemoteFirmware) {
@@ -49378,13 +49415,23 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49378
49415
  fwBinaryMap = remoteBinaries.fwBinaryMap;
49379
49416
  installItems = remoteBinaries.installItems;
49380
49417
  }
49418
+ bootResourcesInstallItem = yield this.prepareProtocolV2BootResources();
49419
+ if (bootResourcesInstallItem) {
49420
+ installItems = [
49421
+ bootResourcesInstallItem,
49422
+ ...(installItems !== null && installItems !== void 0 ? installItems : this.buildProtocolV2InstallItems({ bootloaderBinary, fwBinaryMap })),
49423
+ ];
49424
+ }
49381
49425
  resourceBundles = yield this.prepareProtocolV2ResourceBundles(resourceRecoveryMode);
49382
49426
  this.postTipMessage(exports.FirmwareUpdateTipMessage.FinishDownloadFirmware);
49383
49427
  }
49384
49428
  catch (err) {
49385
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.FirmwareUpdateDownloadFailed, (_d = err.message) !== null && _d !== void 0 ? _d : err);
49429
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.FirmwareUpdateDownloadFailed, (_e = err.message) !== null && _e !== void 0 ? _e : err);
49386
49430
  }
49387
- if (!bootloaderBinary && fwBinaryMap.length === 0 && !(resourceBundles === null || resourceBundles === void 0 ? void 0 : resourceBundles.length)) {
49431
+ if (!bootloaderBinary &&
49432
+ fwBinaryMap.length === 0 &&
49433
+ !(installItems === null || installItems === void 0 ? void 0 : installItems.length) &&
49434
+ !(resourceBundles === null || resourceBundles === void 0 ? void 0 : resourceBundles.length)) {
49388
49435
  if (resourceBundles !== undefined) {
49389
49436
  this.postTipMessage(exports.FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
49390
49437
  return this.getProtocolV2VersionResult(deviceFeatures);
@@ -49453,6 +49500,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49453
49500
  var _a;
49454
49501
  return (!!((_a = this.params.resourceBundleFiles) === null || _a === void 0 ? void 0 : _a.length) ||
49455
49502
  !!this.params.bootloaderBinary ||
49503
+ !!this.params.bootResourcesBinary ||
49456
49504
  fwBinaryMap.length > 0);
49457
49505
  }
49458
49506
  buildProtocolV2InstallItems({ bootloaderBinary, fwBinaryMap, }) {
@@ -49567,6 +49615,50 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
49567
49615
  };
49568
49616
  });
49569
49617
  }
49618
+ validateProtocolV2BootResourcesBinary(binary, resource) {
49619
+ if (resource && !isProtocolV2ResourceFileValid(binary, resource)) {
49620
+ throw new Error('Pro2 boot resources file verification failed');
49621
+ }
49622
+ const header = parseProtocolV2OkppHeader(toProtocolV2Bytes(binary));
49623
+ if (!header || header.type !== 'CRAT') {
49624
+ throw new Error('Invalid Pro2 boot resources CRATE header');
49625
+ }
49626
+ if (resource) {
49627
+ const expectedPayloadHash = normalizeProtocolV2Hex(resource.payloadHash);
49628
+ const expectedHeaderHash = normalizeProtocolV2Hex(resource.headerHash);
49629
+ if (header.payloadHash !== expectedPayloadHash) {
49630
+ throw new Error('Pro2 boot resources payload hash mismatch');
49631
+ }
49632
+ if (header.headerHash !== expectedHeaderHash) {
49633
+ throw new Error('Pro2 boot resources header hash mismatch');
49634
+ }
49635
+ }
49636
+ }
49637
+ prepareProtocolV2BootResources() {
49638
+ var _a;
49639
+ return __awaiter(this, void 0, void 0, function* () {
49640
+ let binary = this.params.bootResourcesBinary;
49641
+ let resource;
49642
+ if (!binary) {
49643
+ if (!((_a = this.params.targetsToUpdate) === null || _a === void 0 ? void 0 : _a.includes('boot_resources'))) {
49644
+ return undefined;
49645
+ }
49646
+ resource = DataManager.getProtocolV2BootResources();
49647
+ if (!resource) {
49648
+ throw new Error('Missing Pro2 boot resources configuration');
49649
+ }
49650
+ Log$5.log('[FirmwareUpdateV4] downloading Pro2 boot resources CRATE');
49651
+ ({ binary } = yield getSysResourceBinary(resource.url));
49652
+ }
49653
+ this.validateProtocolV2BootResourcesBinary(binary, resource);
49654
+ return {
49655
+ fileName: PROTOCOL_V2_BOOT_RESOURCES_FILE_NAME,
49656
+ binary,
49657
+ targetId: ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_CRATE,
49658
+ kind: 'boot_resources',
49659
+ };
49660
+ });
49661
+ }
49570
49662
  prepareProtocolV2ResourceBundles(recoveryMode) {
49571
49663
  var _a, _b;
49572
49664
  return __awaiter(this, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/protocols/protocol-v2/resources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,eAAO,MAAM,0BAA0B,kFAOgB,CAAC;AAExD,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAQ7F,CAAC;AAKJ,eAAO,MAAM,yCAAyC,QAAW,CAAC;AAiBlE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,aAAa,GAAG,qBAAqB,CAAC;AAEjF,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACzC,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC,CAAC;AAGF,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,iBAAiB,GAAG,OAAO,GACjC,+BAA+B,EAAE,CAgCnC;AAED,wBAAsB,kCAAkC,CAAC,EACvD,QAAQ,EACR,SAAqD,GACtD,EAAE;IACD,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAQ7C;AAuCD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CA6BzF;AAGD,wBAAgB,iCAAiC,CAAC,EAChD,SAAS,EACT,SAAS,EACT,IAAI,EACJ,MAAc,GACf,EAAE;IACD,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACvD,IAAI,EAAE,4BAA4B,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,4BAA4B,CAyB/B;AAOD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,UAAU,CAAC,GACvD,OAAO,CAGT"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/protocols/protocol-v2/resources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,eAAO,MAAM,0BAA0B,kFAOgB,CAAC;AAExD,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAQ7F,CAAC;AAKJ,eAAO,MAAM,yCAAyC,QAAW,CAAC;AAiBlE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,aAAa,GAAG,qBAAqB,CAAC;AAEjF,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACzC,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC,CAAC;AAGF,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,iBAAiB,GAAG,OAAO,GACjC,+BAA+B,EAAE,CAgCnC;AAED,wBAAsB,kCAAkC,CAAC,EACvD,QAAQ,EACR,SAAqD,GACtD,EAAE;IACD,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAQ7C;AAmED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAgCzF;AAGD,wBAAgB,iCAAiC,CAAC,EAChD,SAAS,EACT,SAAS,EACT,IAAI,EACJ,MAAc,GACf,EAAE;IACD,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACvD,IAAI,EAAE,4BAA4B,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,4BAA4B,CAyB/B;AAOD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,UAAU,CAAC,GACvD,OAAO,CAGT"}
@@ -38,7 +38,7 @@ export interface FirmwareUpdateV3Params {
38
38
  firmwareType?: EFirmwareType;
39
39
  platform: IPlatform;
40
40
  }
41
- export type FirmwareUpdateV4Target = 'boot' | 'app_v1' | 'app_v2' | 'coprocessor' | 'resource' | 'se01' | 'se02' | 'se03' | 'se04';
41
+ export type FirmwareUpdateV4Target = 'boot' | 'boot_resources' | 'app_v1' | 'app_v2' | 'coprocessor' | 'resource' | 'se01' | 'se02' | 'se03' | 'se04';
42
42
  export interface FirmwareUpdateV4Params {
43
43
  platform: IPlatform;
44
44
  chunkSize?: number;
@@ -46,6 +46,7 @@ export interface FirmwareUpdateV4Params {
46
46
  targetsToUpdate?: FirmwareUpdateV4Target[];
47
47
  romloaderBinary?: ArrayBuffer;
48
48
  bootloaderBinary?: ArrayBuffer;
49
+ bootResourcesBinary?: ArrayBuffer;
49
50
  applicationP1Binary?: ArrayBuffer;
50
51
  applicationP2Binary?: ArrayBuffer;
51
52
  coprocessorBinary?: ArrayBuffer;
@@ -1 +1 @@
1
- {"version":3,"file":"firmwareUpdate.d.ts","sourceRoot":"","sources":["../../../src/types/api/firmwareUpdate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firmwareUpdate.d.ts","sourceRoot":"","sources":["../../../src/types/api/firmwareUpdate.ts"],"names":[],"mappings":"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"}
@@ -40,8 +40,18 @@ export type IProtocolV2Resource = {
40
40
  fileHash: string;
41
41
  headerHash: string;
42
42
  };
43
+ export type IProtocolV2BootResources = {
44
+ required: false;
45
+ target: 'CRATE';
46
+ url: string;
47
+ size: number;
48
+ fileHash: string;
49
+ payloadHash: string;
50
+ headerHash: string;
51
+ };
43
52
  export type IProtocolV2Resources = {
44
53
  stable: IProtocolV2Resource[];
54
+ boot?: IProtocolV2BootResources;
45
55
  };
46
56
  export type IProtocolV2ResourceBundle = {
47
57
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-core",
3
- "version": "1.2.0-alpha.44",
3
+ "version": "1.2.0-alpha.45",
4
4
  "description": "Core processes and APIs for communicating with OneKey hardware devices.",
5
5
  "author": "OneKey",
6
6
  "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
@@ -25,8 +25,8 @@
25
25
  "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@onekeyfe/hd-shared": "1.2.0-alpha.44",
29
- "@onekeyfe/hd-transport": "1.2.0-alpha.44",
28
+ "@onekeyfe/hd-shared": "1.2.0-alpha.45",
29
+ "@onekeyfe/hd-transport": "1.2.0-alpha.45",
30
30
  "axios": "1.15.2",
31
31
  "bignumber.js": "^9.0.2",
32
32
  "bytebuffer": "^5.0.1",
@@ -44,5 +44,5 @@
44
44
  "@types/w3c-web-usb": "^1.0.10",
45
45
  "@types/web-bluetooth": "^0.0.21"
46
46
  },
47
- "gitHead": "6de180b61cd4a64f41cf4ffd32eeb8a1cc4e64e7"
47
+ "gitHead": "8fc6c0d642bfaa268d23a2aa2a98e235d1a876f6"
48
48
  }
@@ -45,6 +45,7 @@ import type { TypedResponseMessage } from '../device/DeviceCommands';
45
45
  import type {
46
46
  Features,
47
47
  IFirmwareReleaseInfo,
48
+ IProtocolV2BootResources,
48
49
  IProtocolV2FirmwareComponent,
49
50
  IProtocolV2Resource,
50
51
  IVersionArray,
@@ -74,6 +75,7 @@ const PROTOCOL_V2_OKPP_HEADER_SIZE = 0x52a0;
74
75
  const PROTOCOL_V2_OKPP_PAYLOAD_HASH_OFFSET = 0x200;
75
76
  const PROTOCOL_V2_OKPP_HEADER_HASH_OFFSET = 0x240;
76
77
  const PROTOCOL_V2_OKPP_HASH_SIZE = 64;
78
+ const PROTOCOL_V2_BOOT_RESOURCES_FILE_NAME = 'boot_resources.crate.okpkg';
77
79
 
78
80
  const getProtocolV2DeviceTransferProgress = (
79
81
  bytesBeforeChunk: number,
@@ -108,7 +110,7 @@ type ProtocolV2FirmwareUpdateStartResponse = TypedResponseMessage<'Success'>;
108
110
 
109
111
  type ProtocolV2TargetBinary = { fileName: string; binary: ArrayBuffer; targetId: number };
110
112
  type ProtocolV2InstallItem = ProtocolV2TargetBinary & {
111
- kind: ProtocolV2RemoteComponentTarget['kind'];
113
+ kind: ProtocolV2RemoteComponentTarget['kind'] | 'boot_resources';
112
114
  };
113
115
  type ProtocolV2InstallTarget = ProtocolV2InstallItem & {
114
116
  path: string;
@@ -424,6 +426,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
424
426
  { name: 'chunkSize', type: 'number' },
425
427
  { name: 'forcedUpdateRes', type: 'boolean' },
426
428
  { name: 'bootloaderBinary', type: 'buffer' },
429
+ { name: 'bootResourcesBinary', type: 'buffer' },
427
430
  { name: 'romloaderBinary', type: 'buffer' },
428
431
  { name: 'applicationP1Binary', type: 'buffer' },
429
432
  { name: 'applicationP2Binary', type: 'buffer' },
@@ -442,6 +445,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
442
445
  chunkSize: payload.chunkSize,
443
446
  forcedUpdateRes: payload.forcedUpdateRes,
444
447
  bootloaderBinary: payload.bootloaderBinary,
448
+ bootResourcesBinary: payload.bootResourcesBinary,
445
449
  romloaderBinary: payload.romloaderBinary,
446
450
  applicationP1Binary: payload.applicationP1Binary,
447
451
  applicationP2Binary: payload.applicationP2Binary,
@@ -490,6 +494,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
490
494
 
491
495
  let fwBinaryMap: ProtocolV2TargetBinary[] = [];
492
496
  let bootloaderBinary: ArrayBuffer | null = null;
497
+ let bootResourcesInstallItem: ProtocolV2InstallItem | undefined;
493
498
  let installItems: ProtocolV2InstallItem[] | undefined;
494
499
  let resourceBundles: ProtocolV2ResourceBundleBinary[] | undefined;
495
500
  try {
@@ -500,7 +505,10 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
500
505
  const needsRemoteResources =
501
506
  !this.params.resourceBundleFiles?.length &&
502
507
  !!this.params.targetsToUpdate?.includes('resource');
503
- if (needsRemoteFirmware || needsRemoteResources) {
508
+ const needsRemoteBootResources =
509
+ !this.params.bootResourcesBinary &&
510
+ !!this.params.targetsToUpdate?.includes('boot_resources');
511
+ if (needsRemoteFirmware || needsRemoteResources || needsRemoteBootResources) {
504
512
  // Remote updates must use a freshly fetched config before any reboot or file write.
505
513
  await DataManager.forceReloadData();
506
514
  }
@@ -513,13 +521,25 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
513
521
  fwBinaryMap = remoteBinaries.fwBinaryMap;
514
522
  installItems = remoteBinaries.installItems;
515
523
  }
524
+ bootResourcesInstallItem = await this.prepareProtocolV2BootResources();
525
+ if (bootResourcesInstallItem) {
526
+ installItems = [
527
+ bootResourcesInstallItem,
528
+ ...(installItems ?? this.buildProtocolV2InstallItems({ bootloaderBinary, fwBinaryMap })),
529
+ ];
530
+ }
516
531
  resourceBundles = await this.prepareProtocolV2ResourceBundles(resourceRecoveryMode);
517
532
  this.postTipMessage(FirmwareUpdateTipMessage.FinishDownloadFirmware);
518
533
  } catch (err) {
519
534
  throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateDownloadFailed, err.message ?? err);
520
535
  }
521
536
 
522
- if (!bootloaderBinary && fwBinaryMap.length === 0 && !resourceBundles?.length) {
537
+ if (
538
+ !bootloaderBinary &&
539
+ fwBinaryMap.length === 0 &&
540
+ !installItems?.length &&
541
+ !resourceBundles?.length
542
+ ) {
523
543
  if (resourceBundles !== undefined) {
524
544
  this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
525
545
  return this.getProtocolV2VersionResult(deviceFeatures);
@@ -599,6 +619,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
599
619
  return (
600
620
  !!this.params.resourceBundleFiles?.length ||
601
621
  !!this.params.bootloaderBinary ||
622
+ !!this.params.bootResourcesBinary ||
602
623
  fwBinaryMap.length > 0
603
624
  );
604
625
  }
@@ -748,6 +769,54 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
748
769
  };
749
770
  }
750
771
 
772
+ private validateProtocolV2BootResourcesBinary(
773
+ binary: ArrayBuffer,
774
+ resource?: IProtocolV2BootResources
775
+ ) {
776
+ if (resource && !isProtocolV2ResourceFileValid(binary, resource)) {
777
+ throw new Error('Pro2 boot resources file verification failed');
778
+ }
779
+ const header = parseProtocolV2OkppHeader(toProtocolV2Bytes(binary));
780
+ if (!header || header.type !== 'CRAT') {
781
+ throw new Error('Invalid Pro2 boot resources CRATE header');
782
+ }
783
+ if (resource) {
784
+ const expectedPayloadHash = normalizeProtocolV2Hex(resource.payloadHash);
785
+ const expectedHeaderHash = normalizeProtocolV2Hex(resource.headerHash);
786
+ if (header.payloadHash !== expectedPayloadHash) {
787
+ throw new Error('Pro2 boot resources payload hash mismatch');
788
+ }
789
+ if (header.headerHash !== expectedHeaderHash) {
790
+ throw new Error('Pro2 boot resources header hash mismatch');
791
+ }
792
+ }
793
+ }
794
+
795
+ private async prepareProtocolV2BootResources(): Promise<ProtocolV2InstallItem | undefined> {
796
+ let binary = this.params.bootResourcesBinary;
797
+ let resource: IProtocolV2BootResources | undefined;
798
+
799
+ if (!binary) {
800
+ if (!this.params.targetsToUpdate?.includes('boot_resources')) {
801
+ return undefined;
802
+ }
803
+ resource = DataManager.getProtocolV2BootResources();
804
+ if (!resource) {
805
+ throw new Error('Missing Pro2 boot resources configuration');
806
+ }
807
+ Log.log('[FirmwareUpdateV4] downloading Pro2 boot resources CRATE');
808
+ ({ binary } = await getSysResourceBinary(resource.url));
809
+ }
810
+
811
+ this.validateProtocolV2BootResourcesBinary(binary, resource);
812
+ return {
813
+ fileName: PROTOCOL_V2_BOOT_RESOURCES_FILE_NAME,
814
+ binary,
815
+ targetId: ProtocolV2FirmwareTargetType.FW_MGMT_TARGET_CRATE,
816
+ kind: 'boot_resources',
817
+ };
818
+ }
819
+
751
820
  private async prepareProtocolV2ResourceBundles(
752
821
  recoveryMode: boolean
753
822
  ): Promise<ProtocolV2ResourceBundleBinary[] | undefined> {
@@ -509,6 +509,10 @@ export default class DataManager {
509
509
  return this.deviceMap[EDeviceType.Pro2]?.resources?.stable;
510
510
  }
511
511
 
512
+ static getProtocolV2BootResources() {
513
+ return this.deviceMap[EDeviceType.Pro2]?.resources?.boot;
514
+ }
515
+
512
516
  static getProtobufMessages(schema: ProtobufMessageSchema = 'v1CurrentSchema'): JSON {
513
517
  return this.messages[schema];
514
518
  }
@@ -1,6 +1,7 @@
1
1
  import { sha256 } from '@noble/hashes/sha256';
2
2
 
3
3
  import type {
4
+ IProtocolV2BootResources,
4
5
  IProtocolV2Resource,
5
6
  IProtocolV2ResourceType,
6
7
  IProtocolV2Resources,
@@ -149,6 +150,34 @@ function validateResource(value: unknown, index: number): IProtocolV2Resource {
149
150
  };
150
151
  }
151
152
 
153
+ function validateBootResources(value: unknown): IProtocolV2BootResources {
154
+ if (!value || typeof value !== 'object') {
155
+ throw new Error('Invalid Pro2 boot resources config');
156
+ }
157
+ const resource = value as Partial<IProtocolV2BootResources>;
158
+ if (resource.required !== false) {
159
+ throw new Error('Invalid Pro2 boot resources required flag: expected false');
160
+ }
161
+ if (resource.target !== 'CRATE') {
162
+ throw new Error('Invalid Pro2 boot resources target: expected CRATE');
163
+ }
164
+ if (typeof resource.url !== 'string' || !resource.url.startsWith('https://')) {
165
+ throw new Error('Invalid Pro2 boot resources url');
166
+ }
167
+ if (!Number.isSafeInteger(resource.size) || Number(resource.size) <= 0) {
168
+ throw new Error('Invalid Pro2 boot resources size');
169
+ }
170
+ return {
171
+ required: false,
172
+ target: 'CRATE',
173
+ url: resource.url,
174
+ size: Number(resource.size),
175
+ fileHash: normalizeHex(resource.fileHash, SHA256_HEX_LENGTH, 'boot fileHash'),
176
+ payloadHash: normalizeHex(resource.payloadHash, SHA3_512_HEX_LENGTH, 'boot payloadHash'),
177
+ headerHash: normalizeHex(resource.headerHash, SHA3_512_HEX_LENGTH, 'boot headerHash'),
178
+ };
179
+ }
180
+
152
181
  /** Validate a complete Pro2 stable resource set from remote configuration. */
153
182
  export function parseProtocolV2Resources(value: unknown): IProtocolV2Resources | undefined {
154
183
  if (value === undefined) return undefined;
@@ -160,7 +189,8 @@ export function parseProtocolV2Resources(value: unknown): IProtocolV2Resources |
160
189
  throw new Error('Invalid Pro2 resources config: stable must be an array');
161
190
  }
162
191
 
163
- const stable = (value as { stable: unknown[] }).stable.map(validateResource);
192
+ const config = value as { stable: unknown[]; boot?: unknown };
193
+ const stable = config.stable.map(validateResource);
164
194
  const types = new Set(stable.map(resource => resource.type));
165
195
  if (stable.length !== PROTOCOL_V2_RESOURCE_TYPES.length || types.size !== stable.length) {
166
196
  throw new Error('Invalid Pro2 resources config: stable must contain six unique resource types');
@@ -170,6 +200,7 @@ export function parseProtocolV2Resources(value: unknown): IProtocolV2Resources |
170
200
  throw new Error(`Invalid Pro2 resources config: stable is missing ${type}`);
171
201
  }
172
202
  }
203
+ const boot = config.boot === undefined ? undefined : validateBootResources(config.boot);
173
204
  return {
174
205
  stable: PROTOCOL_V2_RESOURCE_TYPES.map(type => {
175
206
  const resource = stable.find(item => item.type === type);
@@ -178,6 +209,7 @@ export function parseProtocolV2Resources(value: unknown): IProtocolV2Resources |
178
209
  }
179
210
  return resource;
180
211
  }),
212
+ ...(boot ? { boot } : undefined),
181
213
  };
182
214
  }
183
215
 
@@ -63,6 +63,7 @@ export interface FirmwareUpdateV3Params {
63
63
  */
64
64
  export type FirmwareUpdateV4Target =
65
65
  | 'boot'
66
+ | 'boot_resources'
66
67
  | 'app_v1'
67
68
  | 'app_v2'
68
69
  | 'coprocessor'
@@ -82,6 +83,8 @@ export interface FirmwareUpdateV4Params {
82
83
  romloaderBinary?: ArrayBuffer;
83
84
  /** FW_MGMT_TARGET_BOOTLOADER = 3 */
84
85
  bootloaderBinary?: ArrayBuffer;
86
+ /** FW_MGMT_TARGET_CRATE = 1; optional Pro2 startup resources. */
87
+ bootResourcesBinary?: ArrayBuffer;
85
88
  /** FW_MGMT_TARGET_APPLICATION_P1 = 4 */
86
89
  applicationP1Binary?: ArrayBuffer;
87
90
  /** FW_MGMT_TARGET_APPLICATION_P2 = 5 */
@@ -81,8 +81,24 @@ export type IProtocolV2Resource = {
81
81
  headerHash: string;
82
82
  };
83
83
 
84
+ /** Optional Pro2 startup-resource CRATE installed by the bootloader updater. */
85
+ export type IProtocolV2BootResources = {
86
+ required: false;
87
+ target: 'CRATE';
88
+ url: string;
89
+ /** Complete CRATE file size in bytes. */
90
+ size: number;
91
+ /** SHA-256 of the complete CRATE file. */
92
+ fileHash: string;
93
+ /** SHA3-512 payload_hash from the signed CRATE header. */
94
+ payloadHash: string;
95
+ /** SHA3-512 header_hash from the signed CRATE header. */
96
+ headerHash: string;
97
+ };
98
+
84
99
  export type IProtocolV2Resources = {
85
100
  stable: IProtocolV2Resource[];
101
+ boot?: IProtocolV2BootResources;
86
102
  };
87
103
 
88
104
  /** Pro2 RESC bundle okpkg descriptor for incremental FileWrite synchronization. */