#!/bin/bash

CRYPTSETUP=../src/cryptsetup

# try to validate using loop-AES losetup/kernel if available
LOSETUP_AES=/losetup-aes.old

LOOP_DD_PARAM="bs=1k count=10000"
DEV_NAME=dummy
IMG=loopaes.img
KEYv1=key_v1
KEYv2=key_v2
KEYv3=key_v3
LOOPDEV=$(losetup -f 2>/dev/null)

function dmremove() { # device
	udevadm settle >/dev/null 2>&1
	dmsetup remove $1 >/dev/null 2>&1
}

function remove_mapping()
{
	[ -b /dev/mapper/$DEV_NAME2 ] && dmremove $DEV_NAME2
	[ -b /dev/mapper/$DEV_NAME ] && dmremove $DEV_NAME
	losetup -d $LOOPDEV >/dev/null 2>&1
	rm -f $IMG $KEYv1 $KEYv2 $KEYv3 >/dev/null 2>&1
}

function fail()
{
	remove_mapping
	echo "FAILED"
	exit 2
}

function skip()
{
	[ -n "$1" ] && echo "$1"
	exit 0
}

function prepare()
{
	remove_mapping
	dd if=/dev/zero of=$IMG $LOOP_DD_PARAM >/dev/null 2>&1
	sync
	losetup $LOOPDEV $IMG

	# Prepare raw key: v1 - one key, v2 - 64 keys, v3 - 64 + one IV
	if [ ! -e $KEYv3 ]; then
		head -c 3705 /dev/urandom | uuencode -m - | head -n 66 | tail -n 65 >$KEYv3
		head -n 1 $KEYv3 > $KEYv1
		head -n 64 $KEYv3 > $KEYv2
	fi
	[ -n "$1" ] && echo -n "$1 "
}

function check_exists()
{
	[ -b /dev/mapper/$DEV_NAME ] || fail
}

function get_offset_params() # $offset
{
	offset=$1
	if [ "${offset:0:1}" = "@" ] ; then
		echo "-o $((${offset:1} / 512)) -p 0"
	else
		echo "-o $((offset / 512))"
	fi
}

function get_expsum() # $offset
{
	case $1 in
	0)
	   echo "31e00e0e4c233c89051cd748122fde2c98db0121ca09ba93a3820817ea037bc5"
	   ;;
	@8192 | 8192)
	   echo "bfd94392d1dd8f5d477251d21b3c736e177a4945cd4937847fc7bace82996aed"
	   ;;
	@8388608 | 8388608)
	   echo "33838fe36928a929bd7971bed7e82bd426c88193fcd692c2e6f1b9c9bfecd4d6"
	   ;;
	*) fail
	   ;;
	esac
}

function check_sum() # $key $keysize $offset
{
	# Fill device with zeroes and reopen it
	dd if=/dev/zero of=/dev/mapper/$DEV_NAME bs=1k $LOOP_DD_PARAM >/dev/null 2>&1
	sync
	dmremove $DEV_NAME

	EXPSUM=$(get_expsum $3)
	$CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME -s $2 --key-file $1 $(get_offset_params $3) >/dev/null 2>&1
	ret=$?
	VSUM=$(sha256sum /dev/mapper/$DEV_NAME | cut -d' ' -f 1)
	if [ $ret -eq 0 -a "$VSUM" = "$EXPSUM" ] ; then
		echo -n "[OK]"
	else
		echo "[FAIL]"
		echo " Expecting $EXPSUM got $VSUM."
		fail
	fi
}

function check_sum_losetup() # $key $alg
{
	[ ! -x $LOSETUP_AES ] && echo && return

	echo -n " Verification using loop-AES: "

	losetup -d $LOOPDEV >/dev/null 2>&1
	cat $1 | $LOSETUP_AES -p 0 -e $2 -o $3 $LOOPDEV $IMG
	ret=$?
	VSUM=$(sha256sum $LOOPDEV | cut -d' ' -f 1)
	if [ $ret -eq 0 -a "$VSUM" = "$EXPSUM" ] ; then
		echo "[OK]"
	else
		echo "[FAIL]"
		echo " Expecting $EXPSUM got $VSUM (loop-AES)."
		fail
	fi
	losetup -d $LOOPDEV >/dev/null 2>&1
}

function check_version()
{
	VER_STR=$(dmsetup version | grep Driver)
	VER_MIN=$(echo $VER_STR | cut -f 2 -d.)
	VER_PATCH=$(echo $VER_STR | cut -f 3 -d.)

	test $VER_MIN -lt 19 && return 1
	test $VER_MIN -eq 19 -a $VER_PATCH -ge 6 && return 1 # RHEL
	return 0
}

[ $(id -u) != 0 ] && skip "WARNING: You must be root to run this test, test skipped."
[ -z "$LOOPDEV" ] && skip "Cannot find free loop device, test skipped."
which uuencode >/dev/null || skip "WARNING: test require uuencode binary, test skipped."
check_version || skip "Probably old kernel, test skipped."

# loop-AES tests
KEY_SIZES="128 256"
KEY_FILES="$KEYv1 $KEYv2 $KEYv3"
DEV_OFFSET="0 8192 @8192 8388608 @8388608"

for key_size in $KEY_SIZES ; do
    for key in $KEY_FILES ; do
        for offset in $DEV_OFFSET ; do
		prepare "Open loop-AES $key / AES-$key_size / offset $offset"
		$CRYPTSETUP loopaesOpen $LOOPDEV $DEV_NAME \
			-s $key_size --key-file $key $(get_offset_params $offset) \
			2>/dev/null
		[ $? -ne 0 ] && echo "[SKIPPED]" && continue
		check_exists
		check_sum $key $key_size $offset
		$CRYPTSETUP loopaesClose $DEV_NAME || fail
		check_sum_losetup $key AES$key_size $offset
        done
    done
done

remove_mapping
exit 0
