@meshwhisper/sdk 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.
- package/README.md +138 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/chaff/index.d.ts +91 -0
- package/dist/chaff/index.d.ts.map +1 -0
- package/dist/chaff/index.js +268 -0
- package/dist/chaff/index.js.map +1 -0
- package/dist/cluster/index.d.ts +159 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +393 -0
- package/dist/cluster/index.js.map +1 -0
- package/dist/compliance/index.d.ts +129 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +315 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/crypto/index.d.ts +65 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +146 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/group/index.d.ts +155 -0
- package/dist/group/index.d.ts.map +1 -0
- package/dist/group/index.js +560 -0
- package/dist/group/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/namespace/index.d.ts +155 -0
- package/dist/namespace/index.d.ts.map +1 -0
- package/dist/namespace/index.js +278 -0
- package/dist/namespace/index.js.map +1 -0
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +19 -0
- package/dist/node/index.js.map +1 -0
- package/dist/packet/index.d.ts +63 -0
- package/dist/packet/index.d.ts.map +1 -0
- package/dist/packet/index.js +244 -0
- package/dist/packet/index.js.map +1 -0
- package/dist/permissions/index.d.ts +107 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +282 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/persistence/idb-storage.d.ts +27 -0
- package/dist/persistence/idb-storage.d.ts.map +1 -0
- package/dist/persistence/idb-storage.js +75 -0
- package/dist/persistence/idb-storage.js.map +1 -0
- package/dist/persistence/index.d.ts +4 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +3 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/node-storage.d.ts +33 -0
- package/dist/persistence/node-storage.d.ts.map +1 -0
- package/dist/persistence/node-storage.js +90 -0
- package/dist/persistence/node-storage.js.map +1 -0
- package/dist/persistence/serialization.d.ts +4 -0
- package/dist/persistence/serialization.d.ts.map +1 -0
- package/dist/persistence/serialization.js +49 -0
- package/dist/persistence/serialization.js.map +1 -0
- package/dist/persistence/types.d.ts +29 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +5 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/ratchet/index.d.ts +80 -0
- package/dist/ratchet/index.d.ts.map +1 -0
- package/dist/ratchet/index.js +259 -0
- package/dist/ratchet/index.js.map +1 -0
- package/dist/reciprocity/index.d.ts +109 -0
- package/dist/reciprocity/index.d.ts.map +1 -0
- package/dist/reciprocity/index.js +311 -0
- package/dist/reciprocity/index.js.map +1 -0
- package/dist/relay/index.d.ts +87 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +286 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/routing/index.d.ts +136 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +478 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/sdk/index.d.ts +322 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +1530 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sybil/index.d.ts +123 -0
- package/dist/sybil/index.d.ts.map +1 -0
- package/dist/sybil/index.js +491 -0
- package/dist/sybil/index.js.map +1 -0
- package/dist/transport/browser/index.d.ts +34 -0
- package/dist/transport/browser/index.d.ts.map +1 -0
- package/dist/transport/browser/index.js +176 -0
- package/dist/transport/browser/index.js.map +1 -0
- package/dist/transport/local/index.d.ts +57 -0
- package/dist/transport/local/index.d.ts.map +1 -0
- package/dist/transport/local/index.js +442 -0
- package/dist/transport/local/index.js.map +1 -0
- package/dist/transport/negotiator/index.d.ts +79 -0
- package/dist/transport/negotiator/index.d.ts.map +1 -0
- package/dist/transport/negotiator/index.js +289 -0
- package/dist/transport/negotiator/index.js.map +1 -0
- package/dist/transport/node/index.d.ts +56 -0
- package/dist/transport/node/index.d.ts.map +1 -0
- package/dist/transport/node/index.js +209 -0
- package/dist/transport/node/index.js.map +1 -0
- package/dist/transport/noop/index.d.ts +11 -0
- package/dist/transport/noop/index.d.ts.map +1 -0
- package/dist/transport/noop/index.js +20 -0
- package/dist/transport/noop/index.js.map +1 -0
- package/dist/transport/p2p/index.d.ts +109 -0
- package/dist/transport/p2p/index.d.ts.map +1 -0
- package/dist/transport/p2p/index.js +237 -0
- package/dist/transport/p2p/index.js.map +1 -0
- package/dist/transport/websocket/index.d.ts +89 -0
- package/dist/transport/websocket/index.d.ts.map +1 -0
- package/dist/transport/websocket/index.js +498 -0
- package/dist/transport/websocket/index.js.map +1 -0
- package/dist/transport/websocket/serialize.d.ts +5 -0
- package/dist/transport/websocket/serialize.d.ts.map +1 -0
- package/dist/transport/websocket/serialize.js +55 -0
- package/dist/transport/websocket/serialize.js.map +1 -0
- package/dist/types.d.ts +215 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/x3dh/index.d.ts +120 -0
- package/dist/x3dh/index.d.ts.map +1 -0
- package/dist/x3dh/index.js +290 -0
- package/dist/x3dh/index.js.map +1 -0
- package/package.json +59 -0
- package/src/browser/index.ts +19 -0
- package/src/chaff/index.ts +340 -0
- package/src/cluster/index.ts +482 -0
- package/src/compliance/index.ts +407 -0
- package/src/crypto/index.ts +193 -0
- package/src/group/index.ts +719 -0
- package/src/index.ts +87 -0
- package/src/lz4js.d.ts +58 -0
- package/src/namespace/index.ts +336 -0
- package/src/node/index.ts +19 -0
- package/src/packet/index.ts +326 -0
- package/src/permissions/index.ts +405 -0
- package/src/persistence/idb-storage.ts +83 -0
- package/src/persistence/index.ts +3 -0
- package/src/persistence/node-storage.ts +96 -0
- package/src/persistence/serialization.ts +75 -0
- package/src/persistence/types.ts +33 -0
- package/src/ratchet/index.ts +363 -0
- package/src/reciprocity/index.ts +371 -0
- package/src/relay/index.ts +382 -0
- package/src/routing/index.ts +577 -0
- package/src/sdk/index.ts +1994 -0
- package/src/sybil/index.ts +661 -0
- package/src/transport/browser/index.ts +201 -0
- package/src/transport/local/index.ts +540 -0
- package/src/transport/negotiator/index.ts +397 -0
- package/src/transport/node/index.ts +234 -0
- package/src/transport/noop/index.ts +22 -0
- package/src/transport/p2p/index.ts +345 -0
- package/src/transport/websocket/index.ts +660 -0
- package/src/transport/websocket/serialize.ts +68 -0
- package/src/types.ts +275 -0
- package/src/x3dh/index.ts +388 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { NamespaceConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages a single namespace scope — all session-layer operations are
|
|
4
|
+
* confined to the namespace derived from the app's bundle ID, the
|
|
5
|
+
* developer's public key, and a salt.
|
|
6
|
+
*
|
|
7
|
+
* Transport-layer relaying is namespace-blind; a user in Namespace A
|
|
8
|
+
* cannot discover or contact users in Namespace B.
|
|
9
|
+
*/
|
|
10
|
+
export declare class NamespaceManager {
|
|
11
|
+
private readonly config;
|
|
12
|
+
private readonly namespaceId;
|
|
13
|
+
constructor(config: NamespaceConfig);
|
|
14
|
+
/**
|
|
15
|
+
* Returns the 256-bit namespace ID for this manager.
|
|
16
|
+
*/
|
|
17
|
+
getNamespaceId(): Uint8Array;
|
|
18
|
+
/**
|
|
19
|
+
* Computes a 256-bit namespace ID: BLAKE3(appBundleId || developerPublicKey || salt).
|
|
20
|
+
*/
|
|
21
|
+
static computeNamespaceId(appBundleId: string, developerPublicKey: Uint8Array, salt: Uint8Array): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Checks whether a given namespace ID matches ours (constant-time comparison).
|
|
24
|
+
*/
|
|
25
|
+
isInNamespace(otherNamespaceId: Uint8Array): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Computes an 8-byte destination hash: BLAKE3(publicKey || epochHour), truncated.
|
|
28
|
+
* If epochHour is omitted, the current epoch hour is used.
|
|
29
|
+
*/
|
|
30
|
+
computeDestHash(publicKey: Uint8Array, epochHour?: number): Uint8Array;
|
|
31
|
+
/**
|
|
32
|
+
* Computes the destination hash for the current epoch hour.
|
|
33
|
+
*/
|
|
34
|
+
computeCurrentDestHash(publicKey: Uint8Array): Uint8Array;
|
|
35
|
+
/**
|
|
36
|
+
* Computes the destination hash for the previous epoch hour.
|
|
37
|
+
*/
|
|
38
|
+
computePreviousDestHash(publicKey: Uint8Array): Uint8Array;
|
|
39
|
+
/**
|
|
40
|
+
* Determines whether a received dest_hash targets our public key.
|
|
41
|
+
* Checks both the current and previous epoch hour to handle boundary conditions.
|
|
42
|
+
*/
|
|
43
|
+
isMessageForUs(destHash: Uint8Array, ourPublicKey: Uint8Array): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the current epoch hour: Math.floor(Date.now() / 3_600_000).
|
|
46
|
+
*/
|
|
47
|
+
getCurrentEpochHour(): number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Represents the local device's cryptographic identity.
|
|
51
|
+
*
|
|
52
|
+
* Internally stores an Ed25519 private key, from which:
|
|
53
|
+
* - An X25519 public key is derived for key exchange and dest_hash computation
|
|
54
|
+
* - Ed25519 signing/verification is performed directly
|
|
55
|
+
*
|
|
56
|
+
* The X25519 public key is what peers see and use to send us messages.
|
|
57
|
+
*/
|
|
58
|
+
export declare class LocalIdentity {
|
|
59
|
+
private readonly edPrivateKey;
|
|
60
|
+
private readonly edPublicKey;
|
|
61
|
+
private readonly xPublicKey;
|
|
62
|
+
private readonly xPrivateKey;
|
|
63
|
+
private ephemeralId;
|
|
64
|
+
private constructor();
|
|
65
|
+
/**
|
|
66
|
+
* Generates a brand-new identity with a random Ed25519 keypair.
|
|
67
|
+
*/
|
|
68
|
+
static create(): LocalIdentity;
|
|
69
|
+
/**
|
|
70
|
+
* Restores an identity from an existing Ed25519 private key.
|
|
71
|
+
*/
|
|
72
|
+
static fromPrivateKey(privateKey: Uint8Array): LocalIdentity;
|
|
73
|
+
/**
|
|
74
|
+
* Returns the X25519 public key (32 bytes) used for key exchange and
|
|
75
|
+
* destination hash computation.
|
|
76
|
+
*/
|
|
77
|
+
getPublicKey(): Uint8Array;
|
|
78
|
+
/**
|
|
79
|
+
* Returns the Ed25519 public key (32 bytes) used for signature verification.
|
|
80
|
+
*/
|
|
81
|
+
getEdPublicKey(): Uint8Array;
|
|
82
|
+
/**
|
|
83
|
+
* Returns the Ed25519 private key (32 bytes). Used only for identity persistence.
|
|
84
|
+
*/
|
|
85
|
+
getEdPrivateKey(): Uint8Array;
|
|
86
|
+
/**
|
|
87
|
+
* Returns the X25519 private key (32 bytes) used for key exchange.
|
|
88
|
+
*/
|
|
89
|
+
getPrivateKey(): Uint8Array;
|
|
90
|
+
/**
|
|
91
|
+
* Returns the current destination hash for this identity (8 bytes).
|
|
92
|
+
*/
|
|
93
|
+
getDestHash(): Uint8Array;
|
|
94
|
+
/**
|
|
95
|
+
* Checks whether a received dest_hash matches this identity,
|
|
96
|
+
* covering both the current and previous epoch hour.
|
|
97
|
+
*/
|
|
98
|
+
matchesDestHash(destHash: Uint8Array): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Signs arbitrary data with this identity's Ed25519 private key.
|
|
101
|
+
* Returns a 64-byte signature.
|
|
102
|
+
*/
|
|
103
|
+
signData(data: Uint8Array): Uint8Array;
|
|
104
|
+
/**
|
|
105
|
+
* Verifies an Ed25519 signature against the given data and public key.
|
|
106
|
+
*/
|
|
107
|
+
verifySignature(data: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Returns the current 16-byte ephemeral sender ID.
|
|
110
|
+
*/
|
|
111
|
+
generateEphemeralId(): Uint8Array;
|
|
112
|
+
/**
|
|
113
|
+
* Rotates the ephemeral sender ID to a new random value.
|
|
114
|
+
* Should be called periodically to limit linkability.
|
|
115
|
+
* Returns the new ephemeral ID.
|
|
116
|
+
*/
|
|
117
|
+
rotateEphemeralId(): Uint8Array;
|
|
118
|
+
}
|
|
119
|
+
interface PeerEntry {
|
|
120
|
+
id: string;
|
|
121
|
+
publicKey: Uint8Array;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* In-memory cache of known peer identities, enabling lookup by peer ID
|
|
125
|
+
* or by destination hash.
|
|
126
|
+
*/
|
|
127
|
+
export declare class PeerIdentityCache {
|
|
128
|
+
private readonly peers;
|
|
129
|
+
/**
|
|
130
|
+
* Registers a peer's public key (X25519).
|
|
131
|
+
*/
|
|
132
|
+
addPeer(peerId: string, publicKey: Uint8Array): void;
|
|
133
|
+
/**
|
|
134
|
+
* Returns the public key for a known peer, or null if unknown.
|
|
135
|
+
*/
|
|
136
|
+
getPeerPublicKey(peerId: string): Uint8Array | null;
|
|
137
|
+
/**
|
|
138
|
+
* Searches all known peers for one whose dest_hash matches the given value.
|
|
139
|
+
* If epochHour is provided, only that hour is checked; otherwise both the
|
|
140
|
+
* current and previous epoch hours are checked.
|
|
141
|
+
*
|
|
142
|
+
* Returns the peer ID if found, or null.
|
|
143
|
+
*/
|
|
144
|
+
findPeerByDestHash(destHash: Uint8Array, epochHour?: number): string | null;
|
|
145
|
+
/**
|
|
146
|
+
* Removes a peer from the cache.
|
|
147
|
+
*/
|
|
148
|
+
removePeer(peerId: string): void;
|
|
149
|
+
/**
|
|
150
|
+
* Returns all cached peers as an array.
|
|
151
|
+
*/
|
|
152
|
+
getAllPeers(): Array<PeerEntry>;
|
|
153
|
+
}
|
|
154
|
+
export {};
|
|
155
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/namespace/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAkBnD;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAEZ,MAAM,EAAE,eAAe;IAUpD;;OAEG;IACH,cAAc,IAAI,UAAU;IAI5B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CACvB,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,UAAU,EAC9B,IAAI,EAAE,UAAU,GACf,UAAU;IAIb;;OAEG;IACH,aAAa,CAAC,gBAAgB,EAAE,UAAU,GAAG,OAAO;IAMpD;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU;IAKtE;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAIzD;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAI1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,GAAG,OAAO;IAQvE;;OAEG;IACH,mBAAmB,IAAI,MAAM;CAG9B;AAID;;;;;;;;GAQG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,WAAW,CAAa;IAEhC,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,aAAa;IAK9B;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa;IAO5D;;;OAGG;IACH,YAAY,IAAI,UAAU;IAI1B;;OAEG;IACH,cAAc,IAAI,UAAU;IAI5B;;OAEG;IACH,eAAe,IAAI,UAAU;IAI7B;;OAEG;IACH,aAAa,IAAI,UAAU;IAI3B;;OAEG;IACH,WAAW,IAAI,UAAU;IAIzB;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO;IAQ9C;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;IAItC;;OAEG;IACH,eAAe,CACb,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,GACpB,OAAO;IAUV;;OAEG;IACH,mBAAmB,IAAI,UAAU;IAIjC;;;;OAIG;IACH,iBAAiB,IAAI,UAAU;CAIhC;AAID,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAE5D;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI;IAIpD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAInD;;;;;;OAMG;IACH,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiB3E;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC;CAOhC"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MeshWhisper SDK — Namespace & Identity Module
|
|
3
|
+
// Namespace isolation, destination hashing, local identity
|
|
4
|
+
// management, ephemeral sender IDs, and peer identity cache.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { ed25519, edwardsToMontgomeryPub, edwardsToMontgomeryPriv } from '@noble/curves/ed25519';
|
|
7
|
+
import { deriveNamespaceId, deriveDestHash, getCurrentEpochHour, randomBytes, } from '../crypto/index.js';
|
|
8
|
+
// ---- Constants ----
|
|
9
|
+
/** Destination hash length in bytes (truncated BLAKE3). */
|
|
10
|
+
const DEST_HASH_LENGTH = 8;
|
|
11
|
+
/** Ephemeral sender ID length in bytes. */
|
|
12
|
+
const EPHEMERAL_ID_LENGTH = 16;
|
|
13
|
+
// ---- NamespaceManager ----
|
|
14
|
+
/**
|
|
15
|
+
* Manages a single namespace scope — all session-layer operations are
|
|
16
|
+
* confined to the namespace derived from the app's bundle ID, the
|
|
17
|
+
* developer's public key, and a salt.
|
|
18
|
+
*
|
|
19
|
+
* Transport-layer relaying is namespace-blind; a user in Namespace A
|
|
20
|
+
* cannot discover or contact users in Namespace B.
|
|
21
|
+
*/
|
|
22
|
+
export class NamespaceManager {
|
|
23
|
+
config;
|
|
24
|
+
namespaceId;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.namespaceId = NamespaceManager.computeNamespaceId(config.appBundleId, config.developerPublicKey, config.salt);
|
|
28
|
+
}
|
|
29
|
+
// ---- Namespace ID ----
|
|
30
|
+
/**
|
|
31
|
+
* Returns the 256-bit namespace ID for this manager.
|
|
32
|
+
*/
|
|
33
|
+
getNamespaceId() {
|
|
34
|
+
return this.namespaceId;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Computes a 256-bit namespace ID: BLAKE3(appBundleId || developerPublicKey || salt).
|
|
38
|
+
*/
|
|
39
|
+
static computeNamespaceId(appBundleId, developerPublicKey, salt) {
|
|
40
|
+
return deriveNamespaceId(appBundleId, developerPublicKey, salt);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Checks whether a given namespace ID matches ours (constant-time comparison).
|
|
44
|
+
*/
|
|
45
|
+
isInNamespace(otherNamespaceId) {
|
|
46
|
+
return timingSafeEqual(this.namespaceId, otherNamespaceId);
|
|
47
|
+
}
|
|
48
|
+
// ---- Destination Hashing ----
|
|
49
|
+
/**
|
|
50
|
+
* Computes an 8-byte destination hash: BLAKE3(publicKey || epochHour), truncated.
|
|
51
|
+
* If epochHour is omitted, the current epoch hour is used.
|
|
52
|
+
*/
|
|
53
|
+
computeDestHash(publicKey, epochHour) {
|
|
54
|
+
const hour = epochHour ?? getCurrentEpochHour();
|
|
55
|
+
return deriveDestHash(publicKey, hour);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Computes the destination hash for the current epoch hour.
|
|
59
|
+
*/
|
|
60
|
+
computeCurrentDestHash(publicKey) {
|
|
61
|
+
return deriveDestHash(publicKey, getCurrentEpochHour());
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Computes the destination hash for the previous epoch hour.
|
|
65
|
+
*/
|
|
66
|
+
computePreviousDestHash(publicKey) {
|
|
67
|
+
return deriveDestHash(publicKey, getCurrentEpochHour() - 1);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Determines whether a received dest_hash targets our public key.
|
|
71
|
+
* Checks both the current and previous epoch hour to handle boundary conditions.
|
|
72
|
+
*/
|
|
73
|
+
isMessageForUs(destHash, ourPublicKey) {
|
|
74
|
+
const currentHash = this.computeCurrentDestHash(ourPublicKey);
|
|
75
|
+
if (timingSafeEqual(currentHash, destHash))
|
|
76
|
+
return true;
|
|
77
|
+
const previousHash = this.computePreviousDestHash(ourPublicKey);
|
|
78
|
+
return timingSafeEqual(previousHash, destHash);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns the current epoch hour: Math.floor(Date.now() / 3_600_000).
|
|
82
|
+
*/
|
|
83
|
+
getCurrentEpochHour() {
|
|
84
|
+
return getCurrentEpochHour();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ---- LocalIdentity ----
|
|
88
|
+
/**
|
|
89
|
+
* Represents the local device's cryptographic identity.
|
|
90
|
+
*
|
|
91
|
+
* Internally stores an Ed25519 private key, from which:
|
|
92
|
+
* - An X25519 public key is derived for key exchange and dest_hash computation
|
|
93
|
+
* - Ed25519 signing/verification is performed directly
|
|
94
|
+
*
|
|
95
|
+
* The X25519 public key is what peers see and use to send us messages.
|
|
96
|
+
*/
|
|
97
|
+
export class LocalIdentity {
|
|
98
|
+
edPrivateKey;
|
|
99
|
+
edPublicKey;
|
|
100
|
+
xPublicKey;
|
|
101
|
+
xPrivateKey;
|
|
102
|
+
ephemeralId;
|
|
103
|
+
constructor(edPrivateKey) {
|
|
104
|
+
this.edPrivateKey = edPrivateKey;
|
|
105
|
+
this.edPublicKey = ed25519.getPublicKey(edPrivateKey);
|
|
106
|
+
this.xPublicKey = edwardsToMontgomeryPub(this.edPublicKey);
|
|
107
|
+
this.xPrivateKey = edwardsToMontgomeryPriv(edPrivateKey);
|
|
108
|
+
this.ephemeralId = randomBytes(EPHEMERAL_ID_LENGTH);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generates a brand-new identity with a random Ed25519 keypair.
|
|
112
|
+
*/
|
|
113
|
+
static create() {
|
|
114
|
+
const privateKey = ed25519.utils.randomPrivateKey();
|
|
115
|
+
return new LocalIdentity(privateKey);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Restores an identity from an existing Ed25519 private key.
|
|
119
|
+
*/
|
|
120
|
+
static fromPrivateKey(privateKey) {
|
|
121
|
+
if (privateKey.length !== 32) {
|
|
122
|
+
throw new RangeError('Ed25519 private key must be exactly 32 bytes');
|
|
123
|
+
}
|
|
124
|
+
return new LocalIdentity(privateKey);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Returns the X25519 public key (32 bytes) used for key exchange and
|
|
128
|
+
* destination hash computation.
|
|
129
|
+
*/
|
|
130
|
+
getPublicKey() {
|
|
131
|
+
return this.xPublicKey;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns the Ed25519 public key (32 bytes) used for signature verification.
|
|
135
|
+
*/
|
|
136
|
+
getEdPublicKey() {
|
|
137
|
+
return this.edPublicKey;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Returns the Ed25519 private key (32 bytes). Used only for identity persistence.
|
|
141
|
+
*/
|
|
142
|
+
getEdPrivateKey() {
|
|
143
|
+
return this.edPrivateKey;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Returns the X25519 private key (32 bytes) used for key exchange.
|
|
147
|
+
*/
|
|
148
|
+
getPrivateKey() {
|
|
149
|
+
return this.xPrivateKey;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Returns the current destination hash for this identity (8 bytes).
|
|
153
|
+
*/
|
|
154
|
+
getDestHash() {
|
|
155
|
+
return deriveDestHash(this.xPublicKey, getCurrentEpochHour());
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Checks whether a received dest_hash matches this identity,
|
|
159
|
+
* covering both the current and previous epoch hour.
|
|
160
|
+
*/
|
|
161
|
+
matchesDestHash(destHash) {
|
|
162
|
+
const currentHash = deriveDestHash(this.xPublicKey, getCurrentEpochHour());
|
|
163
|
+
if (timingSafeEqual(currentHash, destHash))
|
|
164
|
+
return true;
|
|
165
|
+
const previousHash = deriveDestHash(this.xPublicKey, getCurrentEpochHour() - 1);
|
|
166
|
+
return timingSafeEqual(previousHash, destHash);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Signs arbitrary data with this identity's Ed25519 private key.
|
|
170
|
+
* Returns a 64-byte signature.
|
|
171
|
+
*/
|
|
172
|
+
signData(data) {
|
|
173
|
+
return ed25519.sign(data, this.edPrivateKey);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Verifies an Ed25519 signature against the given data and public key.
|
|
177
|
+
*/
|
|
178
|
+
verifySignature(data, signature, publicKey) {
|
|
179
|
+
try {
|
|
180
|
+
return ed25519.verify(signature, data, publicKey);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ---- Ephemeral Sender ID ----
|
|
187
|
+
/**
|
|
188
|
+
* Returns the current 16-byte ephemeral sender ID.
|
|
189
|
+
*/
|
|
190
|
+
generateEphemeralId() {
|
|
191
|
+
return this.ephemeralId;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Rotates the ephemeral sender ID to a new random value.
|
|
195
|
+
* Should be called periodically to limit linkability.
|
|
196
|
+
* Returns the new ephemeral ID.
|
|
197
|
+
*/
|
|
198
|
+
rotateEphemeralId() {
|
|
199
|
+
this.ephemeralId = randomBytes(EPHEMERAL_ID_LENGTH);
|
|
200
|
+
return this.ephemeralId;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* In-memory cache of known peer identities, enabling lookup by peer ID
|
|
205
|
+
* or by destination hash.
|
|
206
|
+
*/
|
|
207
|
+
export class PeerIdentityCache {
|
|
208
|
+
peers = new Map();
|
|
209
|
+
/**
|
|
210
|
+
* Registers a peer's public key (X25519).
|
|
211
|
+
*/
|
|
212
|
+
addPeer(peerId, publicKey) {
|
|
213
|
+
this.peers.set(peerId, publicKey);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Returns the public key for a known peer, or null if unknown.
|
|
217
|
+
*/
|
|
218
|
+
getPeerPublicKey(peerId) {
|
|
219
|
+
return this.peers.get(peerId) ?? null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Searches all known peers for one whose dest_hash matches the given value.
|
|
223
|
+
* If epochHour is provided, only that hour is checked; otherwise both the
|
|
224
|
+
* current and previous epoch hours are checked.
|
|
225
|
+
*
|
|
226
|
+
* Returns the peer ID if found, or null.
|
|
227
|
+
*/
|
|
228
|
+
findPeerByDestHash(destHash, epochHour) {
|
|
229
|
+
for (const [peerId, publicKey] of this.peers) {
|
|
230
|
+
if (epochHour !== undefined) {
|
|
231
|
+
const hash = deriveDestHash(publicKey, epochHour);
|
|
232
|
+
if (timingSafeEqual(hash, destHash))
|
|
233
|
+
return peerId;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
const currentHour = getCurrentEpochHour();
|
|
237
|
+
const currentHash = deriveDestHash(publicKey, currentHour);
|
|
238
|
+
if (timingSafeEqual(currentHash, destHash))
|
|
239
|
+
return peerId;
|
|
240
|
+
const previousHash = deriveDestHash(publicKey, currentHour - 1);
|
|
241
|
+
if (timingSafeEqual(previousHash, destHash))
|
|
242
|
+
return peerId;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Removes a peer from the cache.
|
|
249
|
+
*/
|
|
250
|
+
removePeer(peerId) {
|
|
251
|
+
this.peers.delete(peerId);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Returns all cached peers as an array.
|
|
255
|
+
*/
|
|
256
|
+
getAllPeers() {
|
|
257
|
+
const result = [];
|
|
258
|
+
for (const [id, publicKey] of this.peers) {
|
|
259
|
+
result.push({ id, publicKey });
|
|
260
|
+
}
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// ---- Helpers ----
|
|
265
|
+
/**
|
|
266
|
+
* Constant-time comparison of two Uint8Arrays.
|
|
267
|
+
* Returns true only if both arrays have the same length and identical contents.
|
|
268
|
+
*/
|
|
269
|
+
function timingSafeEqual(a, b) {
|
|
270
|
+
if (a.length !== b.length)
|
|
271
|
+
return false;
|
|
272
|
+
let diff = 0;
|
|
273
|
+
for (let i = 0; i < a.length; i++) {
|
|
274
|
+
diff |= a[i] ^ b[i];
|
|
275
|
+
}
|
|
276
|
+
return diff === 0;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/namespace/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAgBA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MeshWhisper SDK — Node.js entry point
|
|
3
|
+
// @meshwhisper/sdk/node
|
|
4
|
+
//
|
|
5
|
+
// Re-exports everything from the main SDK plus Node.js-specific
|
|
6
|
+
// storage and transport implementations.
|
|
7
|
+
//
|
|
8
|
+
// Usage:
|
|
9
|
+
// import { MeshWhisper, NodeStorage } from '@meshwhisper/sdk/node';
|
|
10
|
+
//
|
|
11
|
+
// const mw = await MeshWhisper.init({
|
|
12
|
+
// namespace: 'com.example.app',
|
|
13
|
+
// storage: new NodeStorage('./data'),
|
|
14
|
+
// });
|
|
15
|
+
// ============================================================
|
|
16
|
+
export * from '../index.js';
|
|
17
|
+
export { NodeStorage } from '../persistence/node-storage.js';
|
|
18
|
+
export { NodeTransport } from '../transport/node/index.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wCAAwC;AACxC,wBAAwB;AACxB,EAAE;AACF,gEAAgE;AAChE,yCAAyC;AACzC,EAAE;AACF,SAAS;AACT,sEAAsE;AACtE,EAAE;AACF,wCAAwC;AACxC,oCAAoC;AACpC,0CAA0C;AAC1C,QAAQ;AACR,+DAA+D;AAE/D,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Packet } from '../types.js';
|
|
2
|
+
/** Current protocol wire version. */
|
|
3
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
4
|
+
/** Fixed header size in bytes (version + flags + dest_hash + sender_eph_id + ttl + payload_length). */
|
|
5
|
+
export declare const HEADER_SIZE = 29;
|
|
6
|
+
/** Maximum hop count. */
|
|
7
|
+
export declare const MAX_TTL = 7;
|
|
8
|
+
/** Maximum encrypted payload size (uint16 max). */
|
|
9
|
+
export declare const MAX_PAYLOAD_SIZE = 65535;
|
|
10
|
+
/**
|
|
11
|
+
* Serialize a {@link Packet} into its binary wire representation.
|
|
12
|
+
*
|
|
13
|
+
* Layout (29-byte header + variable payload):
|
|
14
|
+
* | version (1) | flags (1) | dest_hash (8) | sender_ephemeral_id (16) | ttl (1) | payload_length (2 BE) | encrypted_payload (N) |
|
|
15
|
+
*/
|
|
16
|
+
export declare function encodePacket(packet: Packet): Uint8Array;
|
|
17
|
+
/**
|
|
18
|
+
* Deserialize a binary buffer into a {@link Packet}.
|
|
19
|
+
*
|
|
20
|
+
* @throws on malformed input (too short, wrong version, invalid flags, length mismatch).
|
|
21
|
+
*/
|
|
22
|
+
export declare function decodePacket(data: Uint8Array): Packet;
|
|
23
|
+
/**
|
|
24
|
+
* Compress a plaintext payload with LZ4 (frame format).
|
|
25
|
+
*/
|
|
26
|
+
export declare function compressPayload(plaintext: Uint8Array): Uint8Array;
|
|
27
|
+
/**
|
|
28
|
+
* Decompress an LZ4 compressed payload back to plaintext.
|
|
29
|
+
*/
|
|
30
|
+
export declare function decompressPayload(compressed: Uint8Array): Uint8Array;
|
|
31
|
+
/**
|
|
32
|
+
* Build a DATA packet.
|
|
33
|
+
*
|
|
34
|
+
* @param destHash 8-byte truncated BLAKE3 destination hash
|
|
35
|
+
* @param senderEphId 16-byte rotating ephemeral sender identifier
|
|
36
|
+
* @param payload Encrypted payload bytes
|
|
37
|
+
* @param ttl Hop count (0-7, defaults to {@link MAX_TTL})
|
|
38
|
+
*/
|
|
39
|
+
export declare function createDataPacket(destHash: Uint8Array, senderEphId: Uint8Array, payload: Uint8Array, ttl?: number): Packet;
|
|
40
|
+
/**
|
|
41
|
+
* Build an ACK packet (ttl fixed at 0 since ACKs are single-hop).
|
|
42
|
+
*/
|
|
43
|
+
export declare function createAckPacket(destHash: Uint8Array, senderEphId: Uint8Array, ackPayload: Uint8Array): Packet;
|
|
44
|
+
/**
|
|
45
|
+
* Build a CHAFF (cover-traffic) packet with random destination and payload.
|
|
46
|
+
*
|
|
47
|
+
* The payload length is randomly chosen between 32 and 256 bytes to mimic
|
|
48
|
+
* realistic traffic without being trivially distinguishable.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createChaffPacket(senderEphId: Uint8Array): Packet;
|
|
51
|
+
/**
|
|
52
|
+
* Build a ROUTE_REQUEST packet.
|
|
53
|
+
*/
|
|
54
|
+
export declare function createRouteRequestPacket(destHash: Uint8Array, senderEphId: Uint8Array, requestPayload: Uint8Array): Packet;
|
|
55
|
+
/**
|
|
56
|
+
* Build a ROUTE_OFFER packet.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createRouteOfferPacket(destHash: Uint8Array, senderEphId: Uint8Array, offerPayload: Uint8Array): Packet;
|
|
59
|
+
/**
|
|
60
|
+
* Build a HANDSHAKE packet.
|
|
61
|
+
*/
|
|
62
|
+
export declare function createHandshakePacket(destHash: Uint8Array, senderEphId: Uint8Array, handshakePayload: Uint8Array): Packet;
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/packet/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAe,MAAM,aAAa,CAAC;AAQlD,qCAAqC;AACrC,eAAO,MAAM,gBAAgB,IAAO,CAAC;AAErC,uGAAuG;AACvG,eAAO,MAAM,WAAW,KAAK,CAAC;AAE9B,yBAAyB;AACzB,eAAO,MAAM,OAAO,IAAI,CAAC;AAEzB,mDAAmD;AACnD,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAyCtC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAsCvD;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAgDrD;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAOjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAMpE;AAMD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,UAAU,EACnB,GAAG,GAAE,MAAgB,GACpB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,UAAU,GACrB,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,EACvB,cAAc,EAAE,UAAU,GACzB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,EACvB,YAAY,EAAE,UAAU,GACvB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,EACvB,gBAAgB,EAAE,UAAU,GAC3B,MAAM,CAER"}
|