Makefile: Add security compiling option (RELRO, SC, and FORTIFY)
[platform/upstream/cryptsetup.git] / tests / align-test2
1 #!/bin/bash
2
3 [ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".."
4 CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup
5 DEV=""
6 DEV_STACKED="luks0xbabe"
7 DEV_NAME="dummyalign"
8 HDR="test_luks2_hdr"
9 MNT_DIR="./mnt_luks"
10 PWD1="93R4P4pIqAH8"
11 PWD2="mymJeD8ivEhE"
12 FAST_PBKDF="--pbkdf pbkdf2 --pbkdf-force-iterations 1000"
13
14 CRYPTSETUP_VALGRIND=../.libs/cryptsetup
15 CRYPTSETUP_LIB_VALGRIND=../.libs
16
17 cleanup() {
18         udevadm settle >/dev/null 2>&1
19         if [ -d "$MNT_DIR" ] ; then
20                 umount -f $MNT_DIR 2>/dev/null
21                 rmdir $MNT_DIR 2>/dev/null
22         fi
23         [ -b /dev/mapper/$DEV_STACKED ] && dmsetup remove --retry $DEV_STACKED >/dev/null 2>&1
24         [ -b /dev/mapper/$DEV_NAME ] && dmsetup remove --retry $DEV_NAME >/dev/null 2>&1
25         # FIXME scsi_debug sometimes in-use here
26         sleep 1
27         rmmod scsi_debug >/dev/null 2>&1
28         sleep 1
29         rm -f $HDR 2>/dev/null
30 }
31
32 fail()
33 {
34         if [ -n "$1" ] ; then echo "FAIL $1" ; fi
35         echo "FAILED backtrace:"
36         while caller $frame; do ((frame++)); done
37         cleanup
38         exit 100
39 }
40
41 skip()
42 {
43         echo "TEST SKIPPED: $1"
44         cleanup
45         exit 77
46 }
47
48 function valgrind_setup()
49 {
50         command -v valgrind >/dev/null || fail "Cannot find valgrind."
51         [ ! -f $CRYPTSETUP_VALGRIND ] && fail "Unable to get location of cryptsetup executable."
52         export LD_LIBRARY_PATH="$CRYPTSETUP_LIB_VALGRIND:$LD_LIBRARY_PATH"
53 }
54
55 function valgrind_run()
56 {
57         INFOSTRING="$(basename ${BASH_SOURCE[1]})-line-${BASH_LINENO[0]}" ./valg.sh ${CRYPTSETUP_VALGRIND} "$@"
58 }
59
60 function dm_crypt_features()
61 {
62         VER_STR=$(dmsetup targets | grep crypt | cut -f2 -dv)
63         [ -z "$VER_STR" ] && fail "Failed to parse dm-crypt version."
64
65         VER_MAJ=$(echo $VER_STR | cut -f 1 -d.)
66         VER_MIN=$(echo $VER_STR | cut -f 2 -d.)
67         VER_PTC=$(echo $VER_STR | cut -f 3 -d.)
68
69         [ $VER_MAJ -lt 1 ] && return
70         [ $VER_MAJ -gt 1 ] && {
71                 DM_PERF_CPU=1
72                 DM_SECTOR_SIZE=1
73                 return
74         }
75
76         [ $VER_MIN -lt 14 ] && return
77         DM_PERF_CPU=1
78         if [ $VER_MIN -ge 17 ]; then
79                 DM_SECTOR_SIZE=1
80         fi
81 }
82
83 add_device() {
84         modprobe scsi_debug $@ delay=0 >/dev/null 2>&1
85         if [ $? -ne 0 ] ; then
86                 echo "This kernel seems to not support proper scsi_debug module, test skipped."
87                 exit 77
88         fi
89
90         sleep 2
91         DEV=$(grep -l -e scsi_debug /sys/block/*/device/model | cut -f4 -d /)
92
93         if [ ! -e /sys/block/$DEV/alignment_offset ] ; then
94                 echo "This kernel seems to not support topology info, test skipped."
95                 cleanup
96                 exit 77
97         fi
98
99         DEV="/dev/$DEV"
100         [ -b $DEV ] || fail "Cannot find $DEV."
101 }
102
103 format() # expected [forced] [encryption_sector_size]
104 {
105         local _sec_size=512
106
107         local _exp=$1
108
109         if [ "${2:0:1}" = "s" ]; then
110                 _sec_size=${2:1}
111                 shift
112         fi
113
114         test "${3:0:1}" = "s" && _sec_size=${3:1}
115
116         test $_sec_size -eq 512 || local _smsg=" (encryption sector size $_sec_size)"
117
118         if [ -z "$2" ] ; then
119                 echo -n "Formatting using topology info$_smsg..."
120                 echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $DEV -q -c aes-cbc-essiv:sha256 --sector-size $_sec_size >/dev/null 2>&1 || fail
121         else
122                 echo -n "Formatting using forced sector alignment $2$_smsg..."
123                 echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $DEV -q -c aes-cbc-essiv:sha256 --align-payload=$2 --sector-size $_sec_size >/dev/null || fail
124         fi
125
126         # check the device can be activated
127         if [ -n "$DM_SECTOR_SIZE" ] ; then
128                 echo $PWD1 | $CRYPTSETUP luksOpen $DEV $DEV_NAME || fail
129                 $CRYPTSETUP close $DEV_NAME || fail
130         fi
131
132         ALIGN=$($CRYPTSETUP luksDump $DEV | grep -A1 "0: crypt" | grep "offset:" | cut -d ' ' -f2)
133         # echo "ALIGN = $ALIGN"
134
135         [ -z "$ALIGN" ] && fail
136         ALIGN=$((ALIGN/512))
137         [ $ALIGN -ne $_exp ] && fail "Expected alignment differs: expected $_exp != detected $ALIGN"
138
139         # test some operation, just in case
140         echo -e "$PWD1\n$PWD2" | $CRYPTSETUP luksAddKey $DEV $FAST_PBKDF --new-key-slot 1
141         [ $? -ne 0 ] && fail "Keyslot add failed."
142
143         $CRYPTSETUP -q luksKillSlot $DEV 1
144         [ $? -ne 0 ] && fail "Keyslot removal failed."
145
146         echo "PASSED"
147 }
148
149 format_fail() # expected [forced] [encryption_sector_size]
150 {
151         local _sec_size=512
152
153         local _exp=$1
154
155         if [ "${2:0:1}" = "s" ]; then
156                 _sec_size=${2:1}
157                 shift
158         fi
159
160         test "${3:0:1}" = "s" && _sec_size=${3:1}
161
162         test $_sec_size -eq 512 || local _smsg=" (encryption sector size $_sec_size)"
163
164         if [ -z "$2" ] ; then
165                 echo -n "Formatting using topology info$_smsg (must fail)..."
166                 echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $DEV -q -c aes-cbc-essiv:sha256 --sector-size $_sec_size >/dev/null 2>&1 && fail
167         else
168                 echo -n "Formatting using forced sector alignment $2$_smsg (must fail)..."
169                 echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $DEV -q -c aes-cbc-essiv:sha256 --align-payload=$2 --sector-size $_sec_size >/dev/null 2>&1 && fail
170         fi
171
172         echo "PASSED"
173 }
174
175 auto_sector() # expected device header
176 {
177         local _exp=$1
178         local _dev=$2
179         local _hdr=$2
180         local _hdrstr=""
181         local _hdrmsg=""
182
183         if [ -n "$3" ]; then
184                 _hdrstr="--header $3"
185                 _hdr=$3
186                 _hdrmsg=" detached header"
187         fi
188
189         echo -n "Formatting$_hdrmsg using optimal encryption sector size (expecting $_exp)..."
190
191         if [ -z "$DM_SECTOR_SIZE" -a $_exp -ne 512 ]; then
192                 echo "SKIPPED"
193                 return
194         fi
195
196         echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $_hdrstr $_dev -q >/dev/null 2>&1 || fail
197
198         # check the device can be activated
199         echo $PWD1 | $CRYPTSETUP luksOpen $_hdrstr $_dev $DEV_NAME || fail
200         $CRYPTSETUP close $DEV_NAME || fail
201
202         SECTOR=$($CRYPTSETUP luksDump $_hdr | grep -A4 "0: crypt" | grep "sector:" | cut -d ' ' -f2)
203
204         [ -z "$SECTOR" ] && fail
205         [ $SECTOR -ne $_exp ] && fail "Expected sector size differs: expected $_exp != detected $SECTOR"
206
207         echo "PASSED"
208 }
209
210 [ ! -x "$CRYPTSETUP" ] && skip "Cannot find $CRYPTSETUP, test skipped."
211 [ -n "$VALG" ] && valgrind_setup && CRYPTSETUP=valgrind_run
212 if [ $(id -u) != 0 ]; then
213         echo "WARNING: You must be root to run this test, test skipped."
214         exit 77
215 fi
216
217 dm_crypt_features
218 modprobe --dry-run scsi_debug >/dev/null 2>&1 || skip "This kernel seems to not support proper scsi_debug module, test skipped."
219 cleanup
220 if [ -d /sys/module/scsi_debug ] ; then
221         echo "Cannot use scsi_debug module (in use or compiled-in), test skipped."
222         exit 77
223 fi
224
225 add_device dev_size_mb=32
226 echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $DEV -q  >/dev/null || fail
227 EXPCT=$($CRYPTSETUP luksDump $DEV | grep "offset: " | cut -f 2 -d ' ')
228 test "$EXPCT" -gt 512 || fail
229 EXPCT=$((EXPCT/512))
230 echo "Default alignment detected: $EXPCT sectors"
231 cleanup
232
233 echo "# Create desktop-class 4K drive"
234 echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=0)"
235 add_device dev_size_mb=32 sector_size=512 physblk_exp=3 num_tgts=1
236 format $EXPCT
237 format $EXPCT s1024
238 format $EXPCT s2048
239 format $EXPCT s4096
240 format $EXPCT 1
241 format $EXPCT 1 s1024
242 format $EXPCT 1 s2048
243 format $EXPCT 1 s4096
244 format $EXPCT 8
245 format $EXPCT 8 s1024
246 format $EXPCT 8 s2048
247 format $EXPCT 8 s4096
248 format $((EXPCT+1)) $((EXPCT+1))
249 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
250 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
251 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
252 format $EXPCT $EXPCT
253 format $EXPCT $EXPCT s1024
254 format $EXPCT $EXPCT s2048
255 format $EXPCT $EXPCT s4096
256 cleanup
257
258 echo "# Create desktop-class 4K drive with misaligned opt-io (some bad USB enclosures)"
259 echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=0, opt-io=1025)"
260 add_device dev_size_mb=32 sector_size=512 physblk_exp=3 num_tgts=1 opt_blks=1025
261 format $EXPCT
262 format $EXPCT s1024
263 format $EXPCT s2048
264 format $EXPCT s4096
265 format $EXPCT 1
266 format $EXPCT 1 s1024
267 format $EXPCT 1 s2048
268 format $EXPCT 1 s4096
269 format $EXPCT 8
270 format $EXPCT 8 s1024
271 format $EXPCT 8 s2048
272 format $EXPCT 8 s4096
273 format $((EXPCT+1)) $((EXPCT+1))
274 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
275 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
276 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
277 format $EXPCT $EXPCT
278 format $EXPCT $EXPCT s1024
279 format $EXPCT $EXPCT s2048
280 format $EXPCT $EXPCT s4096
281 cleanup
282
283 echo "# Create drive with misaligned opt-io to page-size (some bad USB enclosures)"
284 echo "# (logical_block_size=512, physical_block_size=512, alignment_offset=0, opt-io=33553920)"
285 add_device dev_size_mb=32 sector_size=512 num_tgts=1 opt_blks=65535
286 format $EXPCT
287 format $EXPCT s1024
288 format $EXPCT s2048
289 format $EXPCT s4096
290 format $EXPCT 1
291 format $EXPCT 1 s1024
292 format $EXPCT 1 s2048
293 format $EXPCT 1 s4096
294 format $EXPCT 8
295 format $EXPCT 8 s1024
296 format $EXPCT 8 s2048
297 format $EXPCT 8 s4096
298 format $((EXPCT+1)) $((EXPCT+1))
299 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
300 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
301 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
302 format $EXPCT $EXPCT
303 format $EXPCT $EXPCT s1024
304 format $EXPCT $EXPCT s2048
305 format $EXPCT $EXPCT s4096
306 cleanup
307
308 echo "# Create desktop-class 4K drive w/ 1-sector shift (original bug report)"
309 echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=512)"
310 add_device dev_size_mb=32 sector_size=512 physblk_exp=3 lowest_aligned=1 num_tgts=1
311 format $((EXPCT+1))
312 format_fail $((EXPCT+1)) s1024
313 format_fail $((EXPCT+1)) s2048
314 format_fail $((EXPCT+1)) s4096
315 format $EXPCT 1
316 format $EXPCT 1 s1024
317 format $EXPCT 1 s2048
318 format $EXPCT 1 s4096
319 format $EXPCT 8
320 format $EXPCT 8 s1024
321 format $EXPCT 8 s2048
322 format $EXPCT 8 s4096
323 format $((EXPCT+1)) $((EXPCT+1))
324 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
325 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
326 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
327 format $EXPCT $EXPCT
328 format $EXPCT $EXPCT s1024
329 format $EXPCT $EXPCT s2048
330 format $EXPCT $EXPCT s4096
331 cleanup
332
333 echo "# Create desktop-class 4K drive w/ 63-sector DOS partition compensation"
334 echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=3584)"
335 add_device dev_size_mb=32 sector_size=512 physblk_exp=3 lowest_aligned=7 num_tgts=1
336 format $((EXPCT+7))
337 format_fail $((EXPCT+7)) s1024
338 format_fail $((EXPCT+7)) s2048
339 format_fail $((EXPCT+7)) s4096
340 format $EXPCT 1
341 format $EXPCT 1 s1024
342 format $EXPCT 1 s2048
343 format $EXPCT 1 s4096
344 format $EXPCT 8
345 format $EXPCT 8 s1024
346 format $EXPCT 8 s2048
347 format $EXPCT 8 s4096
348 format $((EXPCT+1)) $((EXPCT+1))
349 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
350 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
351 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
352 format $EXPCT $EXPCT
353 format $EXPCT $EXPCT s1024
354 format $EXPCT $EXPCT s2048
355 format $EXPCT $EXPCT s4096
356 cleanup
357
358 echo "# Create enterprise-class 4K drive"
359 echo "# (logical_block_size=4096, physical_block_size=4096, alignment_offset=0)"
360 add_device dev_size_mb=32 sector_size=4096 num_tgts=1 opt_blks=64
361 format $EXPCT
362 format $EXPCT s1024
363 format $EXPCT s2048
364 format $EXPCT s4096
365 format $EXPCT 1
366 format $EXPCT 1 s1024
367 format $EXPCT 1 s2048
368 format $EXPCT 1 s4096
369 format $EXPCT 8
370 format $EXPCT 8 s1024
371 format $EXPCT 8 s2048
372 format $EXPCT 8 s4096
373 #FIXME: kernel limits issue?
374 ##format $((EXPCT+1)) $((EXPCT+1))
375 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
376 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
377 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
378 format $EXPCT $EXPCT
379 format $EXPCT $EXPCT s1024
380 format $EXPCT $EXPCT s2048
381 format $EXPCT $EXPCT s4096
382 cleanup
383
384 echo "# Create classic 512B drive and stack dm-linear"
385 echo "# (logical_block_size=512, physical_block_size=512, alignment_offset=0)"
386 add_device dev_size_mb=32 sector_size=512 num_tgts=1
387 DEV2=$DEV
388 DEV=/dev/mapper/$DEV_STACKED
389 dmsetup create $DEV_STACKED --table "0 65536 linear $DEV2 0"
390 format $EXPCT
391 format $EXPCT s1024
392 format $EXPCT s2048
393 format $EXPCT s4096
394 format $EXPCT 1
395 format $EXPCT 1 s1024
396 format $EXPCT 1 s2048
397 format $EXPCT 1 s4096
398 format $EXPCT 8
399 format $EXPCT 8 s1024
400 format $EXPCT 8 s2048
401 format $EXPCT 8 s4096
402 format $((EXPCT+1)) $((EXPCT+1))
403 format_fail $((EXPCT+1)) $((EXPCT+1)) s1024
404 format_fail $((EXPCT+1)) $((EXPCT+1)) s2048
405 format_fail $((EXPCT+1)) $((EXPCT+1)) s4096
406 format $EXPCT $EXPCT
407 format $EXPCT $EXPCT s1024
408 format $EXPCT $EXPCT s2048
409 format $EXPCT $EXPCT s4096
410 cleanup
411
412 echo "# Create enterprise-class 4K drive with fs and LUKS images."
413 # loop device here presents 512 block but images have 4k block
414 # cryptsetup should properly use 4k block on direct-io
415 add_device dev_size_mb=32 sector_size=4096 physblk_exp=0 num_tgts=1 opt_blks=64
416 for file in $(ls img_fs_*.img.xz) ; do
417         echo "Format using fs image $file."
418         xz -d -c $file | dd of=$DEV bs=1M 2>/dev/null || fail "bad image"
419         [ ! -d $MNT_DIR ] && mkdir $MNT_DIR
420         mount $DEV $MNT_DIR || skip "Mounting image is not available."
421         echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $MNT_DIR/luks.img --offset 8192 || fail
422         echo $PWD2 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $MNT_DIR/luks.img --header $MNT_DIR/luks_header.img || fail
423         umount $MNT_DIR
424 done
425 cleanup
426
427 echo "# Create classic 512B drive"
428 echo "# (logical_block_size=512, physical_block_size=512, alignment_offset=0)"
429 add_device dev_size_mb=32 sector_size=512 num_tgts=1
430 auto_sector 512 $DEV
431 auto_sector 512 $DEV $HDR
432 cleanup
433 echo "# Create desktop-class 4K drive"
434 echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=0)"
435 add_device dev_size_mb=32 sector_size=512 physblk_exp=3 num_tgts=1
436 auto_sector 4096 $DEV
437 auto_sector 4096 $DEV $HDR
438 DEV2=$DEV
439 DEV=/dev/mapper/$DEV_STACKED
440 dmsetup create $DEV_STACKED --table "0 $((`blockdev --getsz $DEV2`-1)) linear $DEV2 0"
441 auto_sector 512 $DEV
442 auto_sector 512 $DEV $HDR
443 cleanup
444 echo "# Create enterprise-class 4K drive"
445 echo "# (logical_block_size=4096, physical_block_size=4096, alignment_offset=0)"
446 add_device dev_size_mb=32 sector_size=4096 num_tgts=1 opt_blks=64
447 auto_sector 4096 $DEV
448 auto_sector 4096 $DEV $HDR
449 cleanup