Skip to content

Commit 38340fa

Browse files
Filip Tehlarbganne
authored andcommitted
ikev2: fix issue when sending multiple requests at once
Type: fix Change-Id: I8ed556de4370a03d10c56cce101cd5ea0d0aaf8b Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
1 parent 45d6049 commit 38340fa

File tree

2 files changed

+68
-20
lines changed

2 files changed

+68
-20
lines changed

src/plugins/ikev2/ikev2.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1412,7 +1412,9 @@ ikev2_process_create_child_sa_req (vlib_main_t * vm,
14121412
if (sa->is_initiator && proposal
14131413
&& proposal->protocol_id == IKEV2_PROTOCOL_ESP)
14141414
{
1415-
ikev2_rekey_t *rekey = &sa->rekey[0];
1415+
ikev2_rekey_t *rekey = sa->rekey;
1416+
if (vec_len (rekey) == 0)
1417+
goto cleanup_and_exit;
14161418
rekey->protocol_id = proposal->protocol_id;
14171419
rekey->i_proposal =
14181420
ikev2_select_proposal (proposal, IKEV2_PROTOCOL_ESP);
@@ -4434,6 +4436,7 @@ ikev2_rekey_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
44344436
sa->last_init_msg_id += 1;
44354437

44364438
ikev2_rekey_t *rekey;
4439+
vec_reset_length (sa->rekey);
44374440
vec_add2 (sa->rekey, rekey, 1);
44384441
ikev2_sa_proposal_t *proposals = vec_dup (csa->i_proposals);
44394442

src/plugins/ikev2/test/test_ikev2.py

Lines changed: 64 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,27 @@ def setUp(self):
586586
self.vapi.cli('ikev2 set logging level 4')
587587
self.vapi.cli('event-lo clear')
588588

589+
def create_rekey_request(self):
590+
sa, first_payload = self.generate_auth_payload(is_rekey=True)
591+
header = ikev2.IKEv2(
592+
init_SPI=self.sa.ispi,
593+
resp_SPI=self.sa.rspi, id=self.sa.new_msg_id(),
594+
flags='Initiator', exch_type='CREATE_CHILD_SA')
595+
596+
ike_msg = self.encrypt_ike_msg(header, sa, first_payload)
597+
return self.create_packet(self.pg0, ike_msg, self.sa.sport,
598+
self.sa.dport, self.sa.natt, self.ip6)
599+
600+
def create_empty_request(self):
601+
header = ikev2.IKEv2(init_SPI=self.sa.ispi, resp_SPI=self.sa.rspi,
602+
id=self.sa.new_msg_id(), flags='Initiator',
603+
exch_type='INFORMATIONAL',
604+
next_payload='Encrypted')
605+
606+
msg = self.encrypt_ike_msg(header, b'', None)
607+
return self.create_packet(self.pg0, msg, self.sa.sport,
608+
self.sa.dport, self.sa.natt, self.ip6)
609+
589610
def create_packet(self, src_if, msg, sport=500, dport=500, natt=False,
590611
use_ip6=False):
591612
if use_ip6:
@@ -1591,6 +1612,47 @@ def config_tc(self):
15911612
'integ_alg': 12}})
15921613

15931614

1615+
class TestInitiatorRequestWindowSize(TestInitiatorPsk):
1616+
""" test initiator - request window size (1) """
1617+
1618+
def rekey_respond(self, req, update_child_sa_data):
1619+
ih = self.get_ike_header(req)
1620+
plain = self.sa.hmac_and_decrypt(ih)
1621+
sa = ikev2.IKEv2_payload_SA(plain)
1622+
if update_child_sa_data:
1623+
prop = sa[ikev2.IKEv2_payload_Proposal]
1624+
self.sa.i_nonce = sa[ikev2.IKEv2_payload_Nonce].load
1625+
self.sa.r_nonce = self.sa.i_nonce
1626+
self.sa.child_sas[0].ispi = prop.SPI
1627+
self.sa.child_sas[0].rspi = prop.SPI
1628+
self.sa.calc_child_keys()
1629+
1630+
header = ikev2.IKEv2(init_SPI=self.sa.ispi, resp_SPI=self.sa.rspi,
1631+
flags='Response', exch_type=36,
1632+
id=ih.id, next_payload='Encrypted')
1633+
resp = self.encrypt_ike_msg(header, sa, 'SA')
1634+
packet = self.create_packet(self.pg0, resp, self.sa.sport,
1635+
self.sa.dport, self.sa.natt, self.ip6)
1636+
self.send_and_assert_no_replies(self.pg0, packet)
1637+
1638+
def test_initiator(self):
1639+
super(TestInitiatorRequestWindowSize, self).test_initiator()
1640+
self.pg0.enable_capture()
1641+
self.pg_start()
1642+
ispi = int.from_bytes(self.sa.child_sas[0].ispi, 'little')
1643+
self.vapi.ikev2_initiate_rekey_child_sa(ispi=ispi)
1644+
self.vapi.ikev2_initiate_rekey_child_sa(ispi=ispi)
1645+
capture = self.pg0.get_capture(2)
1646+
1647+
# reply in reverse order
1648+
self.rekey_respond(capture[1], True)
1649+
self.rekey_respond(capture[0], False)
1650+
1651+
# verify that only the second request was accepted
1652+
self.verify_ike_sas()
1653+
self.verify_ipsec_sas(is_rekey=True)
1654+
1655+
15941656
class TestInitiatorRekey(TestInitiatorPsk):
15951657
""" test ikev2 initiator - rekey """
15961658

@@ -1607,7 +1669,6 @@ def rekey_from_initiator(self):
16071669
plain = self.sa.hmac_and_decrypt(ih)
16081670
sa = ikev2.IKEv2_payload_SA(plain)
16091671
prop = sa[ikev2.IKEv2_payload_Proposal]
1610-
nonce = sa[ikev2.IKEv2_payload_Nonce]
16111672
self.sa.i_nonce = sa[ikev2.IKEv2_payload_Nonce].load
16121673
self.sa.r_nonce = self.sa.i_nonce
16131674
# update new responder SPI
@@ -1700,15 +1761,7 @@ class TestResponderRekey(TestResponderPsk):
17001761
""" test ikev2 responder - rekey """
17011762

17021763
def rekey_from_initiator(self):
1703-
sa, first_payload = self.generate_auth_payload(is_rekey=True)
1704-
header = ikev2.IKEv2(
1705-
init_SPI=self.sa.ispi,
1706-
resp_SPI=self.sa.rspi, id=self.sa.new_msg_id(),
1707-
flags='Initiator', exch_type='CREATE_CHILD_SA')
1708-
1709-
ike_msg = self.encrypt_ike_msg(header, sa, first_payload)
1710-
packet = self.create_packet(self.pg0, ike_msg, self.sa.sport,
1711-
self.sa.dport, self.sa.natt, self.ip6)
1764+
packet = self.create_rekey_request()
17121765
self.pg0.add_stream(packet)
17131766
self.pg0.enable_capture()
17141767
self.pg_start()
@@ -1717,7 +1770,6 @@ def rekey_from_initiator(self):
17171770
plain = self.sa.hmac_and_decrypt(ih)
17181771
sa = ikev2.IKEv2_payload_SA(plain)
17191772
prop = sa[ikev2.IKEv2_payload_Proposal]
1720-
nonce = sa[ikev2.IKEv2_payload_Nonce]
17211773
self.sa.r_nonce = sa[ikev2.IKEv2_payload_Nonce].load
17221774
# update new responder SPI
17231775
self.sa.child_sas[0].rspi = prop.SPI
@@ -1794,14 +1846,7 @@ class TestInitiatorKeepaliveMsg(TestInitiatorPsk):
17941846
"""
17951847

17961848
def send_empty_req_from_responder(self):
1797-
header = ikev2.IKEv2(init_SPI=self.sa.ispi, resp_SPI=self.sa.rspi,
1798-
id=self.sa.new_msg_id(), flags='Initiator',
1799-
exch_type='INFORMATIONAL',
1800-
next_payload='Encrypted')
1801-
1802-
msg = self.encrypt_ike_msg(header, b'', None)
1803-
packet = self.create_packet(self.pg0, msg, self.sa.sport,
1804-
self.sa.dport, self.sa.natt, self.ip6)
1849+
packet = self.create_empty_request()
18051850
self.pg0.add_stream(packet)
18061851
self.pg0.enable_capture()
18071852
self.pg_start()

0 commit comments

Comments
 (0)