1401ac9a5SKonrad Sztyber#!/usr/bin/env bash 2401ac9a5SKonrad Sztyber# SPDX-License-Identifier: BSD-3-Clause 3401ac9a5SKonrad Sztyber# Copyright (C) 2023 Intel Corporation. All rights reserved. 4401ac9a5SKonrad Sztyber# 5401ac9a5SKonrad Sztyber 6401ac9a5SKonrad Sztybertestdir=$(readlink -f "$(dirname "$0")") 7401ac9a5SKonrad Sztyberrootdir=$(readlink -f "$testdir/../../../") 8401ac9a5SKonrad Sztyber 9401ac9a5SKonrad Sztybersource "$rootdir/test/common/autotest_common.sh" 10401ac9a5SKonrad Sztybersource "$rootdir/test/nvmf/common.sh" 11401ac9a5SKonrad Sztyber 12401ac9a5SKonrad Sztyber# shellcheck disable=SC2190 13401ac9a5SKonrad Sztyberdigests=("sha256" "sha384" "sha512") 14401ac9a5SKonrad Sztyber# There's a bug in the kernel with the way dhgroups are negotiated that makes it impossible to 15401ac9a5SKonrad Sztyber# select null dhgroup, so skip it for now. 16401ac9a5SKonrad Sztyberdhgroups=("ffdhe2048" "ffdhe3072" "ffdhe4096" "ffdhe6144" "ffdhe8192") 17401ac9a5SKonrad Sztybersubnqn="nqn.2024-02.io.spdk:cnode0" 18401ac9a5SKonrad Sztyberhostnqn="nqn.2024-02.io.spdk:host0" 19401ac9a5SKonrad Sztybernvmet_subsys="/sys/kernel/config/nvmet/subsystems/$subnqn" 20401ac9a5SKonrad Sztybernvmet_host="/sys/kernel/config/nvmet/hosts/$hostnqn" 213e4c5347SKonrad Sztyberkeys=() ckeys=() 22401ac9a5SKonrad Sztyber 23401ac9a5SKonrad Sztybercleanup() { 24401ac9a5SKonrad Sztyber nvmftestfini || : 25401ac9a5SKonrad Sztyber rm "$nvmet_subsys/allowed_hosts/$hostnqn" || : 26401ac9a5SKonrad Sztyber rmdir "$nvmet_host" || : 27401ac9a5SKonrad Sztyber clean_kernel_target || : 28401ac9a5SKonrad Sztyber rm -f "${keys[@]}" "$output_dir/nvme-auth.log" 29401ac9a5SKonrad Sztyber # configure_kernel_target() binds the SSDs to the kernel driver, so move them back to 30401ac9a5SKonrad Sztyber # userspace, as this is what the tests running after this one expect 31401ac9a5SKonrad Sztyber "$rootdir/scripts/setup.sh" 32401ac9a5SKonrad Sztyber} 33401ac9a5SKonrad Sztyber 34401ac9a5SKonrad Sztybernvmet_auth_init() { 35401ac9a5SKonrad Sztyber configure_kernel_target "$subnqn" "$(get_main_ns_ip)" 36401ac9a5SKonrad Sztyber mkdir "$nvmet_host" 37401ac9a5SKonrad Sztyber echo 0 > "$nvmet_subsys/attr_allow_any_host" 38401ac9a5SKonrad Sztyber ln -s "$nvmet_host" "$nvmet_subsys/allowed_hosts/$hostnqn" 39401ac9a5SKonrad Sztyber} 40401ac9a5SKonrad Sztyber 41401ac9a5SKonrad Sztybernvmet_auth_set_key() { 423e4c5347SKonrad Sztyber local digest dhgroup keyid key ckey 43401ac9a5SKonrad Sztyber 44401ac9a5SKonrad Sztyber digest="$1" dhgroup="$2" keyid="$3" 45401ac9a5SKonrad Sztyber key=$(< "${keys[keyid]}") 463e4c5347SKonrad Sztyber ckey=${ckeys[keyid]:+$(< ${ckeys[keyid]})} 47401ac9a5SKonrad Sztyber 48401ac9a5SKonrad Sztyber echo "hmac($digest)" > "$nvmet_host/dhchap_hash" 49401ac9a5SKonrad Sztyber echo "$dhgroup" > "$nvmet_host/dhchap_dhgroup" 50401ac9a5SKonrad Sztyber echo "$key" > "$nvmet_host/dhchap_key" 513e4c5347SKonrad Sztyber [[ -z "$ckey" ]] || echo "$ckey" > "$nvmet_host/dhchap_ctrl_key" 52401ac9a5SKonrad Sztyber} 53401ac9a5SKonrad Sztyber 54401ac9a5SKonrad Sztyberconnect_authenticate() { 553e4c5347SKonrad Sztyber local digest dhgroup keyid ckey 56401ac9a5SKonrad Sztyber 57401ac9a5SKonrad Sztyber digest="$1" dhgroup="$2" keyid="$3" 583e4c5347SKonrad Sztyber ckey=(${ckeys[keyid]:+--dhchap-ctrlr-key "ckey${keyid}"}) 593e4c5347SKonrad Sztyber 60401ac9a5SKonrad Sztyber rpc_cmd bdev_nvme_set_options --dhchap-digests "$digest" --dhchap-dhgroups "$dhgroup" 61401ac9a5SKonrad Sztyber rpc_cmd bdev_nvme_attach_controller -b nvme0 -t "$TEST_TRANSPORT" -f ipv4 \ 62401ac9a5SKonrad Sztyber -a "$(get_main_ns_ip)" -s "$NVMF_PORT" -q "$hostnqn" -n "$subnqn" \ 633e4c5347SKonrad Sztyber --dhchap-key "key${keyid}" "${ckey[@]}" 64401ac9a5SKonrad Sztyber [[ $(rpc_cmd bdev_nvme_get_controllers | jq -r '.[].name') == "nvme0" ]] 65401ac9a5SKonrad Sztyber rpc_cmd bdev_nvme_detach_controller nvme0 66401ac9a5SKonrad Sztyber} 67401ac9a5SKonrad Sztyber 68401ac9a5SKonrad Sztybernvmftestinit 69401ac9a5SKonrad Sztybernvmfappstart -L nvme_auth &> "$output_dir/nvme-auth.log" 70401ac9a5SKonrad Sztybertrap "cat "$output_dir/nvme-auth.log"; cleanup" SIGINT SIGTERM EXIT 71401ac9a5SKonrad Sztyber 723e4c5347SKonrad Sztyber# Set host/ctrlr key pairs with one combination w/o bidirectional authentication 730ed7af44SKonrad Sztyberkeys[0]=$(gen_dhchap_key "null" 32) ckeys[0]=$(gen_dhchap_key "sha512" 64) 740ed7af44SKonrad Sztyberkeys[1]=$(gen_dhchap_key "null" 48) ckeys[1]=$(gen_dhchap_key "sha384" 48) 750ed7af44SKonrad Sztyberkeys[2]=$(gen_dhchap_key "sha256" 32) ckeys[2]=$(gen_dhchap_key "sha256" 32) 760ed7af44SKonrad Sztyberkeys[3]=$(gen_dhchap_key "sha384" 48) ckeys[3]=$(gen_dhchap_key "null" 32) 770ed7af44SKonrad Sztyberkeys[4]=$(gen_dhchap_key "sha512" 64) ckeys[4]="" 78401ac9a5SKonrad Sztyber 79401ac9a5SKonrad Sztyberwaitforlisten "$nvmfpid" 80401ac9a5SKonrad Sztyberfor i in "${!keys[@]}"; do 81401ac9a5SKonrad Sztyber rpc_cmd keyring_file_add_key "key$i" "${keys[i]}" 823e4c5347SKonrad Sztyber [[ -n "${ckeys[i]}" ]] && rpc_cmd keyring_file_add_key "ckey$i" "${ckeys[i]}" 83401ac9a5SKonrad Sztyberdone 84401ac9a5SKonrad Sztyber 85401ac9a5SKonrad Sztybernvmet_auth_init 86401ac9a5SKonrad Sztyber 87401ac9a5SKonrad Sztyber# Connect with all digests/dhgroups enabled 88401ac9a5SKonrad Sztybernvmet_auth_set_key "sha256" "ffdhe2048" 1 89401ac9a5SKonrad Sztyberconnect_authenticate \ 90401ac9a5SKonrad Sztyber "$( 91401ac9a5SKonrad Sztyber IFS=, 92401ac9a5SKonrad Sztyber printf "%s" "${digests[*]}" 93401ac9a5SKonrad Sztyber )" \ 94401ac9a5SKonrad Sztyber "$( 95401ac9a5SKonrad Sztyber IFS=, 96401ac9a5SKonrad Sztyber printf "%s" "${dhgroups[*]}" 97401ac9a5SKonrad Sztyber )" 1 98401ac9a5SKonrad Sztyber 99401ac9a5SKonrad Sztyber# Check all digest/dhgroup/key combinations 100401ac9a5SKonrad Sztyberfor digest in "${digests[@]}"; do 101401ac9a5SKonrad Sztyber for dhgroup in "${dhgroups[@]}"; do 102401ac9a5SKonrad Sztyber for keyid in "${!keys[@]}"; do 103401ac9a5SKonrad Sztyber nvmet_auth_set_key "$digest" "$dhgroup" "$keyid" 104401ac9a5SKonrad Sztyber connect_authenticate "$digest" "$dhgroup" "$keyid" 105401ac9a5SKonrad Sztyber done 106401ac9a5SKonrad Sztyber done 107401ac9a5SKonrad Sztyberdone 108401ac9a5SKonrad Sztyber 109401ac9a5SKonrad Sztyber# Ensure that a missing key results in failed attach 110401ac9a5SKonrad Sztybernvmet_auth_set_key "sha256" "ffdhe2048" 1 111401ac9a5SKonrad Sztyberrpc_cmd bdev_nvme_set_options --dhchap-digests "sha256" --dhchap-dhgroups "ffdhe2048" 112401ac9a5SKonrad SztyberNOT rpc_cmd bdev_nvme_attach_controller -b nvme0 -t "$TEST_TRANSPORT" -f ipv4 \ 113401ac9a5SKonrad Sztyber -a "$(get_main_ns_ip)" -s "$NVMF_PORT" -q "$hostnqn" -n "$subnqn" 114401ac9a5SKonrad Sztyber(($(rpc_cmd bdev_nvme_get_controllers | jq 'length') == 0)) 115401ac9a5SKonrad Sztyber 116401ac9a5SKonrad Sztyber# Check that mismatched keys result in failed attach 117401ac9a5SKonrad SztyberNOT rpc_cmd bdev_nvme_attach_controller -b nvme0 -t "$TEST_TRANSPORT" -f ipv4 \ 118401ac9a5SKonrad Sztyber -a "$(get_main_ns_ip)" -s "$NVMF_PORT" -q "$hostnqn" -n "$subnqn" \ 119401ac9a5SKonrad Sztyber --dhchap-key "key2" 120401ac9a5SKonrad Sztyber(($(rpc_cmd bdev_nvme_get_controllers | jq 'length') == 0)) 121401ac9a5SKonrad Sztyber 1223e4c5347SKonrad Sztyber# Check that a failed controller authentication results in failed attach 1233e4c5347SKonrad SztyberNOT rpc_cmd bdev_nvme_attach_controller -b nvme0 -t "$TEST_TRANSPORT" -f ipv4 \ 1243e4c5347SKonrad Sztyber -a "$(get_main_ns_ip)" -s "$NVMF_PORT" -q "$hostnqn" -n "$subnqn" \ 1253e4c5347SKonrad Sztyber --dhchap-key "key1" --dhchap-ctrlr-key "ckey2" 1263e4c5347SKonrad Sztyber 127*8d3f8fb8SKonrad Sztyber# Check reauthentication 128*8d3f8fb8SKonrad Sztyberrpc_cmd bdev_nvme_attach_controller -b nvme0 -t "$TEST_TRANSPORT" -f ipv4 \ 129*8d3f8fb8SKonrad Sztyber -a "$(get_main_ns_ip)" -s "$NVMF_PORT" -q "$hostnqn" -n "$subnqn" \ 130*8d3f8fb8SKonrad Sztyber --dhchap-key "key1" --dhchap-ctrlr-key "ckey1" --ctrlr-loss-timeout-sec 1 \ 131*8d3f8fb8SKonrad Sztyber --reconnect-delay-sec 1 132*8d3f8fb8SKonrad Sztybernvmet_auth_set_key "sha256" "ffdhe2048" 2 133*8d3f8fb8SKonrad Sztyberrpc_cmd bdev_nvme_set_keys "nvme0" --dhchap-key "key2" --dhchap-ctrlr-key "ckey2" 134*8d3f8fb8SKonrad Sztyber[[ $(rpc_cmd bdev_nvme_get_controllers | jq -r '.[].name') == "nvme0" ]] 135*8d3f8fb8SKonrad Sztyber# Use wrong keys and verify that the ctrlr will get disconnected after ctrlr-loss-timeout-sec 136*8d3f8fb8SKonrad SztyberNOT rpc_cmd bdev_nvme_set_keys "nvme0" --dhchap-key "key1" --dhchap-ctrlr-key "ckey2" 137*8d3f8fb8SKonrad Sztyberwhile (($(rpc_cmd bdev_nvme_get_controllers | jq 'length') != 0)); do 138*8d3f8fb8SKonrad Sztyber sleep 1s 139*8d3f8fb8SKonrad Sztyberdone 140*8d3f8fb8SKonrad Sztyber# Do the same, but this time try with a valid host key, but bad ctrlr key 141*8d3f8fb8SKonrad Sztybernvmet_auth_set_key "sha256" "ffdhe2048" 1 142*8d3f8fb8SKonrad Sztyberrpc_cmd bdev_nvme_attach_controller -b nvme0 -t "$TEST_TRANSPORT" -f ipv4 \ 143*8d3f8fb8SKonrad Sztyber -a "$(get_main_ns_ip)" -s "$NVMF_PORT" -q "$hostnqn" -n "$subnqn" \ 144*8d3f8fb8SKonrad Sztyber --dhchap-key "key1" --dhchap-ctrlr-key "ckey1" --ctrlr-loss-timeout-sec 1 \ 145*8d3f8fb8SKonrad Sztyber --reconnect-delay-sec 1 146*8d3f8fb8SKonrad Sztybernvmet_auth_set_key "sha256" "ffdhe2048" 2 147*8d3f8fb8SKonrad SztyberNOT rpc_cmd bdev_nvme_set_keys "nvme0" --dhchap-key "key2" --dhchap-ctrlr-key "ckey1" 148*8d3f8fb8SKonrad Sztyberwhile (($(rpc_cmd bdev_nvme_get_controllers | jq 'length') != 0)); do 149*8d3f8fb8SKonrad Sztyber sleep 1s 150*8d3f8fb8SKonrad Sztyberdone 151*8d3f8fb8SKonrad Sztyber 152401ac9a5SKonrad Sztybertrap - SIGINT SIGTERM EXIT 153401ac9a5SKonrad Sztybercleanup 154