1 #include <darwintest.h>
2 #include <darwintest_utils.h>
3 #include <dispatch/dispatch.h>
4 #include <net/pfkeyv2.h>
5 #include <netinet6/ipsec.h>
9 T_META_NAMESPACE("xnu.pfkey"),
11 T_META_CHECK_LEAKS(false));
13 #define MAX_SPD_CHECK 100
14 #define TEST_SRC_ADDRESS_IPv4 "192.168.2.2"
15 #define TEST_DST_ADDRESS_IPv4 "192.168.2.3"
16 #define TEST_SRC_ADDRESS_IPv6 "fd04:5c6b:8df7:7092:0000:0000:0000:0002"
17 #define TEST_DST_ADDRESS_IPv6 "fd04:5c6b:8df7:7092:0000:0000:0000:0003"
18 #define TEST_MIGRATE_SRC_ADDRESS_IPv4 "192.168.2.10"
19 #define TEST_MIGRATE_DST_ADDRESS_IPv4 "192.168.2.11"
20 #define TEST_MIGRATE_SRC_ADDRESS_IPv6 "fd04:5c6b:8df7:7092:0000:0000:0002:0000"
21 #define TEST_MIGRATE_DST_ADDRESS_IPv6 "fd04:5c6b:8df7:7092:0000:0000:0003:0000"
25 TEST_SADB_X_GET_OVERFLOW_60822136
= 1,
26 TEST_SADB_X_SPDENABLE_OVERFLOW_60822924
= 2,
27 TEST_SADB_X_SPDDISABLE_OVERFLOW_60822956
= 3,
28 TEST_SADB_UPDATE_USE_AFTER_FREE_60679513
= 4,
29 TEST_SADB_DUMP_HEAP_OVERFLOW_60768729
= 5,
30 TEST_SADB_POLICY_DUMP_HEAP_OVERFLOW_60769680
= 6,
31 TEST_SADB_GETSASTAT_OOB_READ_60822823
= 7,
32 TEST_SADB_GETSASTAT_OOB_READ_SUCCESS
= 8,
33 TEST_SADB_EXT_MIGRATE_ADDRESS_IPv4
= 9,
34 TEST_SADB_EXT_MIGRATE_ADDRESS_IPv6
= 10,
35 TEST_SADB_EXT_MIGRATE_BAD_ADDRESS
= 11,
38 static test_identifier test_id
= TEST_INVALID
;
39 static dispatch_source_t pfkey_source
= NULL
;
41 static void pfkey_cleanup(void);
43 static void pfkey_process_message_test_60822136(uint8_t **mhp
, int pfkey_socket
);
44 static void pfkey_process_message_test_60822924(uint8_t **mhp
, int pfkey_socket
);
45 static void pfkey_process_message_test_60822956(uint8_t **mhp
, int pfkey_socket
);
46 static void pfkey_process_message_test_60679513(uint8_t **mhp
, int pfkey_socket
);
47 static void pfkey_process_message_test_60768729(uint8_t **mhp
, int pfkey_socket
);
48 static void pfkey_process_message_test_60769680(uint8_t **mhp
, int pfkey_socket
);
49 static void pfkey_process_message_test_60822823(uint8_t **mhp
, int pfkey_socket
);
50 static void pfkey_process_message_test_60822823_1(uint8_t **mhp
, int pfkey_socket
);
51 static void pfkey_process_message_test_60687183(uint8_t **mhp
, int pfkey_socket
);
52 static void pfkey_process_message_test_60687183_1(uint8_t **mhp
, int pfkey_socket
);
53 static void pfkey_process_message_test_60687183_2(uint8_t **mhp
, int pfkey_socket
);
55 static void(*const process_pfkey_message_tests
[])(uint8_t * *mhp
, int pfkey_socket
) =
58 pfkey_process_message_test_60822136
, // TEST_SADB_X_GET_OVERFLOW_60822136
59 pfkey_process_message_test_60822924
, // TEST_SADB_X_SPDENABLE_OVERFLOW_60822924
60 pfkey_process_message_test_60822956
, // TEST_SADB_X_SPDDISABLE_OVERFLOW_60822956
61 pfkey_process_message_test_60679513
, // TEST_SADB_UPDATE_USE_AFTER_FREE_60679513
62 pfkey_process_message_test_60768729
, // TEST_SADB_DUMP_HEAP_OVERFLOW_60768729
63 pfkey_process_message_test_60769680
, // TEST_SADB_POLICY_DUMP_HEAP_OVERFLOW_60769680
64 pfkey_process_message_test_60822823
, // TEST_SADB_GETSASTAT_OOB_READ_60822823
65 pfkey_process_message_test_60822823_1
, // TEST_SADB_GETSASTAT_OOB_READ_SUCCESS
66 pfkey_process_message_test_60687183
, // TEST_SADB_EXT_MIGRATE_ADDRESS_IPv4
67 pfkey_process_message_test_60687183_1
, // TEST_SADB_EXT_MIGRATE_ADDRESS_IPv6
68 pfkey_process_message_test_60687183_2
, // TEST_SADB_EXT_MIGRATE_BAD_ADDRESS
72 pfkey_align(struct sadb_msg
*msg
, uint8_t **mhp
)
77 uint8_t *ep
; /* XXX should be passed from upper layer */
80 T_QUIET
; T_ASSERT_NOTNULL(msg
, "pfkey align msg");
81 T_QUIET
; T_ASSERT_NOTNULL(mhp
, "pfkey align mhp");
84 for (i
= 0; i
< SADB_EXT_MAX
+ 1; i
++) {
92 ep
= p
+ PFKEY_UNUNIT64(msg
->sadb_msg_len
);
94 /* skip base header */
95 p
+= sizeof(struct sadb_msg
);
99 T_QUIET
; T_ASSERT_GE_PTR((void *)ep
, (void *)(p
+ sizeof(*ext
)), "pfkey extension header beyond end of buffer");
100 T_QUIET
; T_ASSERT_GE_ULONG((unsigned long)PFKEY_EXTLEN(ext
), sizeof(*ext
), "pfkey extension shorter than extension header");
101 T_QUIET
; T_ASSERT_GE_PTR((void *)ep
, (void *)(p
+ PFKEY_EXTLEN(ext
)), "pfkey extension length beyond end of buffer");
103 T_QUIET
; T_EXPECT_NULL(mhp
[ext
->sadb_ext_type
], "duplicate extension type %u payload", ext
->sadb_ext_type
);
106 switch (ext
->sadb_ext_type
) {
108 case SADB_EXT_LIFETIME_CURRENT
:
109 case SADB_EXT_LIFETIME_HARD
:
110 case SADB_EXT_LIFETIME_SOFT
:
111 case SADB_EXT_ADDRESS_SRC
:
112 case SADB_EXT_ADDRESS_DST
:
113 case SADB_EXT_ADDRESS_PROXY
:
114 case SADB_EXT_KEY_AUTH
:
115 /* XXX should to be check weak keys. */
116 case SADB_EXT_KEY_ENCRYPT
:
117 /* XXX should to be check weak keys. */
118 case SADB_EXT_IDENTITY_SRC
:
119 case SADB_EXT_IDENTITY_DST
:
120 case SADB_EXT_SENSITIVITY
:
121 case SADB_EXT_PROPOSAL
:
122 case SADB_EXT_SUPPORTED_AUTH
:
123 case SADB_EXT_SUPPORTED_ENCRYPT
:
124 case SADB_EXT_SPIRANGE
:
125 case SADB_X_EXT_POLICY
:
127 case SADB_EXT_SESSION_ID
:
128 case SADB_EXT_SASTAT
:
129 #ifdef SADB_X_EXT_NAT_T_TYPE
130 case SADB_X_EXT_NAT_T_TYPE
:
131 case SADB_X_EXT_NAT_T_SPORT
:
132 case SADB_X_EXT_NAT_T_DPORT
:
133 case SADB_X_EXT_NAT_T_OA
:
135 #ifdef SADB_X_EXT_TAG
138 #ifdef SADB_X_EXT_PACKET
139 case SADB_X_EXT_PACKET
:
141 case SADB_X_EXT_IPSECIF
:
142 case SADB_X_EXT_ADDR_RANGE_SRC_START
:
143 case SADB_X_EXT_ADDR_RANGE_SRC_END
:
144 case SADB_X_EXT_ADDR_RANGE_DST_START
:
145 case SADB_X_EXT_ADDR_RANGE_DST_END
:
147 case SADB_EXT_MIGRATE_ADDRESS_SRC
:
148 case SADB_EXT_MIGRATE_ADDRESS_DST
:
149 case SADB_X_EXT_MIGRATE_IPSECIF
:
151 mhp
[ext
->sadb_ext_type
] = (void *)ext
;
154 T_FAIL("bad extension type %u", ext
->sadb_ext_type
);
158 p
+= PFKEY_EXTLEN(ext
);
161 T_QUIET
; T_EXPECT_EQ_PTR((void *)ep
, (void *)p
, "invalid pfkey message length");
167 recv_pfkey_message(int pfkey_socket
)
169 uint8_t buffer
[8192] __attribute__((aligned(4)));
170 struct iovec iovecs
[1] = {
171 { buffer
, sizeof(buffer
) },
173 struct msghdr msg
= {
177 sizeof(iovecs
) / sizeof(iovecs
[0]),
185 memset(buffer
, 0, sizeof(buffer
));
186 T_QUIET
; T_ASSERT_POSIX_SUCCESS(result
= recvmsg(pfkey_socket
, &msg
, 0), NULL
);
189 T_QUIET
; T_ASSERT_GE_ULONG((size_t)result
, sizeof(struct sadb_msg
), "Invalid PFKey message size: %zu", result
);
190 struct sadb_msg
*hdr
= (struct sadb_msg
*)buffer
;
191 uint8_t *mhp
[SADB_EXT_MAX
+ 1];
192 pfkey_align(hdr
, mhp
);
193 (*process_pfkey_message_tests
[test_id
])(mhp
, pfkey_socket
);
194 } else if (result
== 0) {
195 T_LOG("PFKey socket received EOF");
202 send_pfkey_spd_add_message(int pfkey_socket
, uint8_t proto
)
204 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
205 bzero(payload
, sizeof(payload
));
208 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
209 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
210 msg_payload
->sadb_msg_type
= SADB_X_SPDADD
;
211 msg_payload
->sadb_msg_errno
= 0;
212 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
213 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
214 msg_payload
->sadb_msg_reserved
= 0;
215 msg_payload
->sadb_msg_seq
= 0;
216 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
217 tlen
+= sizeof(*msg_payload
);
219 struct sadb_address
*src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
220 src_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_SRC
& 0xffff;
221 src_address_payload
->sadb_address_proto
= proto
& 0xff;
222 src_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
223 src_address_payload
->sadb_address_reserved
= 0;
224 tlen
+= sizeof(*src_address_payload
);
226 struct sockaddr_in
*src
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
227 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_SRC_ADDRESS_IPv4
, &src
->sin_addr
), 1, "src address fail");
228 src
->sin_family
= AF_INET
;
229 src
->sin_len
= sizeof(*src
);
230 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src
->sin_len
);
231 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
232 tlen
+= PFKEY_ALIGN8(src
->sin_len
);
234 struct sadb_address
*dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
235 dst_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_DST
& 0xffff;
236 dst_address_payload
->sadb_address_proto
= proto
& 0xff;
237 dst_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
238 dst_address_payload
->sadb_address_reserved
= 0;
239 tlen
+= sizeof(*dst_address_payload
);
241 struct sockaddr_in
*dst
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
242 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_DST_ADDRESS_IPv4
, &dst
->sin_addr
), 1, "dst address fail");
243 dst
->sin_family
= AF_INET
;
244 dst
->sin_len
= sizeof(*dst
);
245 len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst
->sin_len
);
246 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
247 tlen
+= PFKEY_ALIGN8(dst
->sin_len
);
249 struct sadb_lifetime
*lifetime_payload
= (struct sadb_lifetime
*)(void *)(payload
+ tlen
);
250 lifetime_payload
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(*lifetime_payload
));
251 lifetime_payload
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_HARD
;
252 tlen
+= sizeof(*lifetime_payload
);
254 struct sadb_x_policy
*policy_payload
= (struct sadb_x_policy
*)(void *)(payload
+ tlen
);
255 policy_payload
->sadb_x_policy_len
= PFKEY_UNIT64(sizeof(*policy_payload
));
256 policy_payload
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
257 policy_payload
->sadb_x_policy_type
= IPSEC_POLICY_DISCARD
;
258 policy_payload
->sadb_x_policy_dir
= IPSEC_DIR_OUTBOUND
;
259 tlen
+= sizeof(*policy_payload
);
261 // Update the total length
262 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
263 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send spd add");
267 send_pfkey_spd_get_message(int pfkey_socket
, uint32_t policy_id
)
269 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
270 bzero(payload
, sizeof(payload
));
273 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)(void *)payload
;
274 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
275 msg_payload
->sadb_msg_type
= SADB_X_SPDGET
;
276 msg_payload
->sadb_msg_errno
= 0;
277 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
278 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
279 msg_payload
->sadb_msg_reserved
= 0;
280 msg_payload
->sadb_msg_seq
= 0;
281 msg_payload
->sadb_msg_pid
= (uint32_t)getpid();
282 tlen
+= sizeof(*msg_payload
);
284 struct sadb_x_policy
*policy_payload
= (struct sadb_x_policy
*)(void *)(payload
+ tlen
);
285 policy_payload
->sadb_x_policy_len
= PFKEY_UNIT64(sizeof(*policy_payload
));
286 policy_payload
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
287 policy_payload
->sadb_x_policy_id
= policy_id
;
288 tlen
+= sizeof(*policy_payload
);
290 // Update the total length
291 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
292 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send spd get failed");
296 send_pfkey_spd_enable_message(int pfkey_socket
, uint32_t policy_id
)
298 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
299 bzero(payload
, sizeof(payload
));
302 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)(void *)payload
;
303 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
304 msg_payload
->sadb_msg_type
= SADB_X_SPDENABLE
;
305 msg_payload
->sadb_msg_errno
= 0;
306 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
307 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
308 msg_payload
->sadb_msg_reserved
= 0;
309 msg_payload
->sadb_msg_seq
= 0;
310 msg_payload
->sadb_msg_pid
= (uint32_t)getpid();
311 tlen
+= sizeof(*msg_payload
);
313 struct sadb_x_policy
*policy_payload
= (struct sadb_x_policy
*)(void *)(payload
+ tlen
);
314 policy_payload
->sadb_x_policy_len
= PFKEY_UNIT64(sizeof(*policy_payload
));
315 policy_payload
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
316 policy_payload
->sadb_x_policy_id
= policy_id
;
317 tlen
+= sizeof(*policy_payload
);
319 // Update the total length
320 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
321 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send spd enable failed");
325 send_pfkey_spd_disable_message(int pfkey_socket
, uint32_t policy_id
)
327 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
328 bzero(payload
, sizeof(payload
));
331 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)(void *)payload
;
332 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
333 msg_payload
->sadb_msg_type
= SADB_X_SPDDISABLE
;
334 msg_payload
->sadb_msg_errno
= 0;
335 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
336 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
337 msg_payload
->sadb_msg_reserved
= 0;
338 msg_payload
->sadb_msg_seq
= 0;
339 msg_payload
->sadb_msg_pid
= (uint32_t)getpid();
340 tlen
+= sizeof(*msg_payload
);
342 struct sadb_x_policy
*policy_payload
= (struct sadb_x_policy
*)(void *)(payload
+ tlen
);
343 policy_payload
->sadb_x_policy_len
= PFKEY_UNIT64(sizeof(*policy_payload
));
344 policy_payload
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
345 policy_payload
->sadb_x_policy_id
= policy_id
;
346 tlen
+= sizeof(*policy_payload
);
348 // Update the total length
349 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
350 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send spd disable failed");
354 send_pfkey_spd_delete_message(int pfkey_socket
, uint32_t policy_id
)
356 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
357 bzero(payload
, sizeof(payload
));
360 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
361 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
362 msg_payload
->sadb_msg_type
= SADB_X_SPDDELETE2
;
363 msg_payload
->sadb_msg_errno
= 0;
364 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
365 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
366 msg_payload
->sadb_msg_reserved
= 0;
367 msg_payload
->sadb_msg_seq
= 0;
368 msg_payload
->sadb_msg_pid
= (uint32_t)getpid();
369 tlen
+= sizeof(*msg_payload
);
371 struct sadb_x_policy
*policy_payload
= (struct sadb_x_policy
*)(void *)(payload
+ tlen
);
372 policy_payload
->sadb_x_policy_len
= PFKEY_UNIT64(sizeof(*policy_payload
));
373 policy_payload
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
374 policy_payload
->sadb_x_policy_id
= policy_id
;
375 tlen
+= sizeof(*policy_payload
);
377 // Update the total length
378 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
379 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send spd delete failed");
383 send_pfkey_spd_dump_message(int pfkey_socket
)
385 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
386 bzero(payload
, sizeof(payload
));
389 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)(void *)payload
;
390 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
391 msg_payload
->sadb_msg_type
= SADB_X_SPDDUMP
;
392 msg_payload
->sadb_msg_errno
= 0;
393 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
394 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
395 msg_payload
->sadb_msg_reserved
= 0;
396 msg_payload
->sadb_msg_seq
= 0;
397 msg_payload
->sadb_msg_pid
= (uint32_t)getpid();
398 tlen
+= sizeof(*msg_payload
);
400 // Update the total length
401 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
402 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send spd dump failed");
406 send_pfkey_flush_sp(int pfkey_socket
)
408 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
409 bzero(payload
, sizeof(payload
));
412 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
413 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
414 msg_payload
->sadb_msg_type
= SADB_X_SPDFLUSH
;
415 msg_payload
->sadb_msg_errno
= 0;
416 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
417 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
418 msg_payload
->sadb_msg_reserved
= 0;
419 msg_payload
->sadb_msg_seq
= 0;
420 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
421 tlen
+= sizeof(*msg_payload
);
423 // Update the total length
424 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
425 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey flush security policies");
429 send_pkey_get_spi(int pfkey_socket
)
431 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
432 bzero(payload
, sizeof(payload
));
435 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
436 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
437 msg_payload
->sadb_msg_type
= SADB_GETSPI
;
438 msg_payload
->sadb_msg_errno
= 0;
439 msg_payload
->sadb_msg_satype
= SADB_SATYPE_ESP
;
440 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
441 msg_payload
->sadb_msg_reserved
= 0;
442 msg_payload
->sadb_msg_seq
= 0;
443 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
444 tlen
+= sizeof(*msg_payload
);
446 struct sadb_x_sa2
*sa2_payload
= (struct sadb_x_sa2
*)(void *)(payload
+ tlen
);
447 sa2_payload
->sadb_x_sa2_len
= PFKEY_UNIT64(sizeof(*sa2_payload
));
448 sa2_payload
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
449 sa2_payload
->sadb_x_sa2_mode
= IPSEC_MODE_TRANSPORT
;
450 sa2_payload
->sadb_x_sa2_reqid
= 0;
451 tlen
+= sizeof(*sa2_payload
);
453 struct sadb_address
*src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
454 src_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_SRC
& 0xffff;
455 src_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
456 src_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
457 src_address_payload
->sadb_address_reserved
= 0;
458 tlen
+= sizeof(*src_address_payload
);
460 struct sockaddr_in
*src
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
461 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_SRC_ADDRESS_IPv4
, &src
->sin_addr
), 1, "src address fail");
462 src
->sin_family
= AF_INET
;
463 src
->sin_len
= sizeof(*src
);
464 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src
->sin_len
);
465 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
466 tlen
+= PFKEY_ALIGN8(src
->sin_len
);
468 struct sadb_address
*dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
469 dst_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_DST
& 0xffff;
470 dst_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
471 dst_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
472 dst_address_payload
->sadb_address_reserved
= 0;
473 tlen
+= sizeof(*dst_address_payload
);
475 struct sockaddr_in
*dst
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
476 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_DST_ADDRESS_IPv4
, &dst
->sin_addr
), 1, "dst address fail");
477 dst
->sin_family
= AF_INET
;
478 dst
->sin_len
= sizeof(*dst
);
479 len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst
->sin_len
);
480 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
481 tlen
+= PFKEY_ALIGN8(dst
->sin_len
);
483 // Update the total length
484 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
485 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send get spi");
489 send_pkey_add_sa(int pfkey_socket
, uint32_t spi
, const char *src
, const char *dst
, int family
)
491 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
492 bzero(payload
, sizeof(payload
));
495 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
496 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
497 msg_payload
->sadb_msg_type
= SADB_ADD
;
498 msg_payload
->sadb_msg_errno
= 0;
499 msg_payload
->sadb_msg_satype
= SADB_SATYPE_ESP
;
500 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
501 msg_payload
->sadb_msg_reserved
= 0;
502 msg_payload
->sadb_msg_seq
= 0;
503 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
504 tlen
+= sizeof(*msg_payload
);
506 struct sadb_sa_2
*sa2_payload
= (struct sadb_sa_2
*)(void *)(payload
+ tlen
);
507 sa2_payload
->sa
.sadb_sa_len
= PFKEY_UNIT64(sizeof(*sa2_payload
));
508 sa2_payload
->sa
.sadb_sa_exttype
= SADB_EXT_SA
;
509 sa2_payload
->sa
.sadb_sa_spi
= htonl(spi
);
510 sa2_payload
->sa
.sadb_sa_replay
= 4;
511 sa2_payload
->sa
.sadb_sa_state
= SADB_SASTATE_LARVAL
;
512 sa2_payload
->sa
.sadb_sa_auth
= SADB_X_AALG_SHA2_256
;
513 sa2_payload
->sa
.sadb_sa_encrypt
= SADB_X_EALG_AESCBC
;
514 sa2_payload
->sa
.sadb_sa_flags
|= (SADB_X_EXT_NATT
| SADB_X_EXT_NATT_KEEPALIVE
);
515 sa2_payload
->sadb_sa_natt_src_port
= htons(4500);
516 sa2_payload
->sadb_sa_natt_port
= 4500;
517 sa2_payload
->sadb_sa_natt_interval
= 20;
518 sa2_payload
->sadb_sa_natt_offload_interval
= 0;
519 tlen
+= sizeof(*sa2_payload
);
521 struct sadb_x_sa2
*sa2_x_payload
= (struct sadb_x_sa2
*)(void *)(payload
+ tlen
);
522 sa2_x_payload
->sadb_x_sa2_len
= PFKEY_UNIT64(sizeof(*sa2_x_payload
));
523 sa2_x_payload
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
524 sa2_x_payload
->sadb_x_sa2_mode
= IPSEC_MODE_TRANSPORT
;
525 sa2_x_payload
->sadb_x_sa2_reqid
= 0;
526 tlen
+= sizeof(*sa2_x_payload
);
528 uint8_t prefixlen
= (family
== AF_INET
) ? (sizeof(struct in_addr
) << 3) : (sizeof(struct in6_addr
) << 3);
530 struct sadb_address
*src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
531 src_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_SRC
& 0xffff;
532 src_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
533 src_address_payload
->sadb_address_prefixlen
= prefixlen
;
534 src_address_payload
->sadb_address_reserved
= 0;
535 tlen
+= sizeof(*src_address_payload
);
537 if (family
== AF_INET
) {
538 struct sockaddr_in
*src4
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
539 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, src
, &src4
->sin_addr
), 1, "src address fail");
540 src4
->sin_family
= AF_INET
;
541 src4
->sin_len
= sizeof(*src4
);
542 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src4
->sin_len
);
543 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
544 tlen
+= PFKEY_ALIGN8(src4
->sin_len
);
546 struct sockaddr_in6
*src6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
547 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, src
, &src6
->sin6_addr
), 1, "src address fail");
548 src6
->sin6_family
= AF_INET6
;
549 src6
->sin6_len
= sizeof(*src6
);
550 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src6
->sin6_len
);
551 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
552 tlen
+= PFKEY_ALIGN8(src6
->sin6_len
);
555 struct sadb_address
*dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
556 dst_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_DST
& 0xffff;
557 dst_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
558 dst_address_payload
->sadb_address_prefixlen
= prefixlen
;
559 dst_address_payload
->sadb_address_reserved
= 0;
560 tlen
+= sizeof(*dst_address_payload
);
562 if (family
== AF_INET
) {
563 struct sockaddr_in
*dst4
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
564 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, dst
, &dst4
->sin_addr
), 1, "dst address fail");
565 dst4
->sin_family
= AF_INET
;
566 dst4
->sin_len
= sizeof(*dst4
);
567 uint16_t len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst4
->sin_len
);
568 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
569 tlen
+= PFKEY_ALIGN8(dst4
->sin_len
);
571 struct sockaddr_in6
*dst6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
572 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, dst
, &dst6
->sin6_addr
), 1, "dst address fail");
573 dst6
->sin6_family
= AF_INET6
;
574 dst6
->sin6_len
= sizeof(*dst6
);
575 uint16_t len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst6
->sin6_len
);
576 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
577 tlen
+= PFKEY_ALIGN8(dst6
->sin6_len
);
580 struct sadb_key
*encrypt_key_payload
= (struct sadb_key
*)(void *)(payload
+ tlen
);
581 uint16_t len
= sizeof(*encrypt_key_payload
) + PFKEY_ALIGN8(32);
582 encrypt_key_payload
->sadb_key_len
= PFKEY_UNIT64(len
);
583 encrypt_key_payload
->sadb_key_exttype
= SADB_EXT_KEY_ENCRYPT
;
584 encrypt_key_payload
->sadb_key_bits
= (uint16_t)(32 << 3);
585 encrypt_key_payload
->sadb_key_reserved
= 0;
586 tlen
+= sizeof(*encrypt_key_payload
);
587 arc4random_buf(payload
+ tlen
, 32);
588 tlen
+= PFKEY_ALIGN8(32);
590 struct sadb_key
*auth_key_payload
= (struct sadb_key
*)(void *)(payload
+ tlen
);
591 len
= sizeof(*auth_key_payload
) + PFKEY_ALIGN8(32);
592 auth_key_payload
->sadb_key_len
= PFKEY_UNIT64(len
);
593 auth_key_payload
->sadb_key_exttype
= SADB_EXT_KEY_AUTH
;
594 auth_key_payload
->sadb_key_bits
= (uint16_t)(32 << 3);
595 auth_key_payload
->sadb_key_reserved
= 0;
596 tlen
+= sizeof(*auth_key_payload
);
597 arc4random_buf(payload
+ tlen
, 32);
598 tlen
+= PFKEY_ALIGN8(32);
600 struct sadb_lifetime
*hard_lifetime_payload
= (struct sadb_lifetime
*)(void *)(payload
+ tlen
);
601 hard_lifetime_payload
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(*hard_lifetime_payload
));
602 hard_lifetime_payload
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_HARD
;
603 tlen
+= sizeof(*hard_lifetime_payload
);
605 struct sadb_lifetime
*soft_lifetime_payload
= (struct sadb_lifetime
*)(void *)(payload
+ tlen
);
606 soft_lifetime_payload
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(*soft_lifetime_payload
));
607 soft_lifetime_payload
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_SOFT
;
608 tlen
+= sizeof(*soft_lifetime_payload
);
610 // Update the total length
611 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
612 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send update sa");
616 send_pkey_update_sa(int pfkey_socket
, uint32_t spi
)
618 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
619 bzero(payload
, sizeof(payload
));
622 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
623 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
624 msg_payload
->sadb_msg_type
= SADB_UPDATE
;
625 msg_payload
->sadb_msg_errno
= 0;
626 msg_payload
->sadb_msg_satype
= SADB_SATYPE_ESP
;
627 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
628 msg_payload
->sadb_msg_reserved
= 0;
629 msg_payload
->sadb_msg_seq
= 0;
630 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
631 tlen
+= sizeof(*msg_payload
);
633 struct sadb_sa_2
*sa2_payload
= (struct sadb_sa_2
*)(void *)(payload
+ tlen
);
634 sa2_payload
->sa
.sadb_sa_len
= PFKEY_UNIT64(sizeof(*sa2_payload
));
635 sa2_payload
->sa
.sadb_sa_exttype
= SADB_EXT_SA
;
636 sa2_payload
->sa
.sadb_sa_spi
= htonl(spi
);
637 sa2_payload
->sa
.sadb_sa_replay
= 4;
638 sa2_payload
->sa
.sadb_sa_state
= SADB_SASTATE_LARVAL
;
639 sa2_payload
->sa
.sadb_sa_auth
= SADB_X_AALG_SHA2_256
;
640 sa2_payload
->sa
.sadb_sa_encrypt
= SADB_X_EALG_AESCBC
;
641 sa2_payload
->sa
.sadb_sa_flags
|= (SADB_X_EXT_NATT
| SADB_X_EXT_NATT_KEEPALIVE
);
642 sa2_payload
->sadb_sa_natt_src_port
= htons(4500);
643 sa2_payload
->sadb_sa_natt_port
= 0; // Bad value to trigger failure
644 sa2_payload
->sadb_sa_natt_interval
= 20;
645 sa2_payload
->sadb_sa_natt_offload_interval
= 0;
646 tlen
+= sizeof(*sa2_payload
);
648 struct sadb_x_sa2
*sa2_x_payload
= (struct sadb_x_sa2
*)(void *)(payload
+ tlen
);
649 sa2_x_payload
->sadb_x_sa2_len
= PFKEY_UNIT64(sizeof(*sa2_x_payload
));
650 sa2_x_payload
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
651 sa2_x_payload
->sadb_x_sa2_mode
= IPSEC_MODE_TRANSPORT
;
652 sa2_x_payload
->sadb_x_sa2_reqid
= 0;
653 tlen
+= sizeof(*sa2_x_payload
);
655 struct sadb_address
*src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
656 src_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_SRC
& 0xffff;
657 src_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
658 src_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
659 src_address_payload
->sadb_address_reserved
= 0;
660 tlen
+= sizeof(*src_address_payload
);
662 struct sockaddr_in
*src
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
663 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_SRC_ADDRESS_IPv4
, &src
->sin_addr
), 1, "src address fail");
664 src
->sin_family
= AF_INET
;
665 src
->sin_len
= sizeof(*src
);
666 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src
->sin_len
);
667 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
668 tlen
+= PFKEY_ALIGN8(src
->sin_len
);
670 struct sadb_address
*dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
671 dst_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_DST
& 0xffff;
672 dst_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
673 dst_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
674 dst_address_payload
->sadb_address_reserved
= 0;
675 tlen
+= sizeof(*dst_address_payload
);
677 struct sockaddr_in
*dst
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
678 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_DST_ADDRESS_IPv4
, &dst
->sin_addr
), 1, "dst address fail");
679 dst
->sin_family
= AF_INET
;
680 dst
->sin_len
= sizeof(*dst
);
681 len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst
->sin_len
);
682 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
683 tlen
+= PFKEY_ALIGN8(dst
->sin_len
);
685 struct sadb_key
*encrypt_key_payload
= (struct sadb_key
*)(void *)(payload
+ tlen
);
686 len
= sizeof(*encrypt_key_payload
) + PFKEY_ALIGN8(32);
687 encrypt_key_payload
->sadb_key_len
= PFKEY_UNIT64(len
);
688 encrypt_key_payload
->sadb_key_exttype
= SADB_EXT_KEY_ENCRYPT
;
689 encrypt_key_payload
->sadb_key_bits
= (uint16_t)(32 << 3);
690 encrypt_key_payload
->sadb_key_reserved
= 0;
691 tlen
+= sizeof(*encrypt_key_payload
);
692 arc4random_buf(payload
+ tlen
, 32);
693 tlen
+= PFKEY_ALIGN8(32);
695 struct sadb_key
*auth_key_payload
= (struct sadb_key
*)(void *)(payload
+ tlen
);
696 len
= sizeof(*auth_key_payload
) + PFKEY_ALIGN8(32);
697 auth_key_payload
->sadb_key_len
= PFKEY_UNIT64(len
);
698 auth_key_payload
->sadb_key_exttype
= SADB_EXT_KEY_AUTH
;
699 auth_key_payload
->sadb_key_bits
= (uint16_t)(32 << 3);
700 auth_key_payload
->sadb_key_reserved
= 0;
701 tlen
+= sizeof(*auth_key_payload
);
702 arc4random_buf(payload
+ tlen
, 32);
703 tlen
+= PFKEY_ALIGN8(32);
705 struct sadb_lifetime
*hard_lifetime_payload
= (struct sadb_lifetime
*)(void *)(payload
+ tlen
);
706 hard_lifetime_payload
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(*hard_lifetime_payload
));
707 hard_lifetime_payload
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_HARD
;
708 tlen
+= sizeof(*hard_lifetime_payload
);
710 struct sadb_lifetime
*soft_lifetime_payload
= (struct sadb_lifetime
*)(void *)(payload
+ tlen
);
711 soft_lifetime_payload
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(*soft_lifetime_payload
));
712 soft_lifetime_payload
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_SOFT
;
713 tlen
+= sizeof(*soft_lifetime_payload
);
715 // Update the total length
716 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
717 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send update sa");
721 send_pkey_migrate_sa(int pfkey_socket
, uint32_t spi
, const char *src
, const char *dst
, int family
,
722 const char *migrate_src
, const char *migrate_dst
, int migrate_family
)
724 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
725 bzero(payload
, sizeof(payload
));
728 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
729 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
730 msg_payload
->sadb_msg_type
= SADB_MIGRATE
;
731 msg_payload
->sadb_msg_errno
= 0;
732 msg_payload
->sadb_msg_satype
= SADB_SATYPE_ESP
;
733 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
734 msg_payload
->sadb_msg_reserved
= 0;
735 msg_payload
->sadb_msg_seq
= 0;
736 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
737 tlen
+= sizeof(*msg_payload
);
739 struct sadb_sa_2
*sa2_payload
= (struct sadb_sa_2
*)(void *)(payload
+ tlen
);
740 sa2_payload
->sa
.sadb_sa_len
= PFKEY_UNIT64(sizeof(*sa2_payload
));
741 sa2_payload
->sa
.sadb_sa_exttype
= SADB_EXT_SA
;
742 sa2_payload
->sa
.sadb_sa_spi
= htonl(spi
);
743 sa2_payload
->sa
.sadb_sa_replay
= 4;
744 sa2_payload
->sa
.sadb_sa_state
= SADB_SASTATE_LARVAL
;
745 sa2_payload
->sa
.sadb_sa_auth
= SADB_X_AALG_SHA2_256
;
746 sa2_payload
->sa
.sadb_sa_encrypt
= SADB_X_EALG_AESCBC
;
747 sa2_payload
->sa
.sadb_sa_flags
|= (SADB_X_EXT_NATT
| SADB_X_EXT_NATT_KEEPALIVE
);
748 sa2_payload
->sadb_sa_natt_src_port
= htons(4500);
749 sa2_payload
->sadb_sa_natt_port
= 0; // Bad value to trigger failure
750 sa2_payload
->sadb_sa_natt_interval
= 20;
751 sa2_payload
->sadb_sa_natt_offload_interval
= 0;
752 tlen
+= sizeof(*sa2_payload
);
754 struct sadb_x_sa2
*sa2_x_payload
= (struct sadb_x_sa2
*)(void *)(payload
+ tlen
);
755 sa2_x_payload
->sadb_x_sa2_len
= PFKEY_UNIT64(sizeof(*sa2_x_payload
));
756 sa2_x_payload
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
757 sa2_x_payload
->sadb_x_sa2_mode
= IPSEC_MODE_TRANSPORT
;
758 sa2_x_payload
->sadb_x_sa2_reqid
= 0;
759 tlen
+= sizeof(*sa2_x_payload
);
761 uint8_t prefixlen
= (family
== AF_INET
) ? (sizeof(struct in_addr
) << 3) : (sizeof(struct in6_addr
) << 3);
763 struct sadb_address
*src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
764 src_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_SRC
& 0xffff;
765 src_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
766 src_address_payload
->sadb_address_prefixlen
= prefixlen
;
767 src_address_payload
->sadb_address_reserved
= 0;
768 tlen
+= sizeof(*src_address_payload
);
770 if (family
== AF_INET
) {
771 struct sockaddr_in
*src4
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
772 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, src
, &src4
->sin_addr
), 1, "src address fail");
773 src4
->sin_family
= AF_INET
;
774 src4
->sin_len
= sizeof(*src4
);
775 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src4
->sin_len
);
776 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
777 tlen
+= PFKEY_ALIGN8(src4
->sin_len
);
779 struct sockaddr_in6
*src6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
780 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, src
, &src6
->sin6_addr
), 1, "src address fail");
781 src6
->sin6_family
= AF_INET6
;
782 src6
->sin6_len
= sizeof(*src6
);
783 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src6
->sin6_len
);
784 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
785 tlen
+= PFKEY_ALIGN8(src6
->sin6_len
);
788 struct sadb_address
*dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
789 dst_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_DST
& 0xffff;
790 dst_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
791 dst_address_payload
->sadb_address_prefixlen
= prefixlen
;
792 dst_address_payload
->sadb_address_reserved
= 0;
793 tlen
+= sizeof(*dst_address_payload
);
795 if (family
== AF_INET
) {
796 struct sockaddr_in
*dst4
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
797 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, dst
, &dst4
->sin_addr
), 1, "dst address fail");
798 dst4
->sin_family
= AF_INET
;
799 dst4
->sin_len
= sizeof(*dst4
);
800 uint16_t len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst4
->sin_len
);
801 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
802 tlen
+= PFKEY_ALIGN8(dst4
->sin_len
);
804 struct sockaddr_in6
*dst6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
805 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, dst
, &dst6
->sin6_addr
), 1, "dst address fail");
806 dst6
->sin6_family
= AF_INET6
;
807 dst6
->sin6_len
= sizeof(*dst6
);
808 uint16_t len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst6
->sin6_len
);
809 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
810 tlen
+= PFKEY_ALIGN8(dst6
->sin6_len
);
813 prefixlen
= (migrate_family
== AF_INET
) ? (sizeof(struct in_addr
) << 3) : (sizeof(struct in6_addr
) << 3);
815 struct sadb_address
*migrate_src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
816 migrate_src_address_payload
->sadb_address_exttype
= SADB_EXT_MIGRATE_ADDRESS_SRC
& 0xffff;
817 migrate_src_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
818 migrate_src_address_payload
->sadb_address_prefixlen
= prefixlen
;
819 migrate_src_address_payload
->sadb_address_reserved
= 0;
820 tlen
+= sizeof(*migrate_src_address_payload
);
822 if (migrate_family
== AF_INET
) {
823 struct sockaddr_in
*migrate_src4
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
824 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, migrate_src
, &migrate_src4
->sin_addr
), 1, "migrate src fail");
825 migrate_src4
->sin_family
= AF_INET
;
826 migrate_src4
->sin_len
= sizeof(*migrate_src4
);
827 uint16_t len
= sizeof(*migrate_src_address_payload
) + PFKEY_ALIGN8(migrate_src4
->sin_len
);
828 migrate_src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
829 tlen
+= PFKEY_ALIGN8(migrate_src4
->sin_len
);
830 } else if (migrate_family
== AF_INET6
) {
831 struct sockaddr_in6
*migrate_src6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
832 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, migrate_src
, &migrate_src6
->sin6_addr
), 1, "migrate src fail");
833 migrate_src6
->sin6_family
= AF_INET6
;
834 migrate_src6
->sin6_len
= sizeof(*migrate_src6
);
835 uint16_t len
= sizeof(*migrate_src_address_payload
) + PFKEY_ALIGN8(migrate_src6
->sin6_len
);
836 migrate_src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
837 tlen
+= PFKEY_ALIGN8(migrate_src6
->sin6_len
);
838 } else if (migrate_family
== AF_CHAOS
) {
839 struct sockaddr_in6
*migrate_src6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
840 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, migrate_src
, &migrate_src6
->sin6_addr
), 1, "migrate src fail");
841 migrate_src6
->sin6_family
= AF_INET6
;
842 migrate_src6
->sin6_len
= sizeof(*migrate_src6
) + 100; // Bad value to trigger exploit
843 uint16_t len
= sizeof(*migrate_src_address_payload
) + PFKEY_ALIGN8(migrate_src6
->sin6_len
);
844 migrate_src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
845 tlen
+= PFKEY_ALIGN8(migrate_src6
->sin6_len
);
848 struct sadb_address
*migrate_dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
849 migrate_dst_address_payload
->sadb_address_exttype
= SADB_EXT_MIGRATE_ADDRESS_DST
& 0xffff;
850 migrate_dst_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
851 migrate_dst_address_payload
->sadb_address_prefixlen
= prefixlen
;
852 migrate_dst_address_payload
->sadb_address_reserved
= 0;
854 tlen
+= sizeof(*migrate_dst_address_payload
);
856 if (migrate_family
== AF_INET
) {
857 struct sockaddr_in
*migrate_dst4
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
858 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, migrate_dst
, &migrate_dst4
->sin_addr
), 1, "migrate dst fail");
859 migrate_dst4
->sin_family
= AF_INET
;
860 migrate_dst4
->sin_len
= sizeof(*migrate_dst4
);
861 uint16_t len
= sizeof(*migrate_dst_address_payload
) + PFKEY_ALIGN8(migrate_dst4
->sin_len
);
862 migrate_dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
863 tlen
+= PFKEY_ALIGN8(migrate_dst4
->sin_len
);
864 } else if (migrate_family
== AF_INET6
) {
865 struct sockaddr_in6
*migrate_dst6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
866 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, migrate_dst
, &migrate_dst6
->sin6_addr
), 1, "migrate dst fail");
867 migrate_dst6
->sin6_family
= AF_INET6
;
868 migrate_dst6
->sin6_len
= sizeof(*migrate_dst6
);
869 uint16_t len
= sizeof(*migrate_dst_address_payload
) + PFKEY_ALIGN8(migrate_dst6
->sin6_len
);
870 migrate_dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
871 tlen
+= PFKEY_ALIGN8(migrate_dst6
->sin6_len
);
872 } else if (migrate_family
== AF_CHAOS
) {
873 struct sockaddr_in6
*migrate_dst6
= (struct sockaddr_in6
*)(void *)(payload
+ tlen
);
874 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET6
, migrate_dst
, &migrate_dst6
->sin6_addr
), 1, "migrate dst fail");
875 migrate_dst6
->sin6_family
= AF_INET6
;
876 migrate_dst6
->sin6_len
= sizeof(*migrate_dst6
) + 100; // Bad value to trigger exploit
877 uint16_t len
= sizeof(*migrate_dst_address_payload
) + PFKEY_ALIGN8(migrate_dst6
->sin6_len
);
878 migrate_dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
879 tlen
+= PFKEY_ALIGN8(migrate_dst6
->sin6_len
);
882 // Update the total length
883 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
884 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send migrate sa");
888 send_pfkey_get_sa_stat(int pfkey_socket
, uint32_t spi
, uint32_t stat_length
)
890 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
891 bzero(payload
, sizeof(payload
));
894 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
895 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
896 msg_payload
->sadb_msg_type
= SADB_GETSASTAT
;
897 msg_payload
->sadb_msg_errno
= 0;
898 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
899 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
900 msg_payload
->sadb_msg_reserved
= 0;
901 msg_payload
->sadb_msg_seq
= 0;
902 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
903 tlen
+= sizeof(*msg_payload
);
905 struct sadb_session_id
*session_id_payload
= (struct sadb_session_id
*)(void *)(payload
+ tlen
);
906 session_id_payload
->sadb_session_id_len
= PFKEY_UNIT64(sizeof(*session_id_payload
));
907 session_id_payload
->sadb_session_id_exttype
= SADB_EXT_SESSION_ID
;
908 session_id_payload
->sadb_session_id_v
[0] = 1;
909 tlen
+= sizeof(*session_id_payload
);
911 struct sadb_sastat
*sadb_stat_payload
= (struct sadb_sastat
*)(void *)(payload
+ tlen
);
912 uint16_t length
= sizeof(*sadb_stat_payload
) + PFKEY_ALIGN8(sizeof(struct sastat
));
913 sadb_stat_payload
->sadb_sastat_len
= PFKEY_UNIT64(length
);
914 sadb_stat_payload
->sadb_sastat_exttype
= SADB_EXT_SASTAT
;
915 sadb_stat_payload
->sadb_sastat_dir
= IPSEC_DIR_OUTBOUND
;
916 sadb_stat_payload
->sadb_sastat_list_len
= stat_length
;
917 tlen
+= sizeof(*sadb_stat_payload
);
919 struct sastat
*sastat_payload
= (struct sastat
*)(void *)(payload
+ tlen
);
920 sastat_payload
->spi
= htonl(spi
);
921 tlen
+= PFKEY_ALIGN8(sizeof(*sastat_payload
));
923 // Update the total length
924 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
925 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send get sa stat");
929 send_pkey_delete_sa(int pfkey_socket
, uint32_t spi
)
931 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
932 bzero(payload
, sizeof(payload
));
935 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
936 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
937 msg_payload
->sadb_msg_type
= SADB_DELETE
;
938 msg_payload
->sadb_msg_errno
= 0;
939 msg_payload
->sadb_msg_satype
= SADB_SATYPE_ESP
;
940 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
941 msg_payload
->sadb_msg_reserved
= 0;
942 msg_payload
->sadb_msg_seq
= 0;
943 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
944 tlen
+= sizeof(*msg_payload
);
946 struct sadb_sa_2
*sa2_payload
= (struct sadb_sa_2
*)(void *)(payload
+ tlen
);
947 sa2_payload
->sa
.sadb_sa_len
= PFKEY_UNIT64(sizeof(*sa2_payload
));
948 sa2_payload
->sa
.sadb_sa_exttype
= SADB_EXT_SA
;
949 sa2_payload
->sa
.sadb_sa_spi
= htonl(spi
);
950 tlen
+= sizeof(*sa2_payload
);
952 struct sadb_address
*src_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
953 src_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_SRC
& 0xffff;
954 src_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
955 src_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
956 src_address_payload
->sadb_address_reserved
= 0;
957 tlen
+= sizeof(*src_address_payload
);
959 struct sockaddr_in
*src
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
960 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_SRC_ADDRESS_IPv4
, &src
->sin_addr
), 1, "migrate src fail");
961 src
->sin_family
= AF_INET
;
962 src
->sin_len
= sizeof(*src
);
963 uint16_t len
= sizeof(*src_address_payload
) + PFKEY_ALIGN8(src
->sin_len
);
964 src_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
965 tlen
+= PFKEY_ALIGN8(src
->sin_len
);
967 struct sadb_address
*dst_address_payload
= (struct sadb_address
*)(void *)(payload
+ tlen
);
968 dst_address_payload
->sadb_address_exttype
= SADB_EXT_ADDRESS_DST
& 0xffff;
969 dst_address_payload
->sadb_address_proto
= IPSEC_ULPROTO_ANY
& 0xff;
970 dst_address_payload
->sadb_address_prefixlen
= (sizeof(struct in_addr
) << 3);
971 dst_address_payload
->sadb_address_reserved
= 0;
972 tlen
+= sizeof(*dst_address_payload
);
974 struct sockaddr_in
*dst
= (struct sockaddr_in
*)(void *)(payload
+ tlen
);
975 T_QUIET
; T_ASSERT_EQ_INT(inet_pton(AF_INET
, TEST_DST_ADDRESS_IPv4
, &dst
->sin_addr
), 1, "migrate dst fail");
976 dst
->sin_family
= AF_INET
;
977 dst
->sin_len
= sizeof(*dst
);
978 len
= sizeof(*dst_address_payload
) + PFKEY_ALIGN8(dst
->sin_len
);
979 dst_address_payload
->sadb_address_len
= PFKEY_UNIT64(len
);
980 tlen
+= PFKEY_ALIGN8(dst
->sin_len
);
982 // Update the total length
983 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
984 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send delete sa");
988 send_pfkey_sa_dump_message(int pfkey_socket
)
990 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
991 bzero(payload
, sizeof(payload
));
994 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)(void *)payload
;
995 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
996 msg_payload
->sadb_msg_type
= SADB_DUMP
;
997 msg_payload
->sadb_msg_errno
= 0;
998 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
999 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
1000 msg_payload
->sadb_msg_reserved
= 0;
1001 msg_payload
->sadb_msg_seq
= 0;
1002 msg_payload
->sadb_msg_pid
= (uint32_t)getpid();
1003 tlen
+= sizeof(*msg_payload
);
1005 // Update the total length
1006 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
1007 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey send sa dump failed");
1011 send_pfkey_flush_sa(int pfkey_socket
)
1013 uint8_t payload
[MCLBYTES
] __attribute__ ((aligned(32)));
1014 bzero(payload
, sizeof(payload
));
1017 struct sadb_msg
*msg_payload
= (struct sadb_msg
*)payload
;
1018 msg_payload
->sadb_msg_version
= PF_KEY_V2
;
1019 msg_payload
->sadb_msg_type
= SADB_FLUSH
;
1020 msg_payload
->sadb_msg_errno
= 0;
1021 msg_payload
->sadb_msg_satype
= SADB_SATYPE_UNSPEC
;
1022 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
1023 msg_payload
->sadb_msg_reserved
= 0;
1024 msg_payload
->sadb_msg_seq
= 0;
1025 msg_payload
->sadb_msg_pid
= (u_int32_t
)getpid();
1026 tlen
+= sizeof(*msg_payload
);
1028 // Update the total length
1029 msg_payload
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
1030 T_QUIET
; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket
, payload
, (size_t)PFKEY_UNUNIT64(msg_payload
->sadb_msg_len
), 0), "pfkey flush sa");
1036 if (pfkey_source
!= NULL
) {
1037 int pfkey_socket
= (int)dispatch_source_get_handle(pfkey_source
);
1038 if (pfkey_socket
> 0) {
1039 send_pfkey_flush_sa(pfkey_socket
);
1040 send_pfkey_flush_sp(pfkey_socket
);
1042 dispatch_source_cancel(pfkey_source
);
1043 pfkey_source
= NULL
;
1048 pfkey_setup_socket(void)
1050 int pfkey_socket
= -1;
1052 const unsigned long newbufk
= 1536;
1053 unsigned long oldmax
;
1054 size_t oldmaxsize
= sizeof(oldmax
);
1055 unsigned long newmax
= newbufk
* (1024 + 128);
1057 T_QUIET
; T_ASSERT_POSIX_SUCCESS(pfkey_socket
= socket(PF_KEY
, SOCK_RAW
, PF_KEY_V2
), NULL
);
1059 if (sysctlbyname("kern.ipc.maxsockbuf", &oldmax
, &oldmaxsize
, &newmax
, sizeof(newmax
)) != 0) {
1060 bufsiz
= 233016; /* Max allowed by default */
1062 bufsiz
= newbufk
* 1024;
1065 T_QUIET
; T_ASSERT_POSIX_SUCCESS(setsockopt(pfkey_socket
, SOL_SOCKET
, SO_SNDBUF
, &bufsiz
, sizeof(bufsiz
)), "pfkey set snd socket buf failed %d", bufsiz
);
1066 T_QUIET
; T_ASSERT_POSIX_SUCCESS(setsockopt(pfkey_socket
, SOL_SOCKET
, SO_RCVBUF
, &bufsiz
, sizeof(bufsiz
)), "pfkey set recv socket buf failed %d", bufsiz
);
1068 pfkey_source
= dispatch_source_create(DISPATCH_SOURCE_TYPE_READ
, (uintptr_t)pfkey_socket
, 0, dispatch_get_main_queue());
1069 T_QUIET
; T_ASSERT_NOTNULL(pfkey_source
, "dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, ...)");
1070 dispatch_source_set_event_handler(pfkey_source
, ^{
1071 recv_pfkey_message(pfkey_socket
);
1073 dispatch_source_set_cancel_handler(pfkey_source
, ^{
1074 close(pfkey_socket
);
1076 dispatch_resume(pfkey_source
);
1077 return pfkey_socket
;
1081 pfkey_process_message_test_60822136(uint8_t **mhp
, int pfkey_socket
)
1083 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1084 static int counter
= 0;
1085 static uint32_t policy_id
= 0;
1087 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1091 if (message
->sadb_msg_errno
) {
1092 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_type
, SADB_X_SPDDUMP
, "SADB error for type %u", message
->sadb_msg_type
);
1097 switch (message
->sadb_msg_type
) {
1100 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1101 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd add policy message is NULL");
1102 policy_id
= policy_message
->sadb_x_policy_id
;
1103 T_LOG("Added policy id %u", policy_id
);
1104 send_pfkey_spd_get_message(pfkey_socket
, policy_id
);;
1109 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1110 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd get policy message is NULL");
1111 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_get: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1112 if (counter
< MAX_SPD_CHECK
) {
1114 send_pfkey_spd_get_message(pfkey_socket
, policy_id
);
1116 T_LOG("Deleting policy id %u", policy_id
);
1117 send_pfkey_spd_delete_message(pfkey_socket
, policy_id
);
1121 case SADB_X_SPDDELETE2
:
1123 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1124 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd delete2 policy message is NULL");
1125 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_delete2: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1126 T_LOG("Deleted policy id %u", policy_id
);
1128 send_pfkey_spd_dump_message(pfkey_socket
);
1131 case SADB_X_SPDDUMP
:
1133 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1134 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd dump policy message is NULL");
1135 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_dump: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1136 T_FAIL("Policy id %u still exists", policy_id
);
1141 case SADB_X_SPDFLUSH
:
1144 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1151 pfkey_process_message_test_60822924(uint8_t **mhp
, int pfkey_socket
)
1153 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1154 static int counter
= 0;
1155 static uint32_t policy_id
= 0;
1157 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1161 if (message
->sadb_msg_errno
) {
1162 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_type
, SADB_X_SPDDUMP
, "SADB error for type %u", message
->sadb_msg_type
);
1167 switch (message
->sadb_msg_type
) {
1170 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1171 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd add policy message is NULL");
1172 policy_id
= policy_message
->sadb_x_policy_id
;
1173 T_LOG("Added policy id %u", policy_id
);
1174 send_pfkey_spd_enable_message(pfkey_socket
, policy_id
);;
1177 case SADB_X_SPDENABLE
:
1179 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1180 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd enable policy message is NULL");
1181 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_enable: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1182 if (counter
< MAX_SPD_CHECK
) {
1184 send_pfkey_spd_enable_message(pfkey_socket
, policy_id
);
1186 T_LOG("Deleting policy id %u", policy_id
);
1187 send_pfkey_spd_delete_message(pfkey_socket
, policy_id
);
1191 case SADB_X_SPDDELETE2
:
1193 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1194 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd delete2 policy message is NULL");
1195 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_delete2: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1196 T_LOG("Deleted policy id %u", policy_id
);
1198 send_pfkey_spd_dump_message(pfkey_socket
);
1201 case SADB_X_SPDDUMP
:
1203 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1204 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd dump policy message is NULL");
1205 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_dump: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1206 T_FAIL("Policy id %u still exists", policy_id
);
1211 case SADB_X_SPDFLUSH
:
1214 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1221 pfkey_process_message_test_60822956(uint8_t **mhp
, int pfkey_socket
)
1223 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1224 static int counter
= 0;
1225 static uint32_t policy_id
= 0;
1227 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1231 if (message
->sadb_msg_errno
) {
1232 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_type
, SADB_X_SPDDUMP
, "SADB error for type %u", message
->sadb_msg_type
);
1237 switch (message
->sadb_msg_type
) {
1240 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1241 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd add policy message is NULL");
1242 policy_id
= policy_message
->sadb_x_policy_id
;
1243 T_LOG("Added policy id %u", policy_id
);
1244 send_pfkey_spd_disable_message(pfkey_socket
, policy_id
);;
1247 case SADB_X_SPDDISABLE
:
1249 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1250 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd disable policy message is NULL");
1251 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_disable: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1252 if (counter
< MAX_SPD_CHECK
) {
1254 send_pfkey_spd_disable_message(pfkey_socket
, policy_id
);
1256 T_LOG("Deleting policy id %u", policy_id
);
1257 send_pfkey_spd_delete_message(pfkey_socket
, policy_id
);
1261 case SADB_X_SPDDELETE2
:
1263 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1264 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd delete2 policy message is NULL");
1265 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_delete2: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1266 T_LOG("Deleted policy id %u", policy_id
);
1268 send_pfkey_spd_dump_message(pfkey_socket
);
1271 case SADB_X_SPDDUMP
:
1273 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1274 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd dump policy message is NULL");
1275 T_QUIET
; T_ASSERT_EQ(policy_id
, policy_message
->sadb_x_policy_id
, "spd_dump: spid mismatch %u != %u", policy_id
, policy_message
->sadb_x_policy_id
);
1276 T_FAIL("Policy id %u still exists", policy_id
);
1281 case SADB_X_SPDFLUSH
:
1284 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1291 pfkey_process_message_test_60679513(uint8_t **mhp
, int pfkey_socket
)
1293 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1294 static uint32_t spi
= 0;
1296 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1300 if (message
->sadb_msg_errno
) {
1301 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_type
, SADB_UPDATE
, "SADB error for type %u", message
->sadb_msg_type
);
1304 switch (message
->sadb_msg_type
) {
1307 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1308 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "sa get spi message is NULL");
1309 spi
= ntohl(sa_message
->sadb_sa_spi
);
1310 T_LOG("get spi 0x%x", spi
);
1311 send_pkey_update_sa(pfkey_socket
, spi
);
1316 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1317 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "update sa message is NULL");
1318 T_QUIET
; T_ASSERT_EQ(spi
, ntohl(sa_message
->sadb_sa_spi
), "sadb update: spi mismatch %u != %u", spi
, ntohl(sa_message
->sadb_sa_spi
));
1319 T_LOG("update sa 0x%x", spi
);
1320 send_pkey_delete_sa(pfkey_socket
, spi
);
1325 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1326 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "delete sa message is NULL");
1327 T_QUIET
; T_ASSERT_EQ(spi
, ntohl(sa_message
->sadb_sa_spi
), "sadb delete: spi mismatch %u != %u", spi
, ntohl(sa_message
->sadb_sa_spi
));
1328 T_LOG("delete sa 0x%x", spi
);
1333 case SADB_X_SPDFLUSH
:
1336 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1343 pfkey_process_message_test_60768729(uint8_t **mhp
, int pfkey_socket
)
1345 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1347 static int counter
= 0;
1349 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1353 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, 0, "SADB error for type %u", message
->sadb_msg_type
);
1355 switch (message
->sadb_msg_type
) {
1358 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1359 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "sa get spi message is NULL");
1360 spi
= ntohl(sa_message
->sadb_sa_spi
);
1362 if (counter
<= 1000) {
1363 send_pkey_get_spi(pfkey_socket
);
1365 T_LOG("SADB added 1000 Larval SPIs");
1366 send_pfkey_sa_dump_message(pfkey_socket
);
1374 T_PASS("SADB dump successful");
1382 case SADB_X_SPDFLUSH
:
1385 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1392 pfkey_process_message_test_60769680(uint8_t **mhp
, int pfkey_socket
)
1394 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1395 static uint8_t counter
= 0;
1397 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1401 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, 0, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1403 switch (message
->sadb_msg_type
) {
1406 struct sadb_x_policy
*policy_message
= (struct sadb_x_policy
*)(void *)mhp
[SADB_X_EXT_POLICY
];
1407 T_QUIET
; T_ASSERT_NOTNULL(policy_message
, "spd add policy message is NULL");
1409 if (counter
<= 240) {
1410 send_pfkey_spd_add_message(pfkey_socket
, counter
+ 1);
1412 T_LOG("SADB added 240 security policies");
1413 send_pfkey_spd_dump_message(pfkey_socket
);
1417 case SADB_X_SPDDUMP
:
1421 T_PASS("SADB policy dump successful");
1429 case SADB_X_SPDFLUSH
:
1432 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1439 pfkey_process_message_test_60822823(uint8_t **mhp
, int pfkey_socket
)
1441 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1442 static uint32_t spi
= 0;
1444 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1448 if (message
->sadb_msg_errno
!= 0) {
1449 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_type
, SADB_GETSASTAT
, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1450 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, EINVAL
, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1451 T_PASS("SADB get SA Stat received EINVAL");
1455 switch (message
->sadb_msg_type
) {
1458 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1459 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "add sa message is NULL");
1460 spi
= ntohl(sa_message
->sadb_sa_spi
);
1461 T_LOG("added sa 0x%x", spi
);
1462 send_pfkey_get_sa_stat(pfkey_socket
, spi
, 5);
1465 case SADB_GETSASTAT
:
1467 T_FAIL("get sa stat should fail %u", message
->sadb_msg_type
);
1471 case SADB_X_SPDFLUSH
:
1474 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1481 pfkey_process_message_test_60822823_1(uint8_t **mhp
, int pfkey_socket
)
1483 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1484 static uint32_t spi
= 0;
1486 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1490 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, 0, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1492 switch (message
->sadb_msg_type
) {
1495 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1496 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "add sa message is NULL");
1497 spi
= ntohl(sa_message
->sadb_sa_spi
);
1498 T_LOG("added sa 0x%x", spi
);
1499 send_pfkey_get_sa_stat(pfkey_socket
, spi
, 1);
1502 case SADB_GETSASTAT
:
1504 struct sadb_session_id
*session_id
= (struct sadb_session_id
*)(void *)mhp
[SADB_EXT_SESSION_ID
];
1505 T_QUIET
; T_ASSERT_NOTNULL(session_id
, "session id is NULL");
1506 T_QUIET
; T_EXPECT_EQ_ULLONG(session_id
->sadb_session_id_v
[0], 1ULL, "Session id is not equal");
1507 T_PASS("get sa stat success %u", message
->sadb_msg_type
);
1511 case SADB_X_SPDFLUSH
:
1514 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1521 pfkey_process_message_test_60687183(uint8_t **mhp
, int pfkey_socket
)
1523 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1524 static uint32_t spi
= 0;
1526 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1530 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, 0, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1532 switch (message
->sadb_msg_type
) {
1535 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1536 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "add sa message is NULL");
1537 spi
= ntohl(sa_message
->sadb_sa_spi
);
1538 T_LOG("added sa 0x%x", spi
);
1539 send_pkey_migrate_sa(pfkey_socket
, spi
, TEST_SRC_ADDRESS_IPv4
, TEST_DST_ADDRESS_IPv4
, AF_INET
,
1540 TEST_MIGRATE_SRC_ADDRESS_IPv4
, TEST_MIGRATE_DST_ADDRESS_IPv4
, AF_INET
);
1545 T_PASS("migrate SA success");
1549 case SADB_X_SPDFLUSH
:
1552 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1559 pfkey_process_message_test_60687183_1(uint8_t **mhp
, int pfkey_socket
)
1561 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1562 static uint32_t spi
= 0;
1564 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1568 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, 0, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1570 switch (message
->sadb_msg_type
) {
1573 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1574 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "add sa message is NULL");
1575 spi
= ntohl(sa_message
->sadb_sa_spi
);
1576 T_LOG("added sa 0x%x", spi
);
1577 send_pkey_migrate_sa(pfkey_socket
, spi
, TEST_SRC_ADDRESS_IPv6
, TEST_DST_ADDRESS_IPv6
, AF_INET6
,
1578 TEST_MIGRATE_SRC_ADDRESS_IPv6
, TEST_MIGRATE_DST_ADDRESS_IPv6
, AF_INET6
);
1583 T_PASS("migrate SA success");
1587 case SADB_X_SPDFLUSH
:
1590 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1597 pfkey_process_message_test_60687183_2(uint8_t **mhp
, int pfkey_socket
)
1599 struct sadb_msg
*message
= (struct sadb_msg
*)(void *)mhp
[0];
1600 static uint32_t spi
= 0;
1602 if (message
->sadb_msg_pid
!= (uint32_t)getpid()) {
1606 if (message
->sadb_msg_errno
!= 0) {
1607 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_type
, SADB_MIGRATE
, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1608 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, EINVAL
, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1609 T_PASS("SADB migrate SA received EINVAL");
1613 T_QUIET
; T_ASSERT_EQ(message
->sadb_msg_errno
, 0, "SADB error for type %u error %d", message
->sadb_msg_type
, message
->sadb_msg_errno
);
1615 switch (message
->sadb_msg_type
) {
1618 struct sadb_sa
*sa_message
= (struct sadb_sa
*)(void *)mhp
[SADB_EXT_SA
];
1619 T_QUIET
; T_ASSERT_NOTNULL(sa_message
, "add sa message is NULL");
1620 spi
= ntohl(sa_message
->sadb_sa_spi
);
1621 T_LOG("added sa 0x%x", spi
);
1622 send_pkey_migrate_sa(pfkey_socket
, spi
, TEST_SRC_ADDRESS_IPv6
, TEST_DST_ADDRESS_IPv6
, AF_INET6
,
1623 TEST_MIGRATE_SRC_ADDRESS_IPv6
, TEST_MIGRATE_DST_ADDRESS_IPv6
, AF_CHAOS
);
1628 T_FAIL("migrate SA test for bad address failed");
1632 case SADB_X_SPDFLUSH
:
1635 T_FAIL("bad SADB message type %u", message
->sadb_msg_type
);
1641 T_DECL(sadb_x_get_60822136
, "security policy reference count overflow")
1643 test_id
= TEST_SADB_X_GET_OVERFLOW_60822136
;
1645 int pfkey_socket
= pfkey_setup_socket();
1646 send_pfkey_flush_sa(pfkey_socket
);
1647 send_pfkey_flush_sp(pfkey_socket
);
1648 send_pfkey_spd_add_message(pfkey_socket
, IPSEC_ULPROTO_ANY
);
1653 T_DECL(sadb_x_spd_enable_60822924
, "security policy reference count overflow")
1655 test_id
= TEST_SADB_X_SPDENABLE_OVERFLOW_60822924
;
1657 int pfkey_socket
= pfkey_setup_socket();
1658 send_pfkey_flush_sa(pfkey_socket
);
1659 send_pfkey_flush_sp(pfkey_socket
);
1660 send_pfkey_spd_add_message(pfkey_socket
, IPSEC_ULPROTO_ANY
);
1665 T_DECL(sadb_x_spd_disable_60822956
, "security policy reference count overflow")
1667 test_id
= TEST_SADB_X_SPDDISABLE_OVERFLOW_60822956
;
1669 int pfkey_socket
= pfkey_setup_socket();
1670 send_pfkey_flush_sa(pfkey_socket
);
1671 send_pfkey_flush_sp(pfkey_socket
);
1672 send_pfkey_spd_add_message(pfkey_socket
, IPSEC_ULPROTO_ANY
);
1677 T_DECL(sadb_update_60679513
, "security association use after free")
1679 test_id
= TEST_SADB_UPDATE_USE_AFTER_FREE_60679513
;
1681 int pfkey_socket
= pfkey_setup_socket();
1682 send_pfkey_flush_sa(pfkey_socket
);
1683 send_pfkey_flush_sp(pfkey_socket
);
1684 send_pkey_get_spi(pfkey_socket
);
1689 T_DECL(sadb_dump_60768729
, "security association sa dump heap overflow")
1691 test_id
= TEST_SADB_DUMP_HEAP_OVERFLOW_60768729
;
1693 int pfkey_socket
= pfkey_setup_socket();
1694 T_ATEND(pfkey_cleanup
);
1695 send_pfkey_flush_sa(pfkey_socket
);
1696 send_pfkey_flush_sp(pfkey_socket
);
1697 send_pkey_get_spi(pfkey_socket
);
1702 T_DECL(sadb_policy_dump_60769680
, "security association sa policy dump heap overflow")
1704 test_id
= TEST_SADB_POLICY_DUMP_HEAP_OVERFLOW_60769680
;
1706 int pfkey_socket
= pfkey_setup_socket();
1707 T_ATEND(pfkey_cleanup
);
1708 send_pfkey_flush_sa(pfkey_socket
);
1709 send_pfkey_flush_sp(pfkey_socket
);
1710 send_pfkey_spd_add_message(pfkey_socket
, 1);
1715 T_DECL(sadb_get_sastat_oob_60769680
, "security association get sa stat oob read")
1717 test_id
= TEST_SADB_GETSASTAT_OOB_READ_60822823
;
1719 int pfkey_socket
= pfkey_setup_socket();
1720 T_ATEND(pfkey_cleanup
);
1721 send_pfkey_flush_sa(pfkey_socket
);
1722 send_pfkey_flush_sp(pfkey_socket
);
1723 send_pkey_add_sa(pfkey_socket
, 0x12345678, TEST_SRC_ADDRESS_IPv4
, TEST_DST_ADDRESS_IPv4
, AF_INET
);
1728 T_DECL(sadb_get_sastat_success
, "security association get sa stat")
1730 test_id
= TEST_SADB_GETSASTAT_OOB_READ_SUCCESS
;
1732 int pfkey_socket
= pfkey_setup_socket();
1733 T_ATEND(pfkey_cleanup
);
1734 send_pfkey_flush_sa(pfkey_socket
);
1735 send_pfkey_flush_sp(pfkey_socket
);
1736 send_pkey_add_sa(pfkey_socket
, 0x12345678, TEST_SRC_ADDRESS_IPv4
, TEST_DST_ADDRESS_IPv4
, AF_INET
);
1741 T_DECL(sadb_key_migrate_address_ipv4
, "security association migrate address ipv4")
1743 test_id
= TEST_SADB_EXT_MIGRATE_ADDRESS_IPv4
;
1745 int pfkey_socket
= pfkey_setup_socket();
1746 T_ATEND(pfkey_cleanup
);
1747 send_pfkey_flush_sa(pfkey_socket
);
1748 send_pfkey_flush_sp(pfkey_socket
);
1749 send_pkey_add_sa(pfkey_socket
, 0x12345678, TEST_SRC_ADDRESS_IPv4
, TEST_DST_ADDRESS_IPv4
, AF_INET
);
1754 T_DECL(sadb_key_migrate_address_ipv6
, "security association migrate address ipv6")
1756 test_id
= TEST_SADB_EXT_MIGRATE_ADDRESS_IPv6
;
1758 int pfkey_socket
= pfkey_setup_socket();
1759 T_ATEND(pfkey_cleanup
);
1760 send_pfkey_flush_sa(pfkey_socket
);
1761 send_pfkey_flush_sp(pfkey_socket
);
1762 send_pkey_add_sa(pfkey_socket
, 0x12345678, TEST_SRC_ADDRESS_IPv6
, TEST_DST_ADDRESS_IPv6
, AF_INET6
);
1767 T_DECL(sadb_key_migrate_bad_address
, "security association migrate bad address")
1769 test_id
= TEST_SADB_EXT_MIGRATE_BAD_ADDRESS
;
1771 int pfkey_socket
= pfkey_setup_socket();
1772 T_ATEND(pfkey_cleanup
);
1773 send_pfkey_flush_sa(pfkey_socket
);
1774 send_pfkey_flush_sp(pfkey_socket
);
1775 send_pkey_add_sa(pfkey_socket
, 0x12345678, TEST_SRC_ADDRESS_IPv6
, TEST_DST_ADDRESS_IPv6
, AF_INET6
);