nlcurl 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/cache/store.d.ts +89 -0
  2. package/dist/cache/store.d.ts.map +1 -0
  3. package/dist/cache/store.js +402 -0
  4. package/dist/cache/store.js.map +1 -0
  5. package/dist/cache/types.d.ts +101 -0
  6. package/dist/cache/types.d.ts.map +1 -0
  7. package/dist/cache/types.js +2 -0
  8. package/dist/cache/types.js.map +1 -0
  9. package/dist/cookies/jar.d.ts +11 -0
  10. package/dist/cookies/jar.d.ts.map +1 -1
  11. package/dist/cookies/jar.js +50 -4
  12. package/dist/cookies/jar.js.map +1 -1
  13. package/dist/cookies/parser.d.ts +2 -0
  14. package/dist/cookies/parser.d.ts.map +1 -1
  15. package/dist/cookies/parser.js +14 -0
  16. package/dist/cookies/parser.js.map +1 -1
  17. package/dist/cookies/psl-data.d.ts +1 -1
  18. package/dist/cookies/psl-data.js +1 -1
  19. package/dist/core/client.js +3 -0
  20. package/dist/core/client.js.map +1 -1
  21. package/dist/core/request.d.ts +68 -2
  22. package/dist/core/request.d.ts.map +1 -1
  23. package/dist/core/response.d.ts +22 -0
  24. package/dist/core/response.d.ts.map +1 -1
  25. package/dist/core/response.js +32 -0
  26. package/dist/core/response.js.map +1 -1
  27. package/dist/core/session.d.ts +23 -0
  28. package/dist/core/session.d.ts.map +1 -1
  29. package/dist/core/session.js +101 -3
  30. package/dist/core/session.js.map +1 -1
  31. package/dist/core/validation.d.ts +2 -1
  32. package/dist/core/validation.d.ts.map +1 -1
  33. package/dist/core/validation.js +5 -4
  34. package/dist/core/validation.js.map +1 -1
  35. package/dist/dns/codec.d.ts +37 -0
  36. package/dist/dns/codec.d.ts.map +1 -0
  37. package/dist/dns/codec.js +254 -0
  38. package/dist/dns/codec.js.map +1 -0
  39. package/dist/dns/doh-resolver.d.ts +52 -0
  40. package/dist/dns/doh-resolver.d.ts.map +1 -0
  41. package/dist/dns/doh-resolver.js +192 -0
  42. package/dist/dns/doh-resolver.js.map +1 -0
  43. package/dist/dns/https-rr.d.ts +51 -0
  44. package/dist/dns/https-rr.d.ts.map +1 -0
  45. package/dist/dns/https-rr.js +127 -0
  46. package/dist/dns/https-rr.js.map +1 -0
  47. package/dist/dns/types.d.ts +110 -0
  48. package/dist/dns/types.d.ts.map +1 -0
  49. package/dist/dns/types.js +34 -0
  50. package/dist/dns/types.js.map +1 -0
  51. package/dist/hsts/store.d.ts +41 -0
  52. package/dist/hsts/store.d.ts.map +1 -0
  53. package/dist/hsts/store.js +171 -0
  54. package/dist/hsts/store.js.map +1 -0
  55. package/dist/hsts/types.d.ts +28 -0
  56. package/dist/hsts/types.d.ts.map +1 -0
  57. package/dist/hsts/types.js +2 -0
  58. package/dist/hsts/types.js.map +1 -0
  59. package/dist/http/alt-svc.d.ts +85 -0
  60. package/dist/http/alt-svc.d.ts.map +1 -0
  61. package/dist/http/alt-svc.js +220 -0
  62. package/dist/http/alt-svc.js.map +1 -0
  63. package/dist/http/h1/client.d.ts.map +1 -1
  64. package/dist/http/h1/client.js +16 -0
  65. package/dist/http/h1/client.js.map +1 -1
  66. package/dist/http/h3/detection.d.ts +17 -0
  67. package/dist/http/h3/detection.d.ts.map +1 -0
  68. package/dist/http/h3/detection.js +59 -0
  69. package/dist/http/h3/detection.js.map +1 -0
  70. package/dist/http/negotiator.d.ts +24 -1
  71. package/dist/http/negotiator.d.ts.map +1 -1
  72. package/dist/http/negotiator.js +88 -18
  73. package/dist/http/negotiator.js.map +1 -1
  74. package/dist/http/pool.d.ts +2 -2
  75. package/dist/http/pool.d.ts.map +1 -1
  76. package/dist/http/pool.js.map +1 -1
  77. package/dist/index.d.ts +16 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +12 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/middleware/rate-limiter.d.ts.map +1 -1
  82. package/dist/middleware/rate-limiter.js +4 -0
  83. package/dist/middleware/rate-limiter.js.map +1 -1
  84. package/dist/proxy/env-proxy.d.ts +21 -0
  85. package/dist/proxy/env-proxy.d.ts.map +1 -0
  86. package/dist/proxy/env-proxy.js +74 -0
  87. package/dist/proxy/env-proxy.js.map +1 -0
  88. package/dist/proxy/http-proxy.d.ts +2 -0
  89. package/dist/proxy/http-proxy.d.ts.map +1 -1
  90. package/dist/proxy/http-proxy.js +19 -6
  91. package/dist/proxy/http-proxy.js.map +1 -1
  92. package/dist/proxy/socks.js +1 -1
  93. package/dist/proxy/socks.js.map +1 -1
  94. package/dist/sse/parser.d.ts +70 -0
  95. package/dist/sse/parser.d.ts.map +1 -0
  96. package/dist/sse/parser.js +153 -0
  97. package/dist/sse/parser.js.map +1 -0
  98. package/dist/tls/ech.d.ts +147 -0
  99. package/dist/tls/ech.d.ts.map +1 -0
  100. package/dist/tls/ech.js +401 -0
  101. package/dist/tls/ech.js.map +1 -0
  102. package/dist/tls/node-engine.d.ts +9 -1
  103. package/dist/tls/node-engine.d.ts.map +1 -1
  104. package/dist/tls/node-engine.js +39 -1
  105. package/dist/tls/node-engine.js.map +1 -1
  106. package/dist/tls/pin-verification.d.ts +9 -0
  107. package/dist/tls/pin-verification.d.ts.map +1 -0
  108. package/dist/tls/pin-verification.js +34 -0
  109. package/dist/tls/pin-verification.js.map +1 -0
  110. package/dist/tls/session-cache.d.ts +70 -0
  111. package/dist/tls/session-cache.d.ts.map +1 -0
  112. package/dist/tls/session-cache.js +80 -0
  113. package/dist/tls/session-cache.js.map +1 -0
  114. package/dist/tls/stealth/client-hello.d.ts +21 -0
  115. package/dist/tls/stealth/client-hello.d.ts.map +1 -1
  116. package/dist/tls/stealth/client-hello.js +116 -0
  117. package/dist/tls/stealth/client-hello.js.map +1 -1
  118. package/dist/tls/stealth/engine.d.ts.map +1 -1
  119. package/dist/tls/stealth/engine.js +152 -30
  120. package/dist/tls/stealth/engine.js.map +1 -1
  121. package/dist/tls/stealth/handshake.d.ts +2 -1
  122. package/dist/tls/stealth/handshake.d.ts.map +1 -1
  123. package/dist/tls/stealth/handshake.js +118 -5
  124. package/dist/tls/stealth/handshake.js.map +1 -1
  125. package/dist/tls/stealth/tls12-handshake.d.ts +14 -0
  126. package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -0
  127. package/dist/tls/stealth/tls12-handshake.js +462 -0
  128. package/dist/tls/stealth/tls12-handshake.js.map +1 -0
  129. package/dist/tls/types.d.ts +16 -0
  130. package/dist/tls/types.d.ts.map +1 -1
  131. package/dist/utils/encoding.d.ts +8 -6
  132. package/dist/utils/encoding.d.ts.map +1 -1
  133. package/dist/utils/encoding.js +92 -24
  134. package/dist/utils/encoding.js.map +1 -1
  135. package/dist/utils/happy-eyeballs.d.ts +3 -0
  136. package/dist/utils/happy-eyeballs.d.ts.map +1 -1
  137. package/dist/utils/happy-eyeballs.js +42 -2
  138. package/dist/utils/happy-eyeballs.js.map +1 -1
  139. package/dist/ws/client.d.ts +3 -0
  140. package/dist/ws/client.d.ts.map +1 -1
  141. package/dist/ws/client.js +63 -7
  142. package/dist/ws/client.js.map +1 -1
  143. package/dist/ws/frame.d.ts +4 -2
  144. package/dist/ws/frame.d.ts.map +1 -1
  145. package/dist/ws/frame.js +8 -5
  146. package/dist/ws/frame.js.map +1 -1
  147. package/dist/ws/permessage-deflate.d.ts +58 -0
  148. package/dist/ws/permessage-deflate.d.ts.map +1 -0
  149. package/dist/ws/permessage-deflate.js +148 -0
  150. package/dist/ws/permessage-deflate.js.map +1 -0
  151. package/package.json +2 -2
