- New: src/ecdh_helper.h — ECDH keypair gen, shared secret, pubkey HMAC sign/verify - Server (src/main.cpp): ECDH handshake callback, AES-GCM decrypt, PSK from NVS - Client (src/main.cpp→client.cpp): ECDH after connect, AES-GCM encrypt, PSK from NVS - Android: ECDH (KeyAgreement) + AES-GCM (Cipher) in BleRelayManager.kt - PSK provisioned via USB CDC SET_KEY (SettingsActivity.kt) - PrefsHelper: hmac_key → psk - Bumped versions: server=18, client=4 - NVS namespace: hmac→syl, key:hmac_key→psk - BLE ECDH characteristic: beb5483e-...-f26dc (WRITE_NR|NOTIFY)
2.3 KiB
2.3 KiB
Plan: Issue #2 — AES-256-GCM + ECDH + PSK voor BLE relay commands
Beveiligingsmodel
Provisioning (eenmalig, USB CDC)
Android genereert 32B PSK (pre-shared key) en provisioned beide ESP's:
SET_KEY→ Server ESP (NVSsyl/psk)SET_KEY→ Client ESP (NVSsyl/psk)
BLE ECDH handshake (elke sessie)
Client Server
|── pubkey(65B) || HMAC(PSK,pubkey)(32B) ─────>| verify HMAC met PSK
| | genereer eigen keypair
|<─ pubkey(65B) || HMAC(PSK,pubkey)(32B) ──────| verify HMAC met PSK
| |
AES_KEY = SHA-256(ECDH_shared_secret) AES_KEY = SHA-256(ECDH_shared_secret)
- PSK verlaat nooit het apparaat over BLE — alleen HMAC ervan
- Zonder PSK kan MITM geen geldige HMAC voor fake pubkey produceren
- Per-sessie AES keys → perfect forward secrecy
- PSK gelekt? → her-provisionen via USB CDC
Packet structuren
ECDH handshake packet (97 bytes)
pubkey[65] || HMAC-SHA256(PSK, pubkey)[32]
BLE characteristic: beb5483e-...-f26dc, properties WRITE_NR | NOTIFY
Relay command (29 bytes, AES-256-GCM)
seq(4) || nonce(8) || ciphertext_cmd(1) || tag(16)
Nonce voor GCM = seq(4) || random(8) = 12 bytes.
Sequence > lastSeq voor replay protection per sessie.
NVS / SharedPreferences
| Opslag | Sleutel | Waarde |
|---|---|---|
ESP NVS syl |
psk |
32B PSK |
ESP NVS syl |
uuid |
16B device UUID |
| Android Prefs | psk |
64-char hex PSK |
| Android Prefs | device_uuid |
32-char hex UUID |
Bestandswijzigingen
Nieuw
src/ecdh_helper.h— ECDH keypair generatie + shared secret (mbedtls/ecdh.h)
Gewijzigd
src/main.cpp— HMAC → ECDH handshake + AES-GCM decrypt; PSK uit NVSsrc/client.cpp— HMAC → ECDH handshake + AES-GCM encrypt; PSK uit NVSandroid/.../BleRelayManager.kt— HMAC → ECDH (KeyAgreement) + AES-GCM (Cipher)android/.../SettingsActivity.kt— SET_KEY schrijft voortaan PSKandroid/.../PrefsHelper.kt—hmac_key→pskversion.txt— bump server + client versies
Werkt NIET met oude firmware/app
Geen backward compatibility: schone break. HMAC packets worden niet meer geaccepteerd.