1*d4514f0bSApple OSS Distributions#import <darwintest.h> 2*d4514f0bSApple OSS Distributions#import <darwintest_utils.h> 3*d4514f0bSApple OSS Distributions#import <dispatch/dispatch.h> 4*d4514f0bSApple OSS Distributions#import <net/pfkeyv2.h> 5*d4514f0bSApple OSS Distributions#import <netinet6/ipsec.h> 6*d4514f0bSApple OSS Distributions#import <arpa/inet.h> 7*d4514f0bSApple OSS Distributions#import <NetworkExtension/NetworkExtensionPrivate.h> 8*d4514f0bSApple OSS Distributions#import <System/net/bpf.h> 9*d4514f0bSApple OSS Distributions#import <System/netinet/ip.h> 10*d4514f0bSApple OSS Distributions#import <System/netinet/ip6.h> 11*d4514f0bSApple OSS Distributions 12*d4514f0bSApple OSS Distributions#import <sys/mbuf.h> 13*d4514f0bSApple OSS Distributions 14*d4514f0bSApple OSS Distributions 15*d4514f0bSApple OSS DistributionsT_GLOBAL_META( 16*d4514f0bSApple OSS Distributions T_META_NAMESPACE("xnu.ipsec"), 17*d4514f0bSApple OSS Distributions T_META_ASROOT(true), 18*d4514f0bSApple OSS Distributions T_META_CHECK_LEAKS(false)); 19*d4514f0bSApple OSS Distributions 20*d4514f0bSApple OSS Distributionstypedef enum { 21*d4514f0bSApple OSS Distributions TEST_INVALID = 0, 22*d4514f0bSApple OSS Distributions TEST_IPSEC_IPv4_ENCAPSULATE_PANIC = 1, 23*d4514f0bSApple OSS Distributions TEST_IPSEC_IPv6_ENCAPSULATE_PANIC = 2, 24*d4514f0bSApple OSS Distributions} test_identifier; 25*d4514f0bSApple OSS Distributions 26*d4514f0bSApple OSS Distributions#define TEST_SRC_ADDRESS_IPv4 "10.0.0.2" 27*d4514f0bSApple OSS Distributions#define TEST_DST_ADDRESS_IPv4 "10.0.0.3" 28*d4514f0bSApple OSS Distributions#define TEST_IPSEC_IPv4_INTERFACE_ADDRESS "192.168.10.10" 29*d4514f0bSApple OSS Distributions#define TEST_IPSEC_IPv6_INTERFACE_ADDRESS "fdd3:0f89:9afd:9b9c::1234" 30*d4514f0bSApple OSS Distributions#define TEST_DELEGATE_IPSEC_INTERFACE_ADDRESS "192.168.20.10" 31*d4514f0bSApple OSS Distributions#define TEST_IPSEC_IPv4_INTERFACE_MASK "255.255.255.255" 32*d4514f0bSApple OSS Distributions#define TEST_IPSEC_IPv6_INTERFACE_MASK "ffff:ffff:ffff:ffff::" 33*d4514f0bSApple OSS Distributions 34*d4514f0bSApple OSS Distributionsstatic test_identifier test_id = TEST_INVALID; 35*d4514f0bSApple OSS Distributionsstatic dispatch_source_t pfkey_source = NULL; 36*d4514f0bSApple OSS Distributionsstatic NEVirtualInterfaceRef ipsecInterface = NULL; 37*d4514f0bSApple OSS Distributionsstatic NEVirtualInterfaceRef delegateIPsecInterface = NULL; 38*d4514f0bSApple OSS Distributionsstatic int bpf_fd = -1; 39*d4514f0bSApple OSS Distributions 40*d4514f0bSApple OSS Distributionsstatic void bpf_write(int fd); 41*d4514f0bSApple OSS Distributionsstatic void pfkey_cleanup(void); 42*d4514f0bSApple OSS Distributionsstatic void pfkey_process_message_test_encapsulate_panic(uint8_t **mhp, int pfkey_socket); 43*d4514f0bSApple OSS Distributions 44*d4514f0bSApple OSS Distributionsstatic void(*const process_pfkey_message_tests[])(uint8_t * *mhp, int pfkey_socket) = 45*d4514f0bSApple OSS Distributions{ 46*d4514f0bSApple OSS Distributions NULL, 47*d4514f0bSApple OSS Distributions pfkey_process_message_test_encapsulate_panic, // TEST_IPSEC_IPv4_ENCAPSULATE_PANIC 48*d4514f0bSApple OSS Distributions pfkey_process_message_test_encapsulate_panic, // TEST_IPSEC_IPv6_ENCAPSULATE_PANIC 49*d4514f0bSApple OSS Distributions}; 50*d4514f0bSApple OSS Distributions 51*d4514f0bSApple OSS Distributionsstatic void 52*d4514f0bSApple OSS Distributionssend_pkey_add_sa(int pfkey_socket, uint32_t spi, const char *src, const char *dst, int family) 53*d4514f0bSApple OSS Distributions{ 54*d4514f0bSApple OSS Distributions uint8_t payload[MCLBYTES] __attribute__ ((aligned(32))); 55*d4514f0bSApple OSS Distributions bzero(payload, sizeof(payload)); 56*d4514f0bSApple OSS Distributions uint16_t tlen = 0; 57*d4514f0bSApple OSS Distributions 58*d4514f0bSApple OSS Distributions struct sadb_msg *msg_payload = (struct sadb_msg *)payload; 59*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_version = PF_KEY_V2; 60*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_type = SADB_ADD; 61*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_errno = 0; 62*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_satype = SADB_SATYPE_ESP; 63*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen); 64*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_reserved = 0; 65*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_seq = 0; 66*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_pid = (u_int32_t)getpid(); 67*d4514f0bSApple OSS Distributions tlen += sizeof(*msg_payload); 68*d4514f0bSApple OSS Distributions 69*d4514f0bSApple OSS Distributions struct sadb_sa_2 *sa2_payload = (struct sadb_sa_2 *)(void *)(payload + tlen); 70*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_len = PFKEY_UNIT64(sizeof(*sa2_payload)); 71*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_exttype = SADB_EXT_SA; 72*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_spi = htonl(spi); 73*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_replay = 4; 74*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_state = SADB_SASTATE_LARVAL; 75*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_auth = SADB_X_AALG_SHA2_256; 76*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_encrypt = SADB_X_EALG_AESCBC; 77*d4514f0bSApple OSS Distributions sa2_payload->sa.sadb_sa_flags |= (SADB_X_EXT_NATT | SADB_X_EXT_NATT_KEEPALIVE); 78*d4514f0bSApple OSS Distributions sa2_payload->sadb_sa_natt_src_port = htons(4500); 79*d4514f0bSApple OSS Distributions sa2_payload->sadb_sa_natt_port = 4500; 80*d4514f0bSApple OSS Distributions sa2_payload->sadb_sa_natt_interval = 20; 81*d4514f0bSApple OSS Distributions sa2_payload->sadb_sa_natt_offload_interval = 0; 82*d4514f0bSApple OSS Distributions tlen += sizeof(*sa2_payload); 83*d4514f0bSApple OSS Distributions 84*d4514f0bSApple OSS Distributions struct sadb_x_sa2 *sa2_x_payload = (struct sadb_x_sa2 *)(void *)(payload + tlen); 85*d4514f0bSApple OSS Distributions sa2_x_payload->sadb_x_sa2_len = PFKEY_UNIT64(sizeof(*sa2_x_payload)); 86*d4514f0bSApple OSS Distributions sa2_x_payload->sadb_x_sa2_exttype = SADB_X_EXT_SA2; 87*d4514f0bSApple OSS Distributions sa2_x_payload->sadb_x_sa2_mode = IPSEC_MODE_TUNNEL; 88*d4514f0bSApple OSS Distributions sa2_x_payload->sadb_x_sa2_reqid = 0; 89*d4514f0bSApple OSS Distributions tlen += sizeof(*sa2_x_payload); 90*d4514f0bSApple OSS Distributions 91*d4514f0bSApple OSS Distributions uint8_t prefixlen = (family == AF_INET) ? (sizeof(struct in_addr) << 3) : (sizeof(struct in6_addr) << 3); 92*d4514f0bSApple OSS Distributions 93*d4514f0bSApple OSS Distributions struct sadb_address *src_address_payload = (struct sadb_address *)(void *)(payload + tlen); 94*d4514f0bSApple OSS Distributions src_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_SRC & 0xffff; 95*d4514f0bSApple OSS Distributions src_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff; 96*d4514f0bSApple OSS Distributions src_address_payload->sadb_address_prefixlen = prefixlen; 97*d4514f0bSApple OSS Distributions src_address_payload->sadb_address_reserved = 0; 98*d4514f0bSApple OSS Distributions tlen += sizeof(*src_address_payload); 99*d4514f0bSApple OSS Distributions 100*d4514f0bSApple OSS Distributions if (family == AF_INET) { 101*d4514f0bSApple OSS Distributions struct sockaddr_in *src4 = (struct sockaddr_in *)(void *)(payload + tlen); 102*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, src, &src4->sin_addr), 1, "src address fail"); 103*d4514f0bSApple OSS Distributions src4->sin_family = AF_INET; 104*d4514f0bSApple OSS Distributions src4->sin_len = sizeof(*src4); 105*d4514f0bSApple OSS Distributions uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src4->sin_len); 106*d4514f0bSApple OSS Distributions src_address_payload->sadb_address_len = PFKEY_UNIT64(len); 107*d4514f0bSApple OSS Distributions tlen += PFKEY_ALIGN8(src4->sin_len); 108*d4514f0bSApple OSS Distributions } else { 109*d4514f0bSApple OSS Distributions struct sockaddr_in6 *src6 = (struct sockaddr_in6 *)(void *)(payload + tlen); 110*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, src, &src6->sin6_addr), 1, "src address fail"); 111*d4514f0bSApple OSS Distributions src6->sin6_family = AF_INET6; 112*d4514f0bSApple OSS Distributions src6->sin6_len = sizeof(*src6); 113*d4514f0bSApple OSS Distributions uint16_t len = sizeof(*src_address_payload) + PFKEY_ALIGN8(src6->sin6_len); 114*d4514f0bSApple OSS Distributions src_address_payload->sadb_address_len = PFKEY_UNIT64(len); 115*d4514f0bSApple OSS Distributions tlen += PFKEY_ALIGN8(src6->sin6_len); 116*d4514f0bSApple OSS Distributions } 117*d4514f0bSApple OSS Distributions 118*d4514f0bSApple OSS Distributions struct sadb_address *dst_address_payload = (struct sadb_address *)(void *)(payload + tlen); 119*d4514f0bSApple OSS Distributions dst_address_payload->sadb_address_exttype = SADB_EXT_ADDRESS_DST & 0xffff; 120*d4514f0bSApple OSS Distributions dst_address_payload->sadb_address_proto = IPSEC_ULPROTO_ANY & 0xff; 121*d4514f0bSApple OSS Distributions dst_address_payload->sadb_address_prefixlen = prefixlen; 122*d4514f0bSApple OSS Distributions dst_address_payload->sadb_address_reserved = 0; 123*d4514f0bSApple OSS Distributions tlen += sizeof(*dst_address_payload); 124*d4514f0bSApple OSS Distributions 125*d4514f0bSApple OSS Distributions if (family == AF_INET) { 126*d4514f0bSApple OSS Distributions struct sockaddr_in *dst4 = (struct sockaddr_in *)(void *)(payload + tlen); 127*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET, dst, &dst4->sin_addr), 1, "dst address fail"); 128*d4514f0bSApple OSS Distributions dst4->sin_family = AF_INET; 129*d4514f0bSApple OSS Distributions dst4->sin_len = sizeof(*dst4); 130*d4514f0bSApple OSS Distributions uint16_t len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst4->sin_len); 131*d4514f0bSApple OSS Distributions dst_address_payload->sadb_address_len = PFKEY_UNIT64(len); 132*d4514f0bSApple OSS Distributions tlen += PFKEY_ALIGN8(dst4->sin_len); 133*d4514f0bSApple OSS Distributions } else { 134*d4514f0bSApple OSS Distributions struct sockaddr_in6 *dst6 = (struct sockaddr_in6 *)(void *)(payload + tlen); 135*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_EQ_INT(inet_pton(AF_INET6, dst, &dst6->sin6_addr), 1, "dst address fail"); 136*d4514f0bSApple OSS Distributions dst6->sin6_family = AF_INET6; 137*d4514f0bSApple OSS Distributions dst6->sin6_len = sizeof(*dst6); 138*d4514f0bSApple OSS Distributions uint16_t len = sizeof(*dst_address_payload) + PFKEY_ALIGN8(dst6->sin6_len); 139*d4514f0bSApple OSS Distributions dst_address_payload->sadb_address_len = PFKEY_UNIT64(len); 140*d4514f0bSApple OSS Distributions tlen += PFKEY_ALIGN8(dst6->sin6_len); 141*d4514f0bSApple OSS Distributions } 142*d4514f0bSApple OSS Distributions 143*d4514f0bSApple OSS Distributions CFStringRef ipsecIfName = NEVirtualInterfaceCopyName(ipsecInterface); 144*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(ipsecIfName, "failed to get ipsec interface name"); 145*d4514f0bSApple OSS Distributions char ifname[IFNAMSIZ]; 146*d4514f0bSApple OSS Distributions CFStringGetCString(ipsecIfName, ifname, IFNAMSIZ, kCFStringEncodingUTF8); 147*d4514f0bSApple OSS Distributions 148*d4514f0bSApple OSS Distributions CFStringRef delegateIPsecIfName = NEVirtualInterfaceCopyName(delegateIPsecInterface); 149*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(delegateIPsecIfName, "failed to get delegate ipsec interface name"); 150*d4514f0bSApple OSS Distributions char delegateIfname[IFNAMSIZ]; 151*d4514f0bSApple OSS Distributions CFStringGetCString(delegateIPsecIfName, delegateIfname, IFNAMSIZ, kCFStringEncodingUTF8); 152*d4514f0bSApple OSS Distributions 153*d4514f0bSApple OSS Distributions struct sadb_x_ipsecif *ipsec_if_payload = (struct sadb_x_ipsecif *)(void *)(payload + tlen); 154*d4514f0bSApple OSS Distributions ipsec_if_payload->sadb_x_ipsecif_len = PFKEY_UNIT64(sizeof(*ipsec_if_payload)); 155*d4514f0bSApple OSS Distributions ipsec_if_payload->sadb_x_ipsecif_exttype = SADB_X_EXT_IPSECIF; 156*d4514f0bSApple OSS Distributions strncpy(ipsec_if_payload->sadb_x_ipsecif_ipsec_if, ifname, strlen(ifname)); 157*d4514f0bSApple OSS Distributions strncpy(ipsec_if_payload->sadb_x_ipsecif_outgoing_if, delegateIfname, strlen(delegateIfname)); 158*d4514f0bSApple OSS Distributions tlen += sizeof(*ipsec_if_payload); 159*d4514f0bSApple OSS Distributions 160*d4514f0bSApple OSS Distributions struct sadb_key *encrypt_key_payload = (struct sadb_key *)(void *)(payload + tlen); 161*d4514f0bSApple OSS Distributions uint16_t len = sizeof(*encrypt_key_payload) + PFKEY_ALIGN8(32); 162*d4514f0bSApple OSS Distributions encrypt_key_payload->sadb_key_len = PFKEY_UNIT64(len); 163*d4514f0bSApple OSS Distributions encrypt_key_payload->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT; 164*d4514f0bSApple OSS Distributions encrypt_key_payload->sadb_key_bits = (uint16_t)(32 << 3); 165*d4514f0bSApple OSS Distributions encrypt_key_payload->sadb_key_reserved = 0; 166*d4514f0bSApple OSS Distributions tlen += sizeof(*encrypt_key_payload); 167*d4514f0bSApple OSS Distributions arc4random_buf(payload + tlen, 32); 168*d4514f0bSApple OSS Distributions tlen += PFKEY_ALIGN8(32); 169*d4514f0bSApple OSS Distributions 170*d4514f0bSApple OSS Distributions struct sadb_key *auth_key_payload = (struct sadb_key *)(void *)(payload + tlen); 171*d4514f0bSApple OSS Distributions len = sizeof(*auth_key_payload) + PFKEY_ALIGN8(32); 172*d4514f0bSApple OSS Distributions auth_key_payload->sadb_key_len = PFKEY_UNIT64(len); 173*d4514f0bSApple OSS Distributions auth_key_payload->sadb_key_exttype = SADB_EXT_KEY_AUTH; 174*d4514f0bSApple OSS Distributions auth_key_payload->sadb_key_bits = (uint16_t)(32 << 3); 175*d4514f0bSApple OSS Distributions auth_key_payload->sadb_key_reserved = 0; 176*d4514f0bSApple OSS Distributions tlen += sizeof(*auth_key_payload); 177*d4514f0bSApple OSS Distributions arc4random_buf(payload + tlen, 32); 178*d4514f0bSApple OSS Distributions tlen += PFKEY_ALIGN8(32); 179*d4514f0bSApple OSS Distributions 180*d4514f0bSApple OSS Distributions struct sadb_lifetime *hard_lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen); 181*d4514f0bSApple OSS Distributions hard_lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*hard_lifetime_payload)); 182*d4514f0bSApple OSS Distributions hard_lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD; 183*d4514f0bSApple OSS Distributions tlen += sizeof(*hard_lifetime_payload); 184*d4514f0bSApple OSS Distributions 185*d4514f0bSApple OSS Distributions struct sadb_lifetime *soft_lifetime_payload = (struct sadb_lifetime *)(void *)(payload + tlen); 186*d4514f0bSApple OSS Distributions soft_lifetime_payload->sadb_lifetime_len = PFKEY_UNIT64(sizeof(*soft_lifetime_payload)); 187*d4514f0bSApple OSS Distributions soft_lifetime_payload->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT; 188*d4514f0bSApple OSS Distributions tlen += sizeof(*soft_lifetime_payload); 189*d4514f0bSApple OSS Distributions 190*d4514f0bSApple OSS Distributions // Update the total length 191*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen); 192*d4514f0bSApple 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"); 193*d4514f0bSApple OSS Distributions} 194*d4514f0bSApple OSS Distributions 195*d4514f0bSApple OSS Distributionsstatic void 196*d4514f0bSApple OSS Distributionssend_pfkey_flush_sa(int pfkey_socket) 197*d4514f0bSApple OSS Distributions{ 198*d4514f0bSApple OSS Distributions uint8_t payload[MCLBYTES] __attribute__ ((aligned(32))); 199*d4514f0bSApple OSS Distributions bzero(payload, sizeof(payload)); 200*d4514f0bSApple OSS Distributions uint16_t tlen = 0; 201*d4514f0bSApple OSS Distributions 202*d4514f0bSApple OSS Distributions struct sadb_msg *msg_payload = (struct sadb_msg *)payload; 203*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_version = PF_KEY_V2; 204*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_type = SADB_FLUSH; 205*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_errno = 0; 206*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_satype = SADB_SATYPE_UNSPEC; 207*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen); 208*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_reserved = 0; 209*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_seq = 0; 210*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_pid = (u_int32_t)getpid(); 211*d4514f0bSApple OSS Distributions tlen += sizeof(*msg_payload); 212*d4514f0bSApple OSS Distributions 213*d4514f0bSApple OSS Distributions // Update the total length 214*d4514f0bSApple OSS Distributions msg_payload->sadb_msg_len = PFKEY_UNIT64(tlen); 215*d4514f0bSApple 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"); 216*d4514f0bSApple OSS Distributions} 217*d4514f0bSApple OSS Distributions 218*d4514f0bSApple OSS Distributionsstatic void 219*d4514f0bSApple OSS Distributionspfkey_cleanup(void) 220*d4514f0bSApple OSS Distributions{ 221*d4514f0bSApple OSS Distributions if (pfkey_source != NULL) { 222*d4514f0bSApple OSS Distributions int pfkey_socket = (int)dispatch_source_get_handle(pfkey_source); 223*d4514f0bSApple OSS Distributions if (pfkey_socket > 0) { 224*d4514f0bSApple OSS Distributions send_pfkey_flush_sa(pfkey_socket); 225*d4514f0bSApple OSS Distributions } 226*d4514f0bSApple OSS Distributions dispatch_source_cancel(pfkey_source); 227*d4514f0bSApple OSS Distributions pfkey_source = NULL; 228*d4514f0bSApple OSS Distributions } 229*d4514f0bSApple OSS Distributions} 230*d4514f0bSApple OSS Distributions 231*d4514f0bSApple OSS Distributionsstatic void 232*d4514f0bSApple OSS Distributionspfkey_align(struct sadb_msg *msg, uint8_t **mhp) 233*d4514f0bSApple OSS Distributions{ 234*d4514f0bSApple OSS Distributions struct sadb_ext *ext; 235*d4514f0bSApple OSS Distributions int i; 236*d4514f0bSApple OSS Distributions uint8_t *p; 237*d4514f0bSApple OSS Distributions uint8_t *ep; /* XXX should be passed from upper layer */ 238*d4514f0bSApple OSS Distributions 239*d4514f0bSApple OSS Distributions /* validity check */ 240*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(msg, "pfkey align msg"); 241*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(mhp, "pfkey align mhp"); 242*d4514f0bSApple OSS Distributions 243*d4514f0bSApple OSS Distributions /* initialize */ 244*d4514f0bSApple OSS Distributions for (i = 0; i < SADB_EXT_MAX + 1; i++) { 245*d4514f0bSApple OSS Distributions mhp[i] = NULL; 246*d4514f0bSApple OSS Distributions } 247*d4514f0bSApple OSS Distributions 248*d4514f0bSApple OSS Distributions mhp[0] = (void *)msg; 249*d4514f0bSApple OSS Distributions 250*d4514f0bSApple OSS Distributions /* initialize */ 251*d4514f0bSApple OSS Distributions p = (void *) msg; 252*d4514f0bSApple OSS Distributions ep = p + PFKEY_UNUNIT64(msg->sadb_msg_len); 253*d4514f0bSApple OSS Distributions 254*d4514f0bSApple OSS Distributions /* skip base header */ 255*d4514f0bSApple OSS Distributions p += sizeof(struct sadb_msg); 256*d4514f0bSApple OSS Distributions 257*d4514f0bSApple OSS Distributions while (p < ep) { 258*d4514f0bSApple OSS Distributions ext = (void *)p; 259*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_GE_PTR((void *)ep, (void *)(p + sizeof(*ext)), "pfkey extension header beyond end of buffer"); 260*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_GE_ULONG((unsigned long)PFKEY_EXTLEN(ext), sizeof(*ext), "pfkey extension shorter than extension header"); 261*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_GE_PTR((void *)ep, (void *)(p + PFKEY_EXTLEN(ext)), "pfkey extension length beyond end of buffer"); 262*d4514f0bSApple OSS Distributions 263*d4514f0bSApple OSS Distributions T_QUIET; T_EXPECT_NULL(mhp[ext->sadb_ext_type], "duplicate extension type %u payload", ext->sadb_ext_type); 264*d4514f0bSApple OSS Distributions 265*d4514f0bSApple OSS Distributions /* set pointer */ 266*d4514f0bSApple OSS Distributions switch (ext->sadb_ext_type) { 267*d4514f0bSApple OSS Distributions case SADB_EXT_SA: 268*d4514f0bSApple OSS Distributions case SADB_EXT_LIFETIME_CURRENT: 269*d4514f0bSApple OSS Distributions case SADB_EXT_LIFETIME_HARD: 270*d4514f0bSApple OSS Distributions case SADB_EXT_LIFETIME_SOFT: 271*d4514f0bSApple OSS Distributions case SADB_EXT_ADDRESS_SRC: 272*d4514f0bSApple OSS Distributions case SADB_EXT_ADDRESS_DST: 273*d4514f0bSApple OSS Distributions case SADB_EXT_ADDRESS_PROXY: 274*d4514f0bSApple OSS Distributions case SADB_EXT_KEY_AUTH: 275*d4514f0bSApple OSS Distributions /* XXX should to be check weak keys. */ 276*d4514f0bSApple OSS Distributions case SADB_EXT_KEY_ENCRYPT: 277*d4514f0bSApple OSS Distributions /* XXX should to be check weak keys. */ 278*d4514f0bSApple OSS Distributions case SADB_EXT_IDENTITY_SRC: 279*d4514f0bSApple OSS Distributions case SADB_EXT_IDENTITY_DST: 280*d4514f0bSApple OSS Distributions case SADB_EXT_SENSITIVITY: 281*d4514f0bSApple OSS Distributions case SADB_EXT_PROPOSAL: 282*d4514f0bSApple OSS Distributions case SADB_EXT_SUPPORTED_AUTH: 283*d4514f0bSApple OSS Distributions case SADB_EXT_SUPPORTED_ENCRYPT: 284*d4514f0bSApple OSS Distributions case SADB_EXT_SPIRANGE: 285*d4514f0bSApple OSS Distributions case SADB_X_EXT_POLICY: 286*d4514f0bSApple OSS Distributions case SADB_X_EXT_SA2: 287*d4514f0bSApple OSS Distributions case SADB_EXT_SESSION_ID: 288*d4514f0bSApple OSS Distributions case SADB_EXT_SASTAT: 289*d4514f0bSApple OSS Distributions#ifdef SADB_X_EXT_NAT_T_TYPE 290*d4514f0bSApple OSS Distributions case SADB_X_EXT_NAT_T_TYPE: 291*d4514f0bSApple OSS Distributions case SADB_X_EXT_NAT_T_SPORT: 292*d4514f0bSApple OSS Distributions case SADB_X_EXT_NAT_T_DPORT: 293*d4514f0bSApple OSS Distributions case SADB_X_EXT_NAT_T_OA: 294*d4514f0bSApple OSS Distributions#endif 295*d4514f0bSApple OSS Distributions#ifdef SADB_X_EXT_TAG 296*d4514f0bSApple OSS Distributions case SADB_X_EXT_TAG: 297*d4514f0bSApple OSS Distributions#endif 298*d4514f0bSApple OSS Distributions#ifdef SADB_X_EXT_PACKET 299*d4514f0bSApple OSS Distributions case SADB_X_EXT_PACKET: 300*d4514f0bSApple OSS Distributions#endif 301*d4514f0bSApple OSS Distributions case SADB_X_EXT_IPSECIF: 302*d4514f0bSApple OSS Distributions case SADB_X_EXT_ADDR_RANGE_SRC_START: 303*d4514f0bSApple OSS Distributions case SADB_X_EXT_ADDR_RANGE_SRC_END: 304*d4514f0bSApple OSS Distributions case SADB_X_EXT_ADDR_RANGE_DST_START: 305*d4514f0bSApple OSS Distributions case SADB_X_EXT_ADDR_RANGE_DST_END: 306*d4514f0bSApple OSS Distributions#ifdef SADB_MIGRATE 307*d4514f0bSApple OSS Distributions case SADB_EXT_MIGRATE_ADDRESS_SRC: 308*d4514f0bSApple OSS Distributions case SADB_EXT_MIGRATE_ADDRESS_DST: 309*d4514f0bSApple OSS Distributions case SADB_X_EXT_MIGRATE_IPSECIF: 310*d4514f0bSApple OSS Distributions#endif 311*d4514f0bSApple OSS Distributions mhp[ext->sadb_ext_type] = (void *)ext; 312*d4514f0bSApple OSS Distributions break; 313*d4514f0bSApple OSS Distributions default: 314*d4514f0bSApple OSS Distributions T_FAIL("bad extension type %u", ext->sadb_ext_type); 315*d4514f0bSApple OSS Distributions T_END; 316*d4514f0bSApple OSS Distributions } 317*d4514f0bSApple OSS Distributions 318*d4514f0bSApple OSS Distributions p += PFKEY_EXTLEN(ext); 319*d4514f0bSApple OSS Distributions } 320*d4514f0bSApple OSS Distributions 321*d4514f0bSApple OSS Distributions T_QUIET; T_EXPECT_EQ_PTR((void *)ep, (void *)p, "invalid pfkey message length"); 322*d4514f0bSApple OSS Distributions return; 323*d4514f0bSApple OSS Distributions} 324*d4514f0bSApple OSS Distributions 325*d4514f0bSApple OSS Distributionsstatic void 326*d4514f0bSApple OSS Distributionspfkey_process_message_test_encapsulate_panic(uint8_t **mhp, __unused int pfkey_socket) 327*d4514f0bSApple OSS Distributions{ 328*d4514f0bSApple OSS Distributions struct sadb_msg *message = (struct sadb_msg *)(void *)mhp[0]; 329*d4514f0bSApple OSS Distributions static uint32_t spi = 0; 330*d4514f0bSApple OSS Distributions static uint8_t added_sa_counter = 0; 331*d4514f0bSApple OSS Distributions 332*d4514f0bSApple OSS Distributions if (message->sadb_msg_pid != (uint32_t)getpid()) { 333*d4514f0bSApple OSS Distributions return; 334*d4514f0bSApple OSS Distributions } 335*d4514f0bSApple OSS Distributions 336*d4514f0bSApple OSS Distributions if (message->sadb_msg_errno != 0) { 337*d4514f0bSApple OSS Distributions T_FAIL("SADB add SA received error %d", message->sadb_msg_errno); 338*d4514f0bSApple OSS Distributions T_END; 339*d4514f0bSApple OSS Distributions } 340*d4514f0bSApple OSS Distributions 341*d4514f0bSApple OSS Distributions switch (message->sadb_msg_type) { 342*d4514f0bSApple OSS Distributions case SADB_ADD: 343*d4514f0bSApple OSS Distributions { 344*d4514f0bSApple OSS Distributions struct sadb_sa *sa_message = (struct sadb_sa *)(void *)mhp[SADB_EXT_SA]; 345*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(sa_message, "add sa message is NULL"); 346*d4514f0bSApple OSS Distributions spi = ntohl(sa_message->sadb_sa_spi); 347*d4514f0bSApple OSS Distributions T_LOG("added sa 0x%x", spi); 348*d4514f0bSApple OSS Distributions added_sa_counter++; 349*d4514f0bSApple OSS Distributions if (added_sa_counter == 2) { 350*d4514f0bSApple OSS Distributions bpf_write(bpf_fd); 351*d4514f0bSApple OSS Distributions } 352*d4514f0bSApple OSS Distributions break; 353*d4514f0bSApple OSS Distributions } 354*d4514f0bSApple OSS Distributions case SADB_FLUSH: 355*d4514f0bSApple OSS Distributions case SADB_X_SPDFLUSH: 356*d4514f0bSApple OSS Distributions break; 357*d4514f0bSApple OSS Distributions default: 358*d4514f0bSApple OSS Distributions T_FAIL("bad SADB message type %u", message->sadb_msg_type); 359*d4514f0bSApple OSS Distributions T_END; 360*d4514f0bSApple OSS Distributions } 361*d4514f0bSApple OSS Distributions return; 362*d4514f0bSApple OSS Distributions} 363*d4514f0bSApple OSS Distributions 364*d4514f0bSApple OSS Distributionsstatic void 365*d4514f0bSApple OSS Distributionsrecv_pfkey_message(int pfkey_socket) 366*d4514f0bSApple OSS Distributions{ 367*d4514f0bSApple OSS Distributions uint8_t buffer[8192] __attribute__((aligned(4))); 368*d4514f0bSApple OSS Distributions struct iovec iovecs[1] = { 369*d4514f0bSApple OSS Distributions { buffer, sizeof(buffer) }, 370*d4514f0bSApple OSS Distributions }; 371*d4514f0bSApple OSS Distributions struct msghdr msg = { 372*d4514f0bSApple OSS Distributions NULL, 373*d4514f0bSApple OSS Distributions 0, 374*d4514f0bSApple OSS Distributions iovecs, 375*d4514f0bSApple OSS Distributions sizeof(iovecs) / sizeof(iovecs[0]), 376*d4514f0bSApple OSS Distributions NULL, 377*d4514f0bSApple OSS Distributions 0, 378*d4514f0bSApple OSS Distributions 0, 379*d4514f0bSApple OSS Distributions }; 380*d4514f0bSApple OSS Distributions 381*d4514f0bSApple OSS Distributions do { 382*d4514f0bSApple OSS Distributions ssize_t result = -1; 383*d4514f0bSApple OSS Distributions memset(buffer, 0, sizeof(buffer)); 384*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(result = recvmsg(pfkey_socket, &msg, 0), NULL); 385*d4514f0bSApple OSS Distributions 386*d4514f0bSApple OSS Distributions if (result > 0) { 387*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_GE_ULONG((size_t)result, sizeof(struct sadb_msg), "Invalid PFKey message size: %zu", result); 388*d4514f0bSApple OSS Distributions struct sadb_msg *hdr = (struct sadb_msg *)buffer; 389*d4514f0bSApple OSS Distributions uint8_t *mhp[SADB_EXT_MAX + 1]; 390*d4514f0bSApple OSS Distributions pfkey_align(hdr, mhp); 391*d4514f0bSApple OSS Distributions (*process_pfkey_message_tests[test_id])(mhp, pfkey_socket); 392*d4514f0bSApple OSS Distributions } else if (result == 0) { 393*d4514f0bSApple OSS Distributions T_LOG("PFKey socket received EOF"); 394*d4514f0bSApple OSS Distributions break; 395*d4514f0bSApple OSS Distributions } 396*d4514f0bSApple OSS Distributions } while (1); 397*d4514f0bSApple OSS Distributions} 398*d4514f0bSApple OSS Distributions 399*d4514f0bSApple OSS Distributionsstatic int 400*d4514f0bSApple OSS Distributionspfkey_setup_socket(void) 401*d4514f0bSApple OSS Distributions{ 402*d4514f0bSApple OSS Distributions int pfkey_socket = -1; 403*d4514f0bSApple OSS Distributions 404*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(pfkey_socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2), NULL); 405*d4514f0bSApple OSS Distributions 406*d4514f0bSApple OSS Distributions struct mbstat mbstat; 407*d4514f0bSApple OSS Distributions size_t len_mbstat = sizeof(struct mbstat); 408*d4514f0bSApple OSS Distributions 409*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(sysctlbyname("kern.ipc.mbstat", &mbstat, &len_mbstat, NULL, 0), "kern.ipc.mbstat"); 410*d4514f0bSApple OSS Distributions 411*d4514f0bSApple OSS Distributions int bufsiz = 0; 412*d4514f0bSApple OSS Distributions const unsigned long newbufk = 1536; 413*d4514f0bSApple OSS Distributions unsigned long oldmax; 414*d4514f0bSApple OSS Distributions size_t oldmaxsize = sizeof(oldmax); 415*d4514f0bSApple OSS Distributions unsigned long newmax = newbufk * (1024 + mbstat.m_msize / 2); 416*d4514f0bSApple OSS Distributions 417*d4514f0bSApple OSS Distributions if (sysctlbyname("kern.ipc.maxsockbuf", &oldmax, &oldmaxsize, &newmax, sizeof(newmax)) != 0) { 418*d4514f0bSApple OSS Distributions bufsiz = 233016; /* Max allowed by default */ 419*d4514f0bSApple OSS Distributions } else { 420*d4514f0bSApple OSS Distributions bufsiz = newbufk * 1024; 421*d4514f0bSApple OSS Distributions } 422*d4514f0bSApple OSS Distributions 423*d4514f0bSApple 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); 424*d4514f0bSApple 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); 425*d4514f0bSApple OSS Distributions 426*d4514f0bSApple OSS Distributions pfkey_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, (uintptr_t)pfkey_socket, 0, dispatch_get_main_queue()); 427*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(pfkey_source, "dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, ...)"); 428*d4514f0bSApple OSS Distributions dispatch_source_set_event_handler(pfkey_source, ^{ 429*d4514f0bSApple OSS Distributions recv_pfkey_message(pfkey_socket); 430*d4514f0bSApple OSS Distributions }); 431*d4514f0bSApple OSS Distributions dispatch_source_set_cancel_handler(pfkey_source, ^{ 432*d4514f0bSApple OSS Distributions close(pfkey_socket); 433*d4514f0bSApple OSS Distributions }); 434*d4514f0bSApple OSS Distributions dispatch_resume(pfkey_source); 435*d4514f0bSApple OSS Distributions return pfkey_socket; 436*d4514f0bSApple OSS Distributions} 437*d4514f0bSApple OSS Distributions 438*d4514f0bSApple OSS Distributionsstatic int 439*d4514f0bSApple OSS Distributionsbpf_new(void) 440*d4514f0bSApple OSS Distributions{ 441*d4514f0bSApple OSS Distributions char bpfdev[256]; 442*d4514f0bSApple OSS Distributions int i; 443*d4514f0bSApple OSS Distributions int fd = -1; 444*d4514f0bSApple OSS Distributions 445*d4514f0bSApple OSS Distributions for (i = 0; true; i++) { 446*d4514f0bSApple OSS Distributions snprintf(bpfdev, sizeof(bpfdev), "/dev/bpf%d", i); 447*d4514f0bSApple OSS Distributions fd = open(bpfdev, O_RDWR, 0); 448*d4514f0bSApple OSS Distributions if (fd >= 0) { 449*d4514f0bSApple OSS Distributions break; 450*d4514f0bSApple OSS Distributions } 451*d4514f0bSApple OSS Distributions if (errno != EBUSY) { 452*d4514f0bSApple OSS Distributions break; 453*d4514f0bSApple OSS Distributions } 454*d4514f0bSApple OSS Distributions } 455*d4514f0bSApple OSS Distributions return fd; 456*d4514f0bSApple OSS Distributions} 457*d4514f0bSApple OSS Distributions 458*d4514f0bSApple OSS Distributionsstatic int 459*d4514f0bSApple OSS Distributionsbpf_setif(int fd, const char *en_name) 460*d4514f0bSApple OSS Distributions{ 461*d4514f0bSApple OSS Distributions struct ifreq ifr; 462*d4514f0bSApple OSS Distributions 463*d4514f0bSApple OSS Distributions strlcpy(ifr.ifr_name, en_name, sizeof(ifr.ifr_name)); 464*d4514f0bSApple OSS Distributions return ioctl(fd, BIOCSETIF, &ifr); 465*d4514f0bSApple OSS Distributions} 466*d4514f0bSApple OSS Distributions 467*d4514f0bSApple OSS Distributionsstatic int 468*d4514f0bSApple OSS Distributionsbpf_sethdr_complete(int fd) 469*d4514f0bSApple OSS Distributions{ 470*d4514f0bSApple OSS Distributions u_int8_t hdr_complete = 1; 471*d4514f0bSApple OSS Distributions return ioctl(fd, BIOCSHDRCMPLT, &hdr_complete); 472*d4514f0bSApple OSS Distributions} 473*d4514f0bSApple OSS Distributions 474*d4514f0bSApple OSS Distributionsstatic void 475*d4514f0bSApple OSS Distributionsbpf_write(int fd) 476*d4514f0bSApple OSS Distributions{ 477*d4514f0bSApple OSS Distributions if (test_id == TEST_IPSEC_IPv4_ENCAPSULATE_PANIC) { 478*d4514f0bSApple OSS Distributions char buffer[500]; 479*d4514f0bSApple OSS Distributions struct ip *ipheader = (void *)buffer; 480*d4514f0bSApple OSS Distributions ipheader->ip_v = IPVERSION; 481*d4514f0bSApple OSS Distributions ipheader->ip_hl = (sizeof(struct ip) - 4) >> 2; 482*d4514f0bSApple OSS Distributions ipheader->ip_ttl = MAXTTL; 483*d4514f0bSApple OSS Distributions ipheader->ip_p = IPPROTO_UDP; 484*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(write(fd, buffer, 500), "bpf write call failed"); 485*d4514f0bSApple OSS Distributions T_PASS("wrote bad ip header successfully"); 486*d4514f0bSApple OSS Distributions T_END; 487*d4514f0bSApple OSS Distributions } else if (test_id == TEST_IPSEC_IPv6_ENCAPSULATE_PANIC) { 488*d4514f0bSApple OSS Distributions struct ip6_hdr ip6 = {0}; 489*d4514f0bSApple OSS Distributions ip6.ip6_vfc |= IPV6_VERSION; 490*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(write(fd, &ip6, sizeof(ip6) - 4), "bpf write call failed"); 491*d4514f0bSApple OSS Distributions T_PASS("wrote bad ipv6 header successfully"); 492*d4514f0bSApple OSS Distributions T_END; 493*d4514f0bSApple OSS Distributions } 494*d4514f0bSApple OSS Distributions} 495*d4514f0bSApple OSS Distributions 496*d4514f0bSApple OSS Distributionsstatic void 497*d4514f0bSApple OSS Distributionsbpf_socket_setup(void) 498*d4514f0bSApple OSS Distributions{ 499*d4514f0bSApple OSS Distributions int status = -1; 500*d4514f0bSApple OSS Distributions 501*d4514f0bSApple OSS Distributions bpf_fd = bpf_new(); 502*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NE(bpf_fd, -1, "failed to create bpf file descriptor"); 503*d4514f0bSApple OSS Distributions 504*d4514f0bSApple OSS Distributions CFStringRef ipsecIfName = NEVirtualInterfaceCopyName(ipsecInterface); 505*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(ipsecIfName, "failed to get ipsec interface name"); 506*d4514f0bSApple OSS Distributions 507*d4514f0bSApple OSS Distributions char ifname[IFNAMSIZ]; 508*d4514f0bSApple OSS Distributions CFStringGetCString(ipsecIfName, ifname, IFNAMSIZ, kCFStringEncodingUTF8); 509*d4514f0bSApple OSS Distributions 510*d4514f0bSApple OSS Distributions status = bpf_setif(bpf_fd, ifname); 511*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NE(status, -1, "failed to set bpf interface"); 512*d4514f0bSApple OSS Distributions 513*d4514f0bSApple OSS Distributions status = bpf_sethdr_complete(bpf_fd); 514*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NE(status, -1, "failed to set bpf header complete"); 515*d4514f0bSApple OSS Distributions} 516*d4514f0bSApple OSS Distributions 517*d4514f0bSApple OSS Distributionsstatic NEVirtualInterfaceRef 518*d4514f0bSApple OSS Distributionsipsec_interface_setup(CFStringRef interfaceAddress, CFStringRef interfaceMask) 519*d4514f0bSApple OSS Distributions{ 520*d4514f0bSApple OSS Distributions Boolean status = FALSE; 521*d4514f0bSApple OSS Distributions 522*d4514f0bSApple OSS Distributions NEVirtualInterfaceRef interface = NEVirtualInterfaceCreate(NULL, kNEVirtualInterfaceValTypeIPSec, dispatch_get_main_queue(), NULL); 523*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(interface, "ipsec interface creation failed"); 524*d4514f0bSApple OSS Distributions status = NEVirtualInterfaceSetMTU(interface, 1400); 525*d4514f0bSApple OSS Distributions if (status == FALSE) { 526*d4514f0bSApple OSS Distributions T_FAIL("Failed to set MTU on ipsec interface"); 527*d4514f0bSApple OSS Distributions T_END; 528*d4514f0bSApple OSS Distributions } 529*d4514f0bSApple OSS Distributions 530*d4514f0bSApple OSS Distributions status = NEVirtualInterfaceAddAddress(interface, interfaceAddress, interfaceMask); 531*d4514f0bSApple OSS Distributions if (status == FALSE) { 532*d4514f0bSApple OSS Distributions T_FAIL("Failed to set address on ipsec interface"); 533*d4514f0bSApple OSS Distributions T_END; 534*d4514f0bSApple OSS Distributions } 535*d4514f0bSApple OSS Distributions 536*d4514f0bSApple OSS Distributions CFStringRef ipsecIfName = NEVirtualInterfaceCopyName(interface); 537*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(ipsecIfName, "failed to get ipsec interface name"); 538*d4514f0bSApple OSS Distributions 539*d4514f0bSApple OSS Distributions char ifname[IFNAMSIZ]; 540*d4514f0bSApple OSS Distributions CFStringGetCString(ipsecIfName, ifname, IFNAMSIZ, kCFStringEncodingUTF8); 541*d4514f0bSApple OSS Distributions 542*d4514f0bSApple OSS Distributions T_LOG("%s interface setup", ifname); 543*d4514f0bSApple OSS Distributions return interface; 544*d4514f0bSApple OSS Distributions} 545*d4514f0bSApple OSS Distributions 546*d4514f0bSApple OSS Distributionsstatic void 547*d4514f0bSApple OSS Distributionsipsec_interface_set_delegate(NEVirtualInterfaceRef interface, CFStringRef delegateInterfaceName) 548*d4514f0bSApple OSS Distributions{ 549*d4514f0bSApple OSS Distributions Boolean status = NEVirtualInterfaceSetDelegateInterface(interface, delegateInterfaceName); 550*d4514f0bSApple OSS Distributions if (status == FALSE) { 551*d4514f0bSApple OSS Distributions T_FAIL("Failed to set delegate on ipsec interface"); 552*d4514f0bSApple OSS Distributions T_END; 553*d4514f0bSApple OSS Distributions } 554*d4514f0bSApple OSS Distributions 555*d4514f0bSApple OSS Distributions return; 556*d4514f0bSApple OSS Distributions} 557*d4514f0bSApple OSS Distributions 558*d4514f0bSApple OSS Distributionsstatic void 559*d4514f0bSApple OSS Distributionsipsec_cleanup(void) 560*d4514f0bSApple OSS Distributions{ 561*d4514f0bSApple OSS Distributions pfkey_cleanup(); 562*d4514f0bSApple OSS Distributions 563*d4514f0bSApple OSS Distributions if (ipsecInterface != NULL) { 564*d4514f0bSApple OSS Distributions NEVirtualInterfaceInvalidate(ipsecInterface); 565*d4514f0bSApple OSS Distributions ipsecInterface = NULL; 566*d4514f0bSApple OSS Distributions } 567*d4514f0bSApple OSS Distributions 568*d4514f0bSApple OSS Distributions if (delegateIPsecInterface != NULL) { 569*d4514f0bSApple OSS Distributions NEVirtualInterfaceInvalidate(delegateIPsecInterface); 570*d4514f0bSApple OSS Distributions delegateIPsecInterface = NULL; 571*d4514f0bSApple OSS Distributions } 572*d4514f0bSApple OSS Distributions 573*d4514f0bSApple OSS Distributions if (bpf_fd != -1) { 574*d4514f0bSApple OSS Distributions close(bpf_fd); 575*d4514f0bSApple OSS Distributions bpf_fd = -1; 576*d4514f0bSApple OSS Distributions } 577*d4514f0bSApple OSS Distributions} 578*d4514f0bSApple OSS Distributions 579*d4514f0bSApple OSS DistributionsT_DECL(ipsec_ipv4_encapsulate_panic_63139357, "ipsec: outer ip header length less than 20") 580*d4514f0bSApple OSS Distributions{ 581*d4514f0bSApple OSS Distributions test_id = TEST_IPSEC_IPv4_ENCAPSULATE_PANIC; 582*d4514f0bSApple OSS Distributions 583*d4514f0bSApple OSS Distributions T_ATEND(ipsec_cleanup); 584*d4514f0bSApple OSS Distributions 585*d4514f0bSApple OSS Distributions ipsecInterface = ipsec_interface_setup(CFSTR(TEST_IPSEC_IPv4_INTERFACE_ADDRESS), CFSTR(TEST_IPSEC_IPv4_INTERFACE_MASK)); 586*d4514f0bSApple OSS Distributions delegateIPsecInterface = ipsec_interface_setup(CFSTR(TEST_DELEGATE_IPSEC_INTERFACE_ADDRESS), CFSTR(TEST_IPSEC_IPv4_INTERFACE_MASK)); 587*d4514f0bSApple OSS Distributions 588*d4514f0bSApple OSS Distributions CFStringRef delegateIPsecIfName = NEVirtualInterfaceCopyName(delegateIPsecInterface); 589*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(delegateIPsecIfName, "failed to get ipsec interface name"); 590*d4514f0bSApple OSS Distributions ipsec_interface_set_delegate(ipsecInterface, delegateIPsecIfName); 591*d4514f0bSApple OSS Distributions 592*d4514f0bSApple OSS Distributions bpf_socket_setup(); 593*d4514f0bSApple OSS Distributions 594*d4514f0bSApple OSS Distributions int pfkey_socket = pfkey_setup_socket(); 595*d4514f0bSApple OSS Distributions send_pfkey_flush_sa(pfkey_socket); 596*d4514f0bSApple OSS Distributions 597*d4514f0bSApple OSS Distributions send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET); 598*d4514f0bSApple OSS Distributions send_pkey_add_sa(pfkey_socket, 0x23456789, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET); 599*d4514f0bSApple OSS Distributions 600*d4514f0bSApple OSS Distributions dispatch_main(); 601*d4514f0bSApple OSS Distributions} 602*d4514f0bSApple OSS Distributions 603*d4514f0bSApple OSS DistributionsT_DECL(ipsec_ipv6_encapsulate_panic_63139357, "ipsec: payload less than IPv6 header") 604*d4514f0bSApple OSS Distributions{ 605*d4514f0bSApple OSS Distributions test_id = TEST_IPSEC_IPv6_ENCAPSULATE_PANIC; 606*d4514f0bSApple OSS Distributions 607*d4514f0bSApple OSS Distributions T_ATEND(ipsec_cleanup); 608*d4514f0bSApple OSS Distributions 609*d4514f0bSApple OSS Distributions ipsecInterface = ipsec_interface_setup(CFSTR(TEST_IPSEC_IPv6_INTERFACE_ADDRESS), CFSTR(TEST_IPSEC_IPv6_INTERFACE_MASK)); 610*d4514f0bSApple OSS Distributions delegateIPsecInterface = ipsec_interface_setup(CFSTR(TEST_DELEGATE_IPSEC_INTERFACE_ADDRESS), CFSTR(TEST_IPSEC_IPv4_INTERFACE_MASK)); 611*d4514f0bSApple OSS Distributions 612*d4514f0bSApple OSS Distributions CFStringRef delegateIPsecIfName = NEVirtualInterfaceCopyName(delegateIPsecInterface); 613*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_NOTNULL(delegateIPsecIfName, "failed to get ipsec interface name"); 614*d4514f0bSApple OSS Distributions ipsec_interface_set_delegate(ipsecInterface, delegateIPsecIfName); 615*d4514f0bSApple OSS Distributions 616*d4514f0bSApple OSS Distributions bpf_socket_setup(); 617*d4514f0bSApple OSS Distributions 618*d4514f0bSApple OSS Distributions int pfkey_socket = pfkey_setup_socket(); 619*d4514f0bSApple OSS Distributions send_pfkey_flush_sa(pfkey_socket); 620*d4514f0bSApple OSS Distributions 621*d4514f0bSApple OSS Distributions send_pkey_add_sa(pfkey_socket, 0x12345678, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET); 622*d4514f0bSApple OSS Distributions send_pkey_add_sa(pfkey_socket, 0x23456789, TEST_SRC_ADDRESS_IPv4, TEST_DST_ADDRESS_IPv4, AF_INET); 623*d4514f0bSApple OSS Distributions 624*d4514f0bSApple OSS Distributions dispatch_main(); 625*d4514f0bSApple OSS Distributions} 626