diff --git a/config-root.yaml b/config-root.yaml index d1430269..05d3c267 100644 --- a/config-root.yaml +++ b/config-root.yaml @@ -101,61 +101,65 @@ dotfiles: f_pacserve.service.conf: src: etc/pacserve/pacserve.service.conf dst: /etc/pacserve/pacserve.service.conf + f_encrypt: + src: usr/lib/initcpio/hooks/encrypt + dst: /usr/lib/initcpio/hooks/encrypt profiles: Network: dotfiles: - - d_network - - f_networkd.conf + - d_network + - f_networkd.conf Locale: dotfiles: - - f_locale.conf - - f_locale.gen + - f_locale.conf + - f_locale.gen Pacman: dotfiles: - - f_pacman.conf - - f_pacserve.service.conf + - f_pacman.conf + - f_pacserve.service.conf Mirkwood: dotfiles: - - f_getty.conf - - f_cryptissue - - f_welcomemessage.conf - - d_bin - - f_adb.service - - f_bluetooth.conf - - f_sshd_config - - f_logind.conf - - f_60-uinput-permissions.rules - - f_freetype2.sh - - f_fonts.conf - - f_99-lowbat.rules - - f_ignore - - f_mkinitcpio.conf - - f_vconsole.conf - - f_20-quiet-printk.conf - - f_system.conf - - f_cpupower + - f_getty.conf + - f_cryptissue + - f_welcomemessage.conf + - d_bin + - f_adb.service + - f_bluetooth.conf + - f_sshd_config + - f_logind.conf + - f_60-uinput-permissions.rules + - f_freetype2.sh + - f_fonts.conf + - f_99-lowbat.rules + - f_ignore + - f_mkinitcpio.conf + - f_vconsole.conf + - f_20-quiet-printk.conf + - f_system.conf + - f_cpupower + - f_encrypt include: - - Locale - - Pacman - - Network + - Locale + - Pacman + - Network Moria: include: - - Locale - - Pacman - - Network + - Locale + - Pacman + - Network dotfiles: - - f_sshd_config - - f_99-sysctl.conf - - f_cpupower + - f_sshd_config + - f_99-sysctl.conf + - f_cpupower Gondor: include: - - Locale - - Pacman + - Locale + - Pacman dotfiles: - - f_sshd_config + - f_sshd_config localhost: include: - - Locale + - Locale Edoras: include: - - Pacman + - Pacman diff --git a/root/usr/lib/initcpio/hooks/encrypt b/root/usr/lib/initcpio/hooks/encrypt new file mode 100644 index 00000000..a25c1f60 --- /dev/null +++ b/root/usr/lib/initcpio/hooks/encrypt @@ -0,0 +1,149 @@ +#!/usr/bin/ash + +run_hook() { + modprobe -a -q dm-crypt >/dev/null 2>&1 + [ "${quiet}" = "y" ] && CSQUIET=">/dev/null" + + # Get keyfile if specified + ckeyfile="/crypto_keyfile.bin" + if [ -n "$cryptkey" ]; then + IFS=: read ckdev ckarg1 ckarg2 </dev/null 2>&1 + umount /ckey + ;; + *) + # Read raw data from the block device + # ckarg1 is numeric: ckarg1=offset, ckarg2=length + dd if="$resolved" of="$ckeyfile" bs=1 skip="$ckarg1" count="$ckarg2" >/dev/null 2>&1 + ;; + esac + fi + [ ! -f ${ckeyfile} ] && echo "Keyfile could not be opened. Reverting to passphrase." + fi + + if [ -n "${cryptdevice}" ]; then + DEPRECATED_CRYPT=0 + IFS=: read cryptdev cryptname cryptoptions <&2 + ;; + esac + done + set +f + IFS="$OLDIFS" + unset OLDIFS + + if resolved=$(resolve_device "${cryptdev}" ${rootdelay}); then + if cryptsetup isLuks ${resolved} >/dev/null 2>&1; then + [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated + dopassphrase=1 + # If keyfile exists, try to use that + if [ -f ${ckeyfile} ]; then + if eval cryptsetup --key-file ${ckeyfile} open --type luks ${resolved} ${cryptname} ${cryptargs} ${CSQUIET}; then + dopassphrase=0 + else + echo "Invalid keyfile. Reverting to passphrase." + fi + fi + # Ask for a passphrase + if [ ${dopassphrase} -gt 0 ]; then + echo "" + echo "Enter password to decrypt disk:" + + #loop until we get a real password + while ! eval cryptsetup open --type luks ${resolved} ${cryptname} ${cryptargs} ${CSQUIET}; do + sleep 2; + done + fi + if [ -e "/dev/mapper/${cryptname}" ]; then + if [ ${DEPRECATED_CRYPT} -eq 1 ]; then + export root="/dev/mapper/root" + fi + else + err "Password succeeded, but ${cryptname} creation failed, aborting..." + return 1 + fi + elif [ -n "${crypto}" ]; then + [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated + msg "Non-LUKS encrypted device found..." + if echo "$crypto" | awk -F: '{ exit(NF == 5) }'; then + err "Verify parameter format: crypto=hash:cipher:keysize:offset:skip" + err "Non-LUKS decryption not attempted..." + return 1 + fi + exe="cryptsetup open --type plain $resolved $cryptname $cryptargs" + IFS=: read c_hash c_cipher c_keysize c_offset c_skip <