fix: code review fixes — SharedPreferences docs, Log.e, dead notify code

This commit is contained in:
eddy 2026-07-29 23:51:16 +02:00
commit 0833327cea
4 changed files with 9 additions and 16 deletions

View file

@ -61,13 +61,13 @@ Offset Grootte Veld Beschrijving
5 32 bytes hmac HMAC-SHA256(key, command || sequence)
```
De sequence counter reset naar 0 bij elke (re)connectie op de module. De app start bij 1 om te zorgen dat het eerste packet altijd geaccepteerd wordt (`1 > 0`). Replay van een eerder packet wordt geweerd omdat `seq <= lastSeq`. De sequence counter wordt gepersisteerd in EncryptedSharedPreferences en overleeft app-herstarts — bij een Activity-restart met actieve BLE-verbinding blijft de counter oplopen in plaats van terug te vallen naar 1.
De sequence counter reset naar 0 bij elke (re)connectie op de module. De app start bij 1 om te zorgen dat het eerste packet altijd geaccepteerd wordt (`1 > 0`). Replay van een eerder packet wordt geweerd omdat `seq <= lastSeq`. De sequence counter wordt gepersisteerd in SharedPreferences en overleeft app-herstarts — bij een Activity-restart met actieve BLE-verbinding blijft de counter oplopen in plaats van terug te vallen naar 1.
#### Key management
- De HMAC key wordt **niet meegecompileerd** — de module start zonder key en wordt geprovisioneerd via USB
- De key wordt opgeslagen in **NVS** (Non-Volatile Storage) op de module via de Arduino `Preferences` library (namespace `hmac`, key `key`, partitie op 0x9000-0xDFFF)
- De app slaat de key op in **EncryptedSharedPreferences** (AES256-GCM versleuteld, overleeft app-herstarts)
- De app slaat de key op in **SharedPreferences** (overleeft app-herstarts)
- **USB provisioning:** Open Instellingen → Firmware bijwerken. De app checkt eerst de firmware versie (`VERSION?`) en flasht indien nodig. Na het flashen (of als versie al actueel is) volgt automatisch de key exchange:
- Als de module al een key heeft → module antwoordt `HMAC_KEY:<hex>` → app slaat op lokaal op
- Als de module nog geen key heeft → module antwoordt `NO_KEY` → app genereert willekeurige 32-byte key via `SecureRandom` → stuurt `SET_KEY:<hex>\n` en `SET_ID:<hex>\n` → module slaat op in NVS → app slaat op lokaal op
@ -115,7 +115,7 @@ module → App: OK\n (bevestiging)
| **Commando vervalsing** | HMAC dekt command byte + sequence — wijzigen maakt handtekening ongeldig |
| **Brute-force key** | 32-byte key = 2^256 mogelijkheden — onhaalbaar |
| **Sniffen** | Pakketten zijn onversleuteld; geen confidentiality. Alleen commando's (aan/uit) zijn zichtbaar, niet de key. |
| **Reverse engineering van key** | Sleutel staat niet in de APK — wordt pas bij USB provisioning gegenereerd en in EncryptedSharedPreferences (AES256-GCM) opgeslagen. Extractie vereist fysieke toegang tot de telefoon én root. |
| **Reverse engineering van key** | Sleutel staat niet in de APK — wordt pas bij USB provisioning gegenereerd en in SharedPreferences opgeslagen. Extractie vereist fysieke toegang tot de telefoon. |
| **Key extractie via USB** | Fysieke USB-toegang tot de module geeft `KEY?\n` de huidige key terug. Bescherming: fysieke toegang tot het board beperken. |
| **NVS wiping** | `pio run -t erase` wist alle flash waaronder NVS — module is daarna leeg en kan opnieuw geprovisioneerd worden. |
@ -149,7 +149,7 @@ De touch sensoren en BLE werken onafhankelijk. Als de sensor losgelaten wordt en
| Relay Characteristic | `beb5483e-36e1-4688-b7f5-ea07361f26d8` |
| UUID Characteristic | `beb5483e-36e1-4688-b7f5-ea07361f26d9` |
De relay characteristic ondersteunt `WRITE_NR` (Write Without Response) en `NOTIFY`. De UUID characteristic is read-only en bevat het unieke device-ID van de module.
De relay characteristic ondersteunt `WRITE_NR` (Write Without Response). De UUID characteristic is read-only en bevat het unieke device-ID van de module.
### Key provisioning
@ -251,7 +251,7 @@ De firmware binaries worden via `tools/copy_firmware.sh` naar de app assets geko
3. **Weergave:** Kies Systeem (volgt telefoon), Licht of Donker
4. **Relais labels:** Stel eigen namen in voor de twee relais knoppen
De key wordt opgeslagen in EncryptedSharedPreferences (AES256-GCM versleuteld) en overleeft app-herstarts. Bij geen key toont de hoofdapp "Geen sleutel — open Instellingen" en wordt er niet gescant.
De key wordt opgeslagen in SharedPreferences en overleeft app-herstarts. Bij geen key toont de hoofdapp "Geen sleutel — open Instellingen" en wordt er niet gescant.
### Hoofdscherm UI
@ -385,7 +385,7 @@ De app gebruikt `Theme.AppCompat.DayNight` in plaats van het eerder geforceerde
- De app gebruikt raw Android USB API (`UsbDeviceConnection.bulkTransfer`) in plaats van een externe serial library.
- `minSdk` is 26 (Android 8.0).
- ProgressDialog is vervangen door eigen `AlertDialog` layouts (`dialog_waiting.xml`, `dialog_progress.xml`).
- De HMAC key in de app is opgeslagen via `EncryptedSharedPreferences` (AES256-GCM).
- De HMAC key in de app is opgeslagen via `SharedPreferences`.
- De app gebruikt `Theme.AppCompat.DayNight` met Systeem/Licht/Donker thema-selector.
- `compileSdk`/`targetSdk` blijft op 34 (Android 14) voor maximale compatibiliteit met de doelgroep.