@bitboxswiss/bitbox-api 0.1.0 → 0.2.0
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/CONTRIBUTING.md +4 -2
- package/README.md +69 -9
- package/dist/index.d.ts +337 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +451 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/cardano/methods.d.ts +7 -0
- package/dist/internal/cardano/methods.d.ts.map +1 -0
- package/dist/internal/cardano/methods.js +199 -0
- package/dist/internal/cardano/methods.js.map +1 -0
- package/dist/internal/cardano/query.d.ts +4 -0
- package/dist/internal/cardano/query.d.ts.map +1 -0
- package/dist/internal/cardano/query.js +20 -0
- package/dist/internal/cardano/query.js.map +1 -0
- package/dist/internal/connect-simulator.d.ts +2 -0
- package/dist/internal/connect-simulator.d.ts.map +1 -0
- package/dist/internal/connect-simulator.js +25 -0
- package/dist/internal/connect-simulator.js.map +1 -0
- package/dist/internal/connect.d.ts +2 -0
- package/dist/internal/connect.d.ts.map +1 -0
- package/dist/internal/connect.js +54 -0
- package/dist/internal/connect.js.map +1 -0
- package/dist/internal/constants.d.ts +2 -0
- package/dist/internal/constants.d.ts.map +1 -0
- package/dist/internal/constants.js +16 -0
- package/dist/internal/constants.js.map +1 -0
- package/dist/internal/device.d.ts +5 -0
- package/dist/internal/device.d.ts.map +1 -0
- package/dist/internal/device.js +40 -0
- package/dist/internal/device.js.map +1 -0
- package/dist/internal/errors.d.ts +2 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +220 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/eth/antiklepto.d.ts +5 -0
- package/dist/internal/eth/antiklepto.d.ts.map +1 -0
- package/dist/internal/eth/antiklepto.js +59 -0
- package/dist/internal/eth/antiklepto.js.map +1 -0
- package/dist/internal/eth/eip712.d.ts +25 -0
- package/dist/internal/eth/eip712.d.ts.map +1 -0
- package/dist/internal/eth/eip712.js +303 -0
- package/dist/internal/eth/eip712.js.map +1 -0
- package/dist/internal/eth/methods.d.ts +10 -0
- package/dist/internal/eth/methods.d.ts.map +1 -0
- package/dist/internal/eth/methods.js +245 -0
- package/dist/internal/eth/methods.js.map +1 -0
- package/dist/internal/eth/query.d.ts +4 -0
- package/dist/internal/eth/query.d.ts.map +1 -0
- package/dist/internal/eth/query.js +20 -0
- package/dist/internal/eth/query.js.map +1 -0
- package/dist/internal/eth/streaming.d.ts +4 -0
- package/dist/internal/eth/streaming.d.ts.map +1 -0
- package/dist/internal/eth/streaming.js +22 -0
- package/dist/internal/eth/streaming.js.map +1 -0
- package/dist/internal/eth/version.d.ts +2 -0
- package/dist/internal/eth/version.d.ts.map +1 -0
- package/dist/internal/eth/version.js +3 -0
- package/dist/internal/eth/version.js.map +1 -0
- package/dist/internal/hww.d.ts +2 -0
- package/dist/internal/hww.d.ts.map +1 -0
- package/dist/internal/hww.js +240 -0
- package/dist/internal/hww.js.map +1 -0
- package/dist/internal/keypath.d.ts +4 -0
- package/dist/internal/keypath.d.ts.map +1 -0
- package/dist/internal/keypath.js +47 -0
- package/dist/internal/keypath.js.map +1 -0
- package/dist/internal/message-queue.d.ts +2 -0
- package/dist/internal/message-queue.d.ts.map +1 -0
- package/dist/internal/message-queue.js +29 -0
- package/dist/internal/message-queue.js.map +1 -0
- package/dist/internal/noise-config.d.ts +2 -0
- package/dist/internal/noise-config.d.ts.map +1 -0
- package/dist/internal/noise-config.js +160 -0
- package/dist/internal/noise-config.js.map +1 -0
- package/dist/internal/noise.d.ts +2 -0
- package/dist/internal/noise.d.ts.map +1 -0
- package/dist/internal/noise.js +270 -0
- package/dist/internal/noise.js.map +1 -0
- package/dist/internal/pairing.d.ts +2 -0
- package/dist/internal/pairing.d.ts.map +1 -0
- package/dist/internal/pairing.js +130 -0
- package/dist/internal/pairing.js.map +1 -0
- package/dist/internal/proto-query.d.ts +5 -0
- package/dist/internal/proto-query.d.ts.map +1 -0
- package/dist/internal/proto-query.js +28 -0
- package/dist/internal/proto-query.js.map +1 -0
- package/dist/internal/read-write.d.ts +2 -0
- package/dist/internal/read-write.d.ts.map +1 -0
- package/dist/internal/read-write.js +40 -0
- package/dist/internal/read-write.js.map +1 -0
- package/dist/internal/restore.d.ts +3 -0
- package/dist/internal/restore.d.ts.map +1 -0
- package/dist/internal/restore.js +27 -0
- package/dist/internal/restore.js.map +1 -0
- package/dist/internal/transport-bridge.d.ts +2 -0
- package/dist/internal/transport-bridge.d.ts.map +1 -0
- package/dist/internal/transport-bridge.js +97 -0
- package/dist/internal/transport-bridge.js.map +1 -0
- package/dist/internal/transport-simulator.d.ts +2 -0
- package/dist/internal/transport-simulator.d.ts.map +1 -0
- package/dist/internal/transport-simulator.js +83 -0
- package/dist/internal/transport-simulator.js.map +1 -0
- package/dist/internal/transport-webhid.d.ts +2 -0
- package/dist/internal/transport-webhid.d.ts.map +1 -0
- package/dist/internal/transport-webhid.js +69 -0
- package/dist/internal/transport-webhid.js.map +1 -0
- package/dist/internal/u2f-framing.d.ts +2 -0
- package/dist/internal/u2f-framing.d.ts.map +1 -0
- package/dist/internal/u2f-framing.js +155 -0
- package/dist/internal/u2f-framing.js.map +1 -0
- package/dist/internal/utils.d.ts +2 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/internal/utils.js +90 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/internal/version.d.ts +8 -0
- package/dist/internal/version.d.ts.map +1 -0
- package/dist/internal/version.js +9 -0
- package/dist/internal/version.js.map +1 -0
- package/dist/proto/gen/antiklepto_pb.d.ts +49 -0
- package/dist/proto/gen/antiklepto_pb.d.ts.map +1 -0
- package/dist/proto/gen/antiklepto_pb.js +22 -0
- package/dist/proto/gen/antiklepto_pb.js.map +1 -0
- package/dist/proto/gen/backup_commands_pb.d.ts +124 -0
- package/dist/proto/gen/backup_commands_pb.d.ts.map +1 -0
- package/dist/proto/gen/backup_commands_pb.js +42 -0
- package/dist/proto/gen/backup_commands_pb.js.map +1 -0
- package/dist/proto/gen/backup_pb.d.ts +150 -0
- package/dist/proto/gen/backup_pb.d.ts.map +1 -0
- package/dist/proto/gen/backup_pb.js +46 -0
- package/dist/proto/gen/backup_pb.js.map +1 -0
- package/dist/proto/gen/bitbox02_system_pb.d.ts +207 -0
- package/dist/proto/gen/bitbox02_system_pb.d.ts.map +1 -0
- package/dist/proto/gen/bitbox02_system_pb.js +80 -0
- package/dist/proto/gen/bitbox02_system_pb.js.map +1 -0
- package/dist/proto/gen/bluetooth_pb.d.ts +135 -0
- package/dist/proto/gen/bluetooth_pb.d.ts.map +1 -0
- package/dist/proto/gen/bluetooth_pb.js +42 -0
- package/dist/proto/gen/bluetooth_pb.js.map +1 -0
- package/dist/proto/gen/btc_pb.d.ts +1166 -0
- package/dist/proto/gen/btc_pb.d.ts.map +1 -0
- package/dist/proto/gen/btc_pb.js +442 -0
- package/dist/proto/gen/btc_pb.js.map +1 -0
- package/dist/proto/gen/cardano_pb.d.ts +504 -0
- package/dist/proto/gen/cardano_pb.d.ts.map +1 -0
- package/dist/proto/gen/cardano_pb.js +142 -0
- package/dist/proto/gen/cardano_pb.js.map +1 -0
- package/dist/proto/gen/common_pb.d.ts +129 -0
- package/dist/proto/gen/common_pb.d.ts.map +1 -0
- package/dist/proto/gen/common_pb.js +42 -0
- package/dist/proto/gen/common_pb.js.map +1 -0
- package/dist/proto/gen/eth_pb.d.ts +662 -0
- package/dist/proto/gen/eth_pb.d.ts.map +1 -0
- package/dist/proto/gen/eth_pb.js +221 -0
- package/dist/proto/gen/eth_pb.js.map +1 -0
- package/dist/proto/gen/hww_pb.d.ts +349 -0
- package/dist/proto/gen/hww_pb.d.ts.map +1 -0
- package/dist/proto/gen/hww_pb.js +38 -0
- package/dist/proto/gen/hww_pb.js.map +1 -0
- package/dist/proto/gen/keystore_pb.d.ts +108 -0
- package/dist/proto/gen/keystore_pb.d.ts.map +1 -0
- package/dist/proto/gen/keystore_pb.js +33 -0
- package/dist/proto/gen/keystore_pb.js.map +1 -0
- package/dist/proto/gen/mnemonic_pb.d.ts +48 -0
- package/dist/proto/gen/mnemonic_pb.d.ts.map +1 -0
- package/dist/proto/gen/mnemonic_pb.js +22 -0
- package/dist/proto/gen/mnemonic_pb.js.map +1 -0
- package/dist/proto/gen/perform_attestation_pb.d.ts +57 -0
- package/dist/proto/gen/perform_attestation_pb.d.ts.map +1 -0
- package/dist/proto/gen/perform_attestation_pb.js +17 -0
- package/dist/proto/gen/perform_attestation_pb.js.map +1 -0
- package/dist/proto/gen/system_pb.d.ts +38 -0
- package/dist/proto/gen/system_pb.d.ts.map +1 -0
- package/dist/proto/gen/system_pb.js +30 -0
- package/dist/proto/gen/system_pb.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { create } from '@bufbuild/protobuf';
|
|
3
|
+
import { ETHSignDataResponseChunkRequestSchema, } from '../../proto/gen/eth_pb.js';
|
|
4
|
+
import { unexpectedResponse } from '../proto-query.js';
|
|
5
|
+
import { queryEth } from './query.js';
|
|
6
|
+
export async function handleEthDataStreaming(channel, data, initialResponse) {
|
|
7
|
+
let response = initialResponse;
|
|
8
|
+
while (response.case === 'dataRequestChunk') {
|
|
9
|
+
const { offset, length } = response.value;
|
|
10
|
+
const end = offset + length;
|
|
11
|
+
if (offset > data.length || end > data.length) {
|
|
12
|
+
throw unexpectedResponse('chunk request out of range');
|
|
13
|
+
}
|
|
14
|
+
const chunk = data.subarray(offset, end);
|
|
15
|
+
response = await queryEth(channel, {
|
|
16
|
+
case: 'dataResponseChunk',
|
|
17
|
+
value: create(ETHSignDataResponseChunkRequestSchema, { chunk }),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return response;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/internal/eth/streaming.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,qCAAqC,GAEtC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAyB,EACzB,IAAgB,EAChB,eAAwC;IAExC,IAAI,QAAQ,GAAG,eAAe,CAAC;IAC/B,OAAO,QAAQ,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACzC,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE;YACjC,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,MAAM,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/internal/eth/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/internal/eth/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hww.d.ts","sourceRoot":"","sources":["../../src/internal/hww.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { PACKET_SIZE, U2fHid, U2fWs } from './u2f-framing.js';
|
|
3
|
+
import { TransportError, query } from './read-write.js';
|
|
4
|
+
import { sleep } from './utils.js';
|
|
5
|
+
/** @internal */
|
|
6
|
+
export const HWW_REQ_NEW = 0x00;
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const HWW_REQ_RETRY = 0x01;
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const HWW_INFO = 0x69;
|
|
11
|
+
/** @internal */
|
|
12
|
+
export const HWW_RSP_ACK = 0x00;
|
|
13
|
+
/** @internal */
|
|
14
|
+
export const HWW_RSP_NOTREADY = 0x01;
|
|
15
|
+
/** @internal */
|
|
16
|
+
export const HWW_RSP_BUSY = 0x02;
|
|
17
|
+
/** @internal */
|
|
18
|
+
export const HWW_RSP_NACK = 0x03;
|
|
19
|
+
const PLATFORM_BITBOX02 = 0x00;
|
|
20
|
+
const PLATFORM_BITBOX02_NOVA = 0x02;
|
|
21
|
+
const EDITION_MULTI = 0x00;
|
|
22
|
+
const EDITION_BTCONLY = 0x01;
|
|
23
|
+
const BUSY_SLEEP_MS = 1000;
|
|
24
|
+
const NOTREADY_SLEEP_MS = 200;
|
|
25
|
+
/** @internal */
|
|
26
|
+
export function isMultiEdition(info) {
|
|
27
|
+
return info.product === 'bitbox02-multi' || info.product === 'bitbox02-nova-multi';
|
|
28
|
+
}
|
|
29
|
+
/** @internal */
|
|
30
|
+
export const DEFAULT_SLEEPER = { sleep };
|
|
31
|
+
/**
|
|
32
|
+
* Wraps a lower byte-pipe with U2F HID framing. Writes are encoded and
|
|
33
|
+
* chunked into 64-byte HID packets; reads accumulate packets until the
|
|
34
|
+
* decoder returns a complete message.
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
export class U2fHidCommunication {
|
|
38
|
+
lower;
|
|
39
|
+
framer;
|
|
40
|
+
constructor(lower, cmd) {
|
|
41
|
+
this.lower = lower;
|
|
42
|
+
this.framer = new U2fHid(cmd);
|
|
43
|
+
}
|
|
44
|
+
write(msg) {
|
|
45
|
+
const encoded = this.framer.encode(msg);
|
|
46
|
+
for (let offset = 0; offset < encoded.length; offset += PACKET_SIZE) {
|
|
47
|
+
this.lower.write(encoded.subarray(offset, offset + PACKET_SIZE));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async read() {
|
|
51
|
+
let buf = await this.lower.read();
|
|
52
|
+
for (;;) {
|
|
53
|
+
const decoded = this.framer.decode(buf);
|
|
54
|
+
if (decoded !== null) {
|
|
55
|
+
return decoded;
|
|
56
|
+
}
|
|
57
|
+
const more = await this.lower.read();
|
|
58
|
+
const combined = new Uint8Array(buf.length + more.length);
|
|
59
|
+
combined.set(buf, 0);
|
|
60
|
+
combined.set(more, buf.length);
|
|
61
|
+
buf = combined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wraps a lower byte-pipe with single-frame U2F WS framing.
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export class U2fWsCommunication {
|
|
70
|
+
lower;
|
|
71
|
+
framer;
|
|
72
|
+
constructor(lower, cmd) {
|
|
73
|
+
this.lower = lower;
|
|
74
|
+
this.framer = new U2fWs(cmd);
|
|
75
|
+
}
|
|
76
|
+
write(msg) {
|
|
77
|
+
this.lower.write(this.framer.encode(msg));
|
|
78
|
+
}
|
|
79
|
+
async read() {
|
|
80
|
+
let buf = await this.lower.read();
|
|
81
|
+
for (;;) {
|
|
82
|
+
const decoded = this.framer.decode(buf);
|
|
83
|
+
if (decoded !== null) {
|
|
84
|
+
return decoded;
|
|
85
|
+
}
|
|
86
|
+
const more = await this.lower.read();
|
|
87
|
+
const combined = new Uint8Array(buf.length + more.length);
|
|
88
|
+
combined.set(buf, 0);
|
|
89
|
+
combined.set(more, buf.length);
|
|
90
|
+
buf = combined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function productFrom(platform, edition) {
|
|
95
|
+
if (platform === PLATFORM_BITBOX02 && edition === EDITION_MULTI) {
|
|
96
|
+
return 'bitbox02-multi';
|
|
97
|
+
}
|
|
98
|
+
if (platform === PLATFORM_BITBOX02 && edition === EDITION_BTCONLY) {
|
|
99
|
+
return 'bitbox02-btconly';
|
|
100
|
+
}
|
|
101
|
+
if (platform === PLATFORM_BITBOX02_NOVA && edition === EDITION_MULTI) {
|
|
102
|
+
return 'bitbox02-nova-multi';
|
|
103
|
+
}
|
|
104
|
+
if (platform === PLATFORM_BITBOX02_NOVA && edition === EDITION_BTCONLY) {
|
|
105
|
+
return 'bitbox02-nova-btconly';
|
|
106
|
+
}
|
|
107
|
+
return 'unknown';
|
|
108
|
+
}
|
|
109
|
+
/** @internal */
|
|
110
|
+
export function parseSemver(s) {
|
|
111
|
+
const m = s.match(/^(\d+)\.(\d+)\.(\d+)$/);
|
|
112
|
+
if (m === null) {
|
|
113
|
+
throw new TransportError('info', `invalid semver: ${s}`);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
major: Number(m[1]),
|
|
117
|
+
minor: Number(m[2]),
|
|
118
|
+
patch: Number(m[3]),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Returns true if `v >= target`. Both are major.minor.patch triplets.
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
export function atLeast(v, target) {
|
|
126
|
+
if (v.major !== target.major) {
|
|
127
|
+
return v.major > target.major;
|
|
128
|
+
}
|
|
129
|
+
if (v.minor !== target.minor) {
|
|
130
|
+
return v.minor > target.minor;
|
|
131
|
+
}
|
|
132
|
+
return v.patch >= target.patch;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Probes the device over the HWW info opcode. Runs before Noise pairing and
|
|
136
|
+
* before any HWW request framing.
|
|
137
|
+
* @internal
|
|
138
|
+
*/
|
|
139
|
+
export async function getInfo(rw) {
|
|
140
|
+
const response = await query(rw, new Uint8Array([HWW_INFO]));
|
|
141
|
+
if (response.length < 1) {
|
|
142
|
+
throw new TransportError('info', 'empty info response');
|
|
143
|
+
}
|
|
144
|
+
const versionLen = response[0];
|
|
145
|
+
if (response.length < 1 + versionLen + 3) {
|
|
146
|
+
throw new TransportError('info', 'truncated info response');
|
|
147
|
+
}
|
|
148
|
+
const versionRaw = new TextDecoder().decode(response.subarray(1, 1 + versionLen));
|
|
149
|
+
if (!versionRaw.startsWith('v')) {
|
|
150
|
+
throw new TransportError('info', 'version missing v-prefix');
|
|
151
|
+
}
|
|
152
|
+
const version = versionRaw.slice(1);
|
|
153
|
+
parseSemver(version);
|
|
154
|
+
const tail = response.subarray(1 + versionLen);
|
|
155
|
+
const platform = tail[0];
|
|
156
|
+
const edition = tail[1];
|
|
157
|
+
const unlockedByte = tail[2];
|
|
158
|
+
const initializedByte = tail.length >= 4 ? tail[3] : undefined;
|
|
159
|
+
let unlocked;
|
|
160
|
+
if (unlockedByte === 0x00) {
|
|
161
|
+
unlocked = false;
|
|
162
|
+
}
|
|
163
|
+
else if (unlockedByte === 0x01) {
|
|
164
|
+
unlocked = true;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
throw new TransportError('info', `invalid unlocked byte: ${unlockedByte}`);
|
|
168
|
+
}
|
|
169
|
+
let initialized;
|
|
170
|
+
if (initializedByte === undefined) {
|
|
171
|
+
initialized = undefined;
|
|
172
|
+
}
|
|
173
|
+
else if (initializedByte === 0x00) {
|
|
174
|
+
initialized = false;
|
|
175
|
+
}
|
|
176
|
+
else if (initializedByte === 0x01) {
|
|
177
|
+
initialized = true;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
throw new TransportError('info', `invalid initialized byte: ${initializedByte}`);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
version,
|
|
184
|
+
product: productFrom(platform, edition),
|
|
185
|
+
unlocked,
|
|
186
|
+
initialized,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Adds the HWW request/response framing opcode layer plus BUSY/NOTREADY
|
|
191
|
+
* retry logic on top of the U2F-framed communication.
|
|
192
|
+
* @internal
|
|
193
|
+
*/
|
|
194
|
+
export class HwwCommunication {
|
|
195
|
+
comm;
|
|
196
|
+
info;
|
|
197
|
+
sleeper;
|
|
198
|
+
constructor(comm, info, sleeper = DEFAULT_SLEEPER) {
|
|
199
|
+
this.comm = comm;
|
|
200
|
+
this.info = info;
|
|
201
|
+
this.sleeper = sleeper;
|
|
202
|
+
}
|
|
203
|
+
static async create(comm, sleeper = DEFAULT_SLEEPER) {
|
|
204
|
+
const info = await getInfo(comm);
|
|
205
|
+
if (!atLeast(parseSemver(info.version), { major: 7, minor: 0, patch: 0 })) {
|
|
206
|
+
throw new TransportError('version', 'firmware version >=7.0.0 required');
|
|
207
|
+
}
|
|
208
|
+
return new HwwCommunication(comm, info, sleeper);
|
|
209
|
+
}
|
|
210
|
+
async query(msg) {
|
|
211
|
+
const framed = new Uint8Array(msg.length + 1);
|
|
212
|
+
framed[0] = HWW_REQ_NEW;
|
|
213
|
+
framed.set(msg, 1);
|
|
214
|
+
let response;
|
|
215
|
+
for (;;) {
|
|
216
|
+
response = await query(this.comm, framed);
|
|
217
|
+
if (response.length >= 1 && response[0] === HWW_RSP_BUSY) {
|
|
218
|
+
await this.sleeper.sleep(BUSY_SLEEP_MS);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
for (;;) {
|
|
224
|
+
if (response.length < 1) {
|
|
225
|
+
throw new TransportError('info', 'empty HWW response');
|
|
226
|
+
}
|
|
227
|
+
const opcode = response[0];
|
|
228
|
+
if (opcode === HWW_RSP_ACK) {
|
|
229
|
+
return response.slice(1);
|
|
230
|
+
}
|
|
231
|
+
if (opcode === HWW_RSP_NOTREADY) {
|
|
232
|
+
await this.sleeper.sleep(NOTREADY_SLEEP_MS);
|
|
233
|
+
response = await query(this.comm, new Uint8Array([HWW_REQ_RETRY]));
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
throw new TransportError('info', `HWW response opcode ${opcode}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=hww.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hww.js","sourceRoot":"","sources":["../../src/internal/hww.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypath.d.ts","sourceRoot":"","sources":["../../src/internal/keypath.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,QAAQ,aAAa,CAAC;AA0CnC,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAKrD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { keypathParseError } from './errors.js';
|
|
3
|
+
export const HARDENED = 0x80000000;
|
|
4
|
+
const MAX_UINT32 = 0xffffffff;
|
|
5
|
+
function parseString(input) {
|
|
6
|
+
if (!input.startsWith('m/')) {
|
|
7
|
+
throw keypathParseError(input);
|
|
8
|
+
}
|
|
9
|
+
const rest = input.slice(2);
|
|
10
|
+
if (rest === '') {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const parts = rest.split('/');
|
|
14
|
+
const out = [];
|
|
15
|
+
for (const part of parts) {
|
|
16
|
+
let body = part;
|
|
17
|
+
let addPrime = 0;
|
|
18
|
+
if (body.endsWith('\'')) {
|
|
19
|
+
addPrime = HARDENED;
|
|
20
|
+
body = body.slice(0, -1);
|
|
21
|
+
}
|
|
22
|
+
if (body === '' || !/^\d+$/.test(body)) {
|
|
23
|
+
throw keypathParseError(input);
|
|
24
|
+
}
|
|
25
|
+
const n = Number(body);
|
|
26
|
+
if (!Number.isInteger(n) || n < 0 || n >= HARDENED) {
|
|
27
|
+
throw keypathParseError(input);
|
|
28
|
+
}
|
|
29
|
+
out.push(n + addPrime);
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
function validateArray(input) {
|
|
34
|
+
for (const n of input) {
|
|
35
|
+
if (!Number.isInteger(n) || n < 0 || n > MAX_UINT32) {
|
|
36
|
+
throw keypathParseError(String(n));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return [...input];
|
|
40
|
+
}
|
|
41
|
+
export function parseKeypath(input) {
|
|
42
|
+
if (Array.isArray(input)) {
|
|
43
|
+
return validateArray(input);
|
|
44
|
+
}
|
|
45
|
+
return parseString(input);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=keypath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypath.js","sourceRoot":"","sources":["../../src/internal/keypath.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAGtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,GAAG,QAAQ,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;YACnD,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAe;IACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC;YACpD,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-queue.d.ts","sourceRoot":"","sources":["../../src/internal/message-queue.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Single-producer / single-consumer message queue. Mirrors
|
|
4
|
+
* `bitbox-api-rs/pkg/webhid.js` MessageQueue: if a consumer is already
|
|
5
|
+
* awaiting, `push` resolves it immediately; otherwise the message is buffered.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export class MessageQueue {
|
|
9
|
+
messages = [];
|
|
10
|
+
resolvers = [];
|
|
11
|
+
push(msg) {
|
|
12
|
+
const next = this.resolvers.shift();
|
|
13
|
+
if (next !== undefined) {
|
|
14
|
+
next(msg);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.messages.push(msg);
|
|
18
|
+
}
|
|
19
|
+
next() {
|
|
20
|
+
const msg = this.messages.shift();
|
|
21
|
+
if (msg !== undefined) {
|
|
22
|
+
return Promise.resolve(msg);
|
|
23
|
+
}
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
this.resolvers.push(resolve);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=message-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-queue.js","sourceRoot":"","sources":["../../src/internal/message-queue.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACN,QAAQ,GAAiB,EAAE,CAAC;IAC5B,SAAS,GAAmC,EAAE,CAAC;IAEhE,IAAI,CAAC,GAAe;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise-config.d.ts","sourceRoot":"","sources":["../../src/internal/noise-config.ts"],"names":[],"mappings":"AA2LA,wBAAgB,kBAAkB,IAAI,WAAW,CAWhD"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { noiseConfigError } from './errors.js';
|
|
3
|
+
/** @internal */
|
|
4
|
+
export const LOCAL_STORAGE_CONFIG_KEY = 'bitbox02Config';
|
|
5
|
+
function emptyConfig() {
|
|
6
|
+
return { deviceStaticPubkeys: [] };
|
|
7
|
+
}
|
|
8
|
+
function toJson(data) {
|
|
9
|
+
const shape = {
|
|
10
|
+
app_static_privkey: data.appStaticPrivkey !== undefined ? Array.from(data.appStaticPrivkey) : null,
|
|
11
|
+
device_static_pubkeys: data.deviceStaticPubkeys.map((pk) => Array.from(pk)),
|
|
12
|
+
};
|
|
13
|
+
return JSON.stringify(shape);
|
|
14
|
+
}
|
|
15
|
+
function fromJson(text) {
|
|
16
|
+
const parsed = JSON.parse(text);
|
|
17
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
18
|
+
throw new Error('must be an object');
|
|
19
|
+
}
|
|
20
|
+
const shape = parsed;
|
|
21
|
+
const privkey = shape.app_static_privkey ?? null;
|
|
22
|
+
const pubkeys = shape.device_static_pubkeys;
|
|
23
|
+
if (!Array.isArray(pubkeys)) {
|
|
24
|
+
throw new Error('device_static_pubkeys must be an array');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
...(privkey === null ? {} : { appStaticPrivkey: bytesFromArray(privkey, 'app_static_privkey') }),
|
|
28
|
+
deviceStaticPubkeys: pubkeys.map((pk, index) => bytesFromArray(pk, `device_static_pubkeys[${index}]`)),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function bytesFromArray(value, field) {
|
|
32
|
+
if (!Array.isArray(value) || value.length !== 32) {
|
|
33
|
+
throw new Error(`${field} must be a 32-byte integer array`);
|
|
34
|
+
}
|
|
35
|
+
for (const byte of value) {
|
|
36
|
+
if (!Number.isInteger(byte) || byte < 0 || byte > 0xff) {
|
|
37
|
+
throw new Error(`${field} contains an invalid byte`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return Uint8Array.from(value);
|
|
41
|
+
}
|
|
42
|
+
function bytesEqual(a, b) {
|
|
43
|
+
if (a.length !== b.length) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
for (let i = 0; i < a.length; i += 1) {
|
|
47
|
+
if (a[i] !== b[i]) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** @internal */
|
|
54
|
+
export function containsDeviceStaticPubkey(data, pubkey) {
|
|
55
|
+
return data.deviceStaticPubkeys.some((known) => bytesEqual(known, pubkey));
|
|
56
|
+
}
|
|
57
|
+
/** @internal */
|
|
58
|
+
export function addDeviceStaticPubkey(data, pubkey) {
|
|
59
|
+
if (containsDeviceStaticPubkey(data, pubkey)) {
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
...(data.appStaticPrivkey === undefined ? {} : { appStaticPrivkey: data.appStaticPrivkey }),
|
|
64
|
+
deviceStaticPubkeys: [...data.deviceStaticPubkeys, new Uint8Array(pubkey)],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Always returns an empty config and never persists. @internal */
|
|
68
|
+
export class NoiseConfigNoCache {
|
|
69
|
+
read() {
|
|
70
|
+
return emptyConfig();
|
|
71
|
+
}
|
|
72
|
+
store(_data) {
|
|
73
|
+
// intentionally empty
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* In-memory storage. Used by tests and as a non-persisting default in
|
|
78
|
+
* environments without `localStorage`.
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
export class InMemoryNoiseConfig {
|
|
82
|
+
data = emptyConfig();
|
|
83
|
+
read() {
|
|
84
|
+
return {
|
|
85
|
+
...(this.data.appStaticPrivkey === undefined
|
|
86
|
+
? {}
|
|
87
|
+
: { appStaticPrivkey: new Uint8Array(this.data.appStaticPrivkey) }),
|
|
88
|
+
deviceStaticPubkeys: this.data.deviceStaticPubkeys.map((pk) => new Uint8Array(pk)),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
store(data) {
|
|
92
|
+
this.data = {
|
|
93
|
+
...(data.appStaticPrivkey === undefined
|
|
94
|
+
? {}
|
|
95
|
+
: { appStaticPrivkey: new Uint8Array(data.appStaticPrivkey) }),
|
|
96
|
+
deviceStaticPubkeys: data.deviceStaticPubkeys.map((pk) => new Uint8Array(pk)),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Browser-default config. Uses the `Storage`-shaped `localStorage` global; on a
|
|
102
|
+
* missing key, malformed persisted JSON, or storage read failure it starts from
|
|
103
|
+
* an empty config, matching the wasm package behavior.
|
|
104
|
+
* @internal
|
|
105
|
+
*/
|
|
106
|
+
export class LocalStorageNoiseConfig {
|
|
107
|
+
storage;
|
|
108
|
+
key;
|
|
109
|
+
constructor(storage, key = LOCAL_STORAGE_CONFIG_KEY) {
|
|
110
|
+
const fallback = globalThis.localStorage;
|
|
111
|
+
if (storage === undefined && fallback === undefined) {
|
|
112
|
+
throw new Error('localStorage is not available');
|
|
113
|
+
}
|
|
114
|
+
this.storage = storage ?? fallback;
|
|
115
|
+
this.key = key;
|
|
116
|
+
}
|
|
117
|
+
read() {
|
|
118
|
+
try {
|
|
119
|
+
const raw = this.storage.getItem(this.key);
|
|
120
|
+
if (raw === null) {
|
|
121
|
+
return emptyConfig();
|
|
122
|
+
}
|
|
123
|
+
return fromJson(raw);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return emptyConfig();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
store(data) {
|
|
130
|
+
try {
|
|
131
|
+
this.storage.setItem(this.key, toJson(data));
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
throw noiseConfigError('could not write to localstorage');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Default config used by browser connect functions: localStorage-backed if
|
|
140
|
+
* available, otherwise a module-scoped in-memory fallback. The fallback keeps
|
|
141
|
+
* pairing trust for the lifetime of the current JS runtime, which avoids
|
|
142
|
+
* repeated pairing prompts in browser contexts without localStorage while still
|
|
143
|
+
* leaving explicit `NoiseConfigNoCache` available for tests and callers.
|
|
144
|
+
* @internal
|
|
145
|
+
*/
|
|
146
|
+
const fallbackDefaultConfig = new InMemoryNoiseConfig();
|
|
147
|
+
export function defaultNoiseConfig() {
|
|
148
|
+
let ls;
|
|
149
|
+
try {
|
|
150
|
+
ls = globalThis.localStorage;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
ls = undefined;
|
|
154
|
+
}
|
|
155
|
+
if (ls !== undefined) {
|
|
156
|
+
return new LocalStorageNoiseConfig(ls);
|
|
157
|
+
}
|
|
158
|
+
return fallbackDefaultConfig;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=noise-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise-config.js","sourceRoot":"","sources":["../../src/internal/noise-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../src/internal/noise.ts"],"names":[],"mappings":""}
|