diff --git a/mesht_device.py b/mesht_device.py index 03b45c3..7ea9633 100644 --- a/mesht_device.py +++ b/mesht_device.py @@ -13,6 +13,8 @@ from protobufs_extra.device_metadata_proto import * from protobufs_extra.file_info_proto import * from protobuf_decoder.protobuf_decoder import Parser +from payload_decrypter import decrypt_aes128_ctr, CUSTOM_SCHEMA +import base64 DATA_SCHEMA = [ ("varint", "portnum", 1), @@ -289,6 +291,14 @@ class MeshtDevice: if self.udp_packet: #mqtt или udp пакеты мы ЖЕСТКО перекодируем словно так и надо dec = pb.decode(data, MESHPACKET_SCHEMA) + try: + d = decrypt_aes128_ctr(base64.b64encode(dec["encrypted"]), "1PG7OiApB1nwvP+rz05pAQ==", dec["id"], dec["from"]) + dec["decoded"] = pb.decode(d, CUSTOM_SCHEMA) + del dec["encrypted"] + except: + print("cannot prepare payload") + pass + #пушим финальный пакет data = pb.encode({"packet": dec}, FROMRADIO_SCHEMA) fr = pb.decode(data, FROMRADIO_SCHEMA) diff --git a/packet_test.py b/packet_test.py index 5eeb346..f5cc4b4 100644 --- a/packet_test.py +++ b/packet_test.py @@ -12,6 +12,12 @@ res = Parser().parse(data.hex()) print(res.to_dict(), "\n\n") dec = pb.decode(data, MESHPACKET_SCHEMA) print(dec, "\n\n") +from payload_decrypter import decrypt_aes128_ctr, CUSTOM_SCHEMA, _print_result +d = decrypt_aes128_ctr(base64.b64encode(dec["encrypted"]), "1PG7OiApB1nwvP+rz05pAQ==", dec["id"], dec["from"]) +dec["decoded"] = pb.decode(d, CUSTOM_SCHEMA) +print("CUSTOM SCHEMA",pb.decode(d, CUSTOM_SCHEMA)) +del dec["encrypted"] +print("DECODED", dec, "\n\n") enc = pb.encode({"packet": dec}, FROMRADIO_SCHEMA) decTwice = pb.decode(enc, FROMRADIO_SCHEMA) diff --git a/payload_decrypter.py b/payload_decrypter.py new file mode 100644 index 0000000..47332a7 --- /dev/null +++ b/payload_decrypter.py @@ -0,0 +1,78 @@ +import base64 +from Crypto.Cipher import AES +from Crypto.Util import Counter +import struct + +def decrypt_aes128_ctr(enc_b64: str, key_b64: str, id_val: int, from_val:int) -> bytes: + # Декодируем ключ и шифротекст из base64 + key = base64.b64decode(key_b64) # 16 байт для AES-128 + encrypted_data = base64.b64decode(enc_b64) + + # Формируем вектор инициализации (IV) аналогично pack('P', $id) . pack('P', $from) в PHP + # 'P' в PHP — это беззнаковое 64-битное целое в little-endian + iv = struct.pack('") + +AO = "1PG7OiApB1nwvP+rz05pAQ==" + +if __name__ == "__main__": + ciphertext_b64 = "LDsNJgdxZzQntg3KmvaRWRXwt39JAMkRq35RRZoK6lQ/0PnbQ4HJnXBYIjx+B5Y+k3ukq6cLevjra8ky1ANcLANGJTjH92lMbyu3rvwwfyO+4eJNOezJWoE=" + id = 2876191354 + fr0m = 313608604 + key_b64 = AO + + d = decrypt_aes128_ctr(ciphertext_b64, key_b64, id, fr0m) + _print_result(d) + print() \ No newline at end of file diff --git a/service.py b/service.py index 7de31eb..4b3c899 100644 --- a/service.py +++ b/service.py @@ -95,6 +95,7 @@ class MeshMultiListener(MeshArgsParse): self.defaultDeviceUUID = self.json_config[0]["uuid"] self.defaultDeviceUUIDHash = md5hash(self.defaultDeviceUUID) for device in self.devices: + print(md5hash(device.device_uuid), device) self.devicesUuidHashToUuid[md5hash(device.device_uuid)] = device.device_uuid async def meshListener(self, device: MeshtDevice, queue: asyncio.Queue): diff --git a/webExtensions/publicEndpoints.py b/webExtensions/publicEndpoints.py index 2bbbcb2..363a838 100644 --- a/webExtensions/publicEndpoints.py +++ b/webExtensions/publicEndpoints.py @@ -73,4 +73,18 @@ class WebExtension: return Response(content=img, headers=headers, media_type="image/png") except: traceback.print_exc() - raise HTTPException(status_code=404, detail="not found tile") \ No newline at end of file + raise HTTPException(status_code=404, detail="not found tile") + + @self.app.get(f"{self.core.context}/devices") + async def devicesList(): + response = [] + count = 1 + for hash in self.core.devicesUuidHashToUuid.keys(): + obj = { + "hash": hash, + "default": hash == self.core.defaultDeviceUUIDHash, + "name": f"Устройство {count}" + } + response.append(obj) + count += 1 + return response \ No newline at end of file