@kangwifi-pro/waliwa 1.1.2 → 1.1.4

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.
@@ -47,18 +47,48 @@ export declare class NoiseHandshake {
47
47
  */
48
48
  writeEphemeral(): Uint8Array;
49
49
  /**
50
- * Step 2: Receive ephemeral + static + EE + ES from responder
51
- * Server sends: [32-byte ephemeral] [48-byte encrypted static] [N-byte encrypted payload]
50
+ * Step 2: Receive server response (protobuf-wrapped)
51
+ *
52
+ * Server sends: [protobuf]
53
+ * field 3 (length-delimited): contains
54
+ * field 1 (32 bytes): server ephemeral key
55
+ * field 2 (48 bytes): encrypted server static key (32 ct + 16 GCM tag)
56
+ * [remaining]: encrypted server payload
57
+ *
58
+ * @param payload The protobuf-wrapped server response (after stripping 3-byte length prefix)
52
59
  */
53
60
  readResponderHandshake(payload: Uint8Array): {
54
61
  plaintext: Uint8Array;
55
62
  };
56
63
  /**
57
- * Step 3: Send our static + SE + payload (initiator -> responder)
58
- * Returns: [48-byte encrypted static] [N-byte encrypted payload]
59
- * MUST be called AFTER readResponderHandshake (needs remote ephemeral)
64
+ * Extract a protobuf field from a protobuf message
65
+ * Returns the field's value (for length-delimited fields)
66
+ */
67
+ private extractProtobufField;
68
+ /**
69
+ * Find data after a specific field (for extracting remaining bytes)
70
+ */
71
+ private findAfterField;
72
+ private readVarint;
73
+ private skipField;
74
+ /**
75
+ * Step 3: Send our static + SE + payload (protobuf-wrapped)
76
+ * Returns: protobuf field 4 containing [field 1: enc_static] [field 3: enc_payload]
77
+ * MUST be called AFTER readResponderHandshake
60
78
  */
61
79
  writeClientResponse(payload: Uint8Array): Uint8Array;
80
+ /**
81
+ * Build protobuf field encoding (returns array of byte chunks)
82
+ */
83
+ private buildProtobufField;
84
+ /**
85
+ * Encode a complete protobuf field (tag + length + value)
86
+ */
87
+ private encodeProtobufField;
88
+ /**
89
+ * Encode a varint
90
+ */
91
+ private encodeVarint;
62
92
  /**
63
93
  * Finalize handshake - split prk into send/recv keys
64
94
  */
@@ -84,9 +114,18 @@ export declare class NoiseHandshake {
84
114
  */
85
115
  static encodeClientHello(ephemeralPub: Uint8Array, encryptedStatic: Uint8Array, encryptedPayload: Uint8Array): Uint8Array;
86
116
  /**
87
- * Build initial client hello - ONLY the ephemeral key for message 1
88
- * The encrypted static + payload (message 3) is sent separately
89
- * after receiving the server's response (message 2)
117
+ * Build initial client hello - Message 1 of Noise XX
118
+ *
119
+ * WA Protocol: Wrap ephemeral in protobuf field 2:
120
+ * field 2 (length-delimited): contains
121
+ * field 1 (32 bytes): ephemeral public key
122
+ *
123
+ * Encoding: 12 22 0a 20 [32 bytes ephemeral]
124
+ * - 12 = field 2, wire type 2 (length-delimited)
125
+ * - 22 = length 34
126
+ * - 0a = field 1, wire type 2
127
+ * - 20 = length 32
128
+ * - [32 bytes] = ephemeral public key
90
129
  */
91
130
  buildClientHello(): Uint8Array;
92
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../src/core/noise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAUL,OAAO,EAER,MAAM,aAAa,CAAC;AAyCrB,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;gBAEnB,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,GAAE,OAAc;IAe1D,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,MAAM;IAad;;OAEG;IACH,OAAO,CAAC,OAAO;IAIf;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;;OAGG;IACI,cAAc,IAAI,UAAU;IAQnC;;;OAGG;IACI,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,UAAU,CAAA;KAAE;IAiC7E;;;;OAIG;IACI,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAgB3D;;OAEG;IACI,QAAQ,IAAI;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE;IAe/D;;OAEG;WACW,YAAY,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,UAAU,GACpB,UAAU;IAUb;;OAEG;WACW,YAAY,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,UAAU;IAcb;;OAEG;WACW,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAkB1D;;;OAGG;WACW,iBAAiB,CAC7B,YAAY,EAAE,UAAU,EACxB,eAAe,EAAE,UAAU,EAC3B,gBAAgB,EAAE,UAAU,GAC3B,UAAU;IAIb;;;;OAIG;IACI,gBAAgB,IAAI,UAAU;CAItC;AAID;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;gBAEpB,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU;IAKpD,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAM1C,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAM3C,KAAK;CAIN;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA4BhF"}
1
+ {"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../src/core/noise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAUL,OAAO,EAER,MAAM,aAAa,CAAC;AAyCrB,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;gBAEnB,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,GAAE,OAAc;IAe1D,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,MAAM;IAad;;OAEG;IACH,OAAO,CAAC,OAAO;IAIf;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;;OAGG;IACI,cAAc,IAAI,UAAU;IAQnC;;;;;;;;;;OAUG;IACI,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,UAAU,CAAA;KAAE;IAwD7E;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,SAAS;IAcjB;;;;OAIG;IACI,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAsB3D;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACI,QAAQ,IAAI;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE;IAe/D;;OAEG;WACW,YAAY,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,UAAU,GACpB,UAAU;IAUb;;OAEG;WACW,YAAY,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,UAAU;IAcb;;OAEG;WACW,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAkB1D;;;OAGG;WACW,iBAAiB,CAC7B,YAAY,EAAE,UAAU,EACxB,eAAe,EAAE,UAAU,EAC3B,gBAAgB,EAAE,UAAU,GAC3B,UAAU;IAIb;;;;;;;;;;;;;OAaG;IACI,gBAAgB,IAAI,UAAU;CAUtC;AAID;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;gBAEpB,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU;IAKpD,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAM1C,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAM3C,KAAK;CAIN;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA4BhF"}
@@ -125,42 +125,146 @@ class NoiseHandshake {
125
125
  return e.public;
126
126
  }
127
127
  /**
128
- * Step 2: Receive ephemeral + static + EE + ES from responder
129
- * Server sends: [32-byte ephemeral] [48-byte encrypted static] [N-byte encrypted payload]
128
+ * Step 2: Receive server response (protobuf-wrapped)
129
+ *
130
+ * Server sends: [protobuf]
131
+ * field 3 (length-delimited): contains
132
+ * field 1 (32 bytes): server ephemeral key
133
+ * field 2 (48 bytes): encrypted server static key (32 ct + 16 GCM tag)
134
+ * [remaining]: encrypted server payload
135
+ *
136
+ * @param payload The protobuf-wrapped server response (after stripping 3-byte length prefix)
130
137
  */
131
138
  readResponderHandshake(payload) {
132
- // First 32 bytes = ephemeral key
133
- if (payload.length < 32)
134
- throw new Error('Handshake too short');
135
- const re = payload.subarray(0, 32);
139
+ // Parse outer protobuf: field 3 contains the handshake data
140
+ const innerData = this.extractProtobufField(payload, 3);
141
+ if (!innerData || innerData.length < 80) {
142
+ throw new Error(`Invalid server handshake: field 3 too short (${innerData?.length ?? 0} bytes)`);
143
+ }
144
+ // Parse inner protobuf
145
+ // field 1: server ephemeral (32 bytes)
146
+ const serverEphemeral = this.extractProtobufField(innerData, 1);
147
+ if (!serverEphemeral || serverEphemeral.length !== 32) {
148
+ throw new Error(`Invalid server ephemeral: ${serverEphemeral?.length ?? 0} bytes (expected 32)`);
149
+ }
150
+ // field 2: encrypted server static (48 bytes = 32 ct + 16 tag)
151
+ const encryptedStatic = this.extractProtobufField(innerData, 2);
152
+ if (!encryptedStatic || encryptedStatic.length !== 48) {
153
+ throw new Error(`Invalid encrypted static: ${encryptedStatic?.length ?? 0} bytes (expected 48)`);
154
+ }
155
+ // === Process Noise handshake ===
156
+ const re = serverEphemeral;
136
157
  this.state.re = re;
137
158
  this.mixHash(re);
138
159
  this.mixKey(re);
139
160
  // Ephemeral-ephemeral DH
140
161
  const ee = (0, crypto_js_1.curveSharedSecret)(this.state.e.private, re);
141
162
  this.mixKey(ee);
142
- // Next 48 bytes = encrypted static (32-byte ct + 16-byte GCM tag)
143
- if (payload.length < 80)
144
- throw new Error('Handshake too short for static');
145
- const encryptedStatic = payload.subarray(32, 80);
146
- const remoteStatic = this.decryptWithHash(encryptedStatic); // 32 bytes
163
+ // Decrypt server static
164
+ const remoteStatic = this.decryptWithHash(encryptedStatic);
147
165
  this.state.rs = remoteStatic;
148
166
  this.mixHash(remoteStatic);
149
167
  // Ephemeral-static DH
150
168
  const es = (0, crypto_js_1.curveSharedSecret)(this.state.e.private, remoteStatic);
151
169
  this.mixKey(es);
152
- // Remaining = encrypted payload (may be empty)
153
- const encryptedPayload = payload.subarray(80);
170
+ // Find remaining payload after field 2 (encrypted payload)
154
171
  let plaintext = new Uint8Array(0);
155
- if (encryptedPayload.length > 0) {
156
- plaintext = this.decryptWithHash(encryptedPayload);
172
+ const afterEphemeral = this.findAfterField(innerData, 1);
173
+ const afterStatic = this.findAfterField(afterEphemeral, 2);
174
+ if (afterStatic && afterStatic.length > 0) {
175
+ // Try to extract field 3 (encrypted payload) if present
176
+ const encPayload = this.extractProtobufField(afterStatic, 3)
177
+ ?? this.extractProtobufField(afterStatic, 5)
178
+ ?? afterStatic; // fallback: treat all remaining as raw payload
179
+ if (encPayload.length > 0) {
180
+ plaintext = this.decryptWithHash(encPayload);
181
+ }
157
182
  }
158
183
  return { plaintext };
159
184
  }
160
185
  /**
161
- * Step 3: Send our static + SE + payload (initiator -> responder)
162
- * Returns: [48-byte encrypted static] [N-byte encrypted payload]
163
- * MUST be called AFTER readResponderHandshake (needs remote ephemeral)
186
+ * Extract a protobuf field from a protobuf message
187
+ * Returns the field's value (for length-delimited fields)
188
+ */
189
+ extractProtobufField(data, fieldNumber) {
190
+ let pos = 0;
191
+ while (pos < data.length) {
192
+ const startPos = pos;
193
+ const tag = this.readVarint(data, pos);
194
+ pos = tag.nextPos;
195
+ const fn = tag.value >> 3;
196
+ const wireType = tag.value & 7;
197
+ if (fn === fieldNumber && wireType === 2) {
198
+ // Length-delimited field - this is our target
199
+ const len = this.readVarint(data, pos);
200
+ pos = len.nextPos;
201
+ return data.subarray(pos, pos + len.value);
202
+ }
203
+ // Skip this field
204
+ pos = this.skipField(data, pos, wireType);
205
+ if (pos <= startPos)
206
+ break; // safety check
207
+ }
208
+ return null;
209
+ }
210
+ /**
211
+ * Find data after a specific field (for extracting remaining bytes)
212
+ */
213
+ findAfterField(data, fieldNumber) {
214
+ let pos = 0;
215
+ while (pos < data.length) {
216
+ const startPos = pos;
217
+ const tag = this.readVarint(data, pos);
218
+ pos = tag.nextPos;
219
+ const fn = tag.value >> 3;
220
+ const wireType = tag.value & 7;
221
+ if (fn === fieldNumber && wireType === 2) {
222
+ const len = this.readVarint(data, pos);
223
+ pos = len.nextPos;
224
+ const afterField = pos + len.value;
225
+ return data.subarray(afterField);
226
+ }
227
+ pos = this.skipField(data, pos, wireType);
228
+ if (pos <= startPos)
229
+ break;
230
+ }
231
+ return new Uint8Array(0);
232
+ }
233
+ readVarint(data, pos) {
234
+ let result = 0;
235
+ let shift = 0;
236
+ let p = pos;
237
+ while (p < data.length) {
238
+ const b = data[p++];
239
+ result |= (b & 0x7f) << shift;
240
+ if (!(b & 0x80))
241
+ break;
242
+ shift += 7;
243
+ if (shift > 35)
244
+ break; // safety
245
+ }
246
+ return { value: result, nextPos: p };
247
+ }
248
+ skipField(data, pos, wireType) {
249
+ if (wireType === 0) { // varint
250
+ return this.readVarint(data, pos).nextPos;
251
+ }
252
+ else if (wireType === 2) { // length-delimited
253
+ const len = this.readVarint(data, pos);
254
+ return len.nextPos + len.value;
255
+ }
256
+ else if (wireType === 5) { // 32-bit
257
+ return pos + 4;
258
+ }
259
+ else if (wireType === 1) { // 64-bit
260
+ return pos + 8;
261
+ }
262
+ return pos;
263
+ }
264
+ /**
265
+ * Step 3: Send our static + SE + payload (protobuf-wrapped)
266
+ * Returns: protobuf field 4 containing [field 1: enc_static] [field 3: enc_payload]
267
+ * MUST be called AFTER readResponderHandshake
164
268
  */
165
269
  writeClientResponse(payload) {
166
270
  // Encrypt our static key (32 bytes → 48 bytes with GCM tag)
@@ -173,7 +277,40 @@ class NoiseHandshake {
173
277
  this.mixKey(se);
174
278
  // Encrypt payload
175
279
  const encryptedPayload = this.encryptWithHash(payload);
176
- return (0, crypto_js_1.concatBytes)(encryptedStatic, encryptedPayload);
280
+ // Build inner protobuf: field 1 (enc static) + field 3 (enc payload)
281
+ const inner = this.buildProtobufField(1, encryptedStatic)
282
+ .concat(this.buildProtobufField(3, encryptedPayload));
283
+ // Wrap in outer protobuf field 4
284
+ const innerBytes = (0, crypto_js_1.concatBytes)(...inner);
285
+ return this.encodeProtobufField(4, innerBytes);
286
+ }
287
+ /**
288
+ * Build protobuf field encoding (returns array of byte chunks)
289
+ */
290
+ buildProtobufField(fieldNumber, value) {
291
+ const tag = (fieldNumber << 3) | 2; // wire type 2 = length-delimited
292
+ return [this.encodeVarint(tag), this.encodeVarint(value.length), value];
293
+ }
294
+ /**
295
+ * Encode a complete protobuf field (tag + length + value)
296
+ */
297
+ encodeProtobufField(fieldNumber, value) {
298
+ const tag = (fieldNumber << 3) | 2;
299
+ const tagBytes = this.encodeVarint(tag);
300
+ const lenBytes = this.encodeVarint(value.length);
301
+ return (0, crypto_js_1.concatBytes)(tagBytes, lenBytes, value);
302
+ }
303
+ /**
304
+ * Encode a varint
305
+ */
306
+ encodeVarint(value) {
307
+ const bytes = [];
308
+ while (value > 0x7f) {
309
+ bytes.push((value & 0x7f) | 0x80);
310
+ value >>= 7;
311
+ }
312
+ bytes.push(value & 0x7f);
313
+ return new Uint8Array(bytes);
177
314
  }
178
315
  /**
179
316
  * Finalize handshake - split prk into send/recv keys
@@ -240,13 +377,26 @@ class NoiseHandshake {
240
377
  return (0, crypto_js_1.concatBytes)(ephemeralPub, encryptedStatic, encryptedPayload);
241
378
  }
242
379
  /**
243
- * Build initial client hello - ONLY the ephemeral key for message 1
244
- * The encrypted static + payload (message 3) is sent separately
245
- * after receiving the server's response (message 2)
380
+ * Build initial client hello - Message 1 of Noise XX
381
+ *
382
+ * WA Protocol: Wrap ephemeral in protobuf field 2:
383
+ * field 2 (length-delimited): contains
384
+ * field 1 (32 bytes): ephemeral public key
385
+ *
386
+ * Encoding: 12 22 0a 20 [32 bytes ephemeral]
387
+ * - 12 = field 2, wire type 2 (length-delimited)
388
+ * - 22 = length 34
389
+ * - 0a = field 1, wire type 2
390
+ * - 20 = length 32
391
+ * - [32 bytes] = ephemeral public key
246
392
  */
247
393
  buildClientHello() {
248
- // Message 1: just the ephemeral public key
249
- return this.writeEphemeral();
394
+ // Message 1: just the ephemeral public key, wrapped in protobuf
395
+ const ephemeral = this.writeEphemeral();
396
+ // Inner protobuf: field 1 = ephemeral (32 bytes)
397
+ const inner = this.encodeProtobufField(1, ephemeral);
398
+ // Outer protobuf: field 2 = inner protobuf
399
+ return this.encodeProtobufField(2, inner);
250
400
  }
251
401
  }
252
402
  exports.NoiseHandshake = NoiseHandshake;
@@ -1 +1 @@
1
- {"version":3,"file":"noise.js","sourceRoot":"","sources":["../../src/core/noise.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"noise.js","sourceRoot":"","sources":["../../src/core/noise.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -53,7 +53,7 @@ export { RecoveryManager, mapCodeToReason, getActionDescription, getReasonDescri
53
53
  export { ProfileManager, PrivacyManager, NewsletterManagerExtended, StatusExtended, ContactsManager, BulkOperations, MessageExtras, DisappearingManager, LiveLocationManager, AudioTranscriptionManager, StickerManager, TypingIndicatorTracker, LastSeenTracker, MessageStatusTracker, SelfMessageFilter, ChatStateManager, DeviceInfoTracker, GroupEventsTracker, parseGroupInviteInfo, createCommunityManagers, type ProfileInfo, type PrivacyValue, type PrivacyCategory, type PrivacySettings, type NewsletterMetadata, type NewsletterPost, type StatusView, type StatusInfo, type StatusPrivacyValue, type StatusPrivacy, type ContactInfo, type BulkSendItem, type BulkSendResult, type BulkSendOptions, type AlbumItem, type MessageInfo, type DisappearingTimer, type TIMER_TO_SECONDS, type LiveLocation, type TranscriptionResult, type TranscriptionProvider, type StickerMetadata, type StickerPack, type ChatState, type GroupInviteInfo, type CommunityManagers, type CommunityTrackers } from './community/index.js';
54
54
  export { TIMER_TO_SECONDS as DISAPPEARING_TIMERS, SECONDS_TO_TIMER as SECONDS_TO_TIMER, detectLanguageFromText } from './community/index.js';
55
55
  export * from './types/index.js';
56
- export declare const VERSION = "1.1.2";
56
+ export declare const VERSION = "1.1.4";
57
57
  export declare const LIBRARY_NAME = "waliwa";
58
58
  export declare const DEFAULT_CONFIG: {
59
59
  wsURL: string;
package/dist/index.js CHANGED
@@ -252,7 +252,7 @@ Object.defineProperty(exports, "detectLanguageFromText", { enumerable: true, get
252
252
  // ============== All Types ==============
253
253
  __exportStar(require("./types/index.js"), exports);
254
254
  // ============== Version ==============
255
- exports.VERSION = '1.1.2';
255
+ exports.VERSION = '1.1.4';
256
256
  exports.LIBRARY_NAME = 'waliwa';
257
257
  // ============== Default Config ==============
258
258
  exports.DEFAULT_CONFIG = {
@@ -51,29 +51,41 @@ export declare class WAWebSocket extends EventEmitter {
51
51
  /**
52
52
  * Start Noise Protocol XX handshake
53
53
  *
54
- * WA Frame Format (used in ALL messages including handshake):
55
- * [0x57, 0x41] (2 bytes "WA" magic)
56
- * [0x01] (1 byte binary flag)
57
- * [version] (1 byte, e.g. 0x2d = 45)
58
- * [length_hi, length_mid, length_lo] (3 bytes big-endian length)
59
- * [payload]
54
+ * WA Frame Format:
55
+ * Message 1: [0x57, 0x41, 0x06, 0x02] (4-byte WA header) + [3-byte length] + [protobuf(ephemeral)]
56
+ * Messages 2+: [3-byte length] + [raw Noise data]
57
+ *
58
+ * Protobuf wrapper for ephemeral (Message 1 only):
59
+ * 12 22 0a 20 [32 bytes ephemeral]
60
+ * - 12 22 = field 2, length 34
61
+ * - 0a 20 = field 1, length 32
62
+ * - [32 bytes] = ephemeral public key
60
63
  *
61
64
  * Noise XX Pattern (3 messages):
62
- * 1. Client → Server: WA header + ephemeral (32 bytes)
63
- * 2. Server → Client: WA header + ephemeral(32) + enc_static(48) + enc_payload
64
- * 3. Client → Server: WA header + enc_static(48) + enc_payload
65
+ * 1. Client → Server: WA header + protobuf(ephemeral)
66
+ * 2. Server → Client: ephemeral + enc_static + enc_payload
67
+ * 3. Client → Server: enc_static + enc_payload
65
68
  */
66
69
  private startHandshake;
67
70
  /**
68
- * Wrap payload dengan WA frame header
69
- * Format: [0x57, 0x41, 0x01, version, len_hi, len_mid, len_lo] + payload
71
+ * Wrap handshake init message (Message 1)
72
+ * Format: [0x57, 0x41, 0x06, 0x02] + [3-byte length] + [payload]
73
+ */
74
+ private wrapHandshakeInit;
75
+ /**
76
+ * Wrap post-handshake messages (Messages 2+)
77
+ * Format: [3-byte length] + [payload]
78
+ */
79
+ private wrapPostHandshake;
80
+ /**
81
+ * Unwrap incoming message (Messages 2+)
82
+ * Strip 3-byte length prefix
70
83
  */
71
- private wrapWAFrame;
84
+ private unwrapIncoming;
72
85
  /**
73
- * Strip WA frame header (7 bytes) dari incoming message
74
- * Returns just the payload
86
+ * Hex dump utility for debugging
75
87
  */
76
- private unwrapWAFrame;
88
+ private hexDump;
77
89
  /**
78
90
  * Wait for a single WebSocket message with timeout
79
91
  */
@@ -85,12 +97,12 @@ export declare class WAWebSocket extends EventEmitter {
85
97
  private generatePairingKey;
86
98
  /**
87
99
  * Handle incoming message - decrypt jika handshake done
88
- * After handshake, messages still use WA frame format
100
+ * Post-handshake messages use 3-byte length prefix
89
101
  */
90
102
  private handleMessage;
91
103
  /**
92
104
  * Send encrypted frame ke server
93
- * Wraps encrypted data dengan WA frame header
105
+ * Post-handshake messages use 3-byte length prefix (no WA magic)
94
106
  */
95
107
  send(plaintext: Uint8Array): void;
96
108
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ws-socket.d.ts","sourceRoot":"","sources":["../../src/socket/ws-socket.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAEL,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,SAAS,GACT,OAAO,GACP,OAAO,GACP,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC;IACvD,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACtB;AAmCD,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAY;IAE5B,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAa;gBAEnB,IAAI,EAAE,kBAAkB;IAYpC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8D9B;;;;;;;;;;;;;;OAcG;YACW,cAAc;IAiC5B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAanB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,kBAAkB;IAK1B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAgBrB;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IASjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,KAAK,CAAC,IAAI,GAAE,MAAa,EAAE,MAAM,GAAE,MAAiB,GAAG,IAAI;IAa3D;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;CAGzC;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ws-socket.d.ts","sourceRoot":"","sources":["../../src/socket/ws-socket.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAEL,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,SAAS,GACT,OAAO,GACP,OAAO,GACP,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC;IACvD,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACtB;AAmCD,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAY;IAE5B,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAa;gBAEnB,IAAI,EAAE,kBAAkB;IAYpC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8D9B;;;;;;;;;;;;;;;;;OAiBG;YACW,cAAc;IA4D5B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IASzB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,OAAO;IAOf;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,kBAAkB;IAK1B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAgBrB;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IASjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,KAAK,CAAC,IAAI,GAAE,MAAa,EAAE,MAAM,GAAE,MAAiB,GAAG,IAAI;IAa3D;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;CAGzC;AAED,eAAe,WAAW,CAAC"}
@@ -134,73 +134,117 @@ class WAWebSocket extends events_1.EventEmitter {
134
134
  /**
135
135
  * Start Noise Protocol XX handshake
136
136
  *
137
- * WA Frame Format (used in ALL messages including handshake):
138
- * [0x57, 0x41] (2 bytes "WA" magic)
139
- * [0x01] (1 byte binary flag)
140
- * [version] (1 byte, e.g. 0x2d = 45)
141
- * [length_hi, length_mid, length_lo] (3 bytes big-endian length)
142
- * [payload]
137
+ * WA Frame Format:
138
+ * Message 1: [0x57, 0x41, 0x06, 0x02] (4-byte WA header) + [3-byte length] + [protobuf(ephemeral)]
139
+ * Messages 2+: [3-byte length] + [raw Noise data]
140
+ *
141
+ * Protobuf wrapper for ephemeral (Message 1 only):
142
+ * 12 22 0a 20 [32 bytes ephemeral]
143
+ * - 12 22 = field 2, length 34
144
+ * - 0a 20 = field 1, length 32
145
+ * - [32 bytes] = ephemeral public key
143
146
  *
144
147
  * Noise XX Pattern (3 messages):
145
- * 1. Client → Server: WA header + ephemeral (32 bytes)
146
- * 2. Server → Client: WA header + ephemeral(32) + enc_static(48) + enc_payload
147
- * 3. Client → Server: WA header + enc_static(48) + enc_payload
148
+ * 1. Client → Server: WA header + protobuf(ephemeral)
149
+ * 2. Server → Client: ephemeral + enc_static + enc_payload
150
+ * 3. Client → Server: enc_static + enc_payload
148
151
  */
149
152
  async startHandshake() {
150
153
  this.handshake = new noise_js_1.NoiseHandshake(this.noiseKey, true);
151
- // === Message 1: Send client ephemeral only ===
152
- const ephemeralPub = this.handshake.buildClientHello();
153
- const clientHello = this.wrapWAFrame(ephemeralPub);
154
- this.logger.debug(`Sending client hello (${clientHello.length} bytes, payload ${ephemeralPub.length})`);
154
+ // === Message 1: Send client ephemeral wrapped in protobuf ===
155
+ // buildClientHello() returns protobuf: 12 22 0a 20 [ephemeral]
156
+ const protobufEphemeral = this.handshake.buildClientHello();
157
+ // Build message 1: WA header (4 bytes) + 3-byte length + protobuf payload
158
+ const clientHello = this.wrapHandshakeInit(protobufEphemeral);
159
+ this.logger.info(`Sending client hello: ${this.hexDump(clientHello)}`);
155
160
  this.ws.send(Buffer.from(clientHello));
156
161
  // === Message 2: Wait for server response ===
157
- const serverData = await this.waitForMessage(15000);
158
- // Strip WA header (7 bytes) from server response
159
- const serverPayload = this.unwrapWAFrame(new Uint8Array(serverData));
160
- this.logger.debug(`Received server response (${serverData.length} bytes, payload ${serverPayload.length})`);
161
- // Process server Noise data
162
+ let serverPayload = null;
163
+ for (let attempt = 0; attempt < 5; attempt++) {
164
+ const serverData = await this.waitForMessage(15000);
165
+ const bytes = new Uint8Array(serverData);
166
+ this.logger.info(`Received msg ${attempt + 1} (${serverData.length} bytes): ${this.hexDump(bytes)}`);
167
+ // Skip very short messages (acks, error frames)
168
+ if (serverData.length < 4) {
169
+ this.logger.info(`Short message, skipping (likely ack/error)`);
170
+ // Check if it's a close frame: 88 02 = WS close, 03 f3 = code 1011
171
+ if (serverData.length === 4 && bytes[0] === 0x88) {
172
+ const closeCode = (bytes[2] << 8) | bytes[3];
173
+ throw new Error(`Server rejected handshake (close code ${closeCode})`);
174
+ }
175
+ continue;
176
+ }
177
+ // Messages 2+ use 3-byte length prefix (no WA magic)
178
+ // Strip the 3-byte length prefix, keep protobuf for NoiseHandshake to parse
179
+ serverPayload = bytes.subarray(3);
180
+ this.logger.info(`Stripped 3-byte length prefix, payload ${serverPayload.length} bytes`);
181
+ break;
182
+ }
183
+ if (!serverPayload || serverPayload.length < 80) {
184
+ throw new Error(`Invalid handshake response (payload ${serverPayload?.length ?? 0} bytes, need ≥ 80)`);
185
+ }
186
+ // Process server Noise data (NoiseHandshake will parse protobuf internally)
162
187
  this.handshake.readResponderHandshake(serverPayload);
163
- this.logger.debug('Server handshake response processed');
188
+ this.logger.info('Server handshake response processed');
164
189
  // === Message 3: Send encrypted static + payload ===
190
+ // writeClientResponse() returns protobuf (field 4 containing enc static + enc payload)
191
+ // Wrap with 3-byte length prefix only (no WA magic)
165
192
  const clientPayload = this.buildClientPayload();
166
193
  const clientResponse = this.handshake.writeClientResponse(clientPayload);
167
- const wrappedResponse = this.wrapWAFrame(clientResponse);
168
- this.logger.debug(`Sending client response (${wrappedResponse.length} bytes, payload ${clientResponse.length})`);
194
+ const wrappedResponse = this.wrapPostHandshake(clientResponse);
195
+ this.logger.info(`Sending client response (${wrappedResponse.length} bytes): ${this.hexDump(wrappedResponse)}`);
169
196
  this.ws.send(Buffer.from(wrappedResponse));
170
197
  // === Finalize: derive traffic keys ===
171
198
  const { sendKey, recvKey } = this.handshake.finalize();
172
199
  this.trafficCipher = new noise_js_1.TrafficCipher(sendKey, recvKey);
173
- this.logger.debug('Noise handshake completed, traffic keys derived');
200
+ this.logger.info('Noise handshake completed, traffic keys derived');
174
201
  }
175
202
  /**
176
- * Wrap payload dengan WA frame header
177
- * Format: [0x57, 0x41, 0x01, version, len_hi, len_mid, len_lo] + payload
203
+ * Wrap handshake init message (Message 1)
204
+ * Format: [0x57, 0x41, 0x06, 0x02] + [3-byte length] + [payload]
178
205
  */
179
- wrapWAFrame(payload) {
206
+ wrapHandshakeInit(payload) {
180
207
  const len = payload.length;
181
208
  const header = new Uint8Array(7);
182
209
  header[0] = 0x57; // 'W'
183
210
  header[1] = 0x41; // 'A'
184
- header[2] = 0x01; // binary flag
185
- header[3] = 0x2d; // version 45
211
+ header[2] = 0x06; // version/flag
212
+ header[3] = 0x02; // version/flag
186
213
  header[4] = (len >> 16) & 0xff;
187
214
  header[5] = (len >> 8) & 0xff;
188
215
  header[6] = len & 0xff;
189
216
  return (0, crypto_js_1.concatBytes)(header, payload);
190
217
  }
191
218
  /**
192
- * Strip WA frame header (7 bytes) dari incoming message
193
- * Returns just the payload
219
+ * Wrap post-handshake messages (Messages 2+)
220
+ * Format: [3-byte length] + [payload]
194
221
  */
195
- unwrapWAFrame(data) {
196
- if (data.length < 7) {
197
- throw new Error(`Invalid WA frame: too short (${data.length} bytes)`);
198
- }
199
- // Verify WA magic
200
- if (data[0] !== 0x57 || data[1] !== 0x41) {
201
- throw new Error(`Invalid WA frame magic: ${data[0]}, ${data[1]}`);
222
+ wrapPostHandshake(payload) {
223
+ const len = payload.length;
224
+ const header = new Uint8Array(3);
225
+ header[0] = (len >> 16) & 0xff;
226
+ header[1] = (len >> 8) & 0xff;
227
+ header[2] = len & 0xff;
228
+ return (0, crypto_js_1.concatBytes)(header, payload);
229
+ }
230
+ /**
231
+ * Unwrap incoming message (Messages 2+)
232
+ * Strip 3-byte length prefix
233
+ */
234
+ unwrapIncoming(data) {
235
+ if (data.length < 3) {
236
+ throw new Error(`Message too short: ${data.length} bytes`);
202
237
  }
203
- return data.subarray(7);
238
+ return data.subarray(3);
239
+ }
240
+ /**
241
+ * Hex dump utility for debugging
242
+ */
243
+ hexDump(data, maxBytes = 64) {
244
+ const slice = data.subarray(0, Math.min(data.length, maxBytes));
245
+ const hex = Array.from(slice).map(b => b.toString(16).padStart(2, '0')).join(' ');
246
+ const suffix = data.length > maxBytes ? ` ... (${data.length} bytes total)` : '';
247
+ return `[${hex}]${suffix}`;
204
248
  }
205
249
  /**
206
250
  * Wait for a single WebSocket message with timeout
@@ -246,7 +290,7 @@ class WAWebSocket extends events_1.EventEmitter {
246
290
  }
247
291
  /**
248
292
  * Handle incoming message - decrypt jika handshake done
249
- * After handshake, messages still use WA frame format
293
+ * Post-handshake messages use 3-byte length prefix
250
294
  */
251
295
  handleMessage(data) {
252
296
  if (!this.isHandshakeDone) {
@@ -254,8 +298,8 @@ class WAWebSocket extends events_1.EventEmitter {
254
298
  return;
255
299
  }
256
300
  try {
257
- // Strip WA header (7 bytes) then decrypt
258
- const payload = this.unwrapWAFrame(new Uint8Array(data));
301
+ // Strip 3-byte length prefix then decrypt
302
+ const payload = this.unwrapIncoming(new Uint8Array(data));
259
303
  const plaintext = this.trafficCipher.decrypt(payload);
260
304
  this.emit('message', plaintext);
261
305
  }
@@ -266,14 +310,14 @@ class WAWebSocket extends events_1.EventEmitter {
266
310
  }
267
311
  /**
268
312
  * Send encrypted frame ke server
269
- * Wraps encrypted data dengan WA frame header
313
+ * Post-handshake messages use 3-byte length prefix (no WA magic)
270
314
  */
271
315
  send(plaintext) {
272
316
  if (!this.isHandshakeDone || !this.trafficCipher) {
273
317
  throw new Error('Cannot send before handshake complete');
274
318
  }
275
319
  const ciphertext = this.trafficCipher.encrypt(plaintext);
276
- const frame = this.wrapWAFrame(ciphertext);
320
+ const frame = this.wrapPostHandshake(ciphertext);
277
321
  this.ws.send(Buffer.from(frame));
278
322
  }
279
323
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ws-socket.js","sourceRoot":"","sources":["../../src/socket/ws-socket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws-socket.js","sourceRoot":"","sources":["../../src/socket/ws-socket.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kangwifi-pro/waliwa",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Lightweight, RAM-efficient WhatsApp library with hybrid protocol (WhatsApp Web MD + Mobile API), Multi-Branch SKDM Recovery system, Community features, and 9+ Baileys issue fixes. More complete than Baileys, lighter than ZapoJS.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/core/noise.ts CHANGED
@@ -182,13 +182,38 @@ export class NoiseHandshake {
182
182
  }
183
183
 
184
184
  /**
185
- * Step 2: Receive ephemeral + static + EE + ES from responder
186
- * Server sends: [32-byte ephemeral] [48-byte encrypted static] [N-byte encrypted payload]
185
+ * Step 2: Receive server response (protobuf-wrapped)
186
+ *
187
+ * Server sends: [protobuf]
188
+ * field 3 (length-delimited): contains
189
+ * field 1 (32 bytes): server ephemeral key
190
+ * field 2 (48 bytes): encrypted server static key (32 ct + 16 GCM tag)
191
+ * [remaining]: encrypted server payload
192
+ *
193
+ * @param payload The protobuf-wrapped server response (after stripping 3-byte length prefix)
187
194
  */
188
195
  public readResponderHandshake(payload: Uint8Array): { plaintext: Uint8Array } {
189
- // First 32 bytes = ephemeral key
190
- if (payload.length < 32) throw new Error('Handshake too short');
191
- const re = payload.subarray(0, 32);
196
+ // Parse outer protobuf: field 3 contains the handshake data
197
+ const innerData = this.extractProtobufField(payload, 3);
198
+ if (!innerData || innerData.length < 80) {
199
+ throw new Error(`Invalid server handshake: field 3 too short (${innerData?.length ?? 0} bytes)`);
200
+ }
201
+
202
+ // Parse inner protobuf
203
+ // field 1: server ephemeral (32 bytes)
204
+ const serverEphemeral = this.extractProtobufField(innerData, 1);
205
+ if (!serverEphemeral || serverEphemeral.length !== 32) {
206
+ throw new Error(`Invalid server ephemeral: ${serverEphemeral?.length ?? 0} bytes (expected 32)`);
207
+ }
208
+
209
+ // field 2: encrypted server static (48 bytes = 32 ct + 16 tag)
210
+ const encryptedStatic = this.extractProtobufField(innerData, 2);
211
+ if (!encryptedStatic || encryptedStatic.length !== 48) {
212
+ throw new Error(`Invalid encrypted static: ${encryptedStatic?.length ?? 0} bytes (expected 48)`);
213
+ }
214
+
215
+ // === Process Noise handshake ===
216
+ const re = serverEphemeral;
192
217
  this.state.re = re;
193
218
  this.mixHash(re);
194
219
  this.mixKey(re);
@@ -197,10 +222,8 @@ export class NoiseHandshake {
197
222
  const ee = curveSharedSecret(this.state.e.private, re);
198
223
  this.mixKey(ee);
199
224
 
200
- // Next 48 bytes = encrypted static (32-byte ct + 16-byte GCM tag)
201
- if (payload.length < 80) throw new Error('Handshake too short for static');
202
- const encryptedStatic = payload.subarray(32, 80);
203
- const remoteStatic = this.decryptWithHash(encryptedStatic); // 32 bytes
225
+ // Decrypt server static
226
+ const remoteStatic = this.decryptWithHash(encryptedStatic);
204
227
  this.state.rs = remoteStatic;
205
228
  this.mixHash(remoteStatic);
206
229
 
@@ -208,20 +231,107 @@ export class NoiseHandshake {
208
231
  const es = curveSharedSecret(this.state.e.private, remoteStatic);
209
232
  this.mixKey(es);
210
233
 
211
- // Remaining = encrypted payload (may be empty)
212
- const encryptedPayload = payload.subarray(80);
234
+ // Find remaining payload after field 2 (encrypted payload)
213
235
  let plaintext: Uint8Array = new Uint8Array(0);
214
- if (encryptedPayload.length > 0) {
215
- plaintext = this.decryptWithHash(encryptedPayload);
236
+ const afterEphemeral = this.findAfterField(innerData, 1);
237
+ const afterStatic = this.findAfterField(afterEphemeral, 2);
238
+ if (afterStatic && afterStatic.length > 0) {
239
+ // Try to extract field 3 (encrypted payload) if present
240
+ const encPayload = this.extractProtobufField(afterStatic, 3)
241
+ ?? this.extractProtobufField(afterStatic, 5)
242
+ ?? afterStatic; // fallback: treat all remaining as raw payload
243
+ if (encPayload.length > 0) {
244
+ plaintext = this.decryptWithHash(encPayload);
245
+ }
216
246
  }
217
247
 
218
248
  return { plaintext };
219
249
  }
220
250
 
221
251
  /**
222
- * Step 3: Send our static + SE + payload (initiator -> responder)
223
- * Returns: [48-byte encrypted static] [N-byte encrypted payload]
224
- * MUST be called AFTER readResponderHandshake (needs remote ephemeral)
252
+ * Extract a protobuf field from a protobuf message
253
+ * Returns the field's value (for length-delimited fields)
254
+ */
255
+ private extractProtobufField(data: Uint8Array, fieldNumber: number): Uint8Array | null {
256
+ let pos = 0;
257
+ while (pos < data.length) {
258
+ const startPos = pos;
259
+ const tag = this.readVarint(data, pos);
260
+ pos = tag.nextPos;
261
+ const fn = tag.value >> 3;
262
+ const wireType = tag.value & 7;
263
+
264
+ if (fn === fieldNumber && wireType === 2) {
265
+ // Length-delimited field - this is our target
266
+ const len = this.readVarint(data, pos);
267
+ pos = len.nextPos;
268
+ return data.subarray(pos, pos + len.value);
269
+ }
270
+
271
+ // Skip this field
272
+ pos = this.skipField(data, pos, wireType);
273
+ if (pos <= startPos) break; // safety check
274
+ }
275
+ return null;
276
+ }
277
+
278
+ /**
279
+ * Find data after a specific field (for extracting remaining bytes)
280
+ */
281
+ private findAfterField(data: Uint8Array, fieldNumber: number): Uint8Array {
282
+ let pos = 0;
283
+ while (pos < data.length) {
284
+ const startPos = pos;
285
+ const tag = this.readVarint(data, pos);
286
+ pos = tag.nextPos;
287
+ const fn = tag.value >> 3;
288
+ const wireType = tag.value & 7;
289
+
290
+ if (fn === fieldNumber && wireType === 2) {
291
+ const len = this.readVarint(data, pos);
292
+ pos = len.nextPos;
293
+ const afterField = pos + len.value;
294
+ return data.subarray(afterField);
295
+ }
296
+
297
+ pos = this.skipField(data, pos, wireType);
298
+ if (pos <= startPos) break;
299
+ }
300
+ return new Uint8Array(0);
301
+ }
302
+
303
+ private readVarint(data: Uint8Array, pos: number): { value: number; nextPos: number } {
304
+ let result = 0;
305
+ let shift = 0;
306
+ let p = pos;
307
+ while (p < data.length) {
308
+ const b = data[p++];
309
+ result |= (b & 0x7f) << shift;
310
+ if (!(b & 0x80)) break;
311
+ shift += 7;
312
+ if (shift > 35) break; // safety
313
+ }
314
+ return { value: result, nextPos: p };
315
+ }
316
+
317
+ private skipField(data: Uint8Array, pos: number, wireType: number): number {
318
+ if (wireType === 0) { // varint
319
+ return this.readVarint(data, pos).nextPos;
320
+ } else if (wireType === 2) { // length-delimited
321
+ const len = this.readVarint(data, pos);
322
+ return len.nextPos + len.value;
323
+ } else if (wireType === 5) { // 32-bit
324
+ return pos + 4;
325
+ } else if (wireType === 1) { // 64-bit
326
+ return pos + 8;
327
+ }
328
+ return pos;
329
+ }
330
+
331
+ /**
332
+ * Step 3: Send our static + SE + payload (protobuf-wrapped)
333
+ * Returns: protobuf field 4 containing [field 1: enc_static] [field 3: enc_payload]
334
+ * MUST be called AFTER readResponderHandshake
225
335
  */
226
336
  public writeClientResponse(payload: Uint8Array): Uint8Array {
227
337
  // Encrypt our static key (32 bytes → 48 bytes with GCM tag)
@@ -236,7 +346,44 @@ export class NoiseHandshake {
236
346
  // Encrypt payload
237
347
  const encryptedPayload = this.encryptWithHash(payload);
238
348
 
239
- return concatBytes(encryptedStatic, encryptedPayload);
349
+ // Build inner protobuf: field 1 (enc static) + field 3 (enc payload)
350
+ const inner = this.buildProtobufField(1, encryptedStatic)
351
+ .concat(this.buildProtobufField(3, encryptedPayload));
352
+
353
+ // Wrap in outer protobuf field 4
354
+ const innerBytes = concatBytes(...inner);
355
+ return this.encodeProtobufField(4, innerBytes);
356
+ }
357
+
358
+ /**
359
+ * Build protobuf field encoding (returns array of byte chunks)
360
+ */
361
+ private buildProtobufField(fieldNumber: number, value: Uint8Array): Uint8Array[] {
362
+ const tag = (fieldNumber << 3) | 2; // wire type 2 = length-delimited
363
+ return [this.encodeVarint(tag), this.encodeVarint(value.length), value];
364
+ }
365
+
366
+ /**
367
+ * Encode a complete protobuf field (tag + length + value)
368
+ */
369
+ private encodeProtobufField(fieldNumber: number, value: Uint8Array): Uint8Array {
370
+ const tag = (fieldNumber << 3) | 2;
371
+ const tagBytes = this.encodeVarint(tag);
372
+ const lenBytes = this.encodeVarint(value.length);
373
+ return concatBytes(tagBytes, lenBytes, value);
374
+ }
375
+
376
+ /**
377
+ * Encode a varint
378
+ */
379
+ private encodeVarint(value: number): Uint8Array {
380
+ const bytes: number[] = [];
381
+ while (value > 0x7f) {
382
+ bytes.push((value & 0x7f) | 0x80);
383
+ value >>= 7;
384
+ }
385
+ bytes.push(value & 0x7f);
386
+ return new Uint8Array(bytes);
240
387
  }
241
388
 
242
389
  /**
@@ -329,13 +476,28 @@ export class NoiseHandshake {
329
476
  }
330
477
 
331
478
  /**
332
- * Build initial client hello - ONLY the ephemeral key for message 1
333
- * The encrypted static + payload (message 3) is sent separately
334
- * after receiving the server's response (message 2)
479
+ * Build initial client hello - Message 1 of Noise XX
480
+ *
481
+ * WA Protocol: Wrap ephemeral in protobuf field 2:
482
+ * field 2 (length-delimited): contains
483
+ * field 1 (32 bytes): ephemeral public key
484
+ *
485
+ * Encoding: 12 22 0a 20 [32 bytes ephemeral]
486
+ * - 12 = field 2, wire type 2 (length-delimited)
487
+ * - 22 = length 34
488
+ * - 0a = field 1, wire type 2
489
+ * - 20 = length 32
490
+ * - [32 bytes] = ephemeral public key
335
491
  */
336
492
  public buildClientHello(): Uint8Array {
337
- // Message 1: just the ephemeral public key
338
- return this.writeEphemeral();
493
+ // Message 1: just the ephemeral public key, wrapped in protobuf
494
+ const ephemeral = this.writeEphemeral();
495
+
496
+ // Inner protobuf: field 1 = ephemeral (32 bytes)
497
+ const inner = this.encodeProtobufField(1, ephemeral);
498
+
499
+ // Outer protobuf: field 2 = inner protobuf
500
+ return this.encodeProtobufField(2, inner);
339
501
  }
340
502
  }
341
503
 
package/src/index.ts CHANGED
@@ -324,7 +324,7 @@ export {
324
324
  export * from './types/index.js';
325
325
 
326
326
  // ============== Version ==============
327
- export const VERSION = '1.1.2';
327
+ export const VERSION = '1.1.4';
328
328
  export const LIBRARY_NAME = 'waliwa';
329
329
 
330
330
  // ============== Default Config ==============
@@ -171,62 +171,92 @@ export class WAWebSocket extends EventEmitter {
171
171
  /**
172
172
  * Start Noise Protocol XX handshake
173
173
  *
174
- * WA Frame Format (used in ALL messages including handshake):
175
- * [0x57, 0x41] (2 bytes "WA" magic)
176
- * [0x01] (1 byte binary flag)
177
- * [version] (1 byte, e.g. 0x2d = 45)
178
- * [length_hi, length_mid, length_lo] (3 bytes big-endian length)
179
- * [payload]
174
+ * WA Frame Format:
175
+ * Message 1: [0x57, 0x41, 0x06, 0x02] (4-byte WA header) + [3-byte length] + [protobuf(ephemeral)]
176
+ * Messages 2+: [3-byte length] + [raw Noise data]
177
+ *
178
+ * Protobuf wrapper for ephemeral (Message 1 only):
179
+ * 12 22 0a 20 [32 bytes ephemeral]
180
+ * - 12 22 = field 2, length 34
181
+ * - 0a 20 = field 1, length 32
182
+ * - [32 bytes] = ephemeral public key
180
183
  *
181
184
  * Noise XX Pattern (3 messages):
182
- * 1. Client → Server: WA header + ephemeral (32 bytes)
183
- * 2. Server → Client: WA header + ephemeral(32) + enc_static(48) + enc_payload
184
- * 3. Client → Server: WA header + enc_static(48) + enc_payload
185
+ * 1. Client → Server: WA header + protobuf(ephemeral)
186
+ * 2. Server → Client: ephemeral + enc_static + enc_payload
187
+ * 3. Client → Server: enc_static + enc_payload
185
188
  */
186
189
  private async startHandshake(): Promise<void> {
187
190
  this.handshake = new NoiseHandshake(this.noiseKey, true);
188
191
 
189
- // === Message 1: Send client ephemeral only ===
190
- const ephemeralPub = this.handshake.buildClientHello();
191
- const clientHello = this.wrapWAFrame(ephemeralPub);
192
- this.logger.debug(`Sending client hello (${clientHello.length} bytes, payload ${ephemeralPub.length})`);
192
+ // === Message 1: Send client ephemeral wrapped in protobuf ===
193
+ // buildClientHello() returns protobuf: 12 22 0a 20 [ephemeral]
194
+ const protobufEphemeral = this.handshake.buildClientHello();
195
+
196
+ // Build message 1: WA header (4 bytes) + 3-byte length + protobuf payload
197
+ const clientHello = this.wrapHandshakeInit(protobufEphemeral);
198
+ this.logger.info(`Sending client hello: ${this.hexDump(clientHello)}`);
193
199
  this.ws!.send(Buffer.from(clientHello));
194
200
 
195
201
  // === Message 2: Wait for server response ===
196
- const serverData = await this.waitForMessage(15000);
202
+ let serverPayload: Uint8Array | null = null;
203
+ for (let attempt = 0; attempt < 5; attempt++) {
204
+ const serverData = await this.waitForMessage(15000);
205
+ const bytes = new Uint8Array(serverData);
206
+ this.logger.info(`Received msg ${attempt + 1} (${serverData.length} bytes): ${this.hexDump(bytes)}`);
207
+
208
+ // Skip very short messages (acks, error frames)
209
+ if (serverData.length < 4) {
210
+ this.logger.info(`Short message, skipping (likely ack/error)`);
211
+ // Check if it's a close frame: 88 02 = WS close, 03 f3 = code 1011
212
+ if (serverData.length === 4 && bytes[0] === 0x88) {
213
+ const closeCode = (bytes[2] << 8) | bytes[3];
214
+ throw new Error(`Server rejected handshake (close code ${closeCode})`);
215
+ }
216
+ continue;
217
+ }
197
218
 
198
- // Strip WA header (7 bytes) from server response
199
- const serverPayload = this.unwrapWAFrame(new Uint8Array(serverData));
200
- this.logger.debug(`Received server response (${serverData.length} bytes, payload ${serverPayload.length})`);
219
+ // Messages 2+ use 3-byte length prefix (no WA magic)
220
+ // Strip the 3-byte length prefix, keep protobuf for NoiseHandshake to parse
221
+ serverPayload = bytes.subarray(3);
222
+ this.logger.info(`Stripped 3-byte length prefix, payload ${serverPayload.length} bytes`);
223
+ break;
224
+ }
201
225
 
202
- // Process server Noise data
226
+ if (!serverPayload || serverPayload.length < 80) {
227
+ throw new Error(`Invalid handshake response (payload ${serverPayload?.length ?? 0} bytes, need ≥ 80)`);
228
+ }
229
+
230
+ // Process server Noise data (NoiseHandshake will parse protobuf internally)
203
231
  this.handshake.readResponderHandshake(serverPayload);
204
- this.logger.debug('Server handshake response processed');
232
+ this.logger.info('Server handshake response processed');
205
233
 
206
234
  // === Message 3: Send encrypted static + payload ===
235
+ // writeClientResponse() returns protobuf (field 4 containing enc static + enc payload)
236
+ // Wrap with 3-byte length prefix only (no WA magic)
207
237
  const clientPayload = this.buildClientPayload();
208
238
  const clientResponse = this.handshake.writeClientResponse(clientPayload);
209
- const wrappedResponse = this.wrapWAFrame(clientResponse);
210
- this.logger.debug(`Sending client response (${wrappedResponse.length} bytes, payload ${clientResponse.length})`);
239
+ const wrappedResponse = this.wrapPostHandshake(clientResponse);
240
+ this.logger.info(`Sending client response (${wrappedResponse.length} bytes): ${this.hexDump(wrappedResponse)}`);
211
241
  this.ws!.send(Buffer.from(wrappedResponse));
212
242
 
213
243
  // === Finalize: derive traffic keys ===
214
244
  const { sendKey, recvKey } = this.handshake.finalize();
215
245
  this.trafficCipher = new TrafficCipher(sendKey, recvKey);
216
- this.logger.debug('Noise handshake completed, traffic keys derived');
246
+ this.logger.info('Noise handshake completed, traffic keys derived');
217
247
  }
218
248
 
219
249
  /**
220
- * Wrap payload dengan WA frame header
221
- * Format: [0x57, 0x41, 0x01, version, len_hi, len_mid, len_lo] + payload
250
+ * Wrap handshake init message (Message 1)
251
+ * Format: [0x57, 0x41, 0x06, 0x02] + [3-byte length] + [payload]
222
252
  */
223
- private wrapWAFrame(payload: Uint8Array): Uint8Array {
253
+ private wrapHandshakeInit(payload: Uint8Array): Uint8Array {
224
254
  const len = payload.length;
225
255
  const header = new Uint8Array(7);
226
256
  header[0] = 0x57; // 'W'
227
257
  header[1] = 0x41; // 'A'
228
- header[2] = 0x01; // binary flag
229
- header[3] = 0x2d; // version 45
258
+ header[2] = 0x06; // version/flag
259
+ header[3] = 0x02; // version/flag
230
260
  header[4] = (len >> 16) & 0xff;
231
261
  header[5] = (len >> 8) & 0xff;
232
262
  header[6] = len & 0xff;
@@ -234,18 +264,37 @@ export class WAWebSocket extends EventEmitter {
234
264
  }
235
265
 
236
266
  /**
237
- * Strip WA frame header (7 bytes) dari incoming message
238
- * Returns just the payload
267
+ * Wrap post-handshake messages (Messages 2+)
268
+ * Format: [3-byte length] + [payload]
239
269
  */
240
- private unwrapWAFrame(data: Uint8Array): Uint8Array {
241
- if (data.length < 7) {
242
- throw new Error(`Invalid WA frame: too short (${data.length} bytes)`);
243
- }
244
- // Verify WA magic
245
- if (data[0] !== 0x57 || data[1] !== 0x41) {
246
- throw new Error(`Invalid WA frame magic: ${data[0]}, ${data[1]}`);
270
+ private wrapPostHandshake(payload: Uint8Array): Uint8Array {
271
+ const len = payload.length;
272
+ const header = new Uint8Array(3);
273
+ header[0] = (len >> 16) & 0xff;
274
+ header[1] = (len >> 8) & 0xff;
275
+ header[2] = len & 0xff;
276
+ return concatBytes(header, payload);
277
+ }
278
+
279
+ /**
280
+ * Unwrap incoming message (Messages 2+)
281
+ * Strip 3-byte length prefix
282
+ */
283
+ private unwrapIncoming(data: Uint8Array): Uint8Array {
284
+ if (data.length < 3) {
285
+ throw new Error(`Message too short: ${data.length} bytes`);
247
286
  }
248
- return data.subarray(7);
287
+ return data.subarray(3);
288
+ }
289
+
290
+ /**
291
+ * Hex dump utility for debugging
292
+ */
293
+ private hexDump(data: Uint8Array, maxBytes: number = 64): string {
294
+ const slice = data.subarray(0, Math.min(data.length, maxBytes));
295
+ const hex = Array.from(slice).map(b => b.toString(16).padStart(2, '0')).join(' ');
296
+ const suffix = data.length > maxBytes ? ` ... (${data.length} bytes total)` : '';
297
+ return `[${hex}]${suffix}`;
249
298
  }
250
299
 
251
300
  /**
@@ -298,7 +347,7 @@ export class WAWebSocket extends EventEmitter {
298
347
 
299
348
  /**
300
349
  * Handle incoming message - decrypt jika handshake done
301
- * After handshake, messages still use WA frame format
350
+ * Post-handshake messages use 3-byte length prefix
302
351
  */
303
352
  private handleMessage(data: Buffer): void {
304
353
  if (!this.isHandshakeDone) {
@@ -306,8 +355,8 @@ export class WAWebSocket extends EventEmitter {
306
355
  return;
307
356
  }
308
357
  try {
309
- // Strip WA header (7 bytes) then decrypt
310
- const payload = this.unwrapWAFrame(new Uint8Array(data));
358
+ // Strip 3-byte length prefix then decrypt
359
+ const payload = this.unwrapIncoming(new Uint8Array(data));
311
360
  const plaintext = this.trafficCipher!.decrypt(payload);
312
361
  this.emit('message', plaintext);
313
362
  } catch (err: any) {
@@ -318,14 +367,14 @@ export class WAWebSocket extends EventEmitter {
318
367
 
319
368
  /**
320
369
  * Send encrypted frame ke server
321
- * Wraps encrypted data dengan WA frame header
370
+ * Post-handshake messages use 3-byte length prefix (no WA magic)
322
371
  */
323
372
  send(plaintext: Uint8Array): void {
324
373
  if (!this.isHandshakeDone || !this.trafficCipher) {
325
374
  throw new Error('Cannot send before handshake complete');
326
375
  }
327
376
  const ciphertext = this.trafficCipher.encrypt(plaintext);
328
- const frame = this.wrapWAFrame(ciphertext);
377
+ const frame = this.wrapPostHandshake(ciphertext);
329
378
  this.ws!.send(Buffer.from(frame));
330
379
  }
331
380