From 9b1787a6683ea265cd3ef6adb3913b71b977d7b9 Mon Sep 17 00:00:00 2001 From: ByteZhang Date: Mon, 25 Dec 2023 12:57:12 +0800 Subject: [PATCH] fix: 1s sign type data (#297) * fix: 1s sign type data * chore: update version --- .../connect-examples/expo-example/package.json | 10 +++++----- .../expo-example/src/utils/hardwareInstance.ts | 3 ++- packages/core/package.json | 6 +++--- packages/core/src/api/CheckBootloaderRelease.ts | 4 +++- packages/core/src/api/CheckBridgeRelease.ts | 4 +++- packages/core/src/api/FirmwareUpdateV2.ts | 6 ++++-- packages/core/src/api/device/DeviceVerify.ts | 3 ++- packages/core/src/api/evm/EVMSignTypedData.ts | 10 +++++++--- packages/core/src/api/firmware/updateBootloader.ts | 4 ++-- packages/core/src/data-manager/DataManager.ts | 7 ++++--- packages/core/src/types/device.ts | 14 +++++++++----- packages/core/src/utils/deviceFeaturesUtils.ts | 7 ++++--- packages/hd-ble-sdk/package.json | 8 ++++---- packages/hd-common-connect-sdk/package.json | 12 ++++++------ packages/hd-transport-http/package.json | 6 +++--- packages/hd-transport-lowlevel/package.json | 6 +++--- packages/hd-transport-react-native/package.json | 6 +++--- packages/hd-transport-webusb/package.json | 6 +++--- packages/hd-transport/package.json | 2 +- packages/hd-web-sdk/package.json | 10 +++++----- packages/shared/package.json | 2 +- 21 files changed, 77 insertions(+), 59 deletions(-) diff --git a/packages/connect-examples/expo-example/package.json b/packages/connect-examples/expo-example/package.json index 71fd5f639..d6c7969a3 100644 --- a/packages/connect-examples/expo-example/package.json +++ b/packages/connect-examples/expo-example/package.json @@ -1,6 +1,6 @@ { "name": "expo-example", - "version": "0.3.35", + "version": "0.3.36", "scripts": { "start": "expo start --dev-client", "android": "expo run:android", @@ -11,10 +11,10 @@ "dependencies": { "@expo/webpack-config": "^18.1.3", "@noble/hashes": "^1.3.2", - "@onekeyfe/hd-ble-sdk": "^0.3.35", - "@onekeyfe/hd-common-connect-sdk": "^0.3.35", - "@onekeyfe/hd-core": "^0.3.35", - "@onekeyfe/hd-web-sdk": "^0.3.35", + "@onekeyfe/hd-ble-sdk": "^0.3.36", + "@onekeyfe/hd-common-connect-sdk": "^0.3.36", + "@onekeyfe/hd-core": "^0.3.36", + "@onekeyfe/hd-web-sdk": "^0.3.36", "@onekeyfe/react-native-ble-plx": "3.0.0", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-picker/picker": "2.4.10", diff --git a/packages/connect-examples/expo-example/src/utils/hardwareInstance.ts b/packages/connect-examples/expo-example/src/utils/hardwareInstance.ts index 231c0cae4..dee0b6c1d 100644 --- a/packages/connect-examples/expo-example/src/utils/hardwareInstance.ts +++ b/packages/connect-examples/expo-example/src/utils/hardwareInstance.ts @@ -35,7 +35,8 @@ export const getHardwareSDKInstance = memoizee( console.log(HardwareSDK); if (Platform.OS === 'web') { - settings.connectSrc = 'https://jssdk.onekey.so/0.3.34/'; + settings.connectSrc = 'https://jssdk.onekey.so/0.3.36/'; + // settings.connectSrc = 'https://localhost:8087/'; settings.env = 'web'; settings.preRelease = false; // HardwareLowLevelSDK = await importLowLevelSDK(); diff --git a/packages/core/package.json b/packages/core/package.json index 3ef6b331b..9e8b016ff 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-core", - "version": "0.3.35", + "version": "0.3.36", "description": "> TODO: description", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", @@ -25,8 +25,8 @@ "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues" }, "dependencies": { - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport": "^0.3.35", + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport": "^0.3.36", "axios": "^0.27.2", "bignumber.js": "^9.0.2", "bytebuffer": "^5.0.1", diff --git a/packages/core/src/api/CheckBootloaderRelease.ts b/packages/core/src/api/CheckBootloaderRelease.ts index 68878ade4..509c2ff5c 100644 --- a/packages/core/src/api/CheckBootloaderRelease.ts +++ b/packages/core/src/api/CheckBootloaderRelease.ts @@ -7,6 +7,7 @@ import { } from './firmware/updateBootloader'; import { DataManager } from '../data-manager'; import { getDeviceType } from '../utils'; +import { DeviceModelToTypes } from '../types'; export default class CheckBootloaderRelease extends BaseMethod { init() { @@ -22,7 +23,8 @@ export default class CheckBootloaderRelease extends BaseMethod { const { features } = this.device; const deviceType = getDeviceType(features); let shouldUpdate = false; - if (deviceType === 'classic' || deviceType === 'mini') { + // classic mini classic1s + if (DeviceModelToTypes.model_mini.includes(deviceType)) { shouldUpdate = !!checkNeedUpdateBootForClassicAndMini( features, this.payload.willUpdateFirmwareVersion diff --git a/packages/core/src/api/CheckBridgeRelease.ts b/packages/core/src/api/CheckBridgeRelease.ts index 69be73c82..fd1c04cc5 100644 --- a/packages/core/src/api/CheckBridgeRelease.ts +++ b/packages/core/src/api/CheckBridgeRelease.ts @@ -5,6 +5,7 @@ import { BaseMethod } from './BaseMethod'; import { UI_REQUEST } from '../constants/ui-request'; import { getDeviceType } from '../utils'; import { getDeviceFirmwareVersion } from '../utils/deviceFeaturesUtils'; +import { DeviceModelToTypes } from '../types'; const BridgeVersion = '2.2.0'; const TouchNeedUpdateVersion = '4.3.0'; @@ -45,7 +46,8 @@ export default class CheckBridgeRelease extends BaseMethod { shouldUpdate = true; } } - if (deviceType === 'classic' || deviceType === 'mini') { + // classic mini classic1s + if (DeviceModelToTypes.model_mini.includes(deviceType)) { if ( semver.gte(willUpdateFirmwareVersion, ClassicAndMiniNeedUpdateVersion) && isOldVersionBridge diff --git a/packages/core/src/api/FirmwareUpdateV2.ts b/packages/core/src/api/FirmwareUpdateV2.ts index 2d1266477..3a94e40ca 100644 --- a/packages/core/src/api/FirmwareUpdateV2.ts +++ b/packages/core/src/api/FirmwareUpdateV2.ts @@ -14,10 +14,12 @@ import { getBinary, getInfo, getSysResourceBinary } from './firmware/getBinary'; import { updateResources, uploadFirmware } from './firmware/uploadFirmware'; import { getDeviceType, getDeviceUUID, wait, getLogger, LoggerNames } from '../utils'; import { createUiMessage } from '../events/ui-request'; -import type { KnownDevice, Features } from '../types'; +import { DeviceModelToTypes } from '../types'; import { DataManager } from '../data-manager'; import { getDeviceFirmwareVersion } from '../utils/deviceFeaturesUtils'; +import type { KnownDevice, Features } from '../types'; + type Params = { binary?: ArrayBuffer; version?: number[]; @@ -235,7 +237,7 @@ export default class FirmwareUpdateV2 extends BaseMethod { this.checkDeviceToBootloader(this.payload.connectId); // force clean classic device cache so that the device can initialize again - if (deviceType === 'classic') { + if (DeviceModelToTypes.model_classic.includes(deviceType)) { DevicePool.clearDeviceCache(uuid); } delete DevicePool.devicesCache['']; diff --git a/packages/core/src/api/device/DeviceVerify.ts b/packages/core/src/api/device/DeviceVerify.ts index 36c69dbae..6aab8fd3e 100644 --- a/packages/core/src/api/device/DeviceVerify.ts +++ b/packages/core/src/api/device/DeviceVerify.ts @@ -6,6 +6,7 @@ import { formatAnyHex } from '../helpers/hexUtils'; import { BaseMethod } from '../BaseMethod'; import { validateParams } from '../helpers/paramsValidator'; import { getDeviceType } from '../../utils'; +import { DeviceModelToTypes } from '../../types'; import type { DeviceVerifySignature } from '../../types'; export default class DeviceVerify extends BaseMethod { @@ -26,7 +27,7 @@ export default class DeviceVerify extends BaseMethod { const deviceType = getDeviceType(this.device.features); let response: DeviceVerifySignature | undefined; - if (deviceType === 'classic') { + if (DeviceModelToTypes.model_classic.includes(deviceType)) { const res = await this.device.commands.typedCall( 'BixinVerifyDeviceRequest', 'BixinVerifyDeviceAck', diff --git a/packages/core/src/api/evm/EVMSignTypedData.ts b/packages/core/src/api/evm/EVMSignTypedData.ts index d360879a4..f2e3975de 100644 --- a/packages/core/src/api/evm/EVMSignTypedData.ts +++ b/packages/core/src/api/evm/EVMSignTypedData.ts @@ -14,7 +14,11 @@ import { BaseMethod } from '../BaseMethod'; import { validateParams } from '../helpers/paramsValidator'; import { formatAnyHex } from '../helpers/hexUtils'; import { getDeviceFirmwareVersion, getDeviceType } from '../../utils/deviceFeaturesUtils'; -import type { EthereumSignTypedDataMessage, EthereumSignTypedDataTypes } from '../../types'; +import { + DeviceModelToTypes, + type EthereumSignTypedDataMessage, + type EthereumSignTypedDataTypes, +} from '../../types'; import TransportManager from '../../data-manager/TransportManager'; import { signTypedHash as signTypedHashLegacyV1 } from './legacyV1/signTypedHash'; import { signTypedHash } from './latest/signTypedHash'; @@ -348,7 +352,7 @@ export default class EVMSignTypedData extends BaseMethod supportSignTyped() { const deviceType = getDeviceType(this.device.features); - if (deviceType === 'classic' || deviceType === 'mini') { + if (DeviceModelToTypes.model_mini.includes(deviceType)) { const currentVersion = getDeviceFirmwareVersion(this.device.features).join('.'); const supportSignTypedVersion = '2.2.0'; @@ -372,7 +376,7 @@ export default class EVMSignTypedData extends BaseMethod // For Classic、Mini device we use EthereumSignTypedData const deviceType = getDeviceType(this.device.features); - if (deviceType === 'classic' || deviceType === 'mini') { + if (DeviceModelToTypes.model_mini.includes(deviceType)) { validateParams(this.params, [ { name: 'domainHash', type: 'hexString', required: true }, { name: 'messageHash', type: 'hexString', required: true }, diff --git a/packages/core/src/api/firmware/updateBootloader.ts b/packages/core/src/api/firmware/updateBootloader.ts index 23d352781..2d271529b 100644 --- a/packages/core/src/api/firmware/updateBootloader.ts +++ b/packages/core/src/api/firmware/updateBootloader.ts @@ -1,6 +1,6 @@ import ByteBuffer from 'bytebuffer'; import semver from 'semver'; -import { Features } from '../../types'; +import { DeviceModelToTypes, Features } from '../../types'; import { getDeviceType } from '../../utils'; import { getDeviceBootloaderVersion, @@ -32,7 +32,7 @@ export function checkNeedUpdateBootForClassicAndMini( willUpdateFirmware: string ) { const deviceType = getDeviceType(features); - if (deviceType !== 'classic' && deviceType !== 'mini') return false; + if (!DeviceModelToTypes.model_mini.includes(deviceType)) return false; if (!willUpdateFirmware) return false; const currentVersion = getDeviceFirmwareVersion(features).join('.'); const bootloaderVersion = getDeviceBootloaderVersion(features).join('.'); diff --git a/packages/core/src/data-manager/DataManager.ts b/packages/core/src/data-manager/DataManager.ts index 30b793d25..0a5789818 100644 --- a/packages/core/src/data-manager/DataManager.ts +++ b/packages/core/src/data-manager/DataManager.ts @@ -21,6 +21,7 @@ import type { IVersionArray, RemoteConfigResponse, } from '../types'; +import { DeviceModelToTypes } from '../types'; import { findLatestRelease, getReleaseChangelog, getReleaseStatus } from '../utils/release'; export type FirmwareField = 'firmware' | 'firmware-v2' | 'firmware-v4'; @@ -69,7 +70,7 @@ export default class DataManager { return 'none'; } - if (deviceType === 'classic' && features.bootloader_mode) { + if (DeviceModelToTypes.model_classic.includes(deviceType) && features.bootloader_mode) { return 'unknown'; } @@ -153,7 +154,7 @@ export default class DataManager { static getBootloaderRelatedFirmwareVersion = (features: Features): IVersionArray | undefined => { const deviceType = getDeviceType(features); - if (!(deviceType === 'classic' || deviceType === 'mini')) return undefined; + if (!DeviceModelToTypes.model_mini.includes(deviceType)) return undefined; const firmwareUpdateField = getFirmwareUpdateField({ features, updateType: 'firmware', @@ -172,7 +173,7 @@ export default class DataManager { if ( features.firmware_present === false || - (deviceType === 'classic' && features.bootloader_mode) + (DeviceModelToTypes.model_classic.includes(deviceType) && features.bootloader_mode) ) { return []; } diff --git a/packages/core/src/types/device.ts b/packages/core/src/types/device.ts index 8a10e84d4..70bc83557 100644 --- a/packages/core/src/types/device.ts +++ b/packages/core/src/types/device.ts @@ -73,18 +73,22 @@ export type Features = PROTO.Features; export type IDeviceType = 'classic' | 'classic1s' | 'mini' | 'touch' | 'pro'; -// model_mini: 'classic' | 'mini' -// model_touch: 'touch' | 'pro' -export type IDeviceModel = 'model_mini' | 'model_touch'; +/** + * model_classic: 'classic' | 'classic1s' + * model_mini: 'classic' | 'mini' + * model_touch: 'touch' | 'pro' + */ +export type IDeviceModel = 'model_classic' | 'model_mini' | 'model_touch'; export const DeviceModelToTypes: { [deviceModel in IDeviceModel]: IDeviceType[] } = { model_mini: ['classic', 'classic1s', 'mini'], model_touch: ['touch', 'pro'], + model_classic: ['classic', 'classic1s'], }; export const DeviceTypeToModels: { [deviceType in IDeviceType]: IDeviceModel[] } = { - classic: ['model_mini'], - classic1s: ['model_mini'], + classic: ['model_classic', 'model_mini'], + classic1s: ['model_classic', 'model_mini'], mini: ['model_mini'], touch: ['model_touch'], pro: ['model_touch'], diff --git a/packages/core/src/utils/deviceFeaturesUtils.ts b/packages/core/src/utils/deviceFeaturesUtils.ts index 311bba855..9a5b12668 100644 --- a/packages/core/src/utils/deviceFeaturesUtils.ts +++ b/packages/core/src/utils/deviceFeaturesUtils.ts @@ -9,7 +9,7 @@ import type { IVersionArray, SupportFeatureType, } from '../types'; -import { DeviceTypeToModels } from '../types'; +import { DeviceModelToTypes, DeviceTypeToModels } from '../types'; import DataManager, { FirmwareField, MessageVersion } from '../data-manager/DataManager'; import { PROTOBUF_MESSAGE_CONFIG } from '../data-manager/MessagesConfig'; import { Device } from '../device/Device'; @@ -68,6 +68,7 @@ export const getDeviceTypeByBleName = (name?: string): IDeviceType | null => { return 'classic'; }; +// @deprecated export const getDeviceTypeByDeviceId = (deviceId?: string): IDeviceType => { if (!deviceId) { return 'classic'; @@ -253,7 +254,7 @@ export const supportModifyHomescreen = (features?: Features): SupportFeatureType const currentVersion = getDeviceFirmwareVersion(features).join('.'); const deviceType = getDeviceType(features); - if (deviceType === 'classic' || deviceType === 'mini') { + if (DeviceModelToTypes.model_mini.includes(deviceType)) { return { support: true }; } @@ -278,7 +279,7 @@ export const getFirmwareUpdateField = ({ return 'ble'; } - if (deviceType === 'classic' || deviceType === 'mini') { + if (DeviceModelToTypes.model_mini.includes(deviceType)) { return 'firmware-v4'; } diff --git a/packages/hd-ble-sdk/package.json b/packages/hd-ble-sdk/package.json index acb43dc04..243697e81 100644 --- a/packages/hd-ble-sdk/package.json +++ b/packages/hd-ble-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-ble-sdk", - "version": "0.3.35", + "version": "0.3.36", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", "license": "ISC", @@ -20,8 +20,8 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@onekeyfe/hd-core": "^0.3.35", - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport-react-native": "^0.3.35" + "@onekeyfe/hd-core": "^0.3.36", + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport-react-native": "^0.3.36" } } diff --git a/packages/hd-common-connect-sdk/package.json b/packages/hd-common-connect-sdk/package.json index 698598cb8..57e04bbe2 100644 --- a/packages/hd-common-connect-sdk/package.json +++ b/packages/hd-common-connect-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-common-connect-sdk", - "version": "0.3.35", + "version": "0.3.36", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", "license": "ISC", @@ -20,10 +20,10 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@onekeyfe/hd-core": "^0.3.35", - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport-http": "^0.3.35", - "@onekeyfe/hd-transport-lowlevel": "^0.3.35", - "@onekeyfe/hd-transport-webusb": "^0.3.35" + "@onekeyfe/hd-core": "^0.3.36", + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport-http": "^0.3.36", + "@onekeyfe/hd-transport-lowlevel": "^0.3.36", + "@onekeyfe/hd-transport-webusb": "^0.3.36" } } diff --git a/packages/hd-transport-http/package.json b/packages/hd-transport-http/package.json index f484d3c73..5b37b52e5 100644 --- a/packages/hd-transport-http/package.json +++ b/packages/hd-transport-http/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-transport-http", - "version": "0.3.35", + "version": "0.3.36", "description": "hardware http transport", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", @@ -24,8 +24,8 @@ "url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues" }, "dependencies": { - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport": "^0.3.35", + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport": "^0.3.36", "axios": "^0.27.2" } } diff --git a/packages/hd-transport-lowlevel/package.json b/packages/hd-transport-lowlevel/package.json index c74becf82..2bbff7713 100644 --- a/packages/hd-transport-lowlevel/package.json +++ b/packages/hd-transport-lowlevel/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-transport-lowlevel", - "version": "0.3.35", + "version": "0.3.36", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", "license": "MIT", "main": "dist/index.js", @@ -19,7 +19,7 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport": "^0.3.35" + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport": "^0.3.36" } } diff --git a/packages/hd-transport-react-native/package.json b/packages/hd-transport-react-native/package.json index 6303e8898..51d0a5ab2 100644 --- a/packages/hd-transport-react-native/package.json +++ b/packages/hd-transport-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-transport-react-native", - "version": "0.3.35", + "version": "0.3.36", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", "license": "MIT", "main": "dist/index.js", @@ -19,8 +19,8 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport": "^0.3.35", + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport": "^0.3.36", "@onekeyfe/react-native-ble-plx": "3.0.0", "react-native-ble-manager": "^8.1.0" } diff --git a/packages/hd-transport-webusb/package.json b/packages/hd-transport-webusb/package.json index 37702203f..8e26cba99 100644 --- a/packages/hd-transport-webusb/package.json +++ b/packages/hd-transport-webusb/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-transport-webusb", - "version": "0.3.35", + "version": "0.3.36", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", "license": "MIT", @@ -20,8 +20,8 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport": "^0.3.35" + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport": "^0.3.36" }, "devDependencies": { "@types/w3c-web-usb": "^1.0.6" diff --git a/packages/hd-transport/package.json b/packages/hd-transport/package.json index 1b42e4fa0..f91bf77d8 100644 --- a/packages/hd-transport/package.json +++ b/packages/hd-transport/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-transport", - "version": "0.3.35", + "version": "0.3.36", "description": "> TODO: description", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", diff --git a/packages/hd-web-sdk/package.json b/packages/hd-web-sdk/package.json index bfa9b8c5c..5f3e7a59c 100644 --- a/packages/hd-web-sdk/package.json +++ b/packages/hd-web-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-web-sdk", - "version": "0.3.35", + "version": "0.3.36", "author": "OneKey", "homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme", "license": "ISC", @@ -21,10 +21,10 @@ }, "dependencies": { "@onekeyfe/cross-inpage-provider-core": "^0.0.17", - "@onekeyfe/hd-core": "^0.3.35", - "@onekeyfe/hd-shared": "^0.3.35", - "@onekeyfe/hd-transport-http": "^0.3.35", - "@onekeyfe/hd-transport-webusb": "^0.3.35" + "@onekeyfe/hd-core": "^0.3.36", + "@onekeyfe/hd-shared": "^0.3.36", + "@onekeyfe/hd-transport-http": "^0.3.36", + "@onekeyfe/hd-transport-webusb": "^0.3.36" }, "devDependencies": { "@babel/plugin-proposal-optional-chaining": "^7.17.12", diff --git a/packages/shared/package.json b/packages/shared/package.json index 6fb72c6fc..93b81e4d8 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/hd-shared", - "version": "0.3.35", + "version": "0.3.36", "description": "Hardware SDK's shared tool library", "keywords": [ "Hardware-SDK",