@onetokenfe/hd-core 1.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +6 -0
- package/README.md +32 -0
- package/__tests__/benfen.test.ts +68 -0
- package/__tests__/checkBootloaderReleast.test.ts +115 -0
- package/__tests__/evmSignTransaction.test.ts +419 -0
- package/jest.config.js +6 -0
- package/package.json +48 -0
- package/src/api/BaseMethod.ts +275 -0
- package/src/api/CheckAllFirmwareRelease.ts +73 -0
- package/src/api/CheckBLEFirmwareRelease.ts +23 -0
- package/src/api/CheckBootloaderRelease.ts +32 -0
- package/src/api/CheckBridgeRelease.ts +28 -0
- package/src/api/CheckBridgeStatus.ts +32 -0
- package/src/api/CheckFirmwareRelease.ts +31 -0
- package/src/api/CheckFirmwareTypeAvailable.tsx +30 -0
- package/src/api/CipherKeyValue.ts +68 -0
- package/src/api/FirmwareUpdate.ts +219 -0
- package/src/api/FirmwareUpdateV2.ts +408 -0
- package/src/api/FirmwareUpdateV3.ts +560 -0
- package/src/api/GetFeatures.ts +23 -0
- package/src/api/GetLogs.ts +40 -0
- package/src/api/GetOnetokenFeatures.ts +25 -0
- package/src/api/GetPassphraseState.ts +28 -0
- package/src/api/PromptWebDeviceAccess.ts +77 -0
- package/src/api/SearchDevices.ts +50 -0
- package/src/api/alephium/AlephiumGetAddress.ts +84 -0
- package/src/api/alephium/AlephiumSignMessage.ts +51 -0
- package/src/api/alephium/AlephiumSignTransaction.ts +135 -0
- package/src/api/algo/AlgoGetAddress.ts +73 -0
- package/src/api/algo/AlgoSignTransaction.ts +52 -0
- package/src/api/allnetwork/AllNetworkGetAddress.ts +88 -0
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +529 -0
- package/src/api/allnetwork/AllNetworkGetAddressByLoop.ts +162 -0
- package/src/api/aptos/AptosGetAddress.ts +129 -0
- package/src/api/aptos/AptosGetPublicKey.ts +64 -0
- package/src/api/aptos/AptosSignInMessage.ts +55 -0
- package/src/api/aptos/AptosSignMessage.ts +79 -0
- package/src/api/aptos/AptosSignTransaction.ts +72 -0
- package/src/api/benfen/BenfenGetAddress.ts +122 -0
- package/src/api/benfen/BenfenGetPublicKey.ts +68 -0
- package/src/api/benfen/BenfenSignMessage.ts +50 -0
- package/src/api/benfen/BenfenSignTransaction.ts +105 -0
- package/src/api/benfen/normalize.ts +51 -0
- package/src/api/btc/BTCGetAddress.ts +91 -0
- package/src/api/btc/BTCGetPublicKey.ts +174 -0
- package/src/api/btc/BTCSignMessage.ts +73 -0
- package/src/api/btc/BTCSignPsbt.ts +65 -0
- package/src/api/btc/BTCSignTransaction.ts +148 -0
- package/src/api/btc/BTCVerifyMessage.ts +46 -0
- package/src/api/btc/helpers/btcParamsUtils.ts +64 -0
- package/src/api/btc/helpers/signtx.ts +251 -0
- package/src/api/btc/helpers/signtxLegacy.ts +227 -0
- package/src/api/btc/helpers/versionLimit.ts +25 -0
- package/src/api/btc/helpers/xpubUtils.ts +132 -0
- package/src/api/cardano/CardanoGetAddress.ts +139 -0
- package/src/api/cardano/CardanoGetPublicKey.ts +72 -0
- package/src/api/cardano/CardanoSignMessage.ts +73 -0
- package/src/api/cardano/CardanoSignTransaction.ts +404 -0
- package/src/api/cardano/helper/addressParameters.ts +120 -0
- package/src/api/cardano/helper/auxiliaryData.ts +133 -0
- package/src/api/cardano/helper/cardanoInputs.ts +55 -0
- package/src/api/cardano/helper/cardanoOutputs.ts +89 -0
- package/src/api/cardano/helper/certificate.ts +246 -0
- package/src/api/cardano/helper/token.ts +44 -0
- package/src/api/cardano/helper/utils.ts +17 -0
- package/src/api/cardano/helper/witnesses.ts +62 -0
- package/src/api/conflux/ConfluxGetAddress.ts +78 -0
- package/src/api/conflux/ConfluxSignMessage.ts +49 -0
- package/src/api/conflux/ConfluxSignMessageCIP23.ts +49 -0
- package/src/api/conflux/ConfluxSignTransaction.ts +135 -0
- package/src/api/cosmos/CosmosGetAddress.ts +80 -0
- package/src/api/cosmos/CosmosGetPublicKey.ts +77 -0
- package/src/api/cosmos/CosmosSignTransaction.ts +68 -0
- package/src/api/device/DeviceBackup.ts +15 -0
- package/src/api/device/DeviceCancel.ts +15 -0
- package/src/api/device/DeviceChangePin.ts +25 -0
- package/src/api/device/DeviceFlags.ts +26 -0
- package/src/api/device/DeviceFullyUploadResource.ts +80 -0
- package/src/api/device/DeviceLock.ts +15 -0
- package/src/api/device/DeviceRebootToBoardloader.ts +30 -0
- package/src/api/device/DeviceRebootToBootloader.ts +28 -0
- package/src/api/device/DeviceRecovery.ts +44 -0
- package/src/api/device/DeviceReset.ts +46 -0
- package/src/api/device/DeviceSettings.ts +96 -0
- package/src/api/device/DeviceSupportFeatures.ts +29 -0
- package/src/api/device/DeviceUnlock.ts +13 -0
- package/src/api/device/DeviceUpdateBootloader.ts +111 -0
- package/src/api/device/DeviceUpdateReboot.ts +17 -0
- package/src/api/device/DeviceUploadResource.ts +204 -0
- package/src/api/device/DeviceVerify.ts +65 -0
- package/src/api/device/DeviceWipe.ts +15 -0
- package/src/api/dynex/DnxGetAddress.ts +75 -0
- package/src/api/dynex/DnxSignTransaction.ts +126 -0
- package/src/api/evm/EVMGetAddress.ts +88 -0
- package/src/api/evm/EVMGetPublicKey.ts +116 -0
- package/src/api/evm/EVMSignMessage.ts +49 -0
- package/src/api/evm/EVMSignMessageEIP712.ts +56 -0
- package/src/api/evm/EVMSignTransaction.ts +141 -0
- package/src/api/evm/EVMSignTypedData.ts +477 -0
- package/src/api/evm/EVMVerifyMessage.ts +46 -0
- package/src/api/evm/latest/getAddress.ts +13 -0
- package/src/api/evm/latest/getPublicKey.ts +17 -0
- package/src/api/evm/latest/signMessage.ts +19 -0
- package/src/api/evm/latest/signTransaction.ts +303 -0
- package/src/api/evm/latest/signTypedData.ts +34 -0
- package/src/api/evm/latest/signTypedHash.ts +46 -0
- package/src/api/evm/latest/verifyMessage.ts +15 -0
- package/src/api/evm/legacyV1/getAddress.ts +16 -0
- package/src/api/evm/legacyV1/getPublicKey.ts +20 -0
- package/src/api/evm/legacyV1/signMessage.ts +22 -0
- package/src/api/evm/legacyV1/signTransaction.ts +37 -0
- package/src/api/evm/legacyV1/signTypedData.ts +37 -0
- package/src/api/evm/legacyV1/signTypedHash.ts +50 -0
- package/src/api/evm/legacyV1/verifyMessage.ts +19 -0
- package/src/api/filecoin/FilecoinGetAddress.ts +80 -0
- package/src/api/filecoin/FilecoinSignTransaction.ts +57 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +476 -0
- package/src/api/firmware/bootloaderHelper.ts +46 -0
- package/src/api/firmware/getBinary.ts +99 -0
- package/src/api/firmware/releaseHelper.ts +78 -0
- package/src/api/firmware/updateBootloader.ts +82 -0
- package/src/api/firmware/uploadFirmware.ts +541 -0
- package/src/api/helpers/batchGetPublickeys.ts +84 -0
- package/src/api/helpers/bigNumberUtils.ts +58 -0
- package/src/api/helpers/hexUtils.ts +111 -0
- package/src/api/helpers/paramsValidator.ts +165 -0
- package/src/api/helpers/pathUtils.ts +145 -0
- package/src/api/helpers/stringUtils.ts +11 -0
- package/src/api/helpers/typeNameUtils.ts +137 -0
- package/src/api/index.ts +161 -0
- package/src/api/kaspa/KaspaGetAddress.ts +103 -0
- package/src/api/kaspa/KaspaSignTransaction.ts +182 -0
- package/src/api/kaspa/helpers/BufferWriter.ts +177 -0
- package/src/api/kaspa/helpers/HashWriter.ts +74 -0
- package/src/api/kaspa/helpers/SignatureType.ts +7 -0
- package/src/api/kaspa/helpers/TransferSerialize.ts +144 -0
- package/src/api/lightning/LnurlAuth.ts +52 -0
- package/src/api/near/NearGetAddress.ts +75 -0
- package/src/api/near/NearSignTransaction.ts +46 -0
- package/src/api/nem/NEMGetAddress.ts +72 -0
- package/src/api/nem/NEMSignTransaction.ts +251 -0
- package/src/api/neo/NeoGetAddress.ts +80 -0
- package/src/api/neo/NeoSignTransaction.ts +59 -0
- package/src/api/nervos/NervosGetAddress.ts +80 -0
- package/src/api/nervos/NervosSignTransaction.ts +116 -0
- package/src/api/nexa/NexaGetAddress.ts +88 -0
- package/src/api/nexa/NexaSignTransaction.ts +107 -0
- package/src/api/nostr/NostrDecryptMessage.ts +57 -0
- package/src/api/nostr/NostrEncryptMessage.ts +57 -0
- package/src/api/nostr/NostrGetPublicKey.ts +74 -0
- package/src/api/nostr/NostrSignEvent.ts +65 -0
- package/src/api/nostr/NostrSignSchnorr.ts +52 -0
- package/src/api/nostr/helper/index.ts +28 -0
- package/src/api/polkadot/PolkadotGetAddress.ts +83 -0
- package/src/api/polkadot/PolkadotSignTransaction.ts +53 -0
- package/src/api/polkadot/networks.ts +72 -0
- package/src/api/scdo/ScdoGetAddress.ts +76 -0
- package/src/api/scdo/ScdoSignMessage.ts +45 -0
- package/src/api/scdo/ScdoSignTransaction.ts +106 -0
- package/src/api/solana/SolGetAddress.ts +68 -0
- package/src/api/solana/SolSignMessage.ts +61 -0
- package/src/api/solana/SolSignOffchainMessage.ts +61 -0
- package/src/api/solana/SolSignTransaction.ts +108 -0
- package/src/api/starcoin/StarcoinGetAddress.ts +69 -0
- package/src/api/starcoin/StarcoinGetPublicKey.ts +70 -0
- package/src/api/starcoin/StarcoinSignMessage.ts +42 -0
- package/src/api/starcoin/StarcoinSignTransaction.ts +38 -0
- package/src/api/starcoin/StarcoinVerifyMessage.ts +35 -0
- package/src/api/stellar/StellarGetAddress.ts +68 -0
- package/src/api/stellar/StellarSignTransaction.ts +220 -0
- package/src/api/sui/SuiGetAddress.ts +117 -0
- package/src/api/sui/SuiGetPublicKey.ts +66 -0
- package/src/api/sui/SuiSignMessage.ts +48 -0
- package/src/api/sui/SuiSignTransaction.ts +126 -0
- package/src/api/sui/normalize.ts +28 -0
- package/src/api/test/TestInitializeDeviceDuration.ts +22 -0
- package/src/api/ton/TonGetAddress.ts +96 -0
- package/src/api/ton/TonSignMessage.ts +217 -0
- package/src/api/ton/TonSignProof.ts +62 -0
- package/src/api/tron/TronGetAddress.ts +75 -0
- package/src/api/tron/TronSignMessage.ts +89 -0
- package/src/api/tron/TronSignTransaction.ts +214 -0
- package/src/api/u2f/GetNextU2FCounter.ts +15 -0
- package/src/api/u2f/SetU2FCounter.ts +19 -0
- package/src/api/utils.ts +23 -0
- package/src/api/xrp/XrpGetAddress.ts +96 -0
- package/src/api/xrp/XrpSignTransaction.ts +71 -0
- package/src/constants/errors.ts +15 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/ui-request.ts +3 -0
- package/src/core/RequestQueue.ts +134 -0
- package/src/core/index.ts +1320 -0
- package/src/data/coins/bitcoin.json +44 -0
- package/src/data/config.ts +25 -0
- package/src/data/messages/messages.json +13167 -0
- package/src/data/messages/messages_legacy_v1.json +10282 -0
- package/src/data-manager/CoinManager.ts +31 -0
- package/src/data-manager/DataManager.ts +499 -0
- package/src/data-manager/MessagesConfig.ts +28 -0
- package/src/data-manager/TransportManager.ts +140 -0
- package/src/data-manager/connectSettings.ts +121 -0
- package/src/data-manager/index.ts +3 -0
- package/src/device/Device.ts +884 -0
- package/src/device/DeviceCommands.ts +631 -0
- package/src/device/DeviceConnector.ts +124 -0
- package/src/device/DeviceList.ts +39 -0
- package/src/device/DevicePool.ts +266 -0
- package/src/events/call.ts +95 -0
- package/src/events/core.ts +65 -0
- package/src/events/device.ts +92 -0
- package/src/events/firmware.ts +43 -0
- package/src/events/iframe.ts +55 -0
- package/src/events/index.ts +10 -0
- package/src/events/log.ts +23 -0
- package/src/events/logBlockEvent.ts +6 -0
- package/src/events/ui-promise.ts +14 -0
- package/src/events/ui-request.ts +216 -0
- package/src/events/ui-response.ts +59 -0
- package/src/events/utils.ts +19 -0
- package/src/index.ts +70 -0
- package/src/inject.ts +408 -0
- package/src/lowLevelInject.ts +61 -0
- package/src/topLevelInject.ts +62 -0
- package/src/types/api/alephiumGetAddress.ts +31 -0
- package/src/types/api/alephiumSignMessage.ts +14 -0
- package/src/types/api/alephiumSignTransaction.ts +18 -0
- package/src/types/api/algoGetAddress.ts +23 -0
- package/src/types/api/algoSignTransaction.ts +17 -0
- package/src/types/api/allNetworkGetAddress.ts +130 -0
- package/src/types/api/aptosGetAddress.ts +28 -0
- package/src/types/api/aptosGetPublicKey.ts +27 -0
- package/src/types/api/aptosSignInMessage.ts +17 -0
- package/src/types/api/aptosSignMessage.ts +26 -0
- package/src/types/api/aptosSignTransaction.ts +18 -0
- package/src/types/api/benfenGetAddress.ts +24 -0
- package/src/types/api/benfenGetPublicKey.ts +23 -0
- package/src/types/api/benfenSignMessage.ts +13 -0
- package/src/types/api/benfenSignTransaction.ts +19 -0
- package/src/types/api/btcGetAddress.ts +26 -0
- package/src/types/api/btcGetPublicKey.ts +26 -0
- package/src/types/api/btcSignMessage.ts +16 -0
- package/src/types/api/btcSignPsbt.ts +13 -0
- package/src/types/api/btcSignTransaction.ts +98 -0
- package/src/types/api/btcVerifyMessage.ts +15 -0
- package/src/types/api/cardano.ts +212 -0
- package/src/types/api/cardanoGetAddress.ts +49 -0
- package/src/types/api/cardanoGetPublicKey.ts +33 -0
- package/src/types/api/cardanoSignMessage.ts +31 -0
- package/src/types/api/cardanoSignTransaction.ts +8 -0
- package/src/types/api/checkAllFirmwareRelease.ts +34 -0
- package/src/types/api/checkBLEFirmwareRelease.ts +15 -0
- package/src/types/api/checkBootloaderRelease.ts +19 -0
- package/src/types/api/checkBridgeRelease.ts +14 -0
- package/src/types/api/checkBridgeStatus.ts +3 -0
- package/src/types/api/checkFirmwareRelease.ts +23 -0
- package/src/types/api/checkFirmwareTypeAvailable.ts +12 -0
- package/src/types/api/cipherKeyValue.ts +28 -0
- package/src/types/api/confluxGetAddress.ts +24 -0
- package/src/types/api/confluxSignMessage.ts +13 -0
- package/src/types/api/confluxSignMessageCIP23.ts +14 -0
- package/src/types/api/confluxSignTransaction.ts +32 -0
- package/src/types/api/cosmosGetAddress.ts +24 -0
- package/src/types/api/cosmosGetPublicKey.ts +28 -0
- package/src/types/api/cosmosSignTransaction.ts +17 -0
- package/src/types/api/deviceBackup.ts +4 -0
- package/src/types/api/deviceCancel.ts +4 -0
- package/src/types/api/deviceChangePin.ts +11 -0
- package/src/types/api/deviceFlags.ts +11 -0
- package/src/types/api/deviceFullyUploadResource.ts +15 -0
- package/src/types/api/deviceLock.ts +4 -0
- package/src/types/api/deviceRebootToBoardloader.ts +6 -0
- package/src/types/api/deviceRebootToBootloader.ts +4 -0
- package/src/types/api/deviceRecovery.ts +19 -0
- package/src/types/api/deviceReset.ts +20 -0
- package/src/types/api/deviceSettings.ts +23 -0
- package/src/types/api/deviceSupportFeatures.ts +6 -0
- package/src/types/api/deviceUnlock.ts +4 -0
- package/src/types/api/deviceUpdateBootloader.ts +13 -0
- package/src/types/api/deviceUpdateReboot.ts +3 -0
- package/src/types/api/deviceUploadResource.ts +21 -0
- package/src/types/api/deviceVerify.ts +15 -0
- package/src/types/api/deviceWipe.ts +4 -0
- package/src/types/api/dnxGetAddress.ts +23 -0
- package/src/types/api/dnxSignTransaction.ts +36 -0
- package/src/types/api/event.ts +8 -0
- package/src/types/api/evmGetAddress.ts +24 -0
- package/src/types/api/evmGetPublicKey.ts +36 -0
- package/src/types/api/evmSignMessage.ts +14 -0
- package/src/types/api/evmSignMessageEIP712.ts +14 -0
- package/src/types/api/evmSignTransaction.ts +80 -0
- package/src/types/api/evmSignTypedData.ts +42 -0
- package/src/types/api/evmVerifyMessage.ts +15 -0
- package/src/types/api/export.ts +194 -0
- package/src/types/api/filecoinGetAddress.ts +24 -0
- package/src/types/api/filecoinSignTransaction.ts +24 -0
- package/src/types/api/firmwareUpdate.ts +66 -0
- package/src/types/api/getFeatures.ts +4 -0
- package/src/types/api/getLogs.ts +3 -0
- package/src/types/api/getNextU2FCounter.ts +7 -0
- package/src/types/api/getOnetokenFeatures.ts +7 -0
- package/src/types/api/getPassphraseState.ts +6 -0
- package/src/types/api/index.ts +404 -0
- package/src/types/api/init.ts +11 -0
- package/src/types/api/kaspaGetAddress.ts +26 -0
- package/src/types/api/kaspaSignTransaction.ts +44 -0
- package/src/types/api/lnurlAuth.ts +22 -0
- package/src/types/api/nearGetAddress.ts +23 -0
- package/src/types/api/nearSignTransaction.ts +13 -0
- package/src/types/api/nemGetAddress.ts +24 -0
- package/src/types/api/nemSignTransaction.ts +118 -0
- package/src/types/api/neoGetAddress.ts +24 -0
- package/src/types/api/neoSignTransaction.ts +18 -0
- package/src/types/api/nervosGetAddress.ts +24 -0
- package/src/types/api/nervosSignTransaction.ts +19 -0
- package/src/types/api/nexaGetAddress.ts +26 -0
- package/src/types/api/nexaSignTransaction.ts +28 -0
- package/src/types/api/nostrDecryptMessage.ts +25 -0
- package/src/types/api/nostrEncryptMessage.ts +25 -0
- package/src/types/api/nostrGetPublicKey.ts +28 -0
- package/src/types/api/nostrSignEvent.ts +52 -0
- package/src/types/api/nostrSignSchnorr.ts +22 -0
- package/src/types/api/polkadotGetAddress.ts +30 -0
- package/src/types/api/polkadotSignTransaction.ts +19 -0
- package/src/types/api/promptWebDeviceAccess.ts +6 -0
- package/src/types/api/scdoGetAddress.ts +23 -0
- package/src/types/api/scdoSignMessage.ts +13 -0
- package/src/types/api/scdoSignTransaction.ts +24 -0
- package/src/types/api/searchDevices.ts +4 -0
- package/src/types/api/setU2FCounter.ts +7 -0
- package/src/types/api/solGetAddress.ts +23 -0
- package/src/types/api/solSignMessage.ts +17 -0
- package/src/types/api/solSignOffchainMessage.ts +24 -0
- package/src/types/api/solSignTransaction.ts +27 -0
- package/src/types/api/starcoinGetAddress.ts +23 -0
- package/src/types/api/starcoinGetPublicKey.ts +23 -0
- package/src/types/api/starcoinSignMessage.ts +13 -0
- package/src/types/api/starcoinSignTransaction.ts +13 -0
- package/src/types/api/starcoinVerifyMessage.ts +14 -0
- package/src/types/api/stellarGetAddress.ts +23 -0
- package/src/types/api/stellarSignTransaction.ts +154 -0
- package/src/types/api/suiGetAddress.ts +28 -0
- package/src/types/api/suiGetPublicKey.ts +27 -0
- package/src/types/api/suiSignMessage.ts +13 -0
- package/src/types/api/suiSignTransaction.ts +17 -0
- package/src/types/api/testInitializeDeviceDuration.ts +6 -0
- package/src/types/api/tonGetAddress.ts +34 -0
- package/src/types/api/tonSignMessage.ts +42 -0
- package/src/types/api/tonSignProof.ts +25 -0
- package/src/types/api/tronGetAddress.ts +23 -0
- package/src/types/api/tronSignMessage.ts +14 -0
- package/src/types/api/tronSignTransaction.ts +89 -0
- package/src/types/api/uiResponse.ts +3 -0
- package/src/types/api/xrpGetAddress.ts +28 -0
- package/src/types/api/xrpSignTransaction.ts +29 -0
- package/src/types/device.ts +194 -0
- package/src/types/firmware.ts +41 -0
- package/src/types/global.d.ts +3 -0
- package/src/types/index.ts +5 -0
- package/src/types/params.ts +64 -0
- package/src/types/settings.ts +144 -0
- package/src/utils/arrayUtils.ts +7 -0
- package/src/utils/assets.ts +5 -0
- package/src/utils/bridgeUpdate.ts +80 -0
- package/src/utils/capabilitieUtils.ts +12 -0
- package/src/utils/deviceFeaturesUtils.ts +352 -0
- package/src/utils/deviceInfoUtils.ts +167 -0
- package/src/utils/deviceSettings.ts +109 -0
- package/src/utils/deviceVersionUtils.ts +79 -0
- package/src/utils/findDefectiveBatchDevice.ts +39 -0
- package/src/utils/getMutex.ts +41 -0
- package/src/utils/getSynchronize.ts +25 -0
- package/src/utils/homescreen.ts +345 -0
- package/src/utils/index.ts +44 -0
- package/src/utils/logger.ts +190 -0
- package/src/utils/networkUtils.ts +25 -0
- package/src/utils/patch.ts +14 -0
- package/src/utils/promiseUtils.ts +4 -0
- package/src/utils/release.ts +42 -0
- package/src/utils/semver.test.js +53 -0
- package/src/utils/tracing.ts +238 -0
- package/src/utils/versionUtils.ts +120 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
import { ERRORS, HardwareError, HardwareErrorCode } from '@onetokenfe/hd-shared';
|
|
2
|
+
|
|
3
|
+
import TransportManager from '../data-manager/TransportManager';
|
|
4
|
+
import DataManager from '../data-manager/DataManager';
|
|
5
|
+
import { LoggerNames, getDeviceType, getLogger, patchFeatures } from '../utils';
|
|
6
|
+
import { DEVICE, type PassphraseRequestPayload } from '../events';
|
|
7
|
+
import { DeviceModelToTypes } from '../types';
|
|
8
|
+
import {
|
|
9
|
+
formatRequestContext,
|
|
10
|
+
generateInstanceId,
|
|
11
|
+
getActiveRequestsByDeviceInstance,
|
|
12
|
+
} from '../utils/tracing';
|
|
13
|
+
|
|
14
|
+
import type { Device } from './Device';
|
|
15
|
+
import type { FailureType, Messages, Transport } from '@onetokenfe/hd-transport';
|
|
16
|
+
|
|
17
|
+
export type PassphrasePromptResponse = {
|
|
18
|
+
passphrase?: string;
|
|
19
|
+
passphraseOnDevice?: boolean;
|
|
20
|
+
attachPinOnDevice?: boolean;
|
|
21
|
+
cache?: boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
type MessageType = Messages.MessageType;
|
|
25
|
+
type MessageKey = keyof MessageType;
|
|
26
|
+
export type TypedResponseMessage<T extends MessageKey> = {
|
|
27
|
+
type: T;
|
|
28
|
+
message: MessageType[T];
|
|
29
|
+
};
|
|
30
|
+
type TypedCallResponseMap = {
|
|
31
|
+
[K in keyof MessageType]: TypedResponseMessage<K>;
|
|
32
|
+
};
|
|
33
|
+
export type DefaultMessageResponse = TypedCallResponseMap[keyof MessageType];
|
|
34
|
+
|
|
35
|
+
const assertType = (res: DefaultMessageResponse, resType: string | string[]) => {
|
|
36
|
+
const splitResTypes = Array.isArray(resType) ? resType : resType.split('|');
|
|
37
|
+
if (!splitResTypes.includes(res.type)) {
|
|
38
|
+
throw ERRORS.TypedError(
|
|
39
|
+
HardwareErrorCode.ResponseUnexpectTypeError,
|
|
40
|
+
`assertType: Response of unexpected type: ${res.type}. Should be ${resType as string}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const cancelDeviceInPrompt = (device: Device, expectResponse = true) => {
|
|
46
|
+
const session = device.hasDeviceAcquire() ? device.mainId : undefined;
|
|
47
|
+
|
|
48
|
+
if (!session) {
|
|
49
|
+
// device disconnected or acquired by someone else
|
|
50
|
+
return Promise.resolve({
|
|
51
|
+
success: false,
|
|
52
|
+
error: HardwareErrorCode.RuntimeError,
|
|
53
|
+
payload: {
|
|
54
|
+
message: 'Device disconnected or acquired by someone else',
|
|
55
|
+
},
|
|
56
|
+
} as const);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const transport = device.commands?.transport;
|
|
60
|
+
|
|
61
|
+
if (expectResponse) {
|
|
62
|
+
return transport
|
|
63
|
+
?.call(session, 'Cancel', {})
|
|
64
|
+
.then(() => ({
|
|
65
|
+
success: true,
|
|
66
|
+
error: null,
|
|
67
|
+
payload: {
|
|
68
|
+
message: 'Cancel request sent',
|
|
69
|
+
},
|
|
70
|
+
}))
|
|
71
|
+
.catch((error: HardwareError) => ({
|
|
72
|
+
success: false,
|
|
73
|
+
error: error.errorCode,
|
|
74
|
+
payload: {
|
|
75
|
+
message: error.message,
|
|
76
|
+
},
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return transport?.post(session, 'Cancel', {}).then(() => ({
|
|
81
|
+
success: true,
|
|
82
|
+
error: HardwareErrorCode.RuntimeError,
|
|
83
|
+
payload: {
|
|
84
|
+
message: 'Cancel request sent',
|
|
85
|
+
},
|
|
86
|
+
}));
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const cancelDeviceWithInitialize = (device: Device) => {
|
|
90
|
+
const session = device.hasDeviceAcquire() ? device.mainId : undefined;
|
|
91
|
+
|
|
92
|
+
if (!session) {
|
|
93
|
+
// device disconnected or acquired by someone else
|
|
94
|
+
return Promise.resolve({
|
|
95
|
+
success: false,
|
|
96
|
+
error: HardwareErrorCode.RuntimeError,
|
|
97
|
+
payload: {
|
|
98
|
+
message: 'Device disconnected or acquired by someone else',
|
|
99
|
+
},
|
|
100
|
+
} as const);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const transport = device.commands?.transport;
|
|
104
|
+
|
|
105
|
+
return transport
|
|
106
|
+
?.call(session, 'Initialize', {})
|
|
107
|
+
.then(() => ({
|
|
108
|
+
success: true,
|
|
109
|
+
error: null,
|
|
110
|
+
payload: {
|
|
111
|
+
message: 'Cancel request sent',
|
|
112
|
+
},
|
|
113
|
+
}))
|
|
114
|
+
.catch((error: HardwareError) => ({
|
|
115
|
+
success: false,
|
|
116
|
+
error: error.errorCode,
|
|
117
|
+
payload: {
|
|
118
|
+
message: error.message,
|
|
119
|
+
},
|
|
120
|
+
}));
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const Log = getLogger(LoggerNames.DeviceCommands);
|
|
124
|
+
const LogCore = getLogger(LoggerNames.Core);
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* The life cycle begins with the acquisition of the device and ends with the disposal device commands
|
|
128
|
+
* acquire device -> create DeviceCommands -> release device -> dispose DeviceCommands
|
|
129
|
+
*/
|
|
130
|
+
export class DeviceCommands {
|
|
131
|
+
instanceId: string;
|
|
132
|
+
|
|
133
|
+
currentResponseID?: number;
|
|
134
|
+
|
|
135
|
+
device: Device;
|
|
136
|
+
|
|
137
|
+
transport: Transport;
|
|
138
|
+
|
|
139
|
+
mainId: string;
|
|
140
|
+
|
|
141
|
+
disposed: boolean;
|
|
142
|
+
|
|
143
|
+
callPromise?: Promise<DefaultMessageResponse>;
|
|
144
|
+
|
|
145
|
+
constructor(device: Device, mainId: string) {
|
|
146
|
+
this.device = device;
|
|
147
|
+
this.mainId = mainId;
|
|
148
|
+
this.transport = TransportManager.getTransport();
|
|
149
|
+
this.disposed = false;
|
|
150
|
+
this.instanceId = generateInstanceId('DeviceCommands', device.sdkInstanceId);
|
|
151
|
+
|
|
152
|
+
Log.debug(`[DeviceCommands] Created: ${this.instanceId}, device: ${this.device.instanceId}`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async dispose(_cancelRequest: boolean) {
|
|
156
|
+
this.disposed = true;
|
|
157
|
+
await this.transport.cancel?.();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
checkDisposed() {
|
|
161
|
+
if (this.disposed) {
|
|
162
|
+
throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'DeviceCommands already disposed');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// on device input pin or passphrase, cancel the request with initialize
|
|
167
|
+
async cancelDeviceOnOneTokenDevice() {
|
|
168
|
+
const { name } = this.transport;
|
|
169
|
+
if (name === 'HttpTransport') {
|
|
170
|
+
/**
|
|
171
|
+
* Bridge throws "other call in progress" error.
|
|
172
|
+
* as workaround takeover transportSession (acquire) before sending Cancel, this will resolve previous pending call.
|
|
173
|
+
*/
|
|
174
|
+
try {
|
|
175
|
+
await this.device.acquire();
|
|
176
|
+
await cancelDeviceWithInitialize(this.device);
|
|
177
|
+
} catch {
|
|
178
|
+
// ignore whatever happens
|
|
179
|
+
}
|
|
180
|
+
} else {
|
|
181
|
+
return cancelDeviceWithInitialize(this.device);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async cancelDevice() {
|
|
186
|
+
const { name } = this.transport;
|
|
187
|
+
if (name === 'HttpTransport') {
|
|
188
|
+
/**
|
|
189
|
+
* Bridge throws "other call in progress" error.
|
|
190
|
+
* as workaround takeover transportSession (acquire) before sending Cancel, this will resolve previous pending call.
|
|
191
|
+
*/
|
|
192
|
+
try {
|
|
193
|
+
await this.device.acquire();
|
|
194
|
+
await cancelDeviceInPrompt(this.device, false);
|
|
195
|
+
} catch {
|
|
196
|
+
// ignore whatever happens
|
|
197
|
+
}
|
|
198
|
+
} else {
|
|
199
|
+
return cancelDeviceInPrompt(this.device, false);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async cancel() {
|
|
204
|
+
if (this.disposed) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
this.dispose(true);
|
|
208
|
+
if (this.callPromise) {
|
|
209
|
+
try {
|
|
210
|
+
await Promise.all([
|
|
211
|
+
new Promise((_resolve, reject) =>
|
|
212
|
+
// eslint-disable-next-line no-promise-executor-return
|
|
213
|
+
setTimeout(() => reject(new Error('cancel timeout')), 10 * 1000)
|
|
214
|
+
),
|
|
215
|
+
await this.callPromise,
|
|
216
|
+
]);
|
|
217
|
+
} catch {
|
|
218
|
+
// device error
|
|
219
|
+
this.callPromise = undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Sends an async message to the opened device.
|
|
225
|
+
async call(
|
|
226
|
+
type: MessageKey,
|
|
227
|
+
msg: DefaultMessageResponse['message'] = {}
|
|
228
|
+
): Promise<DefaultMessageResponse> {
|
|
229
|
+
Log.debug('[DeviceCommands] [call] Sending', type);
|
|
230
|
+
|
|
231
|
+
try {
|
|
232
|
+
const promise = this.transport.call(this.mainId, type, msg) as any;
|
|
233
|
+
this.callPromise = promise;
|
|
234
|
+
const res = await promise;
|
|
235
|
+
if (res.type === 'Failure') {
|
|
236
|
+
LogCore.debug('[DeviceCommands] [call] Received', res.type, res.message);
|
|
237
|
+
} else {
|
|
238
|
+
LogCore.debug('[DeviceCommands] [call] Received', res.type);
|
|
239
|
+
}
|
|
240
|
+
return res;
|
|
241
|
+
} catch (error) {
|
|
242
|
+
LogCore.debug('[DeviceCommands] [call] Received error', error);
|
|
243
|
+
if (error.errorCode === HardwareErrorCode.BleDeviceBondError) {
|
|
244
|
+
return {
|
|
245
|
+
type: 'BleDeviceBondError',
|
|
246
|
+
message: {
|
|
247
|
+
error: error?.message,
|
|
248
|
+
},
|
|
249
|
+
} as any;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const responseData = error?.response?.data;
|
|
253
|
+
let responseError = responseData?.error;
|
|
254
|
+
if (!responseError && responseData && typeof responseData === 'string') {
|
|
255
|
+
try {
|
|
256
|
+
const parsedData = JSON.parse(responseData);
|
|
257
|
+
responseError = parsedData?.error;
|
|
258
|
+
} catch (error) {
|
|
259
|
+
// ignore
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (responseData) {
|
|
264
|
+
Log.debug('error response', responseData);
|
|
265
|
+
}
|
|
266
|
+
if (responseError === 'device disconnected during action') {
|
|
267
|
+
return { type: 'BridgeDeviceDisconnected', message: { error: responseError } } as any;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// undefined.indexOf('...') !== -1 Always true
|
|
271
|
+
if (responseError && responseError.indexOf('Request failed with status code') !== -1) {
|
|
272
|
+
return {
|
|
273
|
+
type: 'CallMethodError',
|
|
274
|
+
message: {
|
|
275
|
+
error: responseData ?? '',
|
|
276
|
+
},
|
|
277
|
+
} as any;
|
|
278
|
+
}
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
typedCall<T extends MessageKey, R extends MessageKey[]>(
|
|
284
|
+
type: T,
|
|
285
|
+
resType: R,
|
|
286
|
+
msg?: MessageType[T]
|
|
287
|
+
): Promise<TypedCallResponseMap[R[number]]>;
|
|
288
|
+
|
|
289
|
+
typedCall<T extends MessageKey, R extends MessageKey>(
|
|
290
|
+
type: T,
|
|
291
|
+
resType: R,
|
|
292
|
+
msg?: MessageType[T]
|
|
293
|
+
): Promise<TypedResponseMessage<R>>;
|
|
294
|
+
|
|
295
|
+
async typedCall(
|
|
296
|
+
type: MessageKey,
|
|
297
|
+
resType: MessageKey | MessageKey[],
|
|
298
|
+
msg?: DefaultMessageResponse['message']
|
|
299
|
+
) {
|
|
300
|
+
if (this.disposed) {
|
|
301
|
+
throw ERRORS.TypedError(
|
|
302
|
+
HardwareErrorCode.RuntimeError,
|
|
303
|
+
'typedCall: DeviceCommands already disposed'
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Structured log of actual outgoing payloads (skip acks)
|
|
308
|
+
try {
|
|
309
|
+
const skipTypes: MessageKey[] = [
|
|
310
|
+
'ButtonAck',
|
|
311
|
+
'PinMatrixAck',
|
|
312
|
+
'PassphraseAck',
|
|
313
|
+
'Cancel',
|
|
314
|
+
'BixinPinInputOnDevice',
|
|
315
|
+
] as any;
|
|
316
|
+
if (!skipTypes.includes(type) && msg) {
|
|
317
|
+
// Use debug channel to avoid noise escalation
|
|
318
|
+
Log.debug('[DeviceCommands] [typedCall] Sending payload', type, msg);
|
|
319
|
+
}
|
|
320
|
+
} catch (e) {
|
|
321
|
+
// ignore logging errors
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const response = await this._commonCall(type, msg);
|
|
325
|
+
try {
|
|
326
|
+
assertType(response, resType);
|
|
327
|
+
} catch (error) {
|
|
328
|
+
// handle possible race condition
|
|
329
|
+
// Bridge may have some unread message in buffer, read it
|
|
330
|
+
// await this.transport.read?.(this.mainId);
|
|
331
|
+
|
|
332
|
+
Log.debug('DeviceCommands typedcall error: ', error);
|
|
333
|
+
|
|
334
|
+
// throw bridge network error
|
|
335
|
+
if (error instanceof HardwareError) {
|
|
336
|
+
if (error.errorCode === HardwareErrorCode.ResponseUnexpectTypeError) {
|
|
337
|
+
// Do not intercept CallMethodError
|
|
338
|
+
// Do not intercept “assertType: Response of unexpected type” error
|
|
339
|
+
// Blocking the above two messages will not know what the specific error message is, and the specific error should be handled by the subsequent business logic.
|
|
340
|
+
|
|
341
|
+
if (error.message.indexOf('BridgeNetworkError') > -1) {
|
|
342
|
+
throw ERRORS.TypedError(HardwareErrorCode.BridgeNetworkError);
|
|
343
|
+
}
|
|
344
|
+
if (error.message.indexOf('BleDeviceBondError') > -1) {
|
|
345
|
+
throw ERRORS.TypedError(HardwareErrorCode.BleDeviceBondError);
|
|
346
|
+
}
|
|
347
|
+
if (error.message.indexOf('BridgeDeviceDisconnected') > -1) {
|
|
348
|
+
throw ERRORS.TypedError(HardwareErrorCode.BridgeDeviceDisconnected);
|
|
349
|
+
}
|
|
350
|
+
throw ERRORS.TypedError(HardwareErrorCode.ResponseUnexpectTypeError);
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
// throw error anyway, next call should be resolved properly// throw error anyway, next call should be resolved properly
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return response;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
async _commonCall(type: MessageKey, msg?: DefaultMessageResponse['message']) {
|
|
361
|
+
const resp = await this.call(type, msg);
|
|
362
|
+
return this._filterCommonTypes(resp, type);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
_filterCommonTypes(
|
|
366
|
+
res: DefaultMessageResponse,
|
|
367
|
+
callType: MessageKey
|
|
368
|
+
): Promise<DefaultMessageResponse> {
|
|
369
|
+
try {
|
|
370
|
+
if (DataManager.getSettings('env') === 'react-native') {
|
|
371
|
+
Log.debug('_filterCommonTypes: ', JSON.stringify(res));
|
|
372
|
+
} else {
|
|
373
|
+
Log.debug('_filterCommonTypes: ', res);
|
|
374
|
+
}
|
|
375
|
+
} catch (error) {
|
|
376
|
+
// ignore
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
this.device.clearCancelableAction();
|
|
380
|
+
if (res.type === 'Failure') {
|
|
381
|
+
const { code, message } = res.message as {
|
|
382
|
+
code?: string | FailureType;
|
|
383
|
+
message?: string;
|
|
384
|
+
};
|
|
385
|
+
let error: HardwareError | null = null;
|
|
386
|
+
// Model One does not send any message in firmware update
|
|
387
|
+
if (code === 'Failure_FirmwareError' && !message) {
|
|
388
|
+
error = ERRORS.TypedError(HardwareErrorCode.FirmwareError);
|
|
389
|
+
}
|
|
390
|
+
// Failure_ActionCancelled message could be also missing
|
|
391
|
+
if (code === 'Failure_ActionCancelled') {
|
|
392
|
+
error = ERRORS.TypedError(HardwareErrorCode.ActionCancelled);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if (code === 'Failure_PinInvalid') {
|
|
396
|
+
error = ERRORS.TypedError(HardwareErrorCode.PinInvalid, message);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (code === 'Failure_PinCancelled') {
|
|
400
|
+
error = ERRORS.TypedError(HardwareErrorCode.PinCancelled);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (code === 'Failure_DataError') {
|
|
404
|
+
if (message === 'Please confirm the BlindSign enabled') {
|
|
405
|
+
error = ERRORS.TypedError(HardwareErrorCode.BlindSignDisabled);
|
|
406
|
+
}
|
|
407
|
+
if (message === 'File already exists') {
|
|
408
|
+
error = ERRORS.TypedError(HardwareErrorCode.FileAlreadyExists);
|
|
409
|
+
}
|
|
410
|
+
if (message?.includes('bytes overflow')) {
|
|
411
|
+
error = ERRORS.TypedError(HardwareErrorCode.DataOverload);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (code === 'Failure_ProcessError') {
|
|
416
|
+
// Handle firmware verification failures
|
|
417
|
+
if (
|
|
418
|
+
message?.includes('Bootloader file verify failed') ||
|
|
419
|
+
message?.includes('verify failed')
|
|
420
|
+
) {
|
|
421
|
+
error = ERRORS.TypedError(HardwareErrorCode.FirmwareVerificationFailed, message);
|
|
422
|
+
} else if (message?.includes('Firmware downgrade not allowed')) {
|
|
423
|
+
// Check firmware check failed
|
|
424
|
+
error = ERRORS.TypedError(HardwareErrorCode.FirmwareDowngradeNotAllowed, message);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (code === 'Failure_UnexpectedMessage') {
|
|
429
|
+
if (callType === 'PassphraseAck') {
|
|
430
|
+
error = ERRORS.TypedError(HardwareErrorCode.UnexpectPassphrase);
|
|
431
|
+
} else if (message === 'Not in Signing mode') {
|
|
432
|
+
error = ERRORS.TypedError(HardwareErrorCode.NotInSigningMode);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
if (error) {
|
|
437
|
+
return Promise.reject(error);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
return Promise.reject(
|
|
441
|
+
ERRORS.TypedError(
|
|
442
|
+
HardwareErrorCode.RuntimeError,
|
|
443
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
444
|
+
`${(code as any) || 'Failure_UnknownCode'},${message || 'no error message'}`
|
|
445
|
+
)
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (res.type === 'Features') {
|
|
450
|
+
return Promise.resolve(patchFeatures(res));
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
if (res.type === 'ButtonRequest') {
|
|
454
|
+
const deviceType = getDeviceType(this.device.features);
|
|
455
|
+
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
456
|
+
this.device.setCancelableAction(() => this.cancelDeviceOnOneTokenDevice());
|
|
457
|
+
} else {
|
|
458
|
+
this.device.setCancelableAction(() => this.cancelDevice());
|
|
459
|
+
}
|
|
460
|
+
if (res.message.code === 'ButtonRequest_PassphraseEntry') {
|
|
461
|
+
this.device.emit(DEVICE.PASSPHRASE_ON_DEVICE, this.device);
|
|
462
|
+
} else {
|
|
463
|
+
this.device.emit(DEVICE.BUTTON, this.device, res.message);
|
|
464
|
+
}
|
|
465
|
+
return this._commonCall('ButtonAck', {});
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
if (res.type === 'EntropyRequest') {
|
|
469
|
+
// TODO: EntropyRequest
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
if (res.type === 'PinMatrixRequest') {
|
|
473
|
+
return this._promptPin(res.message.type).then(
|
|
474
|
+
pin => {
|
|
475
|
+
if (pin === '@@ONETOKEN_INPUT_PIN_IN_DEVICE') {
|
|
476
|
+
// only classic\1s\mini\pure
|
|
477
|
+
this.device.setCancelableAction(() => this.cancelDeviceOnOneTokenDevice());
|
|
478
|
+
return this._commonCall('BixinPinInputOnDevice').finally(() => {
|
|
479
|
+
this.device.clearCancelableAction();
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
return this._commonCall('PinMatrixAck', { pin });
|
|
483
|
+
},
|
|
484
|
+
error => Promise.reject(error)
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (res.type === 'PassphraseRequest') {
|
|
489
|
+
const existsAttachPinUser = res.message.exists_attach_pin_user;
|
|
490
|
+
return this._promptPassphrase({
|
|
491
|
+
existsAttachPinUser,
|
|
492
|
+
}).then(response => {
|
|
493
|
+
const { passphrase, passphraseOnDevice, attachPinOnDevice } = response;
|
|
494
|
+
|
|
495
|
+
// Attach PIN on device
|
|
496
|
+
if (attachPinOnDevice && existsAttachPinUser) {
|
|
497
|
+
return this._commonCall('PassphraseAck', { on_device_attach_pin: true });
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return !passphraseOnDevice
|
|
501
|
+
? this._commonCall('PassphraseAck', { passphrase })
|
|
502
|
+
: this._commonCall('PassphraseAck', { on_device: true });
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// TT fw lower than 2.3.0, device send his current state
|
|
507
|
+
// new passphrase design set this value from `features.session_id`
|
|
508
|
+
if (res.type === 'Deprecated_PassphraseStateRequest') {
|
|
509
|
+
// TODO: Deprecated_PassphraseStateRequest
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
if (res.type === 'WordRequest') {
|
|
513
|
+
// TODO: WordRequest
|
|
514
|
+
}
|
|
515
|
+
return Promise.resolve(res);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
_promptPin(type?: Messages.PinMatrixRequestType) {
|
|
519
|
+
return new Promise<string>((resolve, reject) => {
|
|
520
|
+
const cancelAndReject = (_error?: Error) =>
|
|
521
|
+
cancelDeviceInPrompt(this.device, false)
|
|
522
|
+
.then(onCancel => {
|
|
523
|
+
const error = ERRORS.TypedError(
|
|
524
|
+
HardwareErrorCode.CallQueueActionCancelled,
|
|
525
|
+
`${DEVICE.PIN} canceled`
|
|
526
|
+
);
|
|
527
|
+
// onCancel not void
|
|
528
|
+
if (onCancel) {
|
|
529
|
+
const { payload } = onCancel || {};
|
|
530
|
+
reject(error || new Error(payload?.message));
|
|
531
|
+
} else {
|
|
532
|
+
reject(error);
|
|
533
|
+
}
|
|
534
|
+
})
|
|
535
|
+
.catch(error => {
|
|
536
|
+
reject(error);
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
const listenerCount = this.device.listenerCount(DEVICE.PIN);
|
|
540
|
+
|
|
541
|
+
Log.debug(`[${this.instanceId}] _promptPin called`, {
|
|
542
|
+
responseID: this.currentResponseID,
|
|
543
|
+
deviceInstanceId: this.device.instanceId,
|
|
544
|
+
listenerCount,
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
if (listenerCount > 0) {
|
|
548
|
+
this.device.setCancelableAction(cancelAndReject);
|
|
549
|
+
this.device.emit(DEVICE.PIN, this.device, type, (err, pin) => {
|
|
550
|
+
this.device.clearCancelableAction();
|
|
551
|
+
if (err) {
|
|
552
|
+
cancelAndReject(err);
|
|
553
|
+
} else {
|
|
554
|
+
resolve(pin);
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
} else {
|
|
558
|
+
const activeRequests = getActiveRequestsByDeviceInstance(this.device.instanceId);
|
|
559
|
+
const errorInfo = {
|
|
560
|
+
commandsInstanceId: this.instanceId,
|
|
561
|
+
deviceInstanceId: this.device.instanceId,
|
|
562
|
+
currentResponseID: this.currentResponseID,
|
|
563
|
+
listenerCount,
|
|
564
|
+
activeRequests: activeRequests.map(formatRequestContext),
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
LogCore.error('[DeviceCommands] [call] PIN callback not configured, cancelling request', {
|
|
568
|
+
...errorInfo,
|
|
569
|
+
});
|
|
570
|
+
reject(
|
|
571
|
+
ERRORS.TypedError(
|
|
572
|
+
HardwareErrorCode.RuntimeError,
|
|
573
|
+
`_promptPin: PIN callback not configured: ${JSON.stringify(errorInfo)}`
|
|
574
|
+
)
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
_promptPassphrase(options: PassphraseRequestPayload) {
|
|
581
|
+
return new Promise<PassphrasePromptResponse>((resolve, reject) => {
|
|
582
|
+
const cancelAndReject = (_error?: Error) =>
|
|
583
|
+
cancelDeviceInPrompt(this.device, false)
|
|
584
|
+
.then(onCancel => {
|
|
585
|
+
const error = ERRORS.TypedError(
|
|
586
|
+
HardwareErrorCode.CallQueueActionCancelled,
|
|
587
|
+
`${DEVICE.PASSPHRASE} canceled`
|
|
588
|
+
);
|
|
589
|
+
// onCancel not void
|
|
590
|
+
if (onCancel) {
|
|
591
|
+
const { payload } = onCancel || {};
|
|
592
|
+
reject(error || new Error(payload?.message));
|
|
593
|
+
} else {
|
|
594
|
+
reject(error);
|
|
595
|
+
}
|
|
596
|
+
})
|
|
597
|
+
.catch(error => {
|
|
598
|
+
reject(error);
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
if (this.device.listenerCount(DEVICE.PASSPHRASE) > 0) {
|
|
602
|
+
this.device.setCancelableAction(cancelAndReject);
|
|
603
|
+
this.device.emit(
|
|
604
|
+
DEVICE.PASSPHRASE,
|
|
605
|
+
this.device,
|
|
606
|
+
options,
|
|
607
|
+
(response: PassphrasePromptResponse, error?: Error) => {
|
|
608
|
+
this.device.clearCancelableAction();
|
|
609
|
+
if (error) {
|
|
610
|
+
cancelAndReject(error);
|
|
611
|
+
} else {
|
|
612
|
+
resolve(response);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
);
|
|
616
|
+
} else {
|
|
617
|
+
LogCore.error(
|
|
618
|
+
'[DeviceCommands] [call] Passphrase callback not configured, cancelling request'
|
|
619
|
+
);
|
|
620
|
+
reject(
|
|
621
|
+
ERRORS.TypedError(
|
|
622
|
+
HardwareErrorCode.RuntimeError,
|
|
623
|
+
'_promptPassphrase: Passphrase callback not configured'
|
|
624
|
+
)
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
export type TypedCall = DeviceCommands['typedCall'];
|