@@ -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+
15941656class 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