@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.
Files changed (175) hide show
  1. package/CONTRIBUTING.md +4 -2
  2. package/README.md +69 -9
  3. package/dist/index.d.ts +337 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +451 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/internal/cardano/methods.d.ts +7 -0
  8. package/dist/internal/cardano/methods.d.ts.map +1 -0
  9. package/dist/internal/cardano/methods.js +199 -0
  10. package/dist/internal/cardano/methods.js.map +1 -0
  11. package/dist/internal/cardano/query.d.ts +4 -0
  12. package/dist/internal/cardano/query.d.ts.map +1 -0
  13. package/dist/internal/cardano/query.js +20 -0
  14. package/dist/internal/cardano/query.js.map +1 -0
  15. package/dist/internal/connect-simulator.d.ts +2 -0
  16. package/dist/internal/connect-simulator.d.ts.map +1 -0
  17. package/dist/internal/connect-simulator.js +25 -0
  18. package/dist/internal/connect-simulator.js.map +1 -0
  19. package/dist/internal/connect.d.ts +2 -0
  20. package/dist/internal/connect.d.ts.map +1 -0
  21. package/dist/internal/connect.js +54 -0
  22. package/dist/internal/connect.js.map +1 -0
  23. package/dist/internal/constants.d.ts +2 -0
  24. package/dist/internal/constants.d.ts.map +1 -0
  25. package/dist/internal/constants.js +16 -0
  26. package/dist/internal/constants.js.map +1 -0
  27. package/dist/internal/device.d.ts +5 -0
  28. package/dist/internal/device.d.ts.map +1 -0
  29. package/dist/internal/device.js +40 -0
  30. package/dist/internal/device.js.map +1 -0
  31. package/dist/internal/errors.d.ts +2 -0
  32. package/dist/internal/errors.d.ts.map +1 -0
  33. package/dist/internal/errors.js +220 -0
  34. package/dist/internal/errors.js.map +1 -0
  35. package/dist/internal/eth/antiklepto.d.ts +5 -0
  36. package/dist/internal/eth/antiklepto.d.ts.map +1 -0
  37. package/dist/internal/eth/antiklepto.js +59 -0
  38. package/dist/internal/eth/antiklepto.js.map +1 -0
  39. package/dist/internal/eth/eip712.d.ts +25 -0
  40. package/dist/internal/eth/eip712.d.ts.map +1 -0
  41. package/dist/internal/eth/eip712.js +303 -0
  42. package/dist/internal/eth/eip712.js.map +1 -0
  43. package/dist/internal/eth/methods.d.ts +10 -0
  44. package/dist/internal/eth/methods.d.ts.map +1 -0
  45. package/dist/internal/eth/methods.js +245 -0
  46. package/dist/internal/eth/methods.js.map +1 -0
  47. package/dist/internal/eth/query.d.ts +4 -0
  48. package/dist/internal/eth/query.d.ts.map +1 -0
  49. package/dist/internal/eth/query.js +20 -0
  50. package/dist/internal/eth/query.js.map +1 -0
  51. package/dist/internal/eth/streaming.d.ts +4 -0
  52. package/dist/internal/eth/streaming.d.ts.map +1 -0
  53. package/dist/internal/eth/streaming.js +22 -0
  54. package/dist/internal/eth/streaming.js.map +1 -0
  55. package/dist/internal/eth/version.d.ts +2 -0
  56. package/dist/internal/eth/version.d.ts.map +1 -0
  57. package/dist/internal/eth/version.js +3 -0
  58. package/dist/internal/eth/version.js.map +1 -0
  59. package/dist/internal/hww.d.ts +2 -0
  60. package/dist/internal/hww.d.ts.map +1 -0
  61. package/dist/internal/hww.js +240 -0
  62. package/dist/internal/hww.js.map +1 -0
  63. package/dist/internal/keypath.d.ts +4 -0
  64. package/dist/internal/keypath.d.ts.map +1 -0
  65. package/dist/internal/keypath.js +47 -0
  66. package/dist/internal/keypath.js.map +1 -0
  67. package/dist/internal/message-queue.d.ts +2 -0
  68. package/dist/internal/message-queue.d.ts.map +1 -0
  69. package/dist/internal/message-queue.js +29 -0
  70. package/dist/internal/message-queue.js.map +1 -0
  71. package/dist/internal/noise-config.d.ts +2 -0
  72. package/dist/internal/noise-config.d.ts.map +1 -0
  73. package/dist/internal/noise-config.js +160 -0
  74. package/dist/internal/noise-config.js.map +1 -0
  75. package/dist/internal/noise.d.ts +2 -0
  76. package/dist/internal/noise.d.ts.map +1 -0
  77. package/dist/internal/noise.js +270 -0
  78. package/dist/internal/noise.js.map +1 -0
  79. package/dist/internal/pairing.d.ts +2 -0
  80. package/dist/internal/pairing.d.ts.map +1 -0
  81. package/dist/internal/pairing.js +130 -0
  82. package/dist/internal/pairing.js.map +1 -0
  83. package/dist/internal/proto-query.d.ts +5 -0
  84. package/dist/internal/proto-query.d.ts.map +1 -0
  85. package/dist/internal/proto-query.js +28 -0
  86. package/dist/internal/proto-query.js.map +1 -0
  87. package/dist/internal/read-write.d.ts +2 -0
  88. package/dist/internal/read-write.d.ts.map +1 -0
  89. package/dist/internal/read-write.js +40 -0
  90. package/dist/internal/read-write.js.map +1 -0
  91. package/dist/internal/restore.d.ts +3 -0
  92. package/dist/internal/restore.d.ts.map +1 -0
  93. package/dist/internal/restore.js +27 -0
  94. package/dist/internal/restore.js.map +1 -0
  95. package/dist/internal/transport-bridge.d.ts +2 -0
  96. package/dist/internal/transport-bridge.d.ts.map +1 -0
  97. package/dist/internal/transport-bridge.js +97 -0
  98. package/dist/internal/transport-bridge.js.map +1 -0
  99. package/dist/internal/transport-simulator.d.ts +2 -0
  100. package/dist/internal/transport-simulator.d.ts.map +1 -0
  101. package/dist/internal/transport-simulator.js +83 -0
  102. package/dist/internal/transport-simulator.js.map +1 -0
  103. package/dist/internal/transport-webhid.d.ts +2 -0
  104. package/dist/internal/transport-webhid.d.ts.map +1 -0
  105. package/dist/internal/transport-webhid.js +69 -0
  106. package/dist/internal/transport-webhid.js.map +1 -0
  107. package/dist/internal/u2f-framing.d.ts +2 -0
  108. package/dist/internal/u2f-framing.d.ts.map +1 -0
  109. package/dist/internal/u2f-framing.js +155 -0
  110. package/dist/internal/u2f-framing.js.map +1 -0
  111. package/dist/internal/utils.d.ts +2 -0
  112. package/dist/internal/utils.d.ts.map +1 -0
  113. package/dist/internal/utils.js +90 -0
  114. package/dist/internal/utils.js.map +1 -0
  115. package/dist/internal/version.d.ts +8 -0
  116. package/dist/internal/version.d.ts.map +1 -0
  117. package/dist/internal/version.js +9 -0
  118. package/dist/internal/version.js.map +1 -0
  119. package/dist/proto/gen/antiklepto_pb.d.ts +49 -0
  120. package/dist/proto/gen/antiklepto_pb.d.ts.map +1 -0
  121. package/dist/proto/gen/antiklepto_pb.js +22 -0
  122. package/dist/proto/gen/antiklepto_pb.js.map +1 -0
  123. package/dist/proto/gen/backup_commands_pb.d.ts +124 -0
  124. package/dist/proto/gen/backup_commands_pb.d.ts.map +1 -0
  125. package/dist/proto/gen/backup_commands_pb.js +42 -0
  126. package/dist/proto/gen/backup_commands_pb.js.map +1 -0
  127. package/dist/proto/gen/backup_pb.d.ts +150 -0
  128. package/dist/proto/gen/backup_pb.d.ts.map +1 -0
  129. package/dist/proto/gen/backup_pb.js +46 -0
  130. package/dist/proto/gen/backup_pb.js.map +1 -0
  131. package/dist/proto/gen/bitbox02_system_pb.d.ts +207 -0
  132. package/dist/proto/gen/bitbox02_system_pb.d.ts.map +1 -0
  133. package/dist/proto/gen/bitbox02_system_pb.js +80 -0
  134. package/dist/proto/gen/bitbox02_system_pb.js.map +1 -0
  135. package/dist/proto/gen/bluetooth_pb.d.ts +135 -0
  136. package/dist/proto/gen/bluetooth_pb.d.ts.map +1 -0
  137. package/dist/proto/gen/bluetooth_pb.js +42 -0
  138. package/dist/proto/gen/bluetooth_pb.js.map +1 -0
  139. package/dist/proto/gen/btc_pb.d.ts +1166 -0
  140. package/dist/proto/gen/btc_pb.d.ts.map +1 -0
  141. package/dist/proto/gen/btc_pb.js +442 -0
  142. package/dist/proto/gen/btc_pb.js.map +1 -0
  143. package/dist/proto/gen/cardano_pb.d.ts +504 -0
  144. package/dist/proto/gen/cardano_pb.d.ts.map +1 -0
  145. package/dist/proto/gen/cardano_pb.js +142 -0
  146. package/dist/proto/gen/cardano_pb.js.map +1 -0
  147. package/dist/proto/gen/common_pb.d.ts +129 -0
  148. package/dist/proto/gen/common_pb.d.ts.map +1 -0
  149. package/dist/proto/gen/common_pb.js +42 -0
  150. package/dist/proto/gen/common_pb.js.map +1 -0
  151. package/dist/proto/gen/eth_pb.d.ts +662 -0
  152. package/dist/proto/gen/eth_pb.d.ts.map +1 -0
  153. package/dist/proto/gen/eth_pb.js +221 -0
  154. package/dist/proto/gen/eth_pb.js.map +1 -0
  155. package/dist/proto/gen/hww_pb.d.ts +349 -0
  156. package/dist/proto/gen/hww_pb.d.ts.map +1 -0
  157. package/dist/proto/gen/hww_pb.js +38 -0
  158. package/dist/proto/gen/hww_pb.js.map +1 -0
  159. package/dist/proto/gen/keystore_pb.d.ts +108 -0
  160. package/dist/proto/gen/keystore_pb.d.ts.map +1 -0
  161. package/dist/proto/gen/keystore_pb.js +33 -0
  162. package/dist/proto/gen/keystore_pb.js.map +1 -0
  163. package/dist/proto/gen/mnemonic_pb.d.ts +48 -0
  164. package/dist/proto/gen/mnemonic_pb.d.ts.map +1 -0
  165. package/dist/proto/gen/mnemonic_pb.js +22 -0
  166. package/dist/proto/gen/mnemonic_pb.js.map +1 -0
  167. package/dist/proto/gen/perform_attestation_pb.d.ts +57 -0
  168. package/dist/proto/gen/perform_attestation_pb.d.ts.map +1 -0
  169. package/dist/proto/gen/perform_attestation_pb.js +17 -0
  170. package/dist/proto/gen/perform_attestation_pb.js.map +1 -0
  171. package/dist/proto/gen/system_pb.d.ts +38 -0
  172. package/dist/proto/gen/system_pb.d.ts.map +1 -0
  173. package/dist/proto/gen/system_pb.js +30 -0
  174. package/dist/proto/gen/system_pb.js.map +1 -0
  175. 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,2 @@
1
+ export declare const STREAMING_THRESHOLD = 6144;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -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,3 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ export const STREAMING_THRESHOLD = 6144;
3
+ //# sourceMappingURL=version.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hww.d.ts.map
@@ -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,4 @@
1
+ import type { Keypath } from '../index.js';
2
+ export declare const HARDENED = 2147483648;
3
+ export declare function parseKeypath(input: Keypath): number[];
4
+ //# sourceMappingURL=keypath.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-queue.d.ts.map
@@ -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,2 @@
1
+ export declare function defaultNoiseConfig(): NoiseConfig;
2
+ //# sourceMappingURL=noise-config.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=noise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../src/internal/noise.ts"],"names":[],"mappings":""}