Generate
The Rust engine generates the Ed25519 identity key on first launch. Private keys never reach Dart (ADR-005).
SECURITY MODEL · Verifiable, not promised
Maturity ladder and threat table. Until an independent audit ships, this site shows no audit badges or fake PDFs (ADR-010).
Handshake
No session key exists until all four steps pass. Any failure aborts the connection.
mDNS or a scanned code yields a candidate. A candidate carries no identity claim and is never trusted.
Exchange ephemeral X25519 keys and sign the whole handshake transcript with the Ed25519 identity key.
Both sides compare the same short SAS digits and confirm. Any mismatch aborts — no half-trusted state.
HKDF-SHA256 derives AES-256-GCM session keys. Long-term keys only sign, never enter the KDF.
Key lifecycle
Identity and session keys are strictly separated: one only signs, the other is thrown away.
The Rust engine generates the Ed25519 identity key on first launch. Private keys never reach Dart (ADR-005).
Handed to platform secure storage: Keychain / DPAPI / Android Keystore. Export fails by design.
Long-term keys only sign the handshake transcript; they never feed key derivation.
Each connection derives fresh keys from ephemeral X25519 + HKDF-SHA256, discarded when it ends.
Device ids derive from public keys, so revocation is per device and leaves other pairings intact.
Threats
The third column is what we cannot do. Writing it down beats hiding it.
| Threat | Defense | Residual |
|---|---|---|
| LAN sniffing | App-layer AES-256-GCM | Compromised endpoint still sees plaintext |
| Spoofed discovery | Signed QR payload + mutual SAS | Social engineering on the human |
| Untrusted file send | Engine rejects the FileOffer | Malware arriving from a trusted peer |
| Relay peek | E2EE; relay off by default | Relay still sees metadata (timing / size) |
| Replay & tamper | AEAD on every frame + protocolised nonce + counters | Implementation bugs (we can be wrong too) |
| Supply chain | Published SHA-256 + platform signature notes | Fails if the build pipeline is compromised |
Maturity
Progress is self-assessed, not a third-party verdict.
In progress
Core paths covered
Not started — no badges until done
Process draft
Limits
These do not expire with time — they are model boundaries, not a backlog.
If a device is fully owned, plaintext is readable at that end. Every E2EE scheme stops there.
SAS exists so you can compare, not so we can decide for you. Being talked into confirming is handing over trust.
The relay never learns content, but it does learn who sent how much, when.
ADR-010: until an independent audit ships, this site shows no audit badges and no fake PDFs.
Target: acknowledge within 72 hours. Send reproducible details to security@.
The client runs Local by default. Read the security model in two minutes if you prefer.