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