1*4743d346Sknakahara# $NetBSD: t_ipsec_unnumbered.sh,v 1.2 2023/09/27 08:48:01 knakahara Exp $ 2d432a9d9Sknakahara# 3d432a9d9Sknakahara# Copyright (c) 2022 Internet Initiative Japan Inc. 4d432a9d9Sknakahara# All rights reserved. 5d432a9d9Sknakahara# 6d432a9d9Sknakahara# Redistribution and use in source and binary forms, with or without 7d432a9d9Sknakahara# modification, are permitted provided that the following conditions 8d432a9d9Sknakahara# are met: 9d432a9d9Sknakahara# 1. Redistributions of source code must retain the above copyright 10d432a9d9Sknakahara# notice, this list of conditions and the following disclaimer. 11d432a9d9Sknakahara# 2. Redistributions in binary form must reproduce the above copyright 12d432a9d9Sknakahara# notice, this list of conditions and the following disclaimer in the 13d432a9d9Sknakahara# documentation and/or other materials provided with the distribution. 14d432a9d9Sknakahara# 15d432a9d9Sknakahara# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16d432a9d9Sknakahara# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17d432a9d9Sknakahara# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18d432a9d9Sknakahara# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19d432a9d9Sknakahara# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20d432a9d9Sknakahara# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21d432a9d9Sknakahara# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22d432a9d9Sknakahara# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23d432a9d9Sknakahara# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24d432a9d9Sknakahara# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25d432a9d9Sknakahara# POSSIBILITY OF SUCH DAMAGE. 26d432a9d9Sknakahara# 27d432a9d9Sknakahara 28d432a9d9SknakaharaSOCK_LOCAL=unix://ipsec_local 29d432a9d9SknakaharaSOCK_REMOTE=unix://ipsec_remote 30d432a9d9SknakaharaBUS_LOCAL_I=./bus_ipsec_local_inner 31d432a9d9SknakaharaBUS_REMOTE_I=./bus_ipsec_remote_inner 32d432a9d9SknakaharaBUS_GLOBAL=./bus_ipsec_global 33d432a9d9Sknakahara 34d432a9d9SknakaharaDEBUG=${DEBUG:-false} 35d432a9d9SknakaharaTIMEOUT=7 36d432a9d9Sknakahara 37d432a9d9Sknakaharasetup_servers_ipv4() 38d432a9d9Sknakahara{ 39d432a9d9Sknakahara 40d432a9d9Sknakahara rump_server_crypto_start $SOCK_LOCAL netipsec ipsec 41d432a9d9Sknakahara rump_server_crypto_start $SOCK_REMOTE netipsec ipsec 42d432a9d9Sknakahara rump_server_add_iface $SOCK_LOCAL shmif0 $BUS_GLOBAL 43d432a9d9Sknakahara rump_server_add_iface $SOCK_LOCAL shmif1 $BUS_LOCAL_I 44d432a9d9Sknakahara rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_GLOBAL 45d432a9d9Sknakahara rump_server_add_iface $SOCK_REMOTE shmif1 $BUS_REMOTE_I 46d432a9d9Sknakahara} 47d432a9d9Sknakahara 48d432a9d9Sknakaharasetup_servers_ipv6() 49d432a9d9Sknakahara{ 50d432a9d9Sknakahara 51d432a9d9Sknakahara rump_server_crypto_start $SOCK_LOCAL netipsec netinet6 ipsec 52d432a9d9Sknakahara rump_server_crypto_start $SOCK_REMOTE netipsec netinet6 ipsec 53d432a9d9Sknakahara rump_server_add_iface $SOCK_LOCAL shmif0 $BUS_GLOBAL 54d432a9d9Sknakahara rump_server_add_iface $SOCK_LOCAL shmif1 $BUS_LOCAL_I 55d432a9d9Sknakahara rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_GLOBAL 56d432a9d9Sknakahara rump_server_add_iface $SOCK_REMOTE shmif1 $BUS_REMOTE_I 57d432a9d9Sknakahara} 58d432a9d9Sknakahara 59d432a9d9Sknakaharasetup_servers() 60d432a9d9Sknakahara{ 61d432a9d9Sknakahara local proto=$1 62d432a9d9Sknakahara 63d432a9d9Sknakahara setup_servers_$proto 64d432a9d9Sknakahara} 65d432a9d9Sknakahara 66d432a9d9Sknakaharaadd_sa() 67d432a9d9Sknakahara{ 68d432a9d9Sknakahara local outer=$1 69d432a9d9Sknakahara local proto=$2 70d432a9d9Sknakahara local algo="$3" 71d432a9d9Sknakahara local src=$4 72d432a9d9Sknakahara local dst=$5 73d432a9d9Sknakahara local tmpfile=./tmp 74d432a9d9Sknakahara local spi=10000 75d432a9d9Sknakahara local algo_args="$(generate_algo_args esp $algo)" 76*4743d346Sknakahara local uniq=8192 # 8192(reqid_base) + 2 * 0(unit id of "ipsec0") 77d432a9d9Sknakahara 78d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 79d432a9d9Sknakahara cat > $tmpfile <<-EOF 80d432a9d9Sknakahara add $src $dst $proto $((spi)) -u $uniq -m transport $algo_args; 81d432a9d9Sknakahara add $dst $src $proto $((spi + 1)) -u $uniq -m transport $algo_args; 82d432a9d9Sknakahara EOF 83d432a9d9Sknakahara $DEBUG && cat $tmpfile 84d432a9d9Sknakahara atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile 85d432a9d9Sknakahara $DEBUG && $HIJACKING setkey -D 86d432a9d9Sknakahara # XXX it can be expired if $lifetime is very short 87d432a9d9Sknakahara #check_sa_entries $SOCK_LOCAL $ip_local $ip_remote 88d432a9d9Sknakahara 89d432a9d9Sknakahara export RUMP_SERVER=$SOCK_REMOTE 90d432a9d9Sknakahara cat > $tmpfile <<-EOF 91d432a9d9Sknakahara add $src $dst $proto $((spi)) -u $uniq -m transport $algo_args; 92d432a9d9Sknakahara add $dst $src $proto $((spi + 1)) -u $uniq -m transport $algo_args; 93d432a9d9Sknakahara EOF 94d432a9d9Sknakahara $DEBUG && cat $tmpfile 95d432a9d9Sknakahara atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile 96d432a9d9Sknakahara $DEBUG && $HIJACKING setkey -D 97d432a9d9Sknakahara} 98d432a9d9Sknakahara 99d432a9d9Sknakaharatest_ipsecif_unnumbered_ipv4() 100d432a9d9Sknakahara{ 101d432a9d9Sknakahara local algo=$1 102d432a9d9Sknakahara local ip_local_i=192.168.22.1 103d432a9d9Sknakahara local ip_local_i_subnet=192.168.22.0/24 104d432a9d9Sknakahara local ip_local_o=10.0.0.2 105d432a9d9Sknakahara local ip_remote_i=192.168.33.1 106d432a9d9Sknakahara local ip_remote_i_subnet=192.168.33.0/24 107d432a9d9Sknakahara local ip_remote_o=10.0.0.3 108d432a9d9Sknakahara local outfile=./out 109d432a9d9Sknakahara 110d432a9d9Sknakahara setup_servers ipv4 111d432a9d9Sknakahara 112d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 113d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0 114d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1 115d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif0 $ip_local_o/24 116d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif1 $ip_local_i/24 117d432a9d9Sknakahara 118d432a9d9Sknakahara export RUMP_SERVER=$SOCK_REMOTE 119d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0 120d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1 121d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif0 $ip_remote_o/24 122d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif1 $ip_remote_i/24 123d432a9d9Sknakahara 124d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 125d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w $TIMEOUT $ip_remote_o 126d432a9d9Sknakahara 127d432a9d9Sknakahara # setup ipsecif(4) as unnumbered for local 128d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 129d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create 130d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 131d432a9d9Sknakahara rump.ifconfig ipsec0 tunnel $ip_local_o $ip_remote_o 132d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered 133d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_local_i/32 134d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 135d432a9d9Sknakahara rump.route add -inet $ip_remote_i_subnet -ifp ipsec0 $ip_local_i 136d432a9d9Sknakahara $DEBUG && rump.ifconfig -v ipsec0 137d432a9d9Sknakahara $DEBUG && $HIJACKING setkey -DP 138d432a9d9Sknakahara $DEBUG && rump.route -nL show 139d432a9d9Sknakahara 140d432a9d9Sknakahara # setup ipsecif(4) as unnumbered for remote 141d432a9d9Sknakahara export RUMP_SERVER=$SOCK_REMOTE 142d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create 143d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 144d432a9d9Sknakahara rump.ifconfig ipsec0 tunnel $ip_remote_o $ip_local_o 145d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered 146d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_remote_i/32 147d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 148d432a9d9Sknakahara rump.route add -inet $ip_local_i_subnet -ifp ipsec0 $ip_remote_i 149d432a9d9Sknakahara $DEBUG && rump.ifconfig -v ipsec0 150d432a9d9Sknakahara $DEBUG && $HIJACKING setkey -DP 151d432a9d9Sknakahara $DEBUG && rump.route -nL show 152d432a9d9Sknakahara 153d432a9d9Sknakahara add_sa ipv4 esp $algo $ip_local_o $ip_remote_o 154d432a9d9Sknakahara 155d432a9d9Sknakahara # test unnumbered ipsecif(4) 156d432a9d9Sknakahara extract_new_packets $BUS_GLOBAL > $outfile 157d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 158d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 159d432a9d9Sknakahara rump.ping -c 1 -n -w $TIMEOUT -I $ip_local_i $ip_remote_i 160d432a9d9Sknakahara extract_new_packets $BUS_GLOBAL > $outfile 161d432a9d9Sknakahara $DEBUG && cat $outfile 162d432a9d9Sknakahara atf_check -s exit:0 \ 163d432a9d9Sknakahara -o match:"$ip_local_o > $ip_remote_o: ESP" \ 164d432a9d9Sknakahara cat $outfile 165d432a9d9Sknakahara atf_check -s exit:0 \ 166d432a9d9Sknakahara -o match:"$ip_remote_o > $ip_local_o: ESP" \ 167d432a9d9Sknakahara cat $outfile 168d432a9d9Sknakahara} 169d432a9d9Sknakahara 170d432a9d9Sknakaharatest_ipsecif_unnumbered_ipv6() 171d432a9d9Sknakahara{ 172d432a9d9Sknakahara local algo=$1 173d432a9d9Sknakahara local ip_local_i=192.168.22.1 174d432a9d9Sknakahara local ip_local_i_subnet=192.168.22.0/24 175d432a9d9Sknakahara local ip_local_o=fc00::2 176d432a9d9Sknakahara local ip_remote_i=192.168.33.1 177d432a9d9Sknakahara local ip_remote_i_subnet=192.168.33.0/24 178d432a9d9Sknakahara local ip_remote_o=fc00::3 179d432a9d9Sknakahara local outfile=./out 180d432a9d9Sknakahara 181d432a9d9Sknakahara setup_servers ipv6 182d432a9d9Sknakahara 183d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 184d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0 185d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0 186d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1 187d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_local_o/64 188d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif1 $ip_local_i/24 189d432a9d9Sknakahara 190d432a9d9Sknakahara export RUMP_SERVER=$SOCK_REMOTE 191d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0 192d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0 193d432a9d9Sknakahara atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1 194d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_remote_o/64 195d432a9d9Sknakahara atf_check -s exit:0 rump.ifconfig shmif1 $ip_remote_i/24 196d432a9d9Sknakahara 197d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 198d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n -X $TIMEOUT $ip_remote_o 199d432a9d9Sknakahara 200d432a9d9Sknakahara # setup ipsecif(4) as unnumbered for local 201d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 202d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create 203d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 204d432a9d9Sknakahara rump.ifconfig ipsec0 tunnel $ip_local_o $ip_remote_o 205d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered 206d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_local_i/32 207d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 208d432a9d9Sknakahara rump.route add -inet $ip_remote_i_subnet -ifp ipsec0 $ip_local_i 209d432a9d9Sknakahara $DEBUG && rump.ifconfig -v ipsec0 210d432a9d9Sknakahara $DEBUG && rump.route -nL show 211d432a9d9Sknakahara 212d432a9d9Sknakahara # setup ipsecif(4) as unnumbered for remote 213d432a9d9Sknakahara export RUMP_SERVER=$SOCK_REMOTE 214d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create 215d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 216d432a9d9Sknakahara rump.ifconfig ipsec0 tunnel $ip_remote_o $ip_local_o 217d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered 218d432a9d9Sknakahara atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_remote_i/32 219d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 220d432a9d9Sknakahara rump.route add -inet $ip_local_i_subnet -ifp ipsec0 $ip_remote_i 221d432a9d9Sknakahara $DEBUG && rump.ifconfig -v ipsec0 222d432a9d9Sknakahara $DEBUG && rump.route -nL show 223d432a9d9Sknakahara 224d432a9d9Sknakahara add_sa ipv6 esp $algo $ip_local_o $ip_remote_o 225d432a9d9Sknakahara 226d432a9d9Sknakahara # test unnumbered gif(4) 227d432a9d9Sknakahara extract_new_packets $BUS_GLOBAL > $outfile 228d432a9d9Sknakahara export RUMP_SERVER=$SOCK_LOCAL 229d432a9d9Sknakahara atf_check -s exit:0 -o ignore \ 230d432a9d9Sknakahara rump.ping -c 1 -n -w $TIMEOUT -I $ip_local_i $ip_remote_i 231d432a9d9Sknakahara extract_new_packets $BUS_GLOBAL > $outfile 232d432a9d9Sknakahara $DEBUG && cat $outfile 233d432a9d9Sknakahara atf_check -s exit:0 \ 234d432a9d9Sknakahara -o match:"$ip_local_o > $ip_remote_o: ESP" \ 235d432a9d9Sknakahara cat $outfile 236d432a9d9Sknakahara atf_check -s exit:0 \ 237d432a9d9Sknakahara -o match:"$ip_remote_o > $ip_local_o: ESP" \ 238d432a9d9Sknakahara cat $outfile 239d432a9d9Sknakahara} 240d432a9d9Sknakahara 241d432a9d9Sknakaharaadd_test_ipsecif_unnumbered() 242d432a9d9Sknakahara{ 243d432a9d9Sknakahara local outer=$1 244d432a9d9Sknakahara local algo=$2 245d432a9d9Sknakahara local _algo=$(echo $algo | sed 's/-//g') 246d432a9d9Sknakahara local name= 247d432a9d9Sknakahara local desc= 248d432a9d9Sknakahara 249d432a9d9Sknakahara name="ipsecif_unnumbered_over${outer}_${_algo}" 250d432a9d9Sknakahara desc="Does unnumbered ipsecif over ${outer} $algo" 251d432a9d9Sknakahara 252d432a9d9Sknakahara atf_test_case ${name} cleanup 253d432a9d9Sknakahara eval " 254d432a9d9Sknakahara ${name}_head() { 255d432a9d9Sknakahara atf_set descr \"${desc}\" 256d432a9d9Sknakahara atf_set require.progs rump_server setkey 257d432a9d9Sknakahara } 258d432a9d9Sknakahara ${name}_body() { 259d432a9d9Sknakahara test_ipsecif_unnumbered_${outer} $algo 260d432a9d9Sknakahara rump_server_destroy_ifaces 261d432a9d9Sknakahara } 262d432a9d9Sknakahara ${name}_cleanup() { 263d432a9d9Sknakahara \$DEBUG && dump 264d432a9d9Sknakahara cleanup 265d432a9d9Sknakahara }" 266d432a9d9Sknakahara atf_add_test_case ${name} 267d432a9d9Sknakahara} 268d432a9d9Sknakahara 269d432a9d9Sknakaharaatf_init_test_cases() 270d432a9d9Sknakahara{ 271d432a9d9Sknakahara local algo= 272d432a9d9Sknakahara 273d432a9d9Sknakahara for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do 274d432a9d9Sknakahara add_test_ipsecif_unnumbered ipv4 $algo 275d432a9d9Sknakahara add_test_ipsecif_unnumbered ipv6 $algo 276d432a9d9Sknakahara done 277d432a9d9Sknakahara} 278