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 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.url.hostname, blob)
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(request.url.hostname, data)
624
+ data, domain = self.quicClient._client._kdc.decode(data)
624
625
 
625
626
  if data is not None:
626
- return GNResponse.deserialize(data, 2)
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: Optional[Dict[str, bytes]] = None
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: Dict[str, bytes] = r.payload
38
-
39
- self._servers_keys = servers_keys
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
- return response
69
-
70
- key = self._servers_keys[self._servers_keys_hash_domain[domain_h]]
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GNServer
3
- Version: 0.0.0.0.51
3
+ Version: 0.0.0.0.53
4
4
  Summary: GNServer
5
5
  Home-page: https://github.com/KeyisB/libs/tree/main/GNServer
6
6
  Author: KeyisB
@@ -1,14 +1,14 @@
1
1
  GNServer/__init__.py,sha256=6CMCZlkBO74PW8i8DAri5xz2fYM9EyPH8vdsLYBMmOo,1560
2
- GNServer/_app.py,sha256=f_FWW9nNF0BAqyW2jhLDzJhtWLIc_5SaxL3LgKhrCKI,18391
3
- GNServer/_client.py,sha256=UISxnk6lhU90knh0okWA7aAlvTNiEvxZf7D472Y7eEM,32567
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=tq7TgZs1QKV3ifj49RdsvXFbAY92_9tDQIukeixXTq8,2600
10
- gnserver-0.0.0.0.51.dist-info/licenses/LICENSE,sha256=_rN-sb3LemR3cKsEqjJRdXkdt7mME1mkW1BwWEn-zAw,1309
11
- gnserver-0.0.0.0.51.dist-info/METADATA,sha256=f9bb7VcFCaseOvnPR5Oc1b4fPZHRA529aah8N2JRePg,830
12
- gnserver-0.0.0.0.51.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
13
- gnserver-0.0.0.0.51.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
14
- gnserver-0.0.0.0.51.dist-info/RECORD,,
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,,