Imported Upstream version 2.3.7
[platform/upstream/cryptsetup.git] / tests / tcrypt-compat-test
1 #!/bin/bash
2
3 # check tcrypt images parsing
4
5 [ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".."
6 CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup
7 TST_DIR=tcrypt-images
8 MAP=tctst
9 PASSWORD="aaaaaaaaaaaa"
10 PASSWORD_HIDDEN="bbbbbbbbbbbb"
11 PASSWORD_72C="aaaaaaaaaaaabbbbbbbbbbbbccccccccccccddddddddddddeeeeeeeeeeeeffffffffffff"
12 PIM=1234
13
14 [ -z "$srcdir" ] && srcdir="."
15
16 function remove_mapping()
17 {
18         [ -b /dev/mapper/$MAP ] && dmsetup remove --retry $MAP
19         [ -b /dev/mapper/"$MAP"_1 ] && dmsetup remove --retry "$MAP"_1
20         [ -b /dev/mapper/"$MAP"_2 ] && dmsetup remove --retry "$MAP"_2
21 }
22
23 function fail()
24 {
25         [ -n "$1" ] && echo "$1"
26         echo " [FAILED]"
27         echo "FAILED backtrace:"
28         while caller $frame; do ((frame++)); done
29         remove_mapping
30         exit 2
31 }
32
33 function skip()
34 {
35         [ -n "$1" ] && echo "$1"
36         echo "Test skipped."
37         exit 77
38 }
39
40 function test_one() # cipher mode keysize rm_pattern
41 {
42         $CRYPTSETUP benchmark -c "$1-$2" -s "$3" >/dev/null 2>&1
43         if [ $? -ne 0 ] ; then
44                 echo "$1-$2 [N/A]"
45                 IMGS=$(ls $TST_DIR/[tv]c* | grep "$4")
46                 [ -n "$IMGS" ] && rm $IMGS
47                 #echo $IMGS
48         else
49                 echo "$1-$2 [OK]"
50         fi
51 }
52
53 function test_kdf() # hash
54 {
55         $CRYPTSETUP benchmark -h "$1" >/dev/null 2>&1
56         if [ $? -ne 0 ] ; then
57                 echo "pbkdf2-$1 [N/A]"
58                 IMGS=$(ls $TST_DIR/[tv]c* | grep "$1")
59                 [ -n "$IMGS" ] && rm $IMGS
60         else
61                 echo "pbkdf2-$1 [OK]"
62         fi
63 }
64
65 function test_required()
66 {
67         which lsblk >/dev/null 2>&1 || skip "WARNING: lsblk tool required."
68
69         echo "REQUIRED KDF TEST"
70         test_kdf sha256
71         test_kdf sha512
72         test_kdf ripemd160
73         test_kdf whirlpool
74         test_kdf stribog512
75
76         echo "REQUIRED CIPHERS TEST"
77         test_one aes cbc 256 cbc-aes
78         test_one aes lrw 384 lrw-aes
79         test_one aes xts 512 xts-aes
80
81         test_one twofish ecb 256 twofish
82         test_one twofish cbc 256 cbc-twofish
83         test_one twofish lrw 384 lrw-twofish
84         test_one twofish xts 512 xts-twofish
85
86         test_one serpent ecb 256 serpent
87         test_one serpent cbc 256 cbc-serpent
88         test_one serpent lrw 384 lrw-serpent
89         test_one serpent xts 512 xts-serpent
90
91         test_one blowfish cbc 256 blowfish
92
93         test_one des3_ede cbc 192 des3_ede
94         test_one cast5 cbc 128 cast5
95
96         test_one camellia xts 512 camellia
97         test_one kuznyechik xts 512 kuznyechik
98
99         ls $TST_DIR/[tv]c* >/dev/null 2>&1 || skip "No remaining images."
100 }
101
102 export LANG=C
103 [ ! -d $TST_DIR ] && tar xJf $srcdir/tcrypt-images.tar.xz --no-same-owner
104 test_required
105
106 echo "HEADER CHECK"
107 for file in $(ls $TST_DIR/[tv]c_* $TST_DIR/vcpim_* $TST_DIR/sys_[tv]c_*) ; do
108         echo -n " $file"
109         PIM_OPT=""
110         [[ $file =~ vcpim.* ]] && PIM_OPT="--veracrypt-pim $PIM"
111         SYS_OPT=""
112         [[ $file =~ sys_.* ]] && SYS_OPT="--tcrypt-system"
113         echo $PASSWORD | $CRYPTSETUP tcryptDump --veracrypt $SYS_OPT $PIM_OPT $file >/dev/null || fail
114         echo " [OK]"
115 done
116
117 echo "HEADER CHECK (HIDDEN)"
118 for file in $(ls $TST_DIR/[tv]c_*-hidden) ; do
119         echo -n " $file (hidden)"
120         echo $PASSWORD_HIDDEN | $CRYPTSETUP tcryptDump --tcrypt-hidden --veracrypt $file >/dev/null || fail
121         echo " [OK]"
122 done
123
124 echo "HEADER KEYFILES CHECK"
125 for file in $(ls $TST_DIR/[tv]ck_*) ; do
126         echo -n " $file"
127         PWD=$PASSWORD
128         [[ $file =~ vck_1_nopw.* ]] && PWD=""
129         [[ $file =~ vck_1_pw72.* ]] && PWD=$PASSWORD_72C
130         echo $PWD | $CRYPTSETUP tcryptDump --veracrypt -d $TST_DIR/keyfile1 -d $TST_DIR/keyfile2 $file >/dev/null || fail
131         echo " [OK]"
132 done
133
134
135 if [ $(id -u) != 0 ]; then
136         echo "WARNING: You must be root to run activation part of test, test skipped."
137         exit 0
138 fi
139
140 echo "ACTIVATION FS UUID CHECK"
141 for file in $(ls $TST_DIR/[tv]c_* $TST_DIR/vcpim_* $TST_DIR/sys_[tv]c_*) ; do
142         echo -n " $file"
143         PIM_OPT=""
144         [[ $file =~ vcpim.* ]] && PIM_OPT="--veracrypt-pim $PIM"
145         SYS_OPT=""
146         [[ $file =~ sys_.* ]] && SYS_OPT="--tcrypt-system"
147         out=$(echo $PASSWORD | $CRYPTSETUP tcryptOpen --veracrypt $SYS_OPT $PIM_OPT -r $file $MAP 2>&1)
148         ret=$?
149         [ $ret -eq 1 ] && ( echo "$out" | grep -q -e "TCRYPT legacy mode" ) && echo " [N/A]" && continue
150         [ $ret -eq 1 ] && ( echo "$out" | grep -q -e "TCRYPT compatible mapping" ) && echo " [N/A]" && continue
151         [ $ret -ne 0 ] && fail
152         $CRYPTSETUP status $MAP >/dev/null || fail
153         $CRYPTSETUP status /dev/mapper/$MAP >/dev/null || fail
154         UUID=$(lsblk -n -o UUID /dev/mapper/$MAP)
155         $CRYPTSETUP remove $MAP || fail
156         [ "$UUID" != "DEAD-BABE" ] && fail "UUID check failed."
157         echo " [OK]"
158 done
159
160 echo "ACTIVATION FS UUID (HIDDEN) CHECK"
161 for file in $(ls $TST_DIR/[tv]c_*-hidden) ; do
162         echo -n " $file"
163         out=$(echo $PASSWORD_HIDDEN | $CRYPTSETUP tcryptOpen --veracrypt -r $file $MAP --tcrypt-hidden 2>&1)
164         ret=$?
165         [ $ret -eq 1 ] && ( echo "$out" | grep -q -e "TCRYPT legacy mode" ) && echo " [N/A]" && continue
166         [ $ret -eq 1 ] && ( echo "$out" | grep -q -e "TCRYPT compatible mapping" ) && echo " [N/A]" && continue
167         [ $ret -ne 0 ] && fail
168         UUID=$(lsblk -n -o UUID /dev/mapper/$MAP)
169         $CRYPTSETUP remove $MAP || fail
170         [ "$UUID" != "CAFE-BABE" ] && fail "UUID check failed."
171         echo " [OK]"
172 done