How accounts get here
The in-app migration (recommended)
The web app’s Settings → Security → Client encryption page provides the migration controls. For an enrolled account with the vault unlocked:- Migrate legacy files — walks your Drive (all buckets, folders at every level), and for each server-encrypted file: downloads the plaintext, encrypts it locally into
EVB1, uploads the ciphertext under the opaque wire alias, attaches the fresh DEK envelope, moves user permissions and public links onto the new row, re-wraps the file key for each share recipient, then removes the legacy row. - Encrypt existing file names — retroactively aliases file names and stores their encrypted display names.
- Encrypt existing folder names — same, for folders.
Migration through the SDK (custom pipelines)
POST /e2ee/files/:fileId/transfer-shares and the /e2ee/* endpoints are API-key reachable, so a migration script follows the same five steps as the app:
GET /files/{id}/stream— download the server-encrypted plaintext (this is the last plaintext transit).- Encrypt locally: fresh DEK,
evb1_seal_all, wire alias, encrypted name (sdk/api-reference). POST /files/upload/{bucketId}/{folderId}— ciphertext under the wire alias, same folder.POST /e2ee/files/by-path/envelope— attach the envelope andencryptedName.POST /e2ee/files/{legacyId}/transfer-shares { targetFileId }— move permissions and links; thenDELETE /files/delete/{legacyId}?trash=hard.
What migration does not change
- SSE stays for what remains. Files that are not migrated keep the layered server-side encryption described in Encryption architecture; the recovery phrase, retention, versions, sharing and the rest of the product are unaffected.
- The backup agent’s restore works across both models: it resolves restored entries by file id and decrypts zero-knowledge entries locally when the device is enrolled.
- Storage metrics (quota, deduplication, version counts) are unchanged — the wire names and ciphertext occupy the same accounting.