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) {