@@ -0,0 +1,462 @@
1
+ import { createHash, createHmac, createECDH, createVerify, X509Certificate, createCipheriv, createDecipheriv } from "node:crypto";
2
+ import { rootCertificates } from "node:tls";
3
+ import { BufferReader } from "../../utils/buffer-reader.js";
4
+ import { BufferWriter } from "../../utils/buffer-writer.js";
5
+ import { RecordType, HandshakeType, ProtocolVersion, AlertDescription, SignatureScheme } from "../constants.js";
6
+ import { TLSError } from "../../core/errors.js";
7
+ import { readRecord, writeRecord } from "./record-layer.js";
8
+ import { verifyPinnedPublicKey } from "../pin-verification.js";
9
+ function tls12CipherInfo(suite) {
10
+ switch (suite) {
11
+ case 0xc02f:
12
+ return { kx: "ECDHE", auth: "RSA", aead: "aes-128-gcm", hash: "sha256", keyLen: 16, ivLen: 4, isAEAD: true };
13
+ case 0xc030:
14
+ return { kx: "ECDHE", auth: "RSA", aead: "aes-256-gcm", hash: "sha384", keyLen: 32, ivLen: 4, isAEAD: true };
15
+ case 0xc02b:
16
+ return { kx: "ECDHE", auth: "ECDSA", aead: "aes-128-gcm", hash: "sha256", keyLen: 16, ivLen: 4, isAEAD: true };
17
+ case 0xc02c:
18
+ return { kx: "ECDHE", auth: "ECDSA", aead: "aes-256-gcm", hash: "sha384", keyLen: 32, ivLen: 4, isAEAD: true };
19
+ case 0xcca8:
20
+ return { kx: "ECDHE", auth: "RSA", aead: "chacha20-poly1305", hash: "sha256", keyLen: 32, ivLen: 12, isAEAD: true };
21
+ case 0xcca9:
22
+ return { kx: "ECDHE", auth: "ECDSA", aead: "chacha20-poly1305", hash: "sha256", keyLen: 32, ivLen: 12, isAEAD: true };
23
+ default:
24
+ return null;
25
+ }
26
+ }
27
+ function tls12CipherName(suite) {
28
+ switch (suite) {
29
+ case 0xc02f:
30
+ return "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
31
+ case 0xc030:
32
+ return "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384";
33
+ case 0xc02b:
34
+ return "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256";
35
+ case 0xc02c:
36
+ return "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384";
37
+ case 0xcca8:
38
+ return "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256";
39
+ case 0xcca9:
40
+ return "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256";
41
+ default:
42
+ return "unknown";
43
+ }
44
+ }
45
+ function pHash(alg, secret, seed, length) {
46
+ const result = Buffer.alloc(length);
47
+ let a = seed;
48
+ let offset = 0;
49
+ while (offset < length) {
50
+ a = Buffer.from(createHmac(alg, secret).update(a).digest());
51
+ const output = Buffer.from(createHmac(alg, secret)
52
+ .update(Buffer.concat([a, seed]))
53
+ .digest());
54
+ const toCopy = Math.min(output.length, length - offset);
55
+ output.copy(result, offset, 0, toCopy);
56
+ offset += toCopy;
57
+ }
58
+ return result;
59
+ }
60
+ function tls12PRF(alg, secret, label, seed, length) {
61
+ const labelBuf = Buffer.from(label, "ascii");
62
+ const fullSeed = Buffer.concat([labelBuf, seed]);
63
+ return pHash(alg, secret, fullSeed, length);
64
+ }
65
+ const CURVE_NIDS = {
66
+ 0x0017: "prime256v1",
67
+ 0x0018: "secp384r1",
68
+ 0x0019: "secp521r1",
69
+ };
70
+ function parseServerKeyExchange(body) {
71
+ const r = new BufferReader(body);
72
+ const curveType = r.readUInt8();
73
+ if (curveType !== 3)
74
+ throw new TLSError("Expected named_curve in ServerKeyExchange");
75
+ const paramsStart = 0;
76
+ const curveId = r.readUInt16();
77
+ const pubLen = r.readUInt8();
78
+ const serverPublicKey = Buffer.from(r.readBytes(pubLen));
79
+ const signedParams = body.subarray(paramsStart, r.position);
80
+ const signatureScheme = r.readUInt16();
81
+ const sigLen = r.readUInt16();
82
+ const signature = Buffer.from(r.readBytes(sigLen));
83
+ return { curveId, serverPublicKey, signatureScheme, signature, signedParams };
84
+ }
85
+ function parseTLS12CertificateMessage(body) {
86
+ const r = new BufferReader(body);
87
+ const certs = [];
88
+ const listLen = (r.readUInt8() << 16) | (r.readUInt8() << 8) | r.readUInt8();
89
+ const listEnd = r.position + listLen;
90
+ while (r.position < listEnd) {
91
+ const certLen = (r.readUInt8() << 16) | (r.readUInt8() << 8) | r.readUInt8();
92
+ const certData = Buffer.from(r.readBytes(certLen));
93
+ certs.push(certData);
94
+ }
95
+ return certs;
96
+ }
97
+ function verifyCertificateChain(certs, hostname) {
98
+ if (certs.length === 0)
99
+ throw new TLSError("Server sent empty certificate chain");
100
+ const x509Certs = certs.map((der) => new X509Certificate(der));
101
+ const leafCert = x509Certs[0];
102
+ if (!leafCert.checkHost(hostname))
103
+ throw new TLSError(`Certificate hostname mismatch: expected ${hostname}`, AlertDescription.BAD_CERTIFICATE);
104
+ const now = new Date();
105
+ if (now < new Date(leafCert.validFrom) || now > new Date(leafCert.validTo))
106
+ throw new TLSError("Certificate has expired or is not yet valid", AlertDescription.CERTIFICATE_EXPIRED);
107
+ const trustedRoots = rootCertificates.map((pem) => new X509Certificate(pem));
108
+ for (let i = 0; i < x509Certs.length - 1; i++) {
109
+ const cert = x509Certs[i];
110
+ const issuer = x509Certs[i + 1];
111
+ if (!cert.checkIssued(issuer))
112
+ throw new TLSError("Certificate chain verification failed: issuer mismatch", AlertDescription.UNKNOWN_CA);
113
+ }
114
+ const topCert = x509Certs[x509Certs.length - 1];
115
+ const isTrusted = trustedRoots.some((root) => {
116
+ try {
117
+ return topCert.checkIssued(root) || topCert.fingerprint === root.fingerprint;
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ });
123
+ const leafTrusted = trustedRoots.some((root) => {
124
+ try {
125
+ return leafCert.fingerprint === root.fingerprint;
126
+ }
127
+ catch {
128
+ return false;
129
+ }
130
+ });
131
+ if (!isTrusted && !leafTrusted)
132
+ throw new TLSError("Certificate chain does not terminate at a trusted root CA", AlertDescription.UNKNOWN_CA);
133
+ }
134
+ function socketWrite(socket, data) {
135
+ return new Promise((resolve, reject) => {
136
+ socket.write(data, (err) => {
137
+ if (err)
138
+ reject(new TLSError(err.message));
139
+ else
140
+ resolve();
141
+ });
142
+ });
143
+ }
144
+ function readHandshakeRecord(socket) {
145
+ return new Promise((resolve, reject) => {
146
+ let buffer = Buffer.alloc(0);
147
+ let settled = false;
148
+ const onData = (chunk) => {
149
+ buffer = Buffer.concat([buffer, chunk]);
150
+ tryParse();
151
+ };
152
+ const onError = (err) => {
153
+ if (!settled) {
154
+ settled = true;
155
+ cleanup();
156
+ reject(new TLSError(err.message));
157
+ }
158
+ };
159
+ const onClose = () => {
160
+ if (!settled) {
161
+ settled = true;
162
+ cleanup();
163
+ reject(new TLSError("Connection closed during handshake"));
164
+ }
165
+ };
166
+ const cleanup = () => {
167
+ socket.removeListener("data", onData);
168
+ socket.removeListener("error", onError);
169
+ socket.removeListener("close", onClose);
170
+ };
171
+ const tryParse = () => {
172
+ const result = readRecord(buffer, 0);
173
+ if (result) {
174
+ settled = true;
175
+ cleanup();
176
+ if (result.bytesRead < buffer.length)
177
+ socket.unshift(buffer.subarray(result.bytesRead));
178
+ resolve(result.record);
179
+ }
180
+ };
181
+ socket.on("data", onData);
182
+ socket.once("error", onError);
183
+ socket.once("close", onClose);
184
+ tryParse();
185
+ });
186
+ }
187
+ const AEAD_TAG_SIZE = 16;
188
+ function buildGCMNonce(implicitIV, explicitNonce) {
189
+ return Buffer.concat([implicitIV, explicitNonce]);
190
+ }
191
+ function buildChaCha20Nonce(iv, seqNum) {
192
+ const nonce = Buffer.from(iv);
193
+ const seqBuf = Buffer.alloc(8);
194
+ seqBuf.writeBigUInt64BE(seqNum);
195
+ for (let i = 0; i < 8; i++) {
196
+ nonce[nonce.length - 8 + i] ^= seqBuf[i];
197
+ }
198
+ return nonce;
199
+ }
200
+ function buildTLS12AAD(seqNum, contentType, version, length) {
201
+ const aad = Buffer.alloc(13);
202
+ aad.writeBigUInt64BE(seqNum, 0);
203
+ aad[8] = contentType;
204
+ aad.writeUInt16BE(version, 9);
205
+ aad.writeUInt16BE(length, 11);
206
+ return aad;
207
+ }
208
+ function createTLS12RecordCrypto(aead, key, iv) {
209
+ const isChaCha = aead === "chacha20-poly1305";
210
+ return {
211
+ encrypt(seqNum, contentType, plaintext) {
212
+ let nonce;
213
+ let prefix;
214
+ if (isChaCha) {
215
+ nonce = buildChaCha20Nonce(iv, seqNum);
216
+ prefix = Buffer.alloc(0);
217
+ }
218
+ else {
219
+ const explicitNonce = Buffer.alloc(8);
220
+ explicitNonce.writeBigUInt64BE(seqNum);
221
+ nonce = buildGCMNonce(iv, explicitNonce);
222
+ prefix = explicitNonce;
223
+ }
224
+ const aad = buildTLS12AAD(seqNum, contentType, ProtocolVersion.TLS_1_2, plaintext.length);
225
+ const cipher = createCipheriv(aead, key, nonce, { authTagLength: AEAD_TAG_SIZE });
226
+ cipher.setAAD(aad);
227
+ const encrypted = cipher.update(plaintext);
228
+ const final = cipher.final();
229
+ const tag = cipher.getAuthTag();
230
+ return Buffer.concat([prefix, encrypted, final, tag]);
231
+ },
232
+ decrypt(seqNum, contentType, ciphertext) {
233
+ let nonce;
234
+ let encData;
235
+ if (isChaCha) {
236
+ nonce = buildChaCha20Nonce(iv, seqNum);
237
+ encData = ciphertext;
238
+ }
239
+ else {
240
+ if (ciphertext.length < 8 + AEAD_TAG_SIZE)
241
+ throw new TLSError("TLS 1.2 record too short for GCM");
242
+ const explicitNonce = ciphertext.subarray(0, 8);
243
+ nonce = buildGCMNonce(iv, explicitNonce);
244
+ encData = ciphertext.subarray(8);
245
+ }
246
+ if (encData.length < AEAD_TAG_SIZE)
247
+ throw new TLSError("TLS 1.2 record too short for AEAD tag");
248
+ const encryptedData = encData.subarray(0, encData.length - AEAD_TAG_SIZE);
249
+ const tag = encData.subarray(encData.length - AEAD_TAG_SIZE);
250
+ const plaintextLen = encryptedData.length;
251
+ const aad = buildTLS12AAD(seqNum, contentType, ProtocolVersion.TLS_1_2, plaintextLen);
252
+ const decipher = createDecipheriv(aead, key, nonce, { authTagLength: AEAD_TAG_SIZE });
253
+ decipher.setAAD(aad);
254
+ decipher.setAuthTag(tag);
255
+ try {
256
+ const decrypted = decipher.update(encryptedData);
257
+ const final = decipher.final();
258
+ return Buffer.concat([decrypted, final]);
259
+ }
260
+ catch {
261
+ throw new TLSError("TLS 1.2 AEAD decryption failed");
262
+ }
263
+ },
264
+ };
265
+ }
266
+ function verifyServerKeyExchange(params, serverPublicKeyObj, clientRandom, serverRandom) {
267
+ const sigAlg = signatureAlgorithmForScheme(params.signatureScheme);
268
+ if (!sigAlg)
269
+ throw new TLSError(`Unsupported signature scheme in ServerKeyExchange: 0x${params.signatureScheme.toString(16)}`);
270
+ const signedData = Buffer.concat([clientRandom, serverRandom, params.signedParams]);
271
+ const verifier = createVerify(sigAlg.algorithm || "SHA256");
272
+ verifier.update(signedData);
273
+ const verifyOptions = { key: serverPublicKeyObj };
274
+ if (sigAlg.padding !== undefined) {
275
+ verifyOptions.padding = sigAlg.padding;
276
+ verifyOptions.saltLength = sigAlg.saltLength;
277
+ }
278
+ if (!verifier.verify(verifyOptions, params.signature)) {
279
+ throw new TLSError("ServerKeyExchange signature verification failed");
280
+ }
281
+ }
282
+ function signatureAlgorithmForScheme(scheme) {
283
+ switch (scheme) {
284
+ case SignatureScheme.ECDSA_SECP256R1_SHA256:
285
+ return { algorithm: "SHA256" };
286
+ case SignatureScheme.ECDSA_SECP384R1_SHA384:
287
+ return { algorithm: "SHA384" };
288
+ case SignatureScheme.ECDSA_SECP521R1_SHA512:
289
+ return { algorithm: "SHA512" };
290
+ case SignatureScheme.RSA_PSS_RSAE_SHA256:
291
+ case SignatureScheme.RSA_PSS_PSS_SHA256:
292
+ return { algorithm: "SHA256", padding: 6, saltLength: 32 };
293
+ case SignatureScheme.RSA_PSS_RSAE_SHA384:
294
+ case SignatureScheme.RSA_PSS_PSS_SHA384:
295
+ return { algorithm: "SHA384", padding: 6, saltLength: 48 };
296
+ case SignatureScheme.RSA_PSS_RSAE_SHA512:
297
+ case SignatureScheme.RSA_PSS_PSS_SHA512:
298
+ return { algorithm: "SHA512", padding: 6, saltLength: 64 };
299
+ case SignatureScheme.RSA_PKCS1_SHA256:
300
+ return { algorithm: "SHA256" };
301
+ case SignatureScheme.RSA_PKCS1_SHA384:
302
+ return { algorithm: "SHA384" };
303
+ case SignatureScheme.RSA_PKCS1_SHA512:
304
+ return { algorithm: "SHA512" };
305
+ case SignatureScheme.RSA_PKCS1_SHA1:
306
+ return { algorithm: "SHA1" };
307
+ default:
308
+ return null;
309
+ }
310
+ }
311
+ export async function performTLS12Handshake(socket, ctx, handshakeMessages) {
312
+ const info = tls12CipherInfo(ctx.cipherSuite);
313
+ if (!info)
314
+ throw new TLSError(`Unsupported TLS 1.2 cipher suite: 0x${ctx.cipherSuite.toString(16)}`);
315
+ const prfAlg = info.hash;
316
+ let serverCertificates = [];
317
+ let serverPublicKeyObj = null;
318
+ let ecdhParams = null;
319
+ let gotServerHelloDone = false;
320
+ const allHandshakeMessages = [...handshakeMessages];
321
+ while (!gotServerHelloDone) {
322
+ const record = await readHandshakeRecord(socket);
323
+ if (record.type === RecordType.ALERT) {
324
+ const desc = record.fragment.length >= 2 ? record.fragment[1] : 0;
325
+ throw new TLSError(`Server alert during TLS 1.2 handshake: ${desc}`, desc);
326
+ }
327
+ if (record.type !== RecordType.HANDSHAKE) {
328
+ throw new TLSError(`Unexpected record type in TLS 1.2 handshake: ${record.type}`);
329
+ }
330
+ let offset = 0;
331
+ while (offset < record.fragment.length) {
332
+ if (record.fragment.length - offset < 4)
333
+ break;
334
+ const msgType = record.fragment[offset];
335
+ const msgLen = (record.fragment[offset + 1] << 16) | (record.fragment[offset + 2] << 8) | record.fragment[offset + 3];
336
+ const msgEnd = offset + 4 + msgLen;
337
+ if (msgEnd > record.fragment.length)
338
+ break;
339
+ const fullMsg = record.fragment.subarray(offset, msgEnd);
340
+ allHandshakeMessages.push(Buffer.from(fullMsg));
341
+ const msgBody = record.fragment.subarray(offset + 4, msgEnd);
342
+ switch (msgType) {
343
+ case HandshakeType.CERTIFICATE: {
344
+ serverCertificates = parseTLS12CertificateMessage(msgBody);
345
+ if (serverCertificates.length > 0) {
346
+ const x509 = new X509Certificate(serverCertificates[0]);
347
+ serverPublicKeyObj = x509.publicKey;
348
+ }
349
+ if (!ctx.insecure) {
350
+ verifyCertificateChain(serverCertificates, ctx.hostname);
351
+ }
352
+ if (ctx.pinnedPublicKey && serverCertificates.length > 0) {
353
+ verifyPinnedPublicKey(serverCertificates[0], ctx.pinnedPublicKey);
354
+ }
355
+ break;
356
+ }
357
+ case 12: {
358
+ ecdhParams = parseServerKeyExchange(msgBody);
359
+ if (!ctx.insecure && serverPublicKeyObj) {
360
+ verifyServerKeyExchange(ecdhParams, serverPublicKeyObj, ctx.clientRandom, ctx.serverRandom);
361
+ }
362
+ break;
363
+ }
364
+ case 14: {
365
+ gotServerHelloDone = true;
366
+ break;
367
+ }
368
+ default:
369
+ break;
370
+ }
371
+ offset = msgEnd;
372
+ }
373
+ }
374
+ if (!ecdhParams)
375
+ throw new TLSError("Server did not send ServerKeyExchange");
376
+ const curveName = CURVE_NIDS[ecdhParams.curveId];
377
+ if (!curveName)
378
+ throw new TLSError(`Unsupported curve in ServerKeyExchange: 0x${ecdhParams.curveId.toString(16)}`);
379
+ const ecdh = createECDH(curveName);
380
+ ecdh.generateKeys();
381
+ const clientPubKey = Buffer.from(ecdh.getPublicKey());
382
+ const preMasterSecret = Buffer.from(ecdh.computeSecret(ecdhParams.serverPublicKey));
383
+ const ckeBody = new BufferWriter(1 + clientPubKey.length);
384
+ ckeBody.writeUInt8(clientPubKey.length);
385
+ ckeBody.writeBytes(clientPubKey);
386
+ const ckeMsg = wrapHandshakeMessage(16, ckeBody.toBuffer());
387
+ allHandshakeMessages.push(ckeMsg);
388
+ const ckeRecord = writeRecord(RecordType.HANDSHAKE, ProtocolVersion.TLS_1_2, ckeMsg);
389
+ await socketWrite(socket, ckeRecord);
390
+ const seed = Buffer.concat([ctx.clientRandom, ctx.serverRandom]);
391
+ const masterSecret = tls12PRF(prfAlg, preMasterSecret, "master secret", seed, 48);
392
+ const keyBlockLen = (info.keyLen + info.ivLen) * 2;
393
+ const keySeed = Buffer.concat([ctx.serverRandom, ctx.clientRandom]);
394
+ const keyBlock = tls12PRF(prfAlg, masterSecret, "key expansion", keySeed, keyBlockLen);
395
+ let kbOffset = 0;
396
+ const clientWriteKey = keyBlock.subarray(kbOffset, kbOffset + info.keyLen);
397
+ kbOffset += info.keyLen;
398
+ const serverWriteKey = keyBlock.subarray(kbOffset, kbOffset + info.keyLen);
399
+ kbOffset += info.keyLen;
400
+ const clientWriteIV = keyBlock.subarray(kbOffset, kbOffset + info.ivLen);
401
+ kbOffset += info.ivLen;
402
+ const serverWriteIV = keyBlock.subarray(kbOffset, kbOffset + info.ivLen);
403
+ const ccsRecord = writeRecord(RecordType.CHANGE_CIPHER_SPEC, ProtocolVersion.TLS_1_2, Buffer.from([1]));
404
+ await socketWrite(socket, ccsRecord);
405
+ const clientCrypto = createTLS12RecordCrypto(info.aead, clientWriteKey, clientWriteIV);
406
+ const transcriptForFinished = Buffer.concat(allHandshakeMessages);
407
+ const transcriptHash = createHash(prfAlg).update(transcriptForFinished).digest();
408
+ const clientVerifyData = tls12PRF(prfAlg, masterSecret, "client finished", transcriptHash, 12);
409
+ const finishedMsg = wrapHandshakeMessage(HandshakeType.FINISHED, clientVerifyData);
410
+ allHandshakeMessages.push(finishedMsg);
411
+ const encryptedFinished = clientCrypto.encrypt(0n, RecordType.HANDSHAKE, finishedMsg);
412
+ const finishedRecord = writeRecord(RecordType.APPLICATION_DATA, ProtocolVersion.TLS_1_2, encryptedFinished);
413
+ await socketWrite(socket, finishedRecord);
414
+ let serverSeq = 0n;
415
+ const serverCrypto = createTLS12RecordCrypto(info.aead, serverWriteKey, serverWriteIV);
416
+ let gotServerFinished = false;
417
+ while (!gotServerFinished) {
418
+ const record = await readHandshakeRecord(socket);
419
+ if (record.type === RecordType.CHANGE_CIPHER_SPEC) {
420
+ continue;
421
+ }
422
+ if (record.type === RecordType.ALERT) {
423
+ const desc = record.fragment.length >= 2 ? record.fragment[1] : 0;
424
+ throw new TLSError(`Server alert: ${desc}`, desc);
425
+ }
426
+ if (record.type === RecordType.APPLICATION_DATA) {
427
+ const plaintext = serverCrypto.decrypt(serverSeq++, RecordType.HANDSHAKE, record.fragment);
428
+ if (plaintext.length < 4)
429
+ throw new TLSError("Malformed server Finished");
430
+ const msgType = plaintext[0];
431
+ if (msgType !== HandshakeType.FINISHED)
432
+ throw new TLSError("Expected server Finished");
433
+ const serverVerifyData = plaintext.subarray(4);
434
+ const serverTranscriptHash = createHash(prfAlg).update(Buffer.concat(allHandshakeMessages)).digest();
435
+ const expectedServerVerify = tls12PRF(prfAlg, masterSecret, "server finished", serverTranscriptHash, 12);
436
+ if (!serverVerifyData.equals(expectedServerVerify)) {
437
+ throw new TLSError("Server Finished verify_data mismatch");
438
+ }
439
+ gotServerFinished = true;
440
+ }
441
+ }
442
+ return {
443
+ alpnProtocol: null,
444
+ cipher: tls12CipherName(ctx.cipherSuite),
445
+ version: "TLSv1.2",
446
+ clientKey: Buffer.from(clientWriteKey),
447
+ clientIV: Buffer.from(clientWriteIV),
448
+ serverKey: Buffer.from(serverWriteKey),
449
+ serverIV: Buffer.from(serverWriteIV),
450
+ aead: info.aead,
451
+ };
452
+ }
453
+ function wrapHandshakeMessage(type, body) {
454
+ const msg = Buffer.alloc(4 + body.length);
455
+ msg[0] = type;
456
+ msg[1] = (body.length >> 16) & 0xff;
457
+ msg[2] = (body.length >> 8) & 0xff;
458
+ msg[3] = body.length & 0xff;
459
+ body.copy(msg, 4);
460
+ return msg;
461
+ }
462
+ //# sourceMappingURL=tls12-handshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls12-handshake.js","sourceRoot":"","sources":["../../../src/tls/stealth/tls12-handshake.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,15 @@ export interface TLSConnectOptions {
33
33
  passphrase?: string;
34
34
  pfx?: string | Buffer;
35
35
  ca?: string | Buffer | Array<string | Buffer>;
36
+ /** Raw ECHConfigList (RFC draft-ietf-tls-esni) for Encrypted Client Hello. */
37
+ echConfigList?: Buffer;
38
+ /**
39
+ * Pin the server's public key by SHA-256 hash of the SPKI (Subject Public
40
+ * Key Info). Format: `"sha256//base64hash"`. Accepts a single pin or an
41
+ * array of pins; the connection succeeds if **any** pin matches the leaf
42
+ * certificate. Modelled after curl's `--pinnedpubkey`.
43
+ */
44
+ pinnedPublicKey?: string | string[];
36
45
  }
