]> git.ipfire.org Git - thirdparty/systemd.git/blame - test/units/testsuite-24.sh
Merge pull request #30284 from YHNdnzj/fstab-wantedby-defaultdeps
[thirdparty/systemd.git] / test / units / testsuite-24.sh
CommitLineData
eb26f34a
FS
1#!/usr/bin/env bash
2# SPDX-License-Identifier: LGPL-2.1-or-later
3set -eux
4set -o pipefail
5
6# TODO:
7# - /proc/cmdline parsing
eb26f34a
FS
8# - expect + interactive auth?
9
10# We set up an encrypted /var partition which should get mounted automatically
11# on boot
12mountpoint /var
13
14systemctl --state=failed --no-legend --no-pager | tee /failed
15if [[ -s /failed ]]; then
16 echo >&2 "Found units in failed state"
17 exit 1
18fi
19
20at_exit() {
21 set +e
22
23 mountpoint -q /proc/cmdline && umount /proc/cmdline
24 rm -f /etc/crypttab
25 [[ -e /tmp/crypttab.bak ]] && cp -fv /tmp/crypttab.bak /etc/crypttab
26 [[ -n "${STORE_LOOP:-}" ]] && losetup -d "$STORE_LOOP"
27 [[ -n "${WORKDIR:-}" ]] && rm -rf "$WORKDIR"
28
29 systemctl daemon-reload
30}
31
32trap at_exit EXIT
33
34cryptsetup_start_and_check() {
35 local expect_fail=0
c9be8e42 36 local umount_header_and_key=0
eb26f34a
FS
37 local ec volume unit
38
39 if [[ "${1:?}" == "-f" ]]; then
40 expect_fail=1
41 shift
42 fi
43
c9be8e42
LB
44 if [[ "${1:?}" == "-u" ]]; then
45 umount_header_and_key=1
46 shift
47 fi
48
eb26f34a
FS
49 for volume in "$@"; do
50 unit="systemd-cryptsetup@$volume.service"
51
52 # The unit existence check should always pass
53 [[ "$(systemctl show -P LoadState "$unit")" == loaded ]]
54 systemctl list-unit-files "$unit"
55
56 systemctl start "$unit" && ec=0 || ec=$?
57 if [[ "$expect_fail" -ne 0 ]]; then
58 if [[ "$ec" -eq 0 ]]; then
59 echo >&2 "Unexpected pass when starting $unit"
60 return 1
61 fi
62
63 return 0
64 fi
65
66 if [[ "$ec" -ne 0 ]]; then
67 echo >&2 "Unexpected fail when starting $unit"
68 return 1
69 fi
70
c9be8e42
LB
71 if [[ "$umount_header_and_key" -ne 0 ]]; then
72 umount "$TMPFS_DETACHED_KEYFILE"
73 umount "$TMPFS_DETACHED_HEADER"
74 udevadm settle --timeout=30
75 fi
76
eb26f34a
FS
77 systemctl status "$unit"
78 test -e "/dev/mapper/$volume"
79 systemctl stop "$unit"
80 test ! -e "/dev/mapper/$volume"
81 done
82
83 return 0
84}
85
86# Note: some stuff (especially TPM-related) is already tested by TEST-70-TPM2,
87# so focus more on other areas instead
88
89# Use a common workdir to make the cleanup easier
90WORKDIR="$(mktemp -d)"
91
92# Prepare a couple of LUKS2-encrypted disk images
93#
94# 1) Image with an empty password
95IMAGE_EMPTY="$WORKDIR/empty.img)"
96IMAGE_EMPTY_KEYFILE="$WORKDIR/empty.keyfile"
97IMAGE_EMPTY_KEYFILE_ERASE="$WORKDIR/empty-erase.keyfile"
98IMAGE_EMPTY_KEYFILE_ERASE_FAIL="$WORKDIR/empty-erase-fail.keyfile)"
99truncate -s 32M "$IMAGE_EMPTY"
100echo -n passphrase >"$IMAGE_EMPTY_KEYFILE"
101chmod 0600 "$IMAGE_EMPTY_KEYFILE"
102cryptsetup luksFormat --batch-mode \
103 --pbkdf pbkdf2 \
104 --pbkdf-force-iterations 1000 \
105 --use-urandom \
106 "$IMAGE_EMPTY" "$IMAGE_EMPTY_KEYFILE"
107PASSWORD=passphrase NEWPASSWORD="" systemd-cryptenroll --password "$IMAGE_EMPTY"
108# Duplicate the key file to test keyfile-erase as well
109cp -v "$IMAGE_EMPTY_KEYFILE" "$IMAGE_EMPTY_KEYFILE_ERASE"
110# The key should get erased even on a failed attempt, so test that too
111cp -v "$IMAGE_EMPTY_KEYFILE" "$IMAGE_EMPTY_KEYFILE_ERASE_FAIL"
112
113# 2) Image with a detached header and a key file offset + size
114IMAGE_DETACHED="$WORKDIR/detached.img"
115IMAGE_DETACHED_KEYFILE="$WORKDIR/detached.keyfile"
116IMAGE_DETACHED_KEYFILE2="$WORKDIR/detached.keyfile2"
117IMAGE_DETACHED_HEADER="$WORKDIR/detached.header"
118truncate -s 32M "$IMAGE_DETACHED"
119dd if=/dev/urandom of="$IMAGE_DETACHED_KEYFILE" count=64 bs=1
120dd if=/dev/urandom of="$IMAGE_DETACHED_KEYFILE2" count=32 bs=1
121chmod 0600 "$IMAGE_DETACHED_KEYFILE" "$IMAGE_DETACHED_KEYFILE2"
122cryptsetup luksFormat --batch-mode \
123 --pbkdf pbkdf2 \
124 --pbkdf-force-iterations 1000 \
125 --use-urandom \
126 --header "$IMAGE_DETACHED_HEADER" \
127 --keyfile-offset 32 \
128 --keyfile-size 16 \
129 "$IMAGE_DETACHED" "$IMAGE_DETACHED_KEYFILE"
130# Also, add a second key file to key slot 8
131# Note: --key-slot= behaves as --new-key-slot= when used alone for backwards compatibility
132cryptsetup luksAddKey --batch-mode \
133 --header "$IMAGE_DETACHED_HEADER" \
134 --key-file "$IMAGE_DETACHED_KEYFILE" \
135 --keyfile-offset 32 \
136 --keyfile-size 16 \
137 --key-slot 8 \
138 "$IMAGE_DETACHED" "$IMAGE_DETACHED_KEYFILE2"
139
140# Prepare a couple of dummy devices we'll store a copy of the detached header
141# and one of the keys on to test if systemd-cryptsetup correctly mounts them
142# when necessary
143STORE_IMAGE="$WORKDIR/store.img"
144truncate -s 64M "$STORE_IMAGE"
145STORE_LOOP="$(losetup --show --find --partscan "$STORE_IMAGE")"
146sfdisk "$STORE_LOOP" <<EOF
147label: gpt
148type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 name=header_store size=32M
149type=0FC63DAF-8483-4772-8E79-3D69D8477DE4 name=keyfile_store
150EOF
151udevadm settle --timeout=30
152mkdir -p /mnt
153mkfs.ext4 -L header_store "/dev/disk/by-partlabel/header_store"
154mount "/dev/disk/by-partlabel/header_store" /mnt
155cp "$IMAGE_DETACHED_HEADER" /mnt/header
156umount /mnt
157mkfs.ext4 -L keyfile_store "/dev/disk/by-partlabel/keyfile_store"
158mount "/dev/disk/by-partlabel/keyfile_store" /mnt
159cp "$IMAGE_DETACHED_KEYFILE2" /mnt/keyfile
160umount /mnt
c9be8e42
LB
161
162# Also copy the key and header on a tmpfs that we will umount after unlocking
163TMPFS_DETACHED_KEYFILE="$(mktemp -d)"
164TMPFS_DETACHED_HEADER="$(mktemp -d)"
165mount -t tmpfs -o size=32M tmpfs "$TMPFS_DETACHED_KEYFILE"
166mount -t tmpfs -o size=32M tmpfs "$TMPFS_DETACHED_HEADER"
167cp "$IMAGE_DETACHED_KEYFILE" "$TMPFS_DETACHED_KEYFILE/keyfile"
168cp "$IMAGE_DETACHED_HEADER" "$TMPFS_DETACHED_HEADER/header"
169
eb26f34a
FS
170udevadm settle --timeout=30
171
172# Prepare our test crypttab
173[[ -e /etc/crypttab ]] && cp -fv /etc/crypttab /tmp/crypttab.bak
174cat >/etc/crypttab <<EOF
175# headless should translate to headless=1
176empty_key $IMAGE_EMPTY $IMAGE_EMPTY_KEYFILE headless,x-systemd.device-timeout=1m
177empty_key_erase $IMAGE_EMPTY $IMAGE_EMPTY_KEYFILE_ERASE headless=1,keyfile-erase=1
178empty_key_erase_fail $IMAGE_EMPTY $IMAGE_EMPTY_KEYFILE_ERASE_FAIL headless=1,keyfile-erase=1,keyfile-offset=4
179# Empty passphrase without try-empty-password(=yes) shouldn't work
180empty_fail0 $IMAGE_EMPTY - headless=1
181empty_fail1 $IMAGE_EMPTY - headless=1,try-empty-password=0
182empty0 $IMAGE_EMPTY - headless=1,try-empty-password
183empty1 $IMAGE_EMPTY - headless=1,try-empty-password=1
184# This one expects the key to be under /{etc,run}/cryptsetup-keys.d/empty_nokey.key
185empty_nokey $IMAGE_EMPTY - headless=1
a3c1b0d7 186empty_pkcs11_auto $IMAGE_EMPTY - headless=1,pkcs11-uri=auto
eb26f34a
FS
187
188detached $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1,header=$IMAGE_DETACHED_HEADER,keyfile-offset=32,keyfile-size=16
189detached_store0 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1,header=/header:LABEL=header_store,keyfile-offset=32,keyfile-size=16
190detached_store1 $IMAGE_DETACHED /keyfile:LABEL=keyfile_store headless=1,header=$IMAGE_DETACHED_HEADER
191detached_store2 $IMAGE_DETACHED /keyfile:LABEL=keyfile_store headless=1,header=/header:LABEL=header_store
192detached_fail0 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1,header=$IMAGE_DETACHED_HEADER,keyfile-offset=32
193detached_fail1 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1,header=$IMAGE_DETACHED_HEADER
194detached_fail2 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1
195detached_fail3 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1,header=$IMAGE_DETACHED_HEADER,keyfile-offset=16,keyfile-size=16
196detached_fail4 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE headless=1,header=$IMAGE_DETACHED_HEADER,keyfile-offset=32,keyfile-size=8
197detached_slot0 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE2 headless=1,header=$IMAGE_DETACHED_HEADER
198detached_slot1 $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE2 headless=1,header=$IMAGE_DETACHED_HEADER,key-slot=8
199detached_slot_fail $IMAGE_DETACHED $IMAGE_DETACHED_KEYFILE2 headless=1,header=$IMAGE_DETACHED_HEADER,key-slot=0
c9be8e42 200detached_nofail $IMAGE_DETACHED $TMPFS_DETACHED_KEYFILE/keyfile headless=1,header=$TMPFS_DETACHED_HEADER/header,keyfile-offset=32,keyfile-size=16,nofail
eb26f34a
FS
201EOF
202
203# Temporarily drop luks.name=/luks.uuid= from the kernel command line, as it makes
204# systemd-cryptsetup-generator ignore mounts from /etc/crypttab that are not also
205# specified on the kernel command line
206sed -r 's/luks.(name|uuid)=[^[:space:]+]//' /proc/cmdline >/tmp/cmdline.tmp
207mount --bind /tmp/cmdline.tmp /proc/cmdline
208# Run the systemd-cryptsetup-generator once explicitly, to collect coverage,
209# as during daemon-reload we run generators in a sandbox
210mkdir -p /tmp/systemd-cryptsetup-generator.out
211/usr/lib/systemd/system-generators/systemd-cryptsetup-generator /tmp/systemd-cryptsetup-generator.out/
212systemctl daemon-reload
213systemctl list-unit-files "systemd-cryptsetup@*"
214
215cryptsetup_start_and_check empty_key
216test -e "$IMAGE_EMPTY_KEYFILE_ERASE"
217cryptsetup_start_and_check empty_key_erase
218test ! -e "$IMAGE_EMPTY_KEYFILE_ERASE"
219test -e "$IMAGE_EMPTY_KEYFILE_ERASE_FAIL"
220cryptsetup_start_and_check -f empty_key_erase_fail
221test ! -e "$IMAGE_EMPTY_KEYFILE_ERASE_FAIL"
222cryptsetup_start_and_check -f empty_fail{0..1}
223cryptsetup_start_and_check empty{0..1}
224# First, check if we correctly fail without any key
225cryptsetup_start_and_check -f empty_nokey
226# And now provide the key via /{etc,run}/cryptsetup-keys.d/
227mkdir -p /run/cryptsetup-keys.d
228cp "$IMAGE_EMPTY_KEYFILE" /run/cryptsetup-keys.d/empty_nokey.key
229cryptsetup_start_and_check empty_nokey
230
a3c1b0d7
VS
231if [[ -r /etc/softhsm2.conf ]]; then
232 # Test unlocking with a PKCS#11 token
233 export SOFTHSM2_CONF="/etc/softhsm2.conf"
234 PIN="1234" systemd-cryptenroll --pkcs11-token-uri="pkcs11:token=TestToken;object=RSATestKey" --unlock-key-file="$IMAGE_EMPTY_KEYFILE" "$IMAGE_EMPTY"
235 cryptsetup_start_and_check empty_pkcs11_auto
236 cryptsetup luksKillSlot -q "$IMAGE_EMPTY" 2
237 cryptsetup token remove --token-id 0 "$IMAGE_EMPTY"
238 PIN="1234" systemd-cryptenroll --pkcs11-token-uri="pkcs11:token=TestToken;object=ECTestKey" --unlock-key-file="$IMAGE_EMPTY_KEYFILE" "$IMAGE_EMPTY"
239 cryptsetup_start_and_check empty_pkcs11_auto
240 cryptsetup luksKillSlot -q "$IMAGE_EMPTY" 2
241 cryptsetup token remove --token-id 0 "$IMAGE_EMPTY"
242fi
243
eb26f34a
FS
244cryptsetup_start_and_check detached
245cryptsetup_start_and_check detached_store{0..2}
246cryptsetup_start_and_check -f detached_fail{0..4}
247cryptsetup_start_and_check detached_slot{0..1}
248cryptsetup_start_and_check -f detached_slot_fail
c9be8e42 249cryptsetup_start_and_check -u detached_nofail
eb26f34a 250
07268394 251touch /testok