Encrypted cells, end-to-end. Type a secret. Pick viewers. Each viewer gets a wrapped key. The server only sees ciphertext.
Bob is in the ACL. He can decrypt. He fetches the ciphertext and his wrapped key, then unwraps.
Eve has the ciphertext. She has a valid keypair. But she's not in the ACL. She has no wrapped key for the content key. The server doesn't have the content key. The math says no.
Every actor in the vault (owner + viewers) generates an ECDH P-256 keypair. The public half is shared; the private half never leaves the device.
Each cell gets its own AES-GCM 256-bit content key. The key is generated freshly. The ciphertext is stored on the server. The key never leaves the owner's device in plaintext.
For each viewer in the ACL, the owner derives a shared secret using ECDH (their private + viewer's public) and uses it to wrap (encrypt) the content key. Each viewer gets a different wrapped key.
To decrypt, the viewer derives the same shared secret (their private + owner's public), unwraps the content key, then decrypts the ciphertext. Bob succeeds. Eve fails: she has no wrapped key.
The cell model is end-to-end encrypted by default. The server is dumb storage. The intelligence is in the cells, on your devices.
View source → See all 11 repos