37
46
  /**
38
47
  * Metadata describing a successfully negotiated TLS connection.
@@ -48,6 +57,7 @@ export interface TLSConnectionInfo {
48
57
  alpnProtocol: string | null;
49
58
  cipher: string;
50
59
  ja3Hash?: string;
60
+ resumed?: boolean;
51
61
  }
52
62
  /**
53
63
  * A duplex stream representing an established TLS connection. Extends
@@ -86,5 +96,11 @@ export interface TLSOptions {
86
96
  passphrase?: string;
87
97
  pfx?: string | Buffer;
88
98
  ca?: string | Buffer | Array<string | Buffer>;
99
+ /**
100
+ * Pin the server's public key by SHA-256 hash of the SPKI (Subject Public
101
+ * Key Info). Format: `"sha256//base64hash"`. Accepts a single pin or an
102
+ * array of pins; the connection succeeds if **any** pin matches.
103
+ */
104
+ pinnedPublicKey?: string | string[];
89
105
  }
90
106
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tls/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC/C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAU,SAAQ,MAAM;IACvC,cAAc,EAAE,iBAAiB,CAAC;IAClC,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACnF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC/C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tls/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAU,SAAQ,MAAM;IACvC,cAAc,EAAE,iBAAiB,CAAC;IAClC,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACnF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACrC"}
@@ -6,10 +6,10 @@ import { Transform } from "node:stream";
6
6
  */
