#!/bin/bash
# luks-Crypto-Benchmark
# Original von:
# http://www.holtznet.de/luks/
# 08/2009

# Modifiziert von Nerd6:
# http://nerd6.fr33bas3.net
# 08/2011

SIZE="100" #MB
BLOCKSIZE="4096"
CIPHER="aes:256 twofish:256 camellia:256 serpent:256 aes:384 twofish:384 camellia:384 serpent:384 aes:512 twofish:512 camellia:512 serpent:512"
CMODE="xts-plain"

export LANG=C

# Load modules
for mod in $(sudo modprobe -l | grep "/crypto/" | grep "/arch/" | sed 's/.*\/\(.*\)\.ko/\1/'); do
	sudo lsmod | grep "$mod" >/dev/null || sudo modprobe "$mod" >/dev/null 2>&1
done

for mod in $(sudo modprobe -l | grep "/crypto/" | grep -v "/arch/" | sed 's/.*\/\(.*\)\.ko/\1/'); do
	sudo lsmod | grep "$mod" >/dev/null || sudo modprobe "$mod" >/dev/null 2>&1
done

# Make device
tmp="/tmp/"
test -e /dev/shm && tmp="/dev/shm/"
file=$(mktemp -p "$tmp")
dd if=/dev/zero of="$file" bs=1M count="$SIZE" >/dev/null 2>&1
sudo chown root:root "$file"
loop=$(sudo losetup -f)
sudo losetup "$loop" "$file"

# Make keyfile
keyfile=$(mktemp)
dd if=/dev/urandom of="$keyfile" bs=512 count=1 >/dev/null 2>&1
sudo chown root:root "$keyfile"

# Start benchmark
echo "Create options	write	read"
for cipher in $CIPHER; do
	for cmode in $CMODE; do
		c=$(echo "$cipher" | sed 's/:.*//')
		b=$(echo "$cipher" | sed 's/.*://')
		echo -n "-c $c-$cmode -s $b		"
		sudo cryptsetup luksFormat -q -c "$c-$cmode" -s "$b" "$loop" "$keyfile" >/dev/null 2>&1
		sudo cryptsetup luksOpen -q --key-file "$keyfile" "$loop" "cryptbech" >/dev/null 2>&1
		if [ -e "/dev/mapper/cryptbech" ]; then
			write=$(dd if=/dev/zero of="/dev/mapper/cryptbech" bs="$BLOCKSIZE" 2>&1  | grep "/s" | sed 's/.*, //')
			read=$(dd of=/dev/null if="/dev/mapper/cryptbech" bs="$BLOCKSIZE" 2>&1  | grep "/s" | sed 's/.*, //')
			echo "$write $read"
			sudo cryptsetup luksClose -q "cryptbech" >/dev/null 2>&1
		else
			echo "Error"
		fi
	done
done

# Destroy device and keyfile
sudo losetup -d "$loop"
sudo rm "$file" "$keyfile"

