Advertisement
Guest User

Modified Arch linux encrypt hook to allow specifying multiple devices in cryptdevice variable

a guest
Sep 20th, 2010
1,267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.36 KB | None | 0 0
  1. # vim: set ft=sh:
  2. # TODO this one needs some work to work with lots of different
  3. #       encryption schemes
  4. run_hook ()
  5. {
  6.  
  7.     /sbin/modprobe -a -q dm-crypt >/dev/null 2>&1
  8.     if [ -e "/sys/class/misc/device-mapper" ]; then
  9.         if [ ! -e "/dev/mapper/control" ]; then
  10.             /bin/mknod "/dev/mapper/control" c $(cat /sys/class/misc/device-mapper/dev | sed 's|:| |')
  11.         fi
  12.         [ "${quiet}" = "y" ] && CSQUIET=">/dev/null"
  13.  
  14.         # Get keyfile if specified
  15.         ckeyfile="/crypto_keyfile.bin"
  16.         if [ "x${cryptkey}" != "x" ]; then
  17.             ckdev="$(echo "${cryptkey}" | cut -d: -f1)"
  18.             ckarg1="$(echo "${cryptkey}" | cut -d: -f2)"
  19.             ckarg2="$(echo "${cryptkey}" | cut -d: -f3)"
  20.             if poll_device "${ckdev}" ${rootdelay}; then
  21.                 case ${ckarg1} in
  22.                     *[!0-9]*)
  23.                         # Use a file on the device
  24.                         # ckarg1 is not numeric: ckarg1=filesystem, ckarg2=path
  25.                         mkdir /ckey
  26.                         mount -r -t ${ckarg1} ${ckdev} /ckey
  27.                         dd if=/ckey/${ckarg2} of=${ckeyfile} >/dev/null 2>&1
  28.                         umount /ckey
  29.                         ;;
  30.                     *)
  31.                         # Read raw data from the block device
  32.                         # ckarg1 is numeric: ckarg1=offset, ckarg2=length
  33.                         dd if=${ckdev} of=${ckeyfile} bs=1 skip=${ckarg1} count=${ckarg2} >/dev/null 2>&1
  34.                         ;;
  35.                 esac
  36.             fi
  37.             [ ! -f ${ckeyfile} ] && echo "Keyfile could not be opened. Reverting to passphrase."
  38.         fi
  39.          
  40.         warn_deprecated() {
  41.             echo "The syntax 'root=${root}' where '${root}' is an encrypted volume is deprecated"
  42.             echo "Use 'cryptdevice=${root}:root root=/dev/mapper/root' instead."
  43.         }
  44.        
  45.         #loop through cryptdevice list (, seperator)
  46.         for singlecryptdevice in $(echo "$cryptdevice" | sed 's/,/\n/g'); do
  47.  
  48.                
  49.             if [ -n "${cryptdevice}" ]; then
  50.                 DEPRECATED_CRYPT=0
  51.                 cryptdev="$(echo "${singlecryptdevice}" | cut -d: -f1)"
  52.                 cryptname="$(echo "${singlecryptdevice}" | cut -d: -f2)"
  53.             else
  54.                 DEPRECATED_CRYPT=1
  55.                 cryptdev="${root}"
  56.                 cryptname="root"
  57.             fi
  58.  
  59.             if  poll_device "${cryptdev}" ${rootdelay}; then
  60.                 if /sbin/cryptsetup isLuks ${cryptdev} >/dev/null 2>&1; then
  61.                     [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated
  62.                     dopassphrase=1
  63.                     # If keyfile exists, try to use that
  64.                     if [ -f ${ckeyfile} ]; then
  65.                         if eval /sbin/cryptsetup --key-file ${ckeyfile} luksOpen ${cryptdev} ${cryptname} ${CSQUIET}; then
  66.                             dopassphrase=0
  67.                         else
  68.                             echo "Invalid keyfile. Reverting to passphrase."
  69.                         fi
  70.                     fi
  71.                     # Ask for a passphrase
  72.                     if [ ${dopassphrase} -gt 0 ]; then
  73.                         echo ""
  74.                         echo "A password is required to access the ${cryptname} volume:"
  75.  
  76.                         #loop until we get a real password
  77.                         while ! eval /sbin/cryptsetup luksOpen ${cryptdev} ${cryptname} ${CSQUIET}; do
  78.                             sleep 2;
  79.                         done
  80.                     fi
  81.                     if [ -e "/dev/mapper/${cryptname}" ]; then
  82.                         if [ ${DEPRECATED_CRYPT} -eq 1 ]; then
  83.                             export root="/dev/mapper/root"
  84.                         fi
  85.                     else
  86.                         err "Password succeeded, but ${cryptname} creation failed, aborting..."
  87.                         exit 1
  88.                     fi
  89.                 elif [ -n "${crypto}" ]; then
  90.                     [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated
  91.                     msg "Non-LUKS encrypted device found..."
  92.                     if [ $# -ne 5 ]; then
  93.                         err "Verify parameter format: crypto=hash:cipher:keysize:offset:skip"
  94.                         err "Non-LUKS decryption not attempted..."
  95.                         return 1
  96.                     fi
  97.                     exe="/sbin/cryptsetup create ${cryptname} ${cryptdev}"
  98.                     tmp=$(echo "${crypto}" | cut -d: -f1)
  99.                     [ -n "${tmp}" ] && exe="${exe} --hash \"${tmp}\""
  100.                     tmp=$(echo "${crypto}" | cut -d: -f2)
  101.                     [ -n "${tmp}" ] && exe="${exe} --cipher \"${tmp}\""
  102.                     tmp=$(echo "${crypto}" | cut -d: -f3)
  103.                     [ -n "${tmp}" ] && exe="${exe} --key-size \"${tmp}\""
  104.                     tmp=$(echo "${crypto}" | cut -d: -f4)
  105.                     [ -n "${tmp}" ] && exe="${exe} --offset \"${tmp}\""
  106.                     tmp=$(echo "${crypto}" | cut -d: -f5)
  107.                     [ -n "${tmp}" ] && exe="${exe} --skip \"${tmp}\""
  108.                     if [ -f ${ckeyfile} ]; then
  109.                         exe="${exe} --key-file ${ckeyfile}"
  110.                     else
  111.                         exe="${exe} --verify-passphrase"
  112.                         echo ""
  113.                         echo "A password is required to access the ${cryptname} volume:"
  114.                     fi
  115.                     eval "${exe} ${CSQUIET}"
  116.  
  117.                     if [ $? -ne 0 ]; then
  118.                         err "Non-LUKS device decryption failed. verify format: "
  119.                         err "      crypto=hash:cipher:keysize:offset:skip"
  120.                         exit 1
  121.                     fi
  122.                     if [ -e "/dev/mapper/${cryptname}" ]; then
  123.                         if [ ${DEPRECATED_CRYPT} -eq 1 ]; then
  124.                             export root="/dev/mapper/root"
  125.                         fi
  126.                     else
  127.                         err "Password succeeded, but ${cryptname} creation failed, aborting..."
  128.                         exit 1
  129.                     fi
  130.                 else
  131.                     err "Failed to open encryption mapping: The device ${cryptdev} is not a LUKS volume and the crypto= paramater was not specified."
  132.                 fi
  133.             fi
  134.             rm -f ${ckeyfile}
  135.            
  136.         done;
  137.     fi
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement