This is a real WebCrypto (crypto.subtle) key hierarchy, not a simulation of one. On enrollment the browser generates a genuine AES-GCM container master key (the KEK) and, for every managed file, a genuine per-file AES-GCM data key (the DEK):
KEK = crypto.subtle.generateKey(AES-GCM 256, ['wrapKey','unwrapKey'])
DEK_i = crypto.subtle.generateKey(AES-GCM 128/256, ['encrypt','decrypt'])
Ciphertext_i = crypto.subtle.encrypt(DEK_i, file_i) // stored "on disk"
Wrapped_i = crypto.subtle.wrapKey(DEK_i, KEK) // stored "on disk"
Opening a file genuinely unwraps its DEK with the KEK, then genuinely decrypts the ciphertext — a real round trip through crypto.subtle.unwrapKey and crypto.subtle.decrypt.
Crypto-shred wipe deletes only the in-memory KEK object — the ciphertext and every wrapped DEK stay exactly where they were, visibly, in the file list below. Any decrypt attempt afterwards must call unwrapKey with a substitute key (nothing else is available), which genuinely fails: AES-GCM's authentication tag cannot verify under the wrong key, so WebCrypto throws a real OperationError. That thrown exception — not a flag — is the proof the data is gone.
t(128-bit) ≈ 2^127 / 1e12 s ≈ 5.4×10¹⁸ years
t(256-bit) ≈ 2^255 / 1e12 s ≈ 1.8×10⁵⁵ years
- Managed files slider — how many files are enrolled in the container; each gets its own genuine DEK wrapped by the shared KEK.
- AES-128 / AES-256 — the DEK length used for newly wrapped files; changes the brute-force estimate live.
- Decrypt all files — runs the real unwrap→decrypt round trip on every file and shows the actual plaintext (or the actual thrown error after a wipe).
- Remote wipe (crypto-shred) — deletes only the KEK object in memory. No ciphertext byte is touched.
- Re-enroll device — a fresh KEK is generated and the container is provisioned again with new files and new wrapped DEKs; the wiped data was never recoverable, so this starts a new container rather than restoring the old one.
This mirrors real enterprise mobility management (Intune, Jamf, Android Enterprise work profile): "wipe" is a key-destruction operation, not a data-overwrite operation.