diff --git a/src/repart/repart.c b/src/repart/repart.c index 7ed706137ee..9e51382f6e3 100644 --- a/src/repart/repart.c +++ b/src/repart/repart.c @@ -5540,17 +5540,16 @@ static int partition_encrypt(Context *context, Partition *p, PartitionTarget *ta * (e.g. kdump with crashkernel=512MB). */ r = cryptsetup_set_minimal_pbkdf(cd); } else { - /* For argon2id or pbkdf2, set the type and let libcryptsetup benchmark - * and determine the parameters. */ - static const struct crypt_pbkdf_type argon2id_pbkdf = { - .type = "argon2id", - }; - static const struct crypt_pbkdf_type pbkdf2_pbkdf = { - .type = "pbkdf2", - }; + assert(IN_SET(p->encrypt_kdf, ENCRYPT_KDF_ARGON2ID, ENCRYPT_KDF_PBKDF2)); - r = sym_crypt_set_pbkdf_type(cd, p->encrypt_kdf == ENCRYPT_KDF_ARGON2ID ? - &argon2id_pbkdf : &pbkdf2_pbkdf); + /* Use libcryptsetup's full defaults, including the benchmark target and hash. */ + const char *kdf = p->encrypt_kdf == ENCRYPT_KDF_ARGON2ID ? CRYPT_KDF_ARGON2ID : CRYPT_KDF_PBKDF2; + const struct crypt_pbkdf_type *pbkdf = sym_crypt_get_pbkdf_type_params(kdf); + if (!pbkdf) + return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "Failed to get default parameters for KDF type '%s'.", kdf); + + r = sym_crypt_set_pbkdf_type(cd, pbkdf); } if (r < 0) return log_error_errno(r, "Failed to set KDF type: %m"); diff --git a/src/shared/cryptsetup-util.c b/src/shared/cryptsetup-util.c index 531d2fcbc01..6d430f93e0c 100644 --- a/src/shared/cryptsetup-util.c +++ b/src/shared/cryptsetup-util.c @@ -30,6 +30,7 @@ DLSYM_PROTOTYPE(crypt_get_cipher_mode) = NULL; DLSYM_PROTOTYPE(crypt_get_data_offset) = NULL; DLSYM_PROTOTYPE(crypt_get_device_name) = NULL; DLSYM_PROTOTYPE(crypt_get_dir) = NULL; +DLSYM_PROTOTYPE(crypt_get_pbkdf_type_params) = NULL; DLSYM_PROTOTYPE(crypt_get_type) = NULL; DLSYM_PROTOTYPE(crypt_get_uuid) = NULL; DLSYM_PROTOTYPE(crypt_get_verity_info) = NULL; @@ -299,6 +300,7 @@ int dlopen_cryptsetup(int log_level) { DLSYM_ARG(crypt_get_data_offset), DLSYM_ARG(crypt_get_device_name), DLSYM_ARG(crypt_get_dir), + DLSYM_ARG(crypt_get_pbkdf_type_params), DLSYM_ARG(crypt_get_type), DLSYM_ARG(crypt_get_uuid), DLSYM_ARG(crypt_get_verity_info), diff --git a/src/shared/cryptsetup-util.h b/src/shared/cryptsetup-util.h index 66f6ee18c2e..df0159f3b47 100644 --- a/src/shared/cryptsetup-util.h +++ b/src/shared/cryptsetup-util.h @@ -35,6 +35,7 @@ extern DLSYM_PROTOTYPE(crypt_get_cipher_mode); extern DLSYM_PROTOTYPE(crypt_get_data_offset); extern DLSYM_PROTOTYPE(crypt_get_device_name); extern DLSYM_PROTOTYPE(crypt_get_dir); +extern DLSYM_PROTOTYPE(crypt_get_pbkdf_type_params); extern DLSYM_PROTOTYPE(crypt_get_type); extern DLSYM_PROTOTYPE(crypt_get_uuid); extern DLSYM_PROTOTYPE(crypt_get_verity_info); diff --git a/test/units/TEST-58-REPART.sh b/test/units/TEST-58-REPART.sh index f0773d5bd45..2332322f75f 100755 --- a/test/units/TEST-58-REPART.sh +++ b/test/units/TEST-58-REPART.sh @@ -351,6 +351,7 @@ Label=luks-format-copy UUID=7b93d1f2-595d-4ce3-b0b9-837fbd9e63b0 Format=ext4 Encrypt=yes +EncryptKDF=pbkdf2 CopyFiles=$defs:/def SizeMinBytes=48M VolumeLabel=schrupfel