@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,226 @@
|
|
|
1
|
+
import * as plugins from '../../../plugins.js';
|
|
2
|
+
import { TlsAlertLevel, TlsAlertDescription, TlsVersion } from '../utils/tls-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* TlsAlert class for creating and sending TLS alert messages
|
|
5
|
+
*/
|
|
6
|
+
export class TlsAlert {
|
|
7
|
+
// Use enum values from TlsAlertLevel
|
|
8
|
+
static { this.LEVEL_WARNING = TlsAlertLevel.WARNING; }
|
|
9
|
+
static { this.LEVEL_FATAL = TlsAlertLevel.FATAL; }
|
|
10
|
+
// Use enum values from TlsAlertDescription
|
|
11
|
+
static { this.CLOSE_NOTIFY = TlsAlertDescription.CLOSE_NOTIFY; }
|
|
12
|
+
static { this.UNEXPECTED_MESSAGE = TlsAlertDescription.UNEXPECTED_MESSAGE; }
|
|
13
|
+
static { this.BAD_RECORD_MAC = TlsAlertDescription.BAD_RECORD_MAC; }
|
|
14
|
+
static { this.DECRYPTION_FAILED = TlsAlertDescription.DECRYPTION_FAILED; }
|
|
15
|
+
static { this.RECORD_OVERFLOW = TlsAlertDescription.RECORD_OVERFLOW; }
|
|
16
|
+
static { this.DECOMPRESSION_FAILURE = TlsAlertDescription.DECOMPRESSION_FAILURE; }
|
|
17
|
+
static { this.HANDSHAKE_FAILURE = TlsAlertDescription.HANDSHAKE_FAILURE; }
|
|
18
|
+
static { this.NO_CERTIFICATE = TlsAlertDescription.NO_CERTIFICATE; }
|
|
19
|
+
static { this.BAD_CERTIFICATE = TlsAlertDescription.BAD_CERTIFICATE; }
|
|
20
|
+
static { this.UNSUPPORTED_CERTIFICATE = TlsAlertDescription.UNSUPPORTED_CERTIFICATE; }
|
|
21
|
+
static { this.CERTIFICATE_REVOKED = TlsAlertDescription.CERTIFICATE_REVOKED; }
|
|
22
|
+
static { this.CERTIFICATE_EXPIRED = TlsAlertDescription.CERTIFICATE_EXPIRED; }
|
|
23
|
+
static { this.CERTIFICATE_UNKNOWN = TlsAlertDescription.CERTIFICATE_UNKNOWN; }
|
|
24
|
+
static { this.ILLEGAL_PARAMETER = TlsAlertDescription.ILLEGAL_PARAMETER; }
|
|
25
|
+
static { this.UNKNOWN_CA = TlsAlertDescription.UNKNOWN_CA; }
|
|
26
|
+
static { this.ACCESS_DENIED = TlsAlertDescription.ACCESS_DENIED; }
|
|
27
|
+
static { this.DECODE_ERROR = TlsAlertDescription.DECODE_ERROR; }
|
|
28
|
+
static { this.DECRYPT_ERROR = TlsAlertDescription.DECRYPT_ERROR; }
|
|
29
|
+
static { this.EXPORT_RESTRICTION = TlsAlertDescription.EXPORT_RESTRICTION; }
|
|
30
|
+
static { this.PROTOCOL_VERSION = TlsAlertDescription.PROTOCOL_VERSION; }
|
|
31
|
+
static { this.INSUFFICIENT_SECURITY = TlsAlertDescription.INSUFFICIENT_SECURITY; }
|
|
32
|
+
static { this.INTERNAL_ERROR = TlsAlertDescription.INTERNAL_ERROR; }
|
|
33
|
+
static { this.INAPPROPRIATE_FALLBACK = TlsAlertDescription.INAPPROPRIATE_FALLBACK; }
|
|
34
|
+
static { this.USER_CANCELED = TlsAlertDescription.USER_CANCELED; }
|
|
35
|
+
static { this.NO_RENEGOTIATION = TlsAlertDescription.NO_RENEGOTIATION; }
|
|
36
|
+
static { this.MISSING_EXTENSION = TlsAlertDescription.MISSING_EXTENSION; }
|
|
37
|
+
static { this.UNSUPPORTED_EXTENSION = TlsAlertDescription.UNSUPPORTED_EXTENSION; }
|
|
38
|
+
static { this.CERTIFICATE_REQUIRED = TlsAlertDescription.CERTIFICATE_REQUIRED; }
|
|
39
|
+
static { this.UNRECOGNIZED_NAME = TlsAlertDescription.UNRECOGNIZED_NAME; }
|
|
40
|
+
static { this.BAD_CERTIFICATE_STATUS_RESPONSE = TlsAlertDescription.BAD_CERTIFICATE_STATUS_RESPONSE; }
|
|
41
|
+
static { this.BAD_CERTIFICATE_HASH_VALUE = TlsAlertDescription.BAD_CERTIFICATE_HASH_VALUE; }
|
|
42
|
+
static { this.UNKNOWN_PSK_IDENTITY = TlsAlertDescription.UNKNOWN_PSK_IDENTITY; }
|
|
43
|
+
static { this.CERTIFICATE_REQUIRED_1_3 = TlsAlertDescription.CERTIFICATE_REQUIRED_1_3; }
|
|
44
|
+
static { this.NO_APPLICATION_PROTOCOL = TlsAlertDescription.NO_APPLICATION_PROTOCOL; }
|
|
45
|
+
/**
|
|
46
|
+
* Create a TLS alert buffer with the specified level and description code
|
|
47
|
+
*
|
|
48
|
+
* @param level Alert level (warning or fatal)
|
|
49
|
+
* @param description Alert description code
|
|
50
|
+
* @param tlsVersion TLS version bytes (default is TLS 1.2: 0x0303)
|
|
51
|
+
* @returns Buffer containing the TLS alert message
|
|
52
|
+
*/
|
|
53
|
+
static create(level, description, tlsVersion = [TlsVersion.TLS1_2[0], TlsVersion.TLS1_2[1]]) {
|
|
54
|
+
return Buffer.from([
|
|
55
|
+
0x15, // Alert record type
|
|
56
|
+
tlsVersion[0],
|
|
57
|
+
tlsVersion[1], // TLS version (default to TLS 1.2: 0x0303)
|
|
58
|
+
0x00,
|
|
59
|
+
0x02, // Length
|
|
60
|
+
level, // Alert level
|
|
61
|
+
description, // Alert description
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a warning-level TLS alert
|
|
66
|
+
*
|
|
67
|
+
* @param description Alert description code
|
|
68
|
+
* @returns Buffer containing the warning-level TLS alert message
|
|
69
|
+
*/
|
|
70
|
+
static createWarning(description) {
|
|
71
|
+
return this.create(this.LEVEL_WARNING, description);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a fatal-level TLS alert
|
|
75
|
+
*
|
|
76
|
+
* @param description Alert description code
|
|
77
|
+
* @returns Buffer containing the fatal-level TLS alert message
|
|
78
|
+
*/
|
|
79
|
+
static createFatal(description) {
|
|
80
|
+
return this.create(this.LEVEL_FATAL, description);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Send a TLS alert to a socket and optionally close the connection
|
|
84
|
+
*
|
|
85
|
+
* @param socket The socket to send the alert to
|
|
86
|
+
* @param level Alert level (warning or fatal)
|
|
87
|
+
* @param description Alert description code
|
|
88
|
+
* @param closeAfterSend Whether to close the connection after sending the alert
|
|
89
|
+
* @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
|
|
90
|
+
* @returns Promise that resolves when the alert has been sent
|
|
91
|
+
*/
|
|
92
|
+
static async send(socket, level, description, closeAfterSend = false, closeDelay = 200) {
|
|
93
|
+
const alert = this.create(level, description);
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
try {
|
|
96
|
+
// Ensure the alert is written as a single packet
|
|
97
|
+
socket.cork();
|
|
98
|
+
const writeSuccessful = socket.write(alert, (err) => {
|
|
99
|
+
if (err) {
|
|
100
|
+
reject(err);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (closeAfterSend) {
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
socket.end();
|
|
106
|
+
resolve();
|
|
107
|
+
}, closeDelay);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
resolve();
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
socket.uncork();
|
|
114
|
+
// If write wasn't successful immediately, wait for drain
|
|
115
|
+
if (!writeSuccessful && !closeAfterSend) {
|
|
116
|
+
socket.once('drain', () => {
|
|
117
|
+
resolve();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
reject(err);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Pre-defined TLS alert messages
|
|
128
|
+
*/
|
|
129
|
+
static { this.alerts = {
|
|
130
|
+
// Warning level alerts
|
|
131
|
+
closeNotify: TlsAlert.createWarning(TlsAlert.CLOSE_NOTIFY),
|
|
132
|
+
unsupportedExtension: TlsAlert.createWarning(TlsAlert.UNSUPPORTED_EXTENSION),
|
|
133
|
+
certificateRequired: TlsAlert.createWarning(TlsAlert.CERTIFICATE_REQUIRED),
|
|
134
|
+
unrecognizedName: TlsAlert.createWarning(TlsAlert.UNRECOGNIZED_NAME),
|
|
135
|
+
noRenegotiation: TlsAlert.createWarning(TlsAlert.NO_RENEGOTIATION),
|
|
136
|
+
userCanceled: TlsAlert.createWarning(TlsAlert.USER_CANCELED),
|
|
137
|
+
// Warning level alerts for session resumption
|
|
138
|
+
certificateExpiredWarning: TlsAlert.createWarning(TlsAlert.CERTIFICATE_EXPIRED),
|
|
139
|
+
handshakeFailureWarning: TlsAlert.createWarning(TlsAlert.HANDSHAKE_FAILURE),
|
|
140
|
+
insufficientSecurityWarning: TlsAlert.createWarning(TlsAlert.INSUFFICIENT_SECURITY),
|
|
141
|
+
// Fatal level alerts
|
|
142
|
+
unexpectedMessage: TlsAlert.createFatal(TlsAlert.UNEXPECTED_MESSAGE),
|
|
143
|
+
badRecordMac: TlsAlert.createFatal(TlsAlert.BAD_RECORD_MAC),
|
|
144
|
+
recordOverflow: TlsAlert.createFatal(TlsAlert.RECORD_OVERFLOW),
|
|
145
|
+
handshakeFailure: TlsAlert.createFatal(TlsAlert.HANDSHAKE_FAILURE),
|
|
146
|
+
badCertificate: TlsAlert.createFatal(TlsAlert.BAD_CERTIFICATE),
|
|
147
|
+
certificateExpired: TlsAlert.createFatal(TlsAlert.CERTIFICATE_EXPIRED),
|
|
148
|
+
certificateUnknown: TlsAlert.createFatal(TlsAlert.CERTIFICATE_UNKNOWN),
|
|
149
|
+
illegalParameter: TlsAlert.createFatal(TlsAlert.ILLEGAL_PARAMETER),
|
|
150
|
+
unknownCA: TlsAlert.createFatal(TlsAlert.UNKNOWN_CA),
|
|
151
|
+
accessDenied: TlsAlert.createFatal(TlsAlert.ACCESS_DENIED),
|
|
152
|
+
decodeError: TlsAlert.createFatal(TlsAlert.DECODE_ERROR),
|
|
153
|
+
decryptError: TlsAlert.createFatal(TlsAlert.DECRYPT_ERROR),
|
|
154
|
+
protocolVersion: TlsAlert.createFatal(TlsAlert.PROTOCOL_VERSION),
|
|
155
|
+
insufficientSecurity: TlsAlert.createFatal(TlsAlert.INSUFFICIENT_SECURITY),
|
|
156
|
+
internalError: TlsAlert.createFatal(TlsAlert.INTERNAL_ERROR),
|
|
157
|
+
unrecognizedNameFatal: TlsAlert.createFatal(TlsAlert.UNRECOGNIZED_NAME),
|
|
158
|
+
}; }
|
|
159
|
+
/**
|
|
160
|
+
* Utility method to send a warning-level unrecognized_name alert
|
|
161
|
+
* Specifically designed for SNI issues to encourage the client to retry with SNI
|
|
162
|
+
*
|
|
163
|
+
* @param socket The socket to send the alert to
|
|
164
|
+
* @returns Promise that resolves when the alert has been sent
|
|
165
|
+
*/
|
|
166
|
+
static async sendSniRequired(socket) {
|
|
167
|
+
return this.send(socket, this.LEVEL_WARNING, this.UNRECOGNIZED_NAME);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Utility method to send a close_notify alert and close the connection
|
|
171
|
+
*
|
|
172
|
+
* @param socket The socket to send the alert to
|
|
173
|
+
* @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
|
|
174
|
+
* @returns Promise that resolves when the alert has been sent and the connection closed
|
|
175
|
+
*/
|
|
176
|
+
static async sendCloseNotify(socket, closeDelay = 200) {
|
|
177
|
+
return this.send(socket, this.LEVEL_WARNING, this.CLOSE_NOTIFY, true, closeDelay);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Utility method to send a certificate_expired alert to force new TLS session
|
|
181
|
+
*
|
|
182
|
+
* @param socket The socket to send the alert to
|
|
183
|
+
* @param fatal Whether to send as a fatal alert (default: false)
|
|
184
|
+
* @param closeAfterSend Whether to close the connection after sending the alert (default: true)
|
|
185
|
+
* @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
|
|
186
|
+
* @returns Promise that resolves when the alert has been sent
|
|
187
|
+
*/
|
|
188
|
+
static async sendCertificateExpired(socket, fatal = false, closeAfterSend = true, closeDelay = 200) {
|
|
189
|
+
const level = fatal ? this.LEVEL_FATAL : this.LEVEL_WARNING;
|
|
190
|
+
return this.send(socket, level, this.CERTIFICATE_EXPIRED, closeAfterSend, closeDelay);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Send a sequence of alerts to force SNI from clients
|
|
194
|
+
* This combines multiple alerts to ensure maximum browser compatibility
|
|
195
|
+
*
|
|
196
|
+
* @param socket The socket to send the alerts to
|
|
197
|
+
* @returns Promise that resolves when all alerts have been sent
|
|
198
|
+
*/
|
|
199
|
+
static async sendForceSniSequence(socket) {
|
|
200
|
+
try {
|
|
201
|
+
// Send unrecognized_name (warning)
|
|
202
|
+
socket.cork();
|
|
203
|
+
socket.write(this.alerts.unrecognizedName);
|
|
204
|
+
socket.uncork();
|
|
205
|
+
// Give the socket time to send the alert
|
|
206
|
+
return new Promise((resolve) => {
|
|
207
|
+
setTimeout(resolve, 50);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
return Promise.reject(err);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Send a fatal level alert that immediately terminates the connection
|
|
216
|
+
*
|
|
217
|
+
* @param socket The socket to send the alert to
|
|
218
|
+
* @param description Alert description code
|
|
219
|
+
* @param closeDelay Milliseconds to wait before closing the connection (default: 100ms)
|
|
220
|
+
* @returns Promise that resolves when the alert has been sent and the connection closed
|
|
221
|
+
*/
|
|
222
|
+
static async sendFatalAndClose(socket, description, closeDelay = 100) {
|
|
223
|
+
return this.send(socket, this.LEVEL_FATAL, description, true, closeDelay);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLWFsZXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvcHJvdG9jb2xzL3Rscy9hbGVydHMvdGxzLWFsZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2Rjs7R0FFRztBQUNILE1BQU0sT0FBTyxRQUFRO0lBQ25CLHFDQUFxQzthQUNyQixrQkFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7YUFDdEMsZ0JBQVcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBRWxELDJDQUEyQzthQUMzQixpQkFBWSxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQzthQUNoRCx1QkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQzthQUM1RCxtQkFBYyxHQUFHLG1CQUFtQixDQUFDLGNBQWMsQ0FBQzthQUNwRCxzQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQzthQUMxRCxvQkFBZSxHQUFHLG1CQUFtQixDQUFDLGVBQWUsQ0FBQzthQUN0RCwwQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQzthQUNsRSxzQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQzthQUMxRCxtQkFBYyxHQUFHLG1CQUFtQixDQUFDLGNBQWMsQ0FBQzthQUNwRCxvQkFBZSxHQUFHLG1CQUFtQixDQUFDLGVBQWUsQ0FBQzthQUN0RCw0QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQzthQUN0RSx3QkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQzthQUM5RCx3QkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQzthQUM5RCx3QkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FB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
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Constants
|
|
3
|
+
* Based on various TLS RFCs
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* TLS record types as defined in various RFCs
|
|
7
|
+
*/
|
|
8
|
+
export declare enum TlsRecordType {
|
|
9
|
+
CHANGE_CIPHER_SPEC = 20,
|
|
10
|
+
ALERT = 21,
|
|
11
|
+
HANDSHAKE = 22,
|
|
12
|
+
APPLICATION_DATA = 23,
|
|
13
|
+
HEARTBEAT = 24
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* TLS handshake message types
|
|
17
|
+
*/
|
|
18
|
+
export declare enum TlsHandshakeType {
|
|
19
|
+
HELLO_REQUEST = 0,
|
|
20
|
+
CLIENT_HELLO = 1,
|
|
21
|
+
SERVER_HELLO = 2,
|
|
22
|
+
NEW_SESSION_TICKET = 4,
|
|
23
|
+
ENCRYPTED_EXTENSIONS = 8,// TLS 1.3
|
|
24
|
+
CERTIFICATE = 11,
|
|
25
|
+
SERVER_KEY_EXCHANGE = 12,
|
|
26
|
+
CERTIFICATE_REQUEST = 13,
|
|
27
|
+
SERVER_HELLO_DONE = 14,
|
|
28
|
+
CERTIFICATE_VERIFY = 15,
|
|
29
|
+
CLIENT_KEY_EXCHANGE = 16,
|
|
30
|
+
FINISHED = 20
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* TLS extension types
|
|
34
|
+
*/
|
|
35
|
+
export declare enum TlsExtensionType {
|
|
36
|
+
SERVER_NAME = 0,// SNI
|
|
37
|
+
MAX_FRAGMENT_LENGTH = 1,
|
|
38
|
+
CLIENT_CERTIFICATE_URL = 2,
|
|
39
|
+
TRUSTED_CA_KEYS = 3,
|
|
40
|
+
TRUNCATED_HMAC = 4,
|
|
41
|
+
STATUS_REQUEST = 5,// OCSP
|
|
42
|
+
SUPPORTED_GROUPS = 10,// Previously named "elliptic_curves"
|
|
43
|
+
EC_POINT_FORMATS = 11,
|
|
44
|
+
SIGNATURE_ALGORITHMS = 13,
|
|
45
|
+
APPLICATION_LAYER_PROTOCOL_NEGOTIATION = 16,// ALPN
|
|
46
|
+
SIGNED_CERTIFICATE_TIMESTAMP = 18,// Certificate Transparency
|
|
47
|
+
PADDING = 21,
|
|
48
|
+
SESSION_TICKET = 35,
|
|
49
|
+
PRE_SHARED_KEY = 41,// TLS 1.3
|
|
50
|
+
EARLY_DATA = 42,// TLS 1.3 0-RTT
|
|
51
|
+
SUPPORTED_VERSIONS = 43,// TLS 1.3
|
|
52
|
+
COOKIE = 44,// TLS 1.3
|
|
53
|
+
PSK_KEY_EXCHANGE_MODES = 45,// TLS 1.3
|
|
54
|
+
CERTIFICATE_AUTHORITIES = 47,// TLS 1.3
|
|
55
|
+
POST_HANDSHAKE_AUTH = 49,// TLS 1.3
|
|
56
|
+
SIGNATURE_ALGORITHMS_CERT = 50,// TLS 1.3
|
|
57
|
+
KEY_SHARE = 51
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* TLS alert levels
|
|
61
|
+
*/
|
|
62
|
+
export declare enum TlsAlertLevel {
|
|
63
|
+
WARNING = 1,
|
|
64
|
+
FATAL = 2
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* TLS alert description codes
|
|
68
|
+
*/
|
|
69
|
+
export declare enum TlsAlertDescription {
|
|
70
|
+
CLOSE_NOTIFY = 0,
|
|
71
|
+
UNEXPECTED_MESSAGE = 10,
|
|
72
|
+
BAD_RECORD_MAC = 20,
|
|
73
|
+
DECRYPTION_FAILED = 21,// TLS 1.0 only
|
|
74
|
+
RECORD_OVERFLOW = 22,
|
|
75
|
+
DECOMPRESSION_FAILURE = 30,// TLS 1.2 and below
|
|
76
|
+
HANDSHAKE_FAILURE = 40,
|
|
77
|
+
NO_CERTIFICATE = 41,// SSLv3 only
|
|
78
|
+
BAD_CERTIFICATE = 42,
|
|
79
|
+
UNSUPPORTED_CERTIFICATE = 43,
|
|
80
|
+
CERTIFICATE_REVOKED = 44,
|
|
81
|
+
CERTIFICATE_EXPIRED = 45,
|
|
82
|
+
CERTIFICATE_UNKNOWN = 46,
|
|
83
|
+
ILLEGAL_PARAMETER = 47,
|
|
84
|
+
UNKNOWN_CA = 48,
|
|
85
|
+
ACCESS_DENIED = 49,
|
|
86
|
+
DECODE_ERROR = 50,
|
|
87
|
+
DECRYPT_ERROR = 51,
|
|
88
|
+
EXPORT_RESTRICTION = 60,// TLS 1.0 only
|
|
89
|
+
PROTOCOL_VERSION = 70,
|
|
90
|
+
INSUFFICIENT_SECURITY = 71,
|
|
91
|
+
INTERNAL_ERROR = 80,
|
|
92
|
+
INAPPROPRIATE_FALLBACK = 86,
|
|
93
|
+
USER_CANCELED = 90,
|
|
94
|
+
NO_RENEGOTIATION = 100,// TLS 1.2 and below
|
|
95
|
+
MISSING_EXTENSION = 109,// TLS 1.3
|
|
96
|
+
UNSUPPORTED_EXTENSION = 110,// TLS 1.3
|
|
97
|
+
CERTIFICATE_REQUIRED = 111,// TLS 1.3
|
|
98
|
+
UNRECOGNIZED_NAME = 112,
|
|
99
|
+
BAD_CERTIFICATE_STATUS_RESPONSE = 113,
|
|
100
|
+
BAD_CERTIFICATE_HASH_VALUE = 114,// TLS 1.2 and below
|
|
101
|
+
UNKNOWN_PSK_IDENTITY = 115,
|
|
102
|
+
CERTIFICATE_REQUIRED_1_3 = 116,// TLS 1.3
|
|
103
|
+
NO_APPLICATION_PROTOCOL = 120
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* TLS version codes (major.minor)
|
|
107
|
+
*/
|
|
108
|
+
export declare const TlsVersion: {
|
|
109
|
+
readonly SSL3: readonly [3, 0];
|
|
110
|
+
readonly TLS1_0: readonly [3, 1];
|
|
111
|
+
readonly TLS1_1: readonly [3, 2];
|
|
112
|
+
readonly TLS1_2: readonly [3, 3];
|
|
113
|
+
readonly TLS1_3: readonly [3, 4];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* TLS version strings
|
|
117
|
+
*/
|
|
118
|
+
export type TTlsVersionString = 'SSLv3' | 'TLSv1.0' | 'TLSv1.1' | 'TLSv1.2' | 'TLSv1.3';
|
|
119
|
+
/**
|
|
120
|
+
* Convert TLS version bytes to version string
|
|
121
|
+
*/
|
|
122
|
+
export declare function tlsVersionToString(major: number, minor: number): TTlsVersionString | null;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Constants
|
|
3
|
+
* Based on various TLS RFCs
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* TLS record types as defined in various RFCs
|
|
7
|
+
*/
|
|
8
|
+
export var TlsRecordType;
|
|
9
|
+
(function (TlsRecordType) {
|
|
10
|
+
TlsRecordType[TlsRecordType["CHANGE_CIPHER_SPEC"] = 20] = "CHANGE_CIPHER_SPEC";
|
|
11
|
+
TlsRecordType[TlsRecordType["ALERT"] = 21] = "ALERT";
|
|
12
|
+
TlsRecordType[TlsRecordType["HANDSHAKE"] = 22] = "HANDSHAKE";
|
|
13
|
+
TlsRecordType[TlsRecordType["APPLICATION_DATA"] = 23] = "APPLICATION_DATA";
|
|
14
|
+
TlsRecordType[TlsRecordType["HEARTBEAT"] = 24] = "HEARTBEAT";
|
|
15
|
+
})(TlsRecordType || (TlsRecordType = {}));
|
|
16
|
+
/**
|
|
17
|
+
* TLS handshake message types
|
|
18
|
+
*/
|
|
19
|
+
export var TlsHandshakeType;
|
|
20
|
+
(function (TlsHandshakeType) {
|
|
21
|
+
TlsHandshakeType[TlsHandshakeType["HELLO_REQUEST"] = 0] = "HELLO_REQUEST";
|
|
22
|
+
TlsHandshakeType[TlsHandshakeType["CLIENT_HELLO"] = 1] = "CLIENT_HELLO";
|
|
23
|
+
TlsHandshakeType[TlsHandshakeType["SERVER_HELLO"] = 2] = "SERVER_HELLO";
|
|
24
|
+
TlsHandshakeType[TlsHandshakeType["NEW_SESSION_TICKET"] = 4] = "NEW_SESSION_TICKET";
|
|
25
|
+
TlsHandshakeType[TlsHandshakeType["ENCRYPTED_EXTENSIONS"] = 8] = "ENCRYPTED_EXTENSIONS";
|
|
26
|
+
TlsHandshakeType[TlsHandshakeType["CERTIFICATE"] = 11] = "CERTIFICATE";
|
|
27
|
+
TlsHandshakeType[TlsHandshakeType["SERVER_KEY_EXCHANGE"] = 12] = "SERVER_KEY_EXCHANGE";
|
|
28
|
+
TlsHandshakeType[TlsHandshakeType["CERTIFICATE_REQUEST"] = 13] = "CERTIFICATE_REQUEST";
|
|
29
|
+
TlsHandshakeType[TlsHandshakeType["SERVER_HELLO_DONE"] = 14] = "SERVER_HELLO_DONE";
|
|
30
|
+
TlsHandshakeType[TlsHandshakeType["CERTIFICATE_VERIFY"] = 15] = "CERTIFICATE_VERIFY";
|
|
31
|
+
TlsHandshakeType[TlsHandshakeType["CLIENT_KEY_EXCHANGE"] = 16] = "CLIENT_KEY_EXCHANGE";
|
|
32
|
+
TlsHandshakeType[TlsHandshakeType["FINISHED"] = 20] = "FINISHED";
|
|
33
|
+
})(TlsHandshakeType || (TlsHandshakeType = {}));
|
|
34
|
+
/**
|
|
35
|
+
* TLS extension types
|
|
36
|
+
*/
|
|
37
|
+
export var TlsExtensionType;
|
|
38
|
+
(function (TlsExtensionType) {
|
|
39
|
+
TlsExtensionType[TlsExtensionType["SERVER_NAME"] = 0] = "SERVER_NAME";
|
|
40
|
+
TlsExtensionType[TlsExtensionType["MAX_FRAGMENT_LENGTH"] = 1] = "MAX_FRAGMENT_LENGTH";
|
|
41
|
+
TlsExtensionType[TlsExtensionType["CLIENT_CERTIFICATE_URL"] = 2] = "CLIENT_CERTIFICATE_URL";
|
|
42
|
+
TlsExtensionType[TlsExtensionType["TRUSTED_CA_KEYS"] = 3] = "TRUSTED_CA_KEYS";
|
|
43
|
+
TlsExtensionType[TlsExtensionType["TRUNCATED_HMAC"] = 4] = "TRUNCATED_HMAC";
|
|
44
|
+
TlsExtensionType[TlsExtensionType["STATUS_REQUEST"] = 5] = "STATUS_REQUEST";
|
|
45
|
+
TlsExtensionType[TlsExtensionType["SUPPORTED_GROUPS"] = 10] = "SUPPORTED_GROUPS";
|
|
46
|
+
TlsExtensionType[TlsExtensionType["EC_POINT_FORMATS"] = 11] = "EC_POINT_FORMATS";
|
|
47
|
+
TlsExtensionType[TlsExtensionType["SIGNATURE_ALGORITHMS"] = 13] = "SIGNATURE_ALGORITHMS";
|
|
48
|
+
TlsExtensionType[TlsExtensionType["APPLICATION_LAYER_PROTOCOL_NEGOTIATION"] = 16] = "APPLICATION_LAYER_PROTOCOL_NEGOTIATION";
|
|
49
|
+
TlsExtensionType[TlsExtensionType["SIGNED_CERTIFICATE_TIMESTAMP"] = 18] = "SIGNED_CERTIFICATE_TIMESTAMP";
|
|
50
|
+
TlsExtensionType[TlsExtensionType["PADDING"] = 21] = "PADDING";
|
|
51
|
+
TlsExtensionType[TlsExtensionType["SESSION_TICKET"] = 35] = "SESSION_TICKET";
|
|
52
|
+
TlsExtensionType[TlsExtensionType["PRE_SHARED_KEY"] = 41] = "PRE_SHARED_KEY";
|
|
53
|
+
TlsExtensionType[TlsExtensionType["EARLY_DATA"] = 42] = "EARLY_DATA";
|
|
54
|
+
TlsExtensionType[TlsExtensionType["SUPPORTED_VERSIONS"] = 43] = "SUPPORTED_VERSIONS";
|
|
55
|
+
TlsExtensionType[TlsExtensionType["COOKIE"] = 44] = "COOKIE";
|
|
56
|
+
TlsExtensionType[TlsExtensionType["PSK_KEY_EXCHANGE_MODES"] = 45] = "PSK_KEY_EXCHANGE_MODES";
|
|
57
|
+
TlsExtensionType[TlsExtensionType["CERTIFICATE_AUTHORITIES"] = 47] = "CERTIFICATE_AUTHORITIES";
|
|
58
|
+
TlsExtensionType[TlsExtensionType["POST_HANDSHAKE_AUTH"] = 49] = "POST_HANDSHAKE_AUTH";
|
|
59
|
+
TlsExtensionType[TlsExtensionType["SIGNATURE_ALGORITHMS_CERT"] = 50] = "SIGNATURE_ALGORITHMS_CERT";
|
|
60
|
+
TlsExtensionType[TlsExtensionType["KEY_SHARE"] = 51] = "KEY_SHARE";
|
|
61
|
+
})(TlsExtensionType || (TlsExtensionType = {}));
|
|
62
|
+
/**
|
|
63
|
+
* TLS alert levels
|
|
64
|
+
*/
|
|
65
|
+
export var TlsAlertLevel;
|
|
66
|
+
(function (TlsAlertLevel) {
|
|
67
|
+
TlsAlertLevel[TlsAlertLevel["WARNING"] = 1] = "WARNING";
|
|
68
|
+
TlsAlertLevel[TlsAlertLevel["FATAL"] = 2] = "FATAL";
|
|
69
|
+
})(TlsAlertLevel || (TlsAlertLevel = {}));
|
|
70
|
+
/**
|
|
71
|
+
* TLS alert description codes
|
|
72
|
+
*/
|
|
73
|
+
export var TlsAlertDescription;
|
|
74
|
+
(function (TlsAlertDescription) {
|
|
75
|
+
TlsAlertDescription[TlsAlertDescription["CLOSE_NOTIFY"] = 0] = "CLOSE_NOTIFY";
|
|
76
|
+
TlsAlertDescription[TlsAlertDescription["UNEXPECTED_MESSAGE"] = 10] = "UNEXPECTED_MESSAGE";
|
|
77
|
+
TlsAlertDescription[TlsAlertDescription["BAD_RECORD_MAC"] = 20] = "BAD_RECORD_MAC";
|
|
78
|
+
TlsAlertDescription[TlsAlertDescription["DECRYPTION_FAILED"] = 21] = "DECRYPTION_FAILED";
|
|
79
|
+
TlsAlertDescription[TlsAlertDescription["RECORD_OVERFLOW"] = 22] = "RECORD_OVERFLOW";
|
|
80
|
+
TlsAlertDescription[TlsAlertDescription["DECOMPRESSION_FAILURE"] = 30] = "DECOMPRESSION_FAILURE";
|
|
81
|
+
TlsAlertDescription[TlsAlertDescription["HANDSHAKE_FAILURE"] = 40] = "HANDSHAKE_FAILURE";
|
|
82
|
+
TlsAlertDescription[TlsAlertDescription["NO_CERTIFICATE"] = 41] = "NO_CERTIFICATE";
|
|
83
|
+
TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE"] = 42] = "BAD_CERTIFICATE";
|
|
84
|
+
TlsAlertDescription[TlsAlertDescription["UNSUPPORTED_CERTIFICATE"] = 43] = "UNSUPPORTED_CERTIFICATE";
|
|
85
|
+
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REVOKED"] = 44] = "CERTIFICATE_REVOKED";
|
|
86
|
+
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_EXPIRED"] = 45] = "CERTIFICATE_EXPIRED";
|
|
87
|
+
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_UNKNOWN"] = 46] = "CERTIFICATE_UNKNOWN";
|
|
88
|
+
TlsAlertDescription[TlsAlertDescription["ILLEGAL_PARAMETER"] = 47] = "ILLEGAL_PARAMETER";
|
|
89
|
+
TlsAlertDescription[TlsAlertDescription["UNKNOWN_CA"] = 48] = "UNKNOWN_CA";
|
|
90
|
+
TlsAlertDescription[TlsAlertDescription["ACCESS_DENIED"] = 49] = "ACCESS_DENIED";
|
|
91
|
+
TlsAlertDescription[TlsAlertDescription["DECODE_ERROR"] = 50] = "DECODE_ERROR";
|
|
92
|
+
TlsAlertDescription[TlsAlertDescription["DECRYPT_ERROR"] = 51] = "DECRYPT_ERROR";
|
|
93
|
+
TlsAlertDescription[TlsAlertDescription["EXPORT_RESTRICTION"] = 60] = "EXPORT_RESTRICTION";
|
|
94
|
+
TlsAlertDescription[TlsAlertDescription["PROTOCOL_VERSION"] = 70] = "PROTOCOL_VERSION";
|
|
95
|
+
TlsAlertDescription[TlsAlertDescription["INSUFFICIENT_SECURITY"] = 71] = "INSUFFICIENT_SECURITY";
|
|
96
|
+
TlsAlertDescription[TlsAlertDescription["INTERNAL_ERROR"] = 80] = "INTERNAL_ERROR";
|
|
97
|
+
TlsAlertDescription[TlsAlertDescription["INAPPROPRIATE_FALLBACK"] = 86] = "INAPPROPRIATE_FALLBACK";
|
|
98
|
+
TlsAlertDescription[TlsAlertDescription["USER_CANCELED"] = 90] = "USER_CANCELED";
|
|
99
|
+
TlsAlertDescription[TlsAlertDescription["NO_RENEGOTIATION"] = 100] = "NO_RENEGOTIATION";
|
|
100
|
+
TlsAlertDescription[TlsAlertDescription["MISSING_EXTENSION"] = 109] = "MISSING_EXTENSION";
|
|
101
|
+
TlsAlertDescription[TlsAlertDescription["UNSUPPORTED_EXTENSION"] = 110] = "UNSUPPORTED_EXTENSION";
|
|
102
|
+
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REQUIRED"] = 111] = "CERTIFICATE_REQUIRED";
|
|
103
|
+
TlsAlertDescription[TlsAlertDescription["UNRECOGNIZED_NAME"] = 112] = "UNRECOGNIZED_NAME";
|
|
104
|
+
TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE_STATUS_RESPONSE"] = 113] = "BAD_CERTIFICATE_STATUS_RESPONSE";
|
|
105
|
+
TlsAlertDescription[TlsAlertDescription["BAD_CERTIFICATE_HASH_VALUE"] = 114] = "BAD_CERTIFICATE_HASH_VALUE";
|
|
106
|
+
TlsAlertDescription[TlsAlertDescription["UNKNOWN_PSK_IDENTITY"] = 115] = "UNKNOWN_PSK_IDENTITY";
|
|
107
|
+
TlsAlertDescription[TlsAlertDescription["CERTIFICATE_REQUIRED_1_3"] = 116] = "CERTIFICATE_REQUIRED_1_3";
|
|
108
|
+
TlsAlertDescription[TlsAlertDescription["NO_APPLICATION_PROTOCOL"] = 120] = "NO_APPLICATION_PROTOCOL";
|
|
109
|
+
})(TlsAlertDescription || (TlsAlertDescription = {}));
|
|
110
|
+
/**
|
|
111
|
+
* TLS version codes (major.minor)
|
|
112
|
+
*/
|
|
113
|
+
export const TlsVersion = {
|
|
114
|
+
SSL3: [0x03, 0x00],
|
|
115
|
+
TLS1_0: [0x03, 0x01],
|
|
116
|
+
TLS1_1: [0x03, 0x02],
|
|
117
|
+
TLS1_2: [0x03, 0x03],
|
|
118
|
+
TLS1_3: [0x03, 0x04],
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Convert TLS version bytes to version string
|
|
122
|
+
*/
|
|
123
|
+
export function tlsVersionToString(major, minor) {
|
|
124
|
+
if (major === 0x03) {
|
|
125
|
+
switch (minor) {
|
|
126
|
+
case 0x00: return 'SSLv3';
|
|
127
|
+
case 0x01: return 'TLSv1.0';
|
|
128
|
+
case 0x02: return 'TLSv1.1';
|
|
129
|
+
case 0x03: return 'TLSv1.2';
|
|
130
|
+
case 0x04: return 'TLSv1.3';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJvdG9jb2xzL3Rscy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDhFQUF1QixDQUFBO0lBQ3ZCLG9EQUFVLENBQUE7SUFDViw0REFBYyxDQUFBO0lBQ2QsMEVBQXFCLENBQUE7SUFDckIsNERBQWMsQ0FBQTtBQUNoQixDQUFDLEVBTlcsYUFBYSxLQUFiLGFBQWEsUUFNeEI7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGdCQWFYO0FBYkQsV0FBWSxnQkFBZ0I7SUFDMUIseUVBQWlCLENBQUE7SUFDakIsdUVBQWdCLENBQUE7SUFDaEIsdUVBQWdCLENBQUE7SUFDaEIsbUZBQXNCLENBQUE7SUFDdEIsdUZBQXdCLENBQUE7SUFDeEIsc0VBQWdCLENBQUE7SUFDaEIsc0ZBQXdCLENBQUE7SUFDeEIsc0ZBQXdCLENBQUE7SUFDeEIsa0ZBQXNCLENBQUE7SUFDdEIsb0ZBQXVCLENBQUE7SUFDdkIsc0ZBQXdCLENBQUE7SUFDeEIsZ0VBQWEsQ0FBQTtBQUNmLENBQUMsRUFiVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBYTNCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxnQkF1Qlg7QUF2QkQsV0FBWSxnQkFBZ0I7SUFDMUIscUVBQWUsQ0FBQTtJQUNmLHFGQUF1QixDQUFBO0lBQ3ZCLDJGQUEwQixDQUFBO0lBQzFCLDZFQUFtQixDQUFBO0lBQ25CLDJFQUFrQixDQUFBO0lBQ2xCLDJFQUFrQixDQUFBO0lBQ2xCLGdGQUFxQixDQUFBO0lBQ3JCLGdGQUFxQixDQUFBO0lBQ3JCLHdGQUF5QixDQUFBO0lBQ3pCLDRIQUEyQyxDQUFBO0lBQzNDLHdHQUFpQyxDQUFBO0lBQ2pDLDhEQUFZLENBQUE7SUFDWiw0RUFB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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Module
|
|
3
|
+
* Contains generic TLS protocol knowledge including parsers, constants, and utilities
|
|
4
|
+
*/
|
|
5
|
+
export * from './alerts/index.js';
|
|
6
|
+
export * from './sni/index.js';
|
|
7
|
+
export * from './utils/index.js';
|
|
8
|
+
export { TlsUtils, TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from './utils/tls-utils.js';
|
|
9
|
+
export { TlsAlert } from './alerts/tls-alert.js';
|
|
10
|
+
export { ClientHelloParser } from './sni/client-hello-parser.js';
|
|
11
|
+
export { SniExtraction } from './sni/sni-extraction.js';
|
|
12
|
+
export declare function tlsVersionToString(major: number, minor: number): string | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Module
|
|
3
|
+
* Contains generic TLS protocol knowledge including parsers, constants, and utilities
|
|
4
|
+
*/
|
|
5
|
+
// Export all sub-modules
|
|
6
|
+
export * from './alerts/index.js';
|
|
7
|
+
export * from './sni/index.js';
|
|
8
|
+
export * from './utils/index.js';
|
|
9
|
+
// Re-export main utilities and types for convenience
|
|
10
|
+
export { TlsUtils, TlsRecordType, TlsHandshakeType, TlsExtensionType, TlsAlertLevel, TlsAlertDescription, TlsVersion } from './utils/tls-utils.js';
|
|
11
|
+
export { TlsAlert } from './alerts/tls-alert.js';
|
|
12
|
+
export { ClientHelloParser } from './sni/client-hello-parser.js';
|
|
13
|
+
export { SniExtraction } from './sni/sni-extraction.js';
|
|
14
|
+
// Export tlsVersionToString helper
|
|
15
|
+
export function tlsVersionToString(major, minor) {
|
|
16
|
+
if (major === 0x03) {
|
|
17
|
+
switch (minor) {
|
|
18
|
+
case 0x00: return 'SSLv3';
|
|
19
|
+
case 0x01: return 'TLSv1.0';
|
|
20
|
+
case 0x02: return 'TLSv1.1';
|
|
21
|
+
case 0x03: return 'TLSv1.2';
|
|
22
|
+
case 0x04: return 'TLSv1.3';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm90b2NvbHMvdGxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHlCQUF5QjtBQUN6QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyxxREFBcUQ7QUFDckQsT0FBTyxFQUNMLFFBQVEsRUFDUixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFeEQsbUNBQW1DO0FBQ25DLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUM3RCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQztZQUMxQixLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDO1lBQzVCLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUM7WUFDNUIsS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQztZQUM1QixLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS Protocol Parser
|
|
3
|
+
* Generic TLS parsing utilities separated from implementation logic
|
|
4
|
+
*/
|
|
5
|
+
import { Buffer } from 'buffer';
|
|
6
|
+
import type { ITlsExtension } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Result of a ClientHello parse operation
|
|
9
|
+
*/
|
|
10
|
+
export interface IClientHelloParseResult {
|
|
11
|
+
isValid: boolean;
|
|
12
|
+
version?: [number, number];
|
|
13
|
+
random?: Buffer;
|
|
14
|
+
sessionId?: Buffer;
|
|
15
|
+
hasSessionId: boolean;
|
|
16
|
+
cipherSuites?: Buffer;
|
|
17
|
+
compressionMethods?: Buffer;
|
|
18
|
+
extensions: ITlsExtension[];
|
|
19
|
+
serverNameList?: string[];
|
|
20
|
+
hasSessionTicket: boolean;
|
|
21
|
+
hasPsk: boolean;
|
|
22
|
+
hasEarlyData: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* TLS protocol parser utilities
|
|
27
|
+
*/
|
|
28
|
+
export declare class TlsParser {
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a buffer contains a TLS handshake record
|
|
31
|
+
*/
|
|
32
|
+
static isTlsHandshake(buffer: Buffer): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a buffer contains a TLS ClientHello message
|
|
35
|
+
*/
|
|
36
|
+
static isClientHello(buffer: Buffer): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Gets the record length from a TLS record header
|
|
39
|
+
*/
|
|
40
|
+
static getTlsRecordLength(buffer: Buffer): number;
|
|
41
|
+
/**
|
|
42
|
+
* Parses a TLS ClientHello message and extracts all components
|
|
43
|
+
*/
|
|
44
|
+
static parseClientHello(buffer: Buffer): IClientHelloParseResult;
|
|
45
|
+
/**
|
|
46
|
+
* Parses the server name extension data and extracts hostnames
|
|
47
|
+
*/
|
|
48
|
+
static parseServerNameExtension(data: Buffer): string[];
|
|
49
|
+
/**
|
|
50
|
+
* Extract SNI (Server Name Indication) from ClientHello
|
|
51
|
+
*/
|
|
52
|
+
static extractSNI(buffer: Buffer): string | null;
|
|
53
|
+
}
|