mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-08 09:20:11 +01:00
Refactor internal reencrypt_hotzone_protect_final.
Avoid passing whole reencryption context when not needed.
This commit is contained in:
@@ -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."));
|
||||||
|
|||||||
Reference in New Issue
Block a user