#!/bin/sh
#
# \brief  Create cgdconfig(8) configuration file from key or extract the key
#         from the specified configuration file
# \author Josef Soentgen
# \date   2014-04-29
#
#
# Note: This script is merely just a awk(1) wrapper and only generates a
#       aes-cbc 256 storedkey configuration and expects the given key to
#       be a proper base64 encoded key generated by cgdconfig(8).
#


#
# Print usage
#
print_usage() {
	local help=$1
	printf "usage: $PROG_NAME [-h] <-f file|-k key>\n"
	if [ "$help" != "" ]; then
		printf "\t-h       show this help screen\n"
		printf "\t-k key   generate config file from key and print "
		printf "to stdout\n"
		printf "\t-f file  extract key from config file and print "
		printf "to stdout\n"
	fi
}


#
# Parse arguments given on the commandline
#
parse_arguments() {
	local args="$(getopt hf:k: ${*})"

	[ $? != 0 ] && exit 1
	if [ $# -lt 1 ]
	then
		print_usage
		exit 1
	fi
	set -- $args
	while [ $# -ge 0 ]; do
		case "$1" in
		-h)
			print_usage "help"
			exit 0;;
		-k) ARG_KEY="$2"; shift; shift;;
		-f) ARG_FILE="$2"; shift; shift;;
		--) shift; break;;
		esac
	done
}


#
# Extract the key string from the configuration file
#
extract_key() {
	local cgd_file="$1"

	awk 'BEGIN { found=0 }
	{
		if (found == 1) key=key $1
		if ($1 == "keygen") { found=1; key=$4 }
	}
	END { sub(/;$/, "", key); print key }' $cgd_file
}


#
# Generate a proper cgd(8) configuration file from the given key
#
generate_conf() {
	local key="$1"

	printf "$key" | awk '{ key=$0 }
	END {
		printf("algorithm aes-cbc;\n")
		printf("iv-method encblkno1;\n")
		printf("keylength 256;\n")
		printf("verify_method none;\n")
		printf("keygen storedkey key ")
		printf("%s \\\n", substr(key, 1, 30))
		printf("                     %s;\n", substr(key, 31))
	}'
}


main() {
	parse_arguments "$@"

	if [ "$ARG_FILE" != "" ]; then
		extract_key "$ARG_FILE"
	fi

	if [ "$ARG_KEY" != "" ]; then
		generate_conf "$ARG_KEY"
	fi
}


PROG_NAME=$(basename $0)

ARG_FILE=
ARG_KEY=

main "$@"

exit 0

# End of file