Encryption: file content, keys and signatures
Which standard algorithms protect a file sent from device to device, what each one does, and what the profile does not promise.
This describes transfers from device to device, directly or through the relay (server route). Files you keep in pipeit Cloud are stored so the service can work with them and do not use this end-to-end profile; see Security and frequently asked questions.
The file crypto profile combines standard algorithms with different jobs:
| Algorithm | Job in the file profile |
|---|---|
| AES-256-GCM with a 128-bit tag | Authenticated encryption of the content and of the encrypted manifest |
| RSA-OAEP-3072 with SHA-256 | Wrapping the random file key for the specific receiving device |
| ECDSA P-256 with SHA-256 | Signing the exact envelope bytes and context-bound device and transfer receipts |
| SHA-256 | Fingerprints and checking ciphertext and plaintext integrity |
Scroll sideways to see the whole table.
Each new file preparation creates a random 256-bit file key and a random 64-bit nonce prefix. For every encryption step a 96-bit GCM nonce is derived from it: prefix plus a 32-bit chunk index in big-endian order. Index 0 is reserved for the encrypted manifest, data starts at index 1. A regular crypto chunk holds up to 4 MiB of plaintext. Profile limits prevent an unbounded index space.
Additional authenticated data (AAD) binds the encryption to the protocol version, the transfer, the devices and the chunk index, among other things. Valid bytes from another transfer therefore cannot simply be inserted as matching chunks. The RSA wrapping also uses a label that fits the job and the receiver. The signature covers the original envelope bytes; parsing and re-serializing JSON would be no substitute for this byte binding.
- Split into chunks of up to 4 MiBFile data
- Encrypt each chunkFile data
- Key for content and manifestControl and permissions
- Encrypted manifestFile data
- Wrap the key for the receiving deviceControl and permissions
- CiphertextFile data
- Wrapped keyControl and permissions
- The sender signs the exact envelope bytesControl and permissions
The original file name and the plaintext file hash are in the encrypted manifest. What stays visible for control are metadata such as the parties, sizes, times, profile and status. pipeit clients keep file names and keys out of diagnostics and local logs.
Transport encryption and end-to-end encryption serve different purposes
The relay sees TLS traffic, never file contents. TLS protects a connection. On the HTTPS and WebSocket relay (server route) that TLS connection ends at the platform; the additional file encryption ends only at the receiver. The relay needs no private file key for that. A paired device must, however, really be the intended receiver: an arbitrary public-key string delivered by a server is no substitute for a trustworthy device comparison.
What the profile does not promise
The file profile does not promise forward secrecy or post-compromise security. The properties of a TLS channel must not be carried over to long-lived encrypted file keys. A compromised end device or maliciously delivered web code also lies within a different trust boundary than a passively listening relay server.
Related guides
From sending to verified receipt
The factual order of an online transfer: order, acceptance, encrypted frames, verification and a signed receipt.
Security and frequently asked questions
What pipeit protects, where files are stored, what a receipt confirms and where the limits are.
Authentication and MCP: signing in is not a file key
Account session, device identity and MCP consent are three different things; here is how they fit together.