Android app to open encrypted USB mass-storage devices for read/write without root. Supports VeraCrypt, LUKS1, LUKS2 and BitLocker encrypted volumes with FAT32, exFAT, NTFS and ext4 filesystems, and reads Mac APFS drives, plain or encrypted. It can also format a FAT32 or exFAT partition, or encrypt one into a new VeraCrypt volume.
The app cannot perform a kernel mount on non-rooted Android. Instead it:
- Requests USB Host permission for a mass-storage device.
- Reads raw sectors through a userspace USB Mass Storage adapter (libaums).
- Probes MBR/GPT partitions and detects the encryption type (VeraCrypt, LUKS1, LUKS2, BitLocker or encrypted APFS) on each.
- Unlocks the volume header and exposes a decrypted block-device wrapper:
- VeraCrypt: AES, Serpent or Twofish, and the cascades AES-Twofish, AES-Twofish-Serpent, Serpent-AES, Serpent-Twofish-AES and Twofish-Serpent; SHA-512 or Argon2id header KDF
- LUKS1: PBKDF2-based KDF, AES-XTS bulk decryption
- LUKS2: Argon2id-based KDF, AES-XTS bulk decryption
- BitLocker: password or recovery key; XTS-AES and AES-CBC, with or without the Elephant diffuser
- APFS (Encrypted): the password goes to the filesystem reader, which unwraps the volume key itself
- Feeds the decrypted block device into a userspace filesystem reader (FAT32 via libaums, exFAT via a vendored native
libexfat, ext4 via a pure-Kotlin driver, NTFS via a vendoredlibntfs-3g, and APFS, read-only, via a vendoredlibfsapfs). - Surfaces files through the app UI and a
DocumentsProvider, so other apps (Files, Gallery, etc.) can browse the unlocked volume. - Formats and encrypts from a mounted drive's More actions menu, after the user types ERASE:
- Format writes an empty FAT32 or exFAT of the same size, cluster size and label; a volume inside an encrypted container stays in it, with the same password
- Encrypt erases the partition and creates a new VeraCrypt volume — any of the ciphers and cascades above, SHA-512 or Argon2id, optional PIM — holding a new FAT32 or exFAT
- both overwrite every sector by default; Quick writes only the filesystem structures, and the old data stays on the drive until overwritten
- APFS — write support. APFS is read-only today, plain or encrypted.
- Format and encrypt — NTFS and ext4 formatting, and LUKS2 as an encryption choice. Format and Encrypt cover FAT32 and exFAT, with VeraCrypt, today.
- Unplugging an exFAT drive while files are being written to it can damage
it. libexfat marks newly used space in its allocation bitmap only when a file
is closed or the drive is unmounted, but writes the directory entries and
cluster links that point at that space straight away. A drive pulled in
between can have a file or folder pointing at space still marked free, which a
later write can then reuse. Unmount before unplugging. If a drive does drop
mid-write, check it on a computer (
fsck.exfat) before writing to it again. FAT32 and ext4 are not affected in this way. A fix is planned.
If you encounter any issues, have feature requests, or just want to share your thoughts, you can open an issue on our GitHub Issues page.
If you prefer to share your feedback privately or without a GitHub account, please use our anonymous feedback form.
./gradlew assembleDebugA signed release build additionally requires a keystore.properties file at the repo root
(never commit this — see .gitignore) with storeFile, storePassword, keyAlias, and
keyPassword entries; without it, assembleRelease produces an unsigned APK.
./gradlew assembleReleaseJVM unit tests (e.g. FilesystemDetector) run without a device:
./gradlew testDebugUnitTestThe full device end-to-end suite (VeraCrypt/LUKS/BitLocker unlock + mount against generated test
volumes, run on a QEMU Android emulator) is documented in scripts/run_e2e_tests.sh and is not part
of CI, since it needs real USB-device emulation that isn't available on hosted runners. It covers
every filesystem in every container the app supports (scripts/make_e2e_matrix.py) plus the
older single-feature cases — 43 in all. scripts/run_e2e_parallel.sh runs them across three
emulators (about 30 minutes instead of 85) and merges one report; fixtures are built without root
(see docs/TEST_DATA.md §6a).
Generating test data — including how to add a fixture for a new cipher, hash, filesystem or container format, the per-case file contract, and the traps in the three generators — is documented in docs/TEST_DATA.md.
For measuring a drive's read/write performance and correctness, see docs/RUNNING_BENCHMARKS.md and the reference figures in docs/BENCHMARK_RESULTS.md.
.github/workflows/ci.ymlruns unit tests and a debug build on every push/PR tomain..github/workflows/release.ymlbuilds and signs a release APK and publishes a GitHub Release whenever a tag matchingv*.*.*is pushed. See that file for the repository secrets it requires.
GPL-3.0-or-later — see LICENSE. The app and its source, and the binary that
statically links every component below, are distributed under it. Each component's own
licence permits this: libexfat and libntfs-3g are GPL-2.0-or-later, libfsapfs and its
libyal libraries LGPL-3.0-or-later, the Apache-2.0 components (libaums, argon2kt,
mbedTLS) are compatible with GPL-3.0, and LibTomCrypt's Twofish and the Argon2 reference
implementation are public domain or dual-licensed with a permissive option.
| Component | License | Notes |
|---|---|---|
| libaums | Apache-2.0 | USB mass-storage + FAT32 filesystem driver |
| mbedTLS | Apache-2.0 OR GPL-2.0-or-later | AES, PBKDF2, SHA-512 primitives |
libexfat (app/src/main/cpp/exfat/) |
GPL-2.0-or-later | exFAT filesystem driver |
libntfs-3g (app/src/main/cpp/ntfs-3g/) |
GPL-2.0-or-later | NTFS filesystem driver; pinned in VENDOR_FIXES.md |
libfsapfs and 16 libyal libraries (app/src/main/cpp/libfsapfs/) |
LGPL-3.0-or-later | APFS reader, plain and natively encrypted; pinned in VENDOR_FIXES.md. LGPL-3.0 code cannot be combined into a GPL-2.0-only binary, which is why the project moved to GPL-3.0-or-later |
Serpent reference implementation (app/src/main/cpp/serpent/) |
Public domain | See PROVENANCE.md for the exact source and the one portability fix applied |
argon2kt (com.lambdapioneer.argon2kt:argon2kt:1.6.0) |
Apache-2.0 | Argon2id KDF for LUKS2 key derivation; ships native .so in the APK |
LibTomCrypt Twofish (app/src/main/cpp/libtomcrypt/) |
Public domain OR WTFPL | Twofish for VeraCrypt volumes and cascades; pinned in VENDOR_FIXES.md |
Argon2 reference implementation (app/src/main/cpp/argon2/) |
CC0-1.0 OR Apache-2.0 | Argon2id KDF for VeraCrypt headers; pinned in VENDOR_FIXES.md |
- Help with refinement and translations of the text shown in the app.
- Report issues via the feedback form or GitHub issues to help make the app stable.
- Donate to support the app via Ko-fi: