e92fe193b790e1b2b47bd651e1dd5b477ba84ab2
[platform/upstream/cryptsetup.git] / tests / compat-test
1 #!/bin/bash
2
3 CRYPTSETUP=../src/cryptsetup
4
5 DEV_NAME=dummy
6 DEV_NAME2=dummy2
7 ORIG_IMG=luks-test-orig
8 IMG=luks-test
9 KEY1=key1
10 KEY2=key2
11
12 LUKS_HEADER="S0-5 S6-7 S8-39 S40-71 S72-103 S104-107 S108-111 R112-131 R132-163 S164-167 S168-207 A0-591"
13 KEY_SLOT0="S208-211 S212-215 R216-247 A248-251 A251-255"
14 KEY_MATERIAL0="R4096-68096"
15 KEY_MATERIAL0_EXT="R4096-68096"
16
17 KEY_SLOT1="S256-259 S260-263 R264-295 A296-299 A300-303"
18 KEY_MATERIAL1="R69632-133632"
19 KEY_MATERIAL1_EXT="S69632-133632"
20
21 TEST_UUID="12345678-1234-1234-1234-123456789abc"
22
23 LOOPDEV=$(losetup -f 2>/dev/null)
24
25 function remove_mapping()
26 {
27         [ -b /dev/mapper/$DEV_NAME2 ] && dmsetup remove $DEV_NAME2
28         [ -b /dev/mapper/$DEV_NAME ] && dmsetup remove $DEV_NAME
29         losetup -d $LOOPDEV >/dev/null 2>&1
30         rm -f $ORIG_IMG $IMG $KEY1 $KEY2 >/dev/null 2>&1
31 }
32
33 function fail()
34 {
35         remove_mapping
36         echo "FAILED"
37         exit 2
38 }
39
40 function skip()
41 {
42         [ -n "$1" ] && echo "$1"
43         exit 0
44 }
45
46 function prepare()
47 {
48         [ -b /dev/mapper/$DEV_NAME ] && dmsetup remove $DEV_NAME
49
50         case "$2" in
51         wipe)
52                 remove_mapping
53                 dd if=/dev/zero of=$IMG bs=1k count=10000 >/dev/null 2>&1
54                 sync
55                 losetup $LOOPDEV $IMG
56                 ;;
57         new)
58                 remove_mapping
59                 bzip2 -cd compatimage.img.bz2 > $IMG
60                 losetup $LOOPDEV $IMG
61                 ;;
62         reuse | *)
63                 if [ ! -e $IMG ]; then
64                         bzip2 -cd compatimage.img.bz2 > $IMG
65                         losetup $LOOPDEV $IMG
66                 fi
67                 ;;
68         esac
69
70         if [ ! -e $KEY1 ]; then
71                 dd if=/dev/urandom of=$KEY1 count=1 bs=32 >/dev/null 2>&1
72         fi
73
74         if [ ! -e $KEY2 ]; then
75                 dd if=/dev/urandom of=$KEY2 count=1 bs=16 >/dev/null 2>&1
76         fi
77
78         cp $IMG $ORIG_IMG
79         [ -n "$1" ] && echo "CASE: $1"
80 }
81
82 function check()
83 {
84         sync
85         [ -z "$1" ] && return
86         ./differ $ORIG_IMG $IMG $1 || fail
87 }
88
89 function check_exists()
90 {
91         [ -b /dev/mapper/$DEV_NAME ] || fail
92         check $1
93 }
94
95 [ $(id -u) != 0 ] && skip "WARNING: You must be root to run this test, test skipped."
96 [ -z "$LOOPDEV" ] && skip "Cannot find free loop device, test skipped."
97
98 # LUKS tests
99
100 prepare "[1] open - compat image - acceptance check" new
101 echo "compatkey" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME || fail
102 check_exists
103
104 prepare "[2] open - compat image - denial check" new
105 echo "wrongkey" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME 2>/dev/null && fail
106 check
107
108 # All headers items and first key material section must change
109 prepare "[3] format" wipe
110 echo "key0" | $CRYPTSETUP -i 1000 -c aes-cbc-essiv:sha256 -s 128 luksFormat $LOOPDEV || fail
111 check "$LUKS_HEADER $KEY_SLOT0 $KEY_MATERIAL0"
112
113 prepare "[4] format using hash sha512" wipe
114 echo "key0" | $CRYPTSETUP -i 1000 -h sha512 -c aes-cbc-essiv:sha256 -s 128 luksFormat $LOOPDEV || fail
115 check "$LUKS_HEADER $KEY_SLOT0 $KEY_MATERIAL0"
116
117 prepare "[5] open"
118 echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME || fail
119 check_exists
120
121 # Key Slot 1 and key material section 1 must change, the rest must not.
122 prepare "[6] add key"
123 echo -e "key0\nkey1" | $CRYPTSETUP luksAddKey $LOOPDEV || fail
124 check "$KEY_SLOT1 $KEY_MATERIAL1"
125 echo "key1" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME || fail
126
127 # Unsuccessful Key Delete - nothing may change
128 prepare "[7] unsuccessful delete"
129 echo "invalid" | $CRYPTSETUP luksKillSlot $LOOPDEV 1 2>/dev/null && fail
130 check
131
132 # Delete Key Test
133 # Key Slot 1 and key material section 1 must change, the rest must not
134 prepare "[8] successful delete"
135 $CRYPTSETUP -q luksKillSlot $LOOPDEV 1 || fail
136 check "$KEY_SLOT1 $KEY_MATERIAL1_EXT"
137 echo "key1" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME 2> /dev/null && fail
138 echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME || fail
139
140 # Key Slot 1 and key material section 1 must change, the rest must not
141 prepare "[9] add key test for key files"
142 echo "key0" | $CRYPTSETUP luksAddKey $LOOPDEV $KEY1 || fail
143 check "$KEY_SLOT1 $KEY_MATERIAL1"
144 $CRYPTSETUP -d $KEY1 luksOpen $LOOPDEV $DEV_NAME || fail
145
146 # Key Slot 1 and key material section 1 must change, the rest must not
147 prepare "[10] delete key test with key1 as remaining key"
148 $CRYPTSETUP -d $KEY1 luksKillSlot $LOOPDEV 0 || fail
149 check "$KEY_SLOT0 $KEY_MATERIAL0_EXT"
150 echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME 2>/dev/null && fail
151 $CRYPTSETUP luksOpen -d $KEY1 $LOOPDEV $DEV_NAME || fail
152
153 # Delete last slot
154 prepare "[11] delete last key" wipe
155 echo "key0" | $CRYPTSETUP luksFormat $LOOPDEV || fail
156 echo "key0" | $CRYPTSETUP luksKillSlot $LOOPDEV 0 || fail
157 echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME 2>/dev/null && fail
158
159 # Format test for ESSIV, and some other parameters.
160 prepare "[12] parameter variation test" wipe
161 $CRYPTSETUP -q -i 1000 -c aes-cbc-essiv:sha256 -s 128 luksFormat $LOOPDEV $KEY1 || fail
162 check "$LUKS_HEADER $KEY_SLOT0 $KEY_MATERIAL0"
163 $CRYPTSETUP -d $KEY1 luksOpen $LOOPDEV $DEV_NAME || fail
164
165 prepare "[13] open/close - stacked devices" wipe
166 echo "key0" | $CRYPTSETUP -q luksFormat $LOOPDEV || fail
167 echo "key0" | $CRYPTSETUP -q luksOpen $LOOPDEV $DEV_NAME || fail
168 echo "key0" | $CRYPTSETUP -q luksFormat /dev/mapper/$DEV_NAME || fail
169 echo "key0" | $CRYPTSETUP -q luksOpen /dev/mapper/$DEV_NAME $DEV_NAME2 || fail
170 $CRYPTSETUP -q luksClose  $DEV_NAME2 || fail
171 $CRYPTSETUP -q luksClose  $DEV_NAME || fail
172
173 prepare "[14] format/open - passphrase on stdin & new line" wipe
174 # stdin defined by "-" must take even newline
175 #echo -n $'foo\nbar' | $CRYPTSETUP -q luksFormat $LOOPDEV - || fail
176 echo -n $'foo\nbar' | $CRYPTSETUP -q --key-file=- luksFormat $LOOPDEV || fail
177 echo -n $'foo\nbar' | $CRYPTSETUP -q --key-file=- luksOpen $LOOPDEV $DEV_NAME || fail
178 $CRYPTSETUP -q luksClose  $DEV_NAME || fail
179 echo -n $'foo\nbar' | $CRYPTSETUP -q luksOpen $LOOPDEV $DEV_NAME 2>/dev/null && fail
180 # now also try --key-file
181 echo -n $'foo\nbar' | $CRYPTSETUP -q luksFormat $LOOPDEV --key-file=- || fail
182 echo -n $'foo\nbar' | $CRYPTSETUP -q --key-file=- luksOpen $LOOPDEV $DEV_NAME || fail
183 $CRYPTSETUP -q luksClose  $DEV_NAME || fail
184 # process newline if from stdin
185 echo -n $'foo\nbar' | $CRYPTSETUP -q luksFormat $LOOPDEV || fail
186 echo 'foo' | $CRYPTSETUP -q luksOpen $LOOPDEV $DEV_NAME || fail
187 $CRYPTSETUP -q luksClose  $DEV_NAME || fail
188
189 prepare "[15] UUID - use and report provided UUID" wipe
190 echo "key0" | $CRYPTSETUP -q luksFormat --uuid blah $LOOPDEV 2>/dev/null && fail
191 echo "key0" | $CRYPTSETUP -q luksFormat --uuid $TEST_UUID $LOOPDEV || fail
192 tst=$($CRYPTSETUP -q luksUUID $LOOPDEV)
193 [ "$tst"x = "$TEST_UUID"x ] || fail
194 echo "key0" | $CRYPTSETUP -q luksFormat $LOOPDEV || fail
195 $CRYPTSETUP -q luksUUID --uuid $TEST_UUID $LOOPDEV || fail
196 tst=$($CRYPTSETUP -q luksUUID $LOOPDEV)
197 [ "$tst"x = "$TEST_UUID"x ] || fail
198
199 prepare "[16] luksFormat" wipe
200 echo "key0" | $CRYPTSETUP -q luksFormat --master-key-file /dev/urandom $LOOPDEV || fail
201 echo "key0" | $CRYPTSETUP -q luksFormat --master-key-file /dev/urandom $LOOPDEV -d $KEY1 || fail
202 $CRYPTSETUP -q luksFormat --master-key-file /dev/urandom -s 256 --uuid $TEST_UUID $LOOPDEV $KEY1 || fail
203 $CRYPTSETUP luksOpen -d $KEY1 $LOOPDEV $DEV_NAME || fail
204 $CRYPTSETUP -q luksClose  $DEV_NAME || fail
205
206 prepare "[17] AddKey volume key, passphrase and keyfile" wipe
207 # masterkey
208 echo "key0" | $CRYPTSETUP -q luksFormat $LOOPDEV --master-key-file /dev/zero --key-slot 3 || fail
209 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 3: ENABLED" || fail
210 echo "key1" | $CRYPTSETUP luksAddKey $LOOPDEV --master-key-file /dev/zero --key-slot 4 || fail
211 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 4: ENABLED" || fail
212 echo "key2" | $CRYPTSETUP luksAddKey $LOOPDEV --master-key-file /dev/null --key-slot 5 2>/dev/null && fail
213 # [0]key0 [1]key1 [2]$KEY1/1 [3]$KEY1 [4]$KEY2
214 $CRYPTSETUP -q luksFormat $LOOPDEV $KEY1 --key-slot 3 || fail
215 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 3: ENABLED" || fail
216 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 --key-slot 3 2>/dev/null && fail
217 # keyfile/keyfile
218 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 --key-slot 4 || fail
219 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 4: ENABLED" || fail
220 # passphrase/keyfile
221 echo "key0" | $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 --key-slot 0 || fail
222 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 0: ENABLED" || fail
223 # passphrase/passphrase
224 echo -e "key0\nkey1\n" | $CRYPTSETUP luksAddKey $LOOPDEV --key-slot 1 || fail
225 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 1: ENABLED" || fail
226 # keyfile/passphrase
227 echo -e "key1\n" | $CRYPTSETUP luksAddKey $LOOPDEV $KEY1 --key-slot 2 --new-keyfile-size 1 || fail
228 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 2: ENABLED" || fail
229
230 prepare "[18] RemoveKey passphrase and keyfile" reuse
231 $CRYPTSETUP luksRemoveKey $LOOPDEV $KEY1 || fail
232 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 3: DISABLED" || fail
233 $CRYPTSETUP luksRemoveKey $LOOPDEV $KEY1 2>/dev/null && fail
234 $CRYPTSETUP luksRemoveKey $LOOPDEV $KEY2 --keyfile-size 1 2>/dev/null && fail
235 $CRYPTSETUP luksRemoveKey $LOOPDEV $KEY2 || fail
236 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 4: DISABLED" || fail
237 # kill slot using passphrase from 1
238 echo "key1" | $CRYPTSETUP luksKillSlot $LOOPDEV 2 || fail
239 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 2: DISABLED" || fail
240 # remove key0 / slot 0
241 echo "key0" | $CRYPTSETUP luksRemoveKey $LOOPDEV || fail
242 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 0: DISABLED" || fail
243 # last keyslot, in batch mode no passphrase needed...
244 $CRYPTSETUP luksKillSlot -q $LOOPDEV 1 || fail
245 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 1: DISABLED" || fail
246
247 prepare "[19] create & status & resize" wipe
248 echo "key0" | $CRYPTSETUP create $DEV_NAME $LOOPDEV --hash xxx 2>/dev/null && fail
249 echo "key0" | $CRYPTSETUP create $DEV_NAME $LOOPDEV --hash sha1 --cipher aes-cbc-essiv:sha256 --offset 3 --skip 4 --readonly || fail
250 $CRYPTSETUP -q status  $DEV_NAME | grep "offset:" | grep -q "3 sectors" || fail
251 $CRYPTSETUP -q status  $DEV_NAME | grep "skipped:" | grep -q "4 sectors" || fail
252 $CRYPTSETUP -q status  $DEV_NAME | grep "mode:" | grep -q "readonly" || fail
253 $CRYPTSETUP -q resize  $DEV_NAME --size 100 || fail
254 $CRYPTSETUP -q status  $DEV_NAME | grep "size:" | grep -q "100 sectors" || fail
255 $CRYPTSETUP -q resize  $DEV_NAME || fail
256 $CRYPTSETUP -q status  $DEV_NAME | grep "size:" | grep -q "19997 sectors" || fail
257 $CRYPTSETUP -q remove  $DEV_NAME || fail
258 echo "key0" | $CRYPTSETUP create $DEV_NAME --hash sha1 $LOOPDEV || fail
259 $CRYPTSETUP -q remove  $DEV_NAME || fail
260 echo "key0" | $CRYPTSETUP -q create $DEV_NAME --hash sha1 $LOOPDEV || fail
261 $CRYPTSETUP -q remove  $DEV_NAME || fail
262 # verify is ignored on non-tty input
263 echo "key0" | $CRYPTSETUP create $DEV_NAME $LOOPDEV --hash sha1 --verify-passphrase || fail
264 $CRYPTSETUP -q remove  $DEV_NAME || fail
265 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d $KEY1 --key-size 255 2>/dev/null && fail
266 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d $KEY1  || fail
267 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d $KEY1 2>/dev/null && fail
268 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d blah 2>/dev/null && fail
269 $CRYPTSETUP -q remove  $DEV_NAME || fail
270 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d /dev/urandom || fail
271 $CRYPTSETUP -q remove  $DEV_NAME || fail
272
273 prepare "[20] Disallow open/create if already mapped." wipe
274 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d $KEY1 || fail
275 $CRYPTSETUP create $DEV_NAME $LOOPDEV -d $KEY1 2>/dev/null && fail
276 $CRYPTSETUP create $DEV_NAME2 $LOOPDEV -d $KEY1 2>/dev/null && fail
277 echo "key0" | $CRYPTSETUP -q luksFormat $LOOPDEV 2>/dev/null && fail
278 $CRYPTSETUP remove  $DEV_NAME || fail
279 echo "key0" | $CRYPTSETUP -q luksFormat $LOOPDEV || fail
280 echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME || fail
281 echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME2 2>/dev/null && fail
282 $CRYPTSETUP  luksClose  $DEV_NAME || fail
283
284 prepare "[21] luksDump" wipe
285 echo "key0" | $CRYPTSETUP -q luksFormat --uuid $TEST_UUID $LOOPDEV $KEY1 || fail
286 echo "key0" | $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 || fail
287 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 0: ENABLED" || fail
288 $CRYPTSETUP luksDump $LOOPDEV | grep -q $TEST_UUID || fail
289 echo "bad" | $CRYPTSETUP luksDump $LOOPDEV --dump-master-key 2>/dev/null && fail
290 echo "key0" | $CRYPTSETUP luksDump $LOOPDEV --dump-master-key | grep -q "MK dump:" || fail
291 $CRYPTSETUP luksDump -q $LOOPDEV --dump-master-key -d $KEY1 | grep -q "MK dump:" || fail
292
293 prepare "[22] remove disappeared device" wipe
294 dmsetup create $DEV_NAME --table "0 5000 linear $LOOPDEV 2" || fail
295 echo "key0" | $CRYPTSETUP -q -i 0 luksFormat /dev/mapper/$DEV_NAME || fail
296 echo "key0" | $CRYPTSETUP -q luksOpen /dev/mapper/$DEV_NAME $DEV_NAME2 || fail
297 # underlying device now returns error but node is still present
298 dmsetup load $DEV_NAME --table "0 5000 error" || fail
299 dmsetup resume $DEV_NAME || fail
300 $CRYPTSETUP -q luksClose $DEV_NAME2 || fail
301 dmsetup remove $DEV_NAME || fail
302
303 prepare "[23] ChangeKey passphrase and keyfile" wipe
304 # [0]$KEY1 [1]key0
305 $CRYPTSETUP -q luksFormat $LOOPDEV $KEY1 --key-slot 0 || fail
306 echo "key0" | $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 --key-slot 1 || fail
307 # keyfile [0] / keyfile [0]
308 $CRYPTSETUP luksChangeKey $LOOPDEV -d $KEY1 $KEY2 --key-slot 0 || fail
309 # passphrase [1] / passphrase [1]
310 echo -e "key0\nkey1\n" | $CRYPTSETUP luksChangeKey $LOOPDEV --key-slot 1 || fail
311 # keyfile [0] / keyfile [new]
312 $CRYPTSETUP luksChangeKey $LOOPDEV -d $KEY2 $KEY1 || fail
313 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 0: DISABLED" || fail
314 # passphrase [1] / passphrase [new]
315 echo -e "key1\nkey0\n" | $CRYPTSETUP luksChangeKey $LOOPDEV || fail
316 $CRYPTSETUP luksDump $LOOPDEV | grep -q "Key Slot 1: DISABLED" || fail
317 # use all slots
318 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 -i 1 || fail
319 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 -i 1 || fail
320 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 -i 1 || fail
321 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 -i 1 || fail
322 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 -i 1 || fail
323 $CRYPTSETUP luksAddKey $LOOPDEV -d $KEY1 $KEY2 -i 1 || fail
324 # still allows replace
325 $CRYPTSETUP luksChangeKey $LOOPDEV -d $KEY1 $KEY2 || fail
326 $CRYPTSETUP luksChangeKey $LOOPDEV -d $KEY1 $KEY2 2>/dev/null && fail
327
328 remove_mapping
329 exit 0