nlcurl 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -140
- package/dist/cache/groups.d.ts +75 -0
- package/dist/cache/groups.d.ts.map +1 -0
- package/dist/cache/groups.js +118 -0
- package/dist/cache/groups.js.map +1 -0
- package/dist/cache/no-vary-search.d.ts +33 -0
- package/dist/cache/no-vary-search.d.ts.map +1 -0
- package/dist/cache/no-vary-search.js +148 -0
- package/dist/cache/no-vary-search.js.map +1 -0
- package/dist/cache/range.d.ts +120 -0
- package/dist/cache/range.d.ts.map +1 -0
- package/dist/cache/range.js +193 -0
- package/dist/cache/range.js.map +1 -0
- package/dist/cache/store.d.ts +111 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +414 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/types.d.ts +69 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +2 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/args.d.ts +4 -37
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.d.ts +0 -5
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +14 -20
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +14 -20
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +33 -31
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +69 -33
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +14 -16
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +30 -13
- package/dist/cookies/parser.js.map +1 -1
- package/dist/cookies/psl-data.d.ts +1 -1
- package/dist/cookies/psl-data.js +1 -1
- package/dist/cookies/public-suffix.d.ts +5 -27
- package/dist/cookies/public-suffix.d.ts.map +1 -1
- package/dist/cookies/public-suffix.js +5 -37
- package/dist/cookies/public-suffix.js.map +1 -1
- package/dist/core/auth.d.ts +30 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +34 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/client.d.ts +28 -40
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +34 -41
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -88
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +64 -88
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +63 -85
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +64 -59
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +70 -52
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +81 -70
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +198 -71
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +44 -42
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +47 -58
- package/dist/core/validation.js.map +1 -1
- package/dist/dns/cache.d.ts +59 -0
- package/dist/dns/cache.d.ts.map +1 -0
- package/dist/dns/cache.js +99 -0
- package/dist/dns/cache.js.map +1 -0
- package/dist/dns/codec.d.ts +39 -0
- package/dist/dns/codec.d.ts.map +1 -0
- package/dist/dns/codec.js +238 -0
- package/dist/dns/codec.js.map +1 -0
- package/dist/dns/doh-resolver.d.ts +38 -0
- package/dist/dns/doh-resolver.d.ts.map +1 -0
- package/dist/dns/doh-resolver.js +191 -0
- package/dist/dns/doh-resolver.js.map +1 -0
- package/dist/dns/dot-resolver.d.ts +89 -0
- package/dist/dns/dot-resolver.d.ts.map +1 -0
- package/dist/dns/dot-resolver.js +158 -0
- package/dist/dns/dot-resolver.js.map +1 -0
- package/dist/dns/https-rr.d.ts +40 -0
- package/dist/dns/https-rr.d.ts.map +1 -0
- package/dist/dns/https-rr.js +109 -0
- package/dist/dns/https-rr.js.map +1 -0
- package/dist/dns/types.d.ts +82 -0
- package/dist/dns/types.d.ts.map +1 -0
- package/dist/dns/types.js +23 -0
- package/dist/dns/types.js.map +1 -0
- package/dist/fingerprints/akamai.d.ts +3 -11
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -11
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +6 -14
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +6 -14
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts +56 -71
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +58 -71
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +12 -30
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -30
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/ja4.d.ts +18 -0
- package/dist/fingerprints/ja4.d.ts.map +1 -0
- package/dist/fingerprints/ja4.js +83 -0
- package/dist/fingerprints/ja4.js.map +1 -0
- package/dist/fingerprints/profiles/chrome.d.ts +18 -21
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +35 -31
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +7 -10
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +7 -10
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +8 -11
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +8 -11
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +11 -14
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +11 -14
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +5 -8
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +5 -8
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +42 -73
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/hsts/store.d.ts +39 -0
- package/dist/hsts/store.d.ts.map +1 -0
- package/dist/hsts/store.js +163 -0
- package/dist/hsts/store.js.map +1 -0
- package/dist/hsts/types.d.ts +24 -0
- package/dist/hsts/types.d.ts.map +1 -0
- package/dist/hsts/types.js +2 -0
- package/dist/hsts/types.js.map +1 -0
- package/dist/http/alt-svc.d.ts +67 -0
- package/dist/http/alt-svc.d.ts.map +1 -0
- package/dist/http/alt-svc.js +186 -0
- package/dist/http/alt-svc.js.map +1 -0
- package/dist/http/early-hints.d.ts +23 -0
- package/dist/http/early-hints.d.ts.map +1 -0
- package/dist/http/early-hints.js +33 -0
- package/dist/http/early-hints.js.map +1 -0
- package/dist/http/form-data.d.ts +17 -35
- package/dist/http/form-data.d.ts.map +1 -1
- package/dist/http/form-data.js +12 -34
- package/dist/http/form-data.js.map +1 -1
- package/dist/http/h1/client.d.ts +14 -26
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +29 -22
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +10 -17
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +10 -17
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +22 -59
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +15 -47
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +18 -59
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +29 -64
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +53 -84
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +48 -76
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts +16 -35
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +16 -35
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/h3/detection.d.ts +15 -0
- package/dist/http/h3/detection.d.ts.map +1 -0
- package/dist/http/h3/detection.js +41 -0
- package/dist/http/h3/detection.js.map +1 -0
- package/dist/http/negotiator.d.ts +43 -33
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +99 -41
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +34 -64
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +22 -41
- package/dist/http/pool.js.map +1 -1
- package/dist/http/resumable-upload.d.ts +76 -0
- package/dist/http/resumable-upload.d.ts.map +1 -0
- package/dist/http/resumable-upload.js +104 -0
- package/dist/http/resumable-upload.js.map +1 -0
- package/dist/http/trailers.d.ts +29 -0
- package/dist/http/trailers.d.ts.map +1 -0
- package/dist/http/trailers.js +57 -0
- package/dist/http/trailers.js.map +1 -0
- package/dist/index.d.ts +36 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/interceptor.d.ts +13 -32
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js +11 -16
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts +8 -17
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +15 -12
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry-after.d.ts +15 -0
- package/dist/middleware/retry-after.d.ts.map +1 -0
- package/dist/middleware/retry-after.js +36 -0
- package/dist/middleware/retry-after.js.map +1 -0
- package/dist/middleware/retry.d.ts +9 -18
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +12 -9
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/auth.d.ts +73 -0
- package/dist/proxy/auth.d.ts.map +1 -0
- package/dist/proxy/auth.js +128 -0
- package/dist/proxy/auth.js.map +1 -0
- package/dist/proxy/env-proxy.d.ts +11 -0
- package/dist/proxy/env-proxy.d.ts.map +1 -0
- package/dist/proxy/env-proxy.js +56 -0
- package/dist/proxy/env-proxy.js.map +1 -0
- package/dist/proxy/http-proxy.d.ts +13 -18
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +24 -14
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +13 -20
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +6 -9
- package/dist/proxy/socks.js.map +1 -1
- package/dist/sse/parser.d.ts +47 -0
- package/dist/sse/parser.d.ts.map +1 -0
- package/dist/sse/parser.js +139 -0
- package/dist/sse/parser.js.map +1 -0
- package/dist/tls/constants.d.ts +15 -74
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +15 -74
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/ct.d.ts +78 -0
- package/dist/tls/ct.d.ts.map +1 -0
- package/dist/tls/ct.js +175 -0
- package/dist/tls/ct.js.map +1 -0
- package/dist/tls/early-data.d.ts +45 -0
- package/dist/tls/early-data.d.ts.map +1 -0
- package/dist/tls/early-data.js +46 -0
- package/dist/tls/early-data.js.map +1 -0
- package/dist/tls/ech.d.ts +130 -0
- package/dist/tls/ech.d.ts.map +1 -0
- package/dist/tls/ech.js +353 -0
- package/dist/tls/ech.js.map +1 -0
- package/dist/tls/keylog.d.ts +34 -0
- package/dist/tls/keylog.d.ts.map +1 -0
- package/dist/tls/keylog.js +64 -0
- package/dist/tls/keylog.js.map +1 -0
- package/dist/tls/node-engine.d.ts +15 -14
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +54 -14
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/ocsp.d.ts +55 -0
- package/dist/tls/ocsp.d.ts.map +1 -0
- package/dist/tls/ocsp.js +131 -0
- package/dist/tls/ocsp.js.map +1 -0
- package/dist/tls/pin-verification.d.ts +10 -0
- package/dist/tls/pin-verification.d.ts.map +1 -0
- package/dist/tls/pin-verification.js +28 -0
- package/dist/tls/pin-verification.js.map +1 -0
- package/dist/tls/session-cache.d.ts +58 -0
- package/dist/tls/session-cache.d.ts.map +1 -0
- package/dist/tls/session-cache.js +76 -0
- package/dist/tls/session-cache.js.map +1 -0
- package/dist/tls/stealth/client-hello.d.ts +34 -32
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +116 -11
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +5 -15
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +163 -47
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +23 -32
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +112 -27
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +59 -86
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +46 -58
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +52 -75
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +47 -63
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/stealth/tls12-handshake.d.ts +30 -0
- package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -0
- package/dist/tls/stealth/tls12-handshake.js +470 -0
- package/dist/tls/stealth/tls12-handshake.js.map +1 -0
- package/dist/tls/types.d.ts +46 -48
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts +26 -81
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js +26 -81
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts +30 -66
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +30 -66
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/compression.d.ts +18 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/compression.js +34 -0
- package/dist/utils/compression.js.map +1 -0
- package/dist/utils/dictionary-transport.d.ts +97 -0
- package/dist/utils/dictionary-transport.d.ts.map +1 -0
- package/dist/utils/dictionary-transport.js +171 -0
- package/dist/utils/dictionary-transport.js.map +1 -0
- package/dist/utils/encoding.d.ts +12 -28
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +77 -40
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/happy-eyeballs.d.ts +20 -7
- package/dist/utils/happy-eyeballs.d.ts.map +1 -1
- package/dist/utils/happy-eyeballs.js +57 -25
- package/dist/utils/happy-eyeballs.js.map +1 -1
- package/dist/utils/logger.d.ts +54 -81
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -64
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/tcp-fast-open.d.ts +30 -0
- package/dist/utils/tcp-fast-open.d.ts.map +1 -0
- package/dist/utils/tcp-fast-open.js +36 -0
- package/dist/utils/tcp-fast-open.js.map +1 -0
- package/dist/utils/url.d.ts +18 -25
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +18 -25
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +35 -52
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +92 -37
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +27 -42
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +25 -37
- package/dist/ws/frame.js.map +1 -1
- package/dist/ws/permessage-deflate.d.ts +53 -0
- package/dist/ws/permessage-deflate.d.ts.map +1 -0
- package/dist/ws/permessage-deflate.js +140 -0
- package/dist/ws/permessage-deflate.js.map +1 -0
- package/package.json +62 -62
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tls12-handshake.d.ts","sourceRoot":"","sources":["../../../src/tls/stealth/tls12-handshake.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAMhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAuVtD,6CAA6C;AAC7C,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAqKjJ"}
|
|
@@ -0,0 +1,470 @@
|
|
|
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
|
+
/**
|
|
312
|
+
* Complete a TLS 1.2 handshake using ECDHE key exchange.
|
|
313
|
+
*
|
|
314
|
+
* @param {net.Socket} socket - Connected TCP socket.
|
|
315
|
+
* @param {TLS12HandshakeContext} ctx - Handshake context from the ServerHello.
|
|
316
|
+
* @param {Buffer[]} handshakeMessages - Accumulated handshake messages so far.
|
|
317
|
+
* @returns {Promise<HandshakeResult>} Handshake result with negotiated keys and metadata.
|
|
318
|
+
*/
|
|
319
|
+
export async function performTLS12Handshake(socket, ctx, handshakeMessages) {
|
|
320
|
+
const info = tls12CipherInfo(ctx.cipherSuite);
|
|
321
|
+
if (!info)
|
|
322
|
+
throw new TLSError(`Unsupported TLS 1.2 cipher suite: 0x${ctx.cipherSuite.toString(16)}`);
|
|
323
|
+
const prfAlg = info.hash;
|
|
324
|
+
let serverCertificates = [];
|
|
325
|
+
let serverPublicKeyObj = null;
|
|
326
|
+
let ecdhParams = null;
|
|
327
|
+
let gotServerHelloDone = false;
|
|
328
|
+
const allHandshakeMessages = [...handshakeMessages];
|
|
329
|
+
while (!gotServerHelloDone) {
|
|
330
|
+
const record = await readHandshakeRecord(socket);
|
|
331
|
+
if (record.type === RecordType.ALERT) {
|
|
332
|
+
const desc = record.fragment.length >= 2 ? record.fragment[1] : 0;
|
|
333
|
+
throw new TLSError(`Server alert during TLS 1.2 handshake: ${desc}`, desc);
|
|
334
|
+
}
|
|
335
|
+
if (record.type !== RecordType.HANDSHAKE) {
|
|
336
|
+
throw new TLSError(`Unexpected record type in TLS 1.2 handshake: ${record.type}`);
|
|
337
|
+
}
|
|
338
|
+
let offset = 0;
|
|
339
|
+
while (offset < record.fragment.length) {
|
|
340
|
+
if (record.fragment.length - offset < 4)
|
|
341
|
+
break;
|
|
342
|
+
const msgType = record.fragment[offset];
|
|
343
|
+
const msgLen = (record.fragment[offset + 1] << 16) | (record.fragment[offset + 2] << 8) | record.fragment[offset + 3];
|
|
344
|
+
const msgEnd = offset + 4 + msgLen;
|
|
345
|
+
if (msgEnd > record.fragment.length)
|
|
346
|
+
break;
|
|
347
|
+
const fullMsg = record.fragment.subarray(offset, msgEnd);
|
|
348
|
+
allHandshakeMessages.push(Buffer.from(fullMsg));
|
|
349
|
+
const msgBody = record.fragment.subarray(offset + 4, msgEnd);
|
|
350
|
+
switch (msgType) {
|
|
351
|
+
case HandshakeType.CERTIFICATE: {
|
|
352
|
+
serverCertificates = parseTLS12CertificateMessage(msgBody);
|
|
353
|
+
if (serverCertificates.length > 0) {
|
|
354
|
+
const x509 = new X509Certificate(serverCertificates[0]);
|
|
355
|
+
serverPublicKeyObj = x509.publicKey;
|
|
356
|
+
}
|
|
357
|
+
if (!ctx.insecure) {
|
|
358
|
+
verifyCertificateChain(serverCertificates, ctx.hostname);
|
|
359
|
+
}
|
|
360
|
+
if (ctx.pinnedPublicKey && serverCertificates.length > 0) {
|
|
361
|
+
verifyPinnedPublicKey(serverCertificates[0], ctx.pinnedPublicKey);
|
|
362
|
+
}
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
case 12: {
|
|
366
|
+
ecdhParams = parseServerKeyExchange(msgBody);
|
|
367
|
+
if (!ctx.insecure && serverPublicKeyObj) {
|
|
368
|
+
verifyServerKeyExchange(ecdhParams, serverPublicKeyObj, ctx.clientRandom, ctx.serverRandom);
|
|
369
|
+
}
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
case 14: {
|
|
373
|
+
gotServerHelloDone = true;
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
default:
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
offset = msgEnd;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (!ecdhParams)
|
|
383
|
+
throw new TLSError("Server did not send ServerKeyExchange");
|
|
384
|
+
const curveName = CURVE_NIDS[ecdhParams.curveId];
|
|
385
|
+
if (!curveName)
|
|
386
|
+
throw new TLSError(`Unsupported curve in ServerKeyExchange: 0x${ecdhParams.curveId.toString(16)}`);
|
|
387
|
+
const ecdh = createECDH(curveName);
|
|
388
|
+
ecdh.generateKeys();
|
|
389
|
+
const clientPubKey = Buffer.from(ecdh.getPublicKey());
|
|
390
|
+
const preMasterSecret = Buffer.from(ecdh.computeSecret(ecdhParams.serverPublicKey));
|
|
391
|
+
const ckeBody = new BufferWriter(1 + clientPubKey.length);
|
|
392
|
+
ckeBody.writeUInt8(clientPubKey.length);
|
|
393
|
+
ckeBody.writeBytes(clientPubKey);
|
|
394
|
+
const ckeMsg = wrapHandshakeMessage(16, ckeBody.toBuffer());
|
|
395
|
+
allHandshakeMessages.push(ckeMsg);
|
|
396
|
+
const ckeRecord = writeRecord(RecordType.HANDSHAKE, ProtocolVersion.TLS_1_2, ckeMsg);
|
|
397
|
+
await socketWrite(socket, ckeRecord);
|
|
398
|
+
const seed = Buffer.concat([ctx.clientRandom, ctx.serverRandom]);
|
|
399
|
+
const masterSecret = tls12PRF(prfAlg, preMasterSecret, "master secret", seed, 48);
|
|
400
|
+
const keyBlockLen = (info.keyLen + info.ivLen) * 2;
|
|
401
|
+
const keySeed = Buffer.concat([ctx.serverRandom, ctx.clientRandom]);
|
|
402
|
+
const keyBlock = tls12PRF(prfAlg, masterSecret, "key expansion", keySeed, keyBlockLen);
|
|
403
|
+
let kbOffset = 0;
|
|
404
|
+
const clientWriteKey = keyBlock.subarray(kbOffset, kbOffset + info.keyLen);
|
|
405
|
+
kbOffset += info.keyLen;
|
|
406
|
+
const serverWriteKey = keyBlock.subarray(kbOffset, kbOffset + info.keyLen);
|
|
407
|
+
kbOffset += info.keyLen;
|
|
408
|
+
const clientWriteIV = keyBlock.subarray(kbOffset, kbOffset + info.ivLen);
|
|
409
|
+
kbOffset += info.ivLen;
|
|
410
|
+
const serverWriteIV = keyBlock.subarray(kbOffset, kbOffset + info.ivLen);
|
|
411
|
+
const ccsRecord = writeRecord(RecordType.CHANGE_CIPHER_SPEC, ProtocolVersion.TLS_1_2, Buffer.from([1]));
|
|
412
|
+
await socketWrite(socket, ccsRecord);
|
|
413
|
+
const clientCrypto = createTLS12RecordCrypto(info.aead, clientWriteKey, clientWriteIV);
|
|
414
|
+
const transcriptForFinished = Buffer.concat(allHandshakeMessages);
|
|
415
|
+
const transcriptHash = createHash(prfAlg).update(transcriptForFinished).digest();
|
|
416
|
+
const clientVerifyData = tls12PRF(prfAlg, masterSecret, "client finished", transcriptHash, 12);
|
|
417
|
+
const finishedMsg = wrapHandshakeMessage(HandshakeType.FINISHED, clientVerifyData);
|
|
418
|
+
allHandshakeMessages.push(finishedMsg);
|
|
419
|
+
const encryptedFinished = clientCrypto.encrypt(0n, RecordType.HANDSHAKE, finishedMsg);
|
|
420
|
+
const finishedRecord = writeRecord(RecordType.APPLICATION_DATA, ProtocolVersion.TLS_1_2, encryptedFinished);
|
|
421
|
+
await socketWrite(socket, finishedRecord);
|
|
422
|
+
let serverSeq = 0n;
|
|
423
|
+
const serverCrypto = createTLS12RecordCrypto(info.aead, serverWriteKey, serverWriteIV);
|
|
424
|
+
let gotServerFinished = false;
|
|
425
|
+
while (!gotServerFinished) {
|
|
426
|
+
const record = await readHandshakeRecord(socket);
|
|
427
|
+
if (record.type === RecordType.CHANGE_CIPHER_SPEC) {
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
if (record.type === RecordType.ALERT) {
|
|
431
|
+
const desc = record.fragment.length >= 2 ? record.fragment[1] : 0;
|
|
432
|
+
throw new TLSError(`Server alert: ${desc}`, desc);
|
|
433
|
+
}
|
|
434
|
+
if (record.type === RecordType.APPLICATION_DATA) {
|
|
435
|
+
const plaintext = serverCrypto.decrypt(serverSeq++, RecordType.HANDSHAKE, record.fragment);
|
|
436
|
+
if (plaintext.length < 4)
|
|
437
|
+
throw new TLSError("Malformed server Finished");
|
|
438
|
+
const msgType = plaintext[0];
|
|
439
|
+
if (msgType !== HandshakeType.FINISHED)
|
|
440
|
+
throw new TLSError("Expected server Finished");
|
|
441
|
+
const serverVerifyData = plaintext.subarray(4);
|
|
442
|
+
const serverTranscriptHash = createHash(prfAlg).update(Buffer.concat(allHandshakeMessages)).digest();
|
|
443
|
+
const expectedServerVerify = tls12PRF(prfAlg, masterSecret, "server finished", serverTranscriptHash, 12);
|
|
444
|
+
if (!serverVerifyData.equals(expectedServerVerify)) {
|
|
445
|
+
throw new TLSError("Server Finished verify_data mismatch");
|
|
446
|
+
}
|
|
447
|
+
gotServerFinished = true;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
alpnProtocol: null,
|
|
452
|
+
cipher: tls12CipherName(ctx.cipherSuite),
|
|
453
|
+
version: "TLSv1.2",
|
|
454
|
+
clientKey: Buffer.from(clientWriteKey),
|
|
455
|
+
clientIV: Buffer.from(clientWriteIV),
|
|
456
|
+
serverKey: Buffer.from(serverWriteKey),
|
|
457
|
+
serverIV: Buffer.from(serverWriteIV),
|
|
458
|
+
aead: info.aead,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function wrapHandshakeMessage(type, body) {
|
|
462
|
+
const msg = Buffer.alloc(4 + body.length);
|
|
463
|
+
msg[0] = type;
|
|
464
|
+
msg[1] = (body.length >> 16) & 0xff;
|
|
465
|
+
msg[2] = (body.length >> 8) & 0xff;
|
|
466
|
+
msg[3] = body.length & 0xff;
|
|
467
|
+
body.copy(msg, 4);
|
|
468
|
+
return msg;
|
|
469
|
+
}
|
|
470
|
+
//# 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":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAuC,MAAM,aAAa,CAAC;AACvK,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAI5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAY/D,SAAS,eAAe,CAAC,KAAa;IACpC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/G,KAAK,MAAM;YACT,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/G,KAAK,MAAM;YACT,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjH,KAAK,MAAM;YACT,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjH,KAAK,MAAM;YACT,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACtH,KAAK,MAAM;YACT,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACxH;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,uCAAuC,CAAC;QACjD,KAAK,MAAM;YACT,OAAO,uCAAuC,CAAC;QACjD,KAAK,MAAM;YACT,OAAO,yCAAyC,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,yCAAyC,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,6CAA6C,CAAC;QACvD,KAAK,MAAM;YACT,OAAO,+CAA+C,CAAC;QACzD;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,GAAW,EAAE,MAAc,EAAE,IAAY,EAAE,MAAc;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,MAAM,EAAE,CAAC;QACvB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;aACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;aAChC,MAAM,EAAE,CACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAwB,EAAE,MAAc,EAAE,KAAa,EAAE,IAAY,EAAE,MAAc;IACrG,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;CACpB,CAAC;AAUF,SAAS,sBAAsB,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,SAAS,KAAK,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,2CAA2C,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE5D,MAAM,eAAe,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAY;IAChD,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC;IACrC,OAAO,CAAC,CAAC,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAe,EAAE,QAAgB;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,qCAAqC,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,2CAA2C,QAAQ,EAAE,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC/I,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,6CAA6C,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IACpL,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,wDAAwD,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC3I,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACjD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,QAAQ,CAAC,2DAA2D,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC/I,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB,EAAE,IAAY;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,GAAG;gBAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;;gBACtC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YACxC,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,QAAQ,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM;oBAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBACxF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,aAAa,GAAG,EAAE,CAAC;AAOzB,SAAS,aAAa,CAAC,UAAkB,EAAE,aAAqB;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAU,EAAE,MAAc;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAE,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,WAAmB,EAAE,OAAe,EAAE,MAAc;IACzF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;IACrB,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9B,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAmB,EAAE,GAAW,EAAE,EAAU;IAC3E,MAAM,QAAQ,GAAG,IAAI,KAAK,mBAAmB,CAAC;IAE9C,OAAO;QACL,OAAO,CAAC,MAAc,EAAE,WAAmB,EAAE,SAAiB;YAC5D,IAAI,KAAa,CAAC;YAClB,IAAI,MAAc,CAAC;YAEnB,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACvC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtC,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACvC,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBACzC,MAAM,GAAG,aAAa,CAAC;YACzB,CAAC;YAED,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1F,MAAM,MAAM,GAAG,cAAc,CAAC,IAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;YACpG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,CAAC,MAAc,EAAE,WAAmB,EAAE,UAAkB;YAC7D,IAAI,KAAa,CAAC;YAClB,IAAI,OAAe,CAAC;YAEpB,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACvC,OAAO,GAAG,UAAU,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,aAAa;oBAAE,MAAM,IAAI,QAAQ,CAAC,kCAAkC,CAAC,CAAC;gBAClG,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChD,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBACzC,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,aAAa;gBAAE,MAAM,IAAI,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YAChG,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;YAE7D,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC;YAC1C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEtF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;YACxG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,QAAQ,CAAC,gCAAgC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAmB,EAAE,kBAA4E,EAAE,YAAoB,EAAE,YAAoB;IAC5K,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,wDAAwD,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAE/H,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;IAC5D,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE5B,MAAM,aAAa,GAA8D,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC;IAC7G,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACvC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,QAAQ,CAAC,iDAAiD,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAc;IACjD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,eAAe,CAAC,sBAAsB;YACzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,eAAe,CAAC,sBAAsB;YACzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,eAAe,CAAC,sBAAsB;YACzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,eAAe,CAAC,mBAAmB,CAAC;QACzC,KAAK,eAAe,CAAC,kBAAkB;YACrC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC7D,KAAK,eAAe,CAAC,mBAAmB,CAAC;QACzC,KAAK,eAAe,CAAC,kBAAkB;YACrC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC7D,KAAK,eAAe,CAAC,mBAAmB,CAAC;QACzC,KAAK,eAAe,CAAC,kBAAkB;YACrC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC7D,KAAK,eAAe,CAAC,gBAAgB;YACnC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,eAAe,CAAC,gBAAgB;YACnC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,eAAe,CAAC,gBAAgB;YACnC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,KAAK,eAAe,CAAC,cAAc;YACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/B;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAoBD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAkB,EAAE,GAA0B,EAAE,iBAA2B;IACrH,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,QAAQ,CAAC,uCAAuC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAErG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;IACzB,IAAI,kBAAkB,GAAa,EAAE,CAAC;IACtC,IAAI,kBAAkB,GAAoE,IAAI,CAAC;IAC/F,IAAI,UAAU,GAAuB,IAAI,CAAC;IAC1C,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,MAAM,oBAAoB,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAEpD,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,QAAQ,CAAC,0CAA0C,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,QAAQ,CAAC,gDAAgD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC;gBAAE,MAAM;YAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAE,CAAC;YACzC,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;YACzH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;YACnC,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAAE,MAAM;YAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAEhD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAE7D,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC/B,kBAAkB,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;oBAC3D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAC,CAAC;wBACzD,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC;oBACtC,CAAC;oBACD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;wBAClB,sBAAsB,CAAC,kBAAkB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC3D,CAAC;oBACD,IAAI,GAAG,CAAC,eAAe,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzD,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;oBACrE,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,EAAE,CAAC,CAAC,CAAC;oBACR,UAAU,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;oBAC7C,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;wBACxC,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC9F,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,EAAE,CAAC,CAAC,CAAC;oBACR,kBAAkB,GAAG,IAAI,CAAC;oBAC1B,MAAM;gBACR,CAAC;gBACD;oBACE,MAAM;YACV,CAAC;YAED,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,QAAQ,CAAC,uCAAuC,CAAC,CAAC;IAE7E,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,QAAQ,CAAC,6CAA6C,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEnH,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC,YAAY,EAAE,CAAC;IACpB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IAEpF,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrF,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAErC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAElF,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAEvF,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;IACxB,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;IACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;IACvB,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAEzE,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,kBAAkB,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAErC,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IAEvF,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,CAAC;IACjF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAE/F,MAAM,WAAW,GAAG,oBAAoB,CAAC,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACnF,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEvC,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACtF,MAAM,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC5G,MAAM,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAE1C,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACvF,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAClD,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE3F,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,QAAQ,CAAC,2BAA2B,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAC9B,IAAI,OAAO,KAAK,aAAa,CAAC,QAAQ;gBAAE,MAAM,IAAI,QAAQ,CAAC,0BAA0B,CAAC,CAAC;YACvF,MAAM,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE/C,MAAM,oBAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACrG,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,QAAQ,CAAC,sCAAsC,CAAC,CAAC;YAC7D,CAAC;YACD,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC;QACxC,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QACtC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QACtC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QACpC,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,IAAY;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACpC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACnC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/tls/types.d.ts
CHANGED
|
@@ -2,89 +2,87 @@ import type { Socket } from "node:net";
|
|
|
2
2
|
import type { Duplex } from "node:stream";
|
|
3
3
|
import type { BrowserProfile } from "../fingerprints/types.js";
|
|
4
4
|
import type { Logger } from "../utils/logger.js";
|
|
5
|
-
/**
|
|
6
|
-
* Options required to establish a TLS connection to a remote server.
|
|
7
|
-
*
|
|
8
|
-
* @typedef {Object} TLSConnectOptions
|
|
9
|
-
* @property {string} host - Remote hostname or IP address.
|
|
10
|
-
* @property {number} port - Remote TCP port.
|
|
11
|
-
* @property {Socket} [socket] - Pre-connected TCP socket to upgrade (e.g. after proxy CONNECT).
|
|
12
|
-
* @property {string} [servername] - TLS SNI hostname; defaults to `host`.
|
|
13
|
-
* @property {boolean} [insecure] - Skip TLS certificate verification when `true`.
|
|
14
|
-
* @property {string[]} [alpnProtocols] - ALPN protocol names to advertise (e.g. `['h2', 'http/1.1']`).
|
|
15
|
-
* @property {number} [timeout] - Handshake timeout in milliseconds.
|
|
16
|
-
* @property {AbortSignal} [signal] - Signal used to abort the connection attempt.
|
|
17
|
-
* @property {4|6} [family] - Force IPv4 (`4`) or IPv6 (`6`) for DNS resolution.
|
|
18
|
-
* @property {Logger} [logger] - Optional logger for diagnostic output.
|
|
19
|
-
*/
|
|
5
|
+
/** Options for establishing a TLS connection. */
|
|
20
6
|
export interface TLSConnectOptions {
|
|
7
|
+
/** Remote host name or IP address. */
|
|
21
8
|
host: string;
|
|
9
|
+
/** Remote port number. */
|
|
22
10
|
port: number;
|
|
11
|
+
/** Existing TCP socket to upgrade to TLS. */
|
|
23
12
|
socket?: Socket;
|
|
13
|
+
/** Server name for SNI extension. */
|
|
24
14
|
servername?: string;
|
|
15
|
+
/** Skip certificate verification. */
|
|
25
16
|
insecure?: boolean;
|
|
17
|
+
/** ALPN protocol identifiers to offer. */
|
|
26
18
|
alpnProtocols?: string[];
|
|
19
|
+
/** Connection timeout in milliseconds. */
|
|
27
20
|
timeout?: number;
|
|
21
|
+
/** Abort signal to cancel the connection. */
|
|
28
22
|
signal?: AbortSignal;
|
|
23
|
+
/** IP address family (`4` or `6`). */
|
|
29
24
|
family?: 4 | 6;
|
|
25
|
+
/** Logger instance for diagnostic output. */
|
|
30
26
|
logger?: Logger;
|
|
27
|
+
/** Client certificate in PEM or DER format. */
|
|
31
28
|
cert?: string | Buffer;
|
|
29
|
+
/** Private key for client certificate authentication. */
|
|
32
30
|
key?: string | Buffer;
|
|
31
|
+
/** Passphrase for encrypted private keys. */
|
|
33
32
|
passphrase?: string;
|
|
33
|
+
/** PKCS#12 / PFX certificate bundle. */
|
|
34
34
|
pfx?: string | Buffer;
|
|
35
|
+
/** Custom certificate authority chain. */
|
|
35
36
|
ca?: string | Buffer | Array<string | Buffer>;
|
|
37
|
+
/** ECH config list for Encrypted Client Hello. */
|
|
38
|
+
echConfigList?: Buffer;
|
|
39
|
+
/** Expected SPKI pin(s) for public-key pinning. */
|
|
40
|
+
pinnedPublicKey?: string | string[];
|
|
36
41
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Metadata describing a successfully negotiated TLS connection.
|
|
39
|
-
*
|
|
40
|
-
* @typedef {Object} TLSConnectionInfo
|
|
41
|
-
* @property {string} version - Negotiated TLS version string (e.g. `"TLSv1.3"`).
|
|
42
|
-
* @property {string|null} alpnProtocol - Negotiated ALPN protocol (e.g. `"h2"`), or `null`.
|
|
43
|
-
* @property {string} cipher - Negotiated cipher suite name.
|
|
44
|
-
* @property {string} [ja3Hash] - JA3 fingerprint hash of the ClientHello, if computed.
|
|
45
|
-
*/
|
|
42
|
+
/** Metadata about a completed TLS connection. */
|
|
46
43
|
export interface TLSConnectionInfo {
|
|
44
|
+
/** Negotiated protocol version string (e.g. `"TLSv1.3"`). */
|
|
47
45
|
version: string;
|
|
46
|
+
/** Negotiated ALPN protocol, or `null` if none. */
|
|
48
47
|
alpnProtocol: string | null;
|
|
48
|
+
/** Negotiated cipher suite name. */
|
|
49
49
|
cipher: string;
|
|
50
|
+
/** JA3 fingerprint hash of the connection, if computed. */
|
|
50
51
|
ja3Hash?: string;
|
|
52
|
+
/** Whether the session was resumed via a session ticket. */
|
|
53
|
+
resumed?: boolean;
|
|
51
54
|
}
|
|
52
|
-
/**
|
|
53
|
-
* A duplex stream representing an established TLS connection. Extends
|
|
54
|
-
* `Duplex` with connection metadata and a controlled teardown method.
|
|
55
|
-
*
|
|
56
|
-
* @typedef {Duplex} TLSSocket
|
|
57
|
-
* @property {TLSConnectionInfo} connectionInfo - Metadata about the negotiated TLS session.
|
|
58
|
-
*/
|
|
55
|
+
/** Duplex stream extended with TLS connection metadata. */
|
|
59
56
|
export interface TLSSocket extends Duplex {
|
|
57
|
+
/** Information about the negotiated TLS parameters. */
|
|
60
58
|
connectionInfo: TLSConnectionInfo;
|
|
59
|
+
/** Tear down the TLS layer and release resources. */
|
|
61
60
|
destroyTLS(): void;
|
|
62
61
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Contract for TLS engine implementations. Both the standard Node.js TLS
|
|
65
|
-
* engine and the custom stealth engine implement this interface, allowing
|
|
66
|
-
* them to be substituted transparently by the {@link ProtocolNegotiator}.
|
|
67
|
-
*/
|
|
62
|
+
/** Engine interface for pluggable TLS implementations. */
|
|
68
63
|
export interface ITLSEngine {
|
|
64
|
+
/**
|
|
65
|
+
* Establish a TLS connection.
|
|
66
|
+
*
|
|
67
|
+
* @param {TLSConnectOptions} options - Connection parameters.
|
|
68
|
+
* @param {BrowserProfile} [profile] - Optional browser profile for fingerprint impersonation.
|
|
69
|
+
* @returns {Promise<TLSSocket>} Connected TLS socket.
|
|
70
|
+
*/
|
|
69
71
|
connect(options: TLSConnectOptions, profile?: BrowserProfile): Promise<TLSSocket>;
|
|
70
72
|
}
|
|
71
|
-
/**
|
|
72
|
-
* User-facing TLS configuration for mTLS (client certificates) and custom
|
|
73
|
-
* trust stores. These options are set on `NLcURLRequest.tls` or
|
|
74
|
-
* `NLcURLSessionConfig.tls` and forwarded to the TLS engine.
|
|
75
|
-
*
|
|
76
|
-
* @typedef {Object} TLSOptions
|
|
77
|
-
* @property {string|Buffer} [cert] - PEM-encoded client certificate (or chain).
|
|
78
|
-
* @property {string|Buffer} [key] - PEM-encoded private key for the client certificate.
|
|
79
|
-
* @property {string} [passphrase] - Passphrase to decrypt the private key, if encrypted.
|
|
80
|
-
* @property {string|Buffer} [pfx] - PFX/PKCS#12 bundle containing cert + key.
|
|
81
|
-
* @property {string|Buffer|Array<string|Buffer>} [ca] - Custom CA certificate(s) to trust.
|
|
82
|
-
*/
|
|
73
|
+
/** Client certificate and key configuration subset. */
|
|
83
74
|
export interface TLSOptions {
|
|
75
|
+
/** Client certificate in PEM or DER format. */
|
|
84
76
|
cert?: string | Buffer;
|
|
77
|
+
/** Private key for client authentication. */
|
|
85
78
|
key?: string | Buffer;
|
|
79
|
+
/** Passphrase for encrypted private keys. */
|
|
86
80
|
passphrase?: string;
|
|
81
|
+
/** PKCS#12 / PFX certificate bundle. */
|
|
87
82
|
pfx?: string | Buffer;
|
|
83
|
+
/** Custom certificate authority chain. */
|
|
88
84
|
ca?: string | Buffer | Array<string | Buffer>;
|
|
85
|
+
/** Expected SPKI pin(s) for public-key pinning. */
|
|
86
|
+
pinnedPublicKey?: string | string[];
|
|
89
87
|
}
|
|
90
88
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/tls/types.d.ts.map
CHANGED
|
@@ -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
|
|
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,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACrC;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAU,SAAQ,MAAM;IACvC,uDAAuD;IACvD,cAAc,EAAE,iBAAiB,CAAC;IAClC,qDAAqD;IACrD,UAAU,IAAI,IAAI,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACnF;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC9C,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACrC"}
|