@@ -307,9 +307,10 @@ clevis_luks_check_valid_key_or_keyfile() {
307307 local KEY=" ${2:- } "
308308 local KEYFILE=" ${3:- } "
309309 local SLT=" ${4:- } "
310+ local EXISTING_TOKEN_ID=" ${5:- } "
310311
311312 [ -z " ${DEV} " ] && return 1
312- [ -z " ${KEYFILE} " ] && [ -z " ${KEY} " ] && return 1
313+ [ -z " ${EXISTING_TOKEN_ID} " ] && [ -z " ${ KEYFILE}" ] && [ -z " ${KEY} " ] && return 1
313314
314315 local extra_args
315316 extra_args=" $( [ -n " ${SLT} " ] && printf -- ' --key-slot %s' " ${SLT} " ) "
@@ -318,6 +319,11 @@ clevis_luks_check_valid_key_or_keyfile() {
318319 ${extra_args}
319320 return
320321 fi
322+ if [ -n " ${EXISTING_TOKEN_ID} " ]; then
323+ cryptsetup open --test-passphrase " ${DEV} " --token-id " ${EXISTING_TOKEN_ID} " \
324+ ${extra_args}
325+ return
326+ fi
321327
322328 printf ' %s' " ${KEY} " | cryptsetup open --test-passphrase " ${DEV} " \
323329 ${extra_args}
@@ -764,17 +770,22 @@ clevis_luks_add_key() {
764770 local NEWKEY=" ${3} "
765771 local KEY=" ${4} "
766772 local KEYFILE=" ${5:- } "
773+ local EXISTING_TOKEN_ID=" ${6:- } "
767774
768775 [ -z " ${DEV} " ] && return 1
769776 [ -z " ${NEWKEY} " ] && return 1
770- [ -z " ${KEY} " ] && [ -z " ${KEYFILE} " ] && return 1
777+ [ -z " ${EXISTING_TOKEN_ID} " ] && [ -z " ${ KEY}" ] && [ -z " ${KEYFILE} " ] && return 1
771778
772779 local extra_args=' ' input
773780 input=" $( printf ' %s\n%s' " ${KEY} " " ${NEWKEY} " ) "
774781 if [ -n " ${KEYFILE} " ]; then
775782 extra_args=" $( printf -- ' --key-file %s' " ${KEYFILE} " ) "
776783 input=" $( printf ' %s' " ${NEWKEY} " ) "
777784 fi
785+ if [ -n " ${EXISTING_TOKEN_ID} " ]; then
786+ extra_args=" $( printf -- ' --token-id %s' " ${EXISTING_TOKEN_ID} " ) "
787+ input=" $( printf ' %s' " ${NEWKEY} " ) "
788+ fi
778789 local pbkdf_args=" --pbkdf pbkdf2 --pbkdf-force-iterations 1000"
779790
780791 printf ' %s' " ${input} " | cryptsetup luksAddKey --batch-mode \
@@ -791,6 +802,7 @@ clevis_luks_update_key() {
791802 local NEWKEY=" ${3} "
792803 local KEY=" ${4} "
793804 local KEYFILE=" ${5:- } "
805+ local EXISTING_TOKEN_ID=" ${6:- } "
794806
795807 [ -z " ${DEV} " ] && return 1
796808 [ -z " ${NEWKEY} " ] && return 1
@@ -800,7 +812,7 @@ clevis_luks_update_key() {
800812 local in_place
801813 clevis_luks_check_valid_key_or_keyfile " ${DEV} " \
802814 " ${KEY} " " ${KEYFILE} " \
803- " ${SLT} " 2> /dev/null \
815+ " ${SLT} " " ${EXISTING_TOKEN_ID} " 2> /dev/null \
804816 && in_place=true
805817
806818 local input extra_args=
@@ -809,6 +821,11 @@ clevis_luks_update_key() {
809821 extra_args=" $( printf -- ' --key-file %s' " ${KEYFILE} " ) "
810822 input=" $( printf ' %s' " ${NEWKEY} " ) "
811823 fi
824+ if [ -n " ${EXISTING_TOKEN_ID} " ]; then
825+ extra_args=" $( printf -- ' --token-id %s' " ${EXISTING_TOKEN_ID} " ) "
826+ input=" $( printf ' %s' " ${NEWKEY} " ) "
827+ fi
828+
812829 local pbkdf_args=" --pbkdf pbkdf2 --pbkdf-force-iterations 1000"
813830
814831 if [ -n " ${in_place} " ]; then
@@ -838,6 +855,7 @@ clevis_luks_save_key_to_slot() {
838855 local KEY=" ${4} "
839856 local KEYFILE=" ${5:- } "
840857 local OVERWRITE=" ${6:- } "
858+ local EXISTING_TOKEN_ID=" ${7:- } "
841859
842860 [ -z " ${DEV} " ] && return 1
843861 [ -z " ${SLT} " ] && return 1
@@ -855,13 +873,13 @@ clevis_luks_save_key_to_slot() {
855873 [ -n " ${OVERWRITE} " ] || return 1
856874
857875 clevis_luks_update_key " ${DEV} " " ${SLT} " \
858- " ${NEWKEY} " " ${KEY} " " ${KEYFILE} "
876+ " ${NEWKEY} " " ${KEY} " " ${KEYFILE} " " ${EXISTING_TOKEN_ID} "
859877 return
860878 fi
861879
862880 # Add a new key.
863881 clevis_luks_add_key " ${DEV} " " ${SLT} " \
864- " ${NEWKEY} " " ${KEY} " " ${KEYFILE} "
882+ " ${NEWKEY} " " ${KEY} " " ${KEYFILE} " " ${EXISTING_TOKEN_ID} "
865883}
866884
867885# clevis_luks_generate_key() generates a new key for use with clevis.
@@ -957,15 +975,17 @@ clevis_luks_do_bind() {
957975 local OVERWRITE=" ${7:- } "
958976 local KEY=" ${8:- } "
959977 local KEYFILE=" ${9:- } "
978+ local EXISTING_TOKEN_ID=" ${10:- } "
960979
961980 [ -z " ${DEV} " ] && return 1
962981 [ -z " ${PIN} " ] && return 1
963982 [ -z " ${CFG} " ] && return 1
964983
965-
966984 if ! clevis_luks_check_valid_key_or_keyfile " ${DEV} " \
967985 " ${KEY} " \
968986 " ${KEYFILE} " \
987+ " " \
988+ " ${EXISTING_TOKEN_ID} " \
969989 && ! KEY=" $( clevis_luks_get_existing_key " ${DEV} " \
970990 " Enter existing LUKS password: " \
971991 " recover" ) " ; then
@@ -1014,7 +1034,7 @@ clevis_luks_do_bind() {
10141034
10151035 if ! clevis_luks_save_key_to_slot " ${DEV} " " ${SLT} " \
10161036 " ${newkey} " " ${KEY} " " ${KEYFILE} " \
1017- " ${OVERWRITE} " ; then
1037+ " ${OVERWRITE} " " ${EXISTING_TOKEN_ID} " ; then
10181038 echo " Unable to save/update key slot; operation cancelled" >&2
10191039 clevis_luks_restore_dev " ${CLEVIS_TMP_DIR} " || :
10201040 rm -rf " ${CLEVIS_TMP_DIR} "
@@ -1035,12 +1055,19 @@ clevis_luks_do_bind() {
10351055}
10361056
10371057# clevis_luks_luks2_supported() indicates whether we support LUKS2 devices.
1038- # Suppor is determined at build time.
1058+ # Support is determined at build time.
10391059function clevis_luks_luks2_supported() {
10401060 # We require cryptsetup >= 2.0.4 to fully support LUKSv2.
10411061 return @OLD_CRYPTSETUP@
10421062}
10431063
1064+ # clevis_luks_luks2_existing_token_id_supported() indicates whether
1065+ # cryptsetup allows token id for passphrase providing
1066+ function clevis_luks_luks2_existing_token_id_supported() {
1067+ # We require cryptsetup >= 2.6.0 to fully support LUKSv2 addkey/open by token ID
1068+ return @OLD_CRYPTSETUP_EXISTING_TOKEN_ID@
1069+ }
1070+
10441071# clevis_luks_type() returns the LUKS type of a device, e.g. "luks1".
10451072clevis_luks_type () {
10461073 local DEV=" ${1} "
0 commit comments