GNServer 0.0.0.0.51__py3-none-any.whl → 0.0.0.0.53__py3-none-any.whl
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.
- GNServer/_app.py +11 -3
- GNServer/_client.py +4 -2
- GNServer/models.py +29 -21
- {gnserver-0.0.0.0.51.dist-info → gnserver-0.0.0.0.53.dist-info}/METADATA +1 -1
- {gnserver-0.0.0.0.51.dist-info → gnserver-0.0.0.0.53.dist-info}/RECORD +8 -8
- {gnserver-0.0.0.0.51.dist-info → gnserver-0.0.0.0.53.dist-info}/WHEEL +0 -0
- {gnserver-0.0.0.0.51.dist-info → gnserver-0.0.0.0.53.dist-info}/licenses/LICENSE +0 -0
- {gnserver-0.0.0.0.51.dist-info → gnserver-0.0.0.0.53.dist-info}/top_level.txt +0 -0
GNServer/_app.py
CHANGED
@@ -339,10 +339,14 @@ class App:
|
|
339
339
|
if event.end_stream:
|
340
340
|
|
341
341
|
if self._api._kdc is not None:
|
342
|
-
buf = self._api._kdc.decode(buf)
|
342
|
+
buf, domain = self._api._kdc.decode(buf)
|
343
|
+
else:
|
344
|
+
domain = None
|
343
345
|
|
344
346
|
if buf is not None:
|
345
347
|
request = GNRequest.deserialize(buf, mode)
|
348
|
+
if domain is not None:
|
349
|
+
request.client._data['domain'] = domain
|
346
350
|
else:
|
347
351
|
raise Exception('Не удалось расшифровать от KDC')
|
348
352
|
|
@@ -368,8 +372,12 @@ class App:
|
|
368
372
|
# формируем запрос
|
369
373
|
|
370
374
|
if self._api._kdc is not None:
|
371
|
-
data = self._api._kdc.decode(data)
|
375
|
+
data, domain = self._api._kdc.decode(data)
|
376
|
+
else:
|
377
|
+
domain = None
|
372
378
|
request = GNRequest.deserialize(data, mode)
|
379
|
+
if domain is not None:
|
380
|
+
request.client._data['domain'] = domain
|
373
381
|
|
374
382
|
logger.debug(request, f'event.stream_id -> {event.stream_id}')
|
375
383
|
|
@@ -446,7 +454,7 @@ class App:
|
|
446
454
|
|
447
455
|
|
448
456
|
if self._api._kdc is not None:
|
449
|
-
blob = self._api._kdc.encode(request.
|
457
|
+
blob = self._api._kdc.encode(request.client.domain, blob)
|
450
458
|
|
451
459
|
self._quic.send_stream_data(request.stream_id, blob, end_stream=end_stream) # type: ignore
|
452
460
|
self.transmit()
|
GNServer/_client.py
CHANGED
@@ -162,6 +162,7 @@ class AsyncClient:
|
|
162
162
|
|
163
163
|
def setKDC(self, kdc: KDCObject):
|
164
164
|
self._kdc = kdc
|
165
|
+
self._kdc._client = self
|
165
166
|
|
166
167
|
def addRequestCallback(self, callback: Callable, name: str):
|
167
168
|
self.__request_callbacks[name] = callback
|
@@ -620,10 +621,11 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
620
621
|
data = await fut
|
621
622
|
|
622
623
|
if self.quicClient._client._kdc is not None:
|
623
|
-
data = self.quicClient._client._kdc.decode(
|
624
|
+
data, domain = self.quicClient._client._kdc.decode(data)
|
624
625
|
|
625
626
|
if data is not None:
|
626
|
-
|
627
|
+
r = GNResponse.deserialize(data, 2)
|
628
|
+
return r
|
627
629
|
else:
|
628
630
|
return GNResponse('gn:client:0')
|
629
631
|
|
GNServer/models.py
CHANGED
@@ -11,6 +11,7 @@ from KeyisBTools.cryptography.bytes import hash3
|
|
11
11
|
class KDCObject:
|
12
12
|
def __init__(self, domain: str, kdc_domain: str, kdc_key: bytes, requested_domains: List[str]):
|
13
13
|
self._domain = domain
|
14
|
+
self._domain_hash = hash3(domain.encode())
|
14
15
|
self._kdc_domain = kdc_domain
|
15
16
|
self._kdc_key = kdc_key
|
16
17
|
self._requested_domains = requested_domains
|
@@ -18,7 +19,7 @@ class KDCObject:
|
|
18
19
|
from ._client import AsyncClient
|
19
20
|
self._client = AsyncClient(domain)
|
20
21
|
|
21
|
-
self._servers_keys:
|
22
|
+
self._servers_keys: Dict[str, bytes] = {}
|
22
23
|
self._servers_keys_hash_domain: Dict[bytes, str] = {}
|
23
24
|
self._servers_keys_domain_hash: Dict[str, bytes] = {}
|
24
25
|
|
@@ -26,6 +27,13 @@ class KDCObject:
|
|
26
27
|
|
27
28
|
|
28
29
|
async def init(self, servers_keys: Optional[Dict[str, bytes]] = None): # type: ignore
|
30
|
+
|
31
|
+
|
32
|
+
self._servers_keys[self._kdc_domain] = self._kdc_key
|
33
|
+
h = hash3(self._kdc_domain.encode())
|
34
|
+
self._servers_keys_hash_domain[h] = self._kdc_domain
|
35
|
+
self._servers_keys_domain_hash[self._kdc_domain] = h
|
36
|
+
|
29
37
|
if servers_keys is None:
|
30
38
|
|
31
39
|
payload = self._requested_domains
|
@@ -34,9 +42,12 @@ class KDCObject:
|
|
34
42
|
if not r.command.ok:
|
35
43
|
raise r
|
36
44
|
|
37
|
-
servers_keys
|
38
|
-
|
39
|
-
|
45
|
+
servers_keys = r.payload
|
46
|
+
|
47
|
+
if servers_keys is None:
|
48
|
+
raise r
|
49
|
+
|
50
|
+
self._servers_keys.update(servers_keys)
|
40
51
|
|
41
52
|
for domain in self._servers_keys.keys():
|
42
53
|
h = hash3(domain.encode())
|
@@ -44,30 +55,27 @@ class KDCObject:
|
|
44
55
|
self._servers_keys_domain_hash[domain] = h
|
45
56
|
|
46
57
|
|
47
|
-
self._servers_keys[self._kdc_domain] = self._kdc_key
|
48
|
-
h = hash3(self._kdc_domain.encode())
|
49
|
-
self._servers_keys_hash_domain[h] = self._kdc_domain
|
50
|
-
self._servers_keys_domain_hash[self._kdc_domain] = h
|
51
58
|
|
52
59
|
|
53
60
|
def encode(self, domain: str, request: bytes):
|
54
61
|
if domain not in self._servers_keys:
|
55
62
|
return request
|
63
|
+
key = self._servers_keys[domain]
|
64
|
+
sig = s2.sign(key)
|
65
|
+
data = m1.encrypt(domain.encode(), sig, request[8:], key)
|
66
|
+
return request[:8] + sig + self._domain_hash + data
|
56
67
|
|
57
|
-
sig = s2.sign(self._kdc_key)
|
58
|
-
data = m1.encrypt(self._domain.encode(), sig, request, self._kdc_key)
|
59
|
-
return sig + self._servers_keys_domain_hash[domain] + data
|
60
|
-
|
61
68
|
def decode(self, response: bytes):
|
62
|
-
if len(response) < 164+64:
|
63
|
-
return response
|
64
|
-
|
69
|
+
if len(response) < 8+164+64:
|
70
|
+
return response, None
|
71
|
+
h = response[:8]
|
72
|
+
response = response[8:]
|
65
73
|
sig, domain_h, data = response[:164], response[164:164+64], response[164+64:]
|
66
|
-
|
67
74
|
if domain_h not in self._servers_keys_hash_domain:
|
68
|
-
|
69
|
-
|
70
|
-
|
75
|
+
print(domain_h, 'not in', self._servers_keys_hash_domain)
|
76
|
+
return response, None
|
77
|
+
d = self._servers_keys_hash_domain[domain_h]
|
78
|
+
key = self._servers_keys[d]
|
71
79
|
if not s2.verify(key, sig):
|
72
|
-
return None
|
73
|
-
return m1.decrypt(self._domain.encode(), sig, data, key)
|
80
|
+
return None, None
|
81
|
+
return h + m1.decrypt(self._domain.encode(), sig, data, key), d
|
@@ -1,14 +1,14 @@
|
|
1
1
|
GNServer/__init__.py,sha256=6CMCZlkBO74PW8i8DAri5xz2fYM9EyPH8vdsLYBMmOo,1560
|
2
|
-
GNServer/_app.py,sha256=
|
3
|
-
GNServer/_client.py,sha256=
|
2
|
+
GNServer/_app.py,sha256=5wcVwq8bnctqwASs0-YaYMYHWympwtC24lq5PEcISTE,18758
|
3
|
+
GNServer/_client.py,sha256=IEzben2zZfgpU9DhcnjB9uQLCInllZhdoLTZyM72ldA,32610
|
4
4
|
GNServer/_cors_resolver.py,sha256=aDxk4ItaEK-6vlDbkno8FJZEjczGEe8vkOui6_kz5-Y,5950
|
5
5
|
GNServer/_crt.py,sha256=SOmyX7zBiCY9EhVSekksQtBHgTIZVvdqNZ8Ni-E5Zow,1390
|
6
6
|
GNServer/_func_params_validation.py,sha256=pDXRzPVTdPnDHFMMmKd014SConBjFOuaLeJTY0vldlM,11412
|
7
7
|
GNServer/_routes.py,sha256=bJnmQ8uEhPVQgy2tTqE5TEIM8aFXV-lVI7c2nG0rQwk,3384
|
8
8
|
GNServer/_template_resolver.py,sha256=vdJYb_7PjIeTWq-Clr7jyj7QIvPBxplU7EqeOuMJ64c,1409
|
9
|
-
GNServer/models.py,sha256=
|
10
|
-
gnserver-0.0.0.0.
|
11
|
-
gnserver-0.0.0.0.
|
12
|
-
gnserver-0.0.0.0.
|
13
|
-
gnserver-0.0.0.0.
|
14
|
-
gnserver-0.0.0.0.
|
9
|
+
GNServer/models.py,sha256=VjTpxVdSMLG6I_0nabhZihuIyPiQTOiEV4h5m4DXXbw,2852
|
10
|
+
gnserver-0.0.0.0.53.dist-info/licenses/LICENSE,sha256=_rN-sb3LemR3cKsEqjJRdXkdt7mME1mkW1BwWEn-zAw,1309
|
11
|
+
gnserver-0.0.0.0.53.dist-info/METADATA,sha256=i5Nn1OYmDIxFCb6mjZt8nB9hGtVvHdf9nozPTw9Sux0,830
|
12
|
+
gnserver-0.0.0.0.53.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
13
|
+
gnserver-0.0.0.0.53.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
|
14
|
+
gnserver-0.0.0.0.53.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|