AES ipv HMAC voor BLE relay commands #2
Labels
No labels
bug
bug
critical
documentation
duplicate
enhancement
enhancement
feature
good first issue
help wanted
invalid
question
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
eddy/Project_SylDa#2
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Doel
Vervang de huidige HMAC (32 bytes per packet, 37 bytes totaal) door AES encryptie voor kleinere en snellere packets.
Huidige situatie
hmackeykey(32 bytes)verifyHmac()HMAC_KEYin BleRelayManagerAanpak
Gerelateerde bestanden
src/main.cpp:verifyHmac(), NVS keyssrc/client.cpp: HMAC signingandroid/.../BleRelayManager.kt: HMAC key, signingandroid/.../SettingsActivity.kt: key exchangeDe ESP32-S3 is zelfs nog krachtiger dan de C3 (dual-core Tensilica LX7 op 240 MHz i.p.v. single-core RISC-V op 160 MHz) en beschikt eveneens over een dedicated hardware-accelerator voor AES (inclusief AES-128 en AES-256).
Wat betekent dit voor de ESP32-S3?
Rete-snel: De hardware crypto-engine verwerkt AES-256-GCM in luttele microseconden. De CPU merkt er qua belastbaarheid vrijwel niets van.
Dezelfde code: De mbedTLS-bibliotheek die standaard in het Arduino/ESP-IDF framework zit, stuurt op de S3 automatisch de S3-hardware-crypto aan. Je hoeft je code of libraries dus niet aan te passen ten opzichte van het voorgaande voorbeeld.
Extra voordeel op de ESP32-S3: Hardware Security Features
Mocht je de beveiliging nóg een stap verder willen tillen, dan heeft de S3 specifieke hardware-beveiligingsmodules die erg handig zijn bij BLE-communicatie:
Digital Signature Peripheral (DS): De S3 kan cryptographic signatures genereren met een private key die veilig in de hardware opgeslagen zit en nooit door software (of een dump van het geheugen) uitgelezen kan worden.
HMAC module: Voor het veilig afleiden van sessiesleutels uit een hoofdsleutel.
Flash Encryption & Secure Boot v2: Hiermee voorkom je dat iemand de AES-sleutel uit de flash van de ESP32-S3 kan uitlezen als ze fysiek toegang hebben tot de chip.
Kortom: de S3 is uitermate geschikt voor dit doel!
Wil je een voorbeeld hoe je ECDH sleuteluitwisseling (Diffie-Hellman) instelt op de S3?
Ja
Om een dynamische AES-256 sleutel op te stellen zonder deze vast in de code te hoeven zetten (hardcoden), gebruik je ECDH (Elliptic Curve Diffie-Hellman) met de Curve25519 of SECP256R1 curve.
Met ECDH genereren beide ESP32-S3's hun eigen Private/Public keypair. Ze wisselen alleen hun Public Keys uit via BLE. Vervolgens berekenen ze beiden onafhankelijk van elkaar exact dezelfde Shared Secret (Master Key).
Hoe het werkt over BLE
ESP32-S3 (BLE Client) ESP32-S3 (BLE Server)
Genereert Keypair A 1. Genereert Keypair B
Verstuurt Public Key A -------- BLE Write ------->
3. Berekent Shared Secret
(PrivKey B + PubKey A)
Berekent Shared Secret <------ BLE Notify -------- Verstuurt Public Key B
(PrivKey A + PubKey B)
BEIDE APPARATEN HEBBEN NU DEZELFDE AES-256 SLEUTEL (GEEN PRIVATE KEYS OVER BLE!)
Voorbeeldcode (Arduino / PlatformIO Framework)
Onderstaande C++ code gebruikt de ingebouwde mbedtls bibliotheek (mbedtls/ecdh.h). Deze maakt op de ESP32-S3 gebruik van de hardwarematige ECC-accelerator.
Deze klasse maakt het genereren van de sleutels en het berekenen van de shared secret eenvoudig:
C++
#include <Arduino.h>
#include "mbedtls/ecdh.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
class CryptoECDH {
private:
mbedtls_ecdh_context ecdh;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
public:
uint8_t public_key[65]; // Uncompressed SECP256R1 Public Key
size_t pub_len = 0;
uint8_t shared_secret[32]; // De uiteindelijke AES-256 Sleutel
};
2. Integratie in de BLE Flow (Conceptuele setup)
In je BLE code (met de standaard NimBLE-Arduino of ESP32 BLE Library) gebruik je bovenstaande klasse als volgt tijdens de verbinding opzetten:
C++
#include "ecdh_helper.h"
CryptoECDH ecdh_node;
void setup_security() {
Serial.begin(115200);
}
// Wordt aangeroepen wanneer BLE de Public Key van de ANDERE ESP32-S3 ontvangt
void on_receive_peer_public_key(uint8_t* payload, size_t length) {
Serial.println("Public Key van tegenpartij ontvangen via BLE...");
}
Beveiligingstips voor Productie
Man-In-The-Middle (MITM) Aanvallen:
Pure ECDH beschermt tegen afluisteren, maar niet tegen een actieve aanvaller die zich tussen de twee ESP's nestelt (MITM). Om dit op te lossen kun je in BLE Passkey Pairing inschakelen, of eenmalig een vooraf bekende preshared root key gebruiken om de publieke sleutels te ondertekenen.
Ephemeral Keys (Perfect Forward Secrecy):
Genereer bij elke nieuwe BLE-verbinding een nieuw ECDH-sleutelpaar (generate_keys()). Mocht een sessiesleutel ooit uitlekken, dan zijn oude of toekomstige berichten alsnog niet te ontsleutelen.
RAM Opschonen:
Zodra de shared_secret is geladen in de AES-GCM context, roep je ecdh_node.free() op om de tijdelijke ECDH-sleutels uit het RAM-geheugen te wissen.
Implementatieplan
Beveiligingsmodel
ECDH + PSK-signed pubkeys — MITM-bestendig
Packet (AES-256-GCM relay): 29 bytes
v.s. huidige 37 bytes HMAC — 21% kleiner
Nieuwe BLE characteristic
beb5483e-...-f26dc(WRITE_NR | NOTIFY) — 97B ECDH handshakeNVS/Prefs
hmac/key→syl/psk(ESP)hmac_key→psk(Android)Bestanden
src/ecdh_helper.hmain.cpp,client.cpp,BleRelayManager.kt,SettingsActivity.kt,PrefsHelper.kt,version.txtGeen backward compatibility
Schone break — HMAC packets worden niet meer geaccepteerd.
Volledig plan:
docs/plan-issue-2-aes-ecdh.mdCode review crypto (afgerond)
Beveiligingsmodel: ECDH-secp256r1 + PSK-HMAC pubkey auth + AES-256-GCM relay commands. Consistent tussen firmware (mbedtls) en Android (JCA).
Bevindingen:
CryptoECDH::free()(public_key niet gewist) — opgelost ine03067cConclusie: Implementatie voldoet aan plan. Issue gesloten.