evb-e2ee-v1) executed by the Everabyte web,
desktop and mobile apps. The SDK is a byte-exact, cross-language
implementation of that wire format: a file encrypted with one binding
decrypts with every other, and compatibility is enforced in CI through a
shared frozen test-vector grid plus the official test vectors of the
underlying standards.
Which language, which mechanism
Repository: everabyte/crypto-sdk.
PHP, Java, C# and Go all speak the same stable C ABI
(reference) — any other language with a C FFI can
integrate identically.
How a zero-knowledge file flows
Every step below runs client-side except the two network calls, which only carry ciphertext, opaque aliases and wrapped keys:- Enroll once. Generate the account key (UMK: X25519 secret 32 B +
ML-KEM-768 seed 64 B) and a 12-word BIP-39 recovery phrase. Register the
public keys and the wrapped copies:
POST /e2ee/keys/register. - Per file, generate a data key (DEK, 32 random bytes) — it is never persisted anywhere.
- Encrypt the content locally: AES-256-GCM in authenticated 64 KiB
chunks (
EVB1wire format). - Name substitution: the upload filename becomes a deterministic opaque
alias (
evb-<hex64>); the real name travels only as an AES-256-GCM blob under the DEK. - Wrap the DEK to the account key with HPKE (RFC 9180, mode PSK carrying
the ML-KEM-768 shared secret), upload the ciphertext, and attach the
envelope:
POST /e2ee/files/by-path/envelope. - Download = fetch envelope + ciphertext, unwrap the DEK, decrypt locally. The restored file is byte-identical to the original.
GET /e2ee/files/{fileId}/envelope before taking action. After a confirmed attach failure, the E2EE upload contract requires deleting the orphaned ciphertext row. Resolve its identifier from the bucket listing if necessary, confirm no envelope is attached, then hard-delete it through the file API; retention policy may prevent deletion and must be handled explicitly.
Mandatory for new accounts
Accounts created on or after 2026-11-13 are zero-knowledge by default (zkRequired). For these accounts:
- uploads must be client-encrypted — files that arrive unencrypted are refused on download (403) and swept after a grace window;
- the Everabyte apps enforce this natively; custom integrations enforce it by following the quickstarts above;
- legacy accounts keep the opt-in path — client-side encryption is optional and existing files migrate through the in-app controls (migration).
Standards conformance
The HPKE key schedule is byte-exact against RFC 9180 §A.1.1/A.1.2 (both
sender and receiver side); the GCM/HKDF constructions match the official
published vectors. Compliance tests run in the SDK repository and fail the
build on any drift.
What the SDK does — and what stays in your application
The split is deliberate: your key custody model stays yours. The SDK never
opens a network connection and never logs key material. Browser code must not
contain an Everabyte secret API key; route authenticated REST calls through
your own backend. That backend can relay ciphertext and wrapped envelope data
without receiving the UMK, DEK or recovery phrase.
What the model protects — and what it does not
Protected: the content and the names of zero-knowledge files, against Everabyte’s services, operators and infrastructure providers. No operator console, maintenance job or database read can produce their plaintext. No escrow: with every enrolled device and the recovery phrase lost, the data is unreadable by anyone — including Everabyte. Not protected:- Technical metadata the product requires: file/folder sizes, timestamps, the folder tree, the sharing graph, quotas and access logs. Visible to the service in both encryption models.
- Deliberate sharing. A share recipient — or anyone holding a public link — holds the decryption key material for that file, by design.
- A compromised device, or a tampered client on it. Encryption happens where the SDK runs; protect the host.
- The web app delivering its own code — native bindings (this SDK) remove that dependency for custom integrations.
- Recovery failure. No enrolled device + no recovery phrase = no recovery. There is nothing for support to reset.
Where to go next
Node.js quickstart
Prebuilt WASM — no toolchain. Full upload/download round trip.
TypeScript quickstart
Browser-side encryption only. Use your backend for authenticated Everabyte API calls.
Rust quickstart
Services and CLI tools, streaming included.
Dart quickstart
Flutter and Dart via the native FFI binding.
PHP / Java / C# / Go
One C ABI, four FFI paths — quickstarts for each.
Wire protocol
The
evb-e2ee-v1 format, envelopes, wraps and versioning policy.SDK API reference
Every exported function of every binding.
Migrating legacy files
Moving existing server-encrypted files to zero-knowledge.