Crypto: - Replace broken ChaCha20 (static nonce) with ChaCha20-Poly1305 AEAD - HKDF-SHA256 key derivation from per-device factory NVS master keys - Random 12-byte nonce per message (ESP32 hardware RNG) - crypto_init/encrypt/decrypt API with mbedtls legacy (ESP-IDF v5.3.2) - Custom partition table with factory NVS (fctry at 0x10000) Firmware: - crypto.c full rewrite, messages.c device_id prefix + AEAD encrypt - crypto_init() at boot with esp_restart() on failure - Fix command_t initializations across all modules (sub/help fields) - Clean CMakeLists dependencies for ESP-IDF v5.3.2 C3PO (C2): - Rename tools/c2 + tools/c3po -> tools/C3PO - Per-device CryptoContext with HKDF key derivation - KeyStore (keys.json) for master key management - Transport parses device_id:base64(...) wire format Tools: - New tools/provisioning/provision.py for factory NVS key generation - Updated flasher with mbedtls config for v5.3.2 Docs: - Update all READMEs for new crypto, C3PO paths, provisioning - Update roadmap, architecture diagrams, security sections - Update CONTRIBUTING.md project structure
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Simple UDP test server to debug camera streaming."""
|
|
|
|
import socket
|
|
import sys
|
|
|
|
HOST = "0.0.0.0"
|
|
PORT = 5000
|
|
TOKEN = b"Sup3rS3cretT0k3n"
|
|
|
|
def main():
|
|
port = int(sys.argv[1]) if len(sys.argv) > 1 else PORT
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
sock.bind((HOST, port))
|
|
|
|
print(f"[UDP] Listening on {HOST}:{port}")
|
|
print(f"[UDP] Token: {TOKEN.decode()}")
|
|
print("[UDP] Waiting for packets...\n")
|
|
|
|
packet_count = 0
|
|
frame_count = 0
|
|
|
|
try:
|
|
while True:
|
|
data, addr = sock.recvfrom(65535)
|
|
packet_count += 1
|
|
|
|
# Check token
|
|
if data.startswith(TOKEN):
|
|
payload = data[len(TOKEN):]
|
|
|
|
if payload == b"START":
|
|
print(f"[{addr[0]}:{addr[1]}] START (new frame)")
|
|
elif payload == b"END":
|
|
frame_count += 1
|
|
print(f"[{addr[0]}:{addr[1]}] END (frame #{frame_count} complete)")
|
|
else:
|
|
print(f"[{addr[0]}:{addr[1]}] CHUNK: {len(payload)} bytes")
|
|
else:
|
|
print(f"[{addr[0]}:{addr[1]}] INVALID TOKEN: {data[:20]}...")
|
|
|
|
# Stats every 100 packets
|
|
if packet_count % 100 == 0:
|
|
print(f"\n--- Stats: {packet_count} packets, {frame_count} frames ---\n")
|
|
|
|
except KeyboardInterrupt:
|
|
print(f"\n[UDP] Stopped. Total: {packet_count} packets, {frame_count} frames")
|
|
finally:
|
|
sock.close()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|