@kangwifi-pro/waliwa 1.1.3 → 1.1.5

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.
@@ -1,98 +1,85 @@
1
1
  /**
2
2
  * Waliwa - Noise Protocol XX handshake implementation
3
3
  *
4
- * WhatsApp Web Multi-Device menggunakan Noise Protocol Framework (XX pattern)
5
- * untuk establish secure channel antara client dan WhatsApp server.
6
- *
7
- * Pattern XX (lihat noiseprotocol.com):
8
- * <- e
9
- * -> e, ee, s, es
10
- * <- s, se
11
- *
12
- * Handshake ini menghasilkan encryption key untuk semua komunikasi WebSocket selanjutnya.
13
- *
14
- * Original implementation - tidak copy dari Baileys/ZapoJS.
4
+ * Matches Baileys implementation exactly:
5
+ * - authenticate(NOISE_HEADER) + authenticate(staticPublic) at init
6
+ * - mixIntoKey: HKDF with empty info, 64 bytes, split [0:32]=salt, [32:64]=encKey
7
+ * - IV: 12 bytes with 32-bit counter at offset 8
8
+ * - AAD: current hash value
9
+ * - finalize: HKDF(empty, salt, empty, 64) → [0:32]=encKey, [32:64]=decKey
15
10
  */
16
11
  import { KeyPair } from './crypto.js';
17
12
  export declare class NoiseHandshake {
18
- private state;
19
- private cipher;
20
- private readonly cipherKeyLen;
21
- private readonly nonceLen;
13
+ private hash;
14
+ private salt;
15
+ private encKey;
16
+ private decKey;
17
+ private readCounter;
18
+ private writeCounter;
19
+ private isFinished;
20
+ private s;
21
+ private e;
22
+ private rs;
23
+ private re;
22
24
  constructor(staticKey?: KeyPair, initiator?: boolean);
23
- private initializeSymmetric;
24
25
  /**
25
- * Mix key into chaining key + derive new cipher key
26
+ * Authenticate - mix data into handshake hash
26
27
  */
27
- private mixKey;
28
+ private authenticate;
28
29
  /**
29
- * Mix hash data into handshake hash
30
+ * Mix key into chaining key via HKDF
31
+ * Result: [0:32] = new salt, [32:64] = new encKey (= decKey during handshake)
30
32
  */
31
- private mixHash;
33
+ private mixIntoKey;
32
34
  /**
33
- * Encrypt dengan handshake key
35
+ * Generate IV: 12 bytes, 4-byte counter at offset 8 (big-endian)
34
36
  */
35
- private encryptWithHash;
37
+ private generateIV;
36
38
  /**
37
- * Decrypt dengan handshake key
39
+ * Encrypt with current encKey, AAD = hash
40
+ * Result: ciphertext + GCM tag (concatenated)
38
41
  */
39
- private decryptWithHash;
42
+ private encrypt;
40
43
  /**
41
- * Generate GCM nonce dari counter (big-endian, 4-byte prefix zero)
44
+ * Decrypt with current decKey, AAD = hash
42
45
  */
43
- private generateNonce;
46
+ private decrypt;
44
47
  /**
45
- * Step 1: Send ephemeral key (initiator -> responder)
46
- * Output: bytes untuk dikirim ke server
48
+ * Finish init - derive final traffic keys
47
49
  */
48
- writeEphemeral(): Uint8Array;
50
+ private finishInit;
51
+ /**
52
+ * Build Message 1: Send client ephemeral (protobuf-wrapped)
53
+ * Returns: protobuf field 2 { field 1: ephemeral }
54
+ */
55
+ buildClientHello(): Uint8Array;
49
56
  /**
50
- * Step 2: Receive ephemeral + static + EE + ES from responder
51
- * Server sends: [32-byte ephemeral] [48-byte encrypted static] [N-byte encrypted payload]
57
+ * Process Message 2: Server handshake response
58
+ * Expects protobuf with field 3 containing { field 1: ephemeral, field 2: enc_static, field 3: enc_payload }
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
+ * Build Message 3: Send our static (encrypted) + payload (encrypted)
65
+ * Returns: protobuf field 4 { field 1: enc_static, field 3: enc_payload }
60
66
  */
61
67
  writeClientResponse(payload: Uint8Array): Uint8Array;
62
68
  /**
63
- * Finalize handshake - split prk into send/recv keys
69
+ * Finalize - return traffic keys for post-handshake communication
64
70
  */
65
71
  finalize(): {
66
72
  sendKey: Uint8Array;
67
73
  recvKey: Uint8Array;
68
74
  };
69
- /**
70
- * Encrypt a frame post-handshake menggunakan traffic keys
71
- */
75
+ private extractProtobufField;
76
+ private encodeProtobufField;
77
+ private readVarint;
78
+ private skipField;
79
+ private encodeVarint;
72
80
  static encryptFrame(key: Uint8Array, counter: number, plaintext: Uint8Array): Uint8Array;
73
- /**
74
- * Decrypt a frame post-handshake
75
- */
76
81
  static decryptFrame(key: Uint8Array, counter: number, ciphertext: Uint8Array): Uint8Array;
77
- /**
78
- * Encode WA noise frame: [WA_HEADER] [VERSION] [LENGTH:3] [PAYLOAD]
79
- */
80
- static encodeFrame(payload: Uint8Array): Uint8Array;
81
- /**
82
- * Encode WA client payload (untuk handshake init message)
83
- * Format: [ephemeral_pubkey:32] [static_encrypted] [payload_encrypted]
84
- */
85
- static encodeClientHello(ephemeralPub: Uint8Array, encryptedStatic: Uint8Array, encryptedPayload: Uint8Array): Uint8Array;
86
- /**
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)
90
- */
91
- buildClientHello(): Uint8Array;
92
82
  }
93
- /**
94
- * Traffic cipher untuk encrypt/decrypt frames setelah handshake done
95
- */
96
83
  export declare class TrafficCipher {
97
84
  private sendKey;
98
85
  private recvKey;
@@ -103,9 +90,5 @@ export declare class TrafficCipher {
103
90
  decrypt(ciphertext: Uint8Array): Uint8Array;
104
91
  reset(): void;
105
92
  }
106
- /**
107
- * Build initial client payload untuk WA Web multi-device connect
108
- * Berisi info browser, version, dan props
109
- */
110
93
  export declare function buildClientPayload(browser: [string, string, string]): Uint8Array;
111
94
  //# sourceMappingURL=noise.d.ts.map
@@ -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;;;;;;;;;GASG;AAEH,OAAO,EAOL,OAAO,EACR,MAAM,aAAa,CAAC;AAWrB,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAO,CAAC,CAAC,CAAU;IACnB,OAAO,CAAC,CAAC,CAAU;IACnB,OAAO,CAAC,EAAE,CAA2B;IACrC,OAAO,CAAC,EAAE,CAA2B;gBAEzB,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,GAAE,OAAc;IAkB1D;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,OAAO,CAAC,OAAO;IAkBf;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;;OAGG;IACI,gBAAgB,IAAI,UAAU;IASrC;;;OAGG;IACI,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,UAAU,CAAA;KAAE;IAiD7E;;;OAGG;IACI,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAyB3D;;OAEG;IACI,QAAQ,IAAI;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE;IAS/D,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,YAAY;WAYN,YAAY,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,UAAU,GACpB,UAAU;WAQC,YAAY,CACxB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,UAAU;CASd;AAID,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,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CAqBhF"}