From 13c6f32d77b3eb15e3ac2317ab3809f522081a48 Mon Sep 17 00:00:00 2001 From: Greg Kaiser Date: Tue, 11 Dec 2018 12:40:51 -0800 Subject: [PATCH] cryptfs: Allow setting dm-crypt sector size We add the property ro.crypto.fde_sector_size to allow devices to pass the "sector_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 Merged-In: I144ec7088a0aad3430369dc7158370d7ff3ef5d2 (cherry picked from commit 88738e8b6f59e307a2120d352843759025588539) --- cryptfs.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cryptfs.cpp b/cryptfs.cpp index 6ded404..e206d9b 100644 --- a/cryptfs.cpp +++ b/cryptfs.cpp @@ -62,11 +62,14 @@ #include "Process.h" #include "Keymaster.h" #include "android-base/properties.h" +#include "android-base/stringprintf.h" #include extern "C" { #include } +using android::base::StringPrintf; + #define UNUSED __attribute__((unused)) #define DM_CRYPT_BUF_SIZE 4096 @@ -1076,6 +1079,21 @@ static std::string extra_params_as_string(const std::vector& extra_ return extra_params; } +// Only adds parameters if the property is set. +static void add_sector_size_param(std::vector* extra_params_vec) { + constexpr char DM_CRYPT_SECTOR_SIZE[] = "ro.crypto.fde_sector_size"; + char sector_size[PROPERTY_VALUE_MAX]; + + if (property_get(DM_CRYPT_SECTOR_SIZE, sector_size, "") > 0) { + std::string param = StringPrintf("sector_size:%s", sector_size); + extra_params_vec->push_back(std::move(param)); + + // With this option, IVs will match the sector numbering, instead + // of being hard-coded to being based on 512-byte sectors. + extra_params_vec->emplace_back("iv_large_sectors"); + } +} + static int create_crypto_blk_dev(struct crypt_mnt_ftr* crypt_ftr, const unsigned char* master_key, const char* real_blk_name, char* crypto_blk_name, const char* name, uint32_t flags) { @@ -1121,6 +1139,7 @@ static int create_crypto_blk_dev(struct crypt_mnt_ftr* crypt_ftr, const unsigned if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE) { extra_params_vec.emplace_back("allow_encrypt_override"); } + add_sector_size_param(&extra_params_vec); load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name, fd, extra_params_as_string(extra_params_vec).c_str()); if (load_count < 0) {