xref: /xnu-11215.1.10/tests/pfkey.c (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
1*8d741a5dSApple OSS Distributions #include <darwintest.h>
2*8d741a5dSApple OSS Distributions #include <darwintest_utils.h>
3*8d741a5dSApple OSS Distributions #include <dispatch/dispatch.h>
4*8d741a5dSApple OSS Distributions #include <net/if_var_private.h>
5*8d741a5dSApple OSS Distributions #include <System/net/pfkeyv2.h>
6*8d741a5dSApple OSS Distributions #include <netinet6/ipsec.h>
7*8d741a5dSApple OSS Distributions #include <arpa/inet.h>
8*8d741a5dSApple OSS Distributions 
9*8d741a5dSApple OSS Distributions T_GLOBAL_META(
10*8d741a5dSApple OSS Distributions 	T_META_NAMESPACE("xnu.pfkey"),
11*8d741a5dSApple OSS Distributions 	T_META_ASROOT(true),
12*8d741a5dSApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
13*8d741a5dSApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("NetworkExtension"),
14*8d741a5dSApple OSS Distributions 	T_META_CHECK_LEAKS(false));
15*8d741a5dSApple OSS Distributions 
16*8d741a5dSApple OSS Distributions #define MAX_SPD_CHECK       100
17*8d741a5dSApple OSS Distributions #define TEST_SRC_ADDRESS_IPv4           "192.168.2.2"
18*8d741a5dSApple OSS Distributions #define TEST_DST_ADDRESS_IPv4           "192.168.2.3"
19*8d741a5dSApple OSS Distributions #define TEST_SRC_ADDRESS_IPv6           "fd04:5c6b:8df7:7092:0000:0000:0000:0002"
20*8d741a5dSApple OSS Distributions #define TEST_DST_ADDRESS_IPv6           "fd04:5c6b:8df7:7092:0000:0000:0000:0003"
21*8d741a5dSApple OSS Distributions #define TEST_MIGRATE_SRC_ADDRESS_IPv4   "192.168.2.10"
22*8d741a5dSApple OSS Distributions #define TEST_MIGRATE_DST_ADDRESS_IPv4   "192.168.2.11"
23*8d741a5dSApple OSS Distributions #define TEST_MIGRATE_SRC_ADDRESS_IPv6   "fd04:5c6b:8df7:7092:0000:0000:0002:0000"
24*8d741a5dSApple OSS Distributions #define TEST_MIGRATE_DST_ADDRESS_IPv6   "fd04:5c6b:8df7:7092:0000:0000:0003:0000"
25*8d741a5dSApple OSS Distributions 
26*8d741a5dSApple OSS Distributions typedef enum {
27*8d741a5dSApple OSS Distributions 	TEST_INVALID = 0,
28*8d741a5dSApple OSS Distributions 	TEST_SADB_X_GET_OVERFLOW_60822136 = 1,
29*8d741a5dSApple OSS Distributions 	TEST_SADB_X_SPDENABLE_OVERFLOW_60822924 = 2,
30*8d741a5dSApple OSS Distributions 	TEST_SADB_X_SPDDISABLE_OVERFLOW_60822956 = 3,
31*8d741a5dSApple OSS Distributions 	TEST_SADB_UPDATE_USE_AFTER_FREE_60679513 = 4,
32*8d741a5dSApple OSS Distributions 	TEST_SADB_DUMP_HEAP_OVERFLOW_60768729 = 5,
33*8d741a5dSApple OSS Distributions 	TEST_SADB_POLICY_DUMP_HEAP_OVERFLOW_60769680 = 6,
34*8d741a5dSApple OSS Distributions 	TEST_SADB_GETSASTAT_OOB_READ_60822823 = 7,
35*8d741a5dSApple OSS Distributions 	TEST_SADB_GETSASTAT_OOB_READ_SUCCESS = 8,
36*8d741a5dSApple OSS Distributions 	TEST_SADB_EXT_MIGRATE_ADDRESS_IPv4 = 9,
37*8d741a5dSApple OSS Distributions 	TEST_SADB_EXT_MIGRATE_ADDRESS_IPv6 = 10,
38*8d741a5dSApple OSS Distributions 	TEST_SADB_EXT_MIGRATE_BAD_ADDRESS = 11,
39*8d741a5dSApple OSS Distributions 	TEST_TCP_INPUT_IPSEC_COPY_POLICY = 12,
40*8d741a5dSApple OSS Distributions 	TEST_SADB_X_SPDADD_MEMORY_LEAK_78944570 = 13,
41*8d741a5dSApple OSS Distributions } test_identifier;
42*8d741a5dSApple OSS Distributions 
43*8d741a5dSApple OSS Distributions static test_identifier test_id = TEST_INVALID;
44*8d741a5dSApple OSS Distributions static dispatch_source_t pfkey_source = NULL;
45*8d741a5dSApple OSS Distributions static unsigned long oldmax;
46*8d741a5dSApple OSS Distributions 
47*8d741a5dSApple OSS Distributions static void pfkey_cleanup(void);
48*8d741a5dSApple OSS Distributions 
49*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60822136(uint8_t **mhp, int pfkey_socket);
50*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60822924(uint8_t **mhp, int pfkey_socket);
51*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60822956(uint8_t **mhp, int pfkey_socket);
52*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60679513(uint8_t **mhp, int pfkey_socket);
53*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60768729(uint8_t **mhp, int pfkey_socket);
54*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60769680(uint8_t **mhp, int pfkey_socket);
55*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60822823(uint8_t **mhp, int pfkey_socket);
56*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60822823_1(uint8_t **mhp, int pfkey_socket);
57*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60687183(uint8_t **mhp, int pfkey_socket);
58*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60687183_1(uint8_t **mhp, int pfkey_socket);
59*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_60687183_2(uint8_t **mhp, int pfkey_socket);
60*8d741a5dSApple OSS Distributions static void pfkey_process_message_test_78944570(uint8_t **mhp, int pfkey_socket);
61*8d741a5dSApple OSS Distributions 
62*8d741a5dSApple OSS Distributions static void(*const process_pfkey_message_tests[])(uint8_t * *mhp, int pfkey_socket) =
63*8d741a5dSApple OSS Distributions {
64*8d741a5dSApple OSS Distributions 	NULL,
65*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60822136,    // TEST_SADB_X_GET_OVERFLOW_60822136
66*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60822924,    // TEST_SADB_X_SPDENABLE_OVERFLOW_60822924
67*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60822956,    // TEST_SADB_X_SPDDISABLE_OVERFLOW_60822956
68*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60679513,    // TEST_SADB_UPDATE_USE_AFTER_FREE_60679513
69*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60768729,    // TEST_SADB_DUMP_HEAP_OVERFLOW_60768729
70*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60769680,    // TEST_SADB_POLICY_DUMP_HEAP_OVERFLOW_60769680
71*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60822823,    // TEST_SADB_GETSASTAT_OOB_READ_60822823
72*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60822823_1,  // TEST_SADB_GETSASTAT_OOB_READ_SUCCESS
73*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60687183,    // TEST_SADB_EXT_MIGRATE_ADDRESS_IPv4
74*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60687183_1,  // TEST_SADB_EXT_MIGRATE_ADDRESS_IPv6
75*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_60687183_2,  // TEST_SADB_EXT_MIGRATE_BAD_ADDRESS
76*8d741a5dSApple OSS Distributions 	NULL,                                   // TEST_TCP_INPUT_IPSEC_COPY_POLICY
77*8d741a5dSApple OSS Distributions 	pfkey_process_message_test_78944570,    // TEST_SADB_X_SPDADD_MEMORY_LEAK_78944570
78*8d741a5dSApple OSS Distributions };
79*8d741a5dSApple OSS Distributions 
80*8d741a5dSApple OSS Distributions static void
pfkey_align(struct sadb_msg * msg,uint8_t ** mhp)81*8d741a5dSApple OSS Distributions pfkey_align(struct sadb_msg *msg, uint8_t **mhp)
82*8d741a5dSApple OSS Distributions {
83*8d741a5dSApple OSS Distributions 	struct sadb_ext *ext;
84*8d741a5dSApple OSS Distributions 	int i;
85*8d741a5dSApple OSS Distributions 	uint8_t *p;
86*8d741a5dSApple OSS Distributions 	uint8_t *ep;     /* XXX should be passed from upper layer */
87*8d741a5dSApple OSS Distributions 
88*8d741a5dSApple OSS Distributions 	/* validity check */
89*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_NOTNULL(msg, "pfkey align msg");
90*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_NOTNULL(mhp, "pfkey align mhp");
91*8d741a5dSApple OSS Distributions 
92*8d741a5dSApple OSS Distributions 	/* initialize */
93*8d741a5dSApple OSS Distributions 	for (i = 0; i < SADB_EXT_MAX + 1; i++) {
94*8d741a5dSApple OSS Distributions 		mhp[i] = NULL;
95*8d741a5dSApple OSS Distributions 	}
96*8d741a5dSApple OSS Distributions 
97*8d741a5dSApple OSS Distributions 	mhp[0] = (void *)msg;
98*8d741a5dSApple OSS Distributions 
99*8d741a5dSApple OSS Distributions 	/* initialize */
100*8d741a5dSApple OSS Distributions 	p = (void *) msg;
101*8d741a5dSApple OSS Distributions 	ep = p + PFKEY_UNUNIT64(msg->sadb_msg_len);
102*8d741a5dSApple OSS Distributions 
103*8d741a5dSApple OSS Distributions 	/* skip base header */
104*8d741a5dSApple OSS Distributions 	p += sizeof(struct sadb_msg);
105*8d741a5dSApple OSS Distributions 
106*8d741a5dSApple OSS Distributions 	while (p < ep) {
107*8d741a5dSApple OSS Distributions 		ext = (void *)p;
108*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_GE_PTR((void *)ep, (void *)(p + sizeof(*ext)), "pfkey extension header beyond end of buffer");
109*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_GE_ULONG((unsigned long)PFKEY_EXTLEN(ext), sizeof(*ext), "pfkey extension shorter than extension header");
110*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_GE_PTR((void *)ep, (void *)(p + PFKEY_EXTLEN(ext)), "pfkey extension length beyond end of buffer");
111*8d741a5dSApple OSS Distributions 
112*8d741a5dSApple OSS Distributions 		T_QUIET; T_EXPECT_NULL(mhp[ext->sadb_ext_type], "duplicate extension type %u payload", ext->sadb_ext_type);
113*8d741a5dSApple OSS Distributions 
114*8d741a5dSApple OSS Distributions 		/* set pointer */
115*8d741a5dSApple OSS Distributions 		switch (ext->sadb_ext_type) {
116*8d741a5dSApple OSS Distributions 		case SADB_EXT_SA:
117*8d741a5dSApple OSS Distributions 		case SADB_EXT_LIFETIME_CURRENT:
118*8d741a5dSApple OSS Distributions 		case SADB_EXT_LIFETIME_HARD:
119*8d741a5dSApple OSS Distributions 		case SADB_EXT_LIFETIME_SOFT:
120*8d741a5dSApple OSS Distributions 		case SADB_EXT_ADDRESS_SRC:
121*8d741a5dSApple OSS Distributions 		case SADB_EXT_ADDRESS_DST:
122*8d741a5dSApple OSS Distributions 		case SADB_EXT_ADDRESS_PROXY:
123*8d741a5dSApple OSS Distributions 		case SADB_EXT_KEY_AUTH:
124*8d741a5dSApple OSS Distributions 		/* XXX should to be check weak keys. */
125*8d741a5dSApple OSS Distributions 		case SADB_EXT_KEY_ENCRYPT:
126*8d741a5dSApple OSS Distributions 		/* XXX should to be check weak keys. */
127*8d741a5dSApple OSS Distributions 		case SADB_EXT_IDENTITY_SRC:
128*8d741a5dSApple OSS Distributions 		case SADB_EXT_IDENTITY_DST:
129*8d741a5dSApple OSS Distributions 		case SADB_EXT_SENSITIVITY:
130*8d741a5dSApple OSS Distributions 		case SADB_EXT_PROPOSAL:
131*8d741a5dSApple OSS Distributions 		case SADB_EXT_SUPPORTED_AUTH:
132*8d741a5dSApple OSS Distributions 		case SADB_EXT_SUPPORTED_ENCRYPT:
133*8d741a5dSApple OSS Distributions 		case SADB_EXT_SPIRANGE:
134*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_POLICY:
135*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_SA2:
136*8d741a5dSApple OSS Distributions 		case SADB_EXT_SESSION_ID:
137*8d741a5dSApple OSS Distributions 		case SADB_EXT_SASTAT:
138*8d741a5dSApple OSS Distributions #ifdef SADB_X_EXT_NAT_T_TYPE
139*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_NAT_T_TYPE:
140*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_NAT_T_SPORT:
141*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_NAT_T_DPORT:
142*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_NAT_T_OA:
143*8d741a5dSApple OSS Distributions #endif
144*8d741a5dSApple OSS Distributions #ifdef SADB_X_EXT_TAG
145*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_TAG:
146*8d741a5dSApple OSS Distributions #endif
147*8d741a5dSApple OSS Distributions #ifdef SADB_X_EXT_PACKET
148*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_PACKET:
149*8d741a5dSApple OSS Distributions #endif
150*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_IPSECIF:
151*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_ADDR_RANGE_SRC_START:
152*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_ADDR_RANGE_SRC_END:
153*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_ADDR_RANGE_DST_START:
154*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_ADDR_RANGE_DST_END:
155*8d741a5dSApple OSS Distributions #ifdef SADB_MIGRATE
156*8d741a5dSApple OSS Distributions 		case SADB_EXT_MIGRATE_ADDRESS_SRC:
157*8d741a5dSApple OSS Distributions 		case SADB_EXT_MIGRATE_ADDRESS_DST:
158*8d741a5dSApple OSS Distributions 		case SADB_X_EXT_MIGRATE_IPSECIF:
159*8d741a5dSApple OSS Distributions #endif
160*8d741a5dSApple OSS Distributions 			mhp[ext->sadb_ext_type] = (void *)ext;
161*8d741a5dSApple OSS Distributions 			break;
162*8d741a5dSApple OSS Distributions 		default:
163*8d741a5dSApple OSS Distributions 			T_FAIL("bad extension type %u", ext->sadb_ext_type);
164*8d741a5dSApple OSS Distributions 			T_END;
165*8d741a5dSApple OSS Distributions 		}
166*8d741a5dSApple OSS Distributions 
167*8d741a5dSApple OSS Distributions 		p += PFKEY_EXTLEN(ext);
168*8d741a5dSApple OSS Distributions 	}
169*8d741a5dSApple OSS Distributions 
170*8d741a5dSApple OSS Distributions 	T_QUIET; T_EXPECT_EQ_PTR((void *)ep, (void *)p, "invalid pfkey message length");
171*8d741a5dSApple OSS Distributions 	return;
172*8d741a5dSApple OSS Distributions }
173*8d741a5dSApple OSS Distributions 
174*8d741a5dSApple OSS Distributions 
175*8d741a5dSApple OSS Distributions static void
recv_pfkey_message(int pfkey_socket)176*8d741a5dSApple OSS Distributions recv_pfkey_message(int pfkey_socket)
177*8d741a5dSApple OSS Distributions {
178*8d741a5dSApple OSS Distributions 	uint8_t buffer[8192] __attribute__((aligned(4)));
179*8d741a5dSApple OSS Distributions 	struct iovec iovecs[1] = {
180*8d741a5dSApple OSS Distributions 		{ buffer, sizeof(buffer) },
181*8d741a5dSApple OSS Distributions 	};
182*8d741a5dSApple OSS Distributions 	struct msghdr msg = {
183*8d741a5dSApple OSS Distributions 		NULL,
184*8d741a5dSApple OSS Distributions 		0,
185*8d741a5dSApple OSS Distributions 		iovecs,
186*8d741a5dSApple OSS Distributions 		sizeof(iovecs) / sizeof(iovecs[0]),
187*8d741a5dSApple OSS Distributions 		NULL,
188*8d741a5dSApple OSS Distributions 		0,
189*8d741a5dSApple OSS Distributions 		0,
190*8d741a5dSApple OSS Distributions 	};
191*8d741a5dSApple OSS Distributions 
192*8d741a5dSApple OSS Distributions 	do {
193*8d741a5dSApple OSS Distributions 		ssize_t result = -1;
194*8d741a5dSApple OSS Distributions 		memset(buffer, 0, sizeof(buffer));
195*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_POSIX_SUCCESS(result = recvmsg(pfkey_socket, &msg, 0), NULL);
196*8d741a5dSApple OSS Distributions 
197*8d741a5dSApple OSS Distributions 		if (result > 0) {
198*8d741a5dSApple OSS Distributions 			T_QUIET; T_ASSERT_GE_ULONG((size_t)result, sizeof(struct sadb_msg), "Invalid PFKey message size: %zu", result);
199*8d741a5dSApple OSS Distributions 			struct sadb_msg *hdr = (struct sadb_msg *)buffer;
200*8d741a5dSApple OSS Distributions 			uint8_t *mhp[SADB_EXT_MAX + 1];
201*8d741a5dSApple OSS Distributions 			pfkey_align(hdr, mhp);
202*8d741a5dSApple OSS Distributions 			(*process_pfkey_message_tests[test_id])(mhp, pfkey_socket);
203*8d741a5dSApple OSS Distributions 		} else if (result == 0) {
204*8d741a5dSApple OSS Distributions 			T_LOG("PFKey socket received EOF");
205*8d741a5dSApple OSS Distributions 			break;
206*8d741a5dSApple OSS Distributions 		}
207*8d741a5dSApple OSS Distributions 	} while (1);
208*8d741a5dSApple OSS Distributions }
209*8d741a5dSApple OSS Distributions 
210*8d741a5dSApple OSS Distributions static void
send_pfkey_spd_add_message(int pfkey_socket,uint8_t proto)211*8d741a5dSApple OSS Distributions send_pfkey_spd_add_message(int pfkey_socket, uint8_t proto)
212*8d741a5dSApple OSS Distributions {
213*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
214*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
215*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
216*8d741a5dSApple OSS Distributions 
217*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
218*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
219*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDADD;
220*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
221*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
222*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
223*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
224*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
225*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
226*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
227*8d741a5dSApple OSS Distributions 
228*8d741a5dSApple OSS Distributions 	struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
229*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff;
230*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_proto = proto & 0xff;
231*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
232*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_reserved = 0;
233*8d741a5dSApple OSS Distributions 	tlen += sizeof(*src_address_payload);
234*8d741a5dSApple OSS Distributions 
235*8d741a5dSApple OSS Distributions 	struct sockaddr_in *src = (struct sockaddr_in *)(void *)(payload + tlen);
236*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_SRC_ADDRESS_IPv4, &src->sin_addr), 1, "src address fail");
237*8d741a5dSApple OSS Distributions 	src->sin_family = AF_INET;
238*8d741a5dSApple OSS Distributions 	src->sin_len = sizeof(*src);
239*8d741a5dSApple OSS Distributions 	uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src->sin_len);
240*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
241*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(src->sin_len);
242*8d741a5dSApple OSS Distributions 
243*8d741a5dSApple OSS Distributions 	struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
244*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff;
245*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_proto = proto & 0xff;
246*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
247*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_reserved = 0;
248*8d741a5dSApple OSS Distributions 	tlen += sizeof(*dst_address_payload);
249*8d741a5dSApple OSS Distributions 
250*8d741a5dSApple OSS Distributions 	struct sockaddr_in *dst = (struct sockaddr_in *)(void *)(payload + tlen);
251*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_DST_ADDRESS_IPv4, &dst->sin_addr), 1, "dst address fail");
252*8d741a5dSApple OSS Distributions 	dst->sin_family = AF_INET;
253*8d741a5dSApple OSS Distributions 	dst->sin_len = sizeof(*dst);
254*8d741a5dSApple OSS Distributions 	len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst->sin_len);
255*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
256*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(dst->sin_len);
257*8d741a5dSApple OSS Distributions 
258*8d741a5dSApple OSS Distributions 	struct sadb_lifetime *lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen);
259*8d741a5dSApple OSS Distributions 	lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*lifetime_payload));
260*8d741a5dSApple OSS Distributions 	lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
261*8d741a5dSApple OSS Distributions 	tlen += sizeof(*lifetime_payload);
262*8d741a5dSApple OSS Distributions 
263*8d741a5dSApple OSS Distributions 	struct sadb_x_policy *policy_payload = (struct sadb_x_policy *)(void *)(payload + tlen);
264*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_len = PFKEY_UNIT64(sizeof(*policy_payload));
265*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
266*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_type = IPSEC_POLICY_DISCARD;
267*8d741a5dSApple OSS Distributions 	if (test_id == TEST_SADB_X_SPDADD_MEMORY_LEAK_78944570) {
268*8d741a5dSApple OSS Distributions 		policy_payload->sadb_x_policy_dir = IPSEC_DIR_INVALID;
269*8d741a5dSApple OSS Distributions 	} else {
270*8d741a5dSApple OSS Distributions 		policy_payload->sadb_x_policy_dir = IPSEC_DIR_OUTBOUND;
271*8d741a5dSApple OSS Distributions 	}
272*8d741a5dSApple OSS Distributions 	tlen += sizeof(*policy_payload);
273*8d741a5dSApple OSS Distributions 
274*8d741a5dSApple OSS Distributions 	// Update the total length
275*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
276*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey send spd add");
277*8d741a5dSApple OSS Distributions }
278*8d741a5dSApple OSS Distributions 
279*8d741a5dSApple OSS Distributions static void
send_pfkey_spd_get_message(int pfkey_socket,uint32_t policy_id)280*8d741a5dSApple OSS Distributions send_pfkey_spd_get_message(int pfkey_socket, uint32_t policy_id)
281*8d741a5dSApple OSS Distributions {
282*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES]  __attribute__ ((aligned(32)));
283*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
284*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
285*8d741a5dSApple OSS Distributions 
286*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)(void *)payload;
287*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
288*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDGET;
289*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
290*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
291*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
292*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
293*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
294*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (uint32_t)getpid();
295*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
296*8d741a5dSApple OSS Distributions 
297*8d741a5dSApple OSS Distributions 	struct sadb_x_policy *policy_payload = (struct sadb_x_policy *)(void *)(payload + tlen);
298*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_len = PFKEY_UNIT64(sizeof(*policy_payload));
299*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
300*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_id = policy_id;
301*8d741a5dSApple OSS Distributions 	tlen += sizeof(*policy_payload);
302*8d741a5dSApple OSS Distributions 
303*8d741a5dSApple OSS Distributions 	// Update the total length
304*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
305*8d741a5dSApple OSS Distributions 	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");
306*8d741a5dSApple OSS Distributions }
307*8d741a5dSApple OSS Distributions 
308*8d741a5dSApple OSS Distributions static void
send_pfkey_spd_enable_message(int pfkey_socket,uint32_t policy_id)309*8d741a5dSApple OSS Distributions send_pfkey_spd_enable_message(int pfkey_socket, uint32_t policy_id)
310*8d741a5dSApple OSS Distributions {
311*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES]  __attribute__ ((aligned(32)));
312*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
313*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
314*8d741a5dSApple OSS Distributions 
315*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)(void *)payload;
316*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
317*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDENABLE;
318*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
319*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
320*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
321*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
322*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
323*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (uint32_t)getpid();
324*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
325*8d741a5dSApple OSS Distributions 
326*8d741a5dSApple OSS Distributions 	struct sadb_x_policy *policy_payload = (struct sadb_x_policy *)(void *)(payload + tlen);
327*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_len = PFKEY_UNIT64(sizeof(*policy_payload));
328*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
329*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_id = policy_id;
330*8d741a5dSApple OSS Distributions 	tlen += sizeof(*policy_payload);
331*8d741a5dSApple OSS Distributions 
332*8d741a5dSApple OSS Distributions 	// Update the total length
333*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
334*8d741a5dSApple OSS Distributions 	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");
335*8d741a5dSApple OSS Distributions }
336*8d741a5dSApple OSS Distributions 
337*8d741a5dSApple OSS Distributions static void
send_pfkey_spd_disable_message(int pfkey_socket,uint32_t policy_id)338*8d741a5dSApple OSS Distributions send_pfkey_spd_disable_message(int pfkey_socket, uint32_t policy_id)
339*8d741a5dSApple OSS Distributions {
340*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES]  __attribute__ ((aligned(32)));
341*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
342*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
343*8d741a5dSApple OSS Distributions 
344*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)(void *)payload;
345*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
346*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDDISABLE;
347*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
348*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
349*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
350*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
351*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
352*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (uint32_t)getpid();
353*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
354*8d741a5dSApple OSS Distributions 
355*8d741a5dSApple OSS Distributions 	struct sadb_x_policy *policy_payload = (struct sadb_x_policy *)(void *)(payload + tlen);
356*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_len = PFKEY_UNIT64(sizeof(*policy_payload));
357*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
358*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_id = policy_id;
359*8d741a5dSApple OSS Distributions 	tlen += sizeof(*policy_payload);
360*8d741a5dSApple OSS Distributions 
361*8d741a5dSApple OSS Distributions 	// Update the total length
362*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
363*8d741a5dSApple OSS Distributions 	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");
364*8d741a5dSApple OSS Distributions }
365*8d741a5dSApple OSS Distributions 
366*8d741a5dSApple OSS Distributions static void
send_pfkey_spd_delete_message(int pfkey_socket,uint32_t policy_id)367*8d741a5dSApple OSS Distributions send_pfkey_spd_delete_message(int pfkey_socket, uint32_t policy_id)
368*8d741a5dSApple OSS Distributions {
369*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES]  __attribute__ ((aligned(32)));
370*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
371*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
372*8d741a5dSApple OSS Distributions 
373*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
374*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
375*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDDELETE2;
376*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
377*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
378*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
379*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
380*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
381*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (uint32_t)getpid();
382*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
383*8d741a5dSApple OSS Distributions 
384*8d741a5dSApple OSS Distributions 	struct sadb_x_policy *policy_payload = (struct sadb_x_policy *)(void *)(payload + tlen);
385*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_len = PFKEY_UNIT64(sizeof(*policy_payload));
386*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
387*8d741a5dSApple OSS Distributions 	policy_payload->sadb_x_policy_id = policy_id;
388*8d741a5dSApple OSS Distributions 	tlen += sizeof(*policy_payload);
389*8d741a5dSApple OSS Distributions 
390*8d741a5dSApple OSS Distributions 	// Update the total length
391*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
392*8d741a5dSApple OSS Distributions 	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");
393*8d741a5dSApple OSS Distributions }
394*8d741a5dSApple OSS Distributions 
395*8d741a5dSApple OSS Distributions static void
send_pfkey_spd_dump_message(int pfkey_socket)396*8d741a5dSApple OSS Distributions send_pfkey_spd_dump_message(int pfkey_socket)
397*8d741a5dSApple OSS Distributions {
398*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES]  __attribute__ ((aligned(32)));
399*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
400*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
401*8d741a5dSApple OSS Distributions 
402*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)(void *)payload;
403*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
404*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDDUMP;
405*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
406*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
407*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
408*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
409*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
410*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (uint32_t)getpid();
411*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
412*8d741a5dSApple OSS Distributions 
413*8d741a5dSApple OSS Distributions 	// Update the total length
414*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
415*8d741a5dSApple OSS Distributions 	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");
416*8d741a5dSApple OSS Distributions }
417*8d741a5dSApple OSS Distributions 
418*8d741a5dSApple OSS Distributions static void
send_pfkey_flush_sp(int pfkey_socket)419*8d741a5dSApple OSS Distributions send_pfkey_flush_sp(int pfkey_socket)
420*8d741a5dSApple OSS Distributions {
421*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
422*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
423*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
424*8d741a5dSApple OSS Distributions 
425*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
426*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
427*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_X_SPDFLUSH;
428*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
429*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
430*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
431*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
432*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
433*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
434*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
435*8d741a5dSApple OSS Distributions 
436*8d741a5dSApple OSS Distributions 	// Update the total length
437*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
438*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey flush security policies");
439*8d741a5dSApple OSS Distributions }
440*8d741a5dSApple OSS Distributions 
441*8d741a5dSApple OSS Distributions static void
send_pkey_get_spi(int pfkey_socket)442*8d741a5dSApple OSS Distributions send_pkey_get_spi(int pfkey_socket)
443*8d741a5dSApple OSS Distributions {
444*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
445*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
446*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
447*8d741a5dSApple OSS Distributions 
448*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
449*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
450*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_GETSPI;
451*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
452*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_ESP;
453*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
454*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
455*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
456*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
457*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
458*8d741a5dSApple OSS Distributions 
459*8d741a5dSApple OSS Distributions 	struct sadb_x_sa2 *sa2_payload = (struct sadb_x_sa2 *)(void *)(payload + tlen);
460*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_x_sa2_len = PFKEY_UNIT64(sizeof(*sa2_payload));
461*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
462*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_x_sa2_mode = IPSEC_MODE_TRANSPORT;
463*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_x_sa2_reqid = 0;
464*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_payload);
465*8d741a5dSApple OSS Distributions 
466*8d741a5dSApple OSS Distributions 	struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
467*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff;
468*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
469*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
470*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_reserved = 0;
471*8d741a5dSApple OSS Distributions 	tlen += sizeof(*src_address_payload);
472*8d741a5dSApple OSS Distributions 
473*8d741a5dSApple OSS Distributions 	struct sockaddr_in *src = (struct sockaddr_in *)(void *)(payload + tlen);
474*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_SRC_ADDRESS_IPv4, &src->sin_addr), 1, "src address fail");
475*8d741a5dSApple OSS Distributions 	src->sin_family = AF_INET;
476*8d741a5dSApple OSS Distributions 	src->sin_len = sizeof(*src);
477*8d741a5dSApple OSS Distributions 	uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src->sin_len);
478*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
479*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(src->sin_len);
480*8d741a5dSApple OSS Distributions 
481*8d741a5dSApple OSS Distributions 	struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
482*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff;
483*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
484*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
485*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_reserved = 0;
486*8d741a5dSApple OSS Distributions 	tlen += sizeof(*dst_address_payload);
487*8d741a5dSApple OSS Distributions 
488*8d741a5dSApple OSS Distributions 	struct sockaddr_in *dst = (struct sockaddr_in *)(void *)(payload + tlen);
489*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_DST_ADDRESS_IPv4, &dst->sin_addr), 1, "dst address fail");
490*8d741a5dSApple OSS Distributions 	dst->sin_family = AF_INET;
491*8d741a5dSApple OSS Distributions 	dst->sin_len = sizeof(*dst);
492*8d741a5dSApple OSS Distributions 	len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst->sin_len);
493*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
494*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(dst->sin_len);
495*8d741a5dSApple OSS Distributions 
496*8d741a5dSApple OSS Distributions 	// Update the total length
497*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
498*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey send get spi");
499*8d741a5dSApple OSS Distributions }
500*8d741a5dSApple OSS Distributions 
501*8d741a5dSApple OSS Distributions static void
send_pkey_add_sa(int pfkey_socket,uint32_t spi,const char * src,const char * dst,int family)502*8d741a5dSApple OSS Distributions send_pkey_add_sa(int pfkey_socket, uint32_t spi, const char *src, const char *dst, int family)
503*8d741a5dSApple OSS Distributions {
504*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
505*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
506*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
507*8d741a5dSApple OSS Distributions 
508*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
509*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
510*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_ADD;
511*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
512*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_ESP;
513*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
514*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
515*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
516*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
517*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
518*8d741a5dSApple OSS Distributions 
519*8d741a5dSApple OSS Distributions 	struct sadb_sa_2 *sa2_payload = (struct sadb_sa_2 *)(void *)(payload + tlen);
520*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_len = PFKEY_UNIT64(sizeof(*sa2_payload));
521*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_exttype = SADB_EXT_SA;
522*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_spi = htonl(spi);
523*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_replay = 4;
524*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_state = SADB_SASTATE_LARVAL;
525*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_auth = SADB_X_AALG_SHA2_256;
526*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_encrypt = SADB_X_EALG_AESCBC;
527*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_flags |= (SADB_X_EXT_NATT | SADB_X_EXT_NATT_KEEPALIVE);
528*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_src_port = htons(4500);
529*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_port = 4500;
530*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_interval = 20;
531*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_offload_interval = 0;
532*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_payload);
533*8d741a5dSApple OSS Distributions 
534*8d741a5dSApple OSS Distributions 	struct sadb_x_sa2 *sa2_x_payload = (struct sadb_x_sa2 *)(void *)(payload + tlen);
535*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_len = PFKEY_UNIT64(sizeof(*sa2_x_payload));
536*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
537*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_mode = IPSEC_MODE_TRANSPORT;
538*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_reqid = 0;
539*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_x_payload);
540*8d741a5dSApple OSS Distributions 
541*8d741a5dSApple OSS Distributions 	uint8_t prefixlen = (family == AF_INET) ? (sizeof(struct in_addr) << 3) : (sizeof(struct in6_addr) << 3);
542*8d741a5dSApple OSS Distributions 
543*8d741a5dSApple OSS Distributions 	struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
544*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff;
545*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
546*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_prefixlen = prefixlen;
547*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_reserved = 0;
548*8d741a5dSApple OSS Distributions 	tlen += sizeof(*src_address_payload);
549*8d741a5dSApple OSS Distributions 
550*8d741a5dSApple OSS Distributions 	if (family == AF_INET) {
551*8d741a5dSApple OSS Distributions 		struct sockaddr_in *src4 = (struct sockaddr_in *)(void *)(payload + tlen);
552*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, src, &src4->sin_addr), 1, "src address fail");
553*8d741a5dSApple OSS Distributions 		src4->sin_family = AF_INET;
554*8d741a5dSApple OSS Distributions 		src4->sin_len = sizeof(*src4);
555*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src4->sin_len);
556*8d741a5dSApple OSS Distributions 		src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
557*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(src4->sin_len);
558*8d741a5dSApple OSS Distributions 	} else {
559*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *src6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
560*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, src, &src6->sin6_addr), 1, "src address fail");
561*8d741a5dSApple OSS Distributions 		src6->sin6_family = AF_INET6;
562*8d741a5dSApple OSS Distributions 		src6->sin6_len = sizeof(*src6);
563*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src6->sin6_len);
564*8d741a5dSApple OSS Distributions 		src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
565*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(src6->sin6_len);
566*8d741a5dSApple OSS Distributions 	}
567*8d741a5dSApple OSS Distributions 
568*8d741a5dSApple OSS Distributions 	struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
569*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff;
570*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
571*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_prefixlen = prefixlen;
572*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_reserved = 0;
573*8d741a5dSApple OSS Distributions 	tlen += sizeof(*dst_address_payload);
574*8d741a5dSApple OSS Distributions 
575*8d741a5dSApple OSS Distributions 	if (family == AF_INET) {
576*8d741a5dSApple OSS Distributions 		struct sockaddr_in *dst4 = (struct sockaddr_in *)(void *)(payload + tlen);
577*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, dst, &dst4->sin_addr), 1, "dst address fail");
578*8d741a5dSApple OSS Distributions 		dst4->sin_family = AF_INET;
579*8d741a5dSApple OSS Distributions 		dst4->sin_len = sizeof(*dst4);
580*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst4->sin_len);
581*8d741a5dSApple OSS Distributions 		dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
582*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(dst4->sin_len);
583*8d741a5dSApple OSS Distributions 	} else {
584*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *dst6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
585*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, dst, &dst6->sin6_addr), 1, "dst address fail");
586*8d741a5dSApple OSS Distributions 		dst6->sin6_family = AF_INET6;
587*8d741a5dSApple OSS Distributions 		dst6->sin6_len = sizeof(*dst6);
588*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst6->sin6_len);
589*8d741a5dSApple OSS Distributions 		dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
590*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(dst6->sin6_len);
591*8d741a5dSApple OSS Distributions 	}
592*8d741a5dSApple OSS Distributions 
593*8d741a5dSApple OSS Distributions 	struct sadb_key *encrypt_key_payload = (struct sadb_key *)(void *)(payload + tlen);
594*8d741a5dSApple OSS Distributions 	uint16_t len = sizeof(*encrypt_key_payload) + PFKEY_ALIGN8(32);
595*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_len = PFKEY_UNIT64(len);
596*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
597*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_bits = (uint16_t)(32 << 3);
598*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_reserved = 0;
599*8d741a5dSApple OSS Distributions 	tlen += sizeof(*encrypt_key_payload);
600*8d741a5dSApple OSS Distributions 	arc4random_buf(payload + tlen, 32);
601*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(32);
602*8d741a5dSApple OSS Distributions 
603*8d741a5dSApple OSS Distributions 	struct sadb_key *auth_key_payload = (struct sadb_key *)(void *)(payload + tlen);
604*8d741a5dSApple OSS Distributions 	len = sizeof(*auth_key_payload) + PFKEY_ALIGN8(32);
605*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_len = PFKEY_UNIT64(len);
606*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_exttype = SADB_EXT_KEY_AUTH;
607*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_bits = (uint16_t)(32 << 3);
608*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_reserved = 0;
609*8d741a5dSApple OSS Distributions 	tlen += sizeof(*auth_key_payload);
610*8d741a5dSApple OSS Distributions 	arc4random_buf(payload + tlen, 32);
611*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(32);
612*8d741a5dSApple OSS Distributions 
613*8d741a5dSApple OSS Distributions 	struct sadb_lifetime *hard_lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen);
614*8d741a5dSApple OSS Distributions 	hard_lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*hard_lifetime_payload));
615*8d741a5dSApple OSS Distributions 	hard_lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
616*8d741a5dSApple OSS Distributions 	tlen += sizeof(*hard_lifetime_payload);
617*8d741a5dSApple OSS Distributions 
618*8d741a5dSApple OSS Distributions 	struct sadb_lifetime *soft_lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen);
619*8d741a5dSApple OSS Distributions 	soft_lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*soft_lifetime_payload));
620*8d741a5dSApple OSS Distributions 	soft_lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
621*8d741a5dSApple OSS Distributions 	tlen += sizeof(*soft_lifetime_payload);
622*8d741a5dSApple OSS Distributions 
623*8d741a5dSApple OSS Distributions 	// Update the total length
624*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
625*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey send update sa");
626*8d741a5dSApple OSS Distributions }
627*8d741a5dSApple OSS Distributions 
628*8d741a5dSApple OSS Distributions static void
send_pkey_update_sa(int pfkey_socket,uint32_t spi)629*8d741a5dSApple OSS Distributions send_pkey_update_sa(int pfkey_socket, uint32_t spi)
630*8d741a5dSApple OSS Distributions {
631*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
632*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
633*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
634*8d741a5dSApple OSS Distributions 
635*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
636*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
637*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_UPDATE;
638*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
639*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_ESP;
640*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
641*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
642*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
643*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
644*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
645*8d741a5dSApple OSS Distributions 
646*8d741a5dSApple OSS Distributions 	struct sadb_sa_2 *sa2_payload = (struct sadb_sa_2 *)(void *)(payload + tlen);
647*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_len = PFKEY_UNIT64(sizeof(*sa2_payload));
648*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_exttype = SADB_EXT_SA;
649*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_spi = htonl(spi);
650*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_replay = 4;
651*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_state = SADB_SASTATE_LARVAL;
652*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_auth = SADB_X_AALG_SHA2_256;
653*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_encrypt = SADB_X_EALG_AESCBC;
654*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_flags |= (SADB_X_EXT_NATT | SADB_X_EXT_NATT_KEEPALIVE);
655*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_src_port = htons(4500);
656*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_port = 0;     // Bad value to trigger failure
657*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_interval = 20;
658*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_offload_interval = 0;
659*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_payload);
660*8d741a5dSApple OSS Distributions 
661*8d741a5dSApple OSS Distributions 	struct sadb_x_sa2 *sa2_x_payload = (struct sadb_x_sa2 *)(void *)(payload + tlen);
662*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_len = PFKEY_UNIT64(sizeof(*sa2_x_payload));
663*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
664*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_mode = IPSEC_MODE_TRANSPORT;
665*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_reqid = 0;
666*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_x_payload);
667*8d741a5dSApple OSS Distributions 
668*8d741a5dSApple OSS Distributions 	struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
669*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff;
670*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
671*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
672*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_reserved = 0;
673*8d741a5dSApple OSS Distributions 	tlen += sizeof(*src_address_payload);
674*8d741a5dSApple OSS Distributions 
675*8d741a5dSApple OSS Distributions 	struct sockaddr_in *src = (struct sockaddr_in *)(void *)(payload + tlen);
676*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_SRC_ADDRESS_IPv4, &src->sin_addr), 1, "src address fail");
677*8d741a5dSApple OSS Distributions 	src->sin_family = AF_INET;
678*8d741a5dSApple OSS Distributions 	src->sin_len = sizeof(*src);
679*8d741a5dSApple OSS Distributions 	uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src->sin_len);
680*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
681*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(src->sin_len);
682*8d741a5dSApple OSS Distributions 
683*8d741a5dSApple OSS Distributions 	struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
684*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff;
685*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
686*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
687*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_reserved = 0;
688*8d741a5dSApple OSS Distributions 	tlen += sizeof(*dst_address_payload);
689*8d741a5dSApple OSS Distributions 
690*8d741a5dSApple OSS Distributions 	struct sockaddr_in *dst = (struct sockaddr_in *)(void *)(payload + tlen);
691*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_DST_ADDRESS_IPv4, &dst->sin_addr), 1, "dst address fail");
692*8d741a5dSApple OSS Distributions 	dst->sin_family = AF_INET;
693*8d741a5dSApple OSS Distributions 	dst->sin_len = sizeof(*dst);
694*8d741a5dSApple OSS Distributions 	len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst->sin_len);
695*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
696*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(dst->sin_len);
697*8d741a5dSApple OSS Distributions 
698*8d741a5dSApple OSS Distributions 	struct sadb_key *encrypt_key_payload = (struct sadb_key *)(void *)(payload + tlen);
699*8d741a5dSApple OSS Distributions 	len = sizeof(*encrypt_key_payload) + PFKEY_ALIGN8(32);
700*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_len = PFKEY_UNIT64(len);
701*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
702*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_bits = (uint16_t)(32 << 3);
703*8d741a5dSApple OSS Distributions 	encrypt_key_payload->sadb_key_reserved = 0;
704*8d741a5dSApple OSS Distributions 	tlen += sizeof(*encrypt_key_payload);
705*8d741a5dSApple OSS Distributions 	arc4random_buf(payload + tlen, 32);
706*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(32);
707*8d741a5dSApple OSS Distributions 
708*8d741a5dSApple OSS Distributions 	struct sadb_key *auth_key_payload = (struct sadb_key *)(void *)(payload + tlen);
709*8d741a5dSApple OSS Distributions 	len = sizeof(*auth_key_payload) + PFKEY_ALIGN8(32);
710*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_len = PFKEY_UNIT64(len);
711*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_exttype = SADB_EXT_KEY_AUTH;
712*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_bits = (uint16_t)(32 << 3);
713*8d741a5dSApple OSS Distributions 	auth_key_payload->sadb_key_reserved = 0;
714*8d741a5dSApple OSS Distributions 	tlen += sizeof(*auth_key_payload);
715*8d741a5dSApple OSS Distributions 	arc4random_buf(payload + tlen, 32);
716*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(32);
717*8d741a5dSApple OSS Distributions 
718*8d741a5dSApple OSS Distributions 	struct sadb_lifetime *hard_lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen);
719*8d741a5dSApple OSS Distributions 	hard_lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*hard_lifetime_payload));
720*8d741a5dSApple OSS Distributions 	hard_lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
721*8d741a5dSApple OSS Distributions 	tlen += sizeof(*hard_lifetime_payload);
722*8d741a5dSApple OSS Distributions 
723*8d741a5dSApple OSS Distributions 	struct sadb_lifetime *soft_lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen);
724*8d741a5dSApple OSS Distributions 	soft_lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*soft_lifetime_payload));
725*8d741a5dSApple OSS Distributions 	soft_lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
726*8d741a5dSApple OSS Distributions 	tlen += sizeof(*soft_lifetime_payload);
727*8d741a5dSApple OSS Distributions 
728*8d741a5dSApple OSS Distributions 	// Update the total length
729*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
730*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey send update sa");
731*8d741a5dSApple OSS Distributions }
732*8d741a5dSApple OSS Distributions 
733*8d741a5dSApple OSS Distributions static void
send_pkey_migrate_sa(int pfkey_socket,uint32_t spi,const char * src,const char * dst,int family,const char * migrate_src,const char * migrate_dst,int migrate_family)734*8d741a5dSApple OSS Distributions send_pkey_migrate_sa(int pfkey_socket, uint32_t spi, const char *src, const char *dst, int family,
735*8d741a5dSApple OSS Distributions     const char *migrate_src, const char *migrate_dst, int migrate_family)
736*8d741a5dSApple OSS Distributions {
737*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
738*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
739*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
740*8d741a5dSApple OSS Distributions 
741*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
742*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
743*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_MIGRATE;
744*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
745*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_ESP;
746*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
747*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
748*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
749*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
750*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
751*8d741a5dSApple OSS Distributions 
752*8d741a5dSApple OSS Distributions 	struct sadb_sa_2 *sa2_payload = (struct sadb_sa_2 *)(void *)(payload + tlen);
753*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_len = PFKEY_UNIT64(sizeof(*sa2_payload));
754*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_exttype = SADB_EXT_SA;
755*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_spi = htonl(spi);
756*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_replay = 4;
757*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_state = SADB_SASTATE_LARVAL;
758*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_auth = SADB_X_AALG_SHA2_256;
759*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_encrypt = SADB_X_EALG_AESCBC;
760*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_flags |= (SADB_X_EXT_NATT | SADB_X_EXT_NATT_KEEPALIVE);
761*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_src_port = htons(4500);
762*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_port = 0;     // Bad value to trigger failure
763*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_interval = 20;
764*8d741a5dSApple OSS Distributions 	sa2_payload->sadb_sa_natt_offload_interval = 0;
765*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_payload);
766*8d741a5dSApple OSS Distributions 
767*8d741a5dSApple OSS Distributions 	struct sadb_x_sa2 *sa2_x_payload = (struct sadb_x_sa2 *)(void *)(payload + tlen);
768*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_len = PFKEY_UNIT64(sizeof(*sa2_x_payload));
769*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
770*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_mode = IPSEC_MODE_TRANSPORT;
771*8d741a5dSApple OSS Distributions 	sa2_x_payload->sadb_x_sa2_reqid = 0;
772*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_x_payload);
773*8d741a5dSApple OSS Distributions 
774*8d741a5dSApple OSS Distributions 	uint8_t prefixlen = (family == AF_INET) ? (sizeof(struct in_addr) << 3) : (sizeof(struct in6_addr) << 3);
775*8d741a5dSApple OSS Distributions 
776*8d741a5dSApple OSS Distributions 	struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
777*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff;
778*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
779*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_prefixlen = prefixlen;
780*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_reserved = 0;
781*8d741a5dSApple OSS Distributions 	tlen += sizeof(*src_address_payload);
782*8d741a5dSApple OSS Distributions 
783*8d741a5dSApple OSS Distributions 	if (family == AF_INET) {
784*8d741a5dSApple OSS Distributions 		struct sockaddr_in *src4 = (struct sockaddr_in *)(void *)(payload + tlen);
785*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, src, &src4->sin_addr), 1, "src address fail");
786*8d741a5dSApple OSS Distributions 		src4->sin_family = AF_INET;
787*8d741a5dSApple OSS Distributions 		src4->sin_len = sizeof(*src4);
788*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src4->sin_len);
789*8d741a5dSApple OSS Distributions 		src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
790*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(src4->sin_len);
791*8d741a5dSApple OSS Distributions 	} else {
792*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *src6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
793*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, src, &src6->sin6_addr), 1, "src address fail");
794*8d741a5dSApple OSS Distributions 		src6->sin6_family = AF_INET6;
795*8d741a5dSApple OSS Distributions 		src6->sin6_len = sizeof(*src6);
796*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src6->sin6_len);
797*8d741a5dSApple OSS Distributions 		src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
798*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(src6->sin6_len);
799*8d741a5dSApple OSS Distributions 	}
800*8d741a5dSApple OSS Distributions 
801*8d741a5dSApple OSS Distributions 	struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
802*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff;
803*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
804*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_prefixlen = prefixlen;
805*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_reserved = 0;
806*8d741a5dSApple OSS Distributions 	tlen += sizeof(*dst_address_payload);
807*8d741a5dSApple OSS Distributions 
808*8d741a5dSApple OSS Distributions 	if (family == AF_INET) {
809*8d741a5dSApple OSS Distributions 		struct sockaddr_in *dst4 = (struct sockaddr_in *)(void *)(payload + tlen);
810*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, dst, &dst4->sin_addr), 1, "dst address fail");
811*8d741a5dSApple OSS Distributions 		dst4->sin_family = AF_INET;
812*8d741a5dSApple OSS Distributions 		dst4->sin_len = sizeof(*dst4);
813*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst4->sin_len);
814*8d741a5dSApple OSS Distributions 		dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
815*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(dst4->sin_len);
816*8d741a5dSApple OSS Distributions 	} else {
817*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *dst6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
818*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, dst, &dst6->sin6_addr), 1, "dst address fail");
819*8d741a5dSApple OSS Distributions 		dst6->sin6_family = AF_INET6;
820*8d741a5dSApple OSS Distributions 		dst6->sin6_len = sizeof(*dst6);
821*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst6->sin6_len);
822*8d741a5dSApple OSS Distributions 		dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
823*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(dst6->sin6_len);
824*8d741a5dSApple OSS Distributions 	}
825*8d741a5dSApple OSS Distributions 
826*8d741a5dSApple OSS Distributions 	prefixlen = (migrate_family == AF_INET) ? (sizeof(struct in_addr) << 3) : (sizeof(struct in6_addr) << 3);
827*8d741a5dSApple OSS Distributions 
828*8d741a5dSApple OSS Distributions 	struct sadb_address *migrate_src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
829*8d741a5dSApple OSS Distributions 	migrate_src_address_payload->sadb_address_exttype = SADB_EXT_MIGRATE_ADDRESS_SRC & 0xffff;
830*8d741a5dSApple OSS Distributions 	migrate_src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
831*8d741a5dSApple OSS Distributions 	migrate_src_address_payload->sadb_address_prefixlen = prefixlen;
832*8d741a5dSApple OSS Distributions 	migrate_src_address_payload->sadb_address_reserved = 0;
833*8d741a5dSApple OSS Distributions 	tlen += sizeof(*migrate_src_address_payload);
834*8d741a5dSApple OSS Distributions 
835*8d741a5dSApple OSS Distributions 	if (migrate_family == AF_INET) {
836*8d741a5dSApple OSS Distributions 		struct sockaddr_in *migrate_src4 = (struct sockaddr_in *)(void *)(payload + tlen);
837*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, migrate_src, &migrate_src4->sin_addr), 1, "migrate src fail");
838*8d741a5dSApple OSS Distributions 		migrate_src4->sin_family = AF_INET;
839*8d741a5dSApple OSS Distributions 		migrate_src4->sin_len = sizeof(*migrate_src4);
840*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*migrate_src_address_payload) + PFKEY_ALIGN8(migrate_src4->sin_len);
841*8d741a5dSApple OSS Distributions 		migrate_src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
842*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(migrate_src4->sin_len);
843*8d741a5dSApple OSS Distributions 	} else if (migrate_family == AF_INET6) {
844*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *migrate_src6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
845*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, migrate_src, &migrate_src6->sin6_addr), 1, "migrate src fail");
846*8d741a5dSApple OSS Distributions 		migrate_src6->sin6_family = AF_INET6;
847*8d741a5dSApple OSS Distributions 		migrate_src6->sin6_len = sizeof(*migrate_src6);
848*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*migrate_src_address_payload) + PFKEY_ALIGN8(migrate_src6->sin6_len);
849*8d741a5dSApple OSS Distributions 		migrate_src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
850*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(migrate_src6->sin6_len);
851*8d741a5dSApple OSS Distributions 	} else if (migrate_family == AF_CHAOS) {
852*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *migrate_src6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
853*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, migrate_src, &migrate_src6->sin6_addr), 1, "migrate src fail");
854*8d741a5dSApple OSS Distributions 		migrate_src6->sin6_family = AF_INET6;
855*8d741a5dSApple OSS Distributions 		migrate_src6->sin6_len = sizeof(*migrate_src6) + 100; // Bad value to trigger exploit
856*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*migrate_src_address_payload) + PFKEY_ALIGN8(migrate_src6->sin6_len);
857*8d741a5dSApple OSS Distributions 		migrate_src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
858*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(migrate_src6->sin6_len);
859*8d741a5dSApple OSS Distributions 	}
860*8d741a5dSApple OSS Distributions 
861*8d741a5dSApple OSS Distributions 	struct sadb_address *migrate_dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
862*8d741a5dSApple OSS Distributions 	migrate_dst_address_payload->sadb_address_exttype = SADB_EXT_MIGRATE_ADDRESS_DST & 0xffff;
863*8d741a5dSApple OSS Distributions 	migrate_dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
864*8d741a5dSApple OSS Distributions 	migrate_dst_address_payload->sadb_address_prefixlen = prefixlen;
865*8d741a5dSApple OSS Distributions 	migrate_dst_address_payload->sadb_address_reserved = 0;
866*8d741a5dSApple OSS Distributions 
867*8d741a5dSApple OSS Distributions 	tlen += sizeof(*migrate_dst_address_payload);
868*8d741a5dSApple OSS Distributions 
869*8d741a5dSApple OSS Distributions 	if (migrate_family == AF_INET) {
870*8d741a5dSApple OSS Distributions 		struct sockaddr_in *migrate_dst4 = (struct sockaddr_in *)(void *)(payload + tlen);
871*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, migrate_dst, &migrate_dst4->sin_addr), 1, "migrate dst fail");
872*8d741a5dSApple OSS Distributions 		migrate_dst4->sin_family = AF_INET;
873*8d741a5dSApple OSS Distributions 		migrate_dst4->sin_len = sizeof(*migrate_dst4);
874*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*migrate_dst_address_payload) + PFKEY_ALIGN8(migrate_dst4->sin_len);
875*8d741a5dSApple OSS Distributions 		migrate_dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
876*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(migrate_dst4->sin_len);
877*8d741a5dSApple OSS Distributions 	} else if (migrate_family == AF_INET6) {
878*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *migrate_dst6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
879*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, migrate_dst, &migrate_dst6->sin6_addr), 1, "migrate dst fail");
880*8d741a5dSApple OSS Distributions 		migrate_dst6->sin6_family = AF_INET6;
881*8d741a5dSApple OSS Distributions 		migrate_dst6->sin6_len = sizeof(*migrate_dst6);
882*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*migrate_dst_address_payload) + PFKEY_ALIGN8(migrate_dst6->sin6_len);
883*8d741a5dSApple OSS Distributions 		migrate_dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
884*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(migrate_dst6->sin6_len);
885*8d741a5dSApple OSS Distributions 	} else if (migrate_family == AF_CHAOS) {
886*8d741a5dSApple OSS Distributions 		struct sockaddr_in6 *migrate_dst6 = (struct sockaddr_in6 *)(void *)(payload + tlen);
887*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, migrate_dst, &migrate_dst6->sin6_addr), 1, "migrate dst fail");
888*8d741a5dSApple OSS Distributions 		migrate_dst6->sin6_family = AF_INET6;
889*8d741a5dSApple OSS Distributions 		migrate_dst6->sin6_len = sizeof(*migrate_dst6) + 100; // Bad value to trigger exploit
890*8d741a5dSApple OSS Distributions 		uint16_t len = sizeof(*migrate_dst_address_payload) + PFKEY_ALIGN8(migrate_dst6->sin6_len);
891*8d741a5dSApple OSS Distributions 		migrate_dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
892*8d741a5dSApple OSS Distributions 		tlen += PFKEY_ALIGN8(migrate_dst6->sin6_len);
893*8d741a5dSApple OSS Distributions 	}
894*8d741a5dSApple OSS Distributions 
895*8d741a5dSApple OSS Distributions 	// Update the total length
896*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
897*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey send migrate sa");
898*8d741a5dSApple OSS Distributions }
899*8d741a5dSApple OSS Distributions 
900*8d741a5dSApple OSS Distributions static void
send_pfkey_get_sa_stat(int pfkey_socket,uint32_t spi,uint32_t stat_length)901*8d741a5dSApple OSS Distributions send_pfkey_get_sa_stat(int pfkey_socket, uint32_t spi, uint32_t stat_length)
902*8d741a5dSApple OSS Distributions {
903*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
904*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
905*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
906*8d741a5dSApple OSS Distributions 
907*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
908*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
909*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_GETSASTAT;
910*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
911*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
912*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
913*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
914*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
915*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
916*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
917*8d741a5dSApple OSS Distributions 
918*8d741a5dSApple OSS Distributions 	struct sadb_session_id *session_id_payload = (struct sadb_session_id *)(void *)(payload + tlen);
919*8d741a5dSApple OSS Distributions 	session_id_payload->sadb_session_id_len = PFKEY_UNIT64(sizeof(*session_id_payload));
920*8d741a5dSApple OSS Distributions 	session_id_payload->sadb_session_id_exttype = SADB_EXT_SESSION_ID;
921*8d741a5dSApple OSS Distributions 	session_id_payload->sadb_session_id_v[0] = 1;
922*8d741a5dSApple OSS Distributions 	tlen += sizeof(*session_id_payload);
923*8d741a5dSApple OSS Distributions 
924*8d741a5dSApple OSS Distributions 	struct sadb_sastat *sadb_stat_payload = (struct sadb_sastat *)(void *)(payload + tlen);
925*8d741a5dSApple OSS Distributions 	uint16_t length = sizeof(*sadb_stat_payload) + PFKEY_ALIGN8(sizeof(struct sastat));
926*8d741a5dSApple OSS Distributions 	sadb_stat_payload->sadb_sastat_len = PFKEY_UNIT64(length);
927*8d741a5dSApple OSS Distributions 	sadb_stat_payload->sadb_sastat_exttype = SADB_EXT_SASTAT;
928*8d741a5dSApple OSS Distributions 	sadb_stat_payload->sadb_sastat_dir = IPSEC_DIR_OUTBOUND;
929*8d741a5dSApple OSS Distributions 	sadb_stat_payload->sadb_sastat_list_len = stat_length;
930*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sadb_stat_payload);
931*8d741a5dSApple OSS Distributions 
932*8d741a5dSApple OSS Distributions 	struct sastat *sastat_payload =  (struct sastat *)(void *)(payload + tlen);
933*8d741a5dSApple OSS Distributions 	sastat_payload->spi = htonl(spi);
934*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(sizeof(*sastat_payload));
935*8d741a5dSApple OSS Distributions 
936*8d741a5dSApple OSS Distributions 	// Update the total length
937*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
938*8d741a5dSApple OSS Distributions 	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");
939*8d741a5dSApple OSS Distributions }
940*8d741a5dSApple OSS Distributions 
941*8d741a5dSApple OSS Distributions static void
send_pkey_delete_sa(int pfkey_socket,uint32_t spi)942*8d741a5dSApple OSS Distributions send_pkey_delete_sa(int pfkey_socket, uint32_t spi)
943*8d741a5dSApple OSS Distributions {
944*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
945*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
946*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
947*8d741a5dSApple OSS Distributions 
948*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
949*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
950*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_DELETE;
951*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
952*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_ESP;
953*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
954*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
955*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
956*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
957*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
958*8d741a5dSApple OSS Distributions 
959*8d741a5dSApple OSS Distributions 	struct sadb_sa_2 *sa2_payload = (struct sadb_sa_2 *)(void *)(payload + tlen);
960*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_len = PFKEY_UNIT64(sizeof(*sa2_payload));
961*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_exttype = SADB_EXT_SA;
962*8d741a5dSApple OSS Distributions 	sa2_payload->sa.sadb_sa_spi = htonl(spi);
963*8d741a5dSApple OSS Distributions 	tlen += sizeof(*sa2_payload);
964*8d741a5dSApple OSS Distributions 
965*8d741a5dSApple OSS Distributions 	struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen);
966*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff;
967*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
968*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
969*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_reserved = 0;
970*8d741a5dSApple OSS Distributions 	tlen += sizeof(*src_address_payload);
971*8d741a5dSApple OSS Distributions 
972*8d741a5dSApple OSS Distributions 	struct sockaddr_in *src = (struct sockaddr_in *)(void *)(payload + tlen);
973*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_SRC_ADDRESS_IPv4, &src->sin_addr), 1, "migrate src fail");
974*8d741a5dSApple OSS Distributions 	src->sin_family = AF_INET;
975*8d741a5dSApple OSS Distributions 	src->sin_len = sizeof(*src);
976*8d741a5dSApple OSS Distributions 	uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src->sin_len);
977*8d741a5dSApple OSS Distributions 	src_address_payload->sadb_address_len = PFKEY_UNIT64(len);
978*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(src->sin_len);
979*8d741a5dSApple OSS Distributions 
980*8d741a5dSApple OSS Distributions 	struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen);
981*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff;
982*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff;
983*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_prefixlen = (sizeof(struct in_addr) << 3);
984*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_reserved = 0;
985*8d741a5dSApple OSS Distributions 	tlen += sizeof(*dst_address_payload);
986*8d741a5dSApple OSS Distributions 
987*8d741a5dSApple OSS Distributions 	struct sockaddr_in *dst = (struct sockaddr_in *)(void *)(payload + tlen);
988*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, TEST_DST_ADDRESS_IPv4, &dst->sin_addr), 1, "migrate dst fail");
989*8d741a5dSApple OSS Distributions 	dst->sin_family = AF_INET;
990*8d741a5dSApple OSS Distributions 	dst->sin_len = sizeof(*dst);
991*8d741a5dSApple OSS Distributions 	len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst->sin_len);
992*8d741a5dSApple OSS Distributions 	dst_address_payload->sadb_address_len = PFKEY_UNIT64(len);
993*8d741a5dSApple OSS Distributions 	tlen += PFKEY_ALIGN8(dst->sin_len);
994*8d741a5dSApple OSS Distributions 
995*8d741a5dSApple OSS Distributions 	// Update the total length
996*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
997*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey send delete sa");
998*8d741a5dSApple OSS Distributions }
999*8d741a5dSApple OSS Distributions 
1000*8d741a5dSApple OSS Distributions static void
send_pfkey_sa_dump_message(int pfkey_socket)1001*8d741a5dSApple OSS Distributions send_pfkey_sa_dump_message(int pfkey_socket)
1002*8d741a5dSApple OSS Distributions {
1003*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES]  __attribute__ ((aligned(32)));
1004*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
1005*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
1006*8d741a5dSApple OSS Distributions 
1007*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)(void *)payload;
1008*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
1009*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_DUMP;
1010*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
1011*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
1012*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
1013*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
1014*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
1015*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (uint32_t)getpid();
1016*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
1017*8d741a5dSApple OSS Distributions 
1018*8d741a5dSApple OSS Distributions 	// Update the total length
1019*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
1020*8d741a5dSApple OSS Distributions 	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");
1021*8d741a5dSApple OSS Distributions }
1022*8d741a5dSApple OSS Distributions 
1023*8d741a5dSApple OSS Distributions static void
send_pfkey_flush_sa(int pfkey_socket)1024*8d741a5dSApple OSS Distributions send_pfkey_flush_sa(int pfkey_socket)
1025*8d741a5dSApple OSS Distributions {
1026*8d741a5dSApple OSS Distributions 	uint8_t payload[MCLBYTES] __attribute__ ((aligned(32)));
1027*8d741a5dSApple OSS Distributions 	bzero(payload, sizeof(payload));
1028*8d741a5dSApple OSS Distributions 	uint16_t tlen = 0;
1029*8d741a5dSApple OSS Distributions 
1030*8d741a5dSApple OSS Distributions 	struct sadb_msg *msg_payload = (struct sadb_msg *)payload;
1031*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_version = PF_KEY_V2;
1032*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_type = SADB_FLUSH;
1033*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_errno = 0;
1034*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC;
1035*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
1036*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_reserved = 0;
1037*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_seq = 0;
1038*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_pid = (u_int32_t)getpid();
1039*8d741a5dSApple OSS Distributions 	tlen += sizeof(*msg_payload);
1040*8d741a5dSApple OSS Distributions 
1041*8d741a5dSApple OSS Distributions 	// Update the total length
1042*8d741a5dSApple OSS Distributions 	msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen);
1043*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(send(pfkey_socket, payload, (size_t)PFKEY_UNUNIT64(msg_payload->sadb_msg_len), 0), "pfkey flush sa");
1044*8d741a5dSApple OSS Distributions }
1045*8d741a5dSApple OSS Distributions 
1046*8d741a5dSApple OSS Distributions static void
pfkey_cleanup(void)1047*8d741a5dSApple OSS Distributions pfkey_cleanup(void)
1048*8d741a5dSApple OSS Distributions {
1049*8d741a5dSApple OSS Distributions 	if (pfkey_source != NULL) {
1050*8d741a5dSApple OSS Distributions 		int pfkey_socket = (int)dispatch_source_get_handle(pfkey_source);
1051*8d741a5dSApple OSS Distributions 		if (pfkey_socket > 0) {
1052*8d741a5dSApple OSS Distributions 			send_pfkey_flush_sa(pfkey_socket);
1053*8d741a5dSApple OSS Distributions 			send_pfkey_flush_sp(pfkey_socket);
1054*8d741a5dSApple OSS Distributions 		}
1055*8d741a5dSApple OSS Distributions 		dispatch_source_cancel(pfkey_source);
1056*8d741a5dSApple OSS Distributions 		pfkey_source = NULL;
1057*8d741a5dSApple OSS Distributions 	}
1058*8d741a5dSApple OSS Distributions 
1059*8d741a5dSApple OSS Distributions 	if (oldmax != 0) {
1060*8d741a5dSApple OSS Distributions 		(void)sysctlbyname("kern.ipc.maxsockbuf", NULL, NULL, &oldmax, sizeof(oldmax));
1061*8d741a5dSApple OSS Distributions 	}
1062*8d741a5dSApple OSS Distributions }
1063*8d741a5dSApple OSS Distributions 
1064*8d741a5dSApple OSS Distributions static int
pfkey_setup_socket(void)1065*8d741a5dSApple OSS Distributions pfkey_setup_socket(void)
1066*8d741a5dSApple OSS Distributions {
1067*8d741a5dSApple OSS Distributions 	int pfkey_socket = -1;
1068*8d741a5dSApple OSS Distributions 	int bufsiz = 0;
1069*8d741a5dSApple OSS Distributions 	const unsigned long newbufk = 1536;
1070*8d741a5dSApple OSS Distributions 	size_t  oldmaxsize = sizeof(oldmax);
1071*8d741a5dSApple OSS Distributions 	unsigned long newmax = newbufk * (1024 + 128);
1072*8d741a5dSApple OSS Distributions 
1073*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(pfkey_socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2), NULL);
1074*8d741a5dSApple OSS Distributions 
1075*8d741a5dSApple OSS Distributions 	if (sysctlbyname("kern.ipc.maxsockbuf", &oldmax, &oldmaxsize, &newmax, sizeof(newmax)) != 0) {
1076*8d741a5dSApple OSS Distributions 		bufsiz = 233016;        /* Max allowed by default */
1077*8d741a5dSApple OSS Distributions 	} else {
1078*8d741a5dSApple OSS Distributions 		bufsiz = newbufk * 800;
1079*8d741a5dSApple OSS Distributions 	}
1080*8d741a5dSApple OSS Distributions 
1081*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(setsockopt(pfkey_socket, SOL_SOCKET, SO_SNDBUF, &bufsiz, sizeof(bufsiz)), "pfkey set snd socket buf failed %d", bufsiz);
1082*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(setsockopt(pfkey_socket, SOL_SOCKET, SO_RCVBUF, &bufsiz, sizeof(bufsiz)), "pfkey set recv socket buf failed %d", bufsiz);
1083*8d741a5dSApple OSS Distributions 
1084*8d741a5dSApple OSS Distributions 	pfkey_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, (uintptr_t)pfkey_socket, 0, dispatch_get_main_queue());
1085*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_NOTNULL(pfkey_source, "dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, ...)");
1086*8d741a5dSApple OSS Distributions 	dispatch_source_set_event_handler(pfkey_source, ^{
1087*8d741a5dSApple OSS Distributions 		recv_pfkey_message(pfkey_socket);
1088*8d741a5dSApple OSS Distributions 	});
1089*8d741a5dSApple OSS Distributions 	dispatch_source_set_cancel_handler(pfkey_source, ^{
1090*8d741a5dSApple OSS Distributions 		close(pfkey_socket);
1091*8d741a5dSApple OSS Distributions 	});
1092*8d741a5dSApple OSS Distributions 	dispatch_resume(pfkey_source);
1093*8d741a5dSApple OSS Distributions 	return pfkey_socket;
1094*8d741a5dSApple OSS Distributions }
1095*8d741a5dSApple OSS Distributions 
1096*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60822136(uint8_t ** mhp,int pfkey_socket)1097*8d741a5dSApple OSS Distributions pfkey_process_message_test_60822136(uint8_t **mhp, int pfkey_socket)
1098*8d741a5dSApple OSS Distributions {
1099*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1100*8d741a5dSApple OSS Distributions 	static int counter = 0;
1101*8d741a5dSApple OSS Distributions 	static uint32_t policy_id = 0;
1102*8d741a5dSApple OSS Distributions 
1103*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1104*8d741a5dSApple OSS Distributions 		return;
1105*8d741a5dSApple OSS Distributions 	}
1106*8d741a5dSApple OSS Distributions 
1107*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_errno) {
1108*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(message->sadb_msg_type, SADB_X_SPDDUMP, "SADB error for type %u", message->sadb_msg_type);
1109*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1110*8d741a5dSApple OSS Distributions 		T_END;
1111*8d741a5dSApple OSS Distributions 	}
1112*8d741a5dSApple OSS Distributions 
1113*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1114*8d741a5dSApple OSS Distributions 	case SADB_X_SPDADD:
1115*8d741a5dSApple OSS Distributions 	{
1116*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1117*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd add policy message is NULL");
1118*8d741a5dSApple OSS Distributions 		policy_id = policy_message->sadb_x_policy_id;
1119*8d741a5dSApple OSS Distributions 		T_LOG("Added policy id %u", policy_id);
1120*8d741a5dSApple OSS Distributions 		send_pfkey_spd_get_message(pfkey_socket, policy_id);
1121*8d741a5dSApple OSS Distributions 		break;
1122*8d741a5dSApple OSS Distributions 	}
1123*8d741a5dSApple OSS Distributions 	case SADB_X_SPDGET:
1124*8d741a5dSApple OSS Distributions 	{
1125*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1126*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd get policy message is NULL");
1127*8d741a5dSApple OSS Distributions 		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);
1128*8d741a5dSApple OSS Distributions 		if (counter < MAX_SPD_CHECK) {
1129*8d741a5dSApple OSS Distributions 			counter++;
1130*8d741a5dSApple OSS Distributions 			send_pfkey_spd_get_message(pfkey_socket, policy_id);
1131*8d741a5dSApple OSS Distributions 		} else {
1132*8d741a5dSApple OSS Distributions 			T_LOG("Deleting policy id %u", policy_id);
1133*8d741a5dSApple OSS Distributions 			send_pfkey_spd_delete_message(pfkey_socket, policy_id);
1134*8d741a5dSApple OSS Distributions 		}
1135*8d741a5dSApple OSS Distributions 		break;
1136*8d741a5dSApple OSS Distributions 	}
1137*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDELETE2:
1138*8d741a5dSApple OSS Distributions 	{
1139*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1140*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd delete2 policy message is NULL");
1141*8d741a5dSApple OSS Distributions 		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);
1142*8d741a5dSApple OSS Distributions 		T_LOG("Deleted policy id %u", policy_id);
1143*8d741a5dSApple OSS Distributions 		sleep(2);
1144*8d741a5dSApple OSS Distributions 		send_pfkey_spd_dump_message(pfkey_socket);
1145*8d741a5dSApple OSS Distributions 		break;
1146*8d741a5dSApple OSS Distributions 	}
1147*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDUMP:
1148*8d741a5dSApple OSS Distributions 	{
1149*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1150*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd dump policy message is NULL");
1151*8d741a5dSApple OSS Distributions 		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);
1152*8d741a5dSApple OSS Distributions 		T_FAIL("Policy id %u still exists", policy_id);
1153*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1154*8d741a5dSApple OSS Distributions 		T_END;
1155*8d741a5dSApple OSS Distributions 	}
1156*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1157*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1158*8d741a5dSApple OSS Distributions 		break;
1159*8d741a5dSApple OSS Distributions 	default:
1160*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1161*8d741a5dSApple OSS Distributions 		T_END;
1162*8d741a5dSApple OSS Distributions 	}
1163*8d741a5dSApple OSS Distributions 	return;
1164*8d741a5dSApple OSS Distributions }
1165*8d741a5dSApple OSS Distributions 
1166*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60822924(uint8_t ** mhp,int pfkey_socket)1167*8d741a5dSApple OSS Distributions pfkey_process_message_test_60822924(uint8_t **mhp, int pfkey_socket)
1168*8d741a5dSApple OSS Distributions {
1169*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1170*8d741a5dSApple OSS Distributions 	static int counter = 0;
1171*8d741a5dSApple OSS Distributions 	static uint32_t policy_id = 0;
1172*8d741a5dSApple OSS Distributions 
1173*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1174*8d741a5dSApple OSS Distributions 		return;
1175*8d741a5dSApple OSS Distributions 	}
1176*8d741a5dSApple OSS Distributions 
1177*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_errno) {
1178*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(message->sadb_msg_type, SADB_X_SPDDUMP, "SADB error for type %u", message->sadb_msg_type);
1179*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1180*8d741a5dSApple OSS Distributions 		T_END;
1181*8d741a5dSApple OSS Distributions 	}
1182*8d741a5dSApple OSS Distributions 
1183*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1184*8d741a5dSApple OSS Distributions 	case SADB_X_SPDADD:
1185*8d741a5dSApple OSS Distributions 	{
1186*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1187*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd add policy message is NULL");
1188*8d741a5dSApple OSS Distributions 		policy_id = policy_message->sadb_x_policy_id;
1189*8d741a5dSApple OSS Distributions 		T_LOG("Added policy id %u", policy_id);
1190*8d741a5dSApple OSS Distributions 		send_pfkey_spd_enable_message(pfkey_socket, policy_id);
1191*8d741a5dSApple OSS Distributions 		break;
1192*8d741a5dSApple OSS Distributions 	}
1193*8d741a5dSApple OSS Distributions 	case SADB_X_SPDENABLE:
1194*8d741a5dSApple OSS Distributions 	{
1195*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1196*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd enable policy message is NULL");
1197*8d741a5dSApple OSS Distributions 		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);
1198*8d741a5dSApple OSS Distributions 		if (counter < MAX_SPD_CHECK) {
1199*8d741a5dSApple OSS Distributions 			counter++;
1200*8d741a5dSApple OSS Distributions 			send_pfkey_spd_enable_message(pfkey_socket, policy_id);
1201*8d741a5dSApple OSS Distributions 		} else {
1202*8d741a5dSApple OSS Distributions 			T_LOG("Deleting policy id %u", policy_id);
1203*8d741a5dSApple OSS Distributions 			send_pfkey_spd_delete_message(pfkey_socket, policy_id);
1204*8d741a5dSApple OSS Distributions 		}
1205*8d741a5dSApple OSS Distributions 		break;
1206*8d741a5dSApple OSS Distributions 	}
1207*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDELETE2:
1208*8d741a5dSApple OSS Distributions 	{
1209*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1210*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd delete2 policy message is NULL");
1211*8d741a5dSApple OSS Distributions 		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);
1212*8d741a5dSApple OSS Distributions 		T_LOG("Deleted policy id %u", policy_id);
1213*8d741a5dSApple OSS Distributions 		sleep(2);
1214*8d741a5dSApple OSS Distributions 		send_pfkey_spd_dump_message(pfkey_socket);
1215*8d741a5dSApple OSS Distributions 		break;
1216*8d741a5dSApple OSS Distributions 	}
1217*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDUMP:
1218*8d741a5dSApple OSS Distributions 	{
1219*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1220*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd dump policy message is NULL");
1221*8d741a5dSApple OSS Distributions 		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);
1222*8d741a5dSApple OSS Distributions 		T_FAIL("Policy id %u still exists", policy_id);
1223*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1224*8d741a5dSApple OSS Distributions 		T_END;
1225*8d741a5dSApple OSS Distributions 	}
1226*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1227*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1228*8d741a5dSApple OSS Distributions 		break;
1229*8d741a5dSApple OSS Distributions 	default:
1230*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1231*8d741a5dSApple OSS Distributions 		T_END;
1232*8d741a5dSApple OSS Distributions 	}
1233*8d741a5dSApple OSS Distributions 	return;
1234*8d741a5dSApple OSS Distributions }
1235*8d741a5dSApple OSS Distributions 
1236*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60822956(uint8_t ** mhp,int pfkey_socket)1237*8d741a5dSApple OSS Distributions pfkey_process_message_test_60822956(uint8_t **mhp, int pfkey_socket)
1238*8d741a5dSApple OSS Distributions {
1239*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1240*8d741a5dSApple OSS Distributions 	static int counter = 0;
1241*8d741a5dSApple OSS Distributions 	static uint32_t policy_id = 0;
1242*8d741a5dSApple OSS Distributions 
1243*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1244*8d741a5dSApple OSS Distributions 		return;
1245*8d741a5dSApple OSS Distributions 	}
1246*8d741a5dSApple OSS Distributions 
1247*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_errno) {
1248*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(message->sadb_msg_type, SADB_X_SPDDUMP, "SADB error for type %u", message->sadb_msg_type);
1249*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1250*8d741a5dSApple OSS Distributions 		T_END;
1251*8d741a5dSApple OSS Distributions 	}
1252*8d741a5dSApple OSS Distributions 
1253*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1254*8d741a5dSApple OSS Distributions 	case SADB_X_SPDADD:
1255*8d741a5dSApple OSS Distributions 	{
1256*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1257*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd add policy message is NULL");
1258*8d741a5dSApple OSS Distributions 		policy_id = policy_message->sadb_x_policy_id;
1259*8d741a5dSApple OSS Distributions 		T_LOG("Added policy id %u", policy_id);
1260*8d741a5dSApple OSS Distributions 		send_pfkey_spd_disable_message(pfkey_socket, policy_id);
1261*8d741a5dSApple OSS Distributions 		break;
1262*8d741a5dSApple OSS Distributions 	}
1263*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDISABLE:
1264*8d741a5dSApple OSS Distributions 	{
1265*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1266*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd disable policy message is NULL");
1267*8d741a5dSApple OSS Distributions 		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);
1268*8d741a5dSApple OSS Distributions 		if (counter < MAX_SPD_CHECK) {
1269*8d741a5dSApple OSS Distributions 			counter++;
1270*8d741a5dSApple OSS Distributions 			send_pfkey_spd_disable_message(pfkey_socket, policy_id);
1271*8d741a5dSApple OSS Distributions 		} else {
1272*8d741a5dSApple OSS Distributions 			T_LOG("Deleting policy id %u", policy_id);
1273*8d741a5dSApple OSS Distributions 			send_pfkey_spd_delete_message(pfkey_socket, policy_id);
1274*8d741a5dSApple OSS Distributions 		}
1275*8d741a5dSApple OSS Distributions 		break;
1276*8d741a5dSApple OSS Distributions 	}
1277*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDELETE2:
1278*8d741a5dSApple OSS Distributions 	{
1279*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1280*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd delete2 policy message is NULL");
1281*8d741a5dSApple OSS Distributions 		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);
1282*8d741a5dSApple OSS Distributions 		T_LOG("Deleted policy id %u", policy_id);
1283*8d741a5dSApple OSS Distributions 		sleep(2);
1284*8d741a5dSApple OSS Distributions 		send_pfkey_spd_dump_message(pfkey_socket);
1285*8d741a5dSApple OSS Distributions 		break;
1286*8d741a5dSApple OSS Distributions 	}
1287*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDUMP:
1288*8d741a5dSApple OSS Distributions 	{
1289*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1290*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd dump policy message is NULL");
1291*8d741a5dSApple OSS Distributions 		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);
1292*8d741a5dSApple OSS Distributions 		T_FAIL("Policy id %u still exists", policy_id);
1293*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1294*8d741a5dSApple OSS Distributions 		T_END;
1295*8d741a5dSApple OSS Distributions 	}
1296*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1297*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1298*8d741a5dSApple OSS Distributions 		break;
1299*8d741a5dSApple OSS Distributions 	default:
1300*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1301*8d741a5dSApple OSS Distributions 		T_END;
1302*8d741a5dSApple OSS Distributions 	}
1303*8d741a5dSApple OSS Distributions 	return;
1304*8d741a5dSApple OSS Distributions }
1305*8d741a5dSApple OSS Distributions 
1306*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60679513(uint8_t ** mhp,int pfkey_socket)1307*8d741a5dSApple OSS Distributions pfkey_process_message_test_60679513(uint8_t **mhp, int pfkey_socket)
1308*8d741a5dSApple OSS Distributions {
1309*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1310*8d741a5dSApple OSS Distributions 	static uint32_t spi = 0;
1311*8d741a5dSApple OSS Distributions 
1312*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1313*8d741a5dSApple OSS Distributions 		return;
1314*8d741a5dSApple OSS Distributions 	}
1315*8d741a5dSApple OSS Distributions 
1316*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_errno) {
1317*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_EQ(message->sadb_msg_type, SADB_UPDATE, "SADB error for type %u", message->sadb_msg_type);
1318*8d741a5dSApple OSS Distributions 	}
1319*8d741a5dSApple OSS Distributions 
1320*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1321*8d741a5dSApple OSS Distributions 	case SADB_GETSPI:
1322*8d741a5dSApple OSS Distributions 	{
1323*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1324*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "sa get spi message is NULL");
1325*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1326*8d741a5dSApple OSS Distributions 		T_LOG("get spi 0x%x", spi);
1327*8d741a5dSApple OSS Distributions 		send_pkey_update_sa(pfkey_socket, spi);
1328*8d741a5dSApple OSS Distributions 		break;
1329*8d741a5dSApple OSS Distributions 	}
1330*8d741a5dSApple OSS Distributions 	case SADB_UPDATE:
1331*8d741a5dSApple OSS Distributions 	{
1332*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1333*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "update sa message is NULL");
1334*8d741a5dSApple OSS Distributions 		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));
1335*8d741a5dSApple OSS Distributions 		T_LOG("update sa 0x%x", spi);
1336*8d741a5dSApple OSS Distributions 		send_pkey_delete_sa(pfkey_socket, spi);
1337*8d741a5dSApple OSS Distributions 		break;
1338*8d741a5dSApple OSS Distributions 	}
1339*8d741a5dSApple OSS Distributions 	case SADB_DELETE:
1340*8d741a5dSApple OSS Distributions 	{
1341*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1342*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "delete sa message is NULL");
1343*8d741a5dSApple OSS Distributions 		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));
1344*8d741a5dSApple OSS Distributions 		T_LOG("delete sa 0x%x", spi);
1345*8d741a5dSApple OSS Distributions 		pfkey_cleanup();
1346*8d741a5dSApple OSS Distributions 		T_END;
1347*8d741a5dSApple OSS Distributions 	}
1348*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1349*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1350*8d741a5dSApple OSS Distributions 		break;
1351*8d741a5dSApple OSS Distributions 	default:
1352*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1353*8d741a5dSApple OSS Distributions 		T_END;
1354*8d741a5dSApple OSS Distributions 	}
1355*8d741a5dSApple OSS Distributions 	return;
1356*8d741a5dSApple OSS Distributions }
1357*8d741a5dSApple OSS Distributions 
1358*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60768729(uint8_t ** mhp,int pfkey_socket)1359*8d741a5dSApple OSS Distributions pfkey_process_message_test_60768729(uint8_t **mhp, int pfkey_socket)
1360*8d741a5dSApple OSS Distributions {
1361*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1362*8d741a5dSApple OSS Distributions 	uint32_t spi = 0;
1363*8d741a5dSApple OSS Distributions 	static int counter = 0;
1364*8d741a5dSApple OSS Distributions 
1365*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1366*8d741a5dSApple OSS Distributions 		return;
1367*8d741a5dSApple OSS Distributions 	}
1368*8d741a5dSApple OSS Distributions 
1369*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ(message->sadb_msg_errno, 0, "SADB error for type %u", message->sadb_msg_type);
1370*8d741a5dSApple OSS Distributions 
1371*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1372*8d741a5dSApple OSS Distributions 	case SADB_GETSPI:
1373*8d741a5dSApple OSS Distributions 	{
1374*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1375*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "sa get spi message is NULL");
1376*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1377*8d741a5dSApple OSS Distributions 		counter++;
1378*8d741a5dSApple OSS Distributions 		if (counter <= 1000) {
1379*8d741a5dSApple OSS Distributions 			send_pkey_get_spi(pfkey_socket);
1380*8d741a5dSApple OSS Distributions 		} else {
1381*8d741a5dSApple OSS Distributions 			T_LOG("SADB added 1000 Larval SPIs");
1382*8d741a5dSApple OSS Distributions 			send_pfkey_sa_dump_message(pfkey_socket);
1383*8d741a5dSApple OSS Distributions 		}
1384*8d741a5dSApple OSS Distributions 		break;
1385*8d741a5dSApple OSS Distributions 	}
1386*8d741a5dSApple OSS Distributions 	case SADB_DUMP:
1387*8d741a5dSApple OSS Distributions 	{
1388*8d741a5dSApple OSS Distributions 		counter--;
1389*8d741a5dSApple OSS Distributions 		if (counter == 0) {
1390*8d741a5dSApple OSS Distributions 			T_PASS("SADB dump successful");
1391*8d741a5dSApple OSS Distributions 			pfkey_cleanup();
1392*8d741a5dSApple OSS Distributions 			T_END;
1393*8d741a5dSApple OSS Distributions 		}
1394*8d741a5dSApple OSS Distributions 		break;
1395*8d741a5dSApple OSS Distributions 	}
1396*8d741a5dSApple OSS Distributions 
1397*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1398*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1399*8d741a5dSApple OSS Distributions 		break;
1400*8d741a5dSApple OSS Distributions 	default:
1401*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1402*8d741a5dSApple OSS Distributions 		T_END;
1403*8d741a5dSApple OSS Distributions 	}
1404*8d741a5dSApple OSS Distributions 	return;
1405*8d741a5dSApple OSS Distributions }
1406*8d741a5dSApple OSS Distributions 
1407*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60769680(uint8_t ** mhp,int pfkey_socket)1408*8d741a5dSApple OSS Distributions pfkey_process_message_test_60769680(uint8_t **mhp, int pfkey_socket)
1409*8d741a5dSApple OSS Distributions {
1410*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1411*8d741a5dSApple OSS Distributions 	static uint8_t counter = 0;
1412*8d741a5dSApple OSS Distributions 
1413*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1414*8d741a5dSApple OSS Distributions 		return;
1415*8d741a5dSApple OSS Distributions 	}
1416*8d741a5dSApple OSS Distributions 
1417*8d741a5dSApple OSS Distributions 	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);
1418*8d741a5dSApple OSS Distributions 
1419*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1420*8d741a5dSApple OSS Distributions 	case SADB_X_SPDADD:
1421*8d741a5dSApple OSS Distributions 	{
1422*8d741a5dSApple OSS Distributions 		struct sadb_x_policy *policy_message = (struct sadb_x_policy *)(void *)mhp[SADB_X_EXT_POLICY];
1423*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(policy_message, "spd add policy message is NULL");
1424*8d741a5dSApple OSS Distributions 		counter++;
1425*8d741a5dSApple OSS Distributions 		if (counter <= 240) {
1426*8d741a5dSApple OSS Distributions 			send_pfkey_spd_add_message(pfkey_socket, counter + 1);
1427*8d741a5dSApple OSS Distributions 		} else {
1428*8d741a5dSApple OSS Distributions 			T_LOG("SADB added 240 security policies");
1429*8d741a5dSApple OSS Distributions 			send_pfkey_spd_dump_message(pfkey_socket);
1430*8d741a5dSApple OSS Distributions 		}
1431*8d741a5dSApple OSS Distributions 		break;
1432*8d741a5dSApple OSS Distributions 	}
1433*8d741a5dSApple OSS Distributions 	case SADB_X_SPDDUMP:
1434*8d741a5dSApple OSS Distributions 	{
1435*8d741a5dSApple OSS Distributions 		counter--;
1436*8d741a5dSApple OSS Distributions 		if (counter == 0) {
1437*8d741a5dSApple OSS Distributions 			T_PASS("SADB policy dump successful");
1438*8d741a5dSApple OSS Distributions 			pfkey_cleanup();
1439*8d741a5dSApple OSS Distributions 			T_END;
1440*8d741a5dSApple OSS Distributions 		}
1441*8d741a5dSApple OSS Distributions 		break;
1442*8d741a5dSApple OSS Distributions 	}
1443*8d741a5dSApple OSS Distributions 
1444*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1445*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1446*8d741a5dSApple OSS Distributions 		break;
1447*8d741a5dSApple OSS Distributions 	default:
1448*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1449*8d741a5dSApple OSS Distributions 		T_END;
1450*8d741a5dSApple OSS Distributions 	}
1451*8d741a5dSApple OSS Distributions 	return;
1452*8d741a5dSApple OSS Distributions }
1453*8d741a5dSApple OSS Distributions 
1454*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60822823(uint8_t ** mhp,int pfkey_socket)1455*8d741a5dSApple OSS Distributions pfkey_process_message_test_60822823(uint8_t **mhp, int pfkey_socket)
1456*8d741a5dSApple OSS Distributions {
1457*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1458*8d741a5dSApple OSS Distributions 	static uint32_t spi = 0;
1459*8d741a5dSApple OSS Distributions 
1460*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1461*8d741a5dSApple OSS Distributions 		return;
1462*8d741a5dSApple OSS Distributions 	}
1463*8d741a5dSApple OSS Distributions 
1464*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_errno != 0) {
1465*8d741a5dSApple OSS Distributions 		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);
1466*8d741a5dSApple OSS Distributions 		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);
1467*8d741a5dSApple OSS Distributions 		T_PASS("SADB get SA Stat received EINVAL");
1468*8d741a5dSApple OSS Distributions 		T_END;
1469*8d741a5dSApple OSS Distributions 	}
1470*8d741a5dSApple OSS Distributions 
1471*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1472*8d741a5dSApple OSS Distributions 	case SADB_ADD:
1473*8d741a5dSApple OSS Distributions 	{
1474*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1475*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "add sa message is NULL");
1476*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1477*8d741a5dSApple OSS Distributions 		T_LOG("added sa 0x%x", spi);
1478*8d741a5dSApple OSS Distributions 		send_pfkey_get_sa_stat(pfkey_socket, spi, 5);
1479*8d741a5dSApple OSS Distributions 		break;
1480*8d741a5dSApple OSS Distributions 	}
1481*8d741a5dSApple OSS Distributions 	case SADB_GETSASTAT:
1482*8d741a5dSApple OSS Distributions 	{
1483*8d741a5dSApple OSS Distributions 		T_FAIL("get sa stat should fail %u", message->sadb_msg_type);
1484*8d741a5dSApple OSS Distributions 		T_END;
1485*8d741a5dSApple OSS Distributions 	}
1486*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1487*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1488*8d741a5dSApple OSS Distributions 		break;
1489*8d741a5dSApple OSS Distributions 	default:
1490*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1491*8d741a5dSApple OSS Distributions 		T_END;
1492*8d741a5dSApple OSS Distributions 	}
1493*8d741a5dSApple OSS Distributions 	return;
1494*8d741a5dSApple OSS Distributions }
1495*8d741a5dSApple OSS Distributions 
1496*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60822823_1(uint8_t ** mhp,int pfkey_socket)1497*8d741a5dSApple OSS Distributions pfkey_process_message_test_60822823_1(uint8_t **mhp, int pfkey_socket)
1498*8d741a5dSApple OSS Distributions {
1499*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1500*8d741a5dSApple OSS Distributions 	static uint32_t spi = 0;
1501*8d741a5dSApple OSS Distributions 
1502*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1503*8d741a5dSApple OSS Distributions 		return;
1504*8d741a5dSApple OSS Distributions 	}
1505*8d741a5dSApple OSS Distributions 
1506*8d741a5dSApple OSS Distributions 	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);
1507*8d741a5dSApple OSS Distributions 
1508*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1509*8d741a5dSApple OSS Distributions 	case SADB_ADD:
1510*8d741a5dSApple OSS Distributions 	{
1511*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1512*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "add sa message is NULL");
1513*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1514*8d741a5dSApple OSS Distributions 		T_LOG("added sa 0x%x", spi);
1515*8d741a5dSApple OSS Distributions 		send_pfkey_get_sa_stat(pfkey_socket, spi, 1);
1516*8d741a5dSApple OSS Distributions 		break;
1517*8d741a5dSApple OSS Distributions 	}
1518*8d741a5dSApple OSS Distributions 	case SADB_GETSASTAT:
1519*8d741a5dSApple OSS Distributions 	{
1520*8d741a5dSApple OSS Distributions 		struct sadb_session_id *session_id = (struct sadb_session_id *)(void *)mhp[SADB_EXT_SESSION_ID];
1521*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(session_id, "session id is NULL");
1522*8d741a5dSApple OSS Distributions 		T_QUIET; T_EXPECT_EQ_ULLONG(session_id->sadb_session_id_v[0], 1ULL, "Session id is not equal");
1523*8d741a5dSApple OSS Distributions 		T_PASS("get sa stat success %u", message->sadb_msg_type);
1524*8d741a5dSApple OSS Distributions 		T_END;
1525*8d741a5dSApple OSS Distributions 	}
1526*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1527*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1528*8d741a5dSApple OSS Distributions 		break;
1529*8d741a5dSApple OSS Distributions 	default:
1530*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1531*8d741a5dSApple OSS Distributions 		T_END;
1532*8d741a5dSApple OSS Distributions 	}
1533*8d741a5dSApple OSS Distributions 	return;
1534*8d741a5dSApple OSS Distributions }
1535*8d741a5dSApple OSS Distributions 
1536*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60687183(uint8_t ** mhp,int pfkey_socket)1537*8d741a5dSApple OSS Distributions pfkey_process_message_test_60687183(uint8_t **mhp, int pfkey_socket)
1538*8d741a5dSApple OSS Distributions {
1539*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1540*8d741a5dSApple OSS Distributions 	static uint32_t spi = 0;
1541*8d741a5dSApple OSS Distributions 
1542*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1543*8d741a5dSApple OSS Distributions 		return;
1544*8d741a5dSApple OSS Distributions 	}
1545*8d741a5dSApple OSS Distributions 
1546*8d741a5dSApple OSS Distributions 	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);
1547*8d741a5dSApple OSS Distributions 
1548*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1549*8d741a5dSApple OSS Distributions 	case SADB_ADD:
1550*8d741a5dSApple OSS Distributions 	{
1551*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1552*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "add sa message is NULL");
1553*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1554*8d741a5dSApple OSS Distributions 		T_LOG("added sa 0x%x", spi);
1555*8d741a5dSApple OSS Distributions 		send_pkey_migrate_sa(pfkey_socket, spi, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET,
1556*8d741a5dSApple OSS Distributions 		    TEST_MIGRATE_SRC_ADDRESS_IPv4, TEST_MIGRATE_DST_ADDRESS_IPv4, AF_INET);
1557*8d741a5dSApple OSS Distributions 		break;
1558*8d741a5dSApple OSS Distributions 	}
1559*8d741a5dSApple OSS Distributions 	case SADB_MIGRATE:
1560*8d741a5dSApple OSS Distributions 	{
1561*8d741a5dSApple OSS Distributions 		T_PASS("migrate SA success");
1562*8d741a5dSApple OSS Distributions 		T_END;
1563*8d741a5dSApple OSS Distributions 	}
1564*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1565*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1566*8d741a5dSApple OSS Distributions 		break;
1567*8d741a5dSApple OSS Distributions 	default:
1568*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1569*8d741a5dSApple OSS Distributions 		T_END;
1570*8d741a5dSApple OSS Distributions 	}
1571*8d741a5dSApple OSS Distributions 	return;
1572*8d741a5dSApple OSS Distributions }
1573*8d741a5dSApple OSS Distributions 
1574*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60687183_1(uint8_t ** mhp,int pfkey_socket)1575*8d741a5dSApple OSS Distributions pfkey_process_message_test_60687183_1(uint8_t **mhp, int pfkey_socket)
1576*8d741a5dSApple OSS Distributions {
1577*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1578*8d741a5dSApple OSS Distributions 	static uint32_t spi = 0;
1579*8d741a5dSApple OSS Distributions 
1580*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1581*8d741a5dSApple OSS Distributions 		return;
1582*8d741a5dSApple OSS Distributions 	}
1583*8d741a5dSApple OSS Distributions 
1584*8d741a5dSApple OSS Distributions 	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);
1585*8d741a5dSApple OSS Distributions 
1586*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1587*8d741a5dSApple OSS Distributions 	case SADB_ADD:
1588*8d741a5dSApple OSS Distributions 	{
1589*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1590*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "add sa message is NULL");
1591*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1592*8d741a5dSApple OSS Distributions 		T_LOG("added sa 0x%x", spi);
1593*8d741a5dSApple OSS Distributions 		send_pkey_migrate_sa(pfkey_socket, spi, TEST_SRC_ADDRESS_IPv6, TEST_DST_ADDRESS_IPv6, AF_INET6,
1594*8d741a5dSApple OSS Distributions 		    TEST_MIGRATE_SRC_ADDRESS_IPv6, TEST_MIGRATE_DST_ADDRESS_IPv6, AF_INET6);
1595*8d741a5dSApple OSS Distributions 		break;
1596*8d741a5dSApple OSS Distributions 	}
1597*8d741a5dSApple OSS Distributions 	case SADB_MIGRATE:
1598*8d741a5dSApple OSS Distributions 	{
1599*8d741a5dSApple OSS Distributions 		T_PASS("migrate SA success");
1600*8d741a5dSApple OSS Distributions 		T_END;
1601*8d741a5dSApple OSS Distributions 	}
1602*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1603*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1604*8d741a5dSApple OSS Distributions 		break;
1605*8d741a5dSApple OSS Distributions 	default:
1606*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1607*8d741a5dSApple OSS Distributions 		T_END;
1608*8d741a5dSApple OSS Distributions 	}
1609*8d741a5dSApple OSS Distributions 	return;
1610*8d741a5dSApple OSS Distributions }
1611*8d741a5dSApple OSS Distributions 
1612*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_60687183_2(uint8_t ** mhp,int pfkey_socket)1613*8d741a5dSApple OSS Distributions pfkey_process_message_test_60687183_2(uint8_t **mhp, int pfkey_socket)
1614*8d741a5dSApple OSS Distributions {
1615*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1616*8d741a5dSApple OSS Distributions 	static uint32_t spi = 0;
1617*8d741a5dSApple OSS Distributions 
1618*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1619*8d741a5dSApple OSS Distributions 		return;
1620*8d741a5dSApple OSS Distributions 	}
1621*8d741a5dSApple OSS Distributions 
1622*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_errno != 0) {
1623*8d741a5dSApple OSS Distributions 		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);
1624*8d741a5dSApple OSS Distributions 		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);
1625*8d741a5dSApple OSS Distributions 		T_PASS("SADB migrate SA received EINVAL");
1626*8d741a5dSApple OSS Distributions 		T_END;
1627*8d741a5dSApple OSS Distributions 	}
1628*8d741a5dSApple OSS Distributions 
1629*8d741a5dSApple OSS Distributions 	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);
1630*8d741a5dSApple OSS Distributions 
1631*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1632*8d741a5dSApple OSS Distributions 	case SADB_ADD:
1633*8d741a5dSApple OSS Distributions 	{
1634*8d741a5dSApple OSS Distributions 		struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA];
1635*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NOTNULL(sa_message, "add sa message is NULL");
1636*8d741a5dSApple OSS Distributions 		spi = ntohl(sa_message->sadb_sa_spi);
1637*8d741a5dSApple OSS Distributions 		T_LOG("added sa 0x%x", spi);
1638*8d741a5dSApple OSS Distributions 		send_pkey_migrate_sa(pfkey_socket, spi, TEST_SRC_ADDRESS_IPv6, TEST_DST_ADDRESS_IPv6, AF_INET6,
1639*8d741a5dSApple OSS Distributions 		    TEST_MIGRATE_SRC_ADDRESS_IPv6, TEST_MIGRATE_DST_ADDRESS_IPv6, AF_CHAOS);
1640*8d741a5dSApple OSS Distributions 		break;
1641*8d741a5dSApple OSS Distributions 	}
1642*8d741a5dSApple OSS Distributions 	case SADB_MIGRATE:
1643*8d741a5dSApple OSS Distributions 	{
1644*8d741a5dSApple OSS Distributions 		T_FAIL("migrate SA test for bad address failed");
1645*8d741a5dSApple OSS Distributions 		T_END;
1646*8d741a5dSApple OSS Distributions 	}
1647*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1648*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1649*8d741a5dSApple OSS Distributions 		break;
1650*8d741a5dSApple OSS Distributions 	default:
1651*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1652*8d741a5dSApple OSS Distributions 		T_END;
1653*8d741a5dSApple OSS Distributions 	}
1654*8d741a5dSApple OSS Distributions 	return;
1655*8d741a5dSApple OSS Distributions }
1656*8d741a5dSApple OSS Distributions 
1657*8d741a5dSApple OSS Distributions static void
pfkey_process_message_test_78944570(uint8_t ** mhp,__unused int pfkey_socket)1658*8d741a5dSApple OSS Distributions pfkey_process_message_test_78944570(uint8_t **mhp, __unused int pfkey_socket)
1659*8d741a5dSApple OSS Distributions {
1660*8d741a5dSApple OSS Distributions 	struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0];
1661*8d741a5dSApple OSS Distributions 
1662*8d741a5dSApple OSS Distributions 	if (message->sadb_msg_pid != (uint32_t)getpid()) {
1663*8d741a5dSApple OSS Distributions 		return;
1664*8d741a5dSApple OSS Distributions 	}
1665*8d741a5dSApple OSS Distributions 
1666*8d741a5dSApple OSS Distributions 	switch (message->sadb_msg_type) {
1667*8d741a5dSApple OSS Distributions 	case SADB_X_SPDADD:
1668*8d741a5dSApple OSS Distributions 	{
1669*8d741a5dSApple OSS Distributions 		if (message->sadb_msg_errno != 0) {
1670*8d741a5dSApple OSS Distributions 			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);
1671*8d741a5dSApple OSS Distributions 			T_PASS("SADB spd add received EINVAL");
1672*8d741a5dSApple OSS Distributions 		} else {
1673*8d741a5dSApple OSS Distributions 			T_FAIL("SADB spd add received success");
1674*8d741a5dSApple OSS Distributions 		}
1675*8d741a5dSApple OSS Distributions 		T_END;
1676*8d741a5dSApple OSS Distributions 		break;
1677*8d741a5dSApple OSS Distributions 	}
1678*8d741a5dSApple OSS Distributions 	case SADB_FLUSH:
1679*8d741a5dSApple OSS Distributions 	case SADB_X_SPDFLUSH:
1680*8d741a5dSApple OSS Distributions 		break;
1681*8d741a5dSApple OSS Distributions 	default:
1682*8d741a5dSApple OSS Distributions 		T_FAIL("bad SADB message type %u", message->sadb_msg_type);
1683*8d741a5dSApple OSS Distributions 		T_END;
1684*8d741a5dSApple OSS Distributions 	}
1685*8d741a5dSApple OSS Distributions 	return;
1686*8d741a5dSApple OSS Distributions }
1687*8d741a5dSApple OSS Distributions 
1688*8d741a5dSApple OSS Distributions static int
setup_tcp_server(uint16_t port)1689*8d741a5dSApple OSS Distributions setup_tcp_server(uint16_t port)
1690*8d741a5dSApple OSS Distributions {
1691*8d741a5dSApple OSS Distributions 	struct sockaddr_in server_addr = {};
1692*8d741a5dSApple OSS Distributions 	int server_fd = -1;
1693*8d741a5dSApple OSS Distributions 
1694*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(server_fd = socket(AF_INET, SOCK_STREAM, 0),
1695*8d741a5dSApple OSS Distributions 	    "tcp server socket creation failed");
1696*8d741a5dSApple OSS Distributions 
1697*8d741a5dSApple OSS Distributions 	server_addr.sin_family = AF_INET;
1698*8d741a5dSApple OSS Distributions 	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
1699*8d741a5dSApple OSS Distributions 	server_addr.sin_port = htons(port);
1700*8d741a5dSApple OSS Distributions 
1701*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(bind(server_fd, (struct sockaddr *)&server_addr,
1702*8d741a5dSApple OSS Distributions 	    sizeof(server_addr)), "tcp server bind failed");
1703*8d741a5dSApple OSS Distributions 
1704*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(listen(server_fd, 2), "tcp server listen failed");
1705*8d741a5dSApple OSS Distributions 	return server_fd;
1706*8d741a5dSApple OSS Distributions }
1707*8d741a5dSApple OSS Distributions 
1708*8d741a5dSApple OSS Distributions static int
setup_loopback_tcp_client(uint16_t server_port)1709*8d741a5dSApple OSS Distributions setup_loopback_tcp_client(uint16_t server_port)
1710*8d741a5dSApple OSS Distributions {
1711*8d741a5dSApple OSS Distributions 	struct sockaddr_in conn_addr = {};
1712*8d741a5dSApple OSS Distributions 	int client_fd = -1;
1713*8d741a5dSApple OSS Distributions 
1714*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(client_fd = socket(AF_INET, SOCK_STREAM, 0),
1715*8d741a5dSApple OSS Distributions 	    "tcp client socket creation failed");
1716*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(inet_pton(AF_INET, "127.0.0.1", &conn_addr.sin_addr),
1717*8d741a5dSApple OSS Distributions 	    "loopback address inet_pton failed");
1718*8d741a5dSApple OSS Distributions 
1719*8d741a5dSApple OSS Distributions 	conn_addr.sin_family = AF_INET;
1720*8d741a5dSApple OSS Distributions 	conn_addr.sin_port = htons(server_port);
1721*8d741a5dSApple OSS Distributions 
1722*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(connect(client_fd, (struct sockaddr *)&conn_addr, sizeof(conn_addr)),
1723*8d741a5dSApple OSS Distributions 	    "tcp loopback client connect failed");
1724*8d741a5dSApple OSS Distributions 	return client_fd;
1725*8d741a5dSApple OSS Distributions }
1726*8d741a5dSApple OSS Distributions 
1727*8d741a5dSApple OSS Distributions static void
setup_socket_policy(int socket_fd)1728*8d741a5dSApple OSS Distributions setup_socket_policy(int socket_fd)
1729*8d741a5dSApple OSS Distributions {
1730*8d741a5dSApple OSS Distributions 	uint8_t __attribute__((aligned(4))) buf[
1731*8d741a5dSApple OSS Distributions 		sizeof(struct sadb_x_policy) +
1732*8d741a5dSApple OSS Distributions 		sizeof(struct sadb_x_ipsecrequest) +
1733*8d741a5dSApple OSS Distributions 		sizeof(struct sockaddr_in) +
1734*8d741a5dSApple OSS Distributions 		sizeof(struct sockaddr_in)
1735*8d741a5dSApple OSS Distributions 	];
1736*8d741a5dSApple OSS Distributions 
1737*8d741a5dSApple OSS Distributions 	struct sadb_x_policy *xpl = (struct sadb_x_policy *)buf;
1738*8d741a5dSApple OSS Distributions 	struct sadb_x_ipsecrequest *xisr = (struct sadb_x_ipsecrequest *)(xpl + 1);
1739*8d741a5dSApple OSS Distributions 	struct sockaddr *sa;
1740*8d741a5dSApple OSS Distributions 
1741*8d741a5dSApple OSS Distributions 
1742*8d741a5dSApple OSS Distributions 	bzero(buf, sizeof(buf));
1743*8d741a5dSApple OSS Distributions 	/* xpl: */
1744*8d741a5dSApple OSS Distributions 	xpl->sadb_x_policy_len = sizeof(buf) >> 3;
1745*8d741a5dSApple OSS Distributions 	xpl->sadb_x_policy_dir = IPSEC_DIR_INBOUND;
1746*8d741a5dSApple OSS Distributions 	xpl->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
1747*8d741a5dSApple OSS Distributions 	/* xisr: */
1748*8d741a5dSApple OSS Distributions 	xisr->sadb_x_ipsecrequest_len = sizeof(buf) - sizeof(*xpl);
1749*8d741a5dSApple OSS Distributions 	xisr->sadb_x_ipsecrequest_proto = IPPROTO_ESP;
1750*8d741a5dSApple OSS Distributions 	xisr->sadb_x_ipsecrequest_mode = IPSEC_MODE_TRANSPORT;
1751*8d741a5dSApple OSS Distributions 	xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_DEFAULT;
1752*8d741a5dSApple OSS Distributions 	/* src sockaddr: */
1753*8d741a5dSApple OSS Distributions 	sa = (struct sockaddr *)(xisr + 1);
1754*8d741a5dSApple OSS Distributions 	sa->sa_len = sizeof(struct sockaddr_in);
1755*8d741a5dSApple OSS Distributions 	/* dst sockaddr: */
1756*8d741a5dSApple OSS Distributions 	sa = (struct sockaddr *)((char *)(xisr + 1) + sa->sa_len);
1757*8d741a5dSApple OSS Distributions 	sa->sa_len = sizeof(struct sockaddr_in);
1758*8d741a5dSApple OSS Distributions 
1759*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(setsockopt(socket_fd, IPPROTO_IP, IP_IPSEC_POLICY,
1760*8d741a5dSApple OSS Distributions 	    buf, sizeof(buf)), "tcp server listen failed");
1761*8d741a5dSApple OSS Distributions }
1762*8d741a5dSApple OSS Distributions 
1763*8d741a5dSApple OSS Distributions T_DECL(sadb_x_get_60822136, "security policy reference count overflow", T_META_TAG_VM_PREFERRED)
1764*8d741a5dSApple OSS Distributions {
1765*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_X_GET_OVERFLOW_60822136;
1766*8d741a5dSApple OSS Distributions 
1767*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1768*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1769*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1770*8d741a5dSApple OSS Distributions 	send_pfkey_spd_add_message(pfkey_socket, IPSEC_ULPROTO_ANY);
1771*8d741a5dSApple OSS Distributions 
1772*8d741a5dSApple OSS Distributions 	dispatch_main();
1773*8d741a5dSApple OSS Distributions }
1774*8d741a5dSApple OSS Distributions 
1775*8d741a5dSApple OSS Distributions T_DECL(sadb_x_spd_enable_60822924, "security policy reference count overflow", T_META_TAG_VM_PREFERRED)
1776*8d741a5dSApple OSS Distributions {
1777*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_X_SPDENABLE_OVERFLOW_60822924;
1778*8d741a5dSApple OSS Distributions 
1779*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1780*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1781*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1782*8d741a5dSApple OSS Distributions 	send_pfkey_spd_add_message(pfkey_socket, IPSEC_ULPROTO_ANY);
1783*8d741a5dSApple OSS Distributions 
1784*8d741a5dSApple OSS Distributions 	dispatch_main();
1785*8d741a5dSApple OSS Distributions }
1786*8d741a5dSApple OSS Distributions 
1787*8d741a5dSApple OSS Distributions T_DECL(sadb_x_spd_disable_60822956, "security policy reference count overflow", T_META_TAG_VM_PREFERRED)
1788*8d741a5dSApple OSS Distributions {
1789*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_X_SPDDISABLE_OVERFLOW_60822956;
1790*8d741a5dSApple OSS Distributions 
1791*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1792*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1793*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1794*8d741a5dSApple OSS Distributions 	send_pfkey_spd_add_message(pfkey_socket, IPSEC_ULPROTO_ANY);
1795*8d741a5dSApple OSS Distributions 
1796*8d741a5dSApple OSS Distributions 	dispatch_main();
1797*8d741a5dSApple OSS Distributions }
1798*8d741a5dSApple OSS Distributions 
1799*8d741a5dSApple OSS Distributions T_DECL(sadb_update_60679513, "security association use after free", T_META_TAG_VM_PREFERRED)
1800*8d741a5dSApple OSS Distributions {
1801*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_UPDATE_USE_AFTER_FREE_60679513;
1802*8d741a5dSApple OSS Distributions 
1803*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1804*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1805*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1806*8d741a5dSApple OSS Distributions 	send_pkey_get_spi(pfkey_socket);
1807*8d741a5dSApple OSS Distributions 
1808*8d741a5dSApple OSS Distributions 	dispatch_main();
1809*8d741a5dSApple OSS Distributions }
1810*8d741a5dSApple OSS Distributions 
1811*8d741a5dSApple OSS Distributions T_DECL(sadb_dump_60768729, "security association sa dump heap overflow", T_META_ENABLED(false), T_META_TAG_VM_PREFERRED)
1812*8d741a5dSApple OSS Distributions {
1813*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_DUMP_HEAP_OVERFLOW_60768729;
1814*8d741a5dSApple OSS Distributions 
1815*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1816*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1817*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1818*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1819*8d741a5dSApple OSS Distributions 	send_pkey_get_spi(pfkey_socket);
1820*8d741a5dSApple OSS Distributions 
1821*8d741a5dSApple OSS Distributions 	dispatch_main();
1822*8d741a5dSApple OSS Distributions }
1823*8d741a5dSApple OSS Distributions 
1824*8d741a5dSApple OSS Distributions // Disabled due to rdar://92910783
1825*8d741a5dSApple OSS Distributions T_DECL(sadb_policy_dump_60769680, "security association sa policy dump heap overflow", T_META_ENABLED(false), T_META_TAG_VM_PREFERRED)
1826*8d741a5dSApple OSS Distributions {
1827*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_POLICY_DUMP_HEAP_OVERFLOW_60769680;
1828*8d741a5dSApple OSS Distributions 
1829*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1830*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1831*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1832*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1833*8d741a5dSApple OSS Distributions 	send_pfkey_spd_add_message(pfkey_socket, 1);
1834*8d741a5dSApple OSS Distributions 
1835*8d741a5dSApple OSS Distributions 	dispatch_main();
1836*8d741a5dSApple OSS Distributions }
1837*8d741a5dSApple OSS Distributions 
1838*8d741a5dSApple OSS Distributions T_DECL(sadb_get_sastat_oob_60769680, "security association get sa stat oob read", T_META_TAG_VM_PREFERRED)
1839*8d741a5dSApple OSS Distributions {
1840*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_GETSASTAT_OOB_READ_60822823;
1841*8d741a5dSApple OSS Distributions 
1842*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1843*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1844*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1845*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1846*8d741a5dSApple OSS Distributions 	send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET);
1847*8d741a5dSApple OSS Distributions 
1848*8d741a5dSApple OSS Distributions 	dispatch_main();
1849*8d741a5dSApple OSS Distributions }
1850*8d741a5dSApple OSS Distributions 
1851*8d741a5dSApple OSS Distributions T_DECL(sadb_get_sastat_success, "security association get sa stat", T_META_TAG_VM_PREFERRED)
1852*8d741a5dSApple OSS Distributions {
1853*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_GETSASTAT_OOB_READ_SUCCESS;
1854*8d741a5dSApple OSS Distributions 
1855*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1856*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1857*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1858*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1859*8d741a5dSApple OSS Distributions 	send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET);
1860*8d741a5dSApple OSS Distributions 
1861*8d741a5dSApple OSS Distributions 	dispatch_main();
1862*8d741a5dSApple OSS Distributions }
1863*8d741a5dSApple OSS Distributions 
1864*8d741a5dSApple OSS Distributions T_DECL(sadb_key_migrate_address_ipv4, "security association migrate address ipv4", T_META_TAG_VM_PREFERRED)
1865*8d741a5dSApple OSS Distributions {
1866*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_EXT_MIGRATE_ADDRESS_IPv4;
1867*8d741a5dSApple OSS Distributions 
1868*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1869*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1870*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1871*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1872*8d741a5dSApple OSS Distributions 	send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET);
1873*8d741a5dSApple OSS Distributions 
1874*8d741a5dSApple OSS Distributions 	dispatch_main();
1875*8d741a5dSApple OSS Distributions }
1876*8d741a5dSApple OSS Distributions 
1877*8d741a5dSApple OSS Distributions T_DECL(sadb_key_migrate_address_ipv6, "security association migrate address ipv6", T_META_TAG_VM_PREFERRED)
1878*8d741a5dSApple OSS Distributions {
1879*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_EXT_MIGRATE_ADDRESS_IPv6;
1880*8d741a5dSApple OSS Distributions 
1881*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1882*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1883*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1884*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1885*8d741a5dSApple OSS Distributions 	send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv6, TEST_DST_ADDRESS_IPv6, AF_INET6);
1886*8d741a5dSApple OSS Distributions 
1887*8d741a5dSApple OSS Distributions 	dispatch_main();
1888*8d741a5dSApple OSS Distributions }
1889*8d741a5dSApple OSS Distributions 
1890*8d741a5dSApple OSS Distributions T_DECL(sadb_key_migrate_bad_address, "security association migrate bad address", T_META_TAG_VM_PREFERRED)
1891*8d741a5dSApple OSS Distributions {
1892*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_EXT_MIGRATE_BAD_ADDRESS;
1893*8d741a5dSApple OSS Distributions 
1894*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1895*8d741a5dSApple OSS Distributions 	T_ATEND(pfkey_cleanup);
1896*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1897*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1898*8d741a5dSApple OSS Distributions 	send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv6, TEST_DST_ADDRESS_IPv6, AF_INET6);
1899*8d741a5dSApple OSS Distributions 
1900*8d741a5dSApple OSS Distributions 	dispatch_main();
1901*8d741a5dSApple OSS Distributions }
1902*8d741a5dSApple OSS Distributions 
1903*8d741a5dSApple OSS Distributions T_DECL(tcp_input_ipsec_copy_policy, "listener policy copied to child", T_META_TAG_VM_PREFERRED)
1904*8d741a5dSApple OSS Distributions {
1905*8d741a5dSApple OSS Distributions 	test_id = TEST_TCP_INPUT_IPSEC_COPY_POLICY;
1906*8d741a5dSApple OSS Distributions 
1907*8d741a5dSApple OSS Distributions 	int server_fd = setup_tcp_server(4000);
1908*8d741a5dSApple OSS Distributions 	setup_socket_policy(server_fd);
1909*8d741a5dSApple OSS Distributions 	int client_fd = setup_loopback_tcp_client(4000);
1910*8d741a5dSApple OSS Distributions 
1911*8d741a5dSApple OSS Distributions 	sleep(3);
1912*8d741a5dSApple OSS Distributions 	close(client_fd);
1913*8d741a5dSApple OSS Distributions 	close(server_fd);
1914*8d741a5dSApple OSS Distributions 
1915*8d741a5dSApple OSS Distributions 	T_PASS("listener policy copied to child");
1916*8d741a5dSApple OSS Distributions }
1917*8d741a5dSApple OSS Distributions 
1918*8d741a5dSApple OSS Distributions T_DECL(sadb_x_spd_add_78944570, "security policy add failure", T_META_TAG_VM_PREFERRED)
1919*8d741a5dSApple OSS Distributions {
1920*8d741a5dSApple OSS Distributions 	test_id = TEST_SADB_X_SPDADD_MEMORY_LEAK_78944570;
1921*8d741a5dSApple OSS Distributions 
1922*8d741a5dSApple OSS Distributions 	int pfkey_socket = pfkey_setup_socket();
1923*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sa(pfkey_socket);
1924*8d741a5dSApple OSS Distributions 	send_pfkey_flush_sp(pfkey_socket);
1925*8d741a5dSApple OSS Distributions 	send_pfkey_spd_add_message(pfkey_socket, IPSEC_ULPROTO_ANY);
1926*8d741a5dSApple OSS Distributions 
1927*8d741a5dSApple OSS Distributions 	dispatch_main();
1928*8d741a5dSApple OSS Distributions }
1929