ssl2 1.2.0__tar.gz → 2.0.1__tar.gz
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.
- {ssl2-1.2.0 → ssl2-2.0.1}/PKG-INFO +3 -3
- {ssl2-1.2.0 → ssl2-2.0.1}/README.md +2 -2
- {ssl2-1.2.0 → ssl2-2.0.1}/pyproject.toml +1 -1
- {ssl2-1.2.0 → ssl2-2.0.1}/pyproject.toml.orig +1 -1
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/__init__.py +0 -2
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/asynchronous.py +4 -1
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/client_hello.py +0 -31
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/interface.py +6 -1
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/credentials.py +0 -0
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/errors.py +0 -0
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/fingerprint.py +0 -0
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/parameters.py +0 -0
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/proxy.py +0 -0
- {ssl2-1.2.0 → ssl2-2.0.1}/src/ssl2/py.typed +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ssl2
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: PEP 748 TLS interface: typed ClientHello model and parser, JA3, JA4 and Akamai fingerprints, proxies, sockets and asyncio streams
|
|
5
5
|
Requires-Python: >=3.14
|
|
6
6
|
Project-URL: Repository, https://github.com/baobien-dev/ssl2
|
|
@@ -126,7 +126,7 @@ print(JA3.parse(JA3.of(chrome).text) == JA3.of(chrome)) # True
|
|
|
126
126
|
|
|
127
127
|
`JA3.builder()` starts a `ClientHelloBuilder` from the JA3 fields; the payloads JA3 does not carry, such as signature schemes, key shares and ALPN, go in before `build()`.
|
|
128
128
|
|
|
129
|
-
`.trust_anchor_ids("44947.2.1", ...)` lists the trust anchor identifiers of draft-ietf-tls-trust-anchor-ids in dotted form, which the parser reads back from the wire. `
|
|
129
|
+
`.trust_anchor_ids("44947.2.1", ...)` lists the trust anchor identifiers of draft-ietf-tls-trust-anchor-ids in dotted form, which the parser reads back from the wire. `TrustAnchorIdentifier.encode` and `.decode` move between the dotted form and the wire bytes.
|
|
130
130
|
|
|
131
131
|
## Configuration, credentials, trust
|
|
132
132
|
|
|
@@ -150,7 +150,7 @@ proxy = Proxy.parse("socks5h://user:secret@proxy.example:1080") # http, https,
|
|
|
150
150
|
print(proxy.scheme, proxy.host, proxy.port, proxy.credentials)
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
`socks4` and `socks5` resolve the destination locally, `socks4a`, `socks5h` and the HTTP schemes let the proxy resolve it, and an `https` proxy carries TLS inside TLS with the same client context. A refusal raises `ProxyError` with the proxy's reason.
|
|
153
|
+
`socks4` and `socks5` resolve the destination locally, `socks4a`, `socks5h` and the HTTP schemes let the proxy resolve it, and an `https` proxy carries TLS inside TLS with the same client context, or with `proxy_context=` on `connect` when given; CONNECT is HTTP/1.1, so that context should offer only `http/1.1`. A refusal raises `ProxyError` with the proxy's reason.
|
|
154
154
|
|
|
155
155
|
## Sockets and streams on any engine
|
|
156
156
|
|
|
@@ -118,7 +118,7 @@ print(JA3.parse(JA3.of(chrome).text) == JA3.of(chrome)) # True
|
|
|
118
118
|
|
|
119
119
|
`JA3.builder()` starts a `ClientHelloBuilder` from the JA3 fields; the payloads JA3 does not carry, such as signature schemes, key shares and ALPN, go in before `build()`.
|
|
120
120
|
|
|
121
|
-
`.trust_anchor_ids("44947.2.1", ...)` lists the trust anchor identifiers of draft-ietf-tls-trust-anchor-ids in dotted form, which the parser reads back from the wire. `
|
|
121
|
+
`.trust_anchor_ids("44947.2.1", ...)` lists the trust anchor identifiers of draft-ietf-tls-trust-anchor-ids in dotted form, which the parser reads back from the wire. `TrustAnchorIdentifier.encode` and `.decode` move between the dotted form and the wire bytes.
|
|
122
122
|
|
|
123
123
|
## Configuration, credentials, trust
|
|
124
124
|
|
|
@@ -142,7 +142,7 @@ proxy = Proxy.parse("socks5h://user:secret@proxy.example:1080") # http, https,
|
|
|
142
142
|
print(proxy.scheme, proxy.host, proxy.port, proxy.credentials)
|
|
143
143
|
```
|
|
144
144
|
|
|
145
|
-
`socks4` and `socks5` resolve the destination locally, `socks4a`, `socks5h` and the HTTP schemes let the proxy resolve it, and an `https` proxy carries TLS inside TLS with the same client context. A refusal raises `ProxyError` with the proxy's reason.
|
|
145
|
+
`socks4` and `socks5` resolve the destination locally, `socks4a`, `socks5h` and the HTTP schemes let the proxy resolve it, and an `https` proxy carries TLS inside TLS with the same client context, or with `proxy_context=` on `connect` when given; CONNECT is HTTP/1.1, so that context should offer only `http/1.1`. A refusal raises `ProxyError` with the proxy's reason.
|
|
146
146
|
|
|
147
147
|
## Sockets and streams on any engine
|
|
148
148
|
|
|
@@ -6,7 +6,6 @@ from ssl2.asynchronous import (
|
|
|
6
6
|
Tunnel,
|
|
7
7
|
)
|
|
8
8
|
from ssl2.client_hello import (
|
|
9
|
-
CHROME_TRUST_ANCHOR_IDS,
|
|
10
9
|
ClientHello,
|
|
11
10
|
ClientHelloBuilder,
|
|
12
11
|
ClientHelloParser,
|
|
@@ -65,7 +64,6 @@ from ssl2.parameters import (
|
|
|
65
64
|
from ssl2.proxy import Proxy, ProxyCredentials, ProxyError, ProxyScheme
|
|
66
65
|
|
|
67
66
|
__all__ = (
|
|
68
|
-
"CHROME_TRUST_ANCHOR_IDS",
|
|
69
67
|
"JA3",
|
|
70
68
|
"JA4",
|
|
71
69
|
"AkamaiFingerprint",
|
|
@@ -109,9 +109,12 @@ class TLSStream:
|
|
|
109
109
|
*,
|
|
110
110
|
proxy: Proxy | None = None,
|
|
111
111
|
timeout: float | None = None,
|
|
112
|
+
proxy_context: ClientContext | None = None,
|
|
112
113
|
) -> Self:
|
|
113
114
|
async with asyncio.timeout(timeout):
|
|
114
|
-
tunnel = await cls.tunnel(
|
|
115
|
+
tunnel = await cls.tunnel(
|
|
116
|
+
context if proxy_context is None else proxy_context, address, proxy
|
|
117
|
+
)
|
|
115
118
|
try:
|
|
116
119
|
buffer = context.create_buffer(address[0])
|
|
117
120
|
if tunnel.socket is not None and not tunnel.leftover:
|
|
@@ -108,37 +108,6 @@ class ClientHello:
|
|
|
108
108
|
|
|
109
109
|
|
|
110
110
|
EMPTY_CLIENT_HELLO = ClientHello(cipher_suites=(), extensions=())
|
|
111
|
-
# the trust anchor identifiers Chrome 155 requests: its root store, in the dotted form of draft-ietf-tls-trust-anchor-ids
|
|
112
|
-
CHROME_TRUST_ANCHOR_IDS = (
|
|
113
|
-
"44947.2.1",
|
|
114
|
-
"44947.2.6",
|
|
115
|
-
"44947.2.13",
|
|
116
|
-
"44947.2.14",
|
|
117
|
-
"44947.2.15",
|
|
118
|
-
"44947.2.18",
|
|
119
|
-
"44947.2.19",
|
|
120
|
-
"44947.2.20",
|
|
121
|
-
"52580.200109.1.7",
|
|
122
|
-
"52580.200109.1.8",
|
|
123
|
-
"52580.200109.1.9",
|
|
124
|
-
"52580.200109.1.10",
|
|
125
|
-
"52580.200109.1.11",
|
|
126
|
-
"52580.200109.1.12",
|
|
127
|
-
"52580.200109.1.13",
|
|
128
|
-
"52580.200109.1.18",
|
|
129
|
-
"52580.200109.1.19",
|
|
130
|
-
"11129.9.1",
|
|
131
|
-
"11129.9.4",
|
|
132
|
-
"11129.9.5",
|
|
133
|
-
"11129.9.6",
|
|
134
|
-
"11129.9.7",
|
|
135
|
-
"11129.9.8",
|
|
136
|
-
"11129.9.10",
|
|
137
|
-
"11129.9.11",
|
|
138
|
-
"11129.9.12",
|
|
139
|
-
"11129.9.13",
|
|
140
|
-
"11129.9.15",
|
|
141
|
-
)
|
|
142
111
|
|
|
143
112
|
|
|
144
113
|
class TrustAnchorIdentifier:
|
|
@@ -196,6 +196,7 @@ class TLSSocket:
|
|
|
196
196
|
*,
|
|
197
197
|
proxy: Proxy | None = None,
|
|
198
198
|
timeout: float | None = None,
|
|
199
|
+
proxy_context: ClientContext | None = None,
|
|
199
200
|
) -> Self:
|
|
200
201
|
buffer = context.create_buffer(address[0])
|
|
201
202
|
if proxy is None:
|
|
@@ -203,7 +204,11 @@ class TLSSocket:
|
|
|
203
204
|
context, buffer, socket.create_connection(address, timeout=timeout)
|
|
204
205
|
)
|
|
205
206
|
if proxy.scheme is ProxyScheme.HTTPS:
|
|
206
|
-
hop = cls.connect(
|
|
207
|
+
hop = cls.connect(
|
|
208
|
+
context if proxy_context is None else proxy_context,
|
|
209
|
+
(proxy.host, proxy.port),
|
|
210
|
+
timeout=timeout,
|
|
211
|
+
)
|
|
207
212
|
try:
|
|
208
213
|
return cls.open(context, buffer, hop, cls._tunnel(proxy, address, hop))
|
|
209
214
|
except BaseException:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|