7
7
  export declare const supportsZstd: boolean;
8
8
  /**
9
- * Decompresses a response body buffer using the algorithm indicated by
10
- * `contentEncoding`. Supports `gzip`, `x-gzip`, `deflate`, `br` (Brotli),
11
- * `zstd` (when available), and `identity`. Unrecognized encodings are
12
- * returned as-is.
9
+ * Decompresses a response body buffer handling potentially multiple
10
+ * Content-Encoding layers (e.g. `"gzip, br"`). Layers are applied in
11
+ * reverse order per RFC 9110 §8.4. Throws if the number of layers
12
+ * exceeds {@link MAX_CONTENT_ENCODING_LAYERS}.
13
13
  *
14
14
  * @param {Buffer} body - Raw compressed body bytes.
15
15
  * @param {string | undefined} contentEncoding - Value of the `Content-Encoding` header.
@@ -18,8 +18,10 @@ export declare const supportsZstd: boolean;
18
18
  export declare function decompressBody(body: Buffer, contentEncoding: string | undefined): Promise<Buffer>;
19
19
  /**
20
20
  * Creates a Node.js `Transform` stream that decompresses data on-the-fly
21
- * using the algorithm indicated by `contentEncoding`. Returns `null` when
22
- * no transform is needed (unknown or `identity` encoding).
21
+ * using the algorithm(s) indicated by `contentEncoding`. Supports multiple
22
+ * comma-separated encodings (e.g. `"gzip, br"`). Returns `null` when no
23
+ * transform is needed. Throws if the number of encoding layers exceeds
24
+ * {@link MAX_CONTENT_ENCODING_LAYERS}.
23
25
  *
24
26
  * @param {string | undefined} contentEncoding - Value of the `Content-Encoding` header.
25
27
  * @returns {Transform | null} Decompressor stream, or `null` if no decompression is required.
@@ -1 +1 @@
1
- {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAC;AASvD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAsC,CAAC;AAElE;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BvG;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CA8B5F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO5D"}
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAC;AASvD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAsC,CAAC;AAoDlE;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAWvG;AA8BD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAwC5F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO5D"}