@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.
Files changed (164) hide show
  1. package/changelog.md +26 -0
  2. package/dist_ts/core/utils/proxy-protocol.d.ts +5 -17
  3. package/dist_ts/core/utils/proxy-protocol.js +13 -97
  4. package/dist_ts/core/utils/websocket-utils.d.ts +6 -7
  5. package/dist_ts/core/utils/websocket-utils.js +10 -66
  6. package/dist_ts/detection/detectors/http-detector-v2.d.ts +33 -0
  7. package/dist_ts/detection/detectors/http-detector-v2.js +87 -0
  8. package/dist_ts/detection/detectors/http-detector.d.ts +33 -0
  9. package/dist_ts/detection/detectors/http-detector.js +89 -0
  10. package/dist_ts/detection/detectors/quick-detector.d.ts +28 -0
  11. package/dist_ts/detection/detectors/quick-detector.js +131 -0
  12. package/dist_ts/detection/detectors/routing-extractor.d.ts +28 -0
  13. package/dist_ts/detection/detectors/routing-extractor.js +122 -0
  14. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +33 -0
  15. package/dist_ts/detection/detectors/tls-detector-v2.js +80 -0
  16. package/dist_ts/detection/detectors/tls-detector.d.ts +33 -0
  17. package/dist_ts/detection/detectors/tls-detector.js +106 -0
  18. package/dist_ts/detection/index.d.ts +17 -0
  19. package/dist_ts/detection/index.js +22 -0
  20. package/dist_ts/detection/models/detection-types.d.ts +87 -0
  21. package/dist_ts/detection/models/detection-types.js +5 -0
  22. package/dist_ts/detection/models/interfaces.d.ts +97 -0
  23. package/dist_ts/detection/models/interfaces.js +5 -0
  24. package/dist_ts/detection/protocol-detector-v2.d.ts +46 -0
  25. package/dist_ts/detection/protocol-detector-v2.js +116 -0
  26. package/dist_ts/detection/protocol-detector.d.ts +74 -0
  27. package/dist_ts/detection/protocol-detector.js +173 -0
  28. package/dist_ts/detection/utils/buffer-utils.d.ts +61 -0
  29. package/dist_ts/detection/utils/buffer-utils.js +127 -0
  30. package/dist_ts/detection/utils/fragment-manager.d.ts +31 -0
  31. package/dist_ts/detection/utils/fragment-manager.js +53 -0
  32. package/dist_ts/detection/utils/parser-utils.d.ts +42 -0
  33. package/dist_ts/detection/utils/parser-utils.js +63 -0
  34. package/dist_ts/index.d.ts +2 -1
  35. package/dist_ts/index.js +3 -2
  36. package/dist_ts/protocols/common/fragment-handler.d.ts +73 -0
  37. package/dist_ts/protocols/common/fragment-handler.js +117 -0
  38. package/dist_ts/protocols/common/index.d.ts +7 -0
  39. package/dist_ts/protocols/common/index.js +8 -0
  40. package/dist_ts/protocols/common/types.d.ts +68 -0
  41. package/dist_ts/protocols/common/types.js +7 -0
  42. package/dist_ts/protocols/http/constants.d.ts +119 -0
  43. package/dist_ts/protocols/http/constants.js +200 -0
  44. package/dist_ts/protocols/http/index.d.ts +7 -0
  45. package/dist_ts/protocols/http/index.js +8 -0
  46. package/dist_ts/protocols/http/parser.d.ts +58 -0
  47. package/dist_ts/protocols/http/parser.js +184 -0
  48. package/dist_ts/protocols/http/types.d.ts +62 -0
  49. package/dist_ts/protocols/http/types.js +5 -0
  50. package/dist_ts/protocols/index.d.ts +11 -0
  51. package/dist_ts/protocols/index.js +12 -0
  52. package/dist_ts/protocols/proxy/index.d.ts +6 -0
  53. package/dist_ts/protocols/proxy/index.js +7 -0
  54. package/dist_ts/protocols/proxy/parser.d.ts +44 -0
  55. package/dist_ts/protocols/proxy/parser.js +153 -0
  56. package/dist_ts/protocols/proxy/types.d.ts +47 -0
  57. package/dist_ts/protocols/proxy/types.js +6 -0
  58. package/dist_ts/protocols/tls/alerts/index.d.ts +4 -0
  59. package/dist_ts/protocols/tls/alerts/index.js +5 -0
  60. package/dist_ts/protocols/tls/alerts/tls-alert.d.ts +150 -0
  61. package/dist_ts/protocols/tls/alerts/tls-alert.js +226 -0
  62. package/dist_ts/protocols/tls/constants.d.ts +122 -0
  63. package/dist_ts/protocols/tls/constants.js +135 -0
  64. package/dist_ts/protocols/tls/index.d.ts +12 -0
  65. package/dist_ts/protocols/tls/index.js +27 -0
  66. package/dist_ts/protocols/tls/parser.d.ts +53 -0
  67. package/dist_ts/protocols/tls/parser.js +294 -0
  68. package/dist_ts/protocols/tls/sni/client-hello-parser.d.ts +100 -0
  69. package/dist_ts/protocols/tls/sni/client-hello-parser.js +463 -0
  70. package/dist_ts/protocols/tls/sni/index.d.ts +5 -0
  71. package/dist_ts/protocols/tls/sni/index.js +6 -0
  72. package/dist_ts/protocols/tls/sni/sni-extraction.d.ts +58 -0
  73. package/dist_ts/protocols/tls/sni/sni-extraction.js +275 -0
  74. package/dist_ts/protocols/tls/types.d.ts +65 -0
  75. package/dist_ts/protocols/tls/types.js +5 -0
  76. package/dist_ts/protocols/tls/utils/index.d.ts +4 -0
  77. package/dist_ts/protocols/tls/utils/index.js +5 -0
  78. package/dist_ts/protocols/tls/utils/tls-utils.d.ts +158 -0
  79. package/dist_ts/protocols/tls/utils/tls-utils.js +187 -0
  80. package/dist_ts/protocols/websocket/constants.d.ts +55 -0
  81. package/dist_ts/protocols/websocket/constants.js +58 -0
  82. package/dist_ts/protocols/websocket/index.d.ts +7 -0
  83. package/dist_ts/protocols/websocket/index.js +8 -0
  84. package/dist_ts/protocols/websocket/types.d.ts +47 -0
  85. package/dist_ts/protocols/websocket/types.js +5 -0
  86. package/dist_ts/protocols/websocket/utils.d.ts +25 -0
  87. package/dist_ts/protocols/websocket/utils.js +103 -0
  88. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +25 -27
  89. package/dist_ts/proxies/http-proxy/models/http-types.js +24 -44
  90. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -0
  91. package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
  92. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +81 -61
  93. package/dist_ts/proxies/smart-proxy/tls-manager.js +2 -1
  94. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +1 -2
  95. package/dist_ts/proxies/smart-proxy/utils/index.js +3 -4
  96. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +112 -8
  97. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +231 -76
  98. package/dist_ts/tls/index.d.ts +5 -7
  99. package/dist_ts/tls/index.js +8 -11
  100. package/dist_ts/tls/sni/client-hello-parser.js +3 -2
  101. package/dist_ts/tls/sni/sni-handler.js +4 -4
  102. package/dist_ts/tls/utils/tls-utils.d.ts +1 -110
  103. package/dist_ts/tls/utils/tls-utils.js +4 -116
  104. package/package.json +17 -8
  105. package/readme.md +471 -2345
  106. package/readme.plan.md +0 -0
  107. package/ts/core/utils/proxy-protocol.ts +14 -131
  108. package/ts/core/utils/websocket-utils.ts +12 -60
  109. package/ts/detection/detectors/http-detector.ts +114 -0
  110. package/ts/detection/detectors/quick-detector.ts +148 -0
  111. package/ts/detection/detectors/routing-extractor.ts +147 -0
  112. package/ts/detection/detectors/tls-detector.ts +120 -0
  113. package/ts/detection/index.ts +25 -0
  114. package/ts/detection/models/detection-types.ts +102 -0
  115. package/ts/detection/models/interfaces.ts +115 -0
  116. package/ts/detection/protocol-detector.ts +230 -0
  117. package/ts/detection/utils/buffer-utils.ts +141 -0
  118. package/ts/detection/utils/fragment-manager.ts +64 -0
  119. package/ts/detection/utils/parser-utils.ts +77 -0
  120. package/ts/index.ts +3 -2
  121. package/ts/protocols/common/fragment-handler.ts +163 -0
  122. package/ts/protocols/common/index.ts +8 -0
  123. package/ts/protocols/common/types.ts +76 -0
  124. package/ts/protocols/http/constants.ts +219 -0
  125. package/ts/protocols/http/index.ts +8 -0
  126. package/ts/protocols/http/parser.ts +219 -0
  127. package/ts/protocols/http/types.ts +70 -0
  128. package/ts/protocols/index.ts +12 -0
  129. package/ts/protocols/proxy/index.ts +7 -0
  130. package/ts/protocols/proxy/parser.ts +183 -0
  131. package/ts/protocols/proxy/types.ts +53 -0
  132. package/ts/{tls → protocols/tls}/alerts/tls-alert.ts +1 -1
  133. package/ts/protocols/tls/index.ts +37 -0
  134. package/ts/protocols/tls/sni/index.ts +6 -0
  135. package/ts/{tls → protocols/tls}/utils/tls-utils.ts +1 -1
  136. package/ts/protocols/websocket/constants.ts +60 -0
  137. package/ts/protocols/websocket/index.ts +8 -0
  138. package/ts/protocols/websocket/types.ts +53 -0
  139. package/ts/protocols/websocket/utils.ts +98 -0
  140. package/ts/proxies/http-proxy/models/http-types.ts +29 -46
  141. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -1
  142. package/ts/proxies/smart-proxy/models/route-types.ts +0 -1
  143. package/ts/proxies/smart-proxy/route-connection-handler.ts +91 -68
  144. package/ts/proxies/smart-proxy/tls-manager.ts +1 -0
  145. package/ts/proxies/smart-proxy/utils/index.ts +2 -13
  146. package/ts/proxies/smart-proxy/utils/route-helpers.ts +323 -86
  147. package/ts/tls/index.ts +8 -12
  148. package/ts/tls/sni/sni-handler.ts +3 -3
  149. package/ts/forwarding/config/forwarding-types.ts +0 -76
  150. package/ts/forwarding/config/index.ts +0 -26
  151. package/ts/forwarding/factory/forwarding-factory.ts +0 -189
  152. package/ts/forwarding/factory/index.ts +0 -5
  153. package/ts/forwarding/handlers/base-handler.ts +0 -155
  154. package/ts/forwarding/handlers/http-handler.ts +0 -163
  155. package/ts/forwarding/handlers/https-passthrough-handler.ts +0 -185
  156. package/ts/forwarding/handlers/https-terminate-to-http-handler.ts +0 -312
  157. package/ts/forwarding/handlers/https-terminate-to-https-handler.ts +0 -297
  158. package/ts/forwarding/handlers/index.ts +0 -9
  159. package/ts/forwarding/index.ts +0 -35
  160. package/ts/proxies/smart-proxy/utils/route-patterns.ts +0 -403
  161. /package/ts/{tls → protocols/tls}/alerts/index.ts +0 -0
  162. /package/ts/{tls → protocols/tls}/sni/client-hello-parser.ts +0 -0
  163. /package/ts/{tls → protocols/tls}/sni/sni-extraction.ts +0 -0
  164. /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
+ }