Sous le capot d’Écho 🔧Under Écho’s hood 🔧Onder de motorkap van Écho 🔧Unter der Haube von Écho 🔧
Ici, on arrête de rigoler. Voici comment Écho est construit, ce qui a réellement été testé, et ce qui ne l’est pas encore. Écho est jeune : il n’a pas encore eu d’audit externe indépendant.Time to get serious. Here is how Écho is built, what has actually been tested, and what has not yet. Écho is young: it has not yet had an independent external audit.Nu even serieus. Zo is Écho gebouwd, dit is echt getest en dit nog niet. Écho is jong: er is nog geen onafhankelijke externe audit geweest.Jetzt mal ernst. So ist Écho gebaut, das wurde wirklich getestet und das noch nicht. Écho ist jung: Ein unabhängiges externes Audit gab es noch nicht.
L’architectureArchitectureArchitectuurArchitektur
Téléphone APhone ATelefoon ATelefon Aclés, historique, messages en attentekeys, history, pending messagessleutels, geschiedenis, wachtende berichtenSchlüssel, Verlauf, wartende Nachrichten
⇄
RelaisRelayRelayRelaispasse des blocs illisibles, ne les garde paspasses unreadable blobs, keeps nonegeeft onleesbare blokken door, bewaart ze nietreicht unlesbare Blöcke weiter, speichert sie nicht
⇄
Téléphone BPhone BTelefoon BTelefon Bseul à pouvoir ouvrir ce qui lui est destinéthe only one able to open what is sent to itde enige die kan openen wat ervoor bedoeld isals Einziges in der Lage, zu öffnen, was für es bestimmt ist
- Messages : ils passent par le relais, qui les remet si le destinataire est connecté et n’en garde aucun. Sinon, ils restent chiffrés sur le téléphone de l’expéditeur et repartent quand les deux sont en ligne.Messages go through the relay, which delivers them if the recipient is connected and keeps none. Otherwise they stay encrypted on the sender’s phone and go out again when both are online.Berichten gaan via de relay, die ze aflevert als de ontvanger verbonden is en er geen bewaart. Anders blijven ze versleuteld op de telefoon van de afzender en vertrekken ze opnieuw als beiden online zijn.Nachrichten laufen über das Relais, das sie zustellt, wenn der Empfänger verbunden ist, und keine speichert. Sonst bleiben sie verschlüsselt auf dem Telefon des Absenders und gehen erneut raus, wenn beide online sind.
- Fichiers : chiffrés sur le téléphone avec une clé à usage unique, gardés illisibles en mémoire sur le relais, 24 heures au plus.Files are encrypted on the phone with a one-time key and held unreadable in the relay’s memory for 24 hours at most.Bestanden worden op de telefoon versleuteld met een eenmalige sleutel en maximaal 24 uur onleesbaar in het geheugen van de relay bewaard.Dateien werden auf dem Telefon mit einem Einmalschlüssel verschlüsselt und höchstens 24 Stunden unlesbar im Speicher des Relais gehalten.
- Appels : directs entre téléphones quand c’est possible (WebRTC, DTLS-SRTP). Sinon, ils passent par un serveur TURN, qui ne voit que des paquets chiffrés. Leur signalisation passe dans le protocole ci-dessous.Calls run directly between phones when possible (WebRTC, DTLS-SRTP). Otherwise they go through a TURN server that only sees encrypted packets. Their signalling goes through the protocol below.Gesprekken lopen waar mogelijk rechtstreeks tussen telefoons (WebRTC, DTLS-SRTP). Anders via een TURN-server die alleen versleutelde pakketten ziet. De signalering gaat via het protocol hieronder.Anrufe laufen wenn möglich direkt zwischen den Telefonen (WebRTC, DTLS-SRTP). Sonst über einen TURN-Server, der nur verschlüsselte Pakete sieht. Die Signalisierung läuft über das unten beschriebene Protokoll.
- Notifications : elles indiquent seulement le type (message, photo, appel…), sans contenu ni expéditeur. Le relais, puis Apple ou Google qui les transportent, voient ce type.Notifications only show the type (message, photo, call…), with no content or sender. The relay, then Apple or Google who carry them, see that type.Meldingen tonen alleen het type (bericht, foto, gesprek…), zonder inhoud of afzender. De relay en daarna Apple of Google, die ze vervoeren, zien dat type.Benachrichtigungen zeigen nur den Typ (Nachricht, Foto, Anruf …), ohne Inhalt und Absender. Das Relais und danach Apple oder Google, die sie transportieren, sehen diesen Typ.
- Hébergement : serveurs chez OVHcloud, en France. En secours, les appels peuvent utiliser un service STUN public.Hosting: servers at OVHcloud in France. As a fallback, calls may use a public STUN service.Hosting: servers bij OVHcloud in Frankrijk. Als terugval kunnen gesprekken een openbare STUN-dienst gebruiken.Hosting: Server bei OVHcloud in Frankreich. Als Rückfall können Anrufe einen öffentlichen STUN-Dienst nutzen.
Le protocole, couche par coucheThe protocol, layer by layerHet protocol, laag per laagDas Protokoll, Schicht für Schicht
| Établissement de sessionSession setupSessie opzettenSitzungsaufbau | X25519 et ML-KEM-768 éphémères, combinés avec HKDF-SHA-256 et liés à tout l’échange. Il faudrait casser les deux pour retrouver la clé racine. Échanges signés en Ed25519.Ephemeral X25519 and ML-KEM-768, combined with HKDF-SHA-256 and bound to the whole exchange. Both would have to be broken to recover the root key. Exchanges signed with Ed25519.Efemere X25519 en ML-KEM-768, gecombineerd met HKDF-SHA-256 en gebonden aan de hele uitwisseling. Beide moeten gebroken worden om de hoofdsleutel te vinden. Uitwisselingen ondertekend met Ed25519.Ephemeres X25519 und ML-KEM-768, kombiniert mit HKDF-SHA-256 und an den gesamten Austausch gebunden. Beide müssten gebrochen werden, um den Stammschlüssel zu erhalten. Austausch mit Ed25519 signiert. |
| Chaque messageEach messageElk berichtJede Nachricht | Double ratchet : une clé par message, effacée après usage. Chiffrement XSalsa20-Poly1305. Protège le trafic passé si un téléphone est volé plus tard.Double ratchet: one key per message, erased after use. XSalsa20-Poly1305 encryption. Protects past traffic if a phone is stolen later.Double ratchet: één sleutel per bericht, na gebruik gewist. XSalsa20-Poly1305-versleuteling. Beschermt eerder verkeer als een telefoon later wordt gestolen.Double Ratchet: ein Schlüssel pro Nachricht, nach Gebrauch gelöscht. XSalsa20-Poly1305-Verschlüsselung. Schützt früheren Verkehr, falls ein Telefon später gestohlen wird. |
| RenouvellementRenewalVernieuwingErneuerung | Nouvel établissement complet après 100 messages ou 7 jours.A full new setup after 100 messages or 7 days.Volledig nieuwe opzet na 100 berichten of 7 dagen.Vollständig neuer Aufbau nach 100 Nachrichten oder 7 Tagen. |
| EnveloppeEnvelopeEnvelopUmschlag | Deuxième couche : signature Ed25519 et chiffrement X25519 + XSalsa20-Poly1305 entre identités. Cache au relais l’en-tête du message et les clés de session.Second layer: Ed25519 signature and X25519 + XSalsa20-Poly1305 encryption between identities. Hides the message header and session keys from the relay.Tweede laag: Ed25519-handtekening en X25519 + XSalsa20-Poly1305-versleuteling tussen identiteiten. Verbergt de berichtkop en sessiesleutels voor de relay.Zweite Schicht: Ed25519-Signatur und X25519 + XSalsa20-Poly1305-Verschlüsselung zwischen Identitäten. Verbirgt Nachrichtenkopf und Sitzungsschlüssel vor dem Relais. |
| TransportTransportTransportTransport | TLS (WebSocket sécurisé), sous tout le reste.TLS (secure WebSocket), underneath everything else.TLS (beveiligde WebSocket), onder al het andere.TLS (sicherer WebSocket), unter allem anderen. |
| IdentitéIdentityIdentiteitIdentität | Clés créées sur le téléphone, gardées dans le coffre du système. Scan du QR code ou comparaison du numéro de sécurité pour vérifier un contact.Keys created on the phone and kept in the system vault. Scan the QR code or compare the safety number to verify a contact.Sleutels aangemaakt op de telefoon en bewaard in de systeemkluis. Scan de QR-code of vergelijk het veiligheidsnummer om een contact te verifiëren.Schlüssel werden auf dem Telefon erzeugt und im Systemtresor aufbewahrt. QR-Code scannen oder Sicherheitsnummer vergleichen, um einen Kontakt zu prüfen. |
Aucun algorithme de chiffrement maison : les primitives viennent de bibliothèques publiques (tweetnacl, noble). L’assemblage en protocole est, lui, propre à Écho, et c’est lui qu’un audit devra examiner en priorité.No home-made encryption algorithm: the primitives come from public libraries (tweetnacl, noble). The way they are assembled into a protocol is specific to Écho, and that is what an audit should examine first.Geen zelfgemaakt versleutelingsalgoritme: de primitieven komen uit openbare bibliotheken (tweetnacl, noble). De samenstelling tot protocol is eigen aan Écho, en dat moet een audit als eerste bekijken.Kein selbst erfundener Verschlüsselungsalgorithmus: Die Primitive stammen aus öffentlichen Bibliotheken (tweetnacl, noble). Der Zusammenbau zum Protokoll ist Écho-eigen, und genau den sollte ein Audit zuerst prüfen.
Ce que le serveur voitWhat the server seesWat de server zietWas der Server sieht
- Les clés publiques de l’expéditeur et du destinataire, l’adresse IP, l’heure et la taille des blocs.The sender’s and recipient’s public keys, the IP address, the time and size of blobs.De publieke sleutels van afzender en ontvanger, het IP-adres, het tijdstip en de grootte van de blokken.Die öffentlichen Schlüssel von Absender und Empfänger, die IP-Adresse, Zeit und Größe der Blöcke.
- Qui a l’appli ouverte, et quels contacts chaque téléphone suit pour afficher leur présence. C’est en mémoire et non conservé, mais le relais voit bien ces relations.Who has the app open, and which contacts each phone follows to show presence. It is in memory and not kept, but the relay does see these relationships.Wie de app open heeft en welke contacten elke telefoon volgt om aanwezigheid te tonen. Dit staat in het geheugen en wordt niet bewaard, maar de relay ziet deze relaties wel.Wer die App geöffnet hat und welchen Kontakten jedes Telefon folgt, um die Anwesenheit anzuzeigen. Das liegt im Speicher und wird nicht aufbewahrt, aber das Relais sieht diese Beziehungen.
- L’annuaire garde une empreinte de l’adresse e-mail (HMAC-SHA-256), les clés publiques et l’adresse de notification du téléphone.The directory keeps a fingerprint of the email address (HMAC-SHA-256), the public keys and the phone’s notification address.De adresgids bewaart een vingerafdruk van het e-mailadres (HMAC-SHA-256), de publieke sleutels en het meldingsadres van de telefoon.Das Verzeichnis speichert einen Fingerabdruck der E-Mail-Adresse (HMAC-SHA-256), die öffentlichen Schlüssel und die Benachrichtigungsadresse des Telefons.
- Jamais : le contenu, le nom du fichier, les clés privées, le texte d’un message.Never: the content, file names, private keys, message text.Nooit: de inhoud, bestandsnamen, privésleutels, berichttekst.Niemals: Inhalt, Dateinamen, private Schlüssel, Nachrichtentext.
Les tests réellement faitsThe tests actually runDe echt uitgevoerde testsDie tatsächlich durchgeführten Tests
État au 3 novembre 2026.As of 3 November 2026.Stand van 3 november 2026.Stand: 3. November 2026.
| 22 tests automatiques du protocole22 automated protocol tests22 geautomatiseerde protocoltests22 automatische Protokolltests | Réussis. Échange normal, désordre et pertes, rejeu, altération du texte et de l’en-tête, faux changement de clé, mauvais destinataire, clé X25519 faible, texte ML-KEM remplacé, demandes croisées, vol de l’état (anciens messages toujours illisibles), session perdue puis réparée, expiration des clés.Passed. Normal exchange, disorder and loss, replay, tampered text and header, fake key change, wrong recipient, weak X25519 key, replaced ML-KEM ciphertext, crossed requests, stolen state (old messages remain unreadable), lost then repaired session, key expiry.Geslaagd. Normale uitwisseling, wanorde en verlies, herhaling, gewijzigde tekst en kop, valse sleutelwissel, verkeerde ontvanger, zwakke X25519-sleutel, vervangen ML-KEM-tekst, gekruiste verzoeken, gestolen status (oude berichten blijven onleesbaar), verloren en herstelde sessie, verlopen sleutels.Bestanden. Normaler Austausch, Unordnung und Verlust, Wiederholung, manipulierter Text und Kopf, falscher Schlüsselwechsel, falscher Empfänger, schwacher X25519-Schlüssel, ersetzter ML-KEM-Text, gekreuzte Anfragen, gestohlener Zustand (alte Nachrichten bleiben unlesbar), verlorene und reparierte Sitzung, Schlüsselablauf. |
| Simulations de réseau hostileHostile network simulationsSimulaties van een vijandig netwerkSimulationen eines feindlichen Netzes | 240 exécutions, aucun message perdu. Pertes jusqu’à 50 %, rejeux, redémarrages, sessions perdues. Limite : ces simulations reproduisent la logique de l’appli, sans l’appli elle-même.240 runs, no message lost. Up to 50% loss, replays, restarts, lost sessions. Limit: these simulations reproduce the app’s logic, without the app itself.240 runs, geen bericht verloren. Tot 50% verlies, herhalingen, herstarts, verloren sessies. Beperking: deze simulaties bootsen de logica van de app na, zonder de app zelf.240 Läufe, keine Nachricht verloren. Bis zu 50 % Verlust, Wiederholungen, Neustarts, verlorene Sitzungen. Grenze: Diese Simulationen bilden die Logik der App nach, ohne die App selbst. |
| Essais sur le vrai relaisTests on the real relayTests op de echte relayTests auf dem echten Relais | Réussis. Destinataire absent : rien n’est gardé, le relais répond « non livré ». Signature fausse refusée. Notifications : Apple et Google joints avec de faux jetons, qui sont ensuite oubliés.Passed. Recipient absent: nothing kept, the relay answers “not delivered”. Forged signature refused. Notifications: Apple and Google reached with fake tokens, which are then forgotten.Geslaagd. Ontvanger afwezig: niets bewaard, de relay antwoordt “niet afgeleverd”. Valse handtekening geweigerd. Meldingen: Apple en Google bereikt met valse tokens, die daarna worden vergeten.Bestanden. Empfänger abwesend: Nichts wird gespeichert, das Relais antwortet „nicht zugestellt“. Gefälschte Signatur abgelehnt. Benachrichtigungen: Apple und Google mit falschen Tokens erreicht, die danach vergessen werden. |
| Relecture de sécurité par une IASecurity review by an AIBeveiligingsbeoordeling door een AISicherheitsprüfung durch eine KI | Une IA (Claude), lancée à part, a relu le protocole et l’appli avec un relais supposé malveillant. Elle a jugé saine la construction cryptographique et trouvé 18 points, dont 3 graves, corrigés avant publication : signaux d’appel acceptés de n’importe qui, « identité vérifiée » falsifiable par le relais, écriture de fichier par un nom de message piégé. Ce n’est pas un audit humain.An AI (Claude), run separately, reviewed the protocol and the app assuming a malicious relay. It found the cryptographic construction sound and raised 18 points, 3 of them serious and fixed before release: call signals accepted from anyone, “verified identity” forgeable by the relay, file writing through a crafted message name. This is not a human audit.Een apart gestarte AI (Claude) beoordeelde het protocol en de app, uitgaande van een kwaadwillende relay. De cryptografische constructie werd in orde bevonden, met 18 punten, waarvan 3 ernstige die vóór publicatie zijn opgelost: gesprekssignalen van iedereen aanvaard, “geverifieerde identiteit” vervalsbaar door de relay, schrijven van bestanden via een misleidende berichtnaam. Dit is geen menselijke audit.Eine separat gestartete KI (Claude) prüfte Protokoll und App unter der Annahme eines bösartigen Relais. Sie hielt die kryptografische Konstruktion für solide und fand 18 Punkte, davon 3 schwere, die vor der Veröffentlichung behoben wurden: Anrufsignale von jedem akzeptiert, vom Relais fälschbare „verifizierte Identität“, Schreiben von Dateien über einen präparierten Nachrichtennamen. Das ist kein menschliches Audit. |
| Essai réel entre deux téléphonesReal test between two phonesEchte test tussen twee telefoonsEchter Test zwischen zwei Telefonen | En cours. Le protocole n’a pas encore été validé sur téléphones.In progress. The protocol has not yet been validated on phones.Bezig. Het protocol is nog niet op telefoons gevalideerd.Läuft. Das Protokoll wurde noch nicht auf Telefonen validiert. |
| Audit externe indépendantIndependent external auditOnafhankelijke externe auditUnabhängiges externes Audit | Pas encore fait.Not done yet.Nog niet gedaan.Noch nicht erfolgt. |
Les limites connuesKnown limitsBekende beperkingenBekannte Grenzen
Appels et quantique. Les appels utilisent le chiffrement standard de WebRTC, qui ne résiste pas à un futur ordinateur quantique ayant enregistré l’échange.Calls and quantum. Calls use standard WebRTC encryption, which does not withstand a future quantum computer that recorded the exchange.Gesprekken en kwantum. Gesprekken gebruiken de standaard WebRTC-versleuteling, die niet bestand is tegen een toekomstige kwantumcomputer die de uitwisseling heeft opgenomen.Anrufe und Quanten. Anrufe nutzen die Standard-WebRTC-Verschlüsselung, die einem künftigen Quantencomputer, der den Austausch aufgezeichnet hat, nicht standhält.
Métadonnées. Le chiffrement cache le contenu, pas le fait que deux clés se parlent. Le relais peut le voir.Metadata. Encryption hides the content, not the fact that two keys are talking. The relay can see that.Metadata. Versleuteling verbergt de inhoud, niet het feit dat twee sleutels met elkaar praten. De relay kan dat zien.Metadaten. Die Verschlüsselung verbirgt den Inhalt, nicht die Tatsache, dass zwei Schlüssel miteinander sprechen. Das Relais kann das sehen.
Premier contact. Trouver quelqu’un par e-mail, c’est faire confiance à l’annuaire. Pour en être sûr, scannez son QR code ou comparez vos numéros de sécurité. Un changement de clé annoncé n’est jamais appliqué sans votre accord.First contact. Finding someone by email means trusting the directory. To be sure, scan their QR code or compare safety numbers. An announced key change is never applied without your agreement.Eerste contact. Iemand via e-mail vinden betekent de adresgids vertrouwen. Scan voor de zekerheid de QR-code of vergelijk de veiligheidsnummers. Een aangekondigde sleutelwissel wordt nooit zonder uw akkoord toegepast.Erstkontakt. Jemanden per E-Mail zu finden heißt, dem Verzeichnis zu vertrauen. Um sicherzugehen, scannen Sie den QR-Code oder vergleichen Sie die Sicherheitsnummern. Ein angekündigter Schlüsselwechsel wird nie ohne Ihre Zustimmung angewendet.
Identité vérifiée. L’attestation est signée par SCAALP après un contrôle officiel : c’est un tiers de confiance, pas une preuve mathématique.Verified identity. The attestation is signed by SCAALP after an official check: it is a trusted third party, not a mathematical proof.Geverifieerde identiteit. De attestering wordt door SCAALP ondertekend na een officiële controle: een vertrouwde derde, geen wiskundig bewijs.Verifizierte Identität. Die Bescheinigung wird von SCAALP nach einer amtlichen Prüfung signiert: ein vertrauenswürdiger Dritter, kein mathematischer Beweis.
Téléphone volé et déverrouillé. L’historique se lit dans l’appli, et les fichiers reçus sont en clair dans son dossier privé. La protection du passé concerne le trafic intercepté, pas ce que vous avez gardé.Stolen, unlocked phone. The history is readable in the app, and received files are unencrypted in its private folder. Protection of the past covers intercepted traffic, not what you kept.Gestolen, ontgrendelde telefoon. De geschiedenis is leesbaar in de app en ontvangen bestanden staan onversleuteld in de privémap. De bescherming van het verleden geldt voor onderschept verkeer, niet voor wat u hebt bewaard.Gestohlenes, entsperrtes Telefon. Der Verlauf ist in der App lesbar, und empfangene Dateien liegen unverschlüsselt in ihrem privaten Ordner. Der Schutz der Vergangenheit betrifft abgefangenen Verkehr, nicht das, was Sie aufbewahrt haben.
Renouvellement. Un relais malveillant pourrait bloquer les renouvellements de session. La clé racine reste hybride, mais la session durerait alors sans nouveau ML-KEM.Renewal. A malicious relay could block session renewals. The root key stays hybrid, but the session would then continue without a new ML-KEM.Vernieuwing. Een kwaadwillende relay kan sessievernieuwingen blokkeren. De hoofdsleutel blijft hybride, maar de sessie loopt dan door zonder nieuwe ML-KEM.Erneuerung. Ein bösartiges Relais könnte Sitzungserneuerungen blockieren. Der Stammschlüssel bleibt hybrid, aber die Sitzung liefe dann ohne neues ML-KEM weiter.
Bibliothèque ML-KEM. La bibliothèque noble-post-quantum n’a pas encore été auditée de façon indépendante, d’après sa propre documentation. C’est une raison de garder X25519 à ses côtés.ML-KEM library. The noble-post-quantum library has not yet been independently audited, according to its own documentation. That is one reason to keep X25519 alongside it.ML-KEM-bibliotheek. De bibliotheek noble-post-quantum is volgens haar eigen documentatie nog niet onafhankelijk geaudit. Dat is een reden om X25519 ernaast te houden.ML-KEM-Bibliothek. Die Bibliothek noble-post-quantum wurde laut ihrer eigenen Dokumentation noch nicht unabhängig geprüft. Das ist ein Grund, X25519 danebenzubehalten.
Vous avez trouvé une faille ? Écrivez à paris@scaalp.net.Found a flaw? Write to paris@scaalp.net.Een fout gevonden? Schrijf naar paris@scaalp.net.Eine Schwachstelle gefunden? Schreiben Sie an paris@scaalp.net.
← Retour à Écho← Back to Écho← Terug naar Écho← Zurück zu Écho