10259ef0bSKrzysztof Karas#!/usr/bin/env bash 20259ef0bSKrzysztof Karas# SPDX-License-Identifier: BSD-3-Clause 30259ef0bSKrzysztof Karas# Copyright (C) 2023 Intel Corporation 40259ef0bSKrzysztof Karas# All rights reserved. 50259ef0bSKrzysztof Karas# 60259ef0bSKrzysztof Karas 70259ef0bSKrzysztof Karastestdir="$(readlink -f $(dirname $0))" 80259ef0bSKrzysztof Karasrootdir="$(readlink -f $testdir/../../..)" 90259ef0bSKrzysztof Karas 100259ef0bSKrzysztof Karassource "$rootdir/test/common/autotest_common.sh" 110259ef0bSKrzysztof Karassource "$rootdir/test/nvmf/common.sh" 120259ef0bSKrzysztof Karasrpc_py="$rootdir/scripts/rpc.py" 130259ef0bSKrzysztof Karas 140259ef0bSKrzysztof Karascleanup() { 150259ef0bSKrzysztof Karas process_shm --id $NVMF_APP_SHM_ID || true 160259ef0bSKrzysztof Karas killprocess $bdevperf_pid 170259ef0bSKrzysztof Karas nvmftestfini || true 180259ef0bSKrzysztof Karas rm -f $key_path 190259ef0bSKrzysztof Karas} 200259ef0bSKrzysztof Karas 210259ef0bSKrzysztof Karassetup_nvmf_tgt_conf() { 220259ef0bSKrzysztof Karas local key=$1 230259ef0bSKrzysztof Karas 240259ef0bSKrzysztof Karas $rpc_py <<- EOF 250259ef0bSKrzysztof Karas nvmf_create_transport $NVMF_TRANSPORT_OPTS 260259ef0bSKrzysztof Karas nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -s SPDK00000000000001 -m 10 270259ef0bSKrzysztof Karas nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT \ 280259ef0bSKrzysztof Karas -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT -k 290259ef0bSKrzysztof Karas bdev_malloc_create 32 4096 -b malloc0 300259ef0bSKrzysztof Karas nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 malloc0 -n 1 3111cc2256SKonrad Sztyber keyring_file_add_key key0 "$key" 320259ef0bSKrzysztof Karas nvmf_subsystem_add_host nqn.2016-06.io.spdk:cnode1 nqn.2016-06.io.spdk:host1 \ 3311cc2256SKonrad Sztyber --psk key0 340259ef0bSKrzysztof Karas EOF 350259ef0bSKrzysztof Karas} 360259ef0bSKrzysztof Karas 370259ef0bSKrzysztof Karasbuild_openssl_config() { 380259ef0bSKrzysztof Karas cat <<- NO_DEFAULT 390259ef0bSKrzysztof Karas openssl_conf = openssl_spdk 400259ef0bSKrzysztof Karas 410259ef0bSKrzysztof Karas [openssl_spdk] 420259ef0bSKrzysztof Karas providers = provider_sect_spdk 430259ef0bSKrzysztof Karas alg_section = algorithm_sect_spdk 440259ef0bSKrzysztof Karas 450259ef0bSKrzysztof Karas [provider_sect_spdk] 460259ef0bSKrzysztof Karas fips = fips_sect_spdk 470259ef0bSKrzysztof Karas base = base_sect_spdk 480259ef0bSKrzysztof Karas 490259ef0bSKrzysztof Karas [base_sect_spdk] 500259ef0bSKrzysztof Karas activate = 1 510259ef0bSKrzysztof Karas 520259ef0bSKrzysztof Karas [fips_sect_spdk] 530259ef0bSKrzysztof Karas activate = 1 540259ef0bSKrzysztof Karas 550259ef0bSKrzysztof Karas [algorithm_sect_spdk] 560259ef0bSKrzysztof Karas default_properties = fips=yes 570259ef0bSKrzysztof Karas NO_DEFAULT 580259ef0bSKrzysztof Karas if [[ ! -t 0 ]]; then 590259ef0bSKrzysztof Karas cat - 600259ef0bSKrzysztof Karas fi 610259ef0bSKrzysztof Karas} 620259ef0bSKrzysztof Karas 630259ef0bSKrzysztof Karasbuild_openssl_config_fallback() { 640259ef0bSKrzysztof Karas build_openssl_config <<- FIPS 650259ef0bSKrzysztof Karas $(openssl fipsinstall -module "$(openssl info -modulesdir)/fips.so" 2> /dev/null) 660259ef0bSKrzysztof Karas 670259ef0bSKrzysztof Karas [openssl_spdk] 680259ef0bSKrzysztof Karas providers = provider_sect_spdk 690259ef0bSKrzysztof Karas alg_section = algorithm_sect_spdk 700259ef0bSKrzysztof Karas 710259ef0bSKrzysztof Karas [provider_sect_spdk] 720259ef0bSKrzysztof Karas fips = fips_sect 730259ef0bSKrzysztof Karas base = base_sect_spdk 740259ef0bSKrzysztof Karas 750259ef0bSKrzysztof Karas [base_sect_spdk] 760259ef0bSKrzysztof Karas activate = 1 770259ef0bSKrzysztof Karas 780259ef0bSKrzysztof Karas [algorithm_sect_spdk] 790259ef0bSKrzysztof Karas default_properties = fips=yes 800259ef0bSKrzysztof Karas FIPS 810259ef0bSKrzysztof Karas} 820259ef0bSKrzysztof Karas 830259ef0bSKrzysztof Karascheck_openssl_version() { 840259ef0bSKrzysztof Karas local target=${1:-3.0.0} 850259ef0bSKrzysztof Karas 860259ef0bSKrzysztof Karas ge "$(openssl version | awk '{print $2}')" "$target" 870259ef0bSKrzysztof Karas} 880259ef0bSKrzysztof Karas 890259ef0bSKrzysztof Karas# Ensure environment is prepared for running this test. 900259ef0bSKrzysztof Karasif ! check_openssl_version; then 910259ef0bSKrzysztof Karas echo "Unsupported OpenSSL version" 920259ef0bSKrzysztof Karas exit 1 930259ef0bSKrzysztof Karasfi 940259ef0bSKrzysztof Karas 950259ef0bSKrzysztof Karas# Absence of this library means that OpenSSL was configured and built without FIPS support. 960259ef0bSKrzysztof Karasif [[ ! -f "$(openssl info -modulesdir)/fips.so" ]]; then 970259ef0bSKrzysztof Karas echo "FIPS library not found" 980259ef0bSKrzysztof Karas exit 1 990259ef0bSKrzysztof Karasfi 1000259ef0bSKrzysztof Karas 1010259ef0bSKrzysztof Karasif ! warn=$(openssl fipsinstall -help 2>&1); then 1020259ef0bSKrzysztof Karas if [[ $warn == "This command is not enabled"* ]]; then 1030259ef0bSKrzysztof Karas # Rhel-based openssl >=3.0.9 builds no longer support fipsinstall command. 1040259ef0bSKrzysztof Karas # Enforce proper patches. 1050259ef0bSKrzysztof Karas export callback=build_openssl_config 1060259ef0bSKrzysztof Karas else 1070259ef0bSKrzysztof Karas exit 1 1080259ef0bSKrzysztof Karas fi 1090259ef0bSKrzysztof Karaselse 1100259ef0bSKrzysztof Karas # We need to explicitly enable FIPS via proper config. 1110259ef0bSKrzysztof Karas export callback=build_openssl_config_fallback 1120259ef0bSKrzysztof Karasfi 1130259ef0bSKrzysztof Karas 1140259ef0bSKrzysztof Karas"$callback" > spdk_fips.conf 1150259ef0bSKrzysztof Karasexport OPENSSL_CONF=spdk_fips.conf 1160259ef0bSKrzysztof Karas 117c709c736SMichal Bergermapfile -t providers < <(openssl list -providers | grep "name") 1180259ef0bSKrzysztof Karas# We expect OpenSSL to present the providers we requested. If OpenSSL loaded other providers 1190259ef0bSKrzysztof Karas# (e.g. "default") or was unable to load "base" and "fips", the following line will fail, 1200259ef0bSKrzysztof Karas# indicating that OPENSSL_CONF is invalid or OpenSSL itself is malconfigured. 1210259ef0bSKrzysztof Karasif ((${#providers[@]} != 2)) || [[ ${providers[0],,} != *base* || ${providers[1],,} != *fips* ]]; then 1220259ef0bSKrzysztof Karas printf 'We expected Base and FIPS providers, got:\n' 1230259ef0bSKrzysztof Karas printf ' %s\n' "${providers[@]:-no providers}" 1240259ef0bSKrzysztof Karas exit 1 1250259ef0bSKrzysztof Karasfi 1260259ef0bSKrzysztof Karas 1270259ef0bSKrzysztof Karas# MD5 is not FIPS compliant, so below command should fail in FIPS-only environment. 1280259ef0bSKrzysztof KarasNOT openssl md5 <(:) 1290259ef0bSKrzysztof Karas 1300259ef0bSKrzysztof Karas# Start NVMf TLS test. 1310259ef0bSKrzysztof Karasnvmftestinit 1320259ef0bSKrzysztof Karasnvmfappstart -m 0x2 1330259ef0bSKrzysztof Karas 1340259ef0bSKrzysztof Karastrap 'cleanup' EXIT 1350259ef0bSKrzysztof Karas 1360259ef0bSKrzysztof Karas# Key taken from NVM Express TCP Transport Specification 1.0c. 1370259ef0bSKrzysztof Karaskey="NVMeTLSkey-1:01:VRLbtnN9AQb2WXW3c9+wEf/DRLz0QuLdbYvEhwtdWwNf9LrZ:" 138a41e6e9aSKonrad Sztyberkey_path="$(mktemp -t "spdk-psk.XXX")" 1390259ef0bSKrzysztof Karasecho -n "$key" > $key_path 1400259ef0bSKrzysztof Karaschmod 0600 $key_path 1410259ef0bSKrzysztof Karas 1420259ef0bSKrzysztof Karassetup_nvmf_tgt_conf $key_path 1430259ef0bSKrzysztof Karas 1440259ef0bSKrzysztof Karas# Use bdevperf as initiator. 1450259ef0bSKrzysztof Karasbdevperf_rpc_sock="/var/tmp/bdevperf.sock" 1460259ef0bSKrzysztof Karas"$rootdir/build/examples/bdevperf" -m 0x4 -z -r $bdevperf_rpc_sock \ 1470259ef0bSKrzysztof Karas -q 128 -o 4096 -w verify -t 10 & 1480259ef0bSKrzysztof Karasbdevperf_pid=$! 1490259ef0bSKrzysztof Karaswaitforlisten $bdevperf_pid $bdevperf_rpc_sock 1500259ef0bSKrzysztof Karas 151*d341bee7SKonrad Sztyber$rpc_py -s $bdevperf_rpc_sock keyring_file_add_key key0 "$key_path" 1520259ef0bSKrzysztof Karas$rpc_py -s $bdevperf_rpc_sock bdev_nvme_attach_controller -b TLSTEST -t $TEST_TRANSPORT \ 1530259ef0bSKrzysztof Karas -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT -f ipv4 -n nqn.2016-06.io.spdk:cnode1 \ 154*d341bee7SKonrad Sztyber -q nqn.2016-06.io.spdk:host1 --psk key0 1550259ef0bSKrzysztof Karas 1560259ef0bSKrzysztof Karas"$rootdir/examples/bdev/bdevperf/bdevperf.py" -s $bdevperf_rpc_sock perform_tests 157