@ledgerhq/hw-transport
Version:
Ledger Hardware Wallet common interface of the communication layer
227 lines • 8.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserRefusedAddress = exports.UserRefusedOnDevice = exports.TransportExchangeTimeoutError = exports.TransportWebUSBGestureRequired = exports.TransportRaceCondition = exports.TransportInterfaceNotAvailable = exports.TransportOpenUserCancelled = exports.DisconnectedDeviceDuringOperation = exports.DisconnectedDevice = exports.CantOpenDevice = exports.BluetoothRequired = exports.DeviceMangementKitError = exports.LockedDeviceError = exports.TransportStatusError = exports.StatusCodes = exports.TransportError = exports.HwTransportError = exports.HwTransportErrorType = void 0;
exports.getAltStatusMessage = getAltStatusMessage;
var HwTransportErrorType;
(function (HwTransportErrorType) {
HwTransportErrorType["Unknown"] = "Unknown";
HwTransportErrorType["LocationServicesDisabled"] = "LocationServicesDisabled";
HwTransportErrorType["LocationServicesUnauthorized"] = "LocationServicesUnauthorized";
HwTransportErrorType["BluetoothScanStartFailed"] = "BluetoothScanStartFailed";
})(HwTransportErrorType || (exports.HwTransportErrorType = HwTransportErrorType = {}));
class HwTransportError extends Error {
type;
constructor(type, message) {
super(message || "HwTransportError");
this.name = "HwTransportError";
this.type = type;
Object.setPrototypeOf(this, HwTransportError.prototype);
}
}
exports.HwTransportError = HwTransportError;
class TransportError extends Error {
id;
constructor(message, id) {
const name = "TransportError";
super(message || name);
this.name = name;
this.message = message;
this.stack = new Error(message).stack;
this.id = id;
}
}
exports.TransportError = TransportError;
exports.StatusCodes = {
ACCESS_CONDITION_NOT_FULFILLED: 0x9804,
ALGORITHM_NOT_SUPPORTED: 0x9484,
CLA_NOT_SUPPORTED: 0x6e00,
CLA_NOT_SUPPORTED_BOOTLOADER: 0x6e01,
CODE_BLOCKED: 0x9840,
CODE_NOT_INITIALIZED: 0x9802,
COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981,
CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985,
CONTRADICTION_INVALIDATION: 0x9810,
CONTRADICTION_SECRET_CODE_STATUS: 0x9808,
DEVICE_IN_RECOVERY_MODE: 0x662f,
CUSTOM_IMAGE_EMPTY: 0x662e,
FILE_ALREADY_EXISTS: 0x6a89,
FILE_NOT_FOUND: 0x9404,
GP_AUTH_FAILED: 0x6300,
HALTED: 0x6faa,
INCONSISTENT_FILE: 0x9408,
INCORRECT_DATA: 0x6a80,
INCORRECT_LENGTH: 0x6700,
INCORRECT_P1_P2: 0x6b00,
INS_NOT_SUPPORTED: 0x6d00,
DEVICE_NOT_ONBOARDED: 0x6d07,
DEVICE_NOT_ONBOARDED_2: 0x6611,
INVALID_KCV: 0x9485,
INVALID_OFFSET: 0x9402,
LICENSING: 0x6f42,
LOCKED_DEVICE: 0x5515,
MAX_VALUE_REACHED: 0x9850,
MEMORY_PROBLEM: 0x9240,
MISSING_CRITICAL_PARAMETER: 0x6800,
NO_EF_SELECTED: 0x9400,
NOT_ENOUGH_MEMORY_SPACE: 0x6a84,
OK: 0x9000,
PIN_REMAINING_ATTEMPTS: 0x63c0,
REFERENCED_DATA_NOT_FOUND: 0x6a88,
SECURITY_STATUS_NOT_SATISFIED: 0x6982,
TECHNICAL_PROBLEM: 0x6f00,
UNKNOWN_APDU: 0x6d02,
USER_REFUSED_ON_DEVICE: 0x5501,
NOT_ENOUGH_SPACE: 0x5102,
APP_NOT_FOUND_OR_INVALID_CONTEXT: 0x5123,
INVALID_APP_NAME_LENGTH: 0x670a,
GEN_AES_KEY_FAILED: 0x5419,
INTERNAL_CRYPTO_OPERATION_FAILED: 0x541a,
INTERNAL_COMPUTE_AES_CMAC_FAILED: 0x541b,
ENCRYPT_APP_STORAGE_FAILED: 0x541c,
INVALID_BACKUP_STATE: 0x6642,
PIN_NOT_SET: 0x5502,
INVALID_BACKUP_LENGTH: 0x6733,
INVALID_RESTORE_STATE: 0x6643,
INVALID_CHUNK_LENGTH: 0x6734,
INVALID_BACKUP_HEADER: 0x684a,
SW_BAD_STATE: 0xb007,
};
function getAltStatusMessage(code) {
switch (code) {
case 0x6700:
return "Incorrect length";
case 0x6800:
return "Missing critical parameter";
case 0x6982:
return "Security not satisfied (dongle locked or have invalid access rights)";
case 0x6985:
return "Condition of use not satisfied (denied by the user?)";
case 0x6a80:
return "Invalid data received";
case 0x6b00:
return "Invalid parameter received";
case 0x5515:
return "Locked device";
case 0xb007:
return "Unexpected state on the device";
}
if (0x6f00 <= code && code <= 0x6fff) {
return "Internal error, please report";
}
}
class TransportStatusError extends Error {
statusCode;
statusText;
constructor(statusCode, { canBeMappedToChildError = true } = {}) {
const statusText = Object.keys(exports.StatusCodes).find(k => exports.StatusCodes[k] === statusCode) || "UNKNOWN_ERROR";
const smsg = getAltStatusMessage(statusCode) || statusText;
const statusCodeStr = statusCode.toString(16);
const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;
super(message || "TransportStatusError");
this.name = "TransportStatusError";
this.statusCode = statusCode;
this.statusText = statusText;
Object.setPrototypeOf(this, TransportStatusError.prototype);
if (canBeMappedToChildError && statusCode === exports.StatusCodes.LOCKED_DEVICE) {
return new LockedDeviceError(message);
}
}
}
exports.TransportStatusError = TransportStatusError;
class LockedDeviceError extends TransportStatusError {
constructor(message) {
super(exports.StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });
if (message) {
this.message = message;
}
this.name = "LockedDeviceError";
Object.setPrototypeOf(this, LockedDeviceError.prototype);
}
}
exports.LockedDeviceError = LockedDeviceError;
class DeviceMangementKitError extends Error {
constructor(name, message) {
super(message || "DeviceMangementKitError");
this.name = name;
Object.setPrototypeOf(this, DeviceMangementKitError.prototype);
}
}
exports.DeviceMangementKitError = DeviceMangementKitError;
class BluetoothRequired extends Error {
name = "BluetoothRequired";
constructor(message) {
super(message || "BluetoothRequired");
}
}
exports.BluetoothRequired = BluetoothRequired;
class CantOpenDevice extends Error {
name = "CantOpenDevice";
constructor(message) {
super(message || "CantOpenDevice");
}
}
exports.CantOpenDevice = CantOpenDevice;
class DisconnectedDevice extends Error {
name = "DisconnectedDevice";
constructor(message) {
super(message || "DisconnectedDevice");
}
}
exports.DisconnectedDevice = DisconnectedDevice;
class DisconnectedDeviceDuringOperation extends Error {
name = "DisconnectedDeviceDuringOperation";
constructor(message) {
super(message || "DisconnectedDeviceDuringOperation");
}
}
exports.DisconnectedDeviceDuringOperation = DisconnectedDeviceDuringOperation;
class TransportOpenUserCancelled extends Error {
name = "TransportOpenUserCancelled";
constructor(message) {
super(message || "TransportOpenUserCancelled");
}
}
exports.TransportOpenUserCancelled = TransportOpenUserCancelled;
class TransportInterfaceNotAvailable extends Error {
name = "TransportInterfaceNotAvailable";
constructor(message) {
super(message || "TransportInterfaceNotAvailable");
}
}
exports.TransportInterfaceNotAvailable = TransportInterfaceNotAvailable;
class TransportRaceCondition extends Error {
name = "TransportRaceCondition";
constructor(message) {
super(message || "TransportRaceCondition");
}
}
exports.TransportRaceCondition = TransportRaceCondition;
class TransportWebUSBGestureRequired extends Error {
name = "TransportWebUSBGestureRequired";
constructor(message) {
super(message || "TransportWebUSBGestureRequired");
}
}
exports.TransportWebUSBGestureRequired = TransportWebUSBGestureRequired;
class TransportExchangeTimeoutError extends Error {
name = "TransportExchangeTimeoutError";
constructor(message) {
super(message || "TransportExchangeTimeoutError");
}
}
exports.TransportExchangeTimeoutError = TransportExchangeTimeoutError;
class UserRefusedOnDevice extends Error {
name = "UserRefusedOnDevice";
constructor(message) {
super(message || "UserRefusedOnDevice");
}
}
exports.UserRefusedOnDevice = UserRefusedOnDevice;
class UserRefusedAddress extends Error {
name = "UserRefusedAddress";
constructor(message) {
super(message || "UserRefusedAddress");
}
}
exports.UserRefusedAddress = UserRefusedAddress;
//# sourceMappingURL=errors.js.map