#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2022 Hannes Reinecke, SUSE Labs
#
# Test dhchap key types for authenticated connections

. tests/nvme/rc

DESCRIPTION="Test dhchap key types for authenticated connections"
QUICK=1

requires() {
	_nvme_requires
	_have_loop
	_have_kernel_option NVME_AUTH
	_have_kernel_option NVME_TARGET_AUTH
	_require_nvme_trtype_is_fabrics
	_require_nvme_cli_auth
}


test() {
	local port
	local subsys_name="blktests-subsystem-1"
	local hostid
	local hostnqn
	local file_path="${TMPDIR}/img"
	local hmac
	local key_len
	local hostkey
	local ctrldev

	echo "Running ${TEST_NAME}"

	hostid="$(uuidgen)"
	if [ -z "$hostid" ] ; then
		echo "uuidgen failed"
		return 1
	fi
	hostnqn="nqn.2014-08.org.nvmexpress:uuid:${hostid}"

	_setup_nvmet

	truncate -s "${nvme_img_size}" "${file_path}"

	_create_nvmet_subsystem "${subsys_name}" "${file_path}"
	port="$(_create_nvmet_port "${nvme_trtype}")"
	_add_nvmet_subsys_to_port "${port}" "${subsys_name}"
	_create_nvmet_host "${subsys_name}" "${hostnqn}"

	for hmac in 0 1 2 3; do
		echo "Testing hmac ${hmac}"
		hostkey="$(nvme gen-dhchap-key --hmac=${hmac} -n ${subsys_name} 2> /dev/null)"
		if [ -z "$hostkey" ] ; then
			echo "couldn't generate host key for hmac ${hmac}"
			return 1
		fi
		_set_nvmet_hostkey "${hostnqn}" "${hostkey}"

		_nvme_connect_subsys "${nvme_trtype}" "${subsys_name}" \
				     --hostnqn "${hostnqn}" \
				     --hostid "${hostid}" \
				     --dhchap-secret "${hostkey}"
		udevadm settle

		_nvme_disconnect_subsys "${subsys_name}"
	done

	for key_len in 32 48 64; do
		echo "Testing key length ${key_len}"
		hostkey="$(nvme gen-dhchap-key --key-length=${key_len} -n ${subsys_name} 2> /dev/null)"
		if [ -z "$hostkey" ] ; then
			echo "couldn't generate host key for length ${key_len}"
			return 1
		fi
		_set_nvmet_hostkey "${hostnqn}" "${hostkey}"

		_nvme_connect_subsys "${nvme_trtype}" "${subsys_name}" \
				     --hostnqn "${hostnqn}" \
				     --hostid "${hostid}" \
				     --dhchap-secret "${hostkey}"

		udevadm settle

		_nvme_disconnect_subsys "${subsys_name}"
	done

	_remove_nvmet_subsystem_from_port "${port}" "${subsys_name}"
	_remove_nvmet_subsystem "${subsys_name}"

	_remove_nvmet_port "${port}"

	_remove_nvmet_host "${hostnqn}"

	rm "${file_path}"

	echo "Test complete"
}
