walletpair-sdk 1.0.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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +415 -0
  3. package/dist/ble/framing.d.ts +23 -0
  4. package/dist/ble/framing.d.ts.map +1 -0
  5. package/dist/ble/framing.js +83 -0
  6. package/dist/ble/framing.js.map +1 -0
  7. package/dist/ble/index.d.ts +9 -0
  8. package/dist/ble/index.d.ts.map +1 -0
  9. package/dist/ble/index.js +9 -0
  10. package/dist/ble/index.js.map +1 -0
  11. package/dist/ble/web-ble-transport.d.ts +29 -0
  12. package/dist/ble/web-ble-transport.d.ts.map +1 -0
  13. package/dist/ble/web-ble-transport.js +93 -0
  14. package/dist/ble/web-ble-transport.js.map +1 -0
  15. package/dist/crypto.d.ts +102 -0
  16. package/dist/crypto.d.ts.map +1 -0
  17. package/dist/crypto.js +279 -0
  18. package/dist/crypto.js.map +1 -0
  19. package/dist/dapp-session.d.ts +106 -0
  20. package/dist/dapp-session.d.ts.map +1 -0
  21. package/dist/dapp-session.js +918 -0
  22. package/dist/dapp-session.js.map +1 -0
  23. package/dist/emitter.d.ts +16 -0
  24. package/dist/emitter.d.ts.map +1 -0
  25. package/dist/emitter.js +41 -0
  26. package/dist/emitter.js.map +1 -0
  27. package/dist/evm/eip1193.d.ts +83 -0
  28. package/dist/evm/eip1193.d.ts.map +1 -0
  29. package/dist/evm/eip1193.js +270 -0
  30. package/dist/evm/eip1193.js.map +1 -0
  31. package/dist/evm/index.d.ts +8 -0
  32. package/dist/evm/index.d.ts.map +1 -0
  33. package/dist/evm/index.js +8 -0
  34. package/dist/evm/index.js.map +1 -0
  35. package/dist/evm/wagmi.d.ts +118 -0
  36. package/dist/evm/wagmi.d.ts.map +1 -0
  37. package/dist/evm/wagmi.js +205 -0
  38. package/dist/evm/wagmi.js.map +1 -0
  39. package/dist/index.d.ts +22 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +24 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types.d.ts +225 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +31 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/wallet-session.d.ts +107 -0
  48. package/dist/wallet-session.d.ts.map +1 -0
  49. package/dist/wallet-session.js +794 -0
  50. package/dist/wallet-session.js.map +1 -0
  51. package/dist/ws-transport.d.ts +29 -0
  52. package/dist/ws-transport.d.ts.map +1 -0
  53. package/dist/ws-transport.js +79 -0
  54. package/dist/ws-transport.js.map +1 -0
  55. package/package.json +55 -0
  56. package/src/__tests__/adversarial/crypto-attacks.test.ts +557 -0
  57. package/src/__tests__/adversarial/malicious-dapp.test.ts +505 -0
  58. package/src/__tests__/adversarial/malicious-relay.test.ts +528 -0
  59. package/src/__tests__/adversarial/malicious-wallet.test.ts +467 -0
  60. package/src/__tests__/spec-compliance/canonical-json.test.ts +227 -0
  61. package/src/__tests__/spec-compliance/crypto-vectors.test.ts +321 -0
  62. package/src/__tests__/spec-compliance/message-format.test.ts +356 -0
  63. package/src/__tests__/spec-compliance/sequence-numbers.test.ts +300 -0
  64. package/src/__tests__/spec-compliance/state-machine.test.ts +364 -0
  65. package/src/ble/framing.test.ts +196 -0
  66. package/src/ble/framing.ts +100 -0
  67. package/src/ble/index.ts +18 -0
  68. package/src/ble/web-ble-transport.test.ts +192 -0
  69. package/src/ble/web-ble-transport.ts +116 -0
  70. package/src/ble/web-bluetooth.d.ts +47 -0
  71. package/src/canonical-json.test.ts +612 -0
  72. package/src/crypto-directional.test.ts +263 -0
  73. package/src/crypto-hardening.test.ts +529 -0
  74. package/src/crypto.test.ts +635 -0
  75. package/src/crypto.ts +405 -0
  76. package/src/dapp-session.test.ts +647 -0
  77. package/src/dapp-session.ts +1004 -0
  78. package/src/emitter.test.ts +169 -0
  79. package/src/emitter.ts +45 -0
  80. package/src/evm/eip1193.test.ts +365 -0
  81. package/src/evm/eip1193.ts +346 -0
  82. package/src/evm/index.ts +19 -0
  83. package/src/evm/wagmi.test.ts +396 -0
  84. package/src/evm/wagmi.ts +321 -0
  85. package/src/index.ts +86 -0
  86. package/src/integration.test.ts +385 -0
  87. package/src/security.test.ts +430 -0
  88. package/src/sequence-validation.test.ts +1185 -0
  89. package/src/test-helpers.ts +216 -0
  90. package/src/types.test.ts +82 -0
  91. package/src/types.ts +305 -0
  92. package/src/wallet-session.test.ts +683 -0
  93. package/src/wallet-session.ts +922 -0
  94. package/src/ws-transport.test.ts +231 -0
  95. package/src/ws-transport.ts +92 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Web Bluetooth Central transport for dApp side.
3
+ *
4
+ * The dApp acts as BLE Central and connects to the wallet's GATT Peripheral.
5
+ * Safe to import anywhere — checks Web Bluetooth availability at runtime.
6
+ */
7
+ import { BLE_SERVICE_UUID, BLE_WRITE_CHAR_UUID, BLE_NOTIFY_CHAR_UUID, frameMessage, Defragmenter, } from './framing.js';
8
+ export function isWebBleSupported() {
9
+ return typeof navigator !== 'undefined' && !!navigator.bluetooth;
10
+ }
11
+ export class WebBleCentralTransport {
12
+ state = 'disconnected';
13
+ device = null;
14
+ writeChar = null;
15
+ notifyChar = null;
16
+ defrag = new Defragmenter();
17
+ mtuPayload = 509;
18
+ messageHandler = null;
19
+ closeHandler = null;
20
+ openHandler = null;
21
+ onMessage(handler) { this.messageHandler = handler; }
22
+ onClose(handler) { this.closeHandler = handler; }
23
+ onOpen(handler) { this.openHandler = handler; }
24
+ async connect() {
25
+ if (!isWebBleSupported()) {
26
+ throw new Error('Web Bluetooth is not supported in this environment');
27
+ }
28
+ this.state = 'connecting';
29
+ const device = await navigator.bluetooth.requestDevice({
30
+ filters: [
31
+ { namePrefix: 'WalletPair' },
32
+ { services: [BLE_SERVICE_UUID] },
33
+ ],
34
+ optionalServices: [BLE_SERVICE_UUID],
35
+ });
36
+ this.device = device;
37
+ device.addEventListener('gattserverdisconnected', this.onDisconnect);
38
+ const server = await device.gatt.connect();
39
+ const service = await server.getPrimaryService(BLE_SERVICE_UUID);
40
+ this.writeChar = await service.getCharacteristic(BLE_WRITE_CHAR_UUID);
41
+ this.notifyChar = await service.getCharacteristic(BLE_NOTIFY_CHAR_UUID);
42
+ await this.notifyChar.startNotifications();
43
+ this.notifyChar.addEventListener('characteristicvaluechanged', this.onNotification);
44
+ this.state = 'connected';
45
+ this.openHandler?.();
46
+ }
47
+ send(msg) {
48
+ if (!this.writeChar || this.state !== 'connected')
49
+ return;
50
+ const frames = frameMessage(JSON.stringify(msg), this.mtuPayload);
51
+ // Send frames sequentially
52
+ let chain = Promise.resolve();
53
+ for (const frame of frames) {
54
+ chain = chain.then(() => this.writeChar.writeValueWithoutResponse(frame));
55
+ }
56
+ }
57
+ disconnect() {
58
+ if (this.device?.gatt?.connected) {
59
+ this.device.gatt.disconnect();
60
+ }
61
+ this.cleanup();
62
+ }
63
+ onNotification = (event) => {
64
+ const target = event.target;
65
+ const dv = target.value;
66
+ const data = new Uint8Array(dv.buffer, dv.byteOffset, dv.byteLength);
67
+ const json = this.defrag.push(data);
68
+ if (json && this.messageHandler) {
69
+ try {
70
+ this.messageHandler(JSON.parse(json));
71
+ }
72
+ catch { /* bad json */ }
73
+ }
74
+ };
75
+ onDisconnect = () => {
76
+ this.cleanup();
77
+ this.closeHandler?.();
78
+ };
79
+ cleanup() {
80
+ if (this.notifyChar) {
81
+ this.notifyChar.removeEventListener('characteristicvaluechanged', this.onNotification);
82
+ }
83
+ if (this.device) {
84
+ this.device.removeEventListener('gattserverdisconnected', this.onDisconnect);
85
+ }
86
+ this.device = null;
87
+ this.writeChar = null;
88
+ this.notifyChar = null;
89
+ this.defrag.reset();
90
+ this.state = 'disconnected';
91
+ }
92
+ }
93
+ //# sourceMappingURL=web-ble-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-ble-transport.js","sourceRoot":"","sources":["../../src/ble/web-ble-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * WalletPair Protocol v1 — crypto & protocol helpers.
3
+ *
4
+ * Pure JS (noble libraries v2), no native modules required.
5
+ */
6
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils';
7
+ import type { PairingParams } from './types.js';
8
+ export { bytesToHex, hexToBytes };
9
+ export declare function b64urlEncode(bytes: Uint8Array): string;
10
+ export declare function b64urlDecode(str: string): Uint8Array;
11
+ export interface X25519KeyPair {
12
+ privateKey: Uint8Array;
13
+ publicKey: Uint8Array;
14
+ publicKeyB64: string;
15
+ }
16
+ export declare function generateX25519KeyPair(): X25519KeyPair;
17
+ export declare function getPublicKey(privateKey: Uint8Array): Uint8Array;
18
+ export declare function computeSharedSecret(myPrivateKey: Uint8Array, remotePubKey: Uint8Array): Uint8Array;
19
+ export declare function deriveSessionKey(sharedSecret: Uint8Array, channelIdHex: string): Uint8Array;
20
+ export interface SessionCryptoContext {
21
+ dappPubKeyB64: string;
22
+ walletPubKeyB64: string;
23
+ capabilities?: unknown;
24
+ walletMeta?: unknown;
25
+ dappName?: string | undefined;
26
+ }
27
+ export interface DirectionalSessionKeys {
28
+ rootKey: Uint8Array;
29
+ dappToWalletKey: Uint8Array;
30
+ walletToDappKey: Uint8Array;
31
+ transcriptHash: Uint8Array;
32
+ }
33
+ export declare function canonicalJson(value: unknown): string;
34
+ export declare function computeHandshakeTranscriptHash(channelIdHex: string, context: SessionCryptoContext): Uint8Array;
35
+ export declare function deriveDirectionalSessionKeys(rootKey: Uint8Array, channelIdHex: string, context: SessionCryptoContext): DirectionalSessionKeys;
36
+ export declare function computeSessionFingerprint(channelIdHex: string, dappPubKeyB64: string): string;
37
+ export declare function deriveJoinEncryptionKey(rootKey: Uint8Array, channelIdHex: string): Uint8Array;
38
+ /**
39
+ * Encrypt capabilities + meta for private handshake (§7.5).
40
+ * Returns base64url(nonce || ciphertext || tag).
41
+ */
42
+ export declare function sealJoin(joinEncryptionKey: Uint8Array, channelIdHex: string, capabilities: unknown, meta?: unknown): string;
43
+ /**
44
+ * Decrypt sealed_join from a private handshake join message (§7.5).
45
+ * Returns { capabilities, meta }.
46
+ */
47
+ export declare function unsealJoin(joinEncryptionKey: Uint8Array, channelIdHex: string, sealedJoin: string): {
48
+ capabilities: unknown;
49
+ meta?: unknown;
50
+ };
51
+ /**
52
+ * AAD header for authenticated encryption.
53
+ * Uses length-prefixed binary encoding per protocol §7.4.
54
+ */
55
+ export type AadHeader = {
56
+ type: 'req';
57
+ from: string;
58
+ id: string;
59
+ } | {
60
+ type: 'res';
61
+ from: string;
62
+ id: string;
63
+ } | {
64
+ type: 'evt';
65
+ from: string;
66
+ id: string;
67
+ };
68
+ export declare function sealPayload(encryptionKey: Uint8Array, channelIdHex: string, seq: number, data: unknown, header?: AadHeader): string;
69
+ export declare function unsealPayload(encryptionKey: Uint8Array, channelIdHex: string, sealed: string, header?: AadHeader): {
70
+ seq: number;
71
+ data: unknown;
72
+ plaintext: Uint8Array;
73
+ plaintextJson: string;
74
+ };
75
+ export declare function sha256Hex(bytes: Uint8Array): string;
76
+ /** Constant-time string comparison to prevent timing side-channels (§9.1). */
77
+ export declare function constantTimeEqual(a: string, b: string): boolean;
78
+ /**
79
+ * Sign a serialized session snapshot with HMAC-SHA256.
80
+ * Returns `<hex-mac>.<json-payload>`.
81
+ */
82
+ export declare function signSnapshot(sendKey: Uint8Array, json: string): string;
83
+ /**
84
+ * Verify and extract a signed snapshot.
85
+ * Returns the JSON payload on success, or `null` if the HMAC is invalid.
86
+ */
87
+ export declare function verifySnapshot(sendKey: Uint8Array, signed: string): string | null;
88
+ export declare function generateChannelId(): string;
89
+ export declare function buildPairingUri(params: {
90
+ channelId: string;
91
+ pubkeyB64: string;
92
+ relayUrl?: string | undefined;
93
+ name: string;
94
+ url: string;
95
+ icon: string;
96
+ /** Methods the dApp intends to call (§9.1). */
97
+ methods?: string[] | undefined;
98
+ /** CAIP-2 chains the dApp intends to use (§9.1). */
99
+ chains?: string[] | undefined;
100
+ }): string;
101
+ export declare function parsePairingUri(uri: string): PairingParams;
102
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
package/dist/crypto.js ADDED
@@ -0,0 +1,279 @@
1
+ /**
2
+ * WalletPair Protocol v1 — crypto & protocol helpers.
3
+ *
4
+ * Pure JS (noble libraries v2), no native modules required.
5
+ */
6
+ import _canonicalize from 'canonicalize';
7
+ const canonicalize = _canonicalize.default ?? _canonicalize.default;
8
+ import { x25519 } from '@noble/curves/ed25519';
9
+ import { hkdf } from '@noble/hashes/hkdf';
10
+ import { sha256 } from '@noble/hashes/sha256';
11
+ import { hmac } from '@noble/hashes/hmac';
12
+ import { chacha20poly1305 } from '@noble/ciphers/chacha';
13
+ import { bytesToHex, hexToBytes, utf8ToBytes, concatBytes, } from '@noble/hashes/utils';
14
+ // ---------------------------------------------------------------------------
15
+ // Re-exports
16
+ // ---------------------------------------------------------------------------
17
+ export { bytesToHex, hexToBytes };
18
+ // ---------------------------------------------------------------------------
19
+ // Base64url (no padding)
20
+ // ---------------------------------------------------------------------------
21
+ export function b64urlEncode(bytes) {
22
+ let binary = '';
23
+ for (const b of bytes)
24
+ binary += String.fromCharCode(b);
25
+ return btoa(binary)
26
+ .replace(/\+/g, '-')
27
+ .replace(/\//g, '_')
28
+ .replace(/=/g, '');
29
+ }
30
+ export function b64urlDecode(str) {
31
+ const b64 = str.replace(/-/g, '+').replace(/_/g, '/');
32
+ const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);
33
+ const binary = atob(padded);
34
+ const bytes = new Uint8Array(binary.length);
35
+ for (let i = 0; i < binary.length; i++)
36
+ bytes[i] = binary.charCodeAt(i);
37
+ return bytes;
38
+ }
39
+ export function generateX25519KeyPair() {
40
+ const privateKey = x25519.utils.randomPrivateKey();
41
+ const publicKey = x25519.getPublicKey(privateKey);
42
+ return { privateKey, publicKey, publicKeyB64: b64urlEncode(publicKey) };
43
+ }
44
+ export function getPublicKey(privateKey) {
45
+ return x25519.getPublicKey(privateKey);
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Root and directional key derivation (protocol Section 7.2)
49
+ // ---------------------------------------------------------------------------
50
+ export function computeSharedSecret(myPrivateKey, remotePubKey) {
51
+ if (remotePubKey.length !== 32) {
52
+ throw new Error('Remote public key must be exactly 32 bytes');
53
+ }
54
+ const shared = x25519.getSharedSecret(myPrivateKey, remotePubKey);
55
+ // RFC 7748 §6: low-order points produce all-zero output — reject to
56
+ // prevent invalid key derivation.
57
+ let acc = 0;
58
+ for (let i = 0; i < shared.length; i++)
59
+ acc |= shared[i];
60
+ if (acc === 0) {
61
+ throw new Error('X25519 produced all-zero shared secret (low-order public key)');
62
+ }
63
+ return shared;
64
+ }
65
+ export function deriveSessionKey(sharedSecret, channelIdHex) {
66
+ return hkdf(sha256, sharedSecret, hexToBytes(channelIdHex), 'walletpair-v1 root', 32);
67
+ }
68
+ export function canonicalJson(value) {
69
+ return canonicalize(value) ?? 'null';
70
+ }
71
+ export function computeHandshakeTranscriptHash(channelIdHex, context) {
72
+ return sha256(concatBytes(utf8ToBytes('walletpair-v1-transcript'), hexToBytes(channelIdHex), lp(context.dappPubKeyB64), lp(context.walletPubKeyB64), lp(canonicalJson(context.capabilities ?? null)), lp(canonicalJson(context.walletMeta ?? null)), lp(context.dappName ?? '')));
73
+ }
74
+ export function deriveDirectionalSessionKeys(rootKey, channelIdHex, context) {
75
+ const transcriptHash = computeHandshakeTranscriptHash(channelIdHex, context);
76
+ return {
77
+ rootKey,
78
+ transcriptHash,
79
+ dappToWalletKey: hkdf(sha256, rootKey, transcriptHash, 'walletpair-v1 dapp-to-wallet', 32),
80
+ walletToDappKey: hkdf(sha256, rootKey, transcriptHash, 'walletpair-v1 wallet-to-dapp', 32),
81
+ };
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Session fingerprint (protocol Section 7.3)
85
+ // ---------------------------------------------------------------------------
86
+ export function computeSessionFingerprint(channelIdHex, dappPubKeyB64) {
87
+ const hash = sha256(concatBytes(utf8ToBytes('walletpair-v1-session-fingerprint'), hexToBytes(channelIdHex), b64urlDecode(dappPubKeyB64)));
88
+ const view = new DataView(hash.buffer, hash.byteOffset, 4);
89
+ return (view.getUint32(0) % 10000).toString().padStart(4, '0');
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // Join encryption key (protocol Section 7.5 — private handshake)
93
+ // ---------------------------------------------------------------------------
94
+ export function deriveJoinEncryptionKey(rootKey, channelIdHex) {
95
+ return hkdf(sha256, rootKey, hexToBytes(channelIdHex), 'walletpair-v1 join-encryption', 32);
96
+ }
97
+ /**
98
+ * Encrypt capabilities + meta for private handshake (§7.5).
99
+ * Returns base64url(nonce || ciphertext || tag).
100
+ */
101
+ export function sealJoin(joinEncryptionKey, channelIdHex, capabilities, meta) {
102
+ const plainObj = { capabilities, meta: meta ?? null };
103
+ const plaintext = utf8ToBytes(canonicalJson(plainObj));
104
+ const nonce = crypto.getRandomValues(new Uint8Array(12));
105
+ const aad = concatBytes(hexToBytes(channelIdHex), new Uint8Array([0x04]));
106
+ const ciphertext = chacha20poly1305(joinEncryptionKey, nonce, aad).encrypt(plaintext);
107
+ return b64urlEncode(concatBytes(nonce, ciphertext));
108
+ }
109
+ /**
110
+ * Decrypt sealed_join from a private handshake join message (§7.5).
111
+ * Returns { capabilities, meta }.
112
+ */
113
+ export function unsealJoin(joinEncryptionKey, channelIdHex, sealedJoin) {
114
+ const envelope = b64urlDecode(sealedJoin);
115
+ if (envelope.length < 12 + 16) {
116
+ throw new Error('Invalid sealed_join envelope');
117
+ }
118
+ const nonce = envelope.slice(0, 12);
119
+ const ciphertext = envelope.slice(12);
120
+ const aad = concatBytes(hexToBytes(channelIdHex), new Uint8Array([0x04]));
121
+ const plaintext = chacha20poly1305(joinEncryptionKey, nonce, aad).decrypt(ciphertext);
122
+ return JSON.parse(new TextDecoder().decode(plaintext));
123
+ }
124
+ /** Length-prefix a UTF-8 string: uint16_be(byte_length) || utf8_bytes */
125
+ function lp(s) {
126
+ const bytes = utf8ToBytes(s);
127
+ if (bytes.length > 0xffff) {
128
+ throw new Error('AAD field exceeds 65535 bytes');
129
+ }
130
+ const len = new Uint8Array(2);
131
+ new DataView(len.buffer).setUint16(0, bytes.length);
132
+ return concatBytes(len, bytes);
133
+ }
134
+ /**
135
+ * Build AEAD AAD = channel_id_bytes || type_byte || lp(fields...)
136
+ */
137
+ function buildAad(channelIdHex, header) {
138
+ const chBytes = hexToBytes(channelIdHex);
139
+ if (!header)
140
+ return chBytes;
141
+ switch (header.type) {
142
+ case 'req':
143
+ return concatBytes(chBytes, new Uint8Array([0x01]), lp(header.from), lp(header.id));
144
+ case 'res':
145
+ return concatBytes(chBytes, new Uint8Array([0x02]), lp(header.from), lp(header.id));
146
+ case 'evt':
147
+ return concatBytes(chBytes, new Uint8Array([0x03]), lp(header.from), lp(header.id));
148
+ }
149
+ }
150
+ export function sealPayload(encryptionKey, channelIdHex, seq, data, header) {
151
+ const seqBytes = new Uint8Array(4);
152
+ new DataView(seqBytes.buffer).setUint32(0, seq);
153
+ const nonce = hmac(sha256, encryptionKey, seqBytes).slice(0, 12);
154
+ const plaintext = utf8ToBytes(canonicalJson(data));
155
+ const aad = buildAad(channelIdHex, header);
156
+ const ciphertext = chacha20poly1305(encryptionKey, nonce, aad).encrypt(plaintext);
157
+ return b64urlEncode(concatBytes(seqBytes, ciphertext));
158
+ }
159
+ export function unsealPayload(encryptionKey, channelIdHex, sealed, header) {
160
+ const bytes = b64urlDecode(sealed);
161
+ const seqBytes = bytes.slice(0, 4);
162
+ const ciphertext = bytes.slice(4);
163
+ const nonce = hmac(sha256, encryptionKey, seqBytes).slice(0, 12);
164
+ const aad = buildAad(channelIdHex, header);
165
+ const plaintext = chacha20poly1305(encryptionKey, nonce, aad).decrypt(ciphertext);
166
+ const seq = new DataView(seqBytes.buffer, seqBytes.byteOffset, 4).getUint32(0);
167
+ const plaintextJson = new TextDecoder().decode(plaintext);
168
+ return { seq, data: JSON.parse(plaintextJson), plaintext, plaintextJson };
169
+ }
170
+ export function sha256Hex(bytes) {
171
+ return bytesToHex(sha256(bytes));
172
+ }
173
+ /** Constant-time string comparison to prevent timing side-channels (§9.1). */
174
+ export function constantTimeEqual(a, b) {
175
+ if (a.length !== b.length)
176
+ return false;
177
+ let result = 0;
178
+ for (let i = 0; i < a.length; i++) {
179
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
180
+ }
181
+ return result === 0;
182
+ }
183
+ // ---------------------------------------------------------------------------
184
+ // Snapshot integrity (HMAC for serialized session state)
185
+ // ---------------------------------------------------------------------------
186
+ const SNAPSHOT_HMAC_INFO = utf8ToBytes('walletpair-v1-snapshot-hmac');
187
+ /**
188
+ * Derive a dedicated HMAC key from the send key so we don't reuse
189
+ * traffic keys for a different purpose.
190
+ */
191
+ function deriveSnapshotHmacKey(sendKey) {
192
+ return hmac(sha256, sendKey, SNAPSHOT_HMAC_INFO);
193
+ }
194
+ /**
195
+ * Sign a serialized session snapshot with HMAC-SHA256.
196
+ * Returns `<hex-mac>.<json-payload>`.
197
+ */
198
+ export function signSnapshot(sendKey, json) {
199
+ const macKey = deriveSnapshotHmacKey(sendKey);
200
+ const mac = hmac(sha256, macKey, utf8ToBytes(json));
201
+ return bytesToHex(mac) + '.' + json;
202
+ }
203
+ /**
204
+ * Verify and extract a signed snapshot.
205
+ * Returns the JSON payload on success, or `null` if the HMAC is invalid.
206
+ */
207
+ export function verifySnapshot(sendKey, signed) {
208
+ const dot = signed.indexOf('.');
209
+ if (dot !== 64)
210
+ return null; // HMAC-SHA256 hex = 64 chars
211
+ const macHex = signed.slice(0, 64);
212
+ const json = signed.slice(65);
213
+ const macKey = deriveSnapshotHmacKey(sendKey);
214
+ const expected = bytesToHex(hmac(sha256, macKey, utf8ToBytes(json)));
215
+ return constantTimeEqual(macHex, expected) ? json : null;
216
+ }
217
+ // ---------------------------------------------------------------------------
218
+ // Channel ID generation
219
+ // ---------------------------------------------------------------------------
220
+ export function generateChannelId() {
221
+ return bytesToHex(crypto.getRandomValues(new Uint8Array(32)));
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Pairing URI
225
+ // ---------------------------------------------------------------------------
226
+ export function buildPairingUri(params) {
227
+ let uri = `walletpair:?ch=${params.channelId}&pubkey=${params.pubkeyB64}`;
228
+ if (params.relayUrl)
229
+ uri += `&relay=${encodeURIComponent(params.relayUrl)}`;
230
+ uri += `&name=${encodeURIComponent(params.name)}`;
231
+ uri += `&url=${encodeURIComponent(params.url)}`;
232
+ uri += `&icon=${encodeURIComponent(params.icon)}`;
233
+ if (params.methods?.length)
234
+ uri += `&methods=${params.methods.join(',')}`;
235
+ if (params.chains?.length)
236
+ uri += `&chains=${params.chains.join(',')}`;
237
+ return uri;
238
+ }
239
+ export function parsePairingUri(uri) {
240
+ const qs = uri.replace(/^walletpair:\?/, '');
241
+ const params = new URLSearchParams(qs);
242
+ const ch = params.get('ch');
243
+ const pubkey = params.get('pubkey');
244
+ if (!ch || !pubkey)
245
+ throw new Error('Invalid pairing URI: missing ch or pubkey');
246
+ // §8.1: ch must be 64 hex characters (32 bytes)
247
+ if (!/^[0-9a-f]{64}$/.test(ch))
248
+ throw new Error('Invalid pairing URI: ch must be 64 lowercase hex chars');
249
+ // §8.1: pubkey must decode to 32 bytes
250
+ const pubkeyBytes = b64urlDecode(pubkey);
251
+ if (pubkeyBytes.length !== 32)
252
+ throw new Error('Invalid pairing URI: pubkey must be 32 bytes');
253
+ // §8.1: name, url, icon are required
254
+ const name = params.get('name');
255
+ const url = params.get('url');
256
+ const icon = params.get('icon');
257
+ if (!name)
258
+ throw new Error('Invalid pairing URI: missing required param "name"');
259
+ if (!url)
260
+ throw new Error('Invalid pairing URI: missing required param "url"');
261
+ if (!icon)
262
+ throw new Error('Invalid pairing URI: missing required param "icon"');
263
+ // §8.1: icon MUST be https:
264
+ if (!icon.startsWith('https:'))
265
+ throw new Error('Invalid pairing URI: icon must use https:');
266
+ const methodsStr = params.get('methods');
267
+ const chainsStr = params.get('chains');
268
+ return {
269
+ ch,
270
+ pubkey,
271
+ relay: params.get('relay') || undefined,
272
+ name,
273
+ url,
274
+ icon,
275
+ methods: methodsStr ? methodsStr.split(',').filter(Boolean) : undefined,
276
+ chains: chainsStr ? chainsStr.split(',').filter(Boolean) : undefined,
277
+ };
278
+ }
279
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * DApp-side WalletPair session.
3
+ *
4
+ * Manages the full lifecycle: create channel → QR → wallet joins → accept →
5
+ * encrypted request/response + events.
6
+ */
7
+ import { Emitter } from './emitter.js';
8
+ import type { Capabilities, DAppPhase, DAppSessionEvents, DAppSessionOptions, WalletMeta } from './types.js';
9
+ export declare class DAppSession extends Emitter<DAppSessionEvents> {
10
+ phase: DAppPhase;
11
+ /** Channel ID (hex). Available after createPairing(). */
12
+ channelId: string;
13
+ /** Pairing URI. Available after createPairing(). */
14
+ pairingUri: string;
15
+ /** 4-digit session fingerprint. Available after createPairing(). */
16
+ sessionFingerprint: string;
17
+ /** Remote wallet capabilities. Available after wallet joins. */
18
+ walletCapabilities: Capabilities | undefined;
19
+ /** Remote wallet metadata. Available after wallet joins. */
20
+ walletMeta: WalletMeta | undefined;
21
+ private approvedCapabilities;
22
+ private approvedWalletMeta;
23
+ private approvedWalletPubKeyB64;
24
+ private approvedScopeRecorded;
25
+ private transport;
26
+ private meta;
27
+ private declaredMethods;
28
+ private declaredChains;
29
+ private requestTimeout;
30
+ private autoAccept;
31
+ /** Session lifetime in ms (§16 rule 16). */
32
+ private sessionTtl;
33
+ private sessionTtlTimer;
34
+ private sessionStartTime;
35
+ private privKey;
36
+ private pubKeyB64;
37
+ private remotePubKey;
38
+ private sessionKey;
39
+ private sendKey;
40
+ private recvKey;
41
+ private sendSeq;
42
+ private recvSeq;
43
+ private paired;
44
+ private intentionalClose;
45
+ private reqCounter;
46
+ private pendingRequests;
47
+ private persistence;
48
+ private pendingAcceptTimer;
49
+ private reconnectTimer;
50
+ private reconnectAttempt;
51
+ constructor(options: DAppSessionOptions);
52
+ /**
53
+ * Create a new pairing channel and return the pairing URI for QR display.
54
+ *
55
+ * @param options.deferTransport - If true, don't connect the transport yet.
56
+ * Call `connectTransport()` later (e.g. after user scans QR in BLE mode).
57
+ */
58
+ createPairing(options?: {
59
+ deferTransport?: boolean | undefined;
60
+ }): Promise<string>;
61
+ /**
62
+ * Connect the transport and send the `create` message.
63
+ * Call this after `createPairing({ deferTransport: true })` when the user
64
+ * is ready (e.g. after showing QR and before BLE scan).
65
+ */
66
+ connectTransport(): Promise<void>;
67
+ /** Accept the wallet after sealed_join verification. */
68
+ acceptWallet(): void;
69
+ /** Reject the wallet. */
70
+ rejectWallet(): void;
71
+ /** Send an encrypted request to the wallet. Returns the decrypted response. */
72
+ request<T = unknown>(method: string, params?: unknown): Promise<T>;
73
+ /** Send ping. */
74
+ ping(): void;
75
+ /** Gracefully close the session. */
76
+ close(reason?: string): void;
77
+ /** Destroy the session and release all resources. */
78
+ destroy(): void;
79
+ serialize(): string;
80
+ restoreFromPersistence(): Promise<boolean>;
81
+ restore(signed: string): boolean;
82
+ /** Reconnect after restoring state. */
83
+ reconnect(): Promise<void>;
84
+ private handleMessage;
85
+ private doAccept;
86
+ private sessionContext;
87
+ private isSameApprovedWallet;
88
+ private nextSendSeq;
89
+ private persistSnapshot;
90
+ private persistSnapshotAsync;
91
+ private clearPersistence;
92
+ private persistenceError;
93
+ /** Append ?ch= to transport URL for CF Worker relay routing. Rust relay ignores it. */
94
+ private setTransportChannelHint;
95
+ private sendRaw;
96
+ private handleTransportClose;
97
+ private startReconnect;
98
+ private scheduleReconnect;
99
+ private doReconnectAttempt;
100
+ private stopReconnect;
101
+ private clearPendingAcceptTimer;
102
+ private startSessionTtl;
103
+ private clearSessionTtl;
104
+ private setPhase;
105
+ }
106
+ //# sourceMappingURL=dapp-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dapp-session.d.ts","sourceRoot":"","sources":["../src/dapp-session.ts"],"names":[],"mappings":"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"}