@push.rocks/smartproxy 23.0.0 → 23.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 +10 -0
- package/dist_rust/{rustproxy → rustproxy_linux_amd64} +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +9 -21
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +83 -212
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
- package/npmextra.json +3 -0
- package/package.json +13 -11
- package/readme.md +41 -11
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/plugins.ts +2 -0
- package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +102 -233
- package/ts/proxies/smart-proxy/smart-proxy.ts +1 -2
- package/dist_ts/common/eventUtils.d.ts +0 -14
- package/dist_ts/common/eventUtils.js +0 -20
- package/dist_ts/common/types.d.ts +0 -82
- package/dist_ts/common/types.js +0 -15
- package/dist_ts/core/utils/event-system.d.ts +0 -200
- package/dist_ts/core/utils/event-system.js +0 -224
- package/dist_ts/core/utils/event-utils.d.ts +0 -15
- package/dist_ts/core/utils/event-utils.js +0 -11
- package/dist_ts/core/utils/route-manager.d.ts +0 -88
- package/dist_ts/core/utils/route-manager.js +0 -342
- package/dist_ts/core/utils/route-utils.d.ts +0 -28
- package/dist_ts/core/utils/route-utils.js +0 -67
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/http-detector-v2.js +0 -87
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/tls-detector-v2.js +0 -80
- package/dist_ts/detection/protocol-detector-v2.d.ts +0 -46
- package/dist_ts/detection/protocol-detector-v2.js +0 -116
- package/dist_ts/forwarding/config/forwarding-types.d.ts +0 -42
- package/dist_ts/forwarding/config/forwarding-types.js +0 -18
- package/dist_ts/forwarding/config/index.d.ts +0 -9
- package/dist_ts/forwarding/config/index.js +0 -10
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +0 -25
- package/dist_ts/forwarding/factory/forwarding-factory.js +0 -172
- package/dist_ts/forwarding/factory/index.d.ts +0 -4
- package/dist_ts/forwarding/factory/index.js +0 -5
- package/dist_ts/forwarding/handlers/base-handler.d.ts +0 -62
- package/dist_ts/forwarding/handlers/base-handler.js +0 -121
- package/dist_ts/forwarding/handlers/http-handler.d.ts +0 -30
- package/dist_ts/forwarding/handlers/http-handler.js +0 -143
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +0 -29
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +0 -156
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +0 -36
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +0 -276
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +0 -35
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +0 -261
- package/dist_ts/forwarding/handlers/index.d.ts +0 -8
- package/dist_ts/forwarding/handlers/index.js +0 -9
- package/dist_ts/forwarding/index.d.ts +0 -13
- package/dist_ts/forwarding/index.js +0 -16
- package/dist_ts/http/index.d.ts +0 -5
- package/dist_ts/http/index.js +0 -8
- package/dist_ts/http/models/http-types.d.ts +0 -6
- package/dist_ts/http/models/http-types.js +0 -7
- package/dist_ts/http/router/index.d.ts +0 -8
- package/dist_ts/http/router/index.js +0 -7
- package/dist_ts/http/router/proxy-router.d.ts +0 -115
- package/dist_ts/http/router/proxy-router.js +0 -325
- package/dist_ts/http/router/route-router.d.ts +0 -108
- package/dist_ts/http/router/route-router.js +0 -393
- package/dist_ts/protocols/tls/constants.d.ts +0 -122
- package/dist_ts/protocols/tls/constants.js +0 -135
- package/dist_ts/protocols/tls/parser.d.ts +0 -53
- package/dist_ts/protocols/tls/parser.js +0 -294
- package/dist_ts/protocols/tls/types.d.ts +0 -65
- package/dist_ts/protocols/tls/types.js +0 -5
- package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/certificate-manager.js +0 -214
- package/dist_ts/proxies/http-proxy/connection-pool.d.ts +0 -47
- package/dist_ts/proxies/http-proxy/connection-pool.js +0 -195
- package/dist_ts/proxies/http-proxy/context-creator.d.ts +0 -34
- package/dist_ts/proxies/http-proxy/context-creator.js +0 -108
- package/dist_ts/proxies/http-proxy/default-certificates.d.ts +0 -54
- package/dist_ts/proxies/http-proxy/default-certificates.js +0 -127
- package/dist_ts/proxies/http-proxy/function-cache.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/function-cache.js +0 -215
- package/dist_ts/proxies/http-proxy/handlers/index.d.ts +0 -4
- package/dist_ts/proxies/http-proxy/handlers/index.js +0 -6
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +0 -18
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +0 -78
- package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +0 -19
- package/dist_ts/proxies/http-proxy/handlers/static-handler.js +0 -211
- package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/http-proxy.js +0 -521
- package/dist_ts/proxies/http-proxy/http-request-handler.d.ts +0 -40
- package/dist_ts/proxies/http-proxy/http-request-handler.js +0 -257
- package/dist_ts/proxies/http-proxy/http2-request-handler.d.ts +0 -24
- package/dist_ts/proxies/http-proxy/http2-request-handler.js +0 -201
- package/dist_ts/proxies/http-proxy/index.d.ts +0 -14
- package/dist_ts/proxies/http-proxy/index.js +0 -16
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/models/http-types.js +0 -92
- package/dist_ts/proxies/http-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/http-proxy/models/index.js +0 -6
- package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -75
- package/dist_ts/proxies/http-proxy/models/types.js +0 -35
- package/dist_ts/proxies/http-proxy/request-handler.d.ts +0 -97
- package/dist_ts/proxies/http-proxy/request-handler.js +0 -737
- package/dist_ts/proxies/http-proxy/security-manager.d.ts +0 -98
- package/dist_ts/proxies/http-proxy/security-manager.js +0 -341
- package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +0 -50
- package/dist_ts/proxies/http-proxy/websocket-handler.js +0 -505
- package/dist_ts/proxies/smart-proxy/acme-state-manager.d.ts +0 -42
- package/dist_ts/proxies/smart-proxy/acme-state-manager.js +0 -101
- package/dist_ts/proxies/smart-proxy/cert-store.d.ts +0 -10
- package/dist_ts/proxies/smart-proxy/cert-store.js +0 -72
- package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +0 -164
- package/dist_ts/proxies/smart-proxy/certificate-manager.js +0 -745
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +0 -128
- package/dist_ts/proxies/smart-proxy/connection-manager.js +0 -689
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +0 -43
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +0 -180
- package/dist_ts/proxies/smart-proxy/metrics-collector.d.ts +0 -98
- package/dist_ts/proxies/smart-proxy/metrics-collector.js +0 -355
- package/dist_ts/proxies/smart-proxy/nftables-manager.d.ts +0 -82
- package/dist_ts/proxies/smart-proxy/nftables-manager.js +0 -237
- package/dist_ts/proxies/smart-proxy/port-manager.d.ts +0 -117
- package/dist_ts/proxies/smart-proxy/port-manager.js +0 -318
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -60
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +0 -1407
- package/dist_ts/proxies/smart-proxy/route-manager.d.ts +0 -112
- package/dist_ts/proxies/smart-proxy/route-manager.js +0 -453
- package/dist_ts/proxies/smart-proxy/route-orchestrator.d.ts +0 -56
- package/dist_ts/proxies/smart-proxy/route-orchestrator.js +0 -204
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +0 -23
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +0 -104
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +0 -74
- package/dist_ts/proxies/smart-proxy/security-manager.js +0 -227
- package/dist_ts/proxies/smart-proxy/throughput-tracker.d.ts +0 -36
- package/dist_ts/proxies/smart-proxy/throughput-tracker.js +0 -115
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +0 -48
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +0 -158
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +0 -50
- package/dist_ts/proxies/smart-proxy/tls-manager.js +0 -110
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +0 -161
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +0 -282
- package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +0 -73
- package/dist_ts/proxies/smart-proxy/utils/route-validators.js +0 -259
- package/dist_ts/routing/router/proxy-router.d.ts +0 -115
- package/dist_ts/routing/router/proxy-router.js +0 -325
- package/dist_ts/routing/router/route-router.d.ts +0 -108
- package/dist_ts/routing/router/route-router.js +0 -393
- package/dist_ts/tls/alerts/index.d.ts +0 -4
- package/dist_ts/tls/alerts/index.js +0 -5
- package/dist_ts/tls/alerts/tls-alert.d.ts +0 -150
- package/dist_ts/tls/alerts/tls-alert.js +0 -226
- package/dist_ts/tls/sni/client-hello-parser.d.ts +0 -100
- package/dist_ts/tls/sni/client-hello-parser.js +0 -464
- package/dist_ts/tls/sni/sni-extraction.d.ts +0 -58
- package/dist_ts/tls/sni/sni-extraction.js +0 -275
- package/dist_ts/tls/utils/index.d.ts +0 -4
- package/dist_ts/tls/utils/index.js +0 -5
- package/dist_ts/tls/utils/tls-utils.d.ts +0 -49
- package/dist_ts/tls/utils/tls-utils.js +0 -75
- package/ts/proxies/smart-proxy/rust-binary-locator.ts +0 -112
|
@@ -1,135 +0,0 @@
|
|
|
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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
|
|
@@ -1,53 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TLS Protocol Parser
|
|
3
|
-
* Generic TLS parsing utilities separated from implementation logic
|
|
4
|
-
*/
|
|
5
|
-
import { Buffer } from 'buffer';
|
|
6
|
-
import { TlsRecordType, TlsHandshakeType, TlsExtensionType } from './constants.js';
|
|
7
|
-
/**
|
|
8
|
-
* TLS protocol parser utilities
|
|
9
|
-
*/
|
|
10
|
-
export class TlsParser {
|
|
11
|
-
/**
|
|
12
|
-
* Checks if a buffer contains a TLS handshake record
|
|
13
|
-
*/
|
|
14
|
-
static isTlsHandshake(buffer) {
|
|
15
|
-
return buffer.length > 0 && buffer[0] === TlsRecordType.HANDSHAKE;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Checks if a buffer contains a TLS ClientHello message
|
|
19
|
-
*/
|
|
20
|
-
static isClientHello(buffer) {
|
|
21
|
-
// Minimum ClientHello size (TLS record header + handshake header)
|
|
22
|
-
if (buffer.length < 9) {
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
// Check record type (must be TLS_HANDSHAKE_RECORD_TYPE)
|
|
26
|
-
if (buffer[0] !== TlsRecordType.HANDSHAKE) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
// Check handshake type at byte 5 (must be CLIENT_HELLO)
|
|
30
|
-
return buffer[5] === TlsHandshakeType.CLIENT_HELLO;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Gets the record length from a TLS record header
|
|
34
|
-
*/
|
|
35
|
-
static getTlsRecordLength(buffer) {
|
|
36
|
-
if (buffer.length < 5) {
|
|
37
|
-
return -1;
|
|
38
|
-
}
|
|
39
|
-
// Bytes 3-4 contain the record length (big-endian)
|
|
40
|
-
return (buffer[3] << 8) + buffer[4];
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Parses a TLS ClientHello message and extracts all components
|
|
44
|
-
*/
|
|
45
|
-
static parseClientHello(buffer) {
|
|
46
|
-
const result = {
|
|
47
|
-
isValid: false,
|
|
48
|
-
hasSessionId: false,
|
|
49
|
-
extensions: [],
|
|
50
|
-
hasSessionTicket: false,
|
|
51
|
-
hasPsk: false,
|
|
52
|
-
hasEarlyData: false
|
|
53
|
-
};
|
|
54
|
-
try {
|
|
55
|
-
// Check basic validity
|
|
56
|
-
if (buffer.length < 5) {
|
|
57
|
-
result.error = 'Buffer too small for TLS record header';
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
// Check record type (must be HANDSHAKE)
|
|
61
|
-
if (buffer[0] !== TlsRecordType.HANDSHAKE) {
|
|
62
|
-
result.error = `Not a TLS handshake record: ${buffer[0]}`;
|
|
63
|
-
return result;
|
|
64
|
-
}
|
|
65
|
-
// Get TLS version from record header
|
|
66
|
-
const majorVersion = buffer[1];
|
|
67
|
-
const minorVersion = buffer[2];
|
|
68
|
-
result.version = [majorVersion, minorVersion];
|
|
69
|
-
// Parse record length (bytes 3-4, big-endian)
|
|
70
|
-
const recordLength = (buffer[3] << 8) + buffer[4];
|
|
71
|
-
// Validate record length against buffer size
|
|
72
|
-
if (buffer.length < recordLength + 5) {
|
|
73
|
-
result.error = 'Buffer smaller than expected record length';
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
// Start of handshake message in the buffer
|
|
77
|
-
let pos = 5;
|
|
78
|
-
// Check handshake type (must be CLIENT_HELLO)
|
|
79
|
-
if (buffer[pos] !== TlsHandshakeType.CLIENT_HELLO) {
|
|
80
|
-
result.error = `Not a ClientHello message: ${buffer[pos]}`;
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
// Skip handshake type (1 byte)
|
|
84
|
-
pos += 1;
|
|
85
|
-
// Parse handshake length (3 bytes, big-endian)
|
|
86
|
-
const handshakeLength = (buffer[pos] << 16) + (buffer[pos + 1] << 8) + buffer[pos + 2];
|
|
87
|
-
// Skip handshake length (3 bytes)
|
|
88
|
-
pos += 3;
|
|
89
|
-
// Skip client version (2 bytes)
|
|
90
|
-
pos += 2;
|
|
91
|
-
// Extract client random (32 bytes)
|
|
92
|
-
if (pos + 32 > buffer.length) {
|
|
93
|
-
result.error = 'Buffer too small for client random';
|
|
94
|
-
return result;
|
|
95
|
-
}
|
|
96
|
-
result.random = buffer.slice(pos, pos + 32);
|
|
97
|
-
// Skip client random (32 bytes)
|
|
98
|
-
pos += 32;
|
|
99
|
-
// Parse session ID
|
|
100
|
-
if (pos + 1 > buffer.length) {
|
|
101
|
-
result.error = 'Buffer too small for session ID length';
|
|
102
|
-
return result;
|
|
103
|
-
}
|
|
104
|
-
const sessionIdLength = buffer[pos];
|
|
105
|
-
pos += 1;
|
|
106
|
-
result.hasSessionId = sessionIdLength > 0;
|
|
107
|
-
if (sessionIdLength > 0) {
|
|
108
|
-
if (pos + sessionIdLength > buffer.length) {
|
|
109
|
-
result.error = 'Buffer too small for session ID';
|
|
110
|
-
return result;
|
|
111
|
-
}
|
|
112
|
-
result.sessionId = buffer.slice(pos, pos + sessionIdLength);
|
|
113
|
-
}
|
|
114
|
-
// Skip session ID
|
|
115
|
-
pos += sessionIdLength;
|
|
116
|
-
// Check if we have enough bytes left for cipher suites
|
|
117
|
-
if (pos + 2 > buffer.length) {
|
|
118
|
-
result.error = 'Buffer too small for cipher suites length';
|
|
119
|
-
return result;
|
|
120
|
-
}
|
|
121
|
-
// Parse cipher suites length (2 bytes, big-endian)
|
|
122
|
-
const cipherSuitesLength = (buffer[pos] << 8) + buffer[pos + 1];
|
|
123
|
-
pos += 2;
|
|
124
|
-
// Extract cipher suites
|
|
125
|
-
if (pos + cipherSuitesLength > buffer.length) {
|
|
126
|
-
result.error = 'Buffer too small for cipher suites';
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
result.cipherSuites = buffer.slice(pos, pos + cipherSuitesLength);
|
|
130
|
-
// Skip cipher suites
|
|
131
|
-
pos += cipherSuitesLength;
|
|
132
|
-
// Check if we have enough bytes left for compression methods
|
|
133
|
-
if (pos + 1 > buffer.length) {
|
|
134
|
-
result.error = 'Buffer too small for compression methods length';
|
|
135
|
-
return result;
|
|
136
|
-
}
|
|
137
|
-
// Parse compression methods length (1 byte)
|
|
138
|
-
const compressionMethodsLength = buffer[pos];
|
|
139
|
-
pos += 1;
|
|
140
|
-
// Extract compression methods
|
|
141
|
-
if (pos + compressionMethodsLength > buffer.length) {
|
|
142
|
-
result.error = 'Buffer too small for compression methods';
|
|
143
|
-
return result;
|
|
144
|
-
}
|
|
145
|
-
result.compressionMethods = buffer.slice(pos, pos + compressionMethodsLength);
|
|
146
|
-
// Skip compression methods
|
|
147
|
-
pos += compressionMethodsLength;
|
|
148
|
-
// Check if we have enough bytes for extensions length
|
|
149
|
-
if (pos + 2 > buffer.length) {
|
|
150
|
-
// No extensions present - this is valid for older TLS versions
|
|
151
|
-
result.isValid = true;
|
|
152
|
-
return result;
|
|
153
|
-
}
|
|
154
|
-
// Parse extensions length (2 bytes, big-endian)
|
|
155
|
-
const extensionsLength = (buffer[pos] << 8) + buffer[pos + 1];
|
|
156
|
-
pos += 2;
|
|
157
|
-
// Extensions end position
|
|
158
|
-
const extensionsEnd = pos + extensionsLength;
|
|
159
|
-
// Check if extensions length is valid
|
|
160
|
-
if (extensionsEnd > buffer.length) {
|
|
161
|
-
result.error = 'Extensions length exceeds buffer size';
|
|
162
|
-
return result;
|
|
163
|
-
}
|
|
164
|
-
// Iterate through extensions
|
|
165
|
-
const serverNames = [];
|
|
166
|
-
while (pos + 4 <= extensionsEnd) {
|
|
167
|
-
// Parse extension type (2 bytes, big-endian)
|
|
168
|
-
const extensionType = (buffer[pos] << 8) + buffer[pos + 1];
|
|
169
|
-
pos += 2;
|
|
170
|
-
// Parse extension length (2 bytes, big-endian)
|
|
171
|
-
const extensionLength = (buffer[pos] << 8) + buffer[pos + 1];
|
|
172
|
-
pos += 2;
|
|
173
|
-
// Extract extension data
|
|
174
|
-
if (pos + extensionLength > extensionsEnd) {
|
|
175
|
-
result.error = `Extension ${extensionType} data exceeds bounds`;
|
|
176
|
-
return result;
|
|
177
|
-
}
|
|
178
|
-
const extensionData = buffer.slice(pos, pos + extensionLength);
|
|
179
|
-
// Record all extensions
|
|
180
|
-
result.extensions.push({
|
|
181
|
-
type: extensionType,
|
|
182
|
-
data: extensionData
|
|
183
|
-
});
|
|
184
|
-
// Track specific extension types
|
|
185
|
-
if (extensionType === TlsExtensionType.SERVER_NAME) {
|
|
186
|
-
// Server Name Indication (SNI)
|
|
187
|
-
const sniNames = this.parseServerNameExtension(extensionData);
|
|
188
|
-
serverNames.push(...sniNames);
|
|
189
|
-
}
|
|
190
|
-
else if (extensionType === TlsExtensionType.SESSION_TICKET) {
|
|
191
|
-
// Session ticket
|
|
192
|
-
result.hasSessionTicket = true;
|
|
193
|
-
}
|
|
194
|
-
else if (extensionType === TlsExtensionType.PRE_SHARED_KEY) {
|
|
195
|
-
// TLS 1.3 PSK
|
|
196
|
-
result.hasPsk = true;
|
|
197
|
-
}
|
|
198
|
-
else if (extensionType === TlsExtensionType.EARLY_DATA) {
|
|
199
|
-
// TLS 1.3 Early Data (0-RTT)
|
|
200
|
-
result.hasEarlyData = true;
|
|
201
|
-
}
|
|
202
|
-
// Move to next extension
|
|
203
|
-
pos += extensionLength;
|
|
204
|
-
}
|
|
205
|
-
// Store any server names found
|
|
206
|
-
if (serverNames.length > 0) {
|
|
207
|
-
result.serverNameList = serverNames;
|
|
208
|
-
}
|
|
209
|
-
// Mark as valid if we get here
|
|
210
|
-
result.isValid = true;
|
|
211
|
-
return result;
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
215
|
-
result.error = errorMessage;
|
|
216
|
-
return result;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Parses the server name extension data and extracts hostnames
|
|
221
|
-
*/
|
|
222
|
-
static parseServerNameExtension(data) {
|
|
223
|
-
const serverNames = [];
|
|
224
|
-
try {
|
|
225
|
-
// Need at least 2 bytes for server name list length
|
|
226
|
-
if (data.length < 2) {
|
|
227
|
-
return serverNames;
|
|
228
|
-
}
|
|
229
|
-
// Parse server name list length (2 bytes)
|
|
230
|
-
const listLength = (data[0] << 8) + data[1];
|
|
231
|
-
// Skip to first name entry
|
|
232
|
-
let pos = 2;
|
|
233
|
-
// End of list
|
|
234
|
-
const listEnd = pos + listLength;
|
|
235
|
-
// Validate length
|
|
236
|
-
if (listEnd > data.length) {
|
|
237
|
-
return serverNames;
|
|
238
|
-
}
|
|
239
|
-
// Process all name entries
|
|
240
|
-
while (pos + 3 <= listEnd) {
|
|
241
|
-
// Name type (1 byte)
|
|
242
|
-
const nameType = data[pos];
|
|
243
|
-
pos += 1;
|
|
244
|
-
// For hostname, type must be 0
|
|
245
|
-
if (nameType !== 0) {
|
|
246
|
-
// Skip this entry
|
|
247
|
-
if (pos + 2 <= listEnd) {
|
|
248
|
-
const nameLength = (data[pos] << 8) + data[pos + 1];
|
|
249
|
-
pos += 2 + nameLength;
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
return serverNames;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Parse hostname length (2 bytes)
|
|
257
|
-
if (pos + 2 > listEnd) {
|
|
258
|
-
return serverNames;
|
|
259
|
-
}
|
|
260
|
-
const nameLength = (data[pos] << 8) + data[pos + 1];
|
|
261
|
-
pos += 2;
|
|
262
|
-
// Extract hostname
|
|
263
|
-
if (pos + nameLength > listEnd) {
|
|
264
|
-
return serverNames;
|
|
265
|
-
}
|
|
266
|
-
// Extract the hostname as UTF-8
|
|
267
|
-
try {
|
|
268
|
-
const hostname = data.slice(pos, pos + nameLength).toString('utf8');
|
|
269
|
-
serverNames.push(hostname);
|
|
270
|
-
}
|
|
271
|
-
catch (err) {
|
|
272
|
-
// Ignore invalid hostnames
|
|
273
|
-
}
|
|
274
|
-
// Move to next entry
|
|
275
|
-
pos += nameLength;
|
|
276
|
-
}
|
|
277
|
-
return serverNames;
|
|
278
|
-
}
|
|
279
|
-
catch (error) {
|
|
280
|
-
return serverNames;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Extract SNI (Server Name Indication) from ClientHello
|
|
285
|
-
*/
|
|
286
|
-
static extractSNI(buffer) {
|
|
287
|
-
const parseResult = this.parseClientHello(buffer);
|
|
288
|
-
if (!parseResult.isValid || !parseResult.serverNameList || parseResult.serverNameList.length === 0) {
|
|
289
|
-
return null;
|
|
290
|
-
}
|
|
291
|
-
return parseResult.serverNameList[0];
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJvdG9jb2xzL3Rscy9wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzQm5GOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQWM7UUFDbEMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDakMsa0VBQWtFO1FBQ2xFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQWM7UUFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDO1FBRUQsbURBQW1EO1FBQ25ELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFD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
|
|
@@ -1,65 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TLS Protocol Type Definitions
|
|
3
|
-
*/
|
|
4
|
-
export {};
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm90b2NvbHMvdGxzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHIn0=
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { type IHttpProxyOptions } from './models/types.js';
|
|
3
|
-
import type { IRouteConfig } from '../smart-proxy/models/route-types.js';
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated This class is deprecated. Use SmartCertManager instead.
|
|
6
|
-
*
|
|
7
|
-
* This is a stub implementation that maintains backward compatibility
|
|
8
|
-
* while the functionality has been moved to SmartCertManager.
|
|
9
|
-
*/
|
|
10
|
-
export declare class CertificateManager {
|
|
11
|
-
private options;
|
|
12
|
-
private defaultCertificates;
|
|
13
|
-
private certificateCache;
|
|
14
|
-
private certificateStoreDir;
|
|
15
|
-
private logger;
|
|
16
|
-
private httpsServer;
|
|
17
|
-
private initialized;
|
|
18
|
-
constructor(options: IHttpProxyOptions);
|
|
19
|
-
/**
|
|
20
|
-
* Synchronous initialization for backward compatibility
|
|
21
|
-
* @deprecated This uses sync filesystem operations which block the event loop
|
|
22
|
-
*/
|
|
23
|
-
private initializeSync;
|
|
24
|
-
/**
|
|
25
|
-
* Async initialization - preferred method
|
|
26
|
-
*/
|
|
27
|
-
initialize(): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Loads default certificates from the filesystem
|
|
30
|
-
* @deprecated This uses sync filesystem operations which block the event loop
|
|
31
|
-
*/
|
|
32
|
-
loadDefaultCertificates(): void;
|
|
33
|
-
/**
|
|
34
|
-
* Loads default certificates from the filesystem asynchronously
|
|
35
|
-
*/
|
|
36
|
-
loadDefaultCertificatesAsync(): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Generates self-signed certificates as fallback
|
|
39
|
-
*/
|
|
40
|
-
private generateSelfSignedCertificate;
|
|
41
|
-
/**
|
|
42
|
-
* Gets the default certificates
|
|
43
|
-
*/
|
|
44
|
-
getDefaultCertificates(): {
|
|
45
|
-
key: string;
|
|
46
|
-
cert: string;
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* @deprecated Use SmartCertManager instead
|
|
50
|
-
*/
|
|
51
|
-
setExternalPort80Handler(handler: any): void;
|
|
52
|
-
/**
|
|
53
|
-
* @deprecated Use SmartCertManager instead
|
|
54
|
-
*/
|
|
55
|
-
updateRoutes(routes: IRouteConfig[]): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Handles SNI callback to provide appropriate certificate
|
|
58
|
-
*/
|
|
59
|
-
handleSNI(domain: string, cb: (err: Error | null, ctx: plugins.tls.SecureContext) => void): void;
|
|
60
|
-
/**
|
|
61
|
-
* Updates a certificate in the cache
|
|
62
|
-
*/
|
|
63
|
-
updateCertificate(domain: string, cert: string, key: string): void;
|
|
64
|
-
/**
|
|
65
|
-
* Gets a cached certificate
|
|
66
|
-
*/
|
|
67
|
-
private getCachedCertificate;
|
|
68
|
-
/**
|
|
69
|
-
* @deprecated Use SmartCertManager instead
|
|
70
|
-
*/
|
|
71
|
-
initializePort80Handler(): Promise<any>;
|
|
72
|
-
/**
|
|
73
|
-
* @deprecated Use SmartCertManager instead
|
|
74
|
-
*/
|
|
75
|
-
stopPort80Handler(): Promise<void>;
|
|
76
|
-
/**
|
|
77
|
-
* @deprecated Use SmartCertManager instead
|
|
78
|
-
*/
|
|
79
|
-
registerDomainsWithPort80Handler(domains: string[]): void;
|
|
80
|
-
/**
|
|
81
|
-
* @deprecated Use SmartCertManager instead
|
|
82
|
-
*/
|
|
83
|
-
registerRoutesWithPort80Handler(routes: IRouteConfig[]): void;
|
|
84
|
-
/**
|
|
85
|
-
* Sets the HTTPS server for certificate updates
|
|
86
|
-
*/
|
|
87
|
-
setHttpsServer(server: plugins.https.Server): void;
|
|
88
|
-
/**
|
|
89
|
-
* Gets statistics for metrics
|
|
90
|
-
*/
|
|
91
|
-
getStats(): {
|
|
92
|
-
cachedCertificates: number;
|
|
93
|
-
defaultCertEnabled: boolean;
|
|
94
|
-
};
|
|
95
|
-
}
|