3 [ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".."
4 CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup
6 DEV_STACKED="luks0xbabe"
12 FAST_PBKDF="--pbkdf pbkdf2 --pbkdf-force-iterations 1000"
14 CRYPTSETUP_VALGRIND=../.libs/cryptsetup
15 CRYPTSETUP_LIB_VALGRIND=../.libs
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
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
27 rmmod scsi_debug >/dev/null 2>&1
29 rm -f $HDR 2>/dev/null
34 if [ -n "$1" ] ; then echo "FAIL $1" ; fi
35 echo "FAILED backtrace:"
36 while caller $frame; do ((frame++)); done
43 echo "TEST SKIPPED: $1"
48 function valgrind_setup()
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"
55 function valgrind_run()
57 INFOSTRING="$(basename ${BASH_SOURCE[1]})-line-${BASH_LINENO[0]}" ./valg.sh ${CRYPTSETUP_VALGRIND} "$@"
60 function dm_crypt_features()
62 VER_STR=$(dmsetup targets | grep crypt | cut -f2 -dv)
63 [ -z "$VER_STR" ] && fail "Failed to parse dm-crypt version."
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.)
69 [ $VER_MAJ -lt 1 ] && return
70 [ $VER_MAJ -gt 1 ] && {
76 [ $VER_MIN -lt 14 ] && return
78 if [ $VER_MIN -ge 17 ]; then
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."
91 DEV=$(grep -l -e scsi_debug /sys/block/*/device/model | cut -f4 -d /)
93 if [ ! -e /sys/block/$DEV/alignment_offset ] ; then
94 echo "This kernel seems to not support topology info, test skipped."
100 [ -b $DEV ] || fail "Cannot find $DEV."
103 format() # expected [forced] [encryption_sector_size]
109 if [ "${2:0:1}" = "s" ]; then
114 test "${3:0:1}" = "s" && _sec_size=${3:1}
116 test $_sec_size -eq 512 || local _smsg=" (encryption sector size $_sec_size)"
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
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
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
132 ALIGN=$($CRYPTSETUP luksDump $DEV | grep -A1 "0: crypt" | grep "offset:" | cut -d ' ' -f2)
133 # echo "ALIGN = $ALIGN"
135 [ -z "$ALIGN" ] && fail
137 [ $ALIGN -ne $_exp ] && fail "Expected alignment differs: expected $_exp != detected $ALIGN"
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."
143 $CRYPTSETUP -q luksKillSlot $DEV 1
144 [ $? -ne 0 ] && fail "Keyslot removal failed."
149 format_fail() # expected [forced] [encryption_sector_size]
155 if [ "${2:0:1}" = "s" ]; then
160 test "${3:0:1}" = "s" && _sec_size=${3:1}
162 test $_sec_size -eq 512 || local _smsg=" (encryption sector size $_sec_size)"
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
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
175 auto_sector() # expected device header
184 _hdrstr="--header $3"
186 _hdrmsg=" detached header"
189 echo -n "Formatting$_hdrmsg using optimal encryption sector size (expecting $_exp)..."
191 if [ -z "$DM_SECTOR_SIZE" -a $_exp -ne 512 ]; then
196 echo $PWD1 | $CRYPTSETUP luksFormat $FAST_PBKDF --type luks2 $_hdrstr $_dev -q >/dev/null 2>&1 || fail
198 # check the device can be activated
199 echo $PWD1 | $CRYPTSETUP luksOpen $_hdrstr $_dev $DEV_NAME || fail
200 $CRYPTSETUP close $DEV_NAME || fail
202 SECTOR=$($CRYPTSETUP luksDump $_hdr | grep -A4 "0: crypt" | grep "sector:" | cut -d ' ' -f2)
204 [ -z "$SECTOR" ] && fail
205 [ $SECTOR -ne $_exp ] && fail "Expected sector size differs: expected $_exp != detected $SECTOR"
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."
218 modprobe --dry-run scsi_debug >/dev/null 2>&1 || skip "This kernel seems to not support proper scsi_debug module, test skipped."
220 if [ -d /sys/module/scsi_debug ] ; then
221 echo "Cannot use scsi_debug module (in use or compiled-in), test skipped."
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
230 echo "Default alignment detected: $EXPCT sectors"
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
241 format $EXPCT 1 s1024
242 format $EXPCT 1 s2048
243 format $EXPCT 1 s4096
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
253 format $EXPCT $EXPCT s1024
254 format $EXPCT $EXPCT s2048
255 format $EXPCT $EXPCT s4096
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
266 format $EXPCT 1 s1024
267 format $EXPCT 1 s2048
268 format $EXPCT 1 s4096
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
278 format $EXPCT $EXPCT s1024
279 format $EXPCT $EXPCT s2048
280 format $EXPCT $EXPCT s4096
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
291 format $EXPCT 1 s1024
292 format $EXPCT 1 s2048
293 format $EXPCT 1 s4096
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
303 format $EXPCT $EXPCT s1024
304 format $EXPCT $EXPCT s2048
305 format $EXPCT $EXPCT s4096
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
312 format_fail $((EXPCT+1)) s1024
313 format_fail $((EXPCT+1)) s2048
314 format_fail $((EXPCT+1)) s4096
316 format $EXPCT 1 s1024
317 format $EXPCT 1 s2048
318 format $EXPCT 1 s4096
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
328 format $EXPCT $EXPCT s1024
329 format $EXPCT $EXPCT s2048
330 format $EXPCT $EXPCT s4096
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
337 format_fail $((EXPCT+7)) s1024
338 format_fail $((EXPCT+7)) s2048
339 format_fail $((EXPCT+7)) s4096
341 format $EXPCT 1 s1024
342 format $EXPCT 1 s2048
343 format $EXPCT 1 s4096
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
353 format $EXPCT $EXPCT s1024
354 format $EXPCT $EXPCT s2048
355 format $EXPCT $EXPCT s4096
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
366 format $EXPCT 1 s1024
367 format $EXPCT 1 s2048
368 format $EXPCT 1 s4096
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
379 format $EXPCT $EXPCT s1024
380 format $EXPCT $EXPCT s2048
381 format $EXPCT $EXPCT s4096
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
388 DEV=/dev/mapper/$DEV_STACKED
389 dmsetup create $DEV_STACKED --table "0 65536 linear $DEV2 0"
395 format $EXPCT 1 s1024
396 format $EXPCT 1 s2048
397 format $EXPCT 1 s4096
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
407 format $EXPCT $EXPCT s1024
408 format $EXPCT $EXPCT s2048
409 format $EXPCT $EXPCT s4096
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
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
431 auto_sector 512 $DEV $HDR
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
439 DEV=/dev/mapper/$DEV_STACKED
440 dmsetup create $DEV_STACKED --table "0 $((`blockdev --getsz $DEV2`-1)) linear $DEV2 0"
442 auto_sector 512 $DEV $HDR
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