]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
grub-fs-tester: Add LUKS1 and LUKS2 support
authorPierre-Louis Bonicoli <pierre-louis.bonicoli@libregerbil.fr>
Thu, 12 Jan 2023 23:05:10 +0000 (17:05 -0600)
committerDaniel Kiper <daniel.kiper@oracle.com>
Wed, 1 Feb 2023 15:45:21 +0000 (16:45 +0100)
The logical sector size used by LUKS1 is 512 bytes and LUKS2 uses 512 to
4069 bytes. The default password used is "pass", but can be overridden
by setting the PASS environment variable. The device mapper name is set
to the name of the temp directory so that its easy to correlate device
mapper name with a particular test run. Also since this name is unique
per test run, multiple simultaneous test runs are allowed.

Note that cryptsetup is passing the --disable-locks parameter to allow
cryptsetup run successfully when /run/lock/cryptsetup is not accessible.
Since the device mapper name is unique per test run, there is no need to
worry about locking the device to serialize access.

Signed-off-by: Pierre-Louis Bonicoli <pierre-louis.bonicoli@libregerbil.fr>
Tested-by: Glenn Washburn <development@efficientek.com>
Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
.gitignore
Makefile.util.def
tests/luks1_test.in [new file with mode: 0644]
tests/luks2_test.in [new file with mode: 0644]
tests/util/grub-fs-tester.in

index f6a1bd0517526a19ec4f5a493d38752f46a93ffe..4064d3d1ec891ec4947600973d4052c782ba9419 100644 (file)
@@ -230,6 +230,8 @@ widthspec.bin
 /lib/libgcrypt-grub
 /libgrub_a_init.c
 /lzocompress_test
+/luks1_test
+/luks2_test
 /m4/
 /minixfs_test
 /missing
index 22dabba358e3487cd4d6238702126a083e0df729..beaef1168f0d09b0d5766df0551070ec7f9e1da1 100644 (file)
@@ -1225,6 +1225,18 @@ script = {
   common = tests/syslinux_test.in;
 };
 
+script = {
+  testcase = native;
+  name = luks1_test;
+  common = tests/luks1_test.in;
+};
+
+script = {
+  testcase = native;
+  name = luks2_test;
+  common = tests/luks2_test.in;
+};
+
 program = {
   testcase = native;
   name = example_unit_test;
diff --git a/tests/luks1_test.in b/tests/luks1_test.in
new file mode 100644 (file)
index 0000000..cd28fd7
--- /dev/null
@@ -0,0 +1,23 @@
+#!@BUILD_SHEBANG@
+
+set -e
+
+if [ "x$EUID" = "x" ] ; then
+  EUID=`id -u`
+fi
+
+if [ "$EUID" != 0 ] ; then
+   exit 99
+fi
+
+if ! which mkfs.ext2 >/dev/null 2>&1; then
+   echo "mkfs.ext2 not installed; cannot test luks."
+   exit 99
+fi
+
+if ! which cryptsetup >/dev/null 2>&1; then
+   echo "cryptsetup not installed; cannot test luks."
+   exit 99
+fi
+
+"@builddir@/grub-fs-tester" luks1
diff --git a/tests/luks2_test.in b/tests/luks2_test.in
new file mode 100644 (file)
index 0000000..6a26ba6
--- /dev/null
@@ -0,0 +1,23 @@
+#!@BUILD_SHEBANG@
+
+set -e
+
+if [ "x$EUID" = "x" ] ; then
+  EUID=`id -u`
+fi
+
+if [ "$EUID" != 0 ] ; then
+   exit 99
+fi
+
+if ! which mkfs.ext2 >/dev/null 2>&1; then
+   echo "mkfs.ext2 not installed; cannot test luks2."
+   exit 99
+fi
+
+if ! which cryptsetup >/dev/null 2>&1; then
+   echo "cryptsetup not installed; cannot test luks2."
+   exit 99
+fi
+
+"@builddir@/grub-fs-tester" luks2
index 7a48c4399cdb04c2739862bb0ee24edb0c00c8fc..3fbec2c25505e286bff8ec9767d2d843a5a9315a 100644 (file)
@@ -9,6 +9,7 @@ unset SOURCE_DATE_EPOCH
 fs="$1"
 
 GRUBFSTEST="@builddir@/grub-fstest"
+GRUBPROBE="@builddir@/grub-probe"
 
 tempdir=`mktemp -d "${TMPDIR:-/tmp}/${0##*/}.$(date '+%Y%m%d%H%M%S%N').${fs}.XXX"` ||
 { echo "Failed to make temporary directory"; exit 99; }
@@ -16,6 +17,8 @@ tempdir=`mktemp -d "${TMPDIR:-/tmp}/${0##*/}.$(date '+%Y%m%d%H%M%S%N').${fs}.XXX
 # xorriso -as mkisofs options to ignore locale when processing file names and
 # FSLABEL. This is especially needed for the conversion to Joliet UCS-2.
 XORRISOFS_CHARSET="-input-charset UTF-8 -output-charset UTF-8"
+DMNAME="${tempdir##*/}"
+PASS="${PASS:-pass}"
 
 MOUNTS=
 LODEVICES=
@@ -31,6 +34,10 @@ cleanup() {
        umount "$i" || :
     done
 
+    if [ -e /dev/mapper/"$DMNAME" ]; then
+       cryptsetup close --disable-locks "$DMNAME"
+    fi
+
     for lodev in $LODEVICES; do
        local i=600
        while losetup -l -O NAME | grep -q "^$lodev\$"; do
@@ -71,7 +78,12 @@ run_grubfstest () {
        need_images="$need_images $FSIMAGEP${i}.img";
     done
 
-    run_it -c $NEED_IMAGES_N $need_images  "$@"
+    case x"$fs" in
+       xluks*)
+           echo -n "$PASS" | run_it -C -c $NEED_IMAGES_N $need_images  "$@";;
+       *)
+           run_it -c $NEED_IMAGES_N $need_images  "$@";;
+    esac
 }
 
 # OS LIMITATION: GNU/Linux has no AFS support, so we use a premade image and a reference tar file. I.a. no multiblocksize test
@@ -79,6 +91,8 @@ run_grubfstest () {
 MINLOGSECSIZE=9
 MAXLOGSECSIZE=9
 case x"$fs" in
+    xluks2)
+       MAXLOGSECSIZE=12;;
     xntfs*)
        MINLOGSECSIZE=8
        MAXLOGSECSIZE=12;;
@@ -366,7 +380,7 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
                    #FSLABEL="g;/_é莭莽😁кит u"
                    ;;
                # FS LIMITATION: reiserfs, extN and jfs label is at most 16 UTF-8 characters
-               x"reiserfs_old" | x"reiserfs" | x"ext"* | x"lvm"* | x"mdraid"* | x"jfs" | x"jfs_caseins")
+               x"reiserfs_old" | x"reiserfs" | x"ext"* | x"lvm"* | x"luks"* | x"mdraid"* | x"jfs" | x"jfs_caseins")
                    FSLABEL="g;/éт 莭😁";;
                # FS LIMITATION: No underscore, space, semicolon, slash or international characters in UFS* in label. Limited to 32 UTF-8 characters
                x"ufs1" | x"ufs1_sun" | x"ufs2")
@@ -835,6 +849,12 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
                    MOUNTDEVICE="/dev/mapper/grub_test-testvol"
                    MOUNTFS=ext2
                    "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}"  ;;
+               x"luks"*)
+                   echo -n "$PASS" | cryptsetup luksFormat --type "$fs" --sector-size $SECSIZE --pbkdf pbkdf2 --force-password --disable-locks $LODEVICE
+                   echo -n "$PASS" | cryptsetup open --disable-locks $LODEVICE "$DMNAME"
+                   MOUNTDEVICE="/dev/mapper/${DMNAME}"
+                   MOUNTFS=ext2
+                   "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}"  ;;
                xf2fs)
                    "mkfs.f2fs" -l "$FSLABEL" -q "${MOUNTDEVICE}" ;;
                xnilfs2)
@@ -947,6 +967,22 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
                    GRUBDEVICE="mduuid/`mdadm --detail --export $MOUNTDEVICE | grep MD_UUID=|sed 's,MD_UUID=,,g;s,:,,g'`";;
                xlvm*)
                    GRUBDEVICE="lvm/grub_test-testvol";;
+               xluks*)
+                   if test x"$fs" = xluks2 && ! (cryptsetup luksDump --debug-json --disable-locks $LODEVICE | grep -q "\"sector_size\":$SECSIZE"); then
+                           echo "Unexpected sector size for $LODEVICE (expected: $SECSIZE)"
+                           exit 1
+                   fi
+
+                   UUID=$(cryptsetup luksUUID --disable-locks $LODEVICE | tr -d '-')
+                   PROBE_UUID=$("$GRUBPROBE" --device $MOUNTDEVICE --target=cryptodisk_uuid | tr -d '-')
+                   if [ x"$UUID" != x"$PROBE_UUID" ]; then
+                       echo "UUID FAIL"
+                       echo "$UUID"
+                       echo "$PROBE_UUID"
+                       exit 1
+                   fi
+                   GRUBDEVICE="cryptouuid/${UUID}"
+                   ;;
            esac
            GRUBDIR="($GRUBDEVICE)"
            case x"$fs" in
@@ -1105,6 +1141,15 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
                    sleep 1
                    vgchange -a n grub_test
                    ;;
+               xluks*)
+                   for try in $(range 0 20 1); do
+                       if umount "$MNTPOINTRW" ; then
+                           break;
+                       fi
+                   done
+                   UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S")
+                   cryptsetup close --disable-locks "$DMNAME"
+                   ;;
                xmdraid*)
                    sleep 1
                    for try in $(range 0 20 1); do
@@ -1155,6 +1200,11 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
                    mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro
                    MOUNTS="$MOUNTS $MNTPOINTRO"
                    ;;
+               xluks*)
+                   echo -n "$PASS" | cryptsetup open --disable-locks $LODEVICE "$DMNAME"
+                   mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro
+                   MOUNTS="$MOUNTS $MNTPOINTRO"
+                   ;;
                xmdraid*)
                    mdadm --assemble /dev/md/"${fs}_$NDEVICES" $LODEVICES
                    sleep 1
@@ -1603,6 +1653,9 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
                    vgchange -a n grub_test
                    sleep 1
                    ;;
+               xluks*)
+                   cryptsetup close --disable-locks "$DMNAME"
+                   ;;
            esac
            case x"$fs" in
                x"tarfs" | x"cpio_"* | x"iso9660" | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;;