- Memory
- Inside the Rust core, keys and decrypted bytes live in buffers that are overwritten with zeros when released, including the buffers it hands to the Swift and Kotlin wrappers. Decrypted photos and videos are kept in a cache on the phone so they open without being decrypted again; the cache is cleared on sign-out and when the account is deleted.
- Unsafe code
- The crate denies
unsafe. Only the two boundary files, for Swift (C ABI) and Kotlin (JNI), allow it.
- Boundary
- Every C entry point that runs core code catches panics, so a failure inside the core returns an error code to the app.
- Large files
- Encrypted in authenticated 64 KiB chunks. Truncating, reordering, extending or splicing a file makes it fail, and the decrypted file appears only after the whole file checks; a failed file leaves nothing behind.
- Rust tests
- 22: 19 unit tests, 2 tests against the shared test vectors, and 1 check that the C header matches the exported functions.
- Test vectors
- The Rust core and the app’s JavaScript development core use the same byte format, and each must open the other’s fixed test vectors.
- Review
- An internal review before launch covered seven areas: database permissions, server functions, rate limits, media storage, the app, operator tools and secrets. It read the code and tried attacks on a local copy of the servers. There has been no independent audit yet.