Blame tests/align-test

Packit Service a9384c
#!/bin/bash
Packit Service a9384c
Packit Service a9384c
[ -z "$CRYPTSETUP_PATH" ] && CRYPTSETUP_PATH=".."
Packit Service a9384c
CRYPTSETUP=$CRYPTSETUP_PATH/cryptsetup
Packit Service a9384c
DEV=""
Packit Service a9384c
DEV_STACKED="luks0xbabe"
Packit Service a9384c
DEV_NAME="dummyalign"
Packit Service a9384c
MNT_DIR="./mnt_luks"
Packit Service a9384c
PWD1="93R4P4pIqAH8"
Packit Service a9384c
PWD2="mymJeD8ivEhE"
Packit Service a9384c
FAST_PBKDF="--pbkdf-force-iterations 1000"
Packit Service a9384c
Packit Service a9384c
cleanup() {
Packit Service a9384c
	udevadm settle >/dev/null 2>&1
Packit Service a9384c
	if [ -d "$MNT_DIR" ] ; then
Packit Service a9384c
	    umount -f $MNT_DIR 2>/dev/null
Packit Service a9384c
	    rmdir $MNT_DIR 2>/dev/null
Packit Service a9384c
	fi
Packit Service a9384c
	[ -b /dev/mapper/$DEV_STACKED ] && dmsetup remove --retry $DEV_STACKED >/dev/null 2>&1
Packit Service a9384c
	[ -b /dev/mapper/$DEV_NAME ] && dmsetup remove --retry $DEV_NAME >/dev/null 2>&1
Packit Service a9384c
	# FIXME scsi_debug sometimes in-use here
Packit Service a9384c
	sleep 1
Packit Service a9384c
	rmmod scsi_debug 2>/dev/null
Packit Service a9384c
	sleep 1
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
fail()
Packit Service a9384c
{
Packit Service a9384c
	if [ -n "$1" ] ; then echo "FAIL $1" ; fi
Packit Service a9384c
	echo "FAILED backtrace:"
Packit Service a9384c
	while caller $frame; do ((frame++)); done
Packit Service a9384c
	cleanup
Packit Service a9384c
	exit 100
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
skip()
Packit Service a9384c
{
Packit Service a9384c
	echo "TEST SKIPPED: $1"
Packit Service a9384c
	cleanup
Packit Service a9384c
	exit 0
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
function dm_crypt_features()
Packit Service a9384c
{
Packit Service a9384c
	VER_STR=$(dmsetup targets | grep crypt | cut -f2 -dv)
Packit Service a9384c
	[ -z "$VER_STR" ] && fail "Failed to parse dm-crypt version."
Packit Service a9384c
Packit Service a9384c
	VER_MAJ=$(echo $VER_STR | cut -f 1 -d.)
Packit Service a9384c
	VER_MIN=$(echo $VER_STR | cut -f 2 -d.)
Packit Service a9384c
	VER_PTC=$(echo $VER_STR | cut -f 3 -d.)
Packit Service a9384c
Packit Service a9384c
	[ $VER_MAJ -lt 1 ] && return
Packit Service a9384c
	[ $VER_MAJ -gt 1 ] && {
Packit Service a9384c
		DM_PERF_CPU=1
Packit Service a9384c
		DM_SECTOR_SIZE=1
Packit Service a9384c
		return
Packit Service a9384c
	}
Packit Service a9384c
Packit Service a9384c
	[ $VER_MIN -lt 14 ] && return
Packit Service a9384c
	DM_PERF_CPU=1
Packit Service a9384c
	if [ $VER_MIN -ge 17 -o \( $VER_MIN -eq 14 -a $VER_PTC -ge 5 \) ]; then
Packit Service a9384c
		DM_SECTOR_SIZE=1
Packit Service a9384c
	fi
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
add_device() {
Packit Service a9384c
	modprobe scsi_debug $@ delay=0
Packit Service a9384c
	if [ $? -ne 0 ] ; then
Packit Service a9384c
		echo "This kernel seems to not support proper scsi_debug module, test skipped."
Packit Service a9384c
		exit 77
Packit Service a9384c
	fi
Packit Service a9384c
Packit Service a9384c
	sleep 2
Packit Service a9384c
	DEV=$(grep -l -e scsi_debug /sys/block/*/device/model | cut -f4 -d /)
Packit Service a9384c
Packit Service a9384c
	if [ ! -e /sys/block/$DEV/alignment_offset ] ; then
Packit Service a9384c
		echo "This kernel seems to not support topology info, test skipped."
Packit Service a9384c
		cleanup
Packit Service a9384c
		exit 77
Packit Service a9384c
	fi
Packit Service a9384c
Packit Service a9384c
	DEV="/dev/$DEV"
Packit Service a9384c
	[ -b $DEV ] || fail "Cannot find $DEV."
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
format() # key_bits expected [forced]
Packit Service a9384c
{
Packit Service a9384c
	if [ -z "$3" ] ; then
Packit Service a9384c
		echo -n "Formatting using topology info ($1 bits key)..."
Packit Service a9384c
		echo $PWD1 | $CRYPTSETUP luksFormat --type luks1 $DEV -q $FAST_PBKDF -c aes-cbc-essiv:sha256 -s $1 || fail
Packit Service a9384c
	else
Packit Service a9384c
		echo -n "Formatting using forced sector alignment $3 ($1 bits key)..."
Packit Service a9384c
		echo $PWD1 | $CRYPTSETUP luksFormat --type luks1 $DEV -q $FAST_PBKDF -s $1 -c aes-cbc-essiv:sha256 --align-payload=$3 ||fail
Packit Service a9384c
	fi
Packit Service a9384c
Packit Service a9384c
	# check the device can be activated
Packit Service a9384c
	echo $PWD1 | $CRYPTSETUP luksOpen $DEV $DEV_NAME || fail
Packit Service a9384c
	$CRYPTSETUP close $DEV_NAME || fail
Packit Service a9384c
Packit Service a9384c
	ALIGN=$($CRYPTSETUP luksDump $DEV |grep "Payload offset" | sed -e s/.*\\t//)
Packit Service a9384c
	#echo "ALIGN = $ALIGN"
Packit Service a9384c
Packit Service a9384c
	[ -z "$ALIGN" ] && fail
Packit Service a9384c
	[ $ALIGN -ne $2 ] && fail "Expected alignment differs: expected $2 != detected $ALIGN"
Packit Service a9384c
Packit Service a9384c
	# test some operation, just in case
Packit Service a9384c
	echo -e "$PWD1\n$PWD2" | $CRYPTSETUP luksAddKey $DEV $FAST_PBKDF --key-slot 1
Packit Service a9384c
	[ $? -ne 0 ] && fail "Keyslot add failed."
Packit Service a9384c
Packit Service a9384c
	$CRYPTSETUP -q luksKillSlot $DEV 1
Packit Service a9384c
	[ $? -ne 0 ] && fail "Keyslot removal failed."
Packit Service a9384c
Packit Service a9384c
	echo "PASSED"
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
get_offsets()
Packit Service a9384c
{
Packit Service a9384c
	$CRYPTSETUP luksDump $DEV | grep "$1" | cut -s -d ':' -f 2 | sed  -e 's/\s//g' -e :a -e N -e 's/\n/:/g' -e 's/\s//g' -e ta
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
format_null()
Packit Service a9384c
{
Packit Service a9384c
	if [ $3 -eq 0 ] ; then
Packit Service a9384c
		echo -n "Formatting using topology info ($1 bits key) [slot 0"
Packit Service a9384c
		echo | $CRYPTSETUP luksFormat --type luks1 $DEV -q $FAST_PBKDF -c null -s $1 || fail
Packit Service a9384c
	else
Packit Service a9384c
		echo -n "Formatting using forced sector alignment $3 ($1 bits key) [slot 0"
Packit Service a9384c
		echo | $CRYPTSETUP luksFormat --type luks1 $DEV -q $FAST_PBKDF -c null -s $1 --align-payload=$3 || fail
Packit Service a9384c
	fi
Packit Service a9384c
Packit Service a9384c
	# check the device can be activated
Packit Service a9384c
	echo | $CRYPTSETUP luksOpen $DEV $DEV_NAME || fail
Packit Service a9384c
	$CRYPTSETUP close $DEV_NAME || fail
Packit Service a9384c
Packit Service a9384c
	POFF=$(get_offsets "Payload offset")
Packit Service a9384c
	[ -z "$POFF" ] && fail
Packit Service a9384c
	[ $POFF != $2 ] && fail "Expected data offset differs: expected $2 != detected $POFF"
Packit Service a9384c
	if [ -n "$4" ] ; then
Packit Service a9384c
		for j in 1 2 3 4 5 6 7 ; do
Packit Service a9384c
			echo -e "\n" | $CRYPTSETUP luksAddKey $DEV -q $FAST_PBKDF --key-slot $j -c null $PARAMS
Packit Service a9384c
			echo -n $j
Packit Service a9384c
			[ $? -ne 0 ] && fail
Packit Service a9384c
		done
Packit Service a9384c
Packit Service a9384c
		KOFF=$(get_offsets "Key material offset")
Packit Service a9384c
		[ -z "$KOFF" ] && fail
Packit Service a9384c
		[ $KOFF != $4 ] && fail "Expected keyslots offsets differ: expected $4 != detected $KOFF"
Packit Service a9384c
	fi
Packit Service a9384c
Packit Service a9384c
	echo "]...PASSED"
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
format_plain() # sector size
Packit Service a9384c
{
Packit Service a9384c
	echo -n "Formatting plain device (sector size $1)..."
Packit Service a9384c
	if [ -n "$DM_SECTOR_SIZE" ] ; then
Packit Service a9384c
		echo $PWD1 | $CRYPTSETUP open --type plain --hash sha256 --sector-size $1 $DEV $DEV_NAME || fail
Packit Service a9384c
		$CRYPTSETUP close $DEV_NAME || fail
Packit Service a9384c
		echo "PASSED"
Packit Service a9384c
	else
Packit Service a9384c
		echo "N/A"
Packit Service a9384c
	fi
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
format_plain_fail() # sector size
Packit Service a9384c
{
Packit Service a9384c
	echo -n "Formatting plain device (sector size $1, must fail)..."
Packit Service a9384c
	if [ -n "$DM_SECTOR_SIZE" ] ; then
Packit Service a9384c
		echo $PWD1 | $CRYPTSETUP open --type plain --hash sha256 --sector-size $1 $DEV $DEV_NAME >/dev/null 2>&1 && fail
Packit Service a9384c
		echo "PASSED"
Packit Service a9384c
	else
Packit Service a9384c
		echo "N/A"
Packit Service a9384c
	fi
Packit Service a9384c
}
Packit Service a9384c
Packit Service a9384c
if [ $(id -u) != 0 ]; then
Packit Service a9384c
	echo "WARNING: You must be root to run this test, test skipped."
Packit Service a9384c
	exit 77
Packit Service a9384c
fi
Packit Service a9384c
Packit Service a9384c
dm_crypt_features
Packit Service a9384c
modprobe --dry-run scsi_debug || exit 77
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create desktop-class 4K drive"
Packit Service a9384c
echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=0)"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=512 physblk_exp=3 num_tgts=1
Packit Service a9384c
format 256 4096
Packit Service a9384c
format 256 2056 8
Packit Service a9384c
format 128 2048
Packit Service a9384c
format 128 1032 8
Packit Service a9384c
format 256 8192 8192
Packit Service a9384c
format 128 8192 8192
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create desktop-class 4K drive with misaligned opt-io (some bad USB enclosures)"
Packit Service a9384c
echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=0, opt-io=1025)"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=512 physblk_exp=3 num_tgts=1 opt_blks=1025
Packit Service a9384c
format 256 4096
Packit Service a9384c
format 256 2056 8
Packit Service a9384c
format 128 2048
Packit Service a9384c
format 128 1032 8
Packit Service a9384c
format 256 8192 8192
Packit Service a9384c
format 128 8192 8192
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create desktop-class 4K drive w/ 63-sector DOS partition compensation"
Packit Service a9384c
echo "# (logical_block_size=512, physical_block_size=4096, alignment_offset=3584)"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=512 physblk_exp=3 lowest_aligned=7 num_tgts=1
Packit Service a9384c
format 256 4103
Packit Service a9384c
format 256 2056 8
Packit Service a9384c
format 128 2055
Packit Service a9384c
format 128 1032 8
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create enterprise-class 4K drive"
Packit Service a9384c
echo "# (logical_block_size=4096, physical_block_size=4096, alignment_offset=0)"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=4096 num_tgts=1 opt_blks=64
Packit Service a9384c
format 256 4096
Packit Service a9384c
format 256 2056 8
Packit Service a9384c
format 128 2048
Packit Service a9384c
format 128 1032 8
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create classic 512B drive and stack dm-linear"
Packit Service a9384c
echo "# (logical_block_size=512, physical_block_size=512, alignment_offset=0)"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=512 num_tgts=1
Packit Service a9384c
DEV2=$DEV
Packit Service a9384c
DEV=/dev/mapper/$DEV_STACKED
Packit Service a9384c
dmsetup create $DEV_STACKED --table "0 32768 linear $DEV2 0"
Packit Service a9384c
format 256 4096
Packit Service a9384c
format 256 2056 8
Packit Service a9384c
format 128 2048
Packit Service a9384c
format 128 1032 8
Packit Service a9384c
format 128 8192 8192
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create classic 512B drive and stack dm-linear (plain mode)"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=512 num_tgts=1
Packit Service a9384c
DEV2=$DEV
Packit Service a9384c
DEV=/dev/mapper/$DEV_STACKED
Packit Service a9384c
dmsetup create $DEV_STACKED --table "0 32768 linear $DEV2 0"
Packit Service a9384c
format_plain 512
Packit Service a9384c
format_plain 1024
Packit Service a9384c
format_plain 2048
Packit Service a9384c
format_plain 4096
Packit Service a9384c
format_plain_fail 1111
Packit Service a9384c
format_plain_fail 8192
Packit Service a9384c
echo "# Create classic 512B drive, unaligned to 4096 and stack dm-linear (plain mode)"
Packit Service a9384c
dmsetup remove --retry $DEV_STACKED >/dev/null 2>&1
Packit Service a9384c
dmsetup create $DEV_STACKED --table "0 32762 linear $DEV2 0"
Packit Service a9384c
format_plain 512
Packit Service a9384c
format_plain 1024
Packit Service a9384c
format_plain_fail 2048
Packit Service a9384c
format_plain_fail 4096
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Offset check: 512B sector drive"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=512 num_tgts=1
Packit Service a9384c
#           |k| expO reqO expected slot offsets
Packit Service a9384c
format_null  64 2048    0 8:72:136:200:264:328:392:456
Packit Service a9384c
format_null  64  520    1
Packit Service a9384c
format_null  64  520    8
Packit Service a9384c
format_null  64  640  128
Packit Service a9384c
format_null  64 2048 2048
Packit Service a9384c
format_null 128 2048    0 8:136:264:392:520:648:776:904
Packit Service a9384c
format_null 128 1032    1
Packit Service a9384c
format_null 128 1032    8
Packit Service a9384c
format_null 128 1152  128
Packit Service a9384c
format_null 128 2048 2048
Packit Service a9384c
format_null 256 4096    0 8:264:520:776:1032:1288:1544:1800
Packit Service a9384c
format_null 256 2056    1
Packit Service a9384c
format_null 256 2056    8
Packit Service a9384c
format_null 256 2176  128
Packit Service a9384c
format_null 256 4096 2048
Packit Service a9384c
format_null 512 4096    0 8:512:1016:1520:2024:2528:3032:3536
Packit Service a9384c
format_null 512 4040    1
Packit Service a9384c
format_null 512 4040    8
Packit Service a9384c
format_null 512 4096  128
Packit Service a9384c
format_null 512 4096 2048
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Offset check: 4096B sector drive"
Packit Service a9384c
add_device dev_size_mb=16 sector_size=4096 num_tgts=1 opt_blks=64
Packit Service a9384c
format_null  64 2048    0 8:72:136:200:264:328:392:456
Packit Service a9384c
format_null  64  520    1
Packit Service a9384c
format_null  64  520    8
Packit Service a9384c
format_null  64  640  128
Packit Service a9384c
format_null  64 2048 2048
Packit Service a9384c
format_null 128 2048    0 8:136:264:392:520:648:776:904
Packit Service a9384c
format_null 128 1032    1
Packit Service a9384c
format_null 128 1032    8
Packit Service a9384c
format_null 128 1152  128
Packit Service a9384c
format_null 128 2048 2048
Packit Service a9384c
format_null 256 4096    0 8:264:520:776:1032:1288:1544:1800
Packit Service a9384c
format_null 256 2056    1
Packit Service a9384c
format_null 256 2056    8
Packit Service a9384c
format_null 256 2176  128
Packit Service a9384c
format_null 256 4096 2048
Packit Service a9384c
format_null 512 4096    0 8:512:1016:1520:2024:2528:3032:3536
Packit Service a9384c
format_null 512 4040    1
Packit Service a9384c
format_null 512 4040    8
Packit Service a9384c
format_null 512 4096  128
Packit Service a9384c
format_null 512 4096 2048
Packit Service a9384c
cleanup
Packit Service a9384c
Packit Service a9384c
echo "# Create enterprise-class 4K drive with fs and LUKS images."
Packit Service a9384c
# loop device here presents 512 block but images have 4k block
Packit Service a9384c
# cryptsetup should properly use 4k block on direct-io
Packit Service a9384c
add_device dev_size_mb=32 sector_size=4096 physblk_exp=0 num_tgts=1 opt_blks=64
Packit Service a9384c
for file in $(ls img_fs_*.img.xz) ; do
Packit Service a9384c
    echo "Format using fs image $file."
Packit Service a9384c
    xz -d -c $file | dd of=$DEV bs=1M 2>/dev/null || fail "bad image"
Packit Service a9384c
    [ ! -d $MNT_DIR ] && mkdir $MNT_DIR
Packit Service a9384c
    mount $DEV $MNT_DIR || skip "Mounting image is not available."
Packit Service a9384c
    echo $PWD1 | $CRYPTSETUP luksFormat --type luks1 --key-size 256 $FAST_PBKDF $MNT_DIR/luks.img || fail
Packit Service a9384c
    echo $PWD2 | $CRYPTSETUP luksFormat --type luks1 --key-size 256 $FAST_PBKDF $MNT_DIR/luks.img --header $MNT_DIR/luks_header.img || fail
Packit Service a9384c
    umount $MNT_DIR
Packit Service a9384c
done
Packit Service a9384c
cleanup