xref: /spdk/test/nvmf/fips/fips.sh (revision d341bee70b3ec097a3aeefc67adc273015511929)
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