blob: bc539a2bd03cf22f3097e2684e7f9b8e0a6a95a0 [file] [log] [blame]
“mystarrocks”23f0c452017-12-11 07:11:51 -08001import socket
Klement Sekera28fb03f2018-04-17 11:36:55 +02002import unittest
“mystarrocks”23f0c452017-12-11 07:11:51 -08003
Klement Sekera31da2e32018-06-24 22:49:55 +02004from scapy.layers.ipsec import AH
“mystarrocks”23f0c452017-12-11 07:11:51 -08005
Klement Sekera31da2e32018-06-24 22:49:55 +02006from framework import VppTestRunner
Neale Ranns2ac885c2019-03-20 18:24:43 +00007from template_ipsec import TemplateIpsec, IpsecTra46Tests, IpsecTun46Tests, \
Neale Ranns4f33c802019-04-10 12:39:10 +00008 config_tun_params, config_tra_params, IPsecIPv4Params, IPsecIPv6Params, \
Neale Ranns4a56f4e2019-12-23 04:10:25 +00009 IpsecTra4, IpsecTun4, IpsecTra6, IpsecTun6, \
10 IpsecTun6HandoffTests, IpsecTun4HandoffTests
Klement Sekera31da2e32018-06-24 22:49:55 +020011from template_ipsec import IpsecTcpTests
Klement Sekerabf613952019-01-29 11:38:08 +010012from vpp_ipsec import VppIpsecSA, VppIpsecSpd, VppIpsecSpdEntry,\
13 VppIpsecSpdItfBinding
Neale Ranns311124e2019-01-24 04:52:25 -080014from vpp_ip_route import VppIpRoute, VppRoutePath
15from vpp_ip import DpoProto
Neale Ranns17dcec02019-01-09 21:22:20 -080016from vpp_papi import VppEnum
“mystarrocks”23f0c452017-12-11 07:11:51 -080017
18
Neale Ranns4f33c802019-04-10 12:39:10 +000019class ConfigIpsecAH(TemplateIpsec):
“mystarrocks”23f0c452017-12-11 07:11:51 -080020 """
21 Basic test for IPSEC using AH transport and Tunnel mode
22
“mystarrocks”23f0c452017-12-11 07:11:51 -080023 TRANSPORT MODE:
24
25 --- encrypt ---
26 |pg2| <-------> |VPP|
27 --- decrypt ---
28
29 TUNNEL MODE:
30
31 --- encrypt --- plain ---
Klement Sekera84c62042018-05-11 11:06:09 +020032 |pg0| <------- |VPP| <------ |pg1|
“mystarrocks”23f0c452017-12-11 07:11:51 -080033 --- --- ---
34
35 --- decrypt --- plain ---
Klement Sekera84c62042018-05-11 11:06:09 +020036 |pg0| -------> |VPP| ------> |pg1|
“mystarrocks”23f0c452017-12-11 07:11:51 -080037 --- --- ---
“mystarrocks”23f0c452017-12-11 07:11:51 -080038 """
Neale Ranns4f33c802019-04-10 12:39:10 +000039 encryption_type = AH
40 net_objs = []
41 tra4_encrypt_node_name = "ah4-encrypt"
42 tra4_decrypt_node_name = "ah4-decrypt"
43 tra6_encrypt_node_name = "ah6-encrypt"
44 tra6_decrypt_node_name = "ah6-decrypt"
45 tun4_encrypt_node_name = "ah4-encrypt"
46 tun4_decrypt_node_name = "ah4-decrypt"
47 tun6_encrypt_node_name = "ah6-encrypt"
48 tun6_decrypt_node_name = "ah6-decrypt"
“mystarrocks”23f0c452017-12-11 07:11:51 -080049
Paul Vinciguerra7f9b7f92019-03-12 19:23:27 -070050 @classmethod
51 def setUpClass(cls):
Neale Ranns4f33c802019-04-10 12:39:10 +000052 super(ConfigIpsecAH, cls).setUpClass()
Paul Vinciguerra7f9b7f92019-03-12 19:23:27 -070053
54 @classmethod
55 def tearDownClass(cls):
Neale Ranns4f33c802019-04-10 12:39:10 +000056 super(ConfigIpsecAH, cls).tearDownClass()
Paul Vinciguerra7f9b7f92019-03-12 19:23:27 -070057
Neale Ranns8e4a89b2019-01-23 08:16:17 -080058 def setUp(self):
Neale Ranns4f33c802019-04-10 12:39:10 +000059 super(ConfigIpsecAH, self).setUp()
“mystarrocks”23f0c452017-12-11 07:11:51 -080060
Neale Ranns4f33c802019-04-10 12:39:10 +000061 def tearDown(self):
62 super(ConfigIpsecAH, self).tearDown()
63
64 def config_network(self, params):
65 self.net_objs = []
Neale Ranns8e4a89b2019-01-23 08:16:17 -080066 self.tun_if = self.pg0
67 self.tra_if = self.pg2
68 self.logger.info(self.vapi.ppcli("show int addr"))
Neale Ranns311124e2019-01-24 04:52:25 -080069
70 self.tra_spd = VppIpsecSpd(self, self.tra_spd_id)
71 self.tra_spd.add_vpp_config()
Neale Ranns4f33c802019-04-10 12:39:10 +000072 self.net_objs.append(self.tra_spd)
Neale Ranns311124e2019-01-24 04:52:25 -080073 self.tun_spd = VppIpsecSpd(self, self.tun_spd_id)
74 self.tun_spd.add_vpp_config()
Neale Ranns4f33c802019-04-10 12:39:10 +000075 self.net_objs.append(self.tun_spd)
Neale Ranns311124e2019-01-24 04:52:25 -080076
Neale Ranns4f33c802019-04-10 12:39:10 +000077 b = VppIpsecSpdItfBinding(self, self.tra_spd,
78 self.tra_if)
79 b.add_vpp_config()
80 self.net_objs.append(b)
81
82 b = VppIpsecSpdItfBinding(self, self.tun_spd,
83 self.tun_if)
84 b.add_vpp_config()
85 self.net_objs.append(b)
86
87 for p in params:
Neale Ranns8e4a89b2019-01-23 08:16:17 -080088 self.config_ah_tra(p)
Neale Ranns2ac885c2019-03-20 18:24:43 +000089 config_tra_params(p, self.encryption_type)
Neale Ranns4f33c802019-04-10 12:39:10 +000090 for p in params:
Neale Ranns8e4a89b2019-01-23 08:16:17 -080091 self.config_ah_tun(p)
Neale Ranns12989b52019-09-26 16:20:19 +000092 config_tun_params(p, self.encryption_type, self.tun_if)
Neale Ranns4f33c802019-04-10 12:39:10 +000093 for p in params:
Neale Ranns311124e2019-01-24 04:52:25 -080094 d = DpoProto.DPO_PROTO_IP6 if p.is_ipv6 else DpoProto.DPO_PROTO_IP4
Neale Ranns4f33c802019-04-10 12:39:10 +000095 r = VppIpRoute(self, p.remote_tun_if_host, p.addr_len,
96 [VppRoutePath(self.tun_if.remote_addr[p.addr_type],
97 0xffffffff,
Neale Ranns097fa662018-05-01 05:17:55 -070098 proto=d)])
Neale Ranns4f33c802019-04-10 12:39:10 +000099 r.add_vpp_config()
100 self.net_objs.append(r)
101 self.logger.info(self.vapi.ppcli("show ipsec all"))
“mystarrocks”23f0c452017-12-11 07:11:51 -0800102
Neale Ranns4f33c802019-04-10 12:39:10 +0000103 def unconfig_network(self):
104 for o in reversed(self.net_objs):
105 o.remove_vpp_config()
106 self.net_objs = []
“mystarrocks”23f0c452017-12-11 07:11:51 -0800107
Neale Ranns311124e2019-01-24 04:52:25 -0800108 def config_ah_tun(self, params):
109 addr_type = params.addr_type
110 scapy_tun_sa_id = params.scapy_tun_sa_id
111 scapy_tun_spi = params.scapy_tun_spi
112 vpp_tun_sa_id = params.vpp_tun_sa_id
113 vpp_tun_spi = params.vpp_tun_spi
114 auth_algo_vpp_id = params.auth_algo_vpp_id
115 auth_key = params.auth_key
116 crypt_algo_vpp_id = params.crypt_algo_vpp_id
117 crypt_key = params.crypt_key
118 remote_tun_if_host = params.remote_tun_if_host
119 addr_any = params.addr_any
120 addr_bcast = params.addr_bcast
Neale Ranns3833ffd2019-03-21 14:34:09 +0000121 flags = params.flags
Neale Ranns17dcec02019-01-09 21:22:20 -0800122 e = VppEnum.vl_api_ipsec_spd_action_t
Neale Ranns4f33c802019-04-10 12:39:10 +0000123 objs = []
Neale Ranns17dcec02019-01-09 21:22:20 -0800124
Neale Rannseba31ec2019-02-17 18:04:27 +0000125 params.tun_sa_in = VppIpsecSA(self, scapy_tun_sa_id, scapy_tun_spi,
126 auth_algo_vpp_id, auth_key,
127 crypt_algo_vpp_id, crypt_key,
128 self.vpp_ah_protocol,
129 self.tun_if.local_addr[addr_type],
Neale Ranns3833ffd2019-03-21 14:34:09 +0000130 self.tun_if.remote_addr[addr_type],
131 flags=flags)
Neale Ranns4f33c802019-04-10 12:39:10 +0000132
Neale Rannseba31ec2019-02-17 18:04:27 +0000133 params.tun_sa_out = VppIpsecSA(self, vpp_tun_sa_id, vpp_tun_spi,
134 auth_algo_vpp_id, auth_key,
135 crypt_algo_vpp_id, crypt_key,
136 self.vpp_ah_protocol,
137 self.tun_if.remote_addr[addr_type],
Neale Ranns3833ffd2019-03-21 14:34:09 +0000138 self.tun_if.local_addr[addr_type],
139 flags=flags)
Neale Ranns4f33c802019-04-10 12:39:10 +0000140
141 objs.append(params.tun_sa_in)
142 objs.append(params.tun_sa_out)
Neale Ranns311124e2019-01-24 04:52:25 -0800143
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800144 params.spd_policy_in_any = VppIpsecSpdEntry(self, self.tun_spd,
145 vpp_tun_sa_id,
146 addr_any, addr_bcast,
147 addr_any, addr_bcast,
148 socket.IPPROTO_AH)
Neale Rannsa09c1ff2019-02-04 01:10:30 -0800149 params.spd_policy_out_any = VppIpsecSpdEntry(self, self.tun_spd,
150 vpp_tun_sa_id,
151 addr_any, addr_bcast,
152 addr_any, addr_bcast,
153 socket.IPPROTO_AH,
154 is_outbound=0)
Neale Ranns311124e2019-01-24 04:52:25 -0800155
Neale Ranns4f33c802019-04-10 12:39:10 +0000156 objs.append(params.spd_policy_out_any)
157 objs.append(params.spd_policy_in_any)
Neale Ranns311124e2019-01-24 04:52:25 -0800158
Neale Ranns4f33c802019-04-10 12:39:10 +0000159 e1 = VppIpsecSpdEntry(self, self.tun_spd, vpp_tun_sa_id,
160 remote_tun_if_host,
161 remote_tun_if_host,
162 self.pg1.remote_addr[addr_type],
163 self.pg1.remote_addr[addr_type],
164 0, priority=10,
165 policy=e.IPSEC_API_SPD_ACTION_PROTECT,
166 is_outbound=0)
167 e2 = VppIpsecSpdEntry(self, self.tun_spd, scapy_tun_sa_id,
168 self.pg1.remote_addr[addr_type],
169 self.pg1.remote_addr[addr_type],
170 remote_tun_if_host,
171 remote_tun_if_host,
172 0, policy=e.IPSEC_API_SPD_ACTION_PROTECT,
173 priority=10)
174 e3 = VppIpsecSpdEntry(self, self.tun_spd, vpp_tun_sa_id,
175 remote_tun_if_host,
176 remote_tun_if_host,
177 self.pg0.local_addr[addr_type],
178 self.pg0.local_addr[addr_type],
179 0, priority=20,
180 policy=e.IPSEC_API_SPD_ACTION_PROTECT,
181 is_outbound=0)
182 e4 = VppIpsecSpdEntry(self, self.tun_spd, scapy_tun_sa_id,
183 self.pg0.local_addr[addr_type],
184 self.pg0.local_addr[addr_type],
185 remote_tun_if_host,
186 remote_tun_if_host,
187 0, policy=e.IPSEC_API_SPD_ACTION_PROTECT,
188 priority=20)
189
190 objs = objs + [e1, e2, e3, e4]
191
192 for o in objs:
193 o.add_vpp_config()
194
195 self.net_objs = self.net_objs + objs
Neale Ranns311124e2019-01-24 04:52:25 -0800196
197 def config_ah_tra(self, params):
198 addr_type = params.addr_type
199 scapy_tra_sa_id = params.scapy_tra_sa_id
200 scapy_tra_spi = params.scapy_tra_spi
201 vpp_tra_sa_id = params.vpp_tra_sa_id
202 vpp_tra_spi = params.vpp_tra_spi
203 auth_algo_vpp_id = params.auth_algo_vpp_id
204 auth_key = params.auth_key
205 crypt_algo_vpp_id = params.crypt_algo_vpp_id
206 crypt_key = params.crypt_key
207 addr_any = params.addr_any
208 addr_bcast = params.addr_bcast
Neale Ranns3833ffd2019-03-21 14:34:09 +0000209 flags = params.flags | (VppEnum.vl_api_ipsec_sad_flags_t.
210 IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY)
Neale Ranns17dcec02019-01-09 21:22:20 -0800211 e = VppEnum.vl_api_ipsec_spd_action_t
Neale Ranns4f33c802019-04-10 12:39:10 +0000212 objs = []
Neale Ranns311124e2019-01-24 04:52:25 -0800213
Neale Rannseba31ec2019-02-17 18:04:27 +0000214 params.tra_sa_in = VppIpsecSA(self, scapy_tra_sa_id, scapy_tra_spi,
215 auth_algo_vpp_id, auth_key,
216 crypt_algo_vpp_id, crypt_key,
217 self.vpp_ah_protocol,
218 flags=flags)
Neale Rannseba31ec2019-02-17 18:04:27 +0000219 params.tra_sa_out = VppIpsecSA(self, vpp_tra_sa_id, vpp_tra_spi,
220 auth_algo_vpp_id, auth_key,
221 crypt_algo_vpp_id, crypt_key,
222 self.vpp_ah_protocol,
223 flags=flags)
Neale Ranns311124e2019-01-24 04:52:25 -0800224
Neale Ranns4f33c802019-04-10 12:39:10 +0000225 objs.append(params.tra_sa_in)
226 objs.append(params.tra_sa_out)
Neale Ranns311124e2019-01-24 04:52:25 -0800227
Neale Ranns4f33c802019-04-10 12:39:10 +0000228 objs.append(VppIpsecSpdEntry(self, self.tra_spd, vpp_tra_sa_id,
229 addr_any, addr_bcast,
230 addr_any, addr_bcast,
231 socket.IPPROTO_AH))
232 objs.append(VppIpsecSpdEntry(self, self.tra_spd, scapy_tra_sa_id,
233 addr_any, addr_bcast,
234 addr_any, addr_bcast,
235 socket.IPPROTO_AH,
236 is_outbound=0))
237 objs.append(VppIpsecSpdEntry(self, self.tra_spd, vpp_tra_sa_id,
238 self.tra_if.local_addr[addr_type],
239 self.tra_if.local_addr[addr_type],
240 self.tra_if.remote_addr[addr_type],
241 self.tra_if.remote_addr[addr_type],
242 0, priority=10,
243 policy=e.IPSEC_API_SPD_ACTION_PROTECT,
244 is_outbound=0))
245 objs.append(VppIpsecSpdEntry(self, self.tra_spd, scapy_tra_sa_id,
246 self.tra_if.local_addr[addr_type],
247 self.tra_if.local_addr[addr_type],
248 self.tra_if.remote_addr[addr_type],
249 self.tra_if.remote_addr[addr_type],
250 0, policy=e.IPSEC_API_SPD_ACTION_PROTECT,
251 priority=10))
252
253 for o in objs:
254 o.add_vpp_config()
255 self.net_objs = self.net_objs + objs
256
257
258class TemplateIpsecAh(ConfigIpsecAH):
259 """
260 Basic test for IPSEC using AH transport and Tunnel mode
261
262 TRANSPORT MODE:
263
264 --- encrypt ---
265 |pg2| <-------> |VPP|
266 --- decrypt ---
267
268 TUNNEL MODE:
269
270 --- encrypt --- plain ---
271 |pg0| <------- |VPP| <------ |pg1|
272 --- --- ---
273
274 --- decrypt --- plain ---
275 |pg0| -------> |VPP| ------> |pg1|
276 --- --- ---
277 """
278 @classmethod
279 def setUpClass(cls):
280 super(TemplateIpsecAh, cls).setUpClass()
281
282 @classmethod
283 def tearDownClass(cls):
284 super(TemplateIpsecAh, cls).tearDownClass()
285
286 def setUp(self):
287 super(TemplateIpsecAh, self).setUp()
288 self.config_network(self.params.values())
289
290 def tearDown(self):
291 self.unconfig_network()
292 super(TemplateIpsecAh, self).tearDown()
Neale Ranns311124e2019-01-24 04:52:25 -0800293
“mystarrocks”23f0c452017-12-11 07:11:51 -0800294
Neale Ranns1091c4a2019-04-08 14:48:23 +0000295class TestIpsecAh1(TemplateIpsecAh, IpsecTcpTests):
296 """ Ipsec AH - TCP tests """
297 pass
298
299
300class TestIpsecAh2(TemplateIpsecAh, IpsecTra46Tests, IpsecTun46Tests):
301 """ Ipsec AH w/ SHA1 """
Neale Ranns4f33c802019-04-10 12:39:10 +0000302 pass
“mystarrocks”23f0c452017-12-11 07:11:51 -0800303
“mystarrocks”23f0c452017-12-11 07:11:51 -0800304
Neale Ranns4a56f4e2019-12-23 04:10:25 +0000305class TestIpsecAhHandoff(TemplateIpsecAh,
306 IpsecTun6HandoffTests,
307 IpsecTun4HandoffTests):
308 """ Ipsec AH Handoff """
309 pass
310
311
Neale Ranns4f33c802019-04-10 12:39:10 +0000312class TestIpsecAhAll(ConfigIpsecAH,
313 IpsecTra4, IpsecTra6,
314 IpsecTun4, IpsecTun6):
315 """ Ipsec AH all Algos """
Neale Ranns3833ffd2019-03-21 14:34:09 +0000316
Neale Ranns4f33c802019-04-10 12:39:10 +0000317 def setUp(self):
318 super(TestIpsecAhAll, self).setUp()
Neale Ranns3833ffd2019-03-21 14:34:09 +0000319
Neale Ranns4f33c802019-04-10 12:39:10 +0000320 def tearDown(self):
321 super(TestIpsecAhAll, self).tearDown()
Neale Ranns3833ffd2019-03-21 14:34:09 +0000322
Neale Ranns4f33c802019-04-10 12:39:10 +0000323 def test_integ_algs(self):
Damjan Marion4cb83812019-04-24 17:32:01 +0200324 """All Engines SHA[1_96, 256, 384, 512] w/ & w/o ESN"""
Neale Ranns92e93842019-04-08 07:36:50 +0000325 # foreach VPP crypto engine
326 engines = ["ia32", "ipsecmb", "openssl"]
327
Neale Ranns4f33c802019-04-10 12:39:10 +0000328 algos = [{'vpp': VppEnum.vl_api_ipsec_integ_alg_t.
329 IPSEC_API_INTEG_ALG_SHA1_96,
330 'scapy': "HMAC-SHA1-96"},
331 {'vpp': VppEnum.vl_api_ipsec_integ_alg_t.
332 IPSEC_API_INTEG_ALG_SHA_256_128,
333 'scapy': "SHA2-256-128"},
334 {'vpp': VppEnum.vl_api_ipsec_integ_alg_t.
335 IPSEC_API_INTEG_ALG_SHA_384_192,
336 'scapy': "SHA2-384-192"},
337 {'vpp': VppEnum.vl_api_ipsec_integ_alg_t.
338 IPSEC_API_INTEG_ALG_SHA_512_256,
339 'scapy': "SHA2-512-256"}]
Neale Ranns1091c4a2019-04-08 14:48:23 +0000340
Neale Ranns4f33c802019-04-10 12:39:10 +0000341 flags = [0, (VppEnum.vl_api_ipsec_sad_flags_t.
342 IPSEC_API_SAD_FLAG_USE_ESN)]
Neale Ranns1091c4a2019-04-08 14:48:23 +0000343
Neale Ranns4f33c802019-04-10 12:39:10 +0000344 #
Neale Ranns92e93842019-04-08 07:36:50 +0000345 # loop through the VPP engines
Neale Ranns4f33c802019-04-10 12:39:10 +0000346 #
Neale Ranns92e93842019-04-08 07:36:50 +0000347 for engine in engines:
Neale Ranns21ada3b2019-04-11 08:18:34 +0000348 self.vapi.cli("set crypto handler all %s" % engine)
Neale Ranns92e93842019-04-08 07:36:50 +0000349 #
350 # loop through each of the algorithms
351 #
352 for algo in algos:
353 # with self.subTest(algo=algo['scapy']):
354 for flag in flags:
355 #
356 # setup up the config paramters
357 #
358 self.ipv4_params = IPsecIPv4Params()
359 self.ipv6_params = IPsecIPv6Params()
Neale Ranns1091c4a2019-04-08 14:48:23 +0000360
Neale Ranns92e93842019-04-08 07:36:50 +0000361 self.params = {self.ipv4_params.addr_type:
362 self.ipv4_params,
363 self.ipv6_params.addr_type:
364 self.ipv6_params}
Neale Ranns1091c4a2019-04-08 14:48:23 +0000365
Neale Ranns92e93842019-04-08 07:36:50 +0000366 for _, p in self.params.items():
367 p.auth_algo_vpp_id = algo['vpp']
368 p.auth_algo = algo['scapy']
369 p.flags = p.flags | flag
Neale Ranns1091c4a2019-04-08 14:48:23 +0000370
Neale Ranns92e93842019-04-08 07:36:50 +0000371 #
372 # configure the SPDs. SAs, etc
373 #
374 self.config_network(self.params.values())
Neale Ranns1091c4a2019-04-08 14:48:23 +0000375
Neale Ranns92e93842019-04-08 07:36:50 +0000376 #
377 # run some traffic.
378 # An exhautsive 4o6, 6o4 is not necessary for each algo
379 #
380 self.verify_tra_basic6(count=17)
381 self.verify_tra_basic4(count=17)
382 self.verify_tun_66(self.params[socket.AF_INET6], count=17)
383 self.verify_tun_44(self.params[socket.AF_INET], count=17)
Neale Ranns1091c4a2019-04-08 14:48:23 +0000384
Neale Ranns92e93842019-04-08 07:36:50 +0000385 #
386 # remove the SPDs, SAs, etc
387 #
388 self.unconfig_network()
Neale Ranns1091c4a2019-04-08 14:48:23 +0000389
390
“mystarrocks”23f0c452017-12-11 07:11:51 -0800391if __name__ == '__main__':
392 unittest.main(testRunner=VppTestRunner)