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