SECURITY MODEL · Verifiable, not promised

Security

Maturity ladder and threat table. Until an independent audit ships, this site shows no audit badges or fake PDFs (ADR-010).

Frame cipher
AES-256-GCM
Key exchange
X25519
Device identity
Ed25519
Default path
Local

Handshake

What happens inside one handshake

No session key exists until all four steps pass. Any failure aborts the connection.

  1. 01

    Discover

    mDNS or a scanned code yields a candidate. A candidate carries no identity claim and is never trusted.

  2. 02

    Key exchange

    Exchange ephemeral X25519 keys and sign the whole handshake transcript with the Ed25519 identity key.

  3. 03

    Mutual confirm

    Both sides compare the same short SAS digits and confirm. Any mismatch aborts — no half-trusted state.

  4. 04

    Session crypto

    HKDF-SHA256 derives AES-256-GCM session keys. Long-term keys only sign, never enter the KDF.

Key lifecycle

The life of a key

Identity and session keys are strictly separated: one only signs, the other is thrown away.

Generate

The Rust engine generates the Ed25519 identity key on first launch. Private keys never reach Dart (ADR-005).

Store

Handed to platform secure storage: Keychain / DPAPI / Android Keystore. Export fails by design.

Sign

Long-term keys only sign the handshake transcript; they never feed key derivation.

Session

Each connection derives fresh keys from ephemeral X25519 + HKDF-SHA256, discarded when it ends.

Revoke

Device ids derive from public keys, so revocation is per device and leaves other pairings intact.

Threats

Threats, defenses, residual risk

The third column is what we cannot do. Writing it down beats hiding it.

Threat Defense Residual
LAN sniffingApp-layer AES-256-GCMCompromised endpoint still sees plaintext
Spoofed discoverySigned QR payload + mutual SASSocial engineering on the human
Untrusted file sendEngine rejects the FileOfferMalware arriving from a trusted peer
Relay peekE2EE; relay off by defaultRelay still sees metadata (timing / size)
Replay & tamperAEAD on every frame + protocolised nonce + countersImplementation bugs (we can be wrong too)
Supply chainPublished SHA-256 + platform signature notesFails if the build pipeline is compromised

Maturity

Maturity ladder

Progress is self-assessed, not a third-party verdict.

T0

Threat model & static review

In progress

T1

Protocol tamper / replay tests

Core paths covered

T2

Third-party audit

Not started — no badges until done

T3

Ongoing disclosure & patch SLA

Process draft

Limits

What we cannot do

These do not expire with time — they are model boundaries, not a backlog.

A controlled endpoint beats us

If a device is fully owned, plaintext is readable at that end. Every E2EE scheme stops there.

You can confirm wrongly

SAS exists so you can compare, not so we can decide for you. Being talked into confirming is handing over trust.

Relay sees metadata

The relay never learns content, but it does learn who sent how much, when.

No badges before an audit

ADR-010: until an independent audit ships, this site shows no audit badges and no fake PDFs.

Install first, decide later

The client runs Local by default. Read the security model in two minutes if you prefer.