Crypto: rweather en ed25519¶
ED25519 · SHA256 · AES · TWEE IMPLEMENTATIES
MeshCore heeft twee Ed25519-implementaties in de build zitten. De ene komt
uit rweather/Crypto, de andere staat meegeleverd in lib/ed25519. Ze worden
allebei gebruikt, in hetzelfde bestand, voor verschillende bewerkingen — en
de reden daarvoor staat als commentaar in de broncode.
[!NOTE] Bron. Deze pagina is geverifieerd tegen de firmware zelf:
MeshCorev1.16.0, commit03b6ef4, 28 juli 2026 — bestandenplatformio.ini,src/Identity.cpp,src/Packet.cpp,src/Utils.cpp,src/helpers/RegionMap.cpp,src/helpers/TransportKeyStore.cpp,lib/ed25519/entest/mocks/.[!NOTE] Dit hoofdstuk gaat over welke library welke functie levert en waarom er twee zijn. Hoe de versleuteling van MeshCore werkt, staat in
../../techniek/key-encryption.md.
Wat het doet¶
rweather/Crypto van Rhys Weatherley is een verzameling
cryptografiealgoritmen voor Arduino: AES in verschillende sleutellengtes en
modi, SHA-familie, ChaCha, Poly1305, Curve25519 en Ed25519. De algoritmen
zijn geoptimaliseerd voor 8-bit microcontrollers en werken met een vaste,
statisch toegewezen state. Documentatie en achtergrond staan in
rweather/arduinolibs.
lib/ed25519 is iets anders: een compacte C-implementatie van alleen
Ed25519, die als broncode in de MeshCore-repo zelf staat. PlatformIO
compileert alles in lib/ automatisch mee, dus die code komt zonder
lib_deps-regel in elke build terecht.
Hoe MeshCore hem binnenhaalt¶
platformio.ini r.23
rweather/Crypto @ ^0.4.0
De regel staat in [arduino_base] en geldt dus voor alle 507 build-targets.
lib/ed25519 heeft geen regel: die map wordt automatisch meegenomen.
Hoe MeshCore hem gebruikt¶
src/Identity.cpp begint met beide implementaties naast elkaar:
src/Identity.cpp r.3-5
#define ED25519_NO_SEED 1
#include <ed_25519.h>
#include <Ed25519.h>
ed_25519.h is de meegeleverde versie, Ed25519.h die uit rweather/Crypto.
Bij het verifiëren van een handtekening wordt de eerste bewust overgeslagen:
src/Identity.cpp r.17-24
bool Identity::verify(const uint8_t* sig, const uint8_t* message, int msg_len) const {
#if 0
// NOTE: memory corruption bug was found in this function!!
return ed25519_verify(sig, message, msg_len, pub_key);
#else
return Ed25519::verify(sig, this->pub_key, message, msg_len);
#endif
}
Verifiëren gaat dus via rweather/Crypto. Alle andere Ed25519-bewerkingen
gaan wél via de meegeleverde versie: het aanmaken van een sleutelpaar (r.48),
het afleiden van een publieke sleutel uit een private (r.53 en r.131), het
ondertekenen (r.136) en de key exchange (r.79-82 en r.140).
src/Identity.cpp r.135-141
void LocalIdentity::sign(uint8_t* sig, const uint8_t* message, int msg_len) const {
ed25519_sign(sig, message, msg_len, pub_key, prv_key);
}
void LocalIdentity::calcSharedSecret(uint8_t* secret, const uint8_t* other_pub_key) const {
ed25519_key_exchange(secret, other_pub_key, prv_key);
}
Buiten Identity.cpp levert rweather/Crypto twee andere algoritmen.
SHA256 wordt geïncludeerd in src/Packet.cpp r.3,
src/helpers/RegionMap.cpp r.3 en src/helpers/TransportKeyStore.cpp r.2;
AES en SHA256 samen in src/Utils.cpp:
src/Utils.cpp r.1-3
#include "Utils.h"
#include <AES.h>
#include <SHA256.h>
Voor de testbuild wordt de library vervangen. In test/mocks/ staan een
eigen AES.h en SHA256.h; [env:native] zet die map op het includepad
(platformio.ini r.162), zodat de tests draaien zonder de echte
implementatie.
Wat het voor een node betekent¶
Elke node draagt beide implementaties mee. Dat neemt flashruimte in beslag,
en het betekent dat een handtekening die deze node zet, met andere code wordt
gemaakt dan waarmee hij een binnenkomende handtekening controleert. Beide
volgen dezelfde standaard, dus dat werkt — maar wie de crypto-code van
MeshCore leest, moet weten dat Ed25519:: en ed25519_ verschillende
libraries zijn.
De opmerking bij verify is geen historische ruis: de commentaarregel meldt
dat in ed25519_verify geheugencorruptie is gevonden. Die functie staat
sindsdien achter #if 0.