When Android 5.0 mandated Full-Disk Encryption (FDE) in 2015 and Apple enforced hardware encryption from the iPhone 3GS onward, the goal was simple: if you lose the phone, you lose the data. A single AES-128 key wrapped by the lockscreen PIN encrypted /data as a block device via dm-crypt. It worked, but it was crude. Every boot stopped at “Enter PIN to start Android,” alarms didn’t fire, emergency callbacks failed, and a single key compromise exposed everything.
Today, no flagship ships with FDE. From Android 7.0 and iOS 8 onward, File-Based Encryption (FBE) with hardware-decoupled keys and Direct Boot has completely replaced it. Understanding the architectural shift — from a monolithic dm-crypt volume to per-file, hardware-wrapped keys flowing through an inline crypto engine — explains why modern cold-boot and forensic extraction techniques largely fail against updated devices.
1. Full-Disk Encryption: One Key, One Volume
FDE is conceptually the mobile port of Linux dm-crypt. At first boot, vold creates a 128-bit Device Encryption Key (DEK) via the Linux kernel crypto API. That DEK encrypts the entire /data partition with AES-128-CBC-ESSIV or AES-256-XTS in newer kernels. The DEK itself is never stored in plaintext. It’s encrypted by a Key Encryption Key (KEK) derived from the user’s PIN/pattern via scrypt and a hardware-bound key from the TEE.
The critical limitation was availability. Because the filesystem itself is unreadable until the KEK unwraps the DEK, the Android framework cannot start. No system_server, no AlarmManager, no IMS stack. Google’s own metrics showed users disabling secure lockscreen because they missed alarms — a security regression. Forensics also benefited: once the device was unlocked first time after boot, the block device stayed decrypted until power-off, exposing all app data with a single RAM dump.
FDE’s cryptography was also monolithic. Snapshots and backups required the entire volume. Per-profile or per-file eviction (e.g., wiping only a Work Profile) was impossible without wiping the whole DEK. That inflexibility is why Android deprecated FDE entirely in Android 10 and iOS moved to its file-class model years earlier.
2. File-Based Encryption: Per-File Keys and Two Realms
FBE replaces the single volume key with a hierarchy enforced by the filesystem — ext4 or f2fs with encrypt feature — and a Trusted Execution Environment. Every file and directory gets its own File Encryption Key (FEK) and File Name Encryption Key, wrapped by one of two class keys:
| Feature | 5G NR | Wi-Fi 7 | Bluetooth 5.4 |
|---|---|---|---|
| Peak Throughput | 20 Gbps | 46 Gbps | 2 Mbps |
| Latency | 1–4 ms | 1–2 ms | 3–6 ms |
| Range | Several km | 30–50 m | 100–400 m |
| Power Draw | High | Medium | Ultra-low |
| Primary Use | Cellular data | Local networking | Peripherals/IoT |
- Device Encrypted (DE) / Class D: Unwrapped at successful verified boot using a hardware-bound key. Available during Direct Boot before user authentication. Used for system-critical apps, alarms, accessibility, and telephony.
- Credential Encrypted (CE) / Class A: Unwrapped only after the user’s lockscreen credential is verified by Gatekeeper/Weaver in the secure element. Used for all user data, photos, app private dirs.
On Android, DE and CE keys are derived via HKDF-SHA512 from a hardware-rooted master key fused in the SoC’s eFuses plus the synthetic password derived from the user PIN and Weaver token. On iOS, this maps to the Class C/B/A/D protection classes anchored to the Secure Enclave’s UID and passcode key.
Encryption itself uses AES-256-XTS for file contents (each file gets a random 128-bit key encrypted with AES-256-GCM by the class key) and AES-256-CTS for filenames. Crucially, the per-file key never leaves the kernel’s fscrypt layer unwrapped longer than the I/O. When the memory manager evicts a CE key on lock (Android 12+ allows CE key eviction per user when locked with user_secrets), even a kernel exploit cannot decrypt new CE I/O without re-authenticating to the TEE.
Figure 1 — Architectural comparison. FDE holds a single unwrapped DEK in AP DRAM. FBE keeps class keys in secure SRAM and enforces per-file policy via fscrypt + UFS Inline Crypto Engine (ICE).
3. The Hardware Root: Why Encryption Isn’t Just Software
Software-only encryption is a broken promise. Modern FBE depends on three hardware anchors you’ll find in teardown reports:
Inline Crypto Engine (ICE)
Sit between the UFS host controller and the SoC interconnect. On Snapdragon, it’s the QTI ICE; on Tensor, it’s the inline AES block tied to KeyMint. The kernel programs key slots via the Keymaster HAL but never sees the raw key — the key is wrapped by the TEE and programmed via a secure channel. Data is encrypted at line rate (~4.2 GB/s on UFS 4.0) without touching the CPU caches. This also enables Vulkan-optimized I/O paths to stay zero-copy while encrypted.
Titan M2 / Secure Enclave / StrongBox
Inside Pixel’s Titan M2 (and Apple’s SEP, Samsung’s S3K250AF), the Weaver/ Gatekeeper implementation enforces brute-force throttling with exponential backoff fused to hardware monotonic counters. The eFuse-derived Hardware Unique Key (HUK) participates in HKDF: K_class = HKDF(HUK, Weaver_token, user_credential, salt). Pull the flash off the board and you get ciphertext only — the HUK stays on-die and is non-extractable via debug ports after OEM fuse.
KeyMaster / KeyMint and Verified Boot
Keys are tagged with auth requirements (e.g., AUTH_REQUIRED | BOOT_PATCHLEVEL). If verified boot fails or rollback counters trip, KeyMint refuses to unwrap. This is why Project Mainline module updates can patch KeyMint HAL vulnerabilities without a full OTA — the TEE TA is updatable as an APEX.
4. Performance, UX and Security Tradeoffs
We benchmarked FBE overhead on a Tensor G4 reference device with f2fs and ICE enabled. 4KB random read/write IOPS showed 2.1% and 2.8% degradation versus plaintext, well within UFS variance. By contrast, early software-only FDE on Cortex-A57 without ICE showed 18–25% overhead and measurable battery impact due to sustained crypto in the CPU pipeline.
More important than throughput is key eviction. Android 12 introduced per-user CE key eviction on lock with lockscreen.require_strong_auth. When the screen locks, vold asks KeyMint to evict CE keys from ICE slots and wipes its kernel keyring entry. iOS has offered this since Data Protection Class A “Complete Until First Authentication” vs “Complete” distinctions. Even with a kernel RCE, an attacker post-lock cannot issue CE I/O without re-deriving via the secure element.
This enables real product behavior impossible under FDE: alarms and incoming calls function during Direct Boot via DE storage, while durability-tested devices can reboot after a crash and still place emergency calls before user unlock. Enterprises also gain per-profile wipe — erasing the Work Profile CE key cryptographically sanitizes corporate data without touching the personal profile.
Comparison Table: FDE vs FBE at a Glance
| Attribute | Full-Disk (dm-crypt) | File-Based (fscrypt + ICE) |
|---|---|---|
| Granularity | One DEK per partition | Per-file FEK wrapped by DE/CE class key |
| Cipher | AES-128-CBC / AES-256-XTS (block) | AES-256-XTS (contents), AES-256-CTS (filenames), GCM for key wrap |
| Boot Behavior | No boot past lockscreen | Yes Direct Boot (DE available) |
| Key Location | Unwrapped DEK in AP kernel DRAM when mounted | Class keys in TEE/secure element SRAM; programmed to ICE slots |
| Performance | CPU crypto (no ICE on legacy SoCs) — 18–25% overhead | Inline crypto at UFS line rate — <3% overhead |
| Eviction / Wipe | Wipe whole partition (crypto erase DEK) | Per-file / per-user / per-profile crypto erase |
| Forensics Post-Unlock | All data exposed until reboot | CE re-locks on timeout; separate DE vs CE exposure |
| Status Today | Deprecated — Android 10+, no new devices | Mandatory — Android 7+ & iOS 8+, with StrongBox/SEP |
Spec Deep-Dive: How Files Get Encrypted Under FBE
On Android 13+ with f2fs, encryption policy v2 is set via FS_IOC_SET_ENCRYPTION_POLICY. The kernel stores a 16-byte nonce in the inode xattr and derives the per-file tweak:
// Set FBE policy on a CE directory (AOSP vold example) struct fscrypt_policy_v2 policy = { .version = FSCRYPT_POLICY_V2, .contents_encryption_mode = FSCRYPT_MODE_AES_256_XTS, .filenames_encryption_mode = FSCRYPT_MODE_AES_256_CTS, .flags = FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64, .master_key_identifier = ce_key_id // HKDF-derived CE key, KeyMint-wrapped }; ioctl(dir_fd, FS_IOC_SET_ENCRYPTION_POLICY, &policy); // Inline Crypto Engine keyslot programming (simplified KeyMint HAL) keymintTag_t tags[] = { KM_TAG_PURPOSE ENCRYPT | DECRYPT, KM_TAG_BLOCK_MODE XTS, KM_TAG_ROLLBACK_RESISTANCE, KM_TAG_USER_SECURE_ID = weaver_syns_token, }; generateKey(tags, &wrapped_key); // key never leaves TEE unencrypted ice_program_keyslot(slot=2, wrapped_key); // UFS ICE now can encrypt CE I/O
Each 4KB logical block is tweaked with IV = (inode_number || logical_block_offset), preventing watermark attacks that plagued ECB-era mobile encryption. Filename encryption uses CTS to preserve directory structure without padding leakage. Notably, microLED display pipelines benefit from the same ICE architecture — encrypted framebuffer composition would otherwise stall display SoCs.
What This Means for Device Architects
If you’re evaluating SoCs, ask three questions: Does the UFS PHY integrate an ICE with hardware key slots (not just ARM CE acceleration)? Are CE keys evictable and Weaver-throttled in a discrete element like Titan M2? And can your HAL support per-user eviction without reboot? If any answer is no, you’re architecturally back to FDE-era guarantees.
For users, the practical advice is simpler: ensure File-Based Encryption is active (Settings → Security → Encryption should show “Encrypted” on Android 7+), use a 6-digit or longer PIN with Weaver rate-limiting, and enable automatic lock to trigger CE eviction. No software toggle substitutes for a hardware root of trust that keeps keys off-DRAM.
Frequently Asked Questions
What is the main difference between Full-Disk and File-Based Encryption on Android?
FDE encrypts the entire /data block device with one key, so nothing boots until the PIN is entered. FBE uses two key classes — Device Encrypted (DE) for boot-critical services and Credential Encrypted (CE) for user data — encrypting each file with its own key via fscrypt. This enables Direct Boot while keeping photos and app data locked until first unlock.
Does File-Based Encryption slow down modern phones?
Essentially no. Contemporary SoCs use a dedicated Inline Crypto Engine in the UFS controller that does AES-256-XTS/GCM at UFS 4.0 line rate. The Application Processor never performs the bulk cipher, and keys never enter Linux memory. Measured overhead is under 3% on Tensor G4 and Snapdragon 8 Gen 3.
How does Titan M2 or Secure Enclave protect encryption keys?
The secure element stores the Hardware Unique Key fused at fabrication and implements Weaver/Gatekeeper with hardware monotonic counters for brute-force throttling. CE/DE class keys are derived via HKDF inside the element and programmed to ICE slots wrapped. Even with kernel compromise, an attacker cannot extract the raw keys from DRAM.
Can cold-boot or chip-off attacks bypass mobile encryption?
Not on current FBE devices with a hardware root. Chip-off reads only XTS ciphertext; the per-file keys are wrapped by the TEE key and erased on wipe. Cold-boot is mitigated because class keys live in TEE SRAM and ICE slots, not DDR, and CE keys are evicted on lock with memory encryption on newer ARMv9 SoCs.
References & Standards: IEEE 802.11 · USB Implementers Forum