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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ssl2
3
- Version: 1.2.0
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. `CHROME_TRUST_ANCHOR_IDS` is the 28 Chrome 155 requests, and `TrustAnchorIdentifier.encode` and `.decode` move between the dotted form and the wire bytes.
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. `CHROME_TRUST_ANCHOR_IDS` is the 28 Chrome 155 requests, and `TrustAnchorIdentifier.encode` and `.decode` move between the dotted form and the wire bytes.
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ssl2"
3
- version = "1.2.0"
3
+ version = "2.0.1"
4
4
  description = "PEP 748 TLS interface: typed ClientHello model and parser, JA3, JA4 and Akamai fingerprints, proxies, sockets and asyncio streams"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.14"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ssl2"
3
- version = "1.2.0"
3
+ version = "2.0.1"
4
4
  description = "PEP 748 TLS interface: typed ClientHello model and parser, JA3, JA4 and Akamai fingerprints, proxies, sockets and asyncio streams"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.14"
@@ -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(context, address, proxy)
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(context, (proxy.host, proxy.port), timeout=timeout)
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