Three things that follow from that
The keys exist only on the two devices. They are generated fresh for each transfer, live in the two browsers or apps involved, and are thrown away when the connection closes. There is no key server, no escrow, and no recovery: once a transfer is over, that transfer’s keys are gone and cannot be reconstructed by anyone, Floe included. The servers handle the introduction, not the content. The signaling server passes connection details between the two devices for a few seconds and then plays no further part. It is not on the path the file takes. When a relay is involved it is on the path, but only ever carrying encrypted packets it has no way to open. Self-hosting does not change any of this. The encryption is a property of the connection between the two devices, not of who runs the server. If you run your own instance you get the same guarantee, and you also stop depending on anyone else for the one part that is trusted, which the next section explains.What it does not protect against
Encryption answers “can anyone in the middle read this”. It does not answer every question, and the honest limits are worth knowing rather than discovering. The one that matters most: the two devices agree on keys by exchanging certificate fingerprints, and those fingerprints travel through the signaling server. A server that wanted to could hand each side a fingerprint it controls, sit in the middle, and read everything. This is true of every application built on WebRTC, and the usual defense is a short code the two people compare out of band. Floe computes that code internally but no client shows it today. Read Known limitations for that and the seven others in plain language. A privacy claim is worth more when the exceptions are published alongside it.The mechanism, for the curious
The mechanism, for the curious
Floe uses WebRTC data channels, which run SCTP over DTLS. DTLS is TLS adapted for datagrams:
the same cipher suites and the same handshake, over a transport that does not guarantee ordering.
This is distinct from DTLS-SRTP, which is what WebRTC uses for audio and video.Each peer generates a certificate and key pair for the session. The fingerprints of those
certificates are carried in the SDP offer and answer during setup, and the DTLS handshake
verifies the certificate it receives against the fingerprint it was promised. An attacker
sitting on the network path cannot substitute a certificate, because they cannot also change the
fingerprint that arrived through the signaling channel. An attacker who controls the signaling
channel itself can, which is the limitation described above.Keys are ephemeral and per-session. They are created when the connection is created and
discarded when it closes.Floe adds no encryption layer of its own on top of this, and computes no hash of file contents.
Integrity in transit comes from DTLS; integrity of the finished file is a byte-count check
against the size the sender announced. See
the transfer protocol reference.