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