2 * Copyright (C) 2016-2017 Tobias Brunner
4 * Copyright (C) secunet Security Networks AG
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "test_suite.h"
20 #include <tests/utils/exchange_test_helper.h>
21 #include <tests/utils/exchange_test_asserts.h>
22 #include <tests/utils/job_asserts.h>
23 #include <tests/utils/sa_asserts.h>
26 * Initiate rekeying the CHILD_SA with the given SPI on the given IKE_SA.
28 #define initiate_rekey(sa, spi) ({ \
29 assert_hook_not_called(child_updown); \
30 assert_hook_not_called(child_rekey); \
31 call_ikesa(sa, rekey_child_sa, PROTO_ESP, spi); \
32 assert_child_sa_state(sa, spi, CHILD_REKEYING, CHILD_OUTBOUND_INSTALLED); \
38 * Destroy a rekeyed CHILD_SA that was kept around to accept inbound traffic.
39 * Simulates the job that's scheduled to do this.
41 #define destroy_rekeyed(sa, spi) ({ \
42 assert_hook_not_called(child_updown); \
43 assert_hook_not_called(child_rekey); \
44 assert_no_jobs_scheduled(); \
45 assert_child_sa_state(sa, spi, CHILD_DELETED, CHILD_OUTBOUND_NONE); \
46 call_ikesa(sa, delete_child_sa, PROTO_ESP, spi, FALSE); \
47 assert_child_sa_not_exists(sa, spi); \
54 * Regular CHILD_SA rekey either initiated by the original initiator or
55 * responder of the IKE_SA.
57 START_TEST(test_regular
)
60 uint32_t spi_a
= _i
+1, spi_b
= 2-_i
;
63 { /* responder rekeys the CHILD_SA (SPI 2) */
64 exchange_test_helper
->establish_sa(exchange_test_helper
,
68 { /* initiator rekeys the CHILD_SA (SPI 1) */
69 exchange_test_helper
->establish_sa(exchange_test_helper
,
72 initiate_rekey(a
, spi_a
);
73 assert_ipsec_sas_installed(a
, spi_a
, spi_b
);
75 /* this should never get called as this results in a successful rekeying */
76 assert_hook_not_called(child_updown
);
78 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
79 assert_hook_called(child_rekey
);
80 assert_notify(IN
, REKEY_SA
);
81 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
82 assert_child_sa_state(b
, spi_b
, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
83 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
84 assert_ipsec_sas_installed(b
, spi_a
, spi_b
, 4);
87 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
88 assert_hook_called(child_rekey
);
89 assert_no_notify(IN
, REKEY_SA
);
90 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
91 assert_child_sa_state(a
, spi_a
, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
92 assert_child_sa_state(a
, 3, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
93 assert_ipsec_sas_installed(a
, spi_a
, 3, 4);
96 /* INFORMATIONAL { D } --> */
97 assert_hook_not_called(child_rekey
);
98 assert_jobs_scheduled(1);
99 assert_single_payload(IN
, PLV2_DELETE
);
100 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
101 assert_child_sa_state(b
, spi_b
, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
102 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
103 assert_child_sa_count(b
, 2);
104 assert_ipsec_sas_installed(b
, spi_b
, 3, 4);
107 /* <-- INFORMATIONAL { D } */
108 assert_hook_not_called(child_rekey
);
109 assert_jobs_scheduled(1);
110 assert_single_payload(IN
, PLV2_DELETE
);
111 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
112 assert_child_sa_state(a
, spi_a
, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
113 assert_child_sa_state(a
, 3, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
114 assert_child_sa_count(a
, 2);
115 assert_ipsec_sas_installed(a
, spi_a
, 3, 4);
119 /* simulate the execution of the scheduled jobs */
120 destroy_rekeyed(a
, spi_a
);
121 assert_child_sa_count(a
, 1);
122 assert_ipsec_sas_installed(a
, 3, 4);
123 destroy_rekeyed(b
, spi_b
);
124 assert_child_sa_count(b
, 1);
125 assert_ipsec_sas_installed(a
, 3, 4);
130 call_ikesa(a
, destroy
);
131 call_ikesa(b
, destroy
);
136 * CHILD_SA rekey where the responder does not agree with the DH group selected
137 * by the initiator, either initiated by the original initiator or responder of
140 START_TEST(test_regular_ke_invalid
)
142 exchange_test_sa_conf_t conf
= {
144 .esp
= "aes128-sha256-modp2048-modp3072",
147 .esp
= "aes128-sha256-modp3072-modp2048",
151 uint32_t spi_a
= _i
+1, spi_b
= 2-_i
;
154 { /* responder rekeys the CHILD_SA (SPI 2) */
155 exchange_test_helper
->establish_sa(exchange_test_helper
,
159 { /* initiator rekeys the CHILD_SA (SPI 1) */
160 exchange_test_helper
->establish_sa(exchange_test_helper
,
163 initiate_rekey(a
, spi_a
);
164 assert_ipsec_sas_installed(a
, spi_a
, spi_b
);
166 /* this should never get called as this results in a successful rekeying */
167 assert_hook_not_called(child_updown
);
169 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
170 assert_hook_not_called(child_rekey
);
171 assert_notify(IN
, REKEY_SA
);
172 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
173 assert_child_sa_state(b
, spi_b
, CHILD_INSTALLED
);
174 assert_child_sa_count(b
, 1);
175 assert_ipsec_sas_installed(b
, spi_a
, spi_b
);
178 /* <-- CREATE_CHILD_SA { N(INVAL_KE) } */
179 assert_hook_not_called(child_rekey
);
180 assert_single_notify(IN
, INVALID_KE_PAYLOAD
);
181 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
182 assert_child_sa_state(a
, spi_a
, CHILD_REKEYING
);
183 assert_child_sa_count(a
, 1);
184 assert_ipsec_sas_installed(a
, spi_a
, spi_b
);
187 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
188 assert_hook_called(child_rekey
);
189 assert_notify(IN
, REKEY_SA
);
190 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
191 assert_child_sa_state(b
, spi_b
, CHILD_REKEYED
);
192 assert_child_sa_state(b
, 6, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
193 assert_ipsec_sas_installed(b
, spi_a
, spi_b
, 6);
196 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
197 assert_hook_called(child_rekey
);
198 assert_no_notify(IN
, REKEY_SA
);
199 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
200 assert_child_sa_state(a
, spi_a
, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
201 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
202 assert_ipsec_sas_installed(a
, spi_a
, 5, 6);
205 /* INFORMATIONAL { D } --> */
206 assert_hook_not_called(child_rekey
);
207 assert_single_payload(IN
, PLV2_DELETE
);
208 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
209 assert_child_sa_state(b
, spi_b
, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
210 assert_child_sa_state(b
, 6, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
211 assert_child_sa_count(b
, 2);
212 assert_ipsec_sas_installed(b
, spi_b
, 5, 6);
214 /* <-- INFORMATIONAL { D } */
215 assert_hook_not_called(child_rekey
);
216 assert_single_payload(IN
, PLV2_DELETE
);
217 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
218 assert_child_sa_state(a
, spi_a
, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
219 assert_child_sa_state(a
, 5, CHILD_INSTALLED
);
220 assert_child_sa_count(a
, 2);
221 assert_ipsec_sas_installed(a
, spi_a
, 5, 6);
224 /* simulate the execution of the scheduled jobs */
225 destroy_rekeyed(a
, spi_a
);
226 assert_child_sa_count(a
, 1);
227 assert_ipsec_sas_installed(a
, 5, 6);
228 destroy_rekeyed(b
, spi_b
);
229 assert_child_sa_count(b
, 1);
230 assert_ipsec_sas_installed(b
, 5, 6);
235 /* because the DH group should get reused another rekeying should complete
236 * without additional exchange */
237 initiate_rekey(a
, 5);
238 /* this should never get called as this results in a successful rekeying */
239 assert_hook_not_called(child_updown
);
241 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
242 assert_hook_called(child_rekey
);
243 assert_notify(IN
, REKEY_SA
);
244 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
245 assert_child_sa_state(b
, 6, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
246 assert_child_sa_state(b
, 8, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
247 assert_ipsec_sas_installed(b
, 5, 6, 8);
250 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
251 assert_hook_called(child_rekey
);
252 assert_no_notify(IN
, REKEY_SA
);
253 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
254 assert_child_sa_state(a
, 5, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
255 assert_child_sa_state(a
, 7, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
256 assert_ipsec_sas_installed(a
, 5, 7, 8);
259 /* INFORMATIONAL { D } --> */
260 assert_hook_not_called(child_rekey
);
261 assert_single_payload(IN
, PLV2_DELETE
);
262 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
263 assert_child_sa_state(b
, 6, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
264 assert_child_sa_state(b
, 8, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
265 assert_child_sa_count(b
, 2);
266 assert_ipsec_sas_installed(b
, 6, 7, 8);
269 /* <-- INFORMATIONAL { D } */
270 assert_hook_not_called(child_rekey
);
271 assert_single_payload(IN
, PLV2_DELETE
);
272 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
273 assert_child_sa_state(a
, 5, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
274 assert_child_sa_state(a
, 7, CHILD_INSTALLED
);
275 assert_child_sa_count(a
, 2);
276 assert_ipsec_sas_installed(a
, 5, 7, 8);
279 /* simulate the execution of the scheduled jobs */
280 destroy_rekeyed(a
, 5);
281 assert_child_sa_count(a
, 1);
282 assert_ipsec_sas_installed(a
, 7, 8);
283 destroy_rekeyed(b
, 6);
284 assert_child_sa_count(b
, 1);
285 assert_ipsec_sas_installed(b
, 7, 8);
290 call_ikesa(a
, destroy
);
291 call_ikesa(b
, destroy
);
296 * Check that the responder ignores soft expires while waiting for the delete
299 START_TEST(test_regular_responder_ignore_soft_expire
)
303 exchange_test_helper
->establish_sa(exchange_test_helper
,
305 initiate_rekey(a
, 1);
306 assert_ipsec_sas_installed(a
, 1, 2);
308 /* this should never get called as this results in a successful rekeying */
309 assert_hook_not_called(child_updown
);
311 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
312 assert_hook_called(child_rekey
);
313 assert_notify(IN
, REKEY_SA
);
314 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
315 assert_child_sa_state(b
, 2, CHILD_REKEYED
);
316 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
317 assert_ipsec_sas_installed(b
, 1, 2, 4);
320 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
321 assert_hook_called(child_rekey
);
322 assert_no_notify(IN
, REKEY_SA
);
323 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
324 assert_child_sa_state(a
, 1, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
325 assert_child_sa_state(a
, 3, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
326 assert_ipsec_sas_installed(a
, 1, 3, 4);
329 /* we don't expect this to get called anymore */
330 assert_hook_not_called(child_rekey
);
331 /* this should not produce a message, if it does there won't be a delete
333 call_ikesa(b
, rekey_child_sa
, PROTO_ESP
, 2);
334 assert_child_sa_state(b
, 2, CHILD_REKEYED
);
336 /* INFORMATIONAL { D } --> */
337 assert_jobs_scheduled(1);
338 assert_single_payload(IN
, PLV2_DELETE
);
339 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
340 assert_child_sa_state(b
, 2, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
341 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
342 assert_child_sa_count(b
, 2);
343 assert_ipsec_sas_installed(b
, 2, 3, 4);
345 /* <-- INFORMATIONAL { D } */
346 assert_jobs_scheduled(1);
347 assert_single_payload(IN
, PLV2_DELETE
);
348 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
349 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
350 assert_child_sa_state(a
, 3, CHILD_INSTALLED
);
351 assert_child_sa_count(a
, 2);
352 assert_ipsec_sas_installed(a
, 1, 3, 4);
355 /* simulate the execution of the scheduled jobs */
356 destroy_rekeyed(a
, 1);
357 assert_child_sa_count(a
, 1);
358 assert_ipsec_sas_installed(a
, 3, 4);
359 destroy_rekeyed(b
, 2);
360 assert_child_sa_count(b
, 1);
361 assert_ipsec_sas_installed(b
, 3, 4);
363 /* child_rekey/child_updown */
367 call_ikesa(a
, destroy
);
368 call_ikesa(b
, destroy
);
373 * Check that the responder handles hard expires properly while waiting for the
374 * delete after a rekeying (e.g. if the rekey settings are tight or the
375 * CREATE_CHILD_SA response is delayed).
377 START_TEST(test_regular_responder_handle_hard_expire
)
381 exchange_test_helper
->establish_sa(exchange_test_helper
,
383 initiate_rekey(a
, 1);
384 assert_ipsec_sas_installed(a
, 1, 2);
386 /* this should never get called as this results in a successful rekeying */
387 assert_hook_not_called(child_updown
);
389 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
390 assert_hook_called(child_rekey
);
391 assert_notify(IN
, REKEY_SA
);
392 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
393 assert_child_sa_state(b
, 2, CHILD_REKEYED
);
394 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
395 assert_ipsec_sas_installed(b
, 1, 2, 4);
398 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
399 assert_hook_called(child_rekey
);
400 assert_no_notify(IN
, REKEY_SA
);
401 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
402 assert_child_sa_state(a
, 1, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
403 assert_child_sa_state(a
, 3, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
404 assert_ipsec_sas_installed(a
, 1, 3, 4);
407 /* we don't expect this to get called anymore */
408 assert_hook_not_called(child_rekey
);
409 /* this is similar to a regular delete collision, but we don't actually
410 * want to send a delete back as that might conflict with a delayed
411 * CREATE_CHILD_SA response */
412 call_ikesa(b
, delete_child_sa
, PROTO_ESP
, 2, TRUE
);
413 assert_child_sa_count(b
, 1);
414 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
415 /* the expire causes the outbound SA to get installed */
416 assert_ipsec_sas_installed(b
, 3, 4);
418 /* INFORMATIONAL { D } --> */
419 assert_no_jobs_scheduled();
420 assert_single_payload(IN
, PLV2_DELETE
);
421 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
422 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
423 assert_ipsec_sas_installed(b
, 3, 4);
425 /* <-- INFORMATIONAL { } */
426 assert_jobs_scheduled(1);
427 assert_message_empty(IN
);
428 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
429 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
430 assert_child_sa_state(a
, 3, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
431 assert_child_sa_count(a
, 2);
432 assert_ipsec_sas_installed(a
, 1, 3, 4);
435 /* simulate the execution of the scheduled job */
436 destroy_rekeyed(a
, 1);
437 assert_child_sa_count(a
, 1);
438 assert_ipsec_sas_installed(a
, 3, 4);
440 /* child_rekey/child_updown */
444 call_ikesa(a
, destroy
);
445 call_ikesa(b
, destroy
);
450 * Both peers initiate the CHILD_SA rekeying concurrently and should handle
451 * the collision properly depending on the nonces.
453 START_TEST(test_collision
)
457 exchange_test_helper
->establish_sa(exchange_test_helper
,
460 /* When rekeyings collide we get two CHILD_SAs with a total of four nonces.
461 * The CHILD_SA with the lowest nonce SHOULD be deleted by the peer that
462 * created that CHILD_SA. The replaced CHILD_SA is deleted by the peer that
463 * initiated the surviving SA.
464 * Four nonces and SPIs are needed (SPI 1 and 2 are used for the initial
466 * N1/3 -----\ /----- N2/4
468 * N4/6 <-------/ /----- ...
470 * We test this four times, each time a different nonce is the lowest.
473 /* Nonces used at each point */
475 /* SPIs of the deleted CHILD_SA (either redundant or replaced) */
476 uint32_t spi_del_a
, spi_del_b
;
477 /* SPIs of the kept CHILD_SA */
478 uint32_t spi_a
, spi_b
;
480 { { 0x00, 0xFF, 0xFF, 0xFF }, 3, 2, 6, 4 },
481 { { 0xFF, 0x00, 0xFF, 0xFF }, 1, 4, 3, 5 },
482 { { 0xFF, 0xFF, 0x00, 0xFF }, 3, 2, 6, 4 },
483 { { 0xFF, 0xFF, 0xFF, 0x00 }, 1, 4, 3, 5 },
486 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
487 initiate_rekey(a
, 1);
488 assert_ipsec_sas_installed(a
, 1, 2);
489 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
490 initiate_rekey(b
, 2);
491 assert_ipsec_sas_installed(b
, 1, 2);
493 /* this should never get called as this results in a successful rekeying */
494 assert_hook_not_called(child_updown
);
496 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
497 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[2];
498 assert_hook_rekey(child_rekey
, 2, 5);
499 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
500 assert_child_sa_state(b
, 2, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
501 assert_child_sa_state(b
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
502 assert_ipsec_sas_installed(b
, 1, 2, 5);
504 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
505 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[3];
506 assert_hook_rekey(child_rekey
, 1, 6);
507 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
508 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
509 assert_child_sa_state(a
, 6, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
510 assert_ipsec_sas_installed(a
, 1, 2, 6);
513 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
514 if (data
[_i
].spi_del_a
== 1)
515 { /* currently we call this again if we keep our own replacement as we
516 * already called it above */
517 assert_hook_rekey(child_rekey
, 1, data
[_i
].spi_a
);
518 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
520 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_REKEYED
,
521 CHILD_OUTBOUND_REGISTERED
);
522 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
523 CHILD_OUTBOUND_INSTALLED
);
524 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
525 CHILD_OUTBOUND_NONE
);
526 assert_ipsec_sas_installed(a
, 1, 3, 5, 6);
530 assert_hook_not_called(child_rekey
);
531 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
533 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_REKEYED
,
534 CHILD_OUTBOUND_INSTALLED
);
535 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
536 CHILD_OUTBOUND_REGISTERED
);
537 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
538 CHILD_OUTBOUND_REGISTERED
);
539 assert_ipsec_sas_installed(a
, 1, 2, 3, 6);
541 /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
542 if (data
[_i
].spi_del_b
== 2)
544 assert_hook_rekey(child_rekey
, 2, data
[_i
].spi_b
);
545 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
547 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
548 CHILD_OUTBOUND_REGISTERED
);
549 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
550 CHILD_OUTBOUND_INSTALLED
);
551 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
552 CHILD_OUTBOUND_NONE
);
553 assert_ipsec_sas_installed(b
, 2, 4, 5, 6);
557 assert_hook_not_called(child_rekey
);
558 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
560 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
561 CHILD_OUTBOUND_INSTALLED
);
562 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
563 CHILD_OUTBOUND_REGISTERED
);
564 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
565 CHILD_OUTBOUND_REGISTERED
);
566 assert_ipsec_sas_installed(b
, 1, 2, 4, 5);
569 /* we don't expect this hook to get called anymore */
570 assert_hook_not_called(child_rekey
);
571 /* INFORMATIONAL { D } --> */
572 assert_jobs_scheduled(1);
573 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
574 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
575 data
[_i
].spi_del_b
== 2 ? CHILD_OUTBOUND_NONE
576 : CHILD_OUTBOUND_REGISTERED
);
577 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_DELETED
,
578 CHILD_OUTBOUND_NONE
);
579 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
580 CHILD_OUTBOUND_INSTALLED
);
581 assert_child_sa_count(b
, 3);
582 if (data
[_i
].spi_del_b
== 2)
584 assert_ipsec_sas_installed(b
, 2, 4, 5, 6);
588 assert_ipsec_sas_installed(b
, 2, 3, 4, 5);
591 /* <-- INFORMATIONAL { D } */
592 assert_jobs_scheduled(1);
593 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
594 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
595 data
[_i
].spi_del_a
== 1 ? CHILD_OUTBOUND_NONE
596 : CHILD_OUTBOUND_REGISTERED
);
597 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
598 CHILD_OUTBOUND_NONE
);
599 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
600 CHILD_OUTBOUND_INSTALLED
);
601 assert_child_sa_count(a
, 3);
602 if (data
[_i
].spi_del_a
== 1)
604 assert_ipsec_sas_installed(a
, 1, 3, 5, 6);
608 assert_ipsec_sas_installed(a
, 1, 3, 4, 6);
611 /* <-- INFORMATIONAL { D } */
612 assert_jobs_scheduled(1);
613 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
614 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETED
,
615 CHILD_OUTBOUND_NONE
);
616 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
617 CHILD_OUTBOUND_NONE
);
618 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
619 CHILD_OUTBOUND_INSTALLED
);
620 assert_child_sa_count(a
, 3);
621 assert_ipsec_sas_installed(a
, 1, 3, 6,
622 data
[_i
].spi_del_a
== 1 ? 5 : 4);
624 /* INFORMATIONAL { D } --> */
625 assert_jobs_scheduled(1);
626 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
627 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETED
,
628 CHILD_OUTBOUND_NONE
);
629 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_DELETED
,
630 CHILD_OUTBOUND_NONE
);
631 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
632 CHILD_OUTBOUND_INSTALLED
);
633 assert_child_sa_count(b
, 3);
634 assert_ipsec_sas_installed(b
, 2, 4, 5,
635 data
[_i
].spi_del_b
== 2 ? 6 : 3);
638 /* simulate the execution of the scheduled jobs */
639 destroy_rekeyed(a
, data
[_i
].spi_del_a
);
640 destroy_rekeyed(a
, data
[_i
].spi_del_b
);
641 assert_child_sa_count(a
, 1);
642 assert_ipsec_sas_installed(a
, data
[_i
].spi_a
, data
[_i
].spi_b
);
643 destroy_rekeyed(b
, data
[_i
].spi_del_a
);
644 destroy_rekeyed(b
, data
[_i
].spi_del_b
);
645 assert_child_sa_count(b
, 1);
646 assert_ipsec_sas_installed(b
, data
[_i
].spi_a
, data
[_i
].spi_b
);
648 /* child_rekey/child_updown */
652 call_ikesa(a
, destroy
);
653 call_ikesa(b
, destroy
);
658 * This is like the rekey collision above, but one peer deletes the
659 * redundant/old SA before the other peer receives the CREATE_CHILD_SA
662 * rekey ----\ /---- rekey
663 * \-----/----> detect collision
664 * detect collision <---------/ /----
667 * handle delete <--------/------- delete SA
669 * handle rekey <------/
670 * delete SA ---------------->
673 START_TEST(test_collision_delayed_response
)
678 exchange_test_helper
->establish_sa(exchange_test_helper
,
681 /* Four nonces and SPIs are needed (SPI 1 and 2 are used for the initial
683 * N1/3 -----\ /----- N2/4
685 * N4/6 <-------/ /----- ...
687 * We test this four times, each time a different nonce is the lowest.
690 /* Nonces used at each point */
692 /* SPIs of the deleted CHILD_SA (either redundant or replaced) */
693 uint32_t spi_del_a
, spi_del_b
;
694 /* SPIs of the kept CHILD_SA */
695 uint32_t spi_a
, spi_b
;
697 { { 0x00, 0xFF, 0xFF, 0xFF }, 3, 2, 6, 4 },
698 { { 0xFF, 0x00, 0xFF, 0xFF }, 1, 4, 3, 5 },
699 { { 0xFF, 0xFF, 0x00, 0xFF }, 3, 2, 6, 4 },
700 { { 0xFF, 0xFF, 0xFF, 0x00 }, 1, 4, 3, 5 },
703 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
704 initiate_rekey(a
, 1);
705 assert_ipsec_sas_installed(a
, 1, 2);
706 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
707 initiate_rekey(b
, 2);
708 assert_ipsec_sas_installed(b
, 1, 2);
710 /* this should never get called as this results in a successful rekeying */
711 assert_hook_not_called(child_updown
);
713 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
714 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[2];
715 assert_hook_rekey(child_rekey
, 2, 5);
716 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
717 assert_child_sa_state(b
, 2, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
718 assert_child_sa_state(b
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
719 assert_ipsec_sas_installed(b
, 1, 2, 5);
721 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
722 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[3];
723 assert_hook_rekey(child_rekey
, 1, 6);
724 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
725 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
726 assert_child_sa_state(a
, 6, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
727 assert_ipsec_sas_installed(a
, 1, 2, 6);
730 /* delay the CREATE_CHILD_SA response from b to a */
731 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
733 /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
734 if (data
[_i
].spi_del_b
== 2)
736 assert_hook_rekey(child_rekey
, 2, data
[_i
].spi_b
);
737 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
739 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
740 CHILD_OUTBOUND_REGISTERED
);
741 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
742 CHILD_OUTBOUND_INSTALLED
);
743 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
744 CHILD_OUTBOUND_NONE
);
745 assert_ipsec_sas_installed(b
, 2, 4, 5, 6);
749 assert_hook_not_called(child_rekey
);
750 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
752 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
753 CHILD_OUTBOUND_INSTALLED
);
754 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
755 CHILD_OUTBOUND_REGISTERED
);
756 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
757 CHILD_OUTBOUND_REGISTERED
);
758 assert_ipsec_sas_installed(b
, 1, 2, 4, 5);
761 /* <-- INFORMATIONAL { D } */
762 assert_hook_not_called(child_rekey
);
763 assert_jobs_scheduled(1);
764 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
765 if (data
[_i
].spi_del_b
== 2)
767 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
768 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
769 CHILD_OUTBOUND_INSTALLED
);
770 assert_ipsec_sas_installed(a
, 1, 4, 6);
774 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
775 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
776 CHILD_OUTBOUND_NONE
);
777 assert_ipsec_sas_installed(a
, 1, 2, 6);
779 assert_child_sa_count(a
, 2);
781 /* INFORMATIONAL { D } --> */
782 assert_jobs_scheduled(1);
783 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
784 if (data
[_i
].spi_del_b
== 2)
786 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
787 CHILD_OUTBOUND_REGISTERED
);
788 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
789 CHILD_OUTBOUND_INSTALLED
);
790 assert_ipsec_sas_installed(b
, 2, 4, 5, 6);
794 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
795 CHILD_OUTBOUND_INSTALLED
);
796 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
797 CHILD_OUTBOUND_REGISTERED
);
798 assert_ipsec_sas_installed(b
, 1, 2, 4, 5);
800 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETED
,
801 CHILD_OUTBOUND_NONE
);
802 assert_child_sa_count(b
, 3);
806 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } (delayed) */
807 if (data
[_i
].spi_del_a
== 1)
809 assert_hook_rekey(child_rekey
, 1, data
[_i
].spi_a
);
810 exchange_test_helper
->process_message(exchange_test_helper
, a
, msg
);
812 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
813 CHILD_OUTBOUND_NONE
);
814 assert_ipsec_sas_installed(a
, 1, 3, 5, 6);
818 assert_hook_not_called(child_rekey
);
819 exchange_test_helper
->process_message(exchange_test_helper
, a
, msg
);
821 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
822 CHILD_OUTBOUND_REGISTERED
);
823 assert_ipsec_sas_installed(a
, 1, 3, 4, 6);
825 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
826 CHILD_OUTBOUND_NONE
);
827 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
828 CHILD_OUTBOUND_INSTALLED
);
829 assert_child_sa_count(a
, 3);
831 /* we don't expect this hook to get called anymore */
832 assert_hook_not_called(child_rekey
);
833 /* INFORMATIONAL { D } --> */
834 assert_jobs_scheduled(1);
835 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
836 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_DELETED
,
837 CHILD_OUTBOUND_NONE
);
838 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETED
,
839 CHILD_OUTBOUND_NONE
);
840 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
841 CHILD_OUTBOUND_INSTALLED
);
842 assert_ipsec_sas_installed(b
, 2, 4, 5,
843 data
[_i
].spi_del_b
== 2 ? 6 : 3);
844 assert_child_sa_count(b
, 3);
846 /* <-- INFORMATIONAL { D } */
847 assert_jobs_scheduled(1);
848 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
849 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETED
,
850 CHILD_OUTBOUND_NONE
);
851 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
852 CHILD_OUTBOUND_NONE
);
853 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
854 CHILD_OUTBOUND_INSTALLED
);
855 assert_child_sa_count(a
, 3);
856 assert_ipsec_sas_installed(a
, 1, 3, 6,
857 data
[_i
].spi_del_a
== 1 ? 5 : 4);
860 /* simulate the execution of the scheduled jobs */
861 destroy_rekeyed(a
, data
[_i
].spi_del_a
);
862 destroy_rekeyed(a
, data
[_i
].spi_del_b
);
863 assert_child_sa_count(a
, 1);
864 assert_ipsec_sas_installed(a
, data
[_i
].spi_a
, data
[_i
].spi_b
);
865 destroy_rekeyed(b
, data
[_i
].spi_del_a
);
866 destroy_rekeyed(b
, data
[_i
].spi_del_b
);
867 assert_child_sa_count(b
, 1);
868 assert_ipsec_sas_installed(b
, data
[_i
].spi_a
, data
[_i
].spi_b
);
870 /* child_rekey/child_updown */
874 call_ikesa(a
, destroy
);
875 call_ikesa(b
, destroy
);
880 * In this scenario one of the peers does not notice that there is a
883 * rekey ----\ /---- rekey
885 * detect collision <-----\---/
887 * \ /---- delete old SA
888 * \-/----> detect collision
889 * detect collision <---------/ /---- TEMP_FAIL
890 * delete -----------/---->
891 * aborts rekeying <---------/
893 START_TEST(test_collision_delayed_request
)
898 exchange_test_helper
->establish_sa(exchange_test_helper
,
901 /* Three nonces and SPIs are needed (SPI 1 and 2 are used for the initial
903 * N1/3 -----\ /----- N2/4
905 * ... -----\ \-------> ...
906 * We test this three times, each time a different nonce is the lowest.
909 /* Nonces used at each point */
912 { { 0x00, 0xFF, 0xFF } },
913 { { 0xFF, 0x00, 0xFF } },
914 { { 0xFF, 0xFF, 0x00 } },
917 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
918 initiate_rekey(a
, 1);
919 assert_ipsec_sas_installed(a
, 1, 2);
920 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
921 initiate_rekey(b
, 2);
922 assert_ipsec_sas_installed(b
, 1, 2);
924 /* delay the CREATE_CHILD_SA request from a to b */
925 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
927 /* this should never get called as this results in a successful rekeying */
928 assert_hook_not_called(child_updown
);
930 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
931 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[2];
932 assert_hook_rekey(child_rekey
, 1, 5);
933 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
934 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
935 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
936 assert_ipsec_sas_installed(a
, 1, 2, 5);
938 /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
939 assert_hook_rekey(child_rekey
, 2, 4);
940 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
941 assert_child_sa_state(b
, 2, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
942 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
943 assert_ipsec_sas_installed(b
, 2, 4, 5);
946 /* we don't expect this hook to get called anymore */
947 assert_hook_not_called(child_rekey
);
949 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> (delayed) */
950 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
951 exchange_test_helper
->process_message(exchange_test_helper
, b
, msg
);
952 assert_child_sa_state(b
, 2, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
953 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
955 /* <-- INFORMATIONAL { D } */
956 assert_jobs_scheduled(1);
957 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
958 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
959 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
960 assert_child_sa_count(a
, 2);
961 assert_ipsec_sas_installed(a
, 1, 4, 5);
964 /* <-- CREATE_CHILD_SA { N(TEMP_FAIL) } */
965 assert_no_jobs_scheduled();
966 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
967 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
968 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
969 assert_child_sa_count(a
, 2);
970 assert_ipsec_sas_installed(a
, 1, 4, 5);
973 /* INFORMATIONAL { D } --> */
974 assert_jobs_scheduled(1);
975 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
976 assert_child_sa_state(b
, 2, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
977 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
978 assert_child_sa_count(b
, 2);
979 assert_ipsec_sas_installed(b
, 2, 4, 5);
982 /* simulate the execution of the scheduled jobs */
983 destroy_rekeyed(a
, 1);
984 assert_child_sa_count(a
, 1);
985 assert_ipsec_sas_installed(a
, 4, 5);
986 destroy_rekeyed(b
, 2);
987 assert_child_sa_count(b
, 1);
988 assert_ipsec_sas_installed(b
, 4, 5);
990 /* child_rekey/child_updown */
997 call_ikesa(a
, destroy
);
998 call_ikesa(b
, destroy
);
1003 * Similar to above one peer fails to notice the collision but the
1004 * CREATE_CHILD_SA request is even more delayed:
1006 * rekey ----\ /---- rekey
1008 * detect collision <-----\---/
1010 * detect collision <-------\-------- delete old SA
1011 * delete ---------\------>
1013 * /---- CHILD_SA_NOT_FOUND
1014 * aborts rekeying <----------/
1016 START_TEST(test_collision_delayed_request_more
)
1021 exchange_test_helper
->establish_sa(exchange_test_helper
,
1024 /* Three nonces and SPIs are needed (SPI 1 and 2 are used for the initial
1026 * N1/3 -----\ /----- N2/4
1028 * ... -----\ \-------> ...
1029 * We test this three times, each time a different nonce is the lowest.
1032 /* Nonces used at each point */
1035 { { 0x00, 0xFF, 0xFF } },
1036 { { 0xFF, 0x00, 0xFF } },
1037 { { 0xFF, 0xFF, 0x00 } },
1040 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
1041 initiate_rekey(a
, 1);
1042 assert_ipsec_sas_installed(a
, 1, 2);
1043 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
1044 initiate_rekey(b
, 2);
1045 assert_ipsec_sas_installed(b
, 1, 2);
1047 /* delay the CREATE_CHILD_SA request from a to b */
1048 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
1050 /* this should never get called as this results in a successful rekeying */
1051 assert_hook_not_called(child_updown
);
1053 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
1054 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[2];
1055 assert_hook_rekey(child_rekey
, 1, 5);
1056 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1057 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
1058 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
1059 assert_ipsec_sas_installed(a
, 1, 2, 5);
1061 /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
1062 assert_hook_rekey(child_rekey
, 2, 4);
1063 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1064 assert_child_sa_state(b
, 2, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
1065 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1066 assert_ipsec_sas_installed(b
, 2, 4, 5);
1069 /* we don't expect this hook to get called anymore */
1070 assert_hook_not_called(child_rekey
);
1072 /* <-- INFORMATIONAL { D } */
1073 assert_jobs_scheduled(1);
1074 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1075 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1076 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1077 assert_child_sa_count(a
, 2);
1078 assert_ipsec_sas_installed(a
, 1, 4, 5);
1080 /* INFORMATIONAL { D } --> */
1081 assert_jobs_scheduled(1);
1082 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1083 assert_child_sa_state(b
, 2, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1084 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1085 assert_child_sa_count(b
, 2);
1086 assert_ipsec_sas_installed(b
, 2, 4, 5);
1089 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1090 assert_single_notify(OUT
, CHILD_SA_NOT_FOUND
);
1091 exchange_test_helper
->process_message(exchange_test_helper
, b
, msg
);
1092 assert_child_sa_state(b
, 2, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1093 assert_child_sa_state(b
, 4, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1094 assert_child_sa_count(b
, 2);
1095 assert_ipsec_sas_installed(b
, 2, 4, 5);
1096 /* <-- CREATE_CHILD_SA { N(NO_CHILD_SA) } */
1097 assert_no_jobs_scheduled();
1098 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1099 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1100 assert_child_sa_state(a
, 5, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1101 assert_child_sa_count(a
, 2);
1102 assert_ipsec_sas_installed(a
, 1, 4, 5);
1105 /* simulate the execution of the scheduled jobs */
1106 destroy_rekeyed(a
, 1);
1107 assert_child_sa_count(a
, 1);
1108 assert_ipsec_sas_installed(a
, 4, 5);
1109 destroy_rekeyed(b
, 2);
1110 assert_child_sa_count(b
, 1);
1111 assert_ipsec_sas_installed(b
, 4, 5);
1113 /* child_rekey/child_updown */
1120 call_ikesa(a
, destroy
);
1121 call_ikesa(b
, destroy
);
1126 * Both peers initiate the CHILD_SA reekying concurrently but the proposed DH
1127 * groups are not the same after handling the INVALID_KE_PAYLOAD they should
1128 * still handle the collision properly depending on the nonces.
1130 START_TEST(test_collision_ke_invalid
)
1132 exchange_test_sa_conf_t conf
= {
1134 .esp
= "aes128-sha256-modp2048-modp3072",
1137 .esp
= "aes128-sha256-modp3072-modp2048",
1142 exchange_test_helper
->establish_sa(exchange_test_helper
,
1145 /* Eight nonces and SPIs are needed (SPI 1 and 2 are used for the initial
1147 * N1/3 -----\ /----- N2/4
1149 * N4/6 <-------/ /---- INVAL_KE
1152 * N5/7 -----\ \------->
1155 * N8/10 <--------/ /---- ...
1158 * We test this four times, each time a different nonce is the lowest.
1161 /* Nonces used at each point */
1163 /* SPIs of the deleted CHILD_SA (either redundant or replaced) */
1164 uint32_t spi_del_a
, spi_del_b
;
1165 /* SPIs of the kept CHILD_SA */
1166 uint32_t spi_a
, spi_b
;
1168 { { 0x00, 0xFF, 0xFF, 0xFF }, 7, 2,10, 8 },
1169 { { 0xFF, 0x00, 0xFF, 0xFF }, 1, 8, 7, 9 },
1170 { { 0xFF, 0xFF, 0x00, 0xFF }, 7, 2,10, 8 },
1171 { { 0xFF, 0xFF, 0xFF, 0x00 }, 1, 8, 7, 9 },
1174 /* make sure the nonces of the first try don't affect the retries */
1175 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
1176 initiate_rekey(a
, 1);
1177 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
1178 initiate_rekey(b
, 2);
1180 /* this should never get called as this results in a successful rekeying */
1181 assert_hook_not_called(child_updown
);
1183 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1184 assert_hook_not_called(child_rekey
);
1185 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1186 assert_child_sa_state(b
, 2, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1187 assert_child_sa_count(b
, 1);
1189 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
1190 assert_hook_not_called(child_rekey
);
1191 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1192 assert_child_sa_state(a
, 1, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1193 assert_child_sa_count(a
, 1);
1196 /* <-- CREATE_CHILD_SA { N(INVAL_KE) } */
1197 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
1198 assert_hook_not_called(child_rekey
);
1199 assert_single_notify(IN
, INVALID_KE_PAYLOAD
);
1200 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1201 assert_child_sa_state(a
, 1, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1202 assert_child_sa_count(a
, 1);
1204 /* CREATE_CHILD_SA { N(INVAL_KE) } --> */
1205 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
1206 assert_hook_not_called(child_rekey
);
1207 assert_single_notify(IN
, INVALID_KE_PAYLOAD
);
1208 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1209 assert_child_sa_state(b
, 2, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1210 assert_child_sa_count(b
, 1);
1213 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1214 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[2];
1215 assert_hook_rekey(child_rekey
, 2, 9);
1216 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1217 assert_child_sa_state(b
, 2, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
1218 assert_child_sa_state(b
, 9, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
1220 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
1221 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[3];
1222 assert_hook_rekey(child_rekey
, 1, 10);
1223 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1224 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
1225 assert_child_sa_state(a
,10, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
1228 /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } */
1229 if (data
[_i
].spi_del_a
== 1)
1230 { /* currently we call this again if we keep our own replacement as we
1231 * already called it above */
1232 assert_hook_rekey(child_rekey
, 1, data
[_i
].spi_a
);
1233 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1235 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_REKEYED
,
1236 CHILD_OUTBOUND_REGISTERED
);
1237 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
1238 CHILD_OUTBOUND_INSTALLED
);
1239 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
1240 CHILD_OUTBOUND_NONE
);
1244 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1245 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_REKEYED
,
1246 CHILD_OUTBOUND_INSTALLED
);
1247 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
1248 CHILD_OUTBOUND_REGISTERED
);
1249 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
1250 CHILD_OUTBOUND_REGISTERED
);
1252 /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
1253 if (data
[_i
].spi_del_b
== 2)
1255 assert_hook_rekey(child_rekey
, 2, data
[_i
].spi_b
);
1256 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1258 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
1259 CHILD_OUTBOUND_REGISTERED
);
1260 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
1261 CHILD_OUTBOUND_INSTALLED
);
1262 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
1263 CHILD_OUTBOUND_NONE
);
1267 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1268 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_REKEYED
,
1269 CHILD_OUTBOUND_INSTALLED
);
1270 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
1271 CHILD_OUTBOUND_REGISTERED
);
1272 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
1273 CHILD_OUTBOUND_REGISTERED
);
1277 /* we don't expect this hook to get called anymore */
1278 assert_hook_not_called(child_rekey
);
1279 /* INFORMATIONAL { D } --> */
1280 assert_jobs_scheduled(1);
1281 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1282 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETING
,
1283 data
[_i
].spi_del_b
== 2 ? CHILD_OUTBOUND_NONE
1284 : CHILD_OUTBOUND_REGISTERED
);
1285 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_DELETED
,
1286 CHILD_OUTBOUND_NONE
);
1287 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
1288 CHILD_OUTBOUND_INSTALLED
);
1289 assert_child_sa_count(b
, 3);
1291 /* <-- INFORMATIONAL { D } */
1292 assert_jobs_scheduled(1);
1293 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1294 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETING
,
1295 data
[_i
].spi_del_a
== 1 ? CHILD_OUTBOUND_NONE
1296 : CHILD_OUTBOUND_REGISTERED
);
1297 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
1298 CHILD_OUTBOUND_NONE
);
1299 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
1300 CHILD_OUTBOUND_INSTALLED
);
1301 assert_child_sa_count(a
, 3);
1303 /* <-- INFORMATIONAL { D } */
1304 assert_jobs_scheduled(1);
1305 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1306 assert_child_sa_state(a
, data
[_i
].spi_del_a
, CHILD_DELETED
,
1307 CHILD_OUTBOUND_NONE
);
1308 assert_child_sa_state(a
, data
[_i
].spi_del_b
, CHILD_DELETED
,
1309 CHILD_OUTBOUND_NONE
);
1310 assert_child_sa_state(a
, data
[_i
].spi_a
, CHILD_INSTALLED
,
1311 CHILD_OUTBOUND_INSTALLED
);
1312 assert_child_sa_count(a
, 3);
1314 /* INFORMATIONAL { D } --> */
1315 assert_jobs_scheduled(1);
1316 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1317 assert_child_sa_state(b
, data
[_i
].spi_del_b
, CHILD_DELETED
,
1318 CHILD_OUTBOUND_NONE
);
1319 assert_child_sa_state(b
, data
[_i
].spi_del_a
, CHILD_DELETED
,
1320 CHILD_OUTBOUND_NONE
);
1321 assert_child_sa_state(b
, data
[_i
].spi_b
, CHILD_INSTALLED
,
1322 CHILD_OUTBOUND_INSTALLED
);
1323 assert_child_sa_count(b
, 3);
1326 /* simulate the execution of the scheduled jobs */
1327 destroy_rekeyed(a
, data
[_i
].spi_del_a
);
1328 destroy_rekeyed(a
, data
[_i
].spi_del_b
);
1329 assert_child_sa_count(a
, 1);
1330 assert_ipsec_sas_installed(a
, data
[_i
].spi_a
, data
[_i
].spi_b
);
1331 destroy_rekeyed(b
, data
[_i
].spi_del_a
);
1332 destroy_rekeyed(b
, data
[_i
].spi_del_b
);
1333 assert_child_sa_count(b
, 1);
1334 assert_ipsec_sas_installed(b
, data
[_i
].spi_a
, data
[_i
].spi_b
);
1336 /* child_rekey/child_updown */
1343 call_ikesa(a
, destroy
);
1344 call_ikesa(b
, destroy
);
1349 * This is a variation of the above but with the retry by one peer delayed so
1350 * that to the other peer it looks like there is no collision.
1352 START_TEST(test_collision_ke_invalid_delayed_retry
)
1354 exchange_test_sa_conf_t conf
= {
1356 .esp
= "aes128-sha256-modp2048-modp3072",
1359 .esp
= "aes128-sha256-modp3072-modp2048",
1365 exchange_test_helper
->establish_sa(exchange_test_helper
,
1368 /* Seven nonces and SPIs are needed (SPI 1 and 2 are used for the initial
1370 * N1/3 -----\ /----- N2/4
1372 * N4/6 <-------/ /---- INVAL_KE
1375 * N5/7 -----\ \------->
1376 * <-----\--------- N6/8
1377 * N7/9 -------\------->
1378 * <-------\------- DELETE
1379 * ... ------\ \----->
1382 * We test this three times, each time a different nonce is the lowest.
1385 /* Nonces used at each point */
1388 { { 0x00, 0xFF, 0xFF } },
1389 { { 0xFF, 0x00, 0xFF } },
1390 { { 0xFF, 0xFF, 0x00 } },
1393 /* make sure the nonces of the first try don't affect the retries */
1394 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
1395 initiate_rekey(a
, 1);
1396 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
1397 initiate_rekey(b
, 2);
1399 /* this should never get called as this results in a successful rekeying */
1400 assert_hook_not_called(child_updown
);
1402 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1403 assert_hook_not_called(child_rekey
);
1404 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1405 assert_child_sa_state(b
, 2, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1406 assert_child_sa_count(b
, 1);
1408 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
1409 assert_hook_not_called(child_rekey
);
1410 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1411 assert_child_sa_state(a
, 1, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1412 assert_child_sa_count(a
, 1);
1415 /* <-- CREATE_CHILD_SA { N(INVAL_KE) } */
1416 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[0];
1417 assert_hook_not_called(child_rekey
);
1418 assert_single_notify(IN
, INVALID_KE_PAYLOAD
);
1419 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1420 assert_child_sa_state(a
, 1, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1421 assert_child_sa_count(a
, 1);
1423 /* CREATE_CHILD_SA { N(INVAL_KE) } --> */
1424 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[1];
1425 assert_hook_not_called(child_rekey
);
1426 assert_single_notify(IN
, INVALID_KE_PAYLOAD
);
1427 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1428 assert_child_sa_state(b
, 2, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1429 assert_child_sa_count(b
, 1);
1432 /* delay the CREATE_CHILD_SA request from a to b */
1433 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
1435 /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
1436 exchange_test_helper
->nonce_first_byte
= data
[_i
].nonces
[2];
1437 assert_hook_rekey(child_rekey
, 1, 9);
1438 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1439 assert_child_sa_state(a
, 1, CHILD_REKEYED
, CHILD_OUTBOUND_INSTALLED
);
1440 assert_child_sa_state(a
, 9, CHILD_INSTALLED
, CHILD_OUTBOUND_REGISTERED
);
1442 /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
1443 assert_hook_rekey(child_rekey
, 2, 8);
1444 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1445 assert_child_sa_state(b
, 2, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
1446 assert_child_sa_state(b
, 8, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1449 /* we don't expect this hook to get called anymore */
1450 assert_hook_not_called(child_rekey
);
1452 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> (delayed) */
1453 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
1454 exchange_test_helper
->process_message(exchange_test_helper
, b
, msg
);
1455 assert_child_sa_state(b
, 2, CHILD_DELETING
, CHILD_OUTBOUND_NONE
);
1456 assert_child_sa_state(b
, 8, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1458 /* <-- INFORMATIONAL { D } */
1459 assert_jobs_scheduled(1);
1460 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1461 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1462 assert_child_sa_state(a
, 9, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1463 assert_child_sa_count(a
, 2);
1466 /* <-- CREATE_CHILD_SA { N(TEMP_FAIL) } */
1467 assert_no_jobs_scheduled();
1468 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1469 assert_child_sa_state(a
, 1, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1470 assert_child_sa_state(a
, 9, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1471 assert_child_sa_count(a
, 2);
1474 /* INFORMATIONAL { D } --> */
1475 assert_jobs_scheduled(1);
1476 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1477 assert_child_sa_state(b
, 2, CHILD_DELETED
, CHILD_OUTBOUND_NONE
);
1478 assert_child_sa_state(b
, 8, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1479 assert_child_sa_count(b
, 2);
1482 /* simulate the execution of the scheduled jobs */
1483 destroy_rekeyed(a
, 1);
1484 assert_child_sa_count(a
, 1);
1485 assert_ipsec_sas_installed(a
, 8, 9);
1486 destroy_rekeyed(b
, 2);
1487 assert_child_sa_count(b
, 1);
1488 assert_ipsec_sas_installed(b
, 8, 9);
1490 /* child_rekey/child_updown */
1497 call_ikesa(a
, destroy
);
1498 call_ikesa(b
, destroy
);
1503 * One of the hosts initiates a DELETE of the CHILD_SA the other peer is
1504 * concurrently trying to rekey.
1506 * rekey ----\ /---- delete
1507 * \-----/----> detect collision
1508 * detect collision <---------/ /---- TEMP_FAIL
1511 * aborts rekeying <--------/
1513 START_TEST(test_collision_delete
)
1516 uint32_t spi_a
= _i
+1, spi_b
= 2-_i
;
1519 { /* responder rekeys the CHILD_SA (SPI 2) */
1520 exchange_test_helper
->establish_sa(exchange_test_helper
,
1524 { /* initiator rekeys the CHILD_SA (SPI 1) */
1525 exchange_test_helper
->establish_sa(exchange_test_helper
,
1528 initiate_rekey(a
, spi_a
);
1529 call_ikesa(b
, delete_child_sa
, PROTO_ESP
, spi_b
, FALSE
);
1530 assert_child_sa_state(b
, spi_b
, CHILD_DELETING
, CHILD_OUTBOUND_INSTALLED
);
1532 /* this should never get called as there is no successful rekeying on
1534 assert_hook_not_called(child_rekey
);
1536 /* RFC 7296, 2.25.1: If a peer receives a request to rekey a CHILD_SA that
1537 * it is currently trying to close, it SHOULD reply with TEMPORARY_FAILURE.
1540 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1541 assert_hook_not_called(child_updown
);
1542 assert_notify(IN
, REKEY_SA
);
1543 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
1544 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1545 assert_child_sa_state(b
, spi_b
, CHILD_DELETING
, CHILD_OUTBOUND_INSTALLED
);
1548 /* RFC 7296, 2.25.1: If a peer receives a request to delete a CHILD_SA that
1549 * it is currently trying to rekey, it SHOULD reply as usual, with a DELETE
1553 /* <-- INFORMATIONAL { D } */
1554 assert_hook_updown(child_updown
, FALSE
);
1555 assert_single_payload(IN
, PLV2_DELETE
);
1556 assert_single_payload(OUT
, PLV2_DELETE
);
1557 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1558 assert_child_sa_count(a
, 0);
1561 /* <-- CREATE_CHILD_SA { N(TEMP_FAIL) } */
1562 assert_hook_not_called(child_updown
);
1563 /* we don't expect a job to retry the rekeying */
1564 assert_no_jobs_scheduled();
1565 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1569 /* INFORMATIONAL { D } --> */
1570 assert_hook_updown(child_updown
, FALSE
);
1571 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1572 assert_child_sa_count(b
, 0);
1581 call_ikesa(a
, destroy
);
1582 call_ikesa(b
, destroy
);
1587 * One of the hosts initiates a DELETE of the CHILD_SA the other peer is
1588 * concurrently trying to rekey. However, the delete request is delayed or
1589 * dropped, so the peer doing the rekeying is unaware of the collision.
1591 * rekey ----\ /---- delete
1592 * \-----/----> detect collision
1593 * reschedule <---------/------ TEMP_FAIL
1595 * delete ---------------->
1597 * The job will not find the SA to retry rekeying.
1599 START_TEST(test_collision_delete_drop_delete
)
1603 uint32_t spi_a
= _i
+1, spi_b
= 2-_i
;
1606 { /* responder rekeys the CHILD_SA (SPI 2) */
1607 exchange_test_helper
->establish_sa(exchange_test_helper
,
1611 { /* initiator rekeys the CHILD_SA (SPI 1) */
1612 exchange_test_helper
->establish_sa(exchange_test_helper
,
1615 initiate_rekey(a
, spi_a
);
1616 call_ikesa(b
, delete_child_sa
, PROTO_ESP
, spi_b
, FALSE
);
1617 assert_child_sa_state(b
, spi_b
, CHILD_DELETING
, CHILD_OUTBOUND_INSTALLED
);
1619 /* this should never get called as there is no successful rekeying on
1621 assert_hook_not_called(child_rekey
);
1623 /* RFC 7296, 2.25.1: If a peer receives a request to rekey a CHILD_SA that
1624 * it is currently trying to close, it SHOULD reply with TEMPORARY_FAILURE.
1627 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1628 assert_hook_not_called(child_updown
);
1629 assert_notify(IN
, REKEY_SA
);
1630 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
1631 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1632 assert_child_sa_state(b
, spi_b
, CHILD_DELETING
, CHILD_OUTBOUND_INSTALLED
);
1635 /* delay the DELETE request */
1636 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
1638 /* <-- CREATE_CHILD_SA { N(TEMP_FAIL) } */
1639 assert_hook_not_called(child_updown
);
1640 /* we expect a job to retry the rekeying is scheduled */
1641 assert_jobs_scheduled(1);
1642 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1643 assert_child_sa_state(a
, spi_a
, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1647 /* <-- INFORMATIONAL { D } (delayed) */
1648 assert_hook_updown(child_updown
, FALSE
);
1649 assert_single_payload(IN
, PLV2_DELETE
);
1650 assert_single_payload(OUT
, PLV2_DELETE
);
1651 exchange_test_helper
->process_message(exchange_test_helper
, a
, msg
);
1652 assert_child_sa_count(a
, 0);
1655 /* INFORMATIONAL { D } --> */
1656 assert_hook_updown(child_updown
, FALSE
);
1657 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1658 assert_child_sa_count(b
, 0);
1667 call_ikesa(a
, destroy
);
1668 call_ikesa(b
, destroy
);
1673 * One of the hosts initiates a DELETE of the CHILD_SA the other peer is
1674 * concurrently trying to rekey. However, the rekey request is delayed or
1675 * dropped, so the peer doing the deleting is unaware of the collision.
1677 * rekey ----\ /---- delete
1678 * detect collision <----\-----/
1679 * delete ------\--------->
1681 * /---- CHILD_SA_NOT_FOUND
1682 * aborts rekeying <----------/
1684 START_TEST(test_collision_delete_drop_rekey
)
1688 uint32_t spi_a
= _i
+1, spi_b
= 2-_i
;
1691 { /* responder rekeys the CHILD_SA (SPI 2) */
1692 exchange_test_helper
->establish_sa(exchange_test_helper
,
1696 { /* initiator rekeys the CHILD_SA (SPI 1) */
1697 exchange_test_helper
->establish_sa(exchange_test_helper
,
1700 initiate_rekey(a
, spi_a
);
1701 call_ikesa(b
, delete_child_sa
, PROTO_ESP
, spi_b
, FALSE
);
1702 assert_child_sa_state(b
, spi_b
, CHILD_DELETING
, CHILD_OUTBOUND_INSTALLED
);
1704 /* this should never get called as there is no successful rekeying on
1706 assert_hook_not_called(child_rekey
);
1708 /* delay the CREATE_CHILD_SA request */
1709 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
1711 /* RFC 7296, 2.25.1: If a peer receives a request to delete a CHILD_SA that
1712 * it is currently trying to rekey, it SHOULD reply as usual, with a DELETE
1716 /* <-- INFORMATIONAL { D } */
1717 assert_hook_updown(child_updown
, FALSE
);
1718 assert_single_payload(IN
, PLV2_DELETE
);
1719 assert_single_payload(OUT
, PLV2_DELETE
);
1720 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1721 assert_child_sa_count(a
, 0);
1724 /* INFORMATIONAL { D } --> */
1725 assert_hook_updown(child_updown
, FALSE
);
1726 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1727 assert_child_sa_count(b
, 0);
1730 /* RFC 7296, 2.25.1: If a peer receives a to rekey a Child SA that does not
1731 * exist, it SHOULD reply with CHILD_SA_NOT_FOUND.
1734 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> (delayed) */
1735 assert_hook_not_called(child_updown
);
1736 assert_notify(IN
, REKEY_SA
);
1737 assert_single_notify(OUT
, CHILD_SA_NOT_FOUND
);
1738 exchange_test_helper
->process_message(exchange_test_helper
, b
, msg
);
1741 /* <-- CREATE_CHILD_SA { N(NO_CHILD_SA) } */
1742 assert_hook_not_called(child_updown
);
1743 /* no jobs or tasks should get scheduled/queued */
1744 assert_no_jobs_scheduled();
1745 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1755 call_ikesa(a
, destroy
);
1756 call_ikesa(b
, destroy
);
1761 * FIXME: Not sure what we can do about the following:
1763 * One of the hosts initiates a rekeying of a CHILD_SA and after responding to
1764 * it the other peer deletes the new SA. However, the rekey response is
1765 * delayed or dropped, so the peer doing the rekeying receives a delete for an
1766 * unknown CHILD_SA and then has a rekeyed CHILD_SA that should not exist.
1768 * rekey ---------------->
1770 * unknown SA <----------/----- delete new SA
1774 * The peers' states are now out of sync.
1776 * Perhaps the rekey initiator could keep track of deletes for non-existing SAs
1777 * while rekeying and then check against the SPIs when handling the
1778 * CREATE_CHILD_SA response.
1783 * One of the hosts initiates a rekey of the IKE_SA of the CHILD_SA the other
1784 * peer is concurrently trying to rekey.
1786 * rekey ----\ /---- rekey IKE
1787 * \-----/----> detect collision
1788 * detect collision <---------/ /---- TEMP_FAIL
1793 START_TEST(test_collision_ike_rekey
)
1796 uint32_t spi_a
= _i
+1;
1799 { /* responder rekeys the CHILD_SA (SPI 2) */
1800 exchange_test_helper
->establish_sa(exchange_test_helper
,
1804 { /* initiator rekeys the CHILD_SA (SPI 1) */
1805 exchange_test_helper
->establish_sa(exchange_test_helper
,
1808 initiate_rekey(a
, spi_a
);
1809 call_ikesa(b
, rekey
);
1810 assert_ike_sa_state(b
, IKE_REKEYING
);
1812 /* these should never get called as there is no successful rekeying on
1814 assert_hook_not_called(ike_rekey
);
1815 assert_hook_not_called(child_rekey
);
1817 /* RFC 7296, 2.25.2: If a peer receives a request to rekey a CHILD_SA when
1818 * it is currently rekeying the IKE SA, it SHOULD reply with
1819 * TEMPORARY_FAILURE.
1822 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1823 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
1824 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1825 assert_ike_sa_state(b
, IKE_REKEYING
);
1827 /* RFC 7296, 2.25.1: If a peer receives a request to rekey the IKE SA, and
1828 * it is currently, rekeying, or closing a Child SA of that IKE SA, it
1829 * SHOULD reply with TEMPORARY_FAILURE.
1832 /* <-- CREATE_CHILD_SA { SA, Ni, KEi } */
1833 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
1834 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1835 assert_child_sa_state(a
, spi_a
, CHILD_REKEYING
, CHILD_OUTBOUND_INSTALLED
);
1837 /* <-- CREATE_CHILD_SA { N(TEMP_FAIL) } */
1838 /* we expect a job to retry the rekeying is scheduled */
1839 assert_jobs_scheduled(1);
1840 exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1841 assert_child_sa_state(a
, spi_a
, CHILD_INSTALLED
, CHILD_OUTBOUND_INSTALLED
);
1844 /* CREATE_CHILD_SA { N(TEMP_FAIL) } --> */
1845 /* we expect a job to retry the rekeying is scheduled */
1846 assert_jobs_scheduled(1);
1847 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1848 assert_ike_sa_state(b
, IKE_ESTABLISHED
);
1851 /* ike_rekey/child_rekey */
1858 call_ikesa(a
, destroy
);
1859 call_ikesa(b
, destroy
);
1864 * One of the hosts initiates a delete of the IKE_SA of the CHILD_SA the other
1865 * peer is concurrently trying to rekey.
1867 * rekey ----\ /---- delete IKE
1868 * \-----/----> detect collision
1869 * <---------/ /---- TEMP_FAIL
1872 * sa already gone <--------/
1874 START_TEST(test_collision_ike_delete
)
1877 uint32_t spi_a
= _i
+1;
1882 { /* responder rekeys the CHILD_SA (SPI 2) */
1883 exchange_test_helper
->establish_sa(exchange_test_helper
,
1887 { /* initiator rekeys the CHILD_SA (SPI 1) */
1888 exchange_test_helper
->establish_sa(exchange_test_helper
,
1891 initiate_rekey(a
, spi_a
);
1892 call_ikesa(b
, delete, FALSE
);
1893 assert_ike_sa_state(b
, IKE_DELETING
);
1895 /* this should never get called as there is no successful rekeying on
1897 assert_hook_not_called(child_rekey
);
1899 /* RFC 7296, 2.25.2 does not explicitly state what the behavior SHOULD be if
1900 * a peer receives a request to rekey a CHILD_SA when it is currently
1901 * closing the IKE SA. We expect a TEMPORARY_FAILURE notify.
1904 /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
1905 assert_single_notify(OUT
, TEMPORARY_FAILURE
);
1906 exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1907 assert_ike_sa_state(b
, IKE_DELETING
);
1909 /* RFC 7296, 2.25.1 does not explicitly state what the behavior SHOULD be if
1910 * a peer receives a request to close the IKE SA if it is currently rekeying
1911 * a Child SA of that IKE SA. Let's just close the IKE_SA and forget the
1915 /* <-- INFORMATIONAL { D } */
1916 assert_hook_updown(ike_updown
, FALSE
);
1917 assert_hook_updown(child_updown
, FALSE
);
1918 assert_message_empty(OUT
);
1919 s
= exchange_test_helper
->process_message(exchange_test_helper
, a
, NULL
);
1920 ck_assert_int_eq(DESTROY_ME
, s
);
1921 call_ikesa(a
, destroy
);
1925 /* <-- CREATE_CHILD_SA { N(TEMP_FAIL) } */
1926 /* the SA is already gone */
1927 msg
= exchange_test_helper
->sender
->dequeue(exchange_test_helper
->sender
);
1930 /* INFORMATIONAL { } --> */
1931 assert_hook_updown(ike_updown
, FALSE
);
1932 assert_hook_updown(child_updown
, FALSE
);
1933 s
= exchange_test_helper
->process_message(exchange_test_helper
, b
, NULL
);
1934 ck_assert_int_eq(DESTROY_ME
, s
);
1935 call_ikesa(b
, destroy
);
1944 Suite
*child_rekey_suite_create()
1949 s
= suite_create("child rekey");
1951 tc
= tcase_create("regular");
1952 tcase_add_loop_test(tc
, test_regular
, 0, 2);
1953 tcase_add_loop_test(tc
, test_regular_ke_invalid
, 0, 2);
1954 tcase_add_test(tc
, test_regular_responder_ignore_soft_expire
);
1955 tcase_add_test(tc
, test_regular_responder_handle_hard_expire
);
1956 suite_add_tcase(s
, tc
);
1958 tc
= tcase_create("collisions rekey");
1959 tcase_add_loop_test(tc
, test_collision
, 0, 4);
1960 tcase_add_loop_test(tc
, test_collision_delayed_response
, 0, 4);
1961 tcase_add_loop_test(tc
, test_collision_delayed_request
, 0, 3);
1962 tcase_add_loop_test(tc
, test_collision_delayed_request_more
, 0, 3);
1963 tcase_add_loop_test(tc
, test_collision_ke_invalid
, 0, 4);
1964 tcase_add_loop_test(tc
, test_collision_ke_invalid_delayed_retry
, 0, 3);
1965 suite_add_tcase(s
, tc
);
1967 tc
= tcase_create("collisions delete");
1968 tcase_add_loop_test(tc
, test_collision_delete
, 0, 2);
1969 tcase_add_loop_test(tc
, test_collision_delete_drop_delete
, 0, 2);
1970 tcase_add_loop_test(tc
, test_collision_delete_drop_rekey
, 0, 2);
1971 suite_add_tcase(s
, tc
);
1973 tc
= tcase_create("collisions ike rekey");
1974 tcase_add_loop_test(tc
, test_collision_ike_rekey
, 0, 2);
1975 suite_add_tcase(s
, tc
);
1977 tc
= tcase_create("collisions ike delete");
1978 tcase_add_loop_test(tc
, test_collision_ike_delete
, 0, 2);
1979 suite_add_tcase(s
, tc
);