@@ -66,9 +66,10 @@ copy_exec /usr/bin/tpm2_create || hook_error "Unable to copy /usr/bin/tpm2_creat
copy_exec /usr/bin/tpm2_load || hook_error "Unable to copy /usr/bin/tpm2_load"
if [ "$VERSION_CODENAME" != "buster" ] && [ -x /usr/bin/tpm2_pcrread ]; then
copy_exec /usr/bin/tpm2_pcrread || hook_error "Unable to copy /usr/bin/tpm2_pcrread"
+ copy_exec /usr/bin/tpm2_testparms || hook_error "Unable to copy /usr/bin/tpm2_testparms"
fi
if [ "$VERSION_CODENAME" = "buster" ] && [ -x /usr/bin/tpm2_pcrlist ]; then
- copy_exec /usr/bin/tpm2_pcrlist || hook_error "Unable to copy /usr/bin/tpm2_pcrread"
+ copy_exec /usr/bin/tpm2_pcrlist || hook_error "Unable to copy /usr/bin/tpm2_pcrlist"
fi
copy_exec /usr/bin/tpm2_createpolicy || hook_error "Unable to copy /usr/bin/tpm2_createpolicy"
if [ "$VERSION_CODENAME" != "buster" ] && [ -x /usr/bin/tpm2_flushcontext ]; then
@@ -86,9 +87,7 @@ copy_exec /usr/bin/basename || hook_error "Unable to copy /usr/bin/basename"
copy_exec /usr/bin/seq || hook_error "Unable to copy /usr/bin/seq"
copy_exec /usr/bin/pwmake || hook_error "Unable to copy /usr/bin/pwmake"
copy_exec /usr/bin/file || hook_error "Unable to copy /usr/bin/file "
-if [ "$VERSION_CODENAME" = "buster" ]; then
- copy_exec /usr/lib/*/libgcc_s.so.1 || hook_error "Unable to copy /usr/lib/*/libgcc_s.so.1 "
-fi
+copy_exec /usr/lib/*/libgcc_s.so.1 || hook_error "Unable to copy /usr/lib/*/libgcc_s.so.1 "
if [ -x /usr/sbin/cryptsetup-reencrypt ]; then
copy_exec /usr/sbin/cryptsetup-reencrypt
fi
@@ -43,12 +43,10 @@ modprobe xts
# this needs to be probed particularly for re-encryption
modprobe loop
-# fixed tpm device or do we need to find it
-tpm_device=/dev/tpmrm0
partition_sets="$PARTITIONS"
create_file_system_cmd="$CREATE_FILE_SYSTEM_CMD"
-hash_type="$HASH_TYPE"
-
+pcr_bank_hash_type="$HASH_TYPE"
+tpm_key_algorithm="$KEY_ALGORITHM"
if [ -z "${create_file_system_cmd}" ]; then
create_file_system_cmd="mke2fs -t ext4"
fi
@@ -69,7 +67,7 @@ open_tpm2_partition() {
enroll_tpm2_token() {
if [ -x /usr/bin/clevis ]; then
- clevis luks bind -d "$1" tpm2 '{"pcr_bank":"'"$hash_type"'","pcr_ids":"7"}' < "$2"
+ clevis luks bind -d "$1" tpm2 '{"key":"'"$tpm_key_algorithm"'", "pcr_bank":"'"$pcr_bank_hash_type"'","pcr_ids":"7"}' < "$2"
else
panic "clevis not available cannot enroll tpm2 key!"
fi
@@ -102,6 +100,26 @@ mount_partition() {
fi
}
+for candidate in /dev/tpm*; do
+ if [ -x /usr/bin/tpm2_pcrread ]; then
+ if ! tpm2_pcrread -T device:"$candidate" "$pcr_bank_hash_type":7 --quiet ; then
+ continue
+ fi
+ elif [ -x /usr/bin/tpm2_pcrlist ]; then
+ export TPM2TOOLS_DEVICE_FILE="$candidate"
+ if ! tpm2_pcrlist -L "$pcr_bank_hash_type":7 > /dev/null; then
+ continue
+ fi
+ fi
+ # Debian buster does not have tpm_testparms
+ if [ -x /usr/bin/tpm2_testparms ]; then
+ if ! tpm2_testparms -T device:"$candidate" "$tpm_key_algorithm" --quiet; then
+ continue
+ fi
+ fi
+ tpm_device=$candidate
+done
+
if [ ! -e "$tpm_device" ]; then
panic "tpm device '$tpm_device' does not exists - cannot create a encrypted device!"
fi
@@ -2,4 +2,5 @@ PARTITIONS="${CRYPT_PARTITIONS}"
CREATE_FILE_SYSTEM_CMD="${CRYPT_CREATE_FILE_SYSTEM_CMD}"
SETUP_TIMEOUT="${CRYPT_SETUP_TIMEOUT}"
WATCHDOG_DEV="${INITRAMFS_WATCHDOG_DEVICE}"
-HASH_TYPE="${CRYPT_HASH_TYPE}"
\ No newline at end of file
+HASH_TYPE="${CRYPT_HASH_TYPE}"
+KEY_ALGORITHM="${CRYPT_KEY_ALGORITHM}"
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) Siemens AG, 2020-2023
+# Copyright (C) Siemens AG, 2020-2024
#
# SPDX-License-Identifier: MIT
@@ -49,6 +49,8 @@ copy_exec /usr/sbin/resize2fs || hook_error "/usr/sbin/resize2fs not found"
copy_exec /usr/sbin/cryptsetup || hook_error "/usr/sbin/cryptsetup not found"
copy_exec /usr/bin/systemd-cryptenroll || hook_error "/usr/bin/systemd-cryptenroll not found"
copy_exec /usr/lib/systemd/systemd-cryptsetup || hook_error "/usr/lib/systemd/systemd-cryptsetup not found"
+copy_exec /usr/bin/tpm2_pcrread || hook_error "Unable to copy /usr/bin/tpm2_pcrread"
+copy_exec /usr/bin/tpm2_testparms || hook_error "Unable to copy /usr/bin/tpm2_testparms"
copy_exec /usr/lib/*/cryptsetup/libcryptsetup-token-systemd-tpm2.so || hook_error "/usr/lib/*/cryptsetup/libcryptsetup-token-systemd-tpm2.so not found"
if [ -x /usr/sbin/cryptsetup-reencrypt ]; then
@@ -43,10 +43,10 @@ modprobe xts
# this needs to be probed particularly for re-encryption
modprobe loop
-# fixed tpm device or do we need to find it
-tpm_device=/dev/tpmrm0
partition_sets="$PARTITIONS"
create_file_system_cmd="$CREATE_FILE_SYSTEM_CMD"
+pcr_bank_hash_type="$HASH_TYPE"
+tpm_key_algorithm="$KEY_ALGORITHM"
if [ -z "${create_file_system_cmd}" ]; then
create_file_system_cmd="mke2fs -t ext4"
fi
@@ -71,6 +71,7 @@ enroll_tpm2_token() {
systemd_version=$(systemd-cryptenroll --version | \
awk -F " " 'NR==1{print $2 }')
# check systemd version and export password if necessary
+ # systemd version 251 does not suport hash_types
if [ "$systemd_version" -ge "251" ]; then
PASSWORD=$(cat "$2" )
export PASSWORD
@@ -112,6 +113,16 @@ mount_partition() {
fi
}
+for candidate in /dev/tpm*; do
+ if ! tpm2_pcrread -T device:"$candidate" "$pcr_bank_hash_type":7 --quiet 2>/dev/null; then
+ continue
+ fi
+ if ! tpm2_testparms -T device:"$candidate" "$tpm_key_algorithm" --quiet 2>/dev/null; then
+ continue
+ fi
+ tpm_device=$candidate
+done
+
if [ ! -e "$tpm_device" ]; then
panic "tpm device '$tpm_device' does not exists - cannot create a encrypted device!"
fi
@@ -11,7 +11,7 @@
inherit dpkg-raw
DEBIAN_DEPENDS = "initramfs-tools, cryptsetup, \
awk, openssl, libtss2-esys-3.0.2-0 | libtss2-esys0, \
- libtss2-rc0 | libtss2-esys0, libtss2-mu0 | libtss2-esys0, e2fsprogs"
+ libtss2-rc0 | libtss2-esys0, libtss2-mu0 | libtss2-esys0, e2fsprogs, tpm2-tools"
CLEVIS_DEPEND = ", clevis-luks, jose, bash, luksmeta, file, libpwquality-tools"
@@ -49,10 +49,11 @@ CRYPT_SETUP_TIMEOUT ??= "600"
INITRAMFS_WATCHDOG_DEVICE ??= "/dev/watchdog"
# clevis needs tpm hash algorithm type
CRYPT_HASH_TYPE ??= "sha256"
-
+CRYPT_KEY_ALGORITHM ??= "ecc"
TEMPLATE_VARS = "CRYPT_PARTITIONS CRYPT_CREATE_FILE_SYSTEM_CMD \
- CRYPT_SETUP_TIMEOUT INITRAMFS_WATCHDOG_DEVICE CRYPT_HASH_TYPE"
+ CRYPT_SETUP_TIMEOUT INITRAMFS_WATCHDOG_DEVICE CRYPT_HASH_TYPE \
+ CRYPT_KEY_ALGORITHM CRYPT_ENCRYPTION_OPTIONAL"
TEMPLATE_FILES = "encrypt_partition.env.tmpl"
do_install[cleandirs] += " \