Commit 4e31a75b368c

Vincent Demeester <vincent@sbr.pm>
2026-07-28 15:11:21
feat(imperative): add LUKS FIDO2 YubiKey setup phase
Added setup_luks_fido2 to both bootstrap scripts. Detects LUKS device, prompts for YubiKey enrollment if missing, and rebuilds initramfs with fido2 dracut module for touch-to-unlock at boot.
1 parent 12fe222
Changed files (2)
imperative
imperative/aomi/bootstrap.sh
@@ -243,7 +243,38 @@ setup_tpm() {
 	fi
 }
 
-# --- Phase 5: lid-close behavior (systemd-logind) ---
+# --- Phase 5: LUKS FIDO2 (YubiKey) ---
+
+setup_luks_fido2() {
+	local luks_dev
+	luks_dev=$(blkid -t TYPE=crypto_LUKS -o device 2>/dev/null | head -1)
+
+	if [[ -z "$luks_dev" ]]; then
+		log_warn "No LUKS device found; skipping FIDO2 enrollment"
+		return 0
+	fi
+
+	log_info "Found LUKS device: $luks_dev"
+
+	# Check if FIDO2 is already enrolled
+	if sudo systemd-cryptenroll "$luks_dev" --fido2-device=list 2>/dev/null | grep -q 'fido2'; then
+		log_info "FIDO2 already available"
+	else
+		log_warn "No FIDO2 device detected. Plug in YubiKey, then run:"
+		log_warn "  sudo systemd-cryptenroll $luks_dev --fido2-device=auto --fido2-with-client-pin=no"
+	fi
+
+	# Ensure dracut includes fido2 support in initramfs
+	if ! lsinitrd 2>/dev/null | grep -q fido2; then
+		log_info "Adding fido2 support to initramfs..."
+		sudo dracut --add fido2 -f
+		log_info "Initramfs rebuilt with fido2 support"
+	else
+		log_info "Initramfs already has fido2 support"
+	fi
+}
+
+# --- Phase 5b: lid-close behavior (systemd-logind) ---
 
 setup_lid() {
 	# Under niri there is no gnome-settings-daemon power plugin, so lid handling
@@ -472,6 +503,7 @@ main() {
 	setup_selinux_policy
 	install_native_apps
 	setup_tpm
+	setup_luks_fido2
 	setup_lid
 	setup_unscd
 	build_and_activate
imperative/kyushu/bootstrap.sh
@@ -242,7 +242,38 @@ setup_tpm() {
 	fi
 }
 
-# --- Phase 7: unscd for nix NSS resolution ---
+# --- Phase 7: LUKS FIDO2 (YubiKey) ---
+
+setup_luks_fido2() {
+	local luks_dev
+	luks_dev=$(blkid -t TYPE=crypto_LUKS -o device 2>/dev/null | head -1)
+
+	if [[ -z "$luks_dev" ]]; then
+		log_warn "No LUKS device found; skipping FIDO2 enrollment"
+		return 0
+	fi
+
+	log_info "Found LUKS device: $luks_dev"
+
+	# Check if FIDO2 is already enrolled
+	if sudo systemd-cryptenroll "$luks_dev" --fido2-device=list 2>/dev/null | grep -q 'fido2'; then
+		log_info "FIDO2 already available"
+	else
+		log_warn "No FIDO2 device detected. Plug in YubiKey, then run:"
+		log_warn "  sudo systemd-cryptenroll $luks_dev --fido2-device=auto --fido2-with-client-pin=no"
+	fi
+
+	# Ensure dracut includes fido2 support in initramfs
+	if ! lsinitrd 2>/dev/null | grep -q fido2; then
+		log_info "Adding fido2 support to initramfs..."
+		sudo dracut --add fido2 -f
+		log_info "Initramfs rebuilt with fido2 support"
+	else
+		log_info "Initramfs already has fido2 support"
+	fi
+}
+
+# --- Phase 8: unscd for nix NSS resolution ---
 
 setup_unscd() {
 	# Nix glibc can't load system NSS modules (libnss_sss.so) so nix programs
@@ -392,6 +423,7 @@ main() {
 	setup_selinux_policy
 	install_native_apps
 	setup_tpm
+	setup_luks_fido2
 	setup_unscd
 	setup_system_configs
 	setup_wireguard