cryptenroll: Add support for unlocking through TPM2 enrollments
This commit is contained in:
@@ -34,6 +34,7 @@ static EnrollType arg_enroll_type = _ENROLL_TYPE_INVALID;
|
||||
static char *arg_unlock_keyfile = NULL;
|
||||
static UnlockType arg_unlock_type = UNLOCK_PASSWORD;
|
||||
static char *arg_unlock_fido2_device = NULL;
|
||||
static char *arg_unlock_tpm2_device = NULL;
|
||||
static char *arg_pkcs11_token_uri = NULL;
|
||||
static char *arg_fido2_device = NULL;
|
||||
static char *arg_tpm2_device = NULL;
|
||||
@@ -62,6 +63,7 @@ assert_cc(sizeof(arg_wipe_slots_mask) * 8 >= _ENROLL_TYPE_MAX);
|
||||
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_unlock_keyfile, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_unlock_fido2_device, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_unlock_tpm2_device, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_pkcs11_token_uri, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_fido2_device, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_tpm2_device, freep);
|
||||
@@ -118,6 +120,8 @@ static int help(void) {
|
||||
" Use a file to unlock the volume\n"
|
||||
" --unlock-fido2-device=PATH\n"
|
||||
" Use a FIDO2 device to unlock the volume\n"
|
||||
" --unlock-tpm2-device=PATH\n"
|
||||
" Use a TPM2 device to unlock the volume\n"
|
||||
"\n%3$sSimple Enrollment:%4$s\n"
|
||||
" --password Enroll a user-supplied password\n"
|
||||
" --recovery-key Enroll a recovery key\n"
|
||||
@@ -173,6 +177,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
ARG_RECOVERY_KEY,
|
||||
ARG_UNLOCK_KEYFILE,
|
||||
ARG_UNLOCK_FIDO2_DEVICE,
|
||||
ARG_UNLOCK_TPM2_DEVICE,
|
||||
ARG_PKCS11_TOKEN_URI,
|
||||
ARG_FIDO2_DEVICE,
|
||||
ARG_TPM2_DEVICE,
|
||||
@@ -198,6 +203,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
{ "recovery-key", no_argument, NULL, ARG_RECOVERY_KEY },
|
||||
{ "unlock-key-file", required_argument, NULL, ARG_UNLOCK_KEYFILE },
|
||||
{ "unlock-fido2-device", required_argument, NULL, ARG_UNLOCK_FIDO2_DEVICE },
|
||||
{ "unlock-tpm2-device", required_argument, NULL, ARG_UNLOCK_TPM2_DEVICE },
|
||||
{ "pkcs11-token-uri", required_argument, NULL, ARG_PKCS11_TOKEN_URI },
|
||||
{ "fido2-credential-algorithm", required_argument, NULL, ARG_FIDO2_CRED_ALG },
|
||||
{ "fido2-device", required_argument, NULL, ARG_FIDO2_DEVICE },
|
||||
@@ -305,6 +311,26 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
break;
|
||||
}
|
||||
|
||||
case ARG_UNLOCK_TPM2_DEVICE: {
|
||||
_cleanup_free_ char *device = NULL;
|
||||
|
||||
if (arg_unlock_type != UNLOCK_PASSWORD)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Multiple unlock methods specified at once, refusing.");
|
||||
|
||||
assert(!arg_unlock_tpm2_device);
|
||||
|
||||
if (!streq(optarg, "auto")) {
|
||||
device = strdup(optarg);
|
||||
if (!device)
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
arg_unlock_type = UNLOCK_TPM2;
|
||||
arg_unlock_tpm2_device = TAKE_PTR(device);
|
||||
break;
|
||||
}
|
||||
|
||||
case ARG_PKCS11_TOKEN_URI: {
|
||||
_cleanup_free_ char *uri = NULL;
|
||||
|
||||
@@ -667,6 +693,10 @@ static int prepare_luks(
|
||||
|
||||
switch (arg_unlock_type) {
|
||||
|
||||
case UNLOCK_PASSWORD:
|
||||
r = load_volume_key_password(cd, arg_node, vk, &vks);
|
||||
break;
|
||||
|
||||
case UNLOCK_KEYFILE:
|
||||
r = load_volume_key_keyfile(cd, vk, &vks);
|
||||
break;
|
||||
@@ -675,8 +705,8 @@ static int prepare_luks(
|
||||
r = load_volume_key_fido2(cd, arg_node, arg_unlock_fido2_device, vk, &vks);
|
||||
break;
|
||||
|
||||
case UNLOCK_PASSWORD:
|
||||
r = load_volume_key_password(cd, arg_node, vk, &vks);
|
||||
case UNLOCK_TPM2:
|
||||
r = load_volume_key_tpm2(cd, arg_node, arg_unlock_tpm2_device, vk, &vks);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user