Refactor internal reencrypt_hotzone_protect_final.

Avoid passing whole reencryption context when not
needed.
This commit is contained in:
Ondrej Kozina
2022-06-06 13:47:58 +02:00
parent b43ca18c64
commit 97b88d878e

View File

@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
#include <assert.h>
#include "luks2_internal.h" #include "luks2_internal.h"
#include "utils_device_locking.h" #include "utils_device_locking.h"
@@ -2495,35 +2497,39 @@ out:
} }
static int reencrypt_hotzone_protect_final(struct crypt_device *cd, static int reencrypt_hotzone_protect_final(struct crypt_device *cd,
struct luks2_hdr *hdr, struct luks2_reencrypt *rh, struct luks2_hdr *hdr, int reencrypt_keyslot,
const struct reenc_protection *rp,
const void *buffer, size_t buffer_len) const void *buffer, size_t buffer_len)
{ {
const void *pbuffer; const void *pbuffer;
size_t data_offset, len; size_t data_offset, len;
int r; int r;
if (rh->rp.type == REENC_PROTECTION_NONE) assert(hdr);
assert(rp);
if (rp->type == REENC_PROTECTION_NONE)
return 0; return 0;
if (rh->rp.type == REENC_PROTECTION_CHECKSUM) { if (rp->type == REENC_PROTECTION_CHECKSUM) {
log_dbg(cd, "Checksums hotzone resilience."); log_dbg(cd, "Checksums hotzone resilience.");
for (data_offset = 0, len = 0; data_offset < buffer_len; data_offset += rh->rp.p.csum.block_size, len += rh->rp.p.csum.hash_size) { for (data_offset = 0, len = 0; data_offset < buffer_len; data_offset += rp->p.csum.block_size, len += rp->p.csum.hash_size) {
if (crypt_hash_write(rh->rp.p.csum.ch, (const char *)buffer + data_offset, rh->rp.p.csum.block_size)) { if (crypt_hash_write(rp->p.csum.ch, (const char *)buffer + data_offset, rp->p.csum.block_size)) {
log_dbg(cd, "Failed to hash sector at offset %zu.", data_offset); log_dbg(cd, "Failed to hash sector at offset %zu.", data_offset);
return -EINVAL; return -EINVAL;
} }
if (crypt_hash_final(rh->rp.p.csum.ch, (char *)rh->rp.p.csum.checksums + len, rh->rp.p.csum.hash_size)) { if (crypt_hash_final(rp->p.csum.ch, (char *)rp->p.csum.checksums + len, rp->p.csum.hash_size)) {
log_dbg(cd, "Failed to finalize hash."); log_dbg(cd, "Failed to finalize hash.");
return -EINVAL; return -EINVAL;
} }
} }
pbuffer = rh->rp.p.csum.checksums; pbuffer = rp->p.csum.checksums;
} else if (rh->rp.type == REENC_PROTECTION_JOURNAL) { } else if (rp->type == REENC_PROTECTION_JOURNAL) {
log_dbg(cd, "Journal hotzone resilience."); log_dbg(cd, "Journal hotzone resilience.");
len = buffer_len; len = buffer_len;
pbuffer = buffer; pbuffer = buffer;
} else if (rh->rp.type == REENC_PROTECTION_DATASHIFT) { } else if (rp->type == REENC_PROTECTION_DATASHIFT) {
log_dbg(cd, "Data shift hotzone resilience."); log_dbg(cd, "Data shift hotzone resilience.");
return LUKS2_hdr_write(cd, hdr); return LUKS2_hdr_write(cd, hdr);
} else } else
@@ -2531,7 +2537,7 @@ static int reencrypt_hotzone_protect_final(struct crypt_device *cd,
log_dbg(cd, "Going to store %zu bytes in reencrypt keyslot.", len); log_dbg(cd, "Going to store %zu bytes in reencrypt keyslot.", len);
r = LUKS2_keyslot_reencrypt_store(cd, hdr, rh->reenc_keyslot, pbuffer, len); r = LUKS2_keyslot_reencrypt_store(cd, hdr, reencrypt_keyslot, pbuffer, len);
return r > 0 ? 0 : r; return r > 0 ? 0 : r;
} }
@@ -3224,7 +3230,7 @@ static reenc_status_t reencrypt_step(struct crypt_device *cd,
} }
/* metadata commit point */ /* metadata commit point */
r = reencrypt_hotzone_protect_final(cd, hdr, rh, rh->reenc_buffer, rh->read); r = reencrypt_hotzone_protect_final(cd, hdr, rh->reenc_keyslot, &rh->rp, rh->reenc_buffer, rh->read);
if (r < 0) { if (r < 0) {
/* severity normal */ /* severity normal */
log_err(cd, _("Failed to write reencryption resilience metadata.")); log_err(cd, _("Failed to write reencryption resilience metadata."));