Replace HMAC-SHA256 with AES-256-GCM + ECDH key exchange for BLE relay commands (issue #2)
- 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)
This commit is contained in:
parent
8b2dfcbfd0
commit
d6f1062a44
11 changed files with 788 additions and 173 deletions
63
docs/plan-issue-2-aes-ecdh.md
Normal file
63
docs/plan-issue-2-aes-ecdh.md
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
# 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 (NVS `syl/psk`)
|
||||
- `SET_KEY` → Client ESP (NVS `syl/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 NVS
|
||||
- `src/client.cpp` — HMAC → ECDH handshake + AES-GCM encrypt; PSK uit NVS
|
||||
- `android/.../BleRelayManager.kt` — HMAC → ECDH (KeyAgreement) + AES-GCM (Cipher)
|
||||
- `android/.../SettingsActivity.kt` — SET_KEY schrijft voortaan PSK
|
||||
- `android/.../PrefsHelper.kt` — `hmac_key` → `psk`
|
||||
- `version.txt` — bump server + client versies
|
||||
|
||||
## Werkt NIET met oude firmware/app
|
||||
Geen backward compatibility: schone break. HMAC packets worden niet meer geaccepteerd.
|
||||
Loading…
Reference in a new issue