From 04d2ff7689893da69c8158f66dc6913266bf7c1b Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Sun, 26 Jul 2020 21:09:04 +0200 Subject: [PATCH] tcrypt: Support activation of devices with a larger sector. TrueCrypt/VeraCrypt always use 512-bytes sector for encryption, but for devices with a larger native sector it stores this value in header. This patch allows activating of such devices, basically ignoring the mentioned sector size in header (it only must be multiple of 512-bytes sector). Fixes: #580. --- lib/tcrypt/tcrypt.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/tcrypt/tcrypt.c b/lib/tcrypt/tcrypt.c index 859f0ed7..037244ee 100644 --- a/lib/tcrypt/tcrypt.c +++ b/lib/tcrypt/tcrypt.c @@ -749,7 +749,7 @@ int TCRYPT_activate(struct crypt_device *cd, return -ENOTSUP; } - if (hdr->d.sector_size && hdr->d.sector_size != SECTOR_SIZE) { + if (hdr->d.sector_size % SECTOR_SIZE) { log_err(cd, _("Activation is not supported for %d sector size."), hdr->d.sector_size); return -ENOTSUP; @@ -769,15 +769,12 @@ int TCRYPT_activate(struct crypt_device *cd, if (!algs) return -EINVAL; - if (hdr->d.sector_size == 0) - return -EINVAL; - if (params->flags & CRYPT_TCRYPT_SYSTEM_HEADER) dmd.size = 0; else if (params->flags & CRYPT_TCRYPT_HIDDEN_HEADER) - dmd.size = hdr->d.hidden_volume_size / hdr->d.sector_size; + dmd.size = hdr->d.hidden_volume_size / SECTOR_SIZE; else - dmd.size = hdr->d.volume_size / hdr->d.sector_size; + dmd.size = hdr->d.volume_size / SECTOR_SIZE; if (dmd.flags & CRYPT_ACTIVATE_SHARED) device_check = DEV_OK; @@ -1042,11 +1039,11 @@ uint64_t TCRYPT_get_data_offset(struct crypt_device *cd, if (params->flags & CRYPT_TCRYPT_HIDDEN_HEADER) { if (hdr->d.version > 3) - return (hdr->d.mk_offset / hdr->d.sector_size); + return (hdr->d.mk_offset / SECTOR_SIZE); if (device_size(crypt_metadata_device(cd), &size) < 0) return 0; return (size - hdr->d.hidden_volume_size + - (TCRYPT_HDR_HIDDEN_OFFSET_OLD)) / hdr->d.sector_size; + (TCRYPT_HDR_HIDDEN_OFFSET_OLD)) / SECTOR_SIZE; } goto hdr_offset; } @@ -1055,11 +1052,11 @@ uint64_t TCRYPT_get_data_offset(struct crypt_device *cd, if (device_size(crypt_metadata_device(cd), &size) < 0) return 0; return (size - hdr->d.hidden_volume_size + - (TCRYPT_HDR_HIDDEN_OFFSET_OLD)) / hdr->d.sector_size; + (TCRYPT_HDR_HIDDEN_OFFSET_OLD)) / SECTOR_SIZE; } hdr_offset: - return hdr->d.mk_offset / hdr->d.sector_size; + return hdr->d.mk_offset / SECTOR_SIZE; } uint64_t TCRYPT_get_iv_offset(struct crypt_device *cd, @@ -1073,7 +1070,7 @@ uint64_t TCRYPT_get_iv_offset(struct crypt_device *cd, else if (params->mode && !strncmp(params->mode, "lrw", 3)) iv_offset = 0; else - iv_offset = hdr->d.mk_offset / hdr->d.sector_size; + iv_offset = hdr->d.mk_offset / SECTOR_SIZE; if (params->flags & CRYPT_TCRYPT_SYSTEM_HEADER) iv_offset += crypt_dev_partition_offset(device_path(crypt_metadata_device(cd)));