#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2022 Hannes Reinecke, SUSE Labs
#
# Test re-authentication

. tests/nvme/rc

DESCRIPTION="Test re-authentication"
QUICK=1

requires() {
	_nvme_requires
	_have_fio
	_have_loop
	_have_kernel_option NVME_AUTH
	_have_kernel_option NVME_TARGET_AUTH
	_require_kernel_nvme_fabrics_feature dhchap_ctrl_secret
	_require_nvme_trtype_is_fabrics
	_require_nvme_cli_auth
	_have_driver dh_generic
}

set_conditions() {
	_set_nvme_trtype "$@"
}

test() {
	echo "Running ${TEST_NAME}"

	_setup_nvmet

	local hostkey
	local new_hostkey
	local ctrlkey
	local new_ctrlkey
	local ctrldev
	local rand_io_size
	local ns

	hostkey="$(nvme gen-dhchap-key -n "${def_subsysnqn}" 2> /dev/null)"
	if [ -z "$hostkey" ] ; then
		echo "failed to generate host key"
		return 1
	fi

	ctrlkey="$(nvme gen-dhchap-key -n "${def_subsysnqn}" 2> /dev/null)"
	if [ -z "$ctrlkey" ] ; then
		echo "failed to generate ctrl key"
		return 1
	fi

	_nvmet_target_setup --blkdev file --ctrlkey "${ctrlkey}" \
			    --hostkey "${hostkey}"

	_set_nvmet_dhgroup "${def_hostnqn}" "ffdhe2048"

	_nvme_connect_subsys --dhchap-secret "${hostkey}" \
			     --dhchap-ctrl-secret "${ctrlkey}"

	echo "Re-authenticate with original host key"

	ctrldev=$(_find_nvme_dev "${def_subsysnqn}")
	if [ -z "$ctrldev" ] ; then
		echo "nvme controller not found"
	fi
	hostkey_file="/sys/class/nvme/${ctrldev}/dhchap_secret"
	echo "${hostkey}" > "${hostkey_file}"

	echo "Renew host key on the controller"

	new_hostkey="$(nvme gen-dhchap-key --nqn "${def_subsysnqn}" 2> /dev/null)"

	_set_nvmet_hostkey "${def_hostnqn}" "${new_hostkey}"

	echo "Re-authenticate with new host key"

	echo "${new_hostkey}" > "${hostkey_file}"

	echo "Renew ctrl key on the controller"

	new_ctrlkey="$(nvme gen-dhchap-key --nqn "${def_subsysnqn}" 2> /dev/null)"

	_set_nvmet_ctrlkey "${def_hostnqn}" "${new_ctrlkey}"

	echo "Re-authenticate with new ctrl key"

	ctrlkey_file="/sys/class/nvme/${ctrldev}/dhchap_ctrl_secret"
	echo "${new_ctrlkey}" > "${ctrlkey_file}"

	echo "Change DH group to ffdhe8192"

	_set_nvmet_dhgroup "${def_hostnqn}" "ffdhe8192"

	echo "Re-authenticate with changed DH group"

	echo "${new_hostkey}" > "${hostkey_file}"

	echo "Change hash to hmac(sha512)"

	_set_nvmet_hash "${def_hostnqn}" "hmac(sha512)"

	echo "Re-authenticate with changed hash"

	echo "${new_hostkey}" > "${hostkey_file}"

	ns=$(_find_nvme_ns "${def_subsys_uuid}")

	rand_io_size="$(_nvme_calc_rand_io_size 4m)"
	_run_fio_rand_io --size="${rand_io_size}" --filename="/dev/${ns}"

	_nvme_disconnect_subsys
	_nvmet_target_cleanup

	echo "Test complete"
}
