@push.rocks/smartproxy 20.0.1 → 21.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +26 -0
- package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
- package/dist_ts/core/utils/proxy-protocol.js +13 -97
- package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
- package/dist_ts/core/utils/websocket-utils.js +10 -66
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
- package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
- package/dist_ts/detection/detectors/http-detector.js +89 -0
- package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
- package/dist_ts/detection/detectors/quick-detector.js +131 -0
- package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
- package/dist_ts/detection/detectors/routing-extractor.js +122 -0
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
- package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
- package/dist_ts/detection/detectors/tls-detector.d.ts +33 -0
- package/dist_ts/detection/detectors/tls-detector.js +106 -0
- package/dist_ts/detection/index.d.ts +17 -0
- package/dist_ts/detection/index.js +22 -0
- package/dist_ts/detection/models/detection-types.d.ts +87 -0
- package/dist_ts/detection/models/detection-types.js +5 -0
- package/dist_ts/detection/models/interfaces.d.ts +97 -0
- package/dist_ts/detection/models/interfaces.js +5 -0
- package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
- package/dist_ts/detection/protocol-detector-v2.js +116 -0
- package/dist_ts/detection/protocol-detector.d.ts +74 -0
- package/dist_ts/detection/protocol-detector.js +173 -0
- package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
- package/dist_ts/detection/utils/buffer-utils.js +127 -0
- package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
- package/dist_ts/detection/utils/fragment-manager.js +53 -0
- package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
- package/dist_ts/detection/utils/parser-utils.js +63 -0
- package/dist_ts/index.d.ts +2 -1
- package/dist_ts/index.js +3 -2
- package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
- package/dist_ts/protocols/common/fragment-handler.js +117 -0
- package/dist_ts/protocols/common/index.d.ts +7 -0
- package/dist_ts/protocols/common/index.js +8 -0
- package/dist_ts/protocols/common/types.d.ts +68 -0
- package/dist_ts/protocols/common/types.js +7 -0
- package/dist_ts/protocols/http/constants.d.ts +119 -0
- package/dist_ts/protocols/http/constants.js +200 -0
- package/dist_ts/protocols/http/index.d.ts +7 -0
- package/dist_ts/protocols/http/index.js +8 -0
- package/dist_ts/protocols/http/parser.d.ts +58 -0
- package/dist_ts/protocols/http/parser.js +184 -0
- package/dist_ts/protocols/http/types.d.ts +62 -0
- package/dist_ts/protocols/http/types.js +5 -0
- package/dist_ts/protocols/index.d.ts +11 -0
- package/dist_ts/protocols/index.js +12 -0
- package/dist_ts/protocols/proxy/index.d.ts +6 -0
- package/dist_ts/protocols/proxy/index.js +7 -0
- package/dist_ts/protocols/proxy/parser.d.ts +44 -0
- package/dist_ts/protocols/proxy/parser.js +153 -0
- package/dist_ts/protocols/proxy/types.d.ts +47 -0
- package/dist_ts/protocols/proxy/types.js +6 -0
- package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
- package/dist_ts/protocols/tls/alerts/index.js +5 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
- package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
- package/dist_ts/protocols/tls/constants.d.ts +122 -0
- package/dist_ts/protocols/tls/constants.js +135 -0
- package/dist_ts/protocols/tls/index.d.ts +12 -0
- package/dist_ts/protocols/tls/index.js +27 -0
- package/dist_ts/protocols/tls/parser.d.ts +53 -0
- package/dist_ts/protocols/tls/parser.js +294 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
- package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
- package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
- package/dist_ts/protocols/tls/sni/index.js +6 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
- package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
- package/dist_ts/protocols/tls/types.d.ts +65 -0
- package/dist_ts/protocols/tls/types.js +5 -0
- package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
- package/dist_ts/protocols/tls/utils/index.js +5 -0
- package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
- package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
- package/dist_ts/protocols/websocket/constants.d.ts +55 -0
- package/dist_ts/protocols/websocket/constants.js +58 -0
- package/dist_ts/protocols/websocket/index.d.ts +7 -0
- package/dist_ts/protocols/websocket/index.js +8 -0
- package/dist_ts/protocols/websocket/types.d.ts +47 -0
- package/dist_ts/protocols/websocket/types.js +5 -0
- package/dist_ts/protocols/websocket/utils.d.ts +25 -0
- package/dist_ts/protocols/websocket/utils.js +103 -0
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
- package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
- package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
- package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
- package/dist_ts/proxies/smart-proxy/utils/index.d.ts +1 -2
- package/dist_ts/proxies/smart-proxy/utils/index.js +3 -4
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +112 -8
- package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +231 -76
- package/dist_ts/tls/index.d.ts +5 -7
- package/dist_ts/tls/index.js +8 -11
- package/dist_ts/tls/sni/client-hello-parser.js +3 -2
- package/dist_ts/tls/sni/sni-handler.js +4 -4
- package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
- package/dist_ts/tls/utils/tls-utils.js +4 -116
- package/package.json +17 -8
- package/readme.md +471 -2345
- package/readme.plan.md +0 -0
- package/ts/core/utils/proxy-protocol.ts +14 -131
- package/ts/core/utils/websocket-utils.ts +12 -60
- package/ts/detection/detectors/http-detector.ts +114 -0
- package/ts/detection/detectors/quick-detector.ts +148 -0
- package/ts/detection/detectors/routing-extractor.ts +147 -0
- package/ts/detection/detectors/tls-detector.ts +120 -0
- package/ts/detection/index.ts +25 -0
- package/ts/detection/models/detection-types.ts +102 -0
- package/ts/detection/models/interfaces.ts +115 -0
- package/ts/detection/protocol-detector.ts +230 -0
- package/ts/detection/utils/buffer-utils.ts +141 -0
- package/ts/detection/utils/fragment-manager.ts +64 -0
- package/ts/detection/utils/parser-utils.ts +77 -0
- package/ts/index.ts +3 -2
- package/ts/protocols/common/fragment-handler.ts +163 -0
- package/ts/protocols/common/index.ts +8 -0
- package/ts/protocols/common/types.ts +76 -0
- package/ts/protocols/http/constants.ts +219 -0
- package/ts/protocols/http/index.ts +8 -0
- package/ts/protocols/http/parser.ts +219 -0
- package/ts/protocols/http/types.ts +70 -0
- package/ts/protocols/index.ts +12 -0
- package/ts/protocols/proxy/index.ts +7 -0
- package/ts/protocols/proxy/parser.ts +183 -0
- package/ts/protocols/proxy/types.ts +53 -0
- package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
- package/ts/protocols/tls/index.ts +37 -0
- package/ts/protocols/tls/sni/index.ts +6 -0
- package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
- package/ts/protocols/websocket/constants.ts +60 -0
- package/ts/protocols/websocket/index.ts +8 -0
- package/ts/protocols/websocket/types.ts +53 -0
- package/ts/protocols/websocket/utils.ts +98 -0
- package/ts/proxies/http-proxy/models/http-types.ts +29 -46
- package/ts/proxies/smart-proxy/models/interfaces.ts +7 -1
- package/ts/proxies/smart-proxy/models/route-types.ts +0 -1
- package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
- package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
- package/ts/proxies/smart-proxy/utils/index.ts +2 -13
- package/ts/proxies/smart-proxy/utils/route-helpers.ts +323 -86
- package/ts/tls/index.ts +8 -12
- package/ts/tls/sni/sni-handler.ts +3 -3
- package/ts/forwarding/config/forwarding-types.ts +0 -76
- package/ts/forwarding/config/index.ts +0 -26
- package/ts/forwarding/factory/forwarding-factory.ts +0 -189
- package/ts/forwarding/factory/index.ts +0 -5
- package/ts/forwarding/handlers/base-handler.ts +0 -155
- package/ts/forwarding/handlers/http-handler.ts +0 -163
- package/ts/forwarding/handlers/https-passthrough-handler.ts +0 -185
- package/ts/forwarding/handlers/https-terminate-to-http-handler.ts +0 -312
- package/ts/forwarding/handlers/https-terminate-to-https-handler.ts +0 -297
- package/ts/forwarding/handlers/index.ts +0 -9
- package/ts/forwarding/index.ts +0 -35
- package/ts/proxies/smart-proxy/utils/route-patterns.ts +0 -403
- /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
- /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
- /package/ts/{tls → protocols/tls}/utils/index.ts +0 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { TlsExtensionType, TlsUtils } from '../utils/tls-utils.js';
|
|
3
|
+
import { ClientHelloParser } from './client-hello-parser.js';
|
|
4
|
+
/**
|
|
5
|
+
* Utilities for extracting SNI information from TLS handshakes
|
|
6
|
+
*/
|
|
7
|
+
export class SniExtraction {
|
|
8
|
+
/**
|
|
9
|
+
* Extracts the SNI (Server Name Indication) from a TLS ClientHello message.
|
|
10
|
+
*
|
|
11
|
+
* @param buffer The buffer containing the TLS ClientHello message
|
|
12
|
+
* @param logger Optional logging function
|
|
13
|
+
* @returns The extracted server name or undefined if not found
|
|
14
|
+
*/
|
|
15
|
+
static extractSNI(buffer, logger) {
|
|
16
|
+
const log = logger || (() => { });
|
|
17
|
+
try {
|
|
18
|
+
// Parse the ClientHello
|
|
19
|
+
const parseResult = ClientHelloParser.parseClientHello(buffer, logger);
|
|
20
|
+
if (!parseResult.isValid) {
|
|
21
|
+
log(`Failed to parse ClientHello: ${parseResult.error}`);
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
// Check if ServerName extension was found
|
|
25
|
+
if (parseResult.serverNameList && parseResult.serverNameList.length > 0) {
|
|
26
|
+
// Use the first hostname (most common case)
|
|
27
|
+
const serverName = parseResult.serverNameList[0];
|
|
28
|
+
log(`Found SNI: ${serverName}`);
|
|
29
|
+
return serverName;
|
|
30
|
+
}
|
|
31
|
+
log('No SNI extension found in ClientHello');
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
log(`Error extracting SNI: ${error instanceof Error ? error.message : String(error)}`);
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Attempts to extract SNI from the PSK extension in a TLS 1.3 ClientHello.
|
|
41
|
+
*
|
|
42
|
+
* In TLS 1.3, when a client attempts to resume a session, it may include
|
|
43
|
+
* the server name in the PSK identity hint rather than in the SNI extension.
|
|
44
|
+
*
|
|
45
|
+
* @param buffer The buffer containing the TLS ClientHello message
|
|
46
|
+
* @param logger Optional logging function
|
|
47
|
+
* @returns The extracted server name or undefined if not found
|
|
48
|
+
*/
|
|
49
|
+
static extractSNIFromPSKExtension(buffer, logger) {
|
|
50
|
+
const log = logger || (() => { });
|
|
51
|
+
try {
|
|
52
|
+
// Ensure this is a ClientHello
|
|
53
|
+
if (!TlsUtils.isClientHello(buffer)) {
|
|
54
|
+
log('Not a ClientHello message');
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
// Parse the ClientHello to find PSK extension
|
|
58
|
+
const parseResult = ClientHelloParser.parseClientHello(buffer, logger);
|
|
59
|
+
if (!parseResult.isValid || !parseResult.extensions) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
// Find the PSK extension
|
|
63
|
+
const pskExtension = parseResult.extensions.find(ext => ext.type === TlsExtensionType.PRE_SHARED_KEY);
|
|
64
|
+
if (!pskExtension) {
|
|
65
|
+
log('No PSK extension found');
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
// Parse the PSK extension data
|
|
69
|
+
const data = pskExtension.data;
|
|
70
|
+
// PSK extension structure:
|
|
71
|
+
// 2 bytes: identities list length
|
|
72
|
+
if (data.length < 2)
|
|
73
|
+
return undefined;
|
|
74
|
+
const identitiesLength = (data[0] << 8) + data[1];
|
|
75
|
+
let pos = 2;
|
|
76
|
+
// End of identities list
|
|
77
|
+
const identitiesEnd = pos + identitiesLength;
|
|
78
|
+
if (identitiesEnd > data.length)
|
|
79
|
+
return undefined;
|
|
80
|
+
// Process each PSK identity
|
|
81
|
+
while (pos + 2 <= identitiesEnd) {
|
|
82
|
+
// Identity length (2 bytes)
|
|
83
|
+
if (pos + 2 > identitiesEnd)
|
|
84
|
+
break;
|
|
85
|
+
const identityLength = (data[pos] << 8) + data[pos + 1];
|
|
86
|
+
pos += 2;
|
|
87
|
+
if (pos + identityLength > identitiesEnd)
|
|
88
|
+
break;
|
|
89
|
+
// Try to extract hostname from identity
|
|
90
|
+
// Chrome often embeds the hostname in the PSK identity
|
|
91
|
+
// This is a heuristic as there's no standard format
|
|
92
|
+
if (identityLength > 0) {
|
|
93
|
+
const identity = data.slice(pos, pos + identityLength);
|
|
94
|
+
// Skip identity bytes
|
|
95
|
+
pos += identityLength;
|
|
96
|
+
// Skip obfuscated ticket age (4 bytes)
|
|
97
|
+
if (pos + 4 <= identitiesEnd) {
|
|
98
|
+
pos += 4;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
// Try to parse the identity as UTF-8
|
|
104
|
+
try {
|
|
105
|
+
const identityStr = identity.toString('utf8');
|
|
106
|
+
log(`PSK identity: ${identityStr}`);
|
|
107
|
+
// Check if the identity contains hostname hints
|
|
108
|
+
// Chrome often embeds the hostname in a known format
|
|
109
|
+
// Try to extract using common patterns
|
|
110
|
+
// Pattern 1: Look for domain name pattern
|
|
111
|
+
const domainPattern = /([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?/i;
|
|
112
|
+
const domainMatch = identityStr.match(domainPattern);
|
|
113
|
+
if (domainMatch && domainMatch[0]) {
|
|
114
|
+
log(`Found domain in PSK identity: ${domainMatch[0]}`);
|
|
115
|
+
return domainMatch[0];
|
|
116
|
+
}
|
|
117
|
+
// Pattern 2: Chrome sometimes uses a specific format with delimiters
|
|
118
|
+
// This is a heuristic approach since the format isn't standardized
|
|
119
|
+
const parts = identityStr.split('|');
|
|
120
|
+
if (parts.length > 1) {
|
|
121
|
+
for (const part of parts) {
|
|
122
|
+
if (part.includes('.') && !part.includes('/')) {
|
|
123
|
+
const possibleDomain = part.trim();
|
|
124
|
+
if (/^[a-z0-9.-]+$/i.test(possibleDomain)) {
|
|
125
|
+
log(`Found possible domain in PSK delimiter format: ${possibleDomain}`);
|
|
126
|
+
return possibleDomain;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
log('Failed to parse PSK identity as UTF-8');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
log('No hostname found in PSK extension');
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
log(`Error parsing PSK: ${error instanceof Error ? error.message : String(error)}`);
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Main entry point for SNI extraction with support for fragmented messages
|
|
147
|
+
* and session resumption edge cases.
|
|
148
|
+
*
|
|
149
|
+
* @param buffer The buffer containing TLS data
|
|
150
|
+
* @param connectionInfo Connection tracking information
|
|
151
|
+
* @param logger Optional logging function
|
|
152
|
+
* @param cachedSni Optional previously cached SNI value
|
|
153
|
+
* @returns The extracted server name or undefined
|
|
154
|
+
*/
|
|
155
|
+
static extractSNIWithResumptionSupport(buffer, connectionInfo, logger, cachedSni) {
|
|
156
|
+
const log = logger || (() => { });
|
|
157
|
+
// Log buffer details for debugging
|
|
158
|
+
if (logger) {
|
|
159
|
+
log(`Buffer size: ${buffer.length} bytes`);
|
|
160
|
+
log(`Buffer starts with: ${buffer.slice(0, Math.min(10, buffer.length)).toString('hex')}`);
|
|
161
|
+
if (buffer.length >= 5) {
|
|
162
|
+
const recordType = buffer[0];
|
|
163
|
+
const majorVersion = buffer[1];
|
|
164
|
+
const minorVersion = buffer[2];
|
|
165
|
+
const recordLength = (buffer[3] << 8) + buffer[4];
|
|
166
|
+
log(`TLS Record: type=${recordType}, version=${majorVersion}.${minorVersion}, length=${recordLength}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Check if we need to handle fragmented packets
|
|
170
|
+
let processBuffer = buffer;
|
|
171
|
+
if (connectionInfo) {
|
|
172
|
+
const connectionId = TlsUtils.createConnectionId(connectionInfo);
|
|
173
|
+
const reassembledBuffer = ClientHelloParser.handleFragmentedClientHello(buffer, connectionId, logger);
|
|
174
|
+
if (!reassembledBuffer) {
|
|
175
|
+
log(`Waiting for more fragments on connection ${connectionId}`);
|
|
176
|
+
return undefined; // Need more fragments to complete ClientHello
|
|
177
|
+
}
|
|
178
|
+
processBuffer = reassembledBuffer;
|
|
179
|
+
log(`Using reassembled buffer of length ${processBuffer.length}`);
|
|
180
|
+
}
|
|
181
|
+
// First try the standard SNI extraction
|
|
182
|
+
const standardSni = this.extractSNI(processBuffer, logger);
|
|
183
|
+
if (standardSni) {
|
|
184
|
+
log(`Found standard SNI: ${standardSni}`);
|
|
185
|
+
return standardSni;
|
|
186
|
+
}
|
|
187
|
+
// Check for session resumption when standard SNI extraction fails
|
|
188
|
+
if (TlsUtils.isClientHello(processBuffer)) {
|
|
189
|
+
const resumptionInfo = ClientHelloParser.hasSessionResumption(processBuffer, logger);
|
|
190
|
+
if (resumptionInfo.isResumption) {
|
|
191
|
+
log(`Detected session resumption in ClientHello without standard SNI`);
|
|
192
|
+
// Try to extract SNI from PSK extension
|
|
193
|
+
const pskSni = this.extractSNIFromPSKExtension(processBuffer, logger);
|
|
194
|
+
if (pskSni) {
|
|
195
|
+
log(`Extracted SNI from PSK extension: ${pskSni}`);
|
|
196
|
+
return pskSni;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// If cached SNI was provided, use it for application data packets
|
|
201
|
+
if (cachedSni && TlsUtils.isTlsApplicationData(buffer)) {
|
|
202
|
+
log(`Using provided cached SNI for application data: ${cachedSni}`);
|
|
203
|
+
return cachedSni;
|
|
204
|
+
}
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Unified method for processing a TLS packet and extracting SNI.
|
|
209
|
+
* Main entry point for SNI extraction that handles all edge cases.
|
|
210
|
+
*
|
|
211
|
+
* @param buffer The buffer containing TLS data
|
|
212
|
+
* @param connectionInfo Connection tracking information
|
|
213
|
+
* @param logger Optional logging function
|
|
214
|
+
* @param cachedSni Optional previously cached SNI value
|
|
215
|
+
* @returns The extracted server name or undefined
|
|
216
|
+
*/
|
|
217
|
+
static processTlsPacket(buffer, connectionInfo, logger, cachedSni) {
|
|
218
|
+
const log = logger || (() => { });
|
|
219
|
+
// Add timestamp if not provided
|
|
220
|
+
if (!connectionInfo.timestamp) {
|
|
221
|
+
connectionInfo.timestamp = Date.now();
|
|
222
|
+
}
|
|
223
|
+
// Check if this is a TLS handshake or application data
|
|
224
|
+
if (!TlsUtils.isTlsHandshake(buffer) && !TlsUtils.isTlsApplicationData(buffer)) {
|
|
225
|
+
log('Not a TLS handshake or application data packet');
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
// Create connection ID for tracking
|
|
229
|
+
const connectionId = TlsUtils.createConnectionId(connectionInfo);
|
|
230
|
+
log(`Processing TLS packet for connection ${connectionId}, buffer length: ${buffer.length}`);
|
|
231
|
+
// Handle application data with cached SNI (for connection racing)
|
|
232
|
+
if (TlsUtils.isTlsApplicationData(buffer)) {
|
|
233
|
+
// If explicit cachedSni was provided, use it
|
|
234
|
+
if (cachedSni) {
|
|
235
|
+
log(`Using provided cached SNI for application data: ${cachedSni}`);
|
|
236
|
+
return cachedSni;
|
|
237
|
+
}
|
|
238
|
+
log('Application data packet without cached SNI, cannot determine hostname');
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
// Enhanced session resumption detection
|
|
242
|
+
if (TlsUtils.isClientHello(buffer)) {
|
|
243
|
+
const resumptionInfo = ClientHelloParser.hasSessionResumption(buffer, logger);
|
|
244
|
+
if (resumptionInfo.isResumption) {
|
|
245
|
+
log(`Session resumption detected in TLS packet`);
|
|
246
|
+
// Always try standard SNI extraction first
|
|
247
|
+
const standardSni = this.extractSNI(buffer, logger);
|
|
248
|
+
if (standardSni) {
|
|
249
|
+
log(`Found standard SNI in session resumption: ${standardSni}`);
|
|
250
|
+
return standardSni;
|
|
251
|
+
}
|
|
252
|
+
// Enhanced session resumption SNI extraction
|
|
253
|
+
// Try extracting from PSK identity
|
|
254
|
+
const pskSni = this.extractSNIFromPSKExtension(buffer, logger);
|
|
255
|
+
if (pskSni) {
|
|
256
|
+
log(`Extracted SNI from PSK extension: ${pskSni}`);
|
|
257
|
+
return pskSni;
|
|
258
|
+
}
|
|
259
|
+
log(`Session resumption without extractable SNI`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// For handshake messages, try the full extraction process
|
|
263
|
+
const sni = this.extractSNIWithResumptionSupport(buffer, connectionInfo, logger);
|
|
264
|
+
if (sni) {
|
|
265
|
+
log(`Successfully extracted SNI: ${sni}`);
|
|
266
|
+
return sni;
|
|
267
|
+
}
|
|
268
|
+
// If we couldn't extract an SNI, check if this is a valid ClientHello
|
|
269
|
+
if (TlsUtils.isClientHello(buffer)) {
|
|
270
|
+
log('Valid ClientHello detected, but no SNI extracted - might need more data');
|
|
271
|
+
}
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25pLWV4dHJhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm90b2NvbHMvdGxzL3NuaS9zbmktZXh0cmFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsaUJBQWlCLEVBRWxCLE1BQU0sMEJBQTBCLENBQUM7QUFhbEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUN4Qjs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUF1QjtRQUM5RCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUM7WUFDSCx3QkFBd0I7WUFDeEIsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxnQ0FBZ0MsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFFRCwwQ0FBMEM7WUFDMUMsSUFBSSxXQUFXLENBQUMsY0FBYyxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RSw0Q0FBNEM7Z0JBQzVDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELEdBQUcsQ0FBQyxjQUFjLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hDLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUM7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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { TTlsVersionString } from './constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* TLS record header structure
|
|
7
|
+
*/
|
|
8
|
+
export interface ITlsRecordHeader {
|
|
9
|
+
type: number;
|
|
10
|
+
version: {
|
|
11
|
+
major: number;
|
|
12
|
+
minor: number;
|
|
13
|
+
};
|
|
14
|
+
length: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* TLS handshake header structure
|
|
18
|
+
*/
|
|
19
|
+
export interface ITlsHandshakeHeader {
|
|
20
|
+
type: number;
|
|
21
|
+
length: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* TLS extension structure
|
|
25
|
+
*/
|
|
26
|
+
export interface ITlsExtension {
|
|
27
|
+
type: number;
|
|
28
|
+
data: Buffer;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Server Name Indication (SNI) hostname
|
|
32
|
+
*/
|
|
33
|
+
export interface ISniHostname {
|
|
34
|
+
type: number;
|
|
35
|
+
hostname: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parsed ClientHello information
|
|
39
|
+
*/
|
|
40
|
+
export interface IClientHelloInfo {
|
|
41
|
+
version: TTlsVersionString | null;
|
|
42
|
+
sessionId: Buffer | null;
|
|
43
|
+
cipherSuites: number[];
|
|
44
|
+
compressionMethods: number[];
|
|
45
|
+
extensions: ITlsExtension[];
|
|
46
|
+
sni?: string;
|
|
47
|
+
alpn?: string[];
|
|
48
|
+
supportedVersions?: TTlsVersionString[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* TLS alert structure
|
|
52
|
+
*/
|
|
53
|
+
export interface ITlsAlert {
|
|
54
|
+
level: number;
|
|
55
|
+
description: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Connection information for TLS tracking
|
|
59
|
+
*/
|
|
60
|
+
export interface ITlsConnectionInfo {
|
|
61
|
+
sourceIp?: string;
|
|
62
|
+
sourcePort?: number;
|
|
63
|
+
destIp?: string;
|
|
64
|
+
destPort?: number;
|
|
65
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm90b2NvbHMvdGxzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* TLS utilities
|
|
4
|
+
*/
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm90b2NvbHMvdGxzL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRyJ9
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS record types as defined in various RFCs
|
|
3
|
+
*/
|
|
4
|
+
export declare enum TlsRecordType {
|
|
5
|
+
CHANGE_CIPHER_SPEC = 20,
|
|
6
|
+
ALERT = 21,
|
|
7
|
+
HANDSHAKE = 22,
|
|
8
|
+
APPLICATION_DATA = 23,
|
|
9
|
+
HEARTBEAT = 24
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* TLS handshake message types
|
|
13
|
+
*/
|
|
14
|
+
export declare enum TlsHandshakeType {
|
|
15
|
+
HELLO_REQUEST = 0,
|
|
16
|
+
CLIENT_HELLO = 1,
|
|
17
|
+
SERVER_HELLO = 2,
|
|
18
|
+
NEW_SESSION_TICKET = 4,
|
|
19
|
+
ENCRYPTED_EXTENSIONS = 8,// TLS 1.3
|
|
20
|
+
CERTIFICATE = 11,
|
|
21
|
+
SERVER_KEY_EXCHANGE = 12,
|
|
22
|
+
CERTIFICATE_REQUEST = 13,
|
|
23
|
+
SERVER_HELLO_DONE = 14,
|
|
24
|
+
CERTIFICATE_VERIFY = 15,
|
|
25
|
+
CLIENT_KEY_EXCHANGE = 16,
|
|
26
|
+
FINISHED = 20
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* TLS extension types
|
|
30
|
+
*/
|
|
31
|
+
export declare enum TlsExtensionType {
|
|
32
|
+
SERVER_NAME = 0,// SNI
|
|
33
|
+
MAX_FRAGMENT_LENGTH = 1,
|
|
34
|
+
CLIENT_CERTIFICATE_URL = 2,
|
|
35
|
+
TRUSTED_CA_KEYS = 3,
|
|
36
|
+
TRUNCATED_HMAC = 4,
|
|
37
|
+
STATUS_REQUEST = 5,// OCSP
|
|
38
|
+
SUPPORTED_GROUPS = 10,// Previously named "elliptic_curves"
|
|
39
|
+
EC_POINT_FORMATS = 11,
|
|
40
|
+
SIGNATURE_ALGORITHMS = 13,
|
|
41
|
+
APPLICATION_LAYER_PROTOCOL_NEGOTIATION = 16,// ALPN
|
|
42
|
+
SIGNED_CERTIFICATE_TIMESTAMP = 18,// Certificate Transparency
|
|
43
|
+
PADDING = 21,
|
|
44
|
+
SESSION_TICKET = 35,
|
|
45
|
+
PRE_SHARED_KEY = 41,// TLS 1.3
|
|
46
|
+
EARLY_DATA = 42,// TLS 1.3 0-RTT
|
|
47
|
+
SUPPORTED_VERSIONS = 43,// TLS 1.3
|
|
48
|
+
COOKIE = 44,// TLS 1.3
|
|
49
|
+
PSK_KEY_EXCHANGE_MODES = 45,// TLS 1.3
|
|
50
|
+
CERTIFICATE_AUTHORITIES = 47,// TLS 1.3
|
|
51
|
+
POST_HANDSHAKE_AUTH = 49,// TLS 1.3
|
|
52
|
+
SIGNATURE_ALGORITHMS_CERT = 50,// TLS 1.3
|
|
53
|
+
KEY_SHARE = 51
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* TLS alert levels
|
|
57
|
+
*/
|
|
58
|
+
export declare enum TlsAlertLevel {
|
|
59
|
+
WARNING = 1,
|
|
60
|
+
FATAL = 2
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* TLS alert description codes
|
|
64
|
+
*/
|
|
65
|
+
export declare enum TlsAlertDescription {
|
|
66
|
+
CLOSE_NOTIFY = 0,
|
|
67
|
+
UNEXPECTED_MESSAGE = 10,
|
|
68
|
+
BAD_RECORD_MAC = 20,
|
|
69
|
+
DECRYPTION_FAILED = 21,// TLS 1.0 only
|
|
70
|
+
RECORD_OVERFLOW = 22,
|
|
71
|
+
DECOMPRESSION_FAILURE = 30,// TLS 1.2 and below
|
|
72
|
+
HANDSHAKE_FAILURE = 40,
|
|
73
|
+
NO_CERTIFICATE = 41,// SSLv3 only
|
|
74
|
+
BAD_CERTIFICATE = 42,
|
|
75
|
+
UNSUPPORTED_CERTIFICATE = 43,
|
|
76
|
+
CERTIFICATE_REVOKED = 44,
|
|
77
|
+
CERTIFICATE_EXPIRED = 45,
|
|
78
|
+
CERTIFICATE_UNKNOWN = 46,
|
|
79
|
+
ILLEGAL_PARAMETER = 47,
|
|
80
|
+
UNKNOWN_CA = 48,
|
|
81
|
+
ACCESS_DENIED = 49,
|
|
82
|
+
DECODE_ERROR = 50,
|
|
83
|
+
DECRYPT_ERROR = 51,
|
|
84
|
+
EXPORT_RESTRICTION = 60,// TLS 1.0 only
|
|
85
|
+
PROTOCOL_VERSION = 70,
|
|
86
|
+
INSUFFICIENT_SECURITY = 71,
|
|
87
|
+
INTERNAL_ERROR = 80,
|
|
88
|
+
INAPPROPRIATE_FALLBACK = 86,
|
|
89
|
+
USER_CANCELED = 90,
|
|
90
|
+
NO_RENEGOTIATION = 100,// TLS 1.2 and below
|
|
91
|
+
MISSING_EXTENSION = 109,// TLS 1.3
|
|
92
|
+
UNSUPPORTED_EXTENSION = 110,// TLS 1.3
|
|
93
|
+
CERTIFICATE_REQUIRED = 111,// TLS 1.3
|
|
94
|
+
UNRECOGNIZED_NAME = 112,
|
|
95
|
+
BAD_CERTIFICATE_STATUS_RESPONSE = 113,
|
|
96
|
+
BAD_CERTIFICATE_HASH_VALUE = 114,// TLS 1.2 and below
|
|
97
|
+
UNKNOWN_PSK_IDENTITY = 115,
|
|
98
|
+
CERTIFICATE_REQUIRED_1_3 = 116,// TLS 1.3
|
|
99
|
+
NO_APPLICATION_PROTOCOL = 120
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* TLS version codes (major.minor)
|
|
103
|
+
*/
|
|
104
|
+
export declare const TlsVersion: {
|
|
105
|
+
SSL3: number[];
|
|
106
|
+
TLS1_0: number[];
|
|
107
|
+
TLS1_1: number[];
|
|
108
|
+
TLS1_2: number[];
|
|
109
|
+
TLS1_3: number[];
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Utility functions for TLS protocol operations
|
|
113
|
+
*/
|
|
114
|
+
export declare class TlsUtils {
|
|
115
|
+
/**
|
|
116
|
+
* Checks if a buffer contains a TLS handshake record
|
|
117
|
+
* @param buffer The buffer to check
|
|
118
|
+
* @returns true if the buffer starts with a TLS handshake record
|
|
119
|
+
*/
|
|
120
|
+
static isTlsHandshake(buffer: Buffer): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Checks if a buffer contains TLS application data
|
|
123
|
+
* @param buffer The buffer to check
|
|
124
|
+
* @returns true if the buffer starts with a TLS application data record
|
|
125
|
+
*/
|
|
126
|
+
static isTlsApplicationData(buffer: Buffer): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Checks if a buffer contains a TLS alert record
|
|
129
|
+
* @param buffer The buffer to check
|
|
130
|
+
* @returns true if the buffer starts with a TLS alert record
|
|
131
|
+
*/
|
|
132
|
+
static isTlsAlert(buffer: Buffer): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Checks if a buffer contains a TLS ClientHello message
|
|
135
|
+
* @param buffer The buffer to check
|
|
136
|
+
* @returns true if the buffer appears to be a ClientHello message
|
|
137
|
+
*/
|
|
138
|
+
static isClientHello(buffer: Buffer): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Gets the record length from a TLS record header
|
|
141
|
+
* @param buffer Buffer containing a TLS record
|
|
142
|
+
* @returns The record length if the buffer is valid, -1 otherwise
|
|
143
|
+
*/
|
|
144
|
+
static getTlsRecordLength(buffer: Buffer): number;
|
|
145
|
+
/**
|
|
146
|
+
* Creates a connection ID based on source/destination information
|
|
147
|
+
* Used to track fragmented ClientHello messages across multiple packets
|
|
148
|
+
*
|
|
149
|
+
* @param connectionInfo Object containing connection identifiers
|
|
150
|
+
* @returns A string ID for the connection
|
|
151
|
+
*/
|
|
152
|
+
static createConnectionId(connectionInfo: {
|
|
153
|
+
sourceIp?: string;
|
|
154
|
+
sourcePort?: number;
|
|
155
|
+
destIp?: string;
|
|
156
|
+
destPort?: number;
|
|
157
|
+
}): string;
|
|
158
|
+
}
|