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