summaryrefslogtreecommitdiff
path: root/cryptfs.cpp
AgeCommit message (Collapse)Author
2020-11-03Refactor EncryptInplace.cppEric Biggers
Refactor EncryptInplace.cpp to simplify and improve it a lot. This is everything that didn't fit into prior commits, including: - Share a lot more code between ext4, f2fs, and full encryption. - Improve the log messages. Most importantly, don't spam the log with huge numbers of messages, and don't log errors in expected cases. Note: generate_f2fs_info() is still too noisy, but that's part of "system/extras", not vold, so this change doesn't change that. - When possible, do 32K reads/writes for f2fs and for full encryption, not just for ext4. This might improve performance. - Take advantage of C++ functionality. - Be more careful about edge cases. E.g. if the calculation of the number of blocks to encrypt was wrong, don't set vold.encrypt_progress to > 99 until we're actually done. The net change is over 200 lines removed. Before-after comparison of log when enabling metadata encryption: ext4 before: I vold : Beginning inplace encryption, nr_sec: 16777216 D vold : cryptfs_enable_inplace(/dev/block/dm-8, /dev/block/by-name/userdata, 16777216, 0) D vold : Opening/dev/block/by-name/userdata D vold : Opening/dev/block/dm-8 I vold : Encrypting ext4 filesystem in place... [omitted 6387 log messages] I vold : Encrypted to sector 822084608 D vold : cryptfs_enable_inplace_ext4 success I vold : Inplace encryption complete ext4 after: D vold : encrypt_inplace(/dev/block/dm-8, /dev/block/by-name/userdata, 16777216, false) D vold : ext4 filesystem has 64 block groups I vold : Encrypting ext4 filesystem on /dev/block/by-name/userdata in-place via /dev/block/dm-8 I vold : 50327 blocks (206 MB) of 2097152 blocks are in-use D vold : Encrypted 10000 of 50327 blocks D vold : Encrypted 20000 of 50327 blocks D vold : Encrypted 30000 of 50327 blocks D vold : Encrypted 40000 of 50327 blocks D vold : Encrypted 50000 of 50327 blocks D vold : Encrypted 50327 of 50327 blocks I vold : Successfully encrypted ext4 filesystem on /dev/block/by-name/userdata f2fs before: I vold : Beginning inplace encryption, nr_sec: 16777216 D vold : cryptfs_enable_inplace(/dev/block/dm-8, /dev/block/by-name/userdata, 16777216, 0) D vold : Opening/dev/block/by-name/userdata D vold : Opening/dev/block/dm-8 E vold : Reading ext4 extent caused an exception D vold : cryptfs_enable_inplace_ext4()=-1 [omitted logspam from f2fs_sparseblock] I vold : Encrypting from block 0 I vold : Encrypted to block 15872 I vold : Encrypting from block 16384 I vold : Encrypted to block 16385 I vold : Encrypting from block 17408 I vold : Encrypted to block 17412 D vold : cryptfs_enable_inplace_f2fs success I vold : Inplace encryption complete f2fs after: D vold : encrypt_inplace(/dev/block/dm-8, /dev/block/by-name/userdata, 16777216, false) [omitted logspam from f2fs_sparseblock] I vold : Encrypting f2fs filesystem on /dev/block/by-name/userdata in-place via /dev/block/dm-8 I vold : 15880 blocks (65 MB) of 2097152 blocks are in-use D vold : Encrypted 10000 of 15880 blocks D vold : Encrypted 15880 of 15880 blocks I vold : Successfully encrypted f2fs filesystem on /dev/block/by-name/userdata Test: Booted Cuttlefish with metadata encryption enabled and with the userdata filesystem using (1) ext4, (2) f2fs, and (3) f2fs but with EncryptInplace.cpp patched to not recognize the filesystem and fall back to the "full" encryption case. Checked that the log messages were as expected and that /data was mounted. I've had no luck testing FDE yet; it doesn't work even without these changes. Suggestions appreciated... Change-Id: I08fc8465f7962abd698904b5466f3ed080d53953
2020-11-03Remove special handling for missing crypto_blkdevEric Biggers
This logic is no longer necessary, since the code that creates the crypto_blkdev (create_crypto_blk_dev() in MetadataCrypt.cpp or in cryptfs.cpp) now waits for the block device to appear before continuing. It's also worth noting that the retry loop was only present for ext4, not for f2fs, yet most Android devices are using f2fs these days. Test: see I08fc8465f7962abd698904b5466f3ed080d53953 Change-Id: I173ca6cc187a810e008990dfa22aede58632db25
2020-11-03Check return value of create_crypto_blk_dev()Eric Biggers
cryptfs_enable_internal() forgot to check the return value of create_crypto_blk_dev(), so it was continuing to cryptfs_enable_inplace() when creating the dm-crypt device failed, which doesn't make sense. Test: see I08fc8465f7962abd698904b5466f3ed080d53953 Change-Id: If9f20069d0f084150aa887a350f7c0c31a6d80f2
2020-11-03Remove unused support for partial encryptionEric Biggers
Commit 87999173dd79 ("Don't corrupt ssd when encrypting and power fails") added a lot of code to handle pausing in-place conversion from unencrypted => FDE when the battery was low, and resuming it later. It was eventually decided that this wasn't needed, and commit 7e17e2d22678 ("Don't worry about battery levels when encrypting") removed the checks for low battery. This made the partial encryption code unused. So remove it. Note that this was cluttering up the metadata encryption code too, since EncryptInplace.cpp is now shared by both FDE and metadata encryption. Bug: 16868177 Test: see I08fc8465f7962abd698904b5466f3ed080d53953 Change-Id: Ibd2eb08a2aa15938097abcb8a67b5a813c4d76c7
2020-06-18Merge "Don't call block checkpoint functions above dm-default-key" am: ↵Paul Lawrence
1bb7e8a928 am: 53f1d07339 Original change: https://android-review.googlesource.com/c/platform/system/vold/+/1330879 Change-Id: I54fdd3098c52dcb53cee0956f4dd1e43e09f5800
2020-06-18Merge "Don't call block checkpoint functions above dm-default-key"Paul Lawrence
2020-06-12Don't call block checkpoint functions above dm-default-keyPaul Lawrence
Bug: 156225476 Test: Build for f2fs and ext4 device, make sure checkpoints roll back and commit Change-Id: Ic15fadc67d306463dd0b554f679306d8f9081451
2020-03-04Merge "umount /data/user/0 before umount /data" am: 3a0fd35b62 am: 20f9f29d53Automerger Merge Worker
Change-Id: I0cef7deb44c9b55d7f9adbc7022bb484086449c9
2020-03-04umount /data/user/0 before umount /dataHyangseok Chae
FDE device has shut down and restart the framework. But restart is not triggered due to umount fail. umount /data fail with "device is busy" It is because bind mount /data/data to /data/user/0 We need umount /data/user/0 before umount /data Bug: 148004718 Test: Flash GSI and check boot with FDE and FBE device. Change-Id: I919f9e31a9d2d745b297a7ab99b399aa9b293b39
2020-02-19Merge changes from topics "metadata_wrapped_key_aosp", "volume_metadata" am: ↵Automerger Merge Worker
36fd1ebfae am: 6891eb7e2d am: c14f46d114 Change-Id: I89f51bfaeb61c235aeccbe8a5a5a447ab14c46cb
2020-02-18Refactor: make makeGen localPaul Crowley
No need for KeyUtil to know how to make a KeyGeneration, it's cleaner if each module handles it separately. Also, create a CryptoOptions structure to track metadata encryption options, and simplify legacy cipher/option handling. Test: Treehugger Bug: 147814592 Change-Id: I740063882914097329ff72348d0c0855c26c7aab
2020-02-14Refactor key generation to handle both normal and metadata encryption.Paul Crowley
Bug: 147733587 Test: Treehugger Change-Id: Iee176037dec2621c84da325c2627f988fcebbc8d Merged-In: Iee176037dec2621c84da325c2627f988fcebbc8d
2020-02-14Refactor key generation to handle both normal and metadata encryption.Paul Crowley
Bug: 147733587 Test: Treehugger Change-Id: Iee176037dec2621c84da325c2627f988fcebbc8d
2020-02-14Merge changes Ic3993c1f,I06645bb4 am: ac34e9aa3e am: b62afed286 am: 54d05de798Paul Crowley
Change-Id: Ib122e011bb7be162b76b94a31885863d2aff6d1e
2020-02-14Generalize CryptoType infrastructurePaul Crowley
More consistency between MetadataCrypt and cryptfs, and steps towards supporting Adiantum properly in MetadataCrypt. Test: create private volume on Cuttlefish Bug: 147814592 Change-Id: Ic3993c1fde11b4f5a9e6cc8ee588a7d92241c6ab
2020-02-13Refactor CryptoType to use better names, and size_t not uint32_tPaul Crowley
Test: treehugger Bug: 147814592 Change-Id: I06645bb4941794797beebf05b817c4ac52e09cd7
2020-02-13Merge "Use DM layer directly to manage private DM volumes" am: dd12ea5bd2 ↵Automerger Merge Worker
am: 47aff8772d am: e3609aa837 Change-Id: I663a0ad6990acfc2cd936b52e39b346c2e48b6ed
2020-02-13Merge "Retry deleting dm devices."Martijn Coenen
2020-02-13Retry deleting dm devices.Martijn Coenen
For some reason this can be racy; until we understand the root cause, retry to unblock presubmit. Bug: 149396179 Test: atest AdoptableHostTest no longer hangs Change-Id: I3fb4f1d966172bac2f6c52d41c4564f905765212
2020-02-12Use DM layer directly to manage private DM volumesPaul Crowley
Abolish cryptfs_revert_ext_volume, handle in caller. This allows us to use DeleteDeviceIfExists, avoiding a spurious error message. Test: create private volume on Cuttlefish, eject, check logs Bug: 147814592 Change-Id: I836d8bd11b29e32da0863aaa75144543bb9cab9c
2020-02-12Pass volume key as a KeyBufferPaul Crowley
Not for security, but for consistency with the way we handle other keys, and to move the length check to where it belongs. Test: create private volume on Cuttlefish Bug: 147814592 Change-Id: I10fc4896183d050ce25ff174faf78f525cf62930
2020-02-07Use std::string to return crypto device, not char *Paul Crowley
Bug: 147814592 Test: can create private volume on Cuttlefish Change-Id: Ic2bca81c0f0319e1b988e9204a2f4e91af57d157
2020-02-07Refactor: make cryptfs.h smallerPaul Crowley
Move most of it into cryptfs.cpp, and include cryptfs.h in fewer files. Bug: 147814592 Test: Treehugger Change-Id: Ia3592d73e7abc1f07a60538e0978a3033bdea7de
2019-06-26vold: use RAII wake locksTri Vo
Prevents wake lock leaks, e.g. b/133175847 Bug: 133175847 Test: boot blueline Change-Id: Icda4c81e00a61adec6a12c61c329867fef284dc5
2019-06-21Merged-In Revert "vold: use RAII wake locks"Ruslan Tkhakokhov
This reverts commit 242130f3f8180baef35649f350ca737d0b0c6ae3. Reason for revert: breaks the build Change-Id: Ide809a114b2a04538f3ba4ed8af934bf326e54f3
2019-06-18vold: use RAII wake locksTri Vo
Prevents wake lock leaks, e.g. b/133175847 Bug: 133175847 Test: boot blueline Change-Id: I62fd1c6c3abbfd35aebe11343abd717a7cf4eef7
2019-05-13Replace manual dm ioctls with libdm.David Anderson
This mostly 1:1 replaces manual ioctls to device-mapper with calls to libdm. There were two exceptions: (1) There is a very old table-load-retry loop to workaround issues with umount (b/7220345). This loop has been preserved, however, it now includes DM_DEV_CREATE as well as DM_TABLE_LOAD. (2) There was some ancient code to set DM_DEV_GEOMETRY for obb dm-devices. This never did anything since geometry must be set after loading a table. When setting it before (as vold was doing), the subsequent DM_TABLE_LOAD will clear it. Bug: 132206403 Test: FBE device boots FBE device w/ metadata encryption boots FDE device boots atest StorageManagerIntegrationTest Change-Id: Ib6db6b47329f093ac7084edaf604eddace8b9ac6
2019-04-26Stop using trigger_reset_main.Martijn Coenen
This trigger was used on FDE devices to bring down the minimal framework, and worked by shutting down the 'main' service class. With APEX being introduced, we want to restart all services that were started after the tmpfs /data was mounted, as those are the services that haven't been able to use updated APEXes in the (real) /data. In order to do this, we need to reset more classes; that in turn made the 'shutdown_main' trigger pretty much similar to the previously existing 'trigger_shutdown_framework' trigger; so instead of keeping two duplicate triggers, use only the 'trigger_shutdown_framework' one. Bug: 118485723 Test: Taimen configured as FDE boots, Taimen configured as FBE boots Change-Id: I0d80ef2528bd70870b063a2c580cd00a03de9961
2019-04-19fix data encryption fail when ENCRYPTION_FLAG_NO_UI is setxzj
cause: data partition not being umount before real encryption Change-Id: If5cc084c182d96c6205359b76ee0c474f6a77a2e
2019-01-31Move over to the C++ Fstab classTom Cherry
Test: build and boot Change-Id: Id3850c9c133f6644073a2439368501253a2a94a9
2019-01-30Remove secontext.h, secontext.cpp, hash.hLongPing Wei
cryptfs.cpp and MetadataCrypt.cpp can use android::vold::sFsckContext directly. hash.h is unuseful. Test: make Change-Id: I7acdac97d6ed1c9b2a5dc367fcea8aa2942192e8
2019-01-25cryptfs: improve logging of dm-crypt device creationEric Biggers
Log the main configuration of the dm-crypt device -- the name, the cipher, the keysize, the real device, and the length -- in addition to the extra parameters which we were already logging. (We can't simply log the actual string passed to the kernel, of course, because that includes the key. So we choose the fields individually.) Test: booted device configured to use FDE and checked the log message Change-Id: Ia95de807c4fad68d93b7e7e73508a01e5139dc76
2019-01-25cryptfs: round down dm-crypt device size to crypto sector boundaryEric Biggers
This is needed to make adoptable storage volumes work with a 4K crypto sector size when the block device size is not a multiple of 4K. It is fine to do this because the filesystem ends on a 4K boundary anyway and doesn't use any partial block at the end. Bug: 123375298 Test: booted device configured to use FDE with sector size 4k, ran 'sm set-virtual-disk true' and formatted the virtual SD card as adoptable storage. Then did the same but with a temporary patch that changed kSizeVirtualDisk to be misaligned Change-Id: I95ee6d7dcaaa8989c674aea9988c09116e830b0c
2019-01-18cryptfs: check for errors in create_encrypted_random_key()Eric Biggers
When generating the key and salt we weren't checking for an error opening or reading from /dev/urandom. Switch to the helper function ReadRandomBytes() and start checking for errors. Test: Booted device with FDE. As a extra sanity check I also temporarily added log messages that dump the key and salt, and I verified they still appear random. Change-Id: I01ccee4f1f9910bf9508c8f02a918157393b0e68
2019-01-03cryptfs: Add error messages when remove dm-crypt device is failedYue Hu
We do not know what happened if remove dm-crypt device is failed, so the error status added is useful to debug failed ioctl. Change-Id: I49be91b9087ef2a213a706dd6b2a07eb6dafe6e6 Signed-off-by: Yue Hu <zbestahu@gmail.com>
2018-12-11cryptfs: Allow setting dm-crypt sector sizeGreg Kaiser
We add the property ro.crypto.fde_sector_size to allow devices to pass the "sector_size:<size>" argument to dm-crypt in the kernel. We also pass "iv_large_sectors" when setting the sector size. Using 4096-byte sectors rather than the default of 512 improves dm-crypt performance, especially when the Adiantum encryption mode is used. Bug: 112010205 Test: Run on a device Change-Id: I144ec7088a0aad3430369dc7158370d7ff3ef5d2
2018-12-11cryptfs: Add Adiantum supportGreg Kaiser
Adiantum is a crypto method Android is supporting for devices which don't have AES CPU instructions. See the paper "Adiantum: length-preserving encryption for entry-level processors" (https://eprint.iacr.org/2018/720.pdf) for more details. We add Adiantum to our list of supported crypto types. Bug: 112010205 Test: Tested on a device Change-Id: Ic190a9b90fc8bc077fdc7d60c9d5ae8d8f555025
2018-12-06Fix signedness mismatch and integer underflowRubin Xu
persist_get_max_entries() is supposed to return an unsigned integer as the maximum number of entries but it also wrongly returns "-1" as an error condition. Also fix an issue where an unsigned subtraction in this routine could lead to integer underflow. Bug: 112731440 Test: manual Change-Id: I9672e39bef2c12156dda7806a08c52044962c178
2018-11-05Wait for dm device to be ready before formatPaul Crowley
It can sometimes take a moment for the dm-device to appear after creation, causing operations on it such as formatting to fail. Ensure the device exists before create_crypto_blk_dev returns. Test: adb sm set-virtual-disk true and format as adoptable. Bug: 117586466 Change-Id: Id8f571b551f50fc759e78d917e4ac3080e926722 Merged-In: Id8f571b551f50fc759e78d917e4ac3080e926722
2018-10-25vold: rename from "ext4 encryption" to fscryptEric Biggers
We support file-based encryption on both ext4 and f2fs now, and the kernel API is the same. So rename things appropriately in vold: e4crypt => fscrypt ext4enc => fscrypt Ext4Crypt => FsCrypt EXT4_* => FS_* ext4_encryption_key => fscrypt_key Additionally, the common functions shared by 'vold' and 'init' are now in libfscrypt rather than ext4_utils. So update vold to link to libfscrypt and include the renamed headers. Note: there's a chance of 'fscrypt' being confused with the dm-crypt based encryption code in vold which is called 'cryptfs'. However, fscrypt is the name used in the kernel for ext4/f2fs/ubifs encryption, and it's preferable to use the same name in userspace. Test: built, booted device with f2fs encryption Change-Id: I2a46a49f30d9c0b73d6f6fe09e4a4904d4138ff6
2018-09-25Merge "Add support for checkpointing"Treehugger Robot
2018-09-24Add GetBlockDevSize, GetBlockDevSectors helpersOleksiy Avramchenko
Helpers to get a block device size in bytes or 512 byte sectors, using BLKGETSIZE64 and returning value of uint64_t type. This also removes get_blkdev_size(). Test: build, manual, mount exFAT volume Bug: 80202067 Change-Id: Ib07e8ac6ef7ff49de0ed570d1fa202e8b558b80c
2018-09-21Add support for checkpointingDaniel Rosenberg
Checkpointing uses a combination of files on the meta partition and the checkpoint= fs_mgr flag. Checkpointed partitions will revert to their starting state on reboot unless checkpoint commit is called. Test: Run vdc commands, check file on metadata Merged-In: Icba16578608a6cbf922472e9d4ae5b8cf5f016c6 Change-Id: Icba16578608a6cbf922472e9d4ae5b8cf5f016c6
2018-09-18clang-format many files.Paul Crowley
Test: Format-only changes; treehugger suffices. Change-Id: I23cde3f0bbcac13bef555d13514e922c79d5ad48
2018-08-07cryptfs: Remove Speck supportGreg Kaiser
Remove the Speck encryption support. It was eventually decided not to allow Speck in Android P, so this code is no longer needed and wasn't used outside of testing. Note we don't just "git revert" the original commit (38723f23ff521e95ed295f500e6529c52a994c9f) because we want to retain the infrastructure for allowing new types of crypto algorithms in the future. Bug: 112009351 Test: Attempted to setup a device with ro.crypto.fde_algorithm set to Speck, and Speck was rejected and the system defaulted to AES. Change-Id: I69a8b4e8632f8d30b5b54783cb986ab42d4397d9
2018-06-05resolve merge conflicts of 7bf98aa8a0c122aec9f3262fe1a24238d57ae8d0 to ↵Luis Hector Chavez
pi-dev-plus-aosp BUG: None Test: I solemnly swear I tested this conflict resolution. Change-Id: I08252155f04e8b414f2149d8b29e5e2fff6bcc82
2018-06-04vold: Avoid SIGSEGVs when fstab lacks /dataLuis Hector Chavez
This change adds null-checks for all the places where cryptfs tries to access the /data entry in fstab, to avoid crashes. Bug: 80493321 Test: No crashes in Android-in-Chrome OS (which lacks /data in fstab) Change-Id: Id6cdfe01cdd336cebf8afb9bdd07135811115182 Merged-In: Id6cdfe01cdd336cebf8afb9bdd07135811115182
2018-05-02Replace library headers with angle quotationsLogan Chien
This commit replaces the double quotations for library headers with angle quotations. Test: cd system/vold && mma Change-Id: I3c14cfcf80f29173669409df548af84c1b39b96d Merged-In: I3c14cfcf80f29173669409df548af84c1b39b96d
2018-05-02Reorder the include directives in cryptfs.cppLogan Chien
This commit reorders the include directives in cryptfs.cpp so that upcoming <cutils/log.h> change can be obvious. Test: lunch aosp_walleye-userdebug && cd system/vold && mma Change-Id: I9d2ea66c15b7b68014a67ba7c1420075953459ba Merged-In: I9d2ea66c15b7b68014a67ba7c1420075953459ba
2018-05-02Deprecate <cutils/log.h> and <utils/Log.h>Logan Chien
This commit replaces <cutils/log.h> and <utils/Log.h> with <log/log.h>. Background: <cutils/log.h> has been moved to <log/log.h> for a while. Both <cutils/log.h> and <utils/Log.h> simply includes <log/log.h> for backward compatibility. This commit is a part of the effort to remove <cutils/log.h> and <utils/Log.h> from the source tree eventually. Bug: 78370064 Test: lunch aosp_walleye-userdebug && cd system/vold && mma Change-Id: I1f9b7b132f9c35469e97556a30b521cc47e829d7