summaryrefslogtreecommitdiffstats
path: root/tests/luks1-compat-test
blob: c0de983ec8cee9120c52cd600453603b7772963e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash

[ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".."
CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup
TST_DIR=luks1-images
MAP=luks1tst
KEYFILE=keyfile1

if [ -n "$CRYPTSETUP_TESTS_RUN_IN_MESON" ]; then
	CRYPTSETUP_VALGRIND=$CRYPTSETUP
else
	CRYPTSETUP_VALGRIND=../.libs/cryptsetup
	CRYPTSETUP_LIB_VALGRIND=../.libs
fi

[ -z "$srcdir" ] && srcdir="."

function remove_mapping()
{
	[ -b /dev/mapper/$MAP ] && dmsetup remove --retry $MAP
	rm -rf $TST_DIR
}

function fail()
{
	[ -n "$1" ] && echo "$1"
	echo " [FAILED]"
	echo "FAILED backtrace:"
	while caller $frame; do ((frame++)); done
	remove_mapping
	exit 2
}

function skip()
{
	[ -n "$1" ] && echo "$1"
	remove_mapping
	exit 77
}

function valgrind_setup()
{
	command -v valgrind >/dev/null || fail "Cannot find valgrind."
	[ ! -f $CRYPTSETUP_VALGRIND ] && fail "Unable to get location of cryptsetup executable."
	[ ! -f valg.sh ] && fail "Unable to get location of valg runner script."
	if [ -z "$CRYPTSETUP_TESTS_RUN_IN_MESON" ]; then
		export LD_LIBRARY_PATH="$CRYPTSETUP_LIB_VALGRIND:$LD_LIBRARY_PATH"
	fi
}

function valgrind_run()
{
	INFOSTRING="$(basename ${BASH_SOURCE[1]})-line-${BASH_LINENO[0]}" ./valg.sh ${CRYPTSETUP_VALGRIND} "$@"
}

function remove_imgs()
{
	echo "WARNING: $1 not available, not testing some images."
	rm $(ls $TST_DIR/*$1*.img)
}

function test_one()
{
	$CRYPTSETUP benchmark -c "$1" -s "$2" | grep -v "#" || remove_imgs $1
}

function test_required()
{
	echo "REQUIRED KDF TEST"
	$CRYPTSETUP benchmark -h whirlpool | grep "N/A" && remove_imgs whirlpool

	echo "REQUIRED CIPHERS TEST"
	echo "#     Algorithm | Key |  Encryption |  Decryption"

	test_one aes-xts 256
	test_one twofish-xts 256
	test_one serpent-xts 256
	test_one aes-cbc 256
	test_one aes-lrw 256
}

export LANG=C
[ ! -x "$CRYPTSETUP" ] && skip "Cannot find $CRYPTSETUP, test skipped."
command -v blkid >/dev/null || skip "blkid tool required, test skipped."
[ -n "$VALG" ] && valgrind_setup && CRYPTSETUP=valgrind_run
[ ! -d $TST_DIR ] && tar xJf $srcdir/luks1-images.tar.xz --no-same-owner
test_required

echo "PASSPHRASE CHECK"
for file in $(ls $TST_DIR/luks1_*) ; do
	echo -n " $file"
	$CRYPTSETUP luksOpen -d $TST_DIR/$KEYFILE $file --test-passphrase 2>/dev/null
	ret=$?
	# ignore missing whirlpool (pwd failed is exit code 2)
	[ $ret -eq 1 ] && (echo $file | grep -q -e "whirlpool") && echo " [N/A]" && continue
	# ignore flawed whirlpool (pwd failed is exit code 2)
	[ $ret -eq 2 ] && (echo $file | grep -q -e "whirlpool") && \
		($CRYPTSETUP luksDump $file --debug | grep -q -e "flawed whirlpool") && \
		echo " [IGNORED (flawed Whirlpool library)]" && continue
	[ $ret -ne 0 ] && fail
	echo " [OK]"
done

if [ $(id -u) != 0 ]; then
	echo "WARNING: You must be root to run activation part of test, test skipped."
	remove_mapping
	exit 0
fi

echo "ACTIVATION FS UUID CHECK"
for file in $(ls $TST_DIR/luks1_*) ; do
	echo -n " $file"
	$CRYPTSETUP luksOpen -d $TST_DIR/$KEYFILE $file $MAP 2>/dev/null
	ret=$?
	# ignore missing whirlpool (pwd failed is exit code 2)
	[ $ret -eq 1 ] && (echo $file | grep -q -e "whirlpool") && echo " [N/A]" && continue
	# ignore flawed whirlpool (pwd failed is exit code 2)
	[ $ret -eq 2 ] && (echo $file | grep -q -e "whirlpool") && \
		($CRYPTSETUP luksDump $file --debug | grep -q -e "flawed whirlpool") && \
		echo " [IGNORED (flawed Whirlpool library)]" && continue
	[ $ret -ne 0 ] && fail
	$CRYPTSETUP status $MAP >/dev/null || fail
	$CRYPTSETUP status /dev/mapper/$MAP >/dev/null || fail
	UUID=$(blkid -p -o value -s UUID /dev/mapper/$MAP)
	$CRYPTSETUP remove $MAP || fail
	[ "$UUID" != "DEAD-BABE" ] && fail "UUID check failed."
	echo " [OK]"
done

remove_mapping
exit 0