mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-19 14:50:09 +01:00
Check user provided correct passphrase before initializing decryption.
It would fail later anyway (due to wrong passphrase provided) but it's better to stop sooner.
This commit is contained in:
@@ -48,6 +48,24 @@ static void _set_reencryption_flags(uint32_t *flags)
|
|||||||
*flags |= CRYPT_REENCRYPT_RESUME_ONLY;
|
*flags |= CRYPT_REENCRYPT_RESUME_ONLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int reencrypt_check_passphrase(struct crypt_device *cd,
|
||||||
|
int keyslot,
|
||||||
|
const char *passphrase,
|
||||||
|
size_t passphrase_len)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(cd);
|
||||||
|
|
||||||
|
r = crypt_activate_by_passphrase(cd, NULL, keyslot,
|
||||||
|
passphrase, passphrase_len, 0);
|
||||||
|
check_signal(&r);
|
||||||
|
tools_passphrase_msg(r);
|
||||||
|
tools_keyslot_msg(r, UNLOCKED);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static int set_keyslot_params(struct crypt_device *cd, int keyslot)
|
static int set_keyslot_params(struct crypt_device *cd, int keyslot)
|
||||||
{
|
{
|
||||||
const char *cipher;
|
const char *cipher;
|
||||||
@@ -238,19 +256,16 @@ static int reencrypt_luks2_load(struct crypt_device *cd, const char *data_device
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
||||||
if (!ARG_SET(OPT_FORCE_OFFLINE_REENCRYPT_ID))
|
if (!ARG_SET(OPT_FORCE_OFFLINE_REENCRYPT_ID))
|
||||||
r = reencrypt_get_active_name(cd, data_device, &active_name);
|
r = reencrypt_get_active_name(cd, data_device, &active_name);
|
||||||
if (r >= 0)
|
if (r >= 0)
|
||||||
r = crypt_reencrypt_init_by_passphrase(cd, active_name, password,
|
r = crypt_reencrypt_init_by_passphrase(cd, active_name, password,
|
||||||
passwordLen, ARG_INT32(OPT_KEY_SLOT_ID),
|
passwordLen, ARG_INT32(OPT_KEY_SLOT_ID),
|
||||||
ARG_INT32(OPT_KEY_SLOT_ID), NULL, NULL, ¶ms);
|
ARG_INT32(OPT_KEY_SLOT_ID), NULL, NULL, ¶ms);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
free(hash);
|
free(hash);
|
||||||
crypt_safe_free(password);
|
crypt_safe_free(password);
|
||||||
free(active_name);
|
free(active_name);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -615,12 +630,17 @@ static int decrypt_luks2_init(struct crypt_device *cd, const char *data_device)
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
r = reencrypt_check_passphrase(cd, ARG_INT32(OPT_KEY_SLOT_ID), password, passwordLen);
|
||||||
|
if (r < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (!ARG_SET(OPT_FORCE_OFFLINE_REENCRYPT_ID) && !ARG_SET(OPT_INIT_ONLY_ID))
|
if (!ARG_SET(OPT_FORCE_OFFLINE_REENCRYPT_ID) && !ARG_SET(OPT_INIT_ONLY_ID))
|
||||||
r = reencrypt_get_active_name(cd, data_device, &active_name);
|
r = reencrypt_get_active_name(cd, data_device, &active_name);
|
||||||
if (r >= 0)
|
if (r >= 0)
|
||||||
r = crypt_reencrypt_init_by_passphrase(cd, active_name, password,
|
r = crypt_reencrypt_init_by_passphrase(cd, active_name, password,
|
||||||
passwordLen, ARG_INT32(OPT_KEY_SLOT_ID), CRYPT_ANY_SLOT, NULL, NULL, ¶ms);
|
passwordLen, ARG_INT32(OPT_KEY_SLOT_ID), CRYPT_ANY_SLOT, NULL, NULL, ¶ms);
|
||||||
|
|
||||||
|
out:
|
||||||
free(active_name);
|
free(active_name);
|
||||||
crypt_safe_free(password);
|
crypt_safe_free(password);
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
Reference in New Issue
Block a user