@winbit32/wallet-kit 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -0
  3. package/dist/cosign/bytes.d.ts +10 -0
  4. package/dist/cosign/bytes.d.ts.map +1 -0
  5. package/dist/cosign/bytes.js +37 -0
  6. package/dist/cosign/bytes.js.map +1 -0
  7. package/dist/cosign/config.d.ts +58 -0
  8. package/dist/cosign/config.d.ts.map +1 -0
  9. package/dist/cosign/config.js +54 -0
  10. package/dist/cosign/config.js.map +1 -0
  11. package/dist/cosign/cosignSend.d.ts +104 -0
  12. package/dist/cosign/cosignSend.d.ts.map +1 -0
  13. package/dist/cosign/cosignSend.js +157 -0
  14. package/dist/cosign/cosignSend.js.map +1 -0
  15. package/dist/cosign/index.d.ts +33 -0
  16. package/dist/cosign/index.d.ts.map +1 -0
  17. package/dist/cosign/index.js +49 -0
  18. package/dist/cosign/index.js.map +1 -0
  19. package/dist/cosign/initiator.d.ts +121 -0
  20. package/dist/cosign/initiator.d.ts.map +1 -0
  21. package/dist/cosign/initiator.js +270 -0
  22. package/dist/cosign/initiator.js.map +1 -0
  23. package/dist/cosign/orchardFrost.d.ts +140 -0
  24. package/dist/cosign/orchardFrost.d.ts.map +1 -0
  25. package/dist/cosign/orchardFrost.js +227 -0
  26. package/dist/cosign/orchardFrost.js.map +1 -0
  27. package/dist/cosign/relay.d.ts +100 -0
  28. package/dist/cosign/relay.d.ts.map +1 -0
  29. package/dist/cosign/relay.js +359 -0
  30. package/dist/cosign/relay.js.map +1 -0
  31. package/dist/cosign/seed.d.ts +32 -0
  32. package/dist/cosign/seed.d.ts.map +1 -0
  33. package/dist/cosign/seed.js +69 -0
  34. package/dist/cosign/seed.js.map +1 -0
  35. package/dist/cosign/transports.d.ts +127 -0
  36. package/dist/cosign/transports.d.ts.map +1 -0
  37. package/dist/cosign/transports.js +426 -0
  38. package/dist/cosign/transports.js.map +1 -0
  39. package/dist/cosign/vaultShare.d.ts +65 -0
  40. package/dist/cosign/vaultShare.d.ts.map +1 -0
  41. package/dist/cosign/vaultShare.js +157 -0
  42. package/dist/cosign/vaultShare.js.map +1 -0
  43. package/dist/index.d.ts +16 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +43 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/monero/types.d.ts +75 -0
  48. package/dist/monero/types.d.ts.map +1 -0
  49. package/dist/monero/types.js +9 -0
  50. package/dist/monero/types.js.map +1 -0
  51. package/dist/scanner/baseUrl.d.ts +24 -0
  52. package/dist/scanner/baseUrl.d.ts.map +1 -0
  53. package/dist/scanner/baseUrl.js +35 -0
  54. package/dist/scanner/baseUrl.js.map +1 -0
  55. package/dist/scanner/moneroScannerClient.d.ts +97 -0
  56. package/dist/scanner/moneroScannerClient.d.ts.map +1 -0
  57. package/dist/scanner/moneroScannerClient.js +125 -0
  58. package/dist/scanner/moneroScannerClient.js.map +1 -0
  59. package/dist/scanner/zcashScannerClient.d.ts +116 -0
  60. package/dist/scanner/zcashScannerClient.d.ts.map +1 -0
  61. package/dist/scanner/zcashScannerClient.js +150 -0
  62. package/dist/scanner/zcashScannerClient.js.map +1 -0
  63. package/package.json +37 -0
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview WB32COSIGN relay client + Orchard FROST initiator ceremony.
4
+ *
5
+ * A framework-agnostic port of the initiator half of WINBIT32's
6
+ * `cosignerRelay`, scoped to the `frost-orchard` protocol. Wire format, QR
7
+ * payload, AES-256-GCM envelopes and the two-round message protocol are
8
+ * byte-compatible with WINBIT32, so the existing `cosign.exe` cosigner
9
+ * interoperates unchanged. (Canonical home — ported from Secresea's
10
+ * `services/cosign/relay.ts`.)
11
+ *
12
+ * Reuse-oriented: the WASM engine is injected (no module-global), encryption
13
+ * uses standard Web Crypto, and message delivery goes through any
14
+ * {@link CosignTransport}. The DKLS / Schnorr / Sapling protocols and the
15
+ * trusted-dealer DKG regen path are intentionally omitted — Secresea
16
+ * co-signs an *existing* Orchard vault share, never creates one.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.runOrchardInitiatorAction = exports.waitForCosignerJoin = exports.endCosignSession = exports.createCosignSession = exports.parseCosignQR = exports.generateCosignQR = exports.OrchardShareMismatchError = void 0;
20
+ const bytes_1 = require("./bytes");
21
+ const orchardFrost_1 = require("./orchardFrost");
22
+ const QR_PREFIX = 'WB32COSIGN';
23
+ const PROTOCOL_VERSION = 1;
24
+ const ROLE_INIT = 'init';
25
+ const ROLE_COSIGN = 'cosign';
26
+ const SESSION_TIMEOUT_MS = 180000;
27
+ const POLL_IDLE_MS = 1500;
28
+ const POLL_ACTIVE_MS = 500;
29
+ const MSG_TAG_JSON = 0x00;
30
+ const MSG_TAG_MPC_BINARY = 0x01;
31
+ /** Thrown when the cosigner asks to (re)derive keys — Secresea won't do that. */
32
+ class OrchardShareMismatchError extends Error {
33
+ constructor() {
34
+ super('The cosigner does not hold a matching Orchard FROST share for this vault. ' +
35
+ 'Load the correct .wult share on both devices — Secresea will not generate new keys.');
36
+ this.code = 'ORCHARD_SHARE_MISMATCH';
37
+ }
38
+ }
39
+ exports.OrchardShareMismatchError = OrchardShareMismatchError;
40
+ // ── Web Crypto helpers ───────────────────────────────────────────────
41
+ const getCrypto = () => {
42
+ const c = globalThis.crypto;
43
+ if (!c?.subtle)
44
+ throw new Error('Web Crypto (crypto.subtle) is required for cosign relay encryption.');
45
+ return c;
46
+ };
47
+ const importEncKey = (hexKey) => getCrypto().subtle.importKey('raw', (0, bytes_1.hexToBytes)(hexKey), 'AES-GCM', false, ['encrypt', 'decrypt']);
48
+ const encryptEnvelopeBytes = async (key, plainBytes) => {
49
+ const iv = getCrypto().getRandomValues(new Uint8Array(12));
50
+ const cipherBuf = await getCrypto().subtle.encrypt({ name: 'AES-GCM', iv }, key, plainBytes);
51
+ const combined = new Uint8Array(iv.length + cipherBuf.byteLength);
52
+ combined.set(iv);
53
+ combined.set(new Uint8Array(cipherBuf), iv.length);
54
+ return combined;
55
+ };
56
+ const decryptEnvelopeBytes = async (key, combined) => {
57
+ const iv = combined.slice(0, 12);
58
+ const ciphertext = combined.slice(12);
59
+ const plainBuf = await getCrypto().subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);
60
+ return new Uint8Array(plainBuf);
61
+ };
62
+ /** v1 (legacy) string envelope: base64( iv || AES-GCM(utf8) ). */
63
+ const decryptEnvelopeString = async (key, cipherB64) => {
64
+ const combined = (0, bytes_1.fromBase64)(cipherB64);
65
+ const plain = await decryptEnvelopeBytes(key, combined);
66
+ return new TextDecoder().decode(plain);
67
+ };
68
+ /**
69
+ * Push bytes through a (De)CompressionStream and collect the output. Uses the
70
+ * stream's reader/writer directly rather than `Blob.stream()` so it works in
71
+ * any host with Web Streams (browser, Node, jsdom) — not just DOM environments.
72
+ */
73
+ const streamThrough = async (input, transform) => {
74
+ const writer = transform.writable.getWriter();
75
+ void writer.write(input).then(() => writer.close()).catch(() => { });
76
+ const reader = transform.readable.getReader();
77
+ const chunks = [];
78
+ let total = 0;
79
+ for (;;) {
80
+ const { done, value } = await reader.read();
81
+ if (done)
82
+ break;
83
+ chunks.push(value);
84
+ total += value.length;
85
+ }
86
+ const out = new Uint8Array(total);
87
+ let offset = 0;
88
+ for (const c of chunks) {
89
+ out.set(c, offset);
90
+ offset += c.length;
91
+ }
92
+ return out;
93
+ };
94
+ const deflateBytes = (input) => streamThrough(input, new CompressionStream('deflate-raw'));
95
+ const inflateBytes = (input) => streamThrough(input, new DecompressionStream('deflate-raw'));
96
+ const encodeControlMsg = (msg) => {
97
+ if (msg.type === 'mpc') {
98
+ const body = (0, bytes_1.fromBase64)(msg.body);
99
+ const out = new Uint8Array(1 + body.length);
100
+ out[0] = MSG_TAG_MPC_BINARY;
101
+ out.set(body, 1);
102
+ return out;
103
+ }
104
+ const json = new TextEncoder().encode(JSON.stringify(msg));
105
+ const out = new Uint8Array(1 + json.length);
106
+ out[0] = MSG_TAG_JSON;
107
+ out.set(json, 1);
108
+ return out;
109
+ };
110
+ const decodeControlMsg = (bytes) => {
111
+ if (bytes[0] === MSG_TAG_MPC_BINARY)
112
+ return { type: 'mpc', body: (0, bytes_1.toBase64)(bytes.slice(1)) };
113
+ return JSON.parse(new TextDecoder().decode(bytes.slice(1)));
114
+ };
115
+ const transportSend = async (transport, fromRole, toRole, key, msg) => {
116
+ const raw = encodeControlMsg(msg);
117
+ const compressed = await deflateBytes(raw);
118
+ const encrypted = await encryptEnvelopeBytes(key, compressed);
119
+ await transport.send(fromRole, toRole, (0, bytes_1.toBase64)(encrypted));
120
+ };
121
+ const transportReceive = async (transport, myRole, key) => {
122
+ const messages = await transport.receive(myRole);
123
+ const results = [];
124
+ for (const encoded of messages) {
125
+ try {
126
+ const combined = (0, bytes_1.fromBase64)(encoded);
127
+ const decrypted = await decryptEnvelopeBytes(key, combined);
128
+ const decompressed = await inflateBytes(decrypted);
129
+ results.push(decodeControlMsg(decompressed));
130
+ }
131
+ catch (v2Err) {
132
+ try {
133
+ results.push(JSON.parse(await decryptEnvelopeString(key, encoded)));
134
+ }
135
+ catch (v1Err) {
136
+ console.warn(`[cosign/relay] dropped undecodable message for role=${myRole}`, 'v2:', v2Err?.message, 'v1:', v1Err?.message);
137
+ }
138
+ }
139
+ }
140
+ return results;
141
+ };
142
+ const checkAborted = (signal) => {
143
+ if (signal?.aborted)
144
+ throw new Error('Cosign session cancelled');
145
+ };
146
+ const generateSetupId = () => (0, bytes_1.bytesToHex)(getCrypto().getRandomValues(new Uint8Array(8)));
147
+ // ── QR payload + session ─────────────────────────────────────────────
148
+ const generateCosignQR = (params) => {
149
+ const r = params.relayUrl ? `:${params.relayUrl}` : '';
150
+ return `${QR_PREFIX}:${PROTOCOL_VERSION}:${params.sessionId}:${params.encKeyHex}${r}`;
151
+ };
152
+ exports.generateCosignQR = generateCosignQR;
153
+ const parseCosignQR = (qr) => {
154
+ if (!qr.startsWith(QR_PREFIX + ':'))
155
+ return null;
156
+ const parts = qr.split(':');
157
+ if (parts.length < 4)
158
+ return null;
159
+ if (parseInt(parts[1], 10) !== PROTOCOL_VERSION)
160
+ return null;
161
+ return {
162
+ sessionId: parts[2],
163
+ encKeyHex: parts[3],
164
+ relayUrl: parts.length >= 5 ? parts.slice(4).join(':') : '',
165
+ };
166
+ };
167
+ exports.parseCosignQR = parseCosignQR;
168
+ /** Create a fresh session (random id + AES-256 key) and its QR payload. */
169
+ const createCosignSession = (relayUrl) => {
170
+ const sessionId = getCrypto().randomUUID();
171
+ const encKeyHex = (0, bytes_1.bytesToHex)(getCrypto().getRandomValues(new Uint8Array(32)));
172
+ const params = { sessionId, encKeyHex, relayUrl: relayUrl || '' };
173
+ return { params, qrPayload: (0, exports.generateCosignQR)(params) };
174
+ };
175
+ exports.createCosignSession = createCosignSession;
176
+ /** Tell the cosigner the session is finished so it stops polling. */
177
+ const endCosignSession = async (encKeyHex, transport) => {
178
+ try {
179
+ const key = await importEncKey(encKeyHex);
180
+ await transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, { type: 'done' });
181
+ }
182
+ catch (err) {
183
+ console.warn('[cosign/relay] endCosignSession failed (non-fatal):', err?.message);
184
+ }
185
+ };
186
+ exports.endCosignSession = endCosignSession;
187
+ /** Block until a valid cosigner scans the QR and joins; returns its partyId. */
188
+ const waitForCosignerJoin = async (p) => {
189
+ const key = await importEncKey(p.encKeyHex);
190
+ const start = Date.now();
191
+ p.callbacks?.onProgress?.('Waiting for cosigner to scan QR...');
192
+ for (;;) {
193
+ checkAborted(p.callbacks?.signal);
194
+ if (Date.now() - start > SESSION_TIMEOUT_MS)
195
+ throw new Error('Timed out waiting for cosigner');
196
+ const msgs = await transportReceive(p.transport, ROLE_INIT, key);
197
+ for (const msg of msgs) {
198
+ if (msg.type !== 'join')
199
+ continue;
200
+ if (!p.validSignerIds.includes(msg.partyId)) {
201
+ await transportSend(p.transport, ROLE_INIT, ROLE_COSIGN, key, {
202
+ type: 'error',
203
+ message: 'Party ID not recognised for this vault',
204
+ });
205
+ continue;
206
+ }
207
+ p.callbacks?.onCosignerJoined?.(msg.partyId);
208
+ return msg.partyId;
209
+ }
210
+ await new Promise((r) => setTimeout(r, POLL_IDLE_MS));
211
+ }
212
+ };
213
+ exports.waitForCosignerJoin = waitForCosignerJoin;
214
+ /**
215
+ * Run the two-round FROST-Orchard ceremony for a single Orchard action and
216
+ * return its aggregated 64-byte signature. Mirrors WINBIT32's
217
+ * `runInitiatorFrostOrchard` (minus the DKG regen branch).
218
+ */
219
+ const runOrchardInitiatorAction = async (p) => {
220
+ const { wasm, transport, orchardKeyShare, frostOrchardData, display, callbacks } = p;
221
+ const key = await importEncKey(p.encKeyHex);
222
+ if (!/^[0-9a-fA-F]{64}$/.test(frostOrchardData.randomizer)) {
223
+ throw new Error('Orchard FROST: missing/invalid per-action alpha randomiser (expected 64 hex chars).');
224
+ }
225
+ const setupId = generateSetupId();
226
+ callbacks?.onProgress?.('Sending Orchard FROST setup to cosigner...');
227
+ await transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, {
228
+ type: 'setup',
229
+ protocol: 'frost-orchard',
230
+ setupBytes: '',
231
+ display,
232
+ initiatorPartyId: p.myPartyId,
233
+ setupId,
234
+ frostOrchardData,
235
+ });
236
+ // Buffer the *entire* received batch before scanning for a match, so a
237
+ // round2 that arrives in the same poll as round1 is never dropped (the
238
+ // upstream impl returned on first hit, discarding the rest of the batch).
239
+ const buffered = [];
240
+ const scanBuffered = (predicate) => {
241
+ for (let i = 0; i < buffered.length; i++) {
242
+ const hit = predicate(buffered[i]);
243
+ if (hit !== undefined) {
244
+ buffered.splice(i, 1);
245
+ return hit;
246
+ }
247
+ }
248
+ return undefined;
249
+ };
250
+ const pollFor = async (predicate, label) => {
251
+ const early = scanBuffered(predicate);
252
+ if (early !== undefined)
253
+ return early;
254
+ const t0 = Date.now();
255
+ for (;;) {
256
+ checkAborted(callbacks?.signal);
257
+ if (Date.now() - t0 > SESSION_TIMEOUT_MS)
258
+ throw new Error(`Timed out waiting for ${label}`);
259
+ const msgs = await transportReceive(transport, ROLE_INIT, key);
260
+ for (const msg of msgs) {
261
+ if (msg.type === 'error')
262
+ throw new Error(`Cosigner: ${msg.message}`);
263
+ buffered.push(msg);
264
+ }
265
+ const hit = scanBuffered(predicate);
266
+ if (hit !== undefined)
267
+ return hit;
268
+ await new Promise((r) => setTimeout(r, POLL_ACTIVE_MS));
269
+ }
270
+ };
271
+ // Round 1 — commit nonces, exchange commitments.
272
+ callbacks?.onProgress?.('Orchard FROST Round 1: committing nonces...');
273
+ const myCommit = (0, orchardFrost_1.orchardCommitNonces)(wasm, orchardKeyShare.secretShare);
274
+ const r1Msg = {
275
+ type: 'frost-round1', id: orchardKeyShare.id, commitments: myCommit.commitments, setupId,
276
+ };
277
+ await transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, r1Msg);
278
+ const r1Resend = resendLoop(() => transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, r1Msg), callbacks?.signal);
279
+ let round1;
280
+ try {
281
+ round1 = await pollFor((m) => {
282
+ if (m.type === 'frost-round1') {
283
+ const r1 = m;
284
+ if (r1.setupId && r1.setupId !== setupId)
285
+ return undefined;
286
+ return { id: r1.id, commitments: r1.commitments };
287
+ }
288
+ if (m.type === 'need-orchard-dkg')
289
+ throw new OrchardShareMismatchError();
290
+ return undefined;
291
+ }, 'cosigner nonce commitments');
292
+ }
293
+ finally {
294
+ r1Resend.stop();
295
+ }
296
+ // Round 2 — sign with pre-committed nonces.
297
+ callbacks?.onProgress?.('Orchard FROST Round 2: signing...');
298
+ const allCommitments = {
299
+ [orchardKeyShare.id]: myCommit.commitments,
300
+ [round1.id]: round1.commitments,
301
+ };
302
+ const allCommitmentsJson = JSON.stringify(allCommitments);
303
+ const mySigShare = (0, orchardFrost_1.orchardSignWithNonces)(wasm, orchardKeyShare.id, orchardKeyShare.secretShare, orchardKeyShare.publicKey, frostOrchardData.pubKeyPackage.groupPublic, myCommit.noncesOpaque, allCommitmentsJson, frostOrchardData.sighash, frostOrchardData.randomizer);
304
+ const r2Msg = { type: 'frost-round2', id: orchardKeyShare.id, sigShare: mySigShare, setupId };
305
+ await transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, r2Msg);
306
+ const r2Resend = resendLoop(() => transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, r2Msg), callbacks?.signal);
307
+ const mySignerId = orchardKeyShare.id;
308
+ let round2;
309
+ try {
310
+ round2 = await pollFor((m) => {
311
+ if (m.type !== 'frost-round2')
312
+ return undefined;
313
+ const r2 = m;
314
+ if (!r2.id || r2.id === mySignerId)
315
+ return undefined;
316
+ if (r2.setupId && r2.setupId !== setupId)
317
+ return undefined;
318
+ return { sigShare: r2.sigShare };
319
+ }, 'cosigner signature share');
320
+ }
321
+ finally {
322
+ r2Resend.stop();
323
+ }
324
+ // Aggregate.
325
+ callbacks?.onProgress?.('Aggregating Orchard FROST signature...');
326
+ const sigShares = {
327
+ [orchardKeyShare.id]: mySigShare,
328
+ [round1.id]: round2.sigShare,
329
+ };
330
+ const aggregate = JSON.parse((0, orchardFrost_1.orchardAggregate)(wasm, allCommitmentsJson, frostOrchardData.sighash, JSON.stringify(sigShares), JSON.stringify(frostOrchardData.pubKeyPackage.signerPubkeys), frostOrchardData.pubKeyPackage.groupPublic, frostOrchardData.randomizer));
331
+ const signature = aggregate.signature;
332
+ callbacks?.onProgress?.('Orchard FROST signature complete');
333
+ await transportSend(transport, ROLE_INIT, ROLE_COSIGN, key, p.keepAlive ? { type: 'continue' } : { type: 'done' });
334
+ return { signature, rawSignatureBytes: (0, bytes_1.hexToBytes)(signature) };
335
+ };
336
+ exports.runOrchardInitiatorAction = runOrchardInitiatorAction;
337
+ /**
338
+ * Periodically re-send a message (the relay/cosigner may miss the first
339
+ * delivery). Stops automatically once `.stop()` is called or the signal aborts.
340
+ */
341
+ const resendLoop = (send, signal) => {
342
+ const state = { stopped: false };
343
+ const DELAYS_MS = [2000, 4000, 8000, 15000, 25000, 40000, 60000];
344
+ void (async () => {
345
+ for (const delay of DELAYS_MS) {
346
+ await new Promise((r) => setTimeout(r, delay));
347
+ if (state.stopped || signal?.aborted)
348
+ return;
349
+ try {
350
+ await send();
351
+ }
352
+ catch (e) {
353
+ console.warn('[cosign/relay] resend failed:', e?.message);
354
+ }
355
+ }
356
+ })();
357
+ return { stop: () => { state.stopped = true; } };
358
+ };
359
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/cosign/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Deterministic Zcash seed derivation from a Vultisig vault's
3
+ * identity material (HKDF-SHA256). Byte-compatible with WINBIT32's
4
+ * `crossChainDerivation.js` so the same vault lands on the same seed — and
5
+ * therefore the same ZIP-32 seed fingerprint — in both apps.
6
+ *
7
+ * For Orchard FROST co-signing the spend authority is the threshold key
8
+ * (group_public = `ak`), NOT this seed. The derived seed is used only to
9
+ * produce a stable `seedFingerprintHex` for the PCZT's `zip32_derivation`
10
+ * metadata (see `tools/orchard-scanner/src/pczt_builder.rs`, which writes it
11
+ * into the proprietary field and never derives keys from it). Deriving it the
12
+ * same way as WINBIT32 keeps wallet identity consistent across the two apps.
13
+ *
14
+ * Pure Web Crypto, no host/React coupling — part of the reusable module.
15
+ */
16
+ /**
17
+ * HKDF-SHA256 expand arbitrary input key material into a 64-byte seed.
18
+ *
19
+ * @param ikm Input key material (e.g. the vault chain code bytes).
20
+ * @param salt Domain-specific salt.
21
+ * @param info Context binding.
22
+ */
23
+ export declare const deriveCrossChainSeed: (ikm: Uint8Array, salt: Uint8Array, info: Uint8Array) => Promise<Uint8Array>;
24
+ /**
25
+ * Derive a 64-byte Zcash seed from a Vultisig vault's identity
26
+ * (BIP-32 chain code + ECDSA public key). Matches WINBIT32 exactly.
27
+ *
28
+ * @param hexChainCode Vault BIP-32 chain code (hex, ≥ 32 bytes).
29
+ * @param publicKeyHex Vault ECDSA public key (hex), used for domain separation.
30
+ */
31
+ export declare const deriveZcashSeedFromVaultIdentity: (hexChainCode: string, publicKeyHex: string) => Promise<Uint8Array>;
32
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/cosign/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAC3B,UAAU,QACT,UAAU,QACV,UAAU,KACd,QAAQ,UAAU,CAUpB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,iBAC9B,MAAM,gBACN,MAAM,KAClB,QAAQ,UAAU,CAiBpB,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Deterministic Zcash seed derivation from a Vultisig vault's
4
+ * identity material (HKDF-SHA256). Byte-compatible with WINBIT32's
5
+ * `crossChainDerivation.js` so the same vault lands on the same seed — and
6
+ * therefore the same ZIP-32 seed fingerprint — in both apps.
7
+ *
8
+ * For Orchard FROST co-signing the spend authority is the threshold key
9
+ * (group_public = `ak`), NOT this seed. The derived seed is used only to
10
+ * produce a stable `seedFingerprintHex` for the PCZT's `zip32_derivation`
11
+ * metadata (see `tools/orchard-scanner/src/pczt_builder.rs`, which writes it
12
+ * into the proprietary field and never derives keys from it). Deriving it the
13
+ * same way as WINBIT32 keeps wallet identity consistent across the two apps.
14
+ *
15
+ * Pure Web Crypto, no host/React coupling — part of the reusable module.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.deriveZcashSeedFromVaultIdentity = exports.deriveCrossChainSeed = void 0;
19
+ const bytes_1 = require("./bytes");
20
+ // Domain-separation constants — MUST match WINBIT32 crossChainDerivation.js.
21
+ const ZCASH_VAULT_SALT = 'zcash-shielded-seed:v3:vault-identity';
22
+ const ZCASH_VAULT_INFO_PREFIX = 'winbit32-zcash-orchard:';
23
+ const DERIVED_SEED_BITS = 512; // 64 bytes — same length as a BIP-39 seed.
24
+ const getSubtle = () => {
25
+ const c = (typeof globalThis !== 'undefined' ? globalThis.crypto : undefined);
26
+ if (!c?.subtle) {
27
+ throw new Error('Web Crypto (crypto.subtle) is required for vault seed derivation (HTTPS context).');
28
+ }
29
+ return c.subtle;
30
+ };
31
+ /**
32
+ * HKDF-SHA256 expand arbitrary input key material into a 64-byte seed.
33
+ *
34
+ * @param ikm Input key material (e.g. the vault chain code bytes).
35
+ * @param salt Domain-specific salt.
36
+ * @param info Context binding.
37
+ */
38
+ const deriveCrossChainSeed = async (ikm, salt, info) => {
39
+ if (!ikm || ikm.length === 0)
40
+ throw new Error('deriveCrossChainSeed: IKM must be non-empty');
41
+ const subtle = getSubtle();
42
+ const keyMaterial = await subtle.importKey('raw', ikm, { name: 'HKDF' }, false, ['deriveBits']);
43
+ const derived = await subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt, info }, keyMaterial, DERIVED_SEED_BITS);
44
+ return new Uint8Array(derived);
45
+ };
46
+ exports.deriveCrossChainSeed = deriveCrossChainSeed;
47
+ /**
48
+ * Derive a 64-byte Zcash seed from a Vultisig vault's identity
49
+ * (BIP-32 chain code + ECDSA public key). Matches WINBIT32 exactly.
50
+ *
51
+ * @param hexChainCode Vault BIP-32 chain code (hex, ≥ 32 bytes).
52
+ * @param publicKeyHex Vault ECDSA public key (hex), used for domain separation.
53
+ */
54
+ const deriveZcashSeedFromVaultIdentity = async (hexChainCode, publicKeyHex) => {
55
+ if (!hexChainCode || typeof hexChainCode !== 'string') {
56
+ throw new Error('Vault chain code required for Zcash seed derivation.');
57
+ }
58
+ if (!publicKeyHex || typeof publicKeyHex !== 'string') {
59
+ throw new Error('Vault public key required for Zcash seed derivation.');
60
+ }
61
+ const ikm = (0, bytes_1.hexToBytes)(hexChainCode.replace(/^0x/i, ''));
62
+ if (ikm.length < 32) {
63
+ throw new Error(`Vault chain code too short (${ikm.length} bytes, need ≥ 32).`);
64
+ }
65
+ const enc = new TextEncoder();
66
+ return (0, exports.deriveCrossChainSeed)(ikm, enc.encode(ZCASH_VAULT_SALT), enc.encode(ZCASH_VAULT_INFO_PREFIX + publicKeyHex));
67
+ };
68
+ exports.deriveZcashSeedFromVaultIdentity = deriveZcashSeedFromVaultIdentity;
69
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/cosign/seed.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,mCAAqC;AAErC,6EAA6E;AAC7E,MAAM,gBAAgB,GAAG,uCAAuC,CAAC;AACjE,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAC1D,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,2CAA2C;AAE1E,MAAM,SAAS,GAAG,GAAiB,EAAE;IACpC,MAAM,CAAC,GAAG,CAAC,OAAO,UAAU,KAAK,WAAW,CAAC,CAAC,CAAE,UAAkC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;KACrG;IACD,OAAO,CAAC,CAAC,MAAM,CAAC;AACjB,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,oBAAoB,GAAG,KAAK,EACxC,GAAe,EACf,IAAgB,EAChB,IAAgB,EACM,EAAE;IACxB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CACtC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAC7C,WAAW,EACX,iBAAiB,CACjB,CAAC;IACF,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC;AAdW,QAAA,oBAAoB,wBAc/B;AAEF;;;;;;GAMG;AACI,MAAM,gCAAgC,GAAG,KAAK,EACpD,YAAoB,EACpB,YAAoB,EACE,EAAE;IACxB,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;QACtD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;KACxE;IACD,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;QACtD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;KACxE;IACD,MAAM,GAAG,GAAG,IAAA,kBAAU,EAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,MAAM,qBAAqB,CAAC,CAAC;KAChF;IACD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,OAAO,IAAA,4BAAoB,EAC1B,GAAG,EACH,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAC5B,GAAG,CAAC,MAAM,CAAC,uBAAuB,GAAG,YAAY,CAAC,CAClD,CAAC;AACH,CAAC,CAAC;AApBW,QAAA,gCAAgC,oCAoB3C"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @fileoverview Pluggable transport layer for the WB32COSIGN MPC relay.
3
+ *
4
+ * A framework-agnostic port of WINBIT32's `cosignTransports`, trimmed to the
5
+ * transports an online initiator needs and with `fetch` injected (rather
6
+ * than a global) so the module stays host-portable and testable. Works in
7
+ * browsers and Node ≥ 18 (BroadcastChannel, Web Streams and WebCrypto are
8
+ * global there; WebRTC is browser-only and skipped automatically).
9
+ *
10
+ * Each transport moves an already-encrypted opaque body between two roles
11
+ * (`init` / `cosign`); the relay/MPC layer above is responsible for crypto.
12
+ *
13
+ * Included:
14
+ * - BroadcastChannelTransport — same-origin / same-device (zero config).
15
+ * - HttpRelayTransport — cross-device via any WB32COSIGN relay
16
+ * (Secresea's API mounts one at /api/cosign).
17
+ * - WebRTCTransport — peer-to-peer data channel, signalled over the
18
+ * relay; low-latency once the P2P link is up.
19
+ * - MultiTransport — fan-out send, merge receive.
20
+ *
21
+ * Deferred (airgap copy-paste only; not required online): ManualTransport.
22
+ */
23
+ export interface CosignTransport {
24
+ readonly name: string;
25
+ send(from: string, to: string, encryptedBody: string): Promise<void>;
26
+ receive(myRole: string): Promise<string[]>;
27
+ close(): void;
28
+ }
29
+ export declare class BroadcastChannelTransport implements CosignTransport {
30
+ readonly name = "BroadcastChannel (local)";
31
+ private channel;
32
+ private inbox;
33
+ constructor(sessionId: string);
34
+ send(from: string, to: string, encryptedBody: string): Promise<void>;
35
+ receive(myRole: string): Promise<string[]>;
36
+ close(): void;
37
+ }
38
+ export declare class HttpRelayTransport implements CosignTransport {
39
+ readonly name: string;
40
+ private relayUrl;
41
+ private sessionId;
42
+ private fetchImpl;
43
+ private started;
44
+ private backoff;
45
+ constructor(relayUrl: string, sessionId: string, fetchImpl: typeof fetch);
46
+ private ensureSession;
47
+ send(from: string, to: string, encryptedBody: string): Promise<void>;
48
+ receive(myRole: string): Promise<string[]>;
49
+ close(): void;
50
+ }
51
+ export declare class MultiTransport implements CosignTransport {
52
+ readonly name: string;
53
+ private transports;
54
+ constructor(transports: CosignTransport[]);
55
+ send(from: string, to: string, encryptedBody: string): Promise<void>;
56
+ receive(myRole: string): Promise<string[]>;
57
+ close(): void;
58
+ }
59
+ export type CosignRole = 'init' | 'cosign';
60
+ /**
61
+ * Direct peer-to-peer transport over an `RTCDataChannel`. The offer/answer/ICE
62
+ * handshake is signalled through the same WB32COSIGN relay (distinct
63
+ * `signal-init`/`signal-cosign` roles) so no extra server is needed. `send()`
64
+ * is fail-fast — it silently drops while the channel isn't open — so this is
65
+ * safe to combine with {@link HttpRelayTransport} inside a {@link MultiTransport}:
66
+ * the relay is the always-on fabric, WebRTC opportunistically short-circuits it.
67
+ *
68
+ * Ported from WINBIT32's transport with `fetch` injected (Secresea keeps the
69
+ * module host-portable). Only meaningful in a browser with `RTCPeerConnection`;
70
+ * callers must guard creation in non-DOM environments.
71
+ */
72
+ export declare class WebRTCTransport implements CosignTransport {
73
+ readonly name = "WebRTC (peer-to-peer)";
74
+ private pc;
75
+ private dc;
76
+ private inbox;
77
+ private relayUrl;
78
+ private sessionId;
79
+ private fetchImpl;
80
+ private myRole;
81
+ private peerRole;
82
+ private closed;
83
+ private signalPollTimer;
84
+ private iceCandidateQueue;
85
+ private remoteDescSet;
86
+ private signalBackoff;
87
+ private onOpen?;
88
+ constructor(sessionId: string, relayUrl: string, fetchImpl: typeof fetch, myRole: CosignRole, opts?: {
89
+ onOpen?: () => void;
90
+ });
91
+ private setupDataChannel;
92
+ private startOffer;
93
+ private postSignal;
94
+ private pollSignals;
95
+ private fetchSignals;
96
+ private handleSignal;
97
+ /** True once the data channel has reached 'open'. */
98
+ isOpen(): boolean;
99
+ send(from: string, to: string, encryptedBody: string): Promise<void>;
100
+ receive(myRole: string): Promise<string[]>;
101
+ close(): void;
102
+ }
103
+ /** WebRTC is only usable where the browser exposes `RTCPeerConnection`. */
104
+ export declare const isWebRtcSupported: () => boolean;
105
+ export interface DefaultTransportOptions {
106
+ sessionId: string;
107
+ /** When set, adds an HTTP relay leg (and enables WebRTC signalling). */
108
+ relayBaseUrl?: string;
109
+ /** Required when `relayBaseUrl` is set. */
110
+ fetchImpl?: typeof fetch;
111
+ /**
112
+ * This party's role. When provided (and `RTCPeerConnection` exists) a
113
+ * peer-to-peer WebRTC leg is added. Secresea is always the `init`iator.
114
+ */
115
+ myRole?: CosignRole;
116
+ /** Fires when the WebRTC data channel opens (UI can drop "relay only" hints). */
117
+ onWebRtcOpen?: () => void;
118
+ }
119
+ /**
120
+ * Build the standard transport stack: BroadcastChannel (same device), an
121
+ * opportunistic WebRTC peer-to-peer leg (low latency once open) and an HTTP
122
+ * relay leg (always-on fallback) when a relay URL is supplied. BroadcastChannel
123
+ * short-circuits when both parties share an origin; WebRTC is skipped silently
124
+ * where `RTCPeerConnection` is unavailable (SSR/tests) or `myRole` is unknown.
125
+ */
126
+ export declare const createDefaultTransports: (opts: DefaultTransportOptions) => CosignTransport;
127
+ //# sourceMappingURL=transports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../../src/cosign/transports.ts"],"names":[],"mappings":"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"}