Home | History | Annotate | Line # | Download | only in ipsec
t_ipsec_transport.sh revision 1.1
      1 #	$NetBSD: t_ipsec_transport.sh,v 1.1 2017/04/14 02:56:49 ozaki-r Exp $
      2 #
      3 # Copyright (c) 2017 Internet Initiative Japan Inc.
      4 # All rights reserved.
      5 #
      6 # Redistribution and use in source and binary forms, with or without
      7 # modification, are permitted provided that the following conditions
      8 # are met:
      9 # 1. Redistributions of source code must retain the above copyright
     10 #    notice, this list of conditions and the following disclaimer.
     11 # 2. Redistributions in binary form must reproduce the above copyright
     12 #    notice, this list of conditions and the following disclaimer in the
     13 #    documentation and/or other materials provided with the distribution.
     14 #
     15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     18 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25 # POSSIBILITY OF SUCH DAMAGE.
     26 #
     27 
     28 SOCK_LOCAL=unix://ipsec_local
     29 SOCK_PEER=unix://ipsec_peer
     30 BUS=./bus_ipsec
     31 
     32 DEBUG=${DEBUG:-false}
     33 
     34 test_ipsec4_transport()
     35 {
     36 	local proto=$1
     37 	local algo=$2
     38 	local ip_local=10.0.0.1
     39 	local ip_peer=10.0.0.2
     40 	local keylen=$(get_one_valid_keylen $algo)
     41 	local key=$(generate_key $keylen)
     42 	local tmpfile=./tmp
     43 	local outfile=./out
     44 	local opt= proto_cap=
     45 
     46 	if [ $proto = esp ]; then
     47 		opt=-E
     48 		proto_cap=ESP
     49 	else
     50 		opt=-A
     51 		proto_cap=AH
     52 	fi
     53 
     54 	rump_server_crypto_start $SOCK_LOCAL netipsec
     55 	rump_server_crypto_start $SOCK_PEER netipsec
     56 	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
     57 	rump_server_add_iface $SOCK_PEER shmif0 $BUS
     58 
     59 	export RUMP_SERVER=$SOCK_LOCAL
     60 	atf_check -s exit:0 rump.ifconfig shmif0 $ip_local/24
     61 	atf_check -s exit:0 rump.ifconfig -w 10
     62 
     63 	export RUMP_SERVER=$SOCK_PEER
     64 	atf_check -s exit:0 rump.ifconfig shmif0 $ip_peer/24
     65 	atf_check -s exit:0 rump.ifconfig -w 10
     66 
     67 	extract_new_packets $BUS > $outfile
     68 
     69 	export RUMP_SERVER=$SOCK_LOCAL
     70 	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w 3 $ip_peer
     71 
     72 	extract_new_packets $BUS > $outfile
     73 	atf_check -s exit:0 -o match:"$ip_local > $ip_peer: ICMP echo request" \
     74 	    cat $outfile
     75 	atf_check -s exit:0 -o match:"$ip_peer > $ip_local: ICMP echo reply" \
     76 	    cat $outfile
     77 
     78 	export RUMP_SERVER=$SOCK_LOCAL
     79 	# from https://www.netbsd.org/docs/network/ipsec/
     80 	cat > $tmpfile <<-EOF
     81 	add $ip_local $ip_peer $proto 10000 $opt $algo $key;
     82 	add $ip_peer $ip_local $proto 10001 $opt $algo $key;
     83 	spdadd $ip_local $ip_peer any -P out ipsec $proto/transport//require;
     84 	EOF
     85 	$DEBUG && cat $tmpfile
     86 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
     87 	$DEBUG && $HIJACKING setkey -D
     88 	atf_check -s exit:0 -o match:"$ip_local $ip_peer" \
     89 	    $HIJACKING setkey -D
     90 	atf_check -s exit:0 -o match:"$ip_peer $ip_local" \
     91 	    $HIJACKING setkey -D
     92 	# TODO: more detail checks
     93 
     94 	export RUMP_SERVER=$SOCK_PEER
     95 	cat > $tmpfile <<-EOF
     96 	add $ip_local $ip_peer $proto 10000 $opt $algo $key;
     97 	add $ip_peer $ip_local $proto 10001 $opt $algo $key;
     98 	spdadd $ip_peer $ip_local any -P out ipsec $proto/transport//require;
     99 	EOF
    100 	$DEBUG && cat $tmpfile
    101 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
    102 	$DEBUG && $HIJACKING setkey -D
    103 	atf_check -s exit:0 -o match:"$ip_local $ip_peer" \
    104 	    $HIJACKING setkey -D
    105 	atf_check -s exit:0 -o match:"$ip_peer $ip_local" \
    106 	    $HIJACKING setkey -D
    107 	# TODO: more detail checks
    108 
    109 	export RUMP_SERVER=$SOCK_LOCAL
    110 	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w 3 $ip_peer
    111 
    112 	extract_new_packets $BUS > $outfile
    113 	atf_check -s exit:0 -o match:"$ip_local > $ip_peer: $proto_cap" \
    114 	    cat $outfile
    115 	atf_check -s exit:0 -o match:"$ip_peer > $ip_local: $proto_cap" \
    116 	    cat $outfile
    117 }
    118 
    119 test_ipsec6_transport()
    120 {
    121 	local proto=$1
    122 	local algo=$2
    123 	local ip_local=fd00::1
    124 	local ip_peer=fd00::2
    125 	local keylen=$(get_one_valid_keylen $algo)
    126 	local key=$(generate_key $keylen)
    127 	local tmpfile=./tmp
    128 	local outfile=./out
    129 	local opt= proto_cap=
    130 
    131 	if [ $proto = esp ]; then
    132 		opt=-E
    133 		proto_cap=ESP
    134 	else
    135 		opt=-A
    136 		proto_cap=AH
    137 	fi
    138 
    139 	rump_server_crypto_start $SOCK_LOCAL netinet6 netipsec
    140 	rump_server_crypto_start $SOCK_PEER netinet6 netipsec
    141 	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
    142 	rump_server_add_iface $SOCK_PEER shmif0 $BUS
    143 
    144 	export RUMP_SERVER=$SOCK_LOCAL
    145 	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_local
    146 	atf_check -s exit:0 rump.ifconfig -w 10
    147 
    148 	export RUMP_SERVER=$SOCK_PEER
    149 	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_peer
    150 	atf_check -s exit:0 rump.ifconfig -w 10
    151 
    152 	extract_new_packets $BUS > $outfile
    153 
    154 	export RUMP_SERVER=$SOCK_LOCAL
    155 	atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n -X 3 $ip_peer
    156 
    157 	extract_new_packets $BUS > $outfile
    158 	atf_check -s exit:0 -o match:"$ip_local > $ip_peer: ICMP6, echo request" \
    159 	    cat $outfile
    160 	atf_check -s exit:0 -o match:"$ip_peer > $ip_local: ICMP6, echo reply" \
    161 	    cat $outfile
    162 
    163 	export RUMP_SERVER=$SOCK_LOCAL
    164 	# from https://www.netbsd.org/docs/network/ipsec/
    165 	cat > $tmpfile <<-EOF
    166 	add $ip_local $ip_peer $proto 10000 $opt $algo $key;
    167 	add $ip_peer $ip_local $proto 10001 $opt $algo $key;
    168 	spdadd $ip_local $ip_peer any -P out ipsec $proto/transport//require;
    169 	EOF
    170 	$DEBUG && cat $tmpfile
    171 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
    172 	$DEBUG && $HIJACKING setkey -D
    173 	atf_check -s exit:0 -o match:"$ip_local $ip_peer" \
    174 	    $HIJACKING setkey -D
    175 	atf_check -s exit:0 -o match:"$ip_peer $ip_local" \
    176 	    $HIJACKING setkey -D
    177 	# TODO: more detail checks
    178 
    179 	export RUMP_SERVER=$SOCK_PEER
    180 	cat > $tmpfile <<-EOF
    181 	add $ip_local $ip_peer $proto 10000 $opt $algo $key;
    182 	add $ip_peer $ip_local $proto 10001 $opt $algo $key;
    183 	spdadd $ip_peer $ip_local any -P out ipsec $proto/transport//require;
    184 	EOF
    185 	$DEBUG && cat $tmpfile
    186 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
    187 	$DEBUG && $HIJACKING setkey -D
    188 	atf_check -s exit:0 -o match:"$ip_local $ip_peer" \
    189 	    $HIJACKING setkey -D
    190 	atf_check -s exit:0 -o match:"$ip_peer $ip_local" \
    191 	    $HIJACKING setkey -D
    192 	# TODO: more detail checks
    193 
    194 	export RUMP_SERVER=$SOCK_LOCAL
    195 	atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n -X 3 $ip_peer
    196 
    197 	extract_new_packets $BUS > $outfile
    198 	atf_check -s exit:0 -o match:"$ip_local > $ip_peer: $proto_cap" \
    199 	    cat $outfile
    200 	atf_check -s exit:0 -o match:"$ip_peer > $ip_local: $proto_cap" \
    201 	    cat $outfile
    202 }
    203 
    204 test_transport_common()
    205 {
    206 	local ipproto=$1
    207 	local proto=$2
    208 	local algo=$3
    209 
    210 	if [ $ipproto = ipv4 ]; then
    211 		test_ipsec4_transport $proto $algo
    212 	else
    213 		test_ipsec6_transport $proto $algo
    214 	fi
    215 }
    216 
    217 add_test_transport_mode()
    218 {
    219 	local ipproto=$1
    220 	local proto=$2
    221 	local algo=$3
    222 	local _algo=$(echo $algo | sed 's/-//g')
    223 	local name= desc=
    224 
    225 	name="ipsec_transport_${ipproto}_${proto}_${_algo}"
    226 	desc="Tests of IPsec ($ipproto) transport mode with $proto ($algo)"
    227 
    228 	atf_test_case ${name} cleanup
    229 	eval "								\
    230 	    ${name}_head() {						\
    231 	        atf_set \"descr\" \"$desc\";				\
    232 	        atf_set \"require.progs\" \"rump_server\" \"setkey\";	\
    233 	    };								\
    234 	    ${name}_body() {						\
    235 	        test_transport_common $ipproto $proto $algo;		\
    236 	        rump_server_destroy_ifaces;				\
    237 	    };								\
    238 	    ${name}_cleanup() {						\
    239 	        $DEBUG && dump;						\
    240 	        cleanup;						\
    241 	    }								\
    242 	"
    243 	atf_add_test_case ${name}
    244 }
    245 
    246 atf_init_test_cases()
    247 {
    248 	local algo=
    249 
    250 	for algo in $ESP_ENCRYPTION_ALGORITHMS; do
    251 		add_test_transport_mode ipv4 esp $algo
    252 		add_test_transport_mode ipv6 esp $algo
    253 	done
    254 	for algo in $AH_AUTHENTICATION_ALGORITHMS; do
    255 		add_test_transport_mode ipv4 ah $algo
    256 		add_test_transport_mode ipv6 ah $algo
    257 	done
    258 }
    259