xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/tls.c (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*053f45beSAndroid Build Coastguard Worker 
3*053f45beSAndroid Build Coastguard Worker #define _GNU_SOURCE
4*053f45beSAndroid Build Coastguard Worker 
5*053f45beSAndroid Build Coastguard Worker #include <arpa/inet.h>
6*053f45beSAndroid Build Coastguard Worker #include <errno.h>
7*053f45beSAndroid Build Coastguard Worker #include <error.h>
8*053f45beSAndroid Build Coastguard Worker #include <fcntl.h>
9*053f45beSAndroid Build Coastguard Worker #include <poll.h>
10*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
11*053f45beSAndroid Build Coastguard Worker #include <stdlib.h>
12*053f45beSAndroid Build Coastguard Worker #include <unistd.h>
13*053f45beSAndroid Build Coastguard Worker 
14*053f45beSAndroid Build Coastguard Worker #include <linux/tls.h>
15*053f45beSAndroid Build Coastguard Worker #include <linux/tcp.h>
16*053f45beSAndroid Build Coastguard Worker #include <linux/socket.h>
17*053f45beSAndroid Build Coastguard Worker 
18*053f45beSAndroid Build Coastguard Worker #include <sys/types.h>
19*053f45beSAndroid Build Coastguard Worker #include <sys/sendfile.h>
20*053f45beSAndroid Build Coastguard Worker #include <sys/socket.h>
21*053f45beSAndroid Build Coastguard Worker #include <sys/stat.h>
22*053f45beSAndroid Build Coastguard Worker 
23*053f45beSAndroid Build Coastguard Worker #include "../kselftest_harness.h"
24*053f45beSAndroid Build Coastguard Worker 
25*053f45beSAndroid Build Coastguard Worker #define TLS_PAYLOAD_MAX_LEN 16384
26*053f45beSAndroid Build Coastguard Worker #define SOL_TLS 282
27*053f45beSAndroid Build Coastguard Worker 
28*053f45beSAndroid Build Coastguard Worker struct tls_crypto_info_keys {
29*053f45beSAndroid Build Coastguard Worker 	union {
30*053f45beSAndroid Build Coastguard Worker 		struct tls12_crypto_info_aes_gcm_128 aes128;
31*053f45beSAndroid Build Coastguard Worker 		struct tls12_crypto_info_chacha20_poly1305 chacha20;
32*053f45beSAndroid Build Coastguard Worker 		struct tls12_crypto_info_sm4_gcm sm4gcm;
33*053f45beSAndroid Build Coastguard Worker 		struct tls12_crypto_info_sm4_ccm sm4ccm;
34*053f45beSAndroid Build Coastguard Worker 		struct tls12_crypto_info_aes_ccm_128 aesccm128;
35*053f45beSAndroid Build Coastguard Worker 		struct tls12_crypto_info_aes_gcm_256 aesgcm256;
36*053f45beSAndroid Build Coastguard Worker 	};
37*053f45beSAndroid Build Coastguard Worker 	size_t len;
38*053f45beSAndroid Build Coastguard Worker };
39*053f45beSAndroid Build Coastguard Worker 
tls_crypto_info_init(uint16_t tls_version,uint16_t cipher_type,struct tls_crypto_info_keys * tls12)40*053f45beSAndroid Build Coastguard Worker static void tls_crypto_info_init(uint16_t tls_version, uint16_t cipher_type,
41*053f45beSAndroid Build Coastguard Worker 				 struct tls_crypto_info_keys *tls12)
42*053f45beSAndroid Build Coastguard Worker {
43*053f45beSAndroid Build Coastguard Worker 	memset(tls12, 0, sizeof(*tls12));
44*053f45beSAndroid Build Coastguard Worker 
45*053f45beSAndroid Build Coastguard Worker 	switch (cipher_type) {
46*053f45beSAndroid Build Coastguard Worker 	case TLS_CIPHER_CHACHA20_POLY1305:
47*053f45beSAndroid Build Coastguard Worker 		tls12->len = sizeof(struct tls12_crypto_info_chacha20_poly1305);
48*053f45beSAndroid Build Coastguard Worker 		tls12->chacha20.info.version = tls_version;
49*053f45beSAndroid Build Coastguard Worker 		tls12->chacha20.info.cipher_type = cipher_type;
50*053f45beSAndroid Build Coastguard Worker 		break;
51*053f45beSAndroid Build Coastguard Worker 	case TLS_CIPHER_AES_GCM_128:
52*053f45beSAndroid Build Coastguard Worker 		tls12->len = sizeof(struct tls12_crypto_info_aes_gcm_128);
53*053f45beSAndroid Build Coastguard Worker 		tls12->aes128.info.version = tls_version;
54*053f45beSAndroid Build Coastguard Worker 		tls12->aes128.info.cipher_type = cipher_type;
55*053f45beSAndroid Build Coastguard Worker 		break;
56*053f45beSAndroid Build Coastguard Worker 	case TLS_CIPHER_SM4_GCM:
57*053f45beSAndroid Build Coastguard Worker 		tls12->len = sizeof(struct tls12_crypto_info_sm4_gcm);
58*053f45beSAndroid Build Coastguard Worker 		tls12->sm4gcm.info.version = tls_version;
59*053f45beSAndroid Build Coastguard Worker 		tls12->sm4gcm.info.cipher_type = cipher_type;
60*053f45beSAndroid Build Coastguard Worker 		break;
61*053f45beSAndroid Build Coastguard Worker 	case TLS_CIPHER_SM4_CCM:
62*053f45beSAndroid Build Coastguard Worker 		tls12->len = sizeof(struct tls12_crypto_info_sm4_ccm);
63*053f45beSAndroid Build Coastguard Worker 		tls12->sm4ccm.info.version = tls_version;
64*053f45beSAndroid Build Coastguard Worker 		tls12->sm4ccm.info.cipher_type = cipher_type;
65*053f45beSAndroid Build Coastguard Worker 		break;
66*053f45beSAndroid Build Coastguard Worker 	case TLS_CIPHER_AES_CCM_128:
67*053f45beSAndroid Build Coastguard Worker 		tls12->len = sizeof(struct tls12_crypto_info_aes_ccm_128);
68*053f45beSAndroid Build Coastguard Worker 		tls12->aesccm128.info.version = tls_version;
69*053f45beSAndroid Build Coastguard Worker 		tls12->aesccm128.info.cipher_type = cipher_type;
70*053f45beSAndroid Build Coastguard Worker 		break;
71*053f45beSAndroid Build Coastguard Worker 	case TLS_CIPHER_AES_GCM_256:
72*053f45beSAndroid Build Coastguard Worker 		tls12->len = sizeof(struct tls12_crypto_info_aes_gcm_256);
73*053f45beSAndroid Build Coastguard Worker 		tls12->aesgcm256.info.version = tls_version;
74*053f45beSAndroid Build Coastguard Worker 		tls12->aesgcm256.info.cipher_type = cipher_type;
75*053f45beSAndroid Build Coastguard Worker 		break;
76*053f45beSAndroid Build Coastguard Worker 	default:
77*053f45beSAndroid Build Coastguard Worker 		break;
78*053f45beSAndroid Build Coastguard Worker 	}
79*053f45beSAndroid Build Coastguard Worker }
80*053f45beSAndroid Build Coastguard Worker 
memrnd(void * s,size_t n)81*053f45beSAndroid Build Coastguard Worker static void memrnd(void *s, size_t n)
82*053f45beSAndroid Build Coastguard Worker {
83*053f45beSAndroid Build Coastguard Worker 	int *dword = s;
84*053f45beSAndroid Build Coastguard Worker 	char *byte;
85*053f45beSAndroid Build Coastguard Worker 
86*053f45beSAndroid Build Coastguard Worker 	for (; n >= 4; n -= 4)
87*053f45beSAndroid Build Coastguard Worker 		*dword++ = rand();
88*053f45beSAndroid Build Coastguard Worker 	byte = (void *)dword;
89*053f45beSAndroid Build Coastguard Worker 	while (n--)
90*053f45beSAndroid Build Coastguard Worker 		*byte++ = rand();
91*053f45beSAndroid Build Coastguard Worker }
92*053f45beSAndroid Build Coastguard Worker 
ulp_sock_pair(struct __test_metadata * _metadata,int * fd,int * cfd,bool * notls)93*053f45beSAndroid Build Coastguard Worker static void ulp_sock_pair(struct __test_metadata *_metadata,
94*053f45beSAndroid Build Coastguard Worker 			  int *fd, int *cfd, bool *notls)
95*053f45beSAndroid Build Coastguard Worker {
96*053f45beSAndroid Build Coastguard Worker 	struct sockaddr_in addr;
97*053f45beSAndroid Build Coastguard Worker 	socklen_t len;
98*053f45beSAndroid Build Coastguard Worker 	int sfd, ret;
99*053f45beSAndroid Build Coastguard Worker 
100*053f45beSAndroid Build Coastguard Worker 	*notls = false;
101*053f45beSAndroid Build Coastguard Worker 	len = sizeof(addr);
102*053f45beSAndroid Build Coastguard Worker 
103*053f45beSAndroid Build Coastguard Worker 	addr.sin_family = AF_INET;
104*053f45beSAndroid Build Coastguard Worker 	addr.sin_addr.s_addr = htonl(INADDR_ANY);
105*053f45beSAndroid Build Coastguard Worker 	addr.sin_port = 0;
106*053f45beSAndroid Build Coastguard Worker 
107*053f45beSAndroid Build Coastguard Worker 	*fd = socket(AF_INET, SOCK_STREAM, 0);
108*053f45beSAndroid Build Coastguard Worker 	sfd = socket(AF_INET, SOCK_STREAM, 0);
109*053f45beSAndroid Build Coastguard Worker 
110*053f45beSAndroid Build Coastguard Worker 	ret = bind(sfd, &addr, sizeof(addr));
111*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
112*053f45beSAndroid Build Coastguard Worker 	ret = listen(sfd, 10);
113*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
114*053f45beSAndroid Build Coastguard Worker 
115*053f45beSAndroid Build Coastguard Worker 	ret = getsockname(sfd, &addr, &len);
116*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
117*053f45beSAndroid Build Coastguard Worker 
118*053f45beSAndroid Build Coastguard Worker 	ret = connect(*fd, &addr, sizeof(addr));
119*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
120*053f45beSAndroid Build Coastguard Worker 
121*053f45beSAndroid Build Coastguard Worker 	*cfd = accept(sfd, &addr, &len);
122*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(*cfd, 0);
123*053f45beSAndroid Build Coastguard Worker 
124*053f45beSAndroid Build Coastguard Worker 	close(sfd);
125*053f45beSAndroid Build Coastguard Worker 
126*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(*fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
127*053f45beSAndroid Build Coastguard Worker 	if (ret != 0) {
128*053f45beSAndroid Build Coastguard Worker 		ASSERT_EQ(errno, ENOENT);
129*053f45beSAndroid Build Coastguard Worker 		*notls = true;
130*053f45beSAndroid Build Coastguard Worker 		printf("Failure setting TCP_ULP, testing without tls\n");
131*053f45beSAndroid Build Coastguard Worker 		return;
132*053f45beSAndroid Build Coastguard Worker 	}
133*053f45beSAndroid Build Coastguard Worker 
134*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(*cfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
135*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
136*053f45beSAndroid Build Coastguard Worker }
137*053f45beSAndroid Build Coastguard Worker 
138*053f45beSAndroid Build Coastguard Worker /* Produce a basic cmsg */
tls_send_cmsg(int fd,unsigned char record_type,void * data,size_t len,int flags)139*053f45beSAndroid Build Coastguard Worker static int tls_send_cmsg(int fd, unsigned char record_type,
140*053f45beSAndroid Build Coastguard Worker 			 void *data, size_t len, int flags)
141*053f45beSAndroid Build Coastguard Worker {
142*053f45beSAndroid Build Coastguard Worker 	char cbuf[CMSG_SPACE(sizeof(char))];
143*053f45beSAndroid Build Coastguard Worker 	int cmsg_len = sizeof(char);
144*053f45beSAndroid Build Coastguard Worker 	struct cmsghdr *cmsg;
145*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
146*053f45beSAndroid Build Coastguard Worker 	struct iovec vec;
147*053f45beSAndroid Build Coastguard Worker 
148*053f45beSAndroid Build Coastguard Worker 	vec.iov_base = data;
149*053f45beSAndroid Build Coastguard Worker 	vec.iov_len = len;
150*053f45beSAndroid Build Coastguard Worker 	memset(&msg, 0, sizeof(struct msghdr));
151*053f45beSAndroid Build Coastguard Worker 	msg.msg_iov = &vec;
152*053f45beSAndroid Build Coastguard Worker 	msg.msg_iovlen = 1;
153*053f45beSAndroid Build Coastguard Worker 	msg.msg_control = cbuf;
154*053f45beSAndroid Build Coastguard Worker 	msg.msg_controllen = sizeof(cbuf);
155*053f45beSAndroid Build Coastguard Worker 	cmsg = CMSG_FIRSTHDR(&msg);
156*053f45beSAndroid Build Coastguard Worker 	cmsg->cmsg_level = SOL_TLS;
157*053f45beSAndroid Build Coastguard Worker 	/* test sending non-record types. */
158*053f45beSAndroid Build Coastguard Worker 	cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
159*053f45beSAndroid Build Coastguard Worker 	cmsg->cmsg_len = CMSG_LEN(cmsg_len);
160*053f45beSAndroid Build Coastguard Worker 	*CMSG_DATA(cmsg) = record_type;
161*053f45beSAndroid Build Coastguard Worker 	msg.msg_controllen = cmsg->cmsg_len;
162*053f45beSAndroid Build Coastguard Worker 
163*053f45beSAndroid Build Coastguard Worker 	return sendmsg(fd, &msg, flags);
164*053f45beSAndroid Build Coastguard Worker }
165*053f45beSAndroid Build Coastguard Worker 
tls_recv_cmsg(struct __test_metadata * _metadata,int fd,unsigned char record_type,void * data,size_t len,int flags)166*053f45beSAndroid Build Coastguard Worker static int tls_recv_cmsg(struct __test_metadata *_metadata,
167*053f45beSAndroid Build Coastguard Worker 			 int fd, unsigned char record_type,
168*053f45beSAndroid Build Coastguard Worker 			 void *data, size_t len, int flags)
169*053f45beSAndroid Build Coastguard Worker {
170*053f45beSAndroid Build Coastguard Worker 	char cbuf[CMSG_SPACE(sizeof(char))];
171*053f45beSAndroid Build Coastguard Worker 	struct cmsghdr *cmsg;
172*053f45beSAndroid Build Coastguard Worker 	unsigned char ctype;
173*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
174*053f45beSAndroid Build Coastguard Worker 	struct iovec vec;
175*053f45beSAndroid Build Coastguard Worker 	int n;
176*053f45beSAndroid Build Coastguard Worker 
177*053f45beSAndroid Build Coastguard Worker 	vec.iov_base = data;
178*053f45beSAndroid Build Coastguard Worker 	vec.iov_len = len;
179*053f45beSAndroid Build Coastguard Worker 	memset(&msg, 0, sizeof(struct msghdr));
180*053f45beSAndroid Build Coastguard Worker 	msg.msg_iov = &vec;
181*053f45beSAndroid Build Coastguard Worker 	msg.msg_iovlen = 1;
182*053f45beSAndroid Build Coastguard Worker 	msg.msg_control = cbuf;
183*053f45beSAndroid Build Coastguard Worker 	msg.msg_controllen = sizeof(cbuf);
184*053f45beSAndroid Build Coastguard Worker 
185*053f45beSAndroid Build Coastguard Worker 	n = recvmsg(fd, &msg, flags);
186*053f45beSAndroid Build Coastguard Worker 
187*053f45beSAndroid Build Coastguard Worker 	cmsg = CMSG_FIRSTHDR(&msg);
188*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(cmsg, NULL);
189*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(cmsg->cmsg_level, SOL_TLS);
190*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(cmsg->cmsg_type, TLS_GET_RECORD_TYPE);
191*053f45beSAndroid Build Coastguard Worker 	ctype = *((unsigned char *)CMSG_DATA(cmsg));
192*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ctype, record_type);
193*053f45beSAndroid Build Coastguard Worker 
194*053f45beSAndroid Build Coastguard Worker 	return n;
195*053f45beSAndroid Build Coastguard Worker }
196*053f45beSAndroid Build Coastguard Worker 
FIXTURE(tls_basic)197*053f45beSAndroid Build Coastguard Worker FIXTURE(tls_basic)
198*053f45beSAndroid Build Coastguard Worker {
199*053f45beSAndroid Build Coastguard Worker 	int fd, cfd;
200*053f45beSAndroid Build Coastguard Worker 	bool notls;
201*053f45beSAndroid Build Coastguard Worker };
202*053f45beSAndroid Build Coastguard Worker 
FIXTURE_SETUP(tls_basic)203*053f45beSAndroid Build Coastguard Worker FIXTURE_SETUP(tls_basic)
204*053f45beSAndroid Build Coastguard Worker {
205*053f45beSAndroid Build Coastguard Worker 	ulp_sock_pair(_metadata, &self->fd, &self->cfd, &self->notls);
206*053f45beSAndroid Build Coastguard Worker }
207*053f45beSAndroid Build Coastguard Worker 
FIXTURE_TEARDOWN(tls_basic)208*053f45beSAndroid Build Coastguard Worker FIXTURE_TEARDOWN(tls_basic)
209*053f45beSAndroid Build Coastguard Worker {
210*053f45beSAndroid Build Coastguard Worker 	close(self->fd);
211*053f45beSAndroid Build Coastguard Worker 	close(self->cfd);
212*053f45beSAndroid Build Coastguard Worker }
213*053f45beSAndroid Build Coastguard Worker 
214*053f45beSAndroid Build Coastguard Worker /* Send some data through with ULP but no keys */
TEST_F(tls_basic,base_base)215*053f45beSAndroid Build Coastguard Worker TEST_F(tls_basic, base_base)
216*053f45beSAndroid Build Coastguard Worker {
217*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
218*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
219*053f45beSAndroid Build Coastguard Worker 	char buf[10];
220*053f45beSAndroid Build Coastguard Worker 
221*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(strlen(test_str) + 1, send_len);
222*053f45beSAndroid Build Coastguard Worker 
223*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
224*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
225*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
226*053f45beSAndroid Build Coastguard Worker };
227*053f45beSAndroid Build Coastguard Worker 
FIXTURE(tls)228*053f45beSAndroid Build Coastguard Worker FIXTURE(tls)
229*053f45beSAndroid Build Coastguard Worker {
230*053f45beSAndroid Build Coastguard Worker 	int fd, cfd;
231*053f45beSAndroid Build Coastguard Worker 	bool notls;
232*053f45beSAndroid Build Coastguard Worker };
233*053f45beSAndroid Build Coastguard Worker 
FIXTURE_VARIANT(tls)234*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT(tls)
235*053f45beSAndroid Build Coastguard Worker {
236*053f45beSAndroid Build Coastguard Worker 	uint16_t tls_version;
237*053f45beSAndroid Build Coastguard Worker 	uint16_t cipher_type;
238*053f45beSAndroid Build Coastguard Worker 	bool nopad;
239*053f45beSAndroid Build Coastguard Worker };
240*053f45beSAndroid Build Coastguard Worker 
241*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 12_aes_gcm)
242*053f45beSAndroid Build Coastguard Worker {
243*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_2_VERSION,
244*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_GCM_128,
245*053f45beSAndroid Build Coastguard Worker };
246*053f45beSAndroid Build Coastguard Worker 
247*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_aes_gcm)
248*053f45beSAndroid Build Coastguard Worker {
249*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
250*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_GCM_128,
251*053f45beSAndroid Build Coastguard Worker };
252*053f45beSAndroid Build Coastguard Worker 
253*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 12_chacha)
254*053f45beSAndroid Build Coastguard Worker {
255*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_2_VERSION,
256*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_CHACHA20_POLY1305,
257*053f45beSAndroid Build Coastguard Worker };
258*053f45beSAndroid Build Coastguard Worker 
259*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_chacha)
260*053f45beSAndroid Build Coastguard Worker {
261*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
262*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_CHACHA20_POLY1305,
263*053f45beSAndroid Build Coastguard Worker };
264*053f45beSAndroid Build Coastguard Worker 
265*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_sm4_gcm)
266*053f45beSAndroid Build Coastguard Worker {
267*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
268*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_SM4_GCM,
269*053f45beSAndroid Build Coastguard Worker };
270*053f45beSAndroid Build Coastguard Worker 
271*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_sm4_ccm)
272*053f45beSAndroid Build Coastguard Worker {
273*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
274*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_SM4_CCM,
275*053f45beSAndroid Build Coastguard Worker };
276*053f45beSAndroid Build Coastguard Worker 
277*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 12_aes_ccm)
278*053f45beSAndroid Build Coastguard Worker {
279*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_2_VERSION,
280*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_CCM_128,
281*053f45beSAndroid Build Coastguard Worker };
282*053f45beSAndroid Build Coastguard Worker 
283*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_aes_ccm)
284*053f45beSAndroid Build Coastguard Worker {
285*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
286*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_CCM_128,
287*053f45beSAndroid Build Coastguard Worker };
288*053f45beSAndroid Build Coastguard Worker 
289*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 12_aes_gcm_256)
290*053f45beSAndroid Build Coastguard Worker {
291*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_2_VERSION,
292*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_GCM_256,
293*053f45beSAndroid Build Coastguard Worker };
294*053f45beSAndroid Build Coastguard Worker 
295*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_aes_gcm_256)
296*053f45beSAndroid Build Coastguard Worker {
297*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
298*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_GCM_256,
299*053f45beSAndroid Build Coastguard Worker };
300*053f45beSAndroid Build Coastguard Worker 
301*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls, 13_nopad)
302*053f45beSAndroid Build Coastguard Worker {
303*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
304*053f45beSAndroid Build Coastguard Worker 	.cipher_type = TLS_CIPHER_AES_GCM_128,
305*053f45beSAndroid Build Coastguard Worker 	.nopad = true,
306*053f45beSAndroid Build Coastguard Worker };
307*053f45beSAndroid Build Coastguard Worker 
FIXTURE_SETUP(tls)308*053f45beSAndroid Build Coastguard Worker FIXTURE_SETUP(tls)
309*053f45beSAndroid Build Coastguard Worker {
310*053f45beSAndroid Build Coastguard Worker 	struct tls_crypto_info_keys tls12;
311*053f45beSAndroid Build Coastguard Worker 	int one = 1;
312*053f45beSAndroid Build Coastguard Worker 	int ret;
313*053f45beSAndroid Build Coastguard Worker 
314*053f45beSAndroid Build Coastguard Worker 	tls_crypto_info_init(variant->tls_version, variant->cipher_type,
315*053f45beSAndroid Build Coastguard Worker 			     &tls12);
316*053f45beSAndroid Build Coastguard Worker 
317*053f45beSAndroid Build Coastguard Worker 	ulp_sock_pair(_metadata, &self->fd, &self->cfd, &self->notls);
318*053f45beSAndroid Build Coastguard Worker 
319*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
320*053f45beSAndroid Build Coastguard Worker 		return;
321*053f45beSAndroid Build Coastguard Worker 
322*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(self->fd, SOL_TLS, TLS_TX, &tls12, tls12.len);
323*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
324*053f45beSAndroid Build Coastguard Worker 
325*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(self->cfd, SOL_TLS, TLS_RX, &tls12, tls12.len);
326*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
327*053f45beSAndroid Build Coastguard Worker 
328*053f45beSAndroid Build Coastguard Worker 	if (variant->nopad) {
329*053f45beSAndroid Build Coastguard Worker 		ret = setsockopt(self->cfd, SOL_TLS, TLS_RX_EXPECT_NO_PAD,
330*053f45beSAndroid Build Coastguard Worker 				 (void *)&one, sizeof(one));
331*053f45beSAndroid Build Coastguard Worker 		ASSERT_EQ(ret, 0);
332*053f45beSAndroid Build Coastguard Worker 	}
333*053f45beSAndroid Build Coastguard Worker }
334*053f45beSAndroid Build Coastguard Worker 
FIXTURE_TEARDOWN(tls)335*053f45beSAndroid Build Coastguard Worker FIXTURE_TEARDOWN(tls)
336*053f45beSAndroid Build Coastguard Worker {
337*053f45beSAndroid Build Coastguard Worker 	close(self->fd);
338*053f45beSAndroid Build Coastguard Worker 	close(self->cfd);
339*053f45beSAndroid Build Coastguard Worker }
340*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,sendfile)341*053f45beSAndroid Build Coastguard Worker TEST_F(tls, sendfile)
342*053f45beSAndroid Build Coastguard Worker {
343*053f45beSAndroid Build Coastguard Worker 	int filefd = open("/proc/self/exe", O_RDONLY);
344*053f45beSAndroid Build Coastguard Worker 	struct stat st;
345*053f45beSAndroid Build Coastguard Worker 
346*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(filefd, 0);
347*053f45beSAndroid Build Coastguard Worker 	fstat(filefd, &st);
348*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(sendfile(self->fd, filefd, 0, st.st_size), 0);
349*053f45beSAndroid Build Coastguard Worker }
350*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,send_then_sendfile)351*053f45beSAndroid Build Coastguard Worker TEST_F(tls, send_then_sendfile)
352*053f45beSAndroid Build Coastguard Worker {
353*053f45beSAndroid Build Coastguard Worker 	int filefd = open("/proc/self/exe", O_RDONLY);
354*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_send";
355*053f45beSAndroid Build Coastguard Worker 	int to_send = strlen(test_str) + 1;
356*053f45beSAndroid Build Coastguard Worker 	char recv_buf[10];
357*053f45beSAndroid Build Coastguard Worker 	struct stat st;
358*053f45beSAndroid Build Coastguard Worker 	char *buf;
359*053f45beSAndroid Build Coastguard Worker 
360*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(filefd, 0);
361*053f45beSAndroid Build Coastguard Worker 	fstat(filefd, &st);
362*053f45beSAndroid Build Coastguard Worker 	buf = (char *)malloc(st.st_size);
363*053f45beSAndroid Build Coastguard Worker 
364*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, to_send, 0), to_send);
365*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_buf, to_send, MSG_WAITALL), to_send);
366*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, recv_buf, to_send), 0);
367*053f45beSAndroid Build Coastguard Worker 
368*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(sendfile(self->fd, filefd, 0, st.st_size), 0);
369*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, st.st_size, MSG_WAITALL), st.st_size);
370*053f45beSAndroid Build Coastguard Worker }
371*053f45beSAndroid Build Coastguard Worker 
chunked_sendfile(struct __test_metadata * _metadata,struct _test_data_tls * self,uint16_t chunk_size,uint16_t extra_payload_size)372*053f45beSAndroid Build Coastguard Worker static void chunked_sendfile(struct __test_metadata *_metadata,
373*053f45beSAndroid Build Coastguard Worker 			     struct _test_data_tls *self,
374*053f45beSAndroid Build Coastguard Worker 			     uint16_t chunk_size,
375*053f45beSAndroid Build Coastguard Worker 			     uint16_t extra_payload_size)
376*053f45beSAndroid Build Coastguard Worker {
377*053f45beSAndroid Build Coastguard Worker 	char buf[TLS_PAYLOAD_MAX_LEN];
378*053f45beSAndroid Build Coastguard Worker 	uint16_t test_payload_size;
379*053f45beSAndroid Build Coastguard Worker 	int size = 0;
380*053f45beSAndroid Build Coastguard Worker 	int ret;
381*053f45beSAndroid Build Coastguard Worker 	char filename[] = "/tmp/mytemp.XXXXXX";
382*053f45beSAndroid Build Coastguard Worker 	int fd = mkstemp(filename);
383*053f45beSAndroid Build Coastguard Worker 	off_t offset = 0;
384*053f45beSAndroid Build Coastguard Worker 
385*053f45beSAndroid Build Coastguard Worker 	unlink(filename);
386*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(fd, 0);
387*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(chunk_size, 1);
388*053f45beSAndroid Build Coastguard Worker 	test_payload_size = chunk_size + extra_payload_size;
389*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(TLS_PAYLOAD_MAX_LEN, test_payload_size);
390*053f45beSAndroid Build Coastguard Worker 	memset(buf, 1, test_payload_size);
391*053f45beSAndroid Build Coastguard Worker 	size = write(fd, buf, test_payload_size);
392*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(size, test_payload_size);
393*053f45beSAndroid Build Coastguard Worker 	fsync(fd);
394*053f45beSAndroid Build Coastguard Worker 
395*053f45beSAndroid Build Coastguard Worker 	while (size > 0) {
396*053f45beSAndroid Build Coastguard Worker 		ret = sendfile(self->fd, fd, &offset, chunk_size);
397*053f45beSAndroid Build Coastguard Worker 		EXPECT_GE(ret, 0);
398*053f45beSAndroid Build Coastguard Worker 		size -= ret;
399*053f45beSAndroid Build Coastguard Worker 	}
400*053f45beSAndroid Build Coastguard Worker 
401*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, test_payload_size, MSG_WAITALL),
402*053f45beSAndroid Build Coastguard Worker 		  test_payload_size);
403*053f45beSAndroid Build Coastguard Worker 
404*053f45beSAndroid Build Coastguard Worker 	close(fd);
405*053f45beSAndroid Build Coastguard Worker }
406*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,multi_chunk_sendfile)407*053f45beSAndroid Build Coastguard Worker TEST_F(tls, multi_chunk_sendfile)
408*053f45beSAndroid Build Coastguard Worker {
409*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 4096, 4096);
410*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 4096, 0);
411*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 4096, 1);
412*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 4096, 2048);
413*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 8192, 2048);
414*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 4096, 8192);
415*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 8192, 4096);
416*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 12288, 1024);
417*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 12288, 2000);
418*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 15360, 100);
419*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 15360, 300);
420*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 1, 4096);
421*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 2048, 4096);
422*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 2048, 8192);
423*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 4096, 8192);
424*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 1024, 12288);
425*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 2000, 12288);
426*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 100, 15360);
427*053f45beSAndroid Build Coastguard Worker 	chunked_sendfile(_metadata, self, 300, 15360);
428*053f45beSAndroid Build Coastguard Worker }
429*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_max)430*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_max)
431*053f45beSAndroid Build Coastguard Worker {
432*053f45beSAndroid Build Coastguard Worker 	unsigned int send_len = TLS_PAYLOAD_MAX_LEN;
433*053f45beSAndroid Build Coastguard Worker 	char recv_mem[TLS_PAYLOAD_MAX_LEN];
434*053f45beSAndroid Build Coastguard Worker 	char buf[TLS_PAYLOAD_MAX_LEN];
435*053f45beSAndroid Build Coastguard Worker 
436*053f45beSAndroid Build Coastguard Worker 	memrnd(buf, sizeof(buf));
437*053f45beSAndroid Build Coastguard Worker 
438*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(send(self->fd, buf, send_len, 0), 0);
439*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, recv_mem, send_len, 0), -1);
440*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, recv_mem, send_len), 0);
441*053f45beSAndroid Build Coastguard Worker }
442*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_small)443*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_small)
444*053f45beSAndroid Build Coastguard Worker {
445*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
446*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
447*053f45beSAndroid Build Coastguard Worker 	char buf[10];
448*053f45beSAndroid Build Coastguard Worker 
449*053f45beSAndroid Build Coastguard Worker 	send_len = strlen(test_str) + 1;
450*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
451*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
452*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
453*053f45beSAndroid Build Coastguard Worker }
454*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,msg_more)455*053f45beSAndroid Build Coastguard Worker TEST_F(tls, msg_more)
456*053f45beSAndroid Build Coastguard Worker {
457*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
458*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
459*053f45beSAndroid Build Coastguard Worker 	char buf[10 * 2];
460*053f45beSAndroid Build Coastguard Worker 
461*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
462*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_DONTWAIT), -1);
463*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
464*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len * 2, MSG_WAITALL),
465*053f45beSAndroid Build Coastguard Worker 		  send_len * 2);
466*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
467*053f45beSAndroid Build Coastguard Worker }
468*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,msg_more_unsent)469*053f45beSAndroid Build Coastguard Worker TEST_F(tls, msg_more_unsent)
470*053f45beSAndroid Build Coastguard Worker {
471*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
472*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
473*053f45beSAndroid Build Coastguard Worker 	char buf[10];
474*053f45beSAndroid Build Coastguard Worker 
475*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
476*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_DONTWAIT), -1);
477*053f45beSAndroid Build Coastguard Worker }
478*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,sendmsg_single)479*053f45beSAndroid Build Coastguard Worker TEST_F(tls, sendmsg_single)
480*053f45beSAndroid Build Coastguard Worker {
481*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
482*053f45beSAndroid Build Coastguard Worker 
483*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_sendmsg";
484*053f45beSAndroid Build Coastguard Worker 	size_t send_len = 13;
485*053f45beSAndroid Build Coastguard Worker 	struct iovec vec;
486*053f45beSAndroid Build Coastguard Worker 	char buf[13];
487*053f45beSAndroid Build Coastguard Worker 
488*053f45beSAndroid Build Coastguard Worker 	vec.iov_base = (char *)test_str;
489*053f45beSAndroid Build Coastguard Worker 	vec.iov_len = send_len;
490*053f45beSAndroid Build Coastguard Worker 	memset(&msg, 0, sizeof(struct msghdr));
491*053f45beSAndroid Build Coastguard Worker 	msg.msg_iov = &vec;
492*053f45beSAndroid Build Coastguard Worker 	msg.msg_iovlen = 1;
493*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(sendmsg(self->fd, &msg, 0), send_len);
494*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_WAITALL), send_len);
495*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
496*053f45beSAndroid Build Coastguard Worker }
497*053f45beSAndroid Build Coastguard Worker 
498*053f45beSAndroid Build Coastguard Worker #define MAX_FRAGS	64
499*053f45beSAndroid Build Coastguard Worker #define SEND_LEN	13
TEST_F(tls,sendmsg_fragmented)500*053f45beSAndroid Build Coastguard Worker TEST_F(tls, sendmsg_fragmented)
501*053f45beSAndroid Build Coastguard Worker {
502*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_sendmsg";
503*053f45beSAndroid Build Coastguard Worker 	char buf[SEND_LEN * MAX_FRAGS];
504*053f45beSAndroid Build Coastguard Worker 	struct iovec vec[MAX_FRAGS];
505*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
506*053f45beSAndroid Build Coastguard Worker 	int i, frags;
507*053f45beSAndroid Build Coastguard Worker 
508*053f45beSAndroid Build Coastguard Worker 	for (frags = 1; frags <= MAX_FRAGS; frags++) {
509*053f45beSAndroid Build Coastguard Worker 		for (i = 0; i < frags; i++) {
510*053f45beSAndroid Build Coastguard Worker 			vec[i].iov_base = (char *)test_str;
511*053f45beSAndroid Build Coastguard Worker 			vec[i].iov_len = SEND_LEN;
512*053f45beSAndroid Build Coastguard Worker 		}
513*053f45beSAndroid Build Coastguard Worker 
514*053f45beSAndroid Build Coastguard Worker 		memset(&msg, 0, sizeof(struct msghdr));
515*053f45beSAndroid Build Coastguard Worker 		msg.msg_iov = vec;
516*053f45beSAndroid Build Coastguard Worker 		msg.msg_iovlen = frags;
517*053f45beSAndroid Build Coastguard Worker 
518*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(sendmsg(self->fd, &msg, 0), SEND_LEN * frags);
519*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(recv(self->cfd, buf, SEND_LEN * frags, MSG_WAITALL),
520*053f45beSAndroid Build Coastguard Worker 			  SEND_LEN * frags);
521*053f45beSAndroid Build Coastguard Worker 
522*053f45beSAndroid Build Coastguard Worker 		for (i = 0; i < frags; i++)
523*053f45beSAndroid Build Coastguard Worker 			EXPECT_EQ(memcmp(buf + SEND_LEN * i,
524*053f45beSAndroid Build Coastguard Worker 					 test_str, SEND_LEN), 0);
525*053f45beSAndroid Build Coastguard Worker 	}
526*053f45beSAndroid Build Coastguard Worker }
527*053f45beSAndroid Build Coastguard Worker #undef MAX_FRAGS
528*053f45beSAndroid Build Coastguard Worker #undef SEND_LEN
529*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,sendmsg_large)530*053f45beSAndroid Build Coastguard Worker TEST_F(tls, sendmsg_large)
531*053f45beSAndroid Build Coastguard Worker {
532*053f45beSAndroid Build Coastguard Worker 	void *mem = malloc(16384);
533*053f45beSAndroid Build Coastguard Worker 	size_t send_len = 16384;
534*053f45beSAndroid Build Coastguard Worker 	size_t sends = 128;
535*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
536*053f45beSAndroid Build Coastguard Worker 	size_t recvs = 0;
537*053f45beSAndroid Build Coastguard Worker 	size_t sent = 0;
538*053f45beSAndroid Build Coastguard Worker 
539*053f45beSAndroid Build Coastguard Worker 	memset(&msg, 0, sizeof(struct msghdr));
540*053f45beSAndroid Build Coastguard Worker 	while (sent++ < sends) {
541*053f45beSAndroid Build Coastguard Worker 		struct iovec vec = { (void *)mem, send_len };
542*053f45beSAndroid Build Coastguard Worker 
543*053f45beSAndroid Build Coastguard Worker 		msg.msg_iov = &vec;
544*053f45beSAndroid Build Coastguard Worker 		msg.msg_iovlen = 1;
545*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(sendmsg(self->cfd, &msg, 0), send_len);
546*053f45beSAndroid Build Coastguard Worker 	}
547*053f45beSAndroid Build Coastguard Worker 
548*053f45beSAndroid Build Coastguard Worker 	while (recvs++ < sends) {
549*053f45beSAndroid Build Coastguard Worker 		EXPECT_NE(recv(self->fd, mem, send_len, 0), -1);
550*053f45beSAndroid Build Coastguard Worker 	}
551*053f45beSAndroid Build Coastguard Worker 
552*053f45beSAndroid Build Coastguard Worker 	free(mem);
553*053f45beSAndroid Build Coastguard Worker }
554*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,sendmsg_multiple)555*053f45beSAndroid Build Coastguard Worker TEST_F(tls, sendmsg_multiple)
556*053f45beSAndroid Build Coastguard Worker {
557*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_sendmsg_multiple";
558*053f45beSAndroid Build Coastguard Worker 	struct iovec vec[5];
559*053f45beSAndroid Build Coastguard Worker 	char *test_strs[5];
560*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
561*053f45beSAndroid Build Coastguard Worker 	int total_len = 0;
562*053f45beSAndroid Build Coastguard Worker 	int len_cmp = 0;
563*053f45beSAndroid Build Coastguard Worker 	int iov_len = 5;
564*053f45beSAndroid Build Coastguard Worker 	char *buf;
565*053f45beSAndroid Build Coastguard Worker 	int i;
566*053f45beSAndroid Build Coastguard Worker 
567*053f45beSAndroid Build Coastguard Worker 	memset(&msg, 0, sizeof(struct msghdr));
568*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < iov_len; i++) {
569*053f45beSAndroid Build Coastguard Worker 		test_strs[i] = (char *)malloc(strlen(test_str) + 1);
570*053f45beSAndroid Build Coastguard Worker 		snprintf(test_strs[i], strlen(test_str) + 1, "%s", test_str);
571*053f45beSAndroid Build Coastguard Worker 		vec[i].iov_base = (void *)test_strs[i];
572*053f45beSAndroid Build Coastguard Worker 		vec[i].iov_len = strlen(test_strs[i]) + 1;
573*053f45beSAndroid Build Coastguard Worker 		total_len += vec[i].iov_len;
574*053f45beSAndroid Build Coastguard Worker 	}
575*053f45beSAndroid Build Coastguard Worker 	msg.msg_iov = vec;
576*053f45beSAndroid Build Coastguard Worker 	msg.msg_iovlen = iov_len;
577*053f45beSAndroid Build Coastguard Worker 
578*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(sendmsg(self->cfd, &msg, 0), total_len);
579*053f45beSAndroid Build Coastguard Worker 	buf = malloc(total_len);
580*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->fd, buf, total_len, 0), -1);
581*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < iov_len; i++) {
582*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(memcmp(test_strs[i], buf + len_cmp,
583*053f45beSAndroid Build Coastguard Worker 				 strlen(test_strs[i])),
584*053f45beSAndroid Build Coastguard Worker 			  0);
585*053f45beSAndroid Build Coastguard Worker 		len_cmp += strlen(buf + len_cmp) + 1;
586*053f45beSAndroid Build Coastguard Worker 	}
587*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < iov_len; i++)
588*053f45beSAndroid Build Coastguard Worker 		free(test_strs[i]);
589*053f45beSAndroid Build Coastguard Worker 	free(buf);
590*053f45beSAndroid Build Coastguard Worker }
591*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,sendmsg_multiple_stress)592*053f45beSAndroid Build Coastguard Worker TEST_F(tls, sendmsg_multiple_stress)
593*053f45beSAndroid Build Coastguard Worker {
594*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "abcdefghijklmno";
595*053f45beSAndroid Build Coastguard Worker 	struct iovec vec[1024];
596*053f45beSAndroid Build Coastguard Worker 	char *test_strs[1024];
597*053f45beSAndroid Build Coastguard Worker 	int iov_len = 1024;
598*053f45beSAndroid Build Coastguard Worker 	int total_len = 0;
599*053f45beSAndroid Build Coastguard Worker 	char buf[1 << 14];
600*053f45beSAndroid Build Coastguard Worker 	struct msghdr msg;
601*053f45beSAndroid Build Coastguard Worker 	int len_cmp = 0;
602*053f45beSAndroid Build Coastguard Worker 	int i;
603*053f45beSAndroid Build Coastguard Worker 
604*053f45beSAndroid Build Coastguard Worker 	memset(&msg, 0, sizeof(struct msghdr));
605*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < iov_len; i++) {
606*053f45beSAndroid Build Coastguard Worker 		test_strs[i] = (char *)malloc(strlen(test_str) + 1);
607*053f45beSAndroid Build Coastguard Worker 		snprintf(test_strs[i], strlen(test_str) + 1, "%s", test_str);
608*053f45beSAndroid Build Coastguard Worker 		vec[i].iov_base = (void *)test_strs[i];
609*053f45beSAndroid Build Coastguard Worker 		vec[i].iov_len = strlen(test_strs[i]) + 1;
610*053f45beSAndroid Build Coastguard Worker 		total_len += vec[i].iov_len;
611*053f45beSAndroid Build Coastguard Worker 	}
612*053f45beSAndroid Build Coastguard Worker 	msg.msg_iov = vec;
613*053f45beSAndroid Build Coastguard Worker 	msg.msg_iovlen = iov_len;
614*053f45beSAndroid Build Coastguard Worker 
615*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(sendmsg(self->fd, &msg, 0), total_len);
616*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, buf, total_len, 0), -1);
617*053f45beSAndroid Build Coastguard Worker 
618*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < iov_len; i++)
619*053f45beSAndroid Build Coastguard Worker 		len_cmp += strlen(buf + len_cmp) + 1;
620*053f45beSAndroid Build Coastguard Worker 
621*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < iov_len; i++)
622*053f45beSAndroid Build Coastguard Worker 		free(test_strs[i]);
623*053f45beSAndroid Build Coastguard Worker }
624*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,splice_from_pipe)625*053f45beSAndroid Build Coastguard Worker TEST_F(tls, splice_from_pipe)
626*053f45beSAndroid Build Coastguard Worker {
627*053f45beSAndroid Build Coastguard Worker 	int send_len = TLS_PAYLOAD_MAX_LEN;
628*053f45beSAndroid Build Coastguard Worker 	char mem_send[TLS_PAYLOAD_MAX_LEN];
629*053f45beSAndroid Build Coastguard Worker 	char mem_recv[TLS_PAYLOAD_MAX_LEN];
630*053f45beSAndroid Build Coastguard Worker 	int p[2];
631*053f45beSAndroid Build Coastguard Worker 
632*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
633*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(write(p[1], mem_send, send_len), 0);
634*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(splice(p[0], NULL, self->fd, NULL, send_len, 0), 0);
635*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, mem_recv, send_len, MSG_WAITALL), send_len);
636*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
637*053f45beSAndroid Build Coastguard Worker }
638*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,splice_from_pipe2)639*053f45beSAndroid Build Coastguard Worker TEST_F(tls, splice_from_pipe2)
640*053f45beSAndroid Build Coastguard Worker {
641*053f45beSAndroid Build Coastguard Worker 	int send_len = 16000;
642*053f45beSAndroid Build Coastguard Worker 	char mem_send[16000];
643*053f45beSAndroid Build Coastguard Worker 	char mem_recv[16000];
644*053f45beSAndroid Build Coastguard Worker 	int p2[2];
645*053f45beSAndroid Build Coastguard Worker 	int p[2];
646*053f45beSAndroid Build Coastguard Worker 
647*053f45beSAndroid Build Coastguard Worker 	memrnd(mem_send, sizeof(mem_send));
648*053f45beSAndroid Build Coastguard Worker 
649*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
650*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p2), 0);
651*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(write(p[1], mem_send, 8000), 8000);
652*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(splice(p[0], NULL, self->fd, NULL, 8000, 0), 8000);
653*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(write(p2[1], mem_send + 8000, 8000), 8000);
654*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(splice(p2[0], NULL, self->fd, NULL, 8000, 0), 8000);
655*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, mem_recv, send_len, MSG_WAITALL), send_len);
656*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
657*053f45beSAndroid Build Coastguard Worker }
658*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,send_and_splice)659*053f45beSAndroid Build Coastguard Worker TEST_F(tls, send_and_splice)
660*053f45beSAndroid Build Coastguard Worker {
661*053f45beSAndroid Build Coastguard Worker 	int send_len = TLS_PAYLOAD_MAX_LEN;
662*053f45beSAndroid Build Coastguard Worker 	char mem_send[TLS_PAYLOAD_MAX_LEN];
663*053f45beSAndroid Build Coastguard Worker 	char mem_recv[TLS_PAYLOAD_MAX_LEN];
664*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
665*053f45beSAndroid Build Coastguard Worker 	int send_len2 = 10;
666*053f45beSAndroid Build Coastguard Worker 	char buf[10];
667*053f45beSAndroid Build Coastguard Worker 	int p[2];
668*053f45beSAndroid Build Coastguard Worker 
669*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
670*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len2, 0), send_len2);
671*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len2, MSG_WAITALL), send_len2);
672*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len2), 0);
673*053f45beSAndroid Build Coastguard Worker 
674*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(write(p[1], mem_send, send_len), send_len);
675*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(splice(p[0], NULL, self->fd, NULL, send_len, 0), send_len);
676*053f45beSAndroid Build Coastguard Worker 
677*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, mem_recv, send_len, MSG_WAITALL), send_len);
678*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
679*053f45beSAndroid Build Coastguard Worker }
680*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,splice_to_pipe)681*053f45beSAndroid Build Coastguard Worker TEST_F(tls, splice_to_pipe)
682*053f45beSAndroid Build Coastguard Worker {
683*053f45beSAndroid Build Coastguard Worker 	int send_len = TLS_PAYLOAD_MAX_LEN;
684*053f45beSAndroid Build Coastguard Worker 	char mem_send[TLS_PAYLOAD_MAX_LEN];
685*053f45beSAndroid Build Coastguard Worker 	char mem_recv[TLS_PAYLOAD_MAX_LEN];
686*053f45beSAndroid Build Coastguard Worker 	int p[2];
687*053f45beSAndroid Build Coastguard Worker 
688*053f45beSAndroid Build Coastguard Worker 	memrnd(mem_send, sizeof(mem_send));
689*053f45beSAndroid Build Coastguard Worker 
690*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
691*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, mem_send, send_len, 0), send_len);
692*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(splice(self->cfd, NULL, p[1], NULL, send_len, 0), send_len);
693*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(read(p[0], mem_recv, send_len), send_len);
694*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
695*053f45beSAndroid Build Coastguard Worker }
696*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,splice_cmsg_to_pipe)697*053f45beSAndroid Build Coastguard Worker TEST_F(tls, splice_cmsg_to_pipe)
698*053f45beSAndroid Build Coastguard Worker {
699*053f45beSAndroid Build Coastguard Worker 	char *test_str = "test_read";
700*053f45beSAndroid Build Coastguard Worker 	char record_type = 100;
701*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
702*053f45beSAndroid Build Coastguard Worker 	char buf[10];
703*053f45beSAndroid Build Coastguard Worker 	int p[2];
704*053f45beSAndroid Build Coastguard Worker 
705*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
706*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
707*053f45beSAndroid Build Coastguard Worker 
708*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
709*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_send_cmsg(self->fd, 100, test_str, send_len, 0), 10);
710*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(splice(self->cfd, NULL, p[1], NULL, send_len, 0), -1);
711*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EINVAL);
712*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, 0), -1);
713*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EIO);
714*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
715*053f45beSAndroid Build Coastguard Worker 				buf, sizeof(buf), MSG_WAITALL),
716*053f45beSAndroid Build Coastguard Worker 		  send_len);
717*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
718*053f45beSAndroid Build Coastguard Worker }
719*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,splice_dec_cmsg_to_pipe)720*053f45beSAndroid Build Coastguard Worker TEST_F(tls, splice_dec_cmsg_to_pipe)
721*053f45beSAndroid Build Coastguard Worker {
722*053f45beSAndroid Build Coastguard Worker 	char *test_str = "test_read";
723*053f45beSAndroid Build Coastguard Worker 	char record_type = 100;
724*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
725*053f45beSAndroid Build Coastguard Worker 	char buf[10];
726*053f45beSAndroid Build Coastguard Worker 	int p[2];
727*053f45beSAndroid Build Coastguard Worker 
728*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
729*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
730*053f45beSAndroid Build Coastguard Worker 
731*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
732*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_send_cmsg(self->fd, 100, test_str, send_len, 0), 10);
733*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, 0), -1);
734*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EIO);
735*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(splice(self->cfd, NULL, p[1], NULL, send_len, 0), -1);
736*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EINVAL);
737*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
738*053f45beSAndroid Build Coastguard Worker 				buf, sizeof(buf), MSG_WAITALL),
739*053f45beSAndroid Build Coastguard Worker 		  send_len);
740*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
741*053f45beSAndroid Build Coastguard Worker }
742*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_and_splice)743*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_and_splice)
744*053f45beSAndroid Build Coastguard Worker {
745*053f45beSAndroid Build Coastguard Worker 	int send_len = TLS_PAYLOAD_MAX_LEN;
746*053f45beSAndroid Build Coastguard Worker 	char mem_send[TLS_PAYLOAD_MAX_LEN];
747*053f45beSAndroid Build Coastguard Worker 	char mem_recv[TLS_PAYLOAD_MAX_LEN];
748*053f45beSAndroid Build Coastguard Worker 	int half = send_len / 2;
749*053f45beSAndroid Build Coastguard Worker 	int p[2];
750*053f45beSAndroid Build Coastguard Worker 
751*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
752*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, mem_send, send_len, 0), send_len);
753*053f45beSAndroid Build Coastguard Worker 	/* Recv hald of the record, splice the other half */
754*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, mem_recv, half, MSG_WAITALL), half);
755*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(splice(self->cfd, NULL, p[1], NULL, half, SPLICE_F_NONBLOCK),
756*053f45beSAndroid Build Coastguard Worker 		  half);
757*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(read(p[0], &mem_recv[half], half), half);
758*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
759*053f45beSAndroid Build Coastguard Worker }
760*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,peek_and_splice)761*053f45beSAndroid Build Coastguard Worker TEST_F(tls, peek_and_splice)
762*053f45beSAndroid Build Coastguard Worker {
763*053f45beSAndroid Build Coastguard Worker 	int send_len = TLS_PAYLOAD_MAX_LEN;
764*053f45beSAndroid Build Coastguard Worker 	char mem_send[TLS_PAYLOAD_MAX_LEN];
765*053f45beSAndroid Build Coastguard Worker 	char mem_recv[TLS_PAYLOAD_MAX_LEN];
766*053f45beSAndroid Build Coastguard Worker 	int chunk = TLS_PAYLOAD_MAX_LEN / 4;
767*053f45beSAndroid Build Coastguard Worker 	int n, i, p[2];
768*053f45beSAndroid Build Coastguard Worker 
769*053f45beSAndroid Build Coastguard Worker 	memrnd(mem_send, sizeof(mem_send));
770*053f45beSAndroid Build Coastguard Worker 
771*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(pipe(p), 0);
772*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < 4; i++)
773*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(send(self->fd, &mem_send[chunk * i], chunk, 0),
774*053f45beSAndroid Build Coastguard Worker 			  chunk);
775*053f45beSAndroid Build Coastguard Worker 
776*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, mem_recv, chunk * 5 / 2,
777*053f45beSAndroid Build Coastguard Worker 		       MSG_WAITALL | MSG_PEEK),
778*053f45beSAndroid Build Coastguard Worker 		  chunk * 5 / 2);
779*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, chunk * 5 / 2), 0);
780*053f45beSAndroid Build Coastguard Worker 
781*053f45beSAndroid Build Coastguard Worker 	n = 0;
782*053f45beSAndroid Build Coastguard Worker 	while (n < send_len) {
783*053f45beSAndroid Build Coastguard Worker 		i = splice(self->cfd, NULL, p[1], NULL, send_len - n, 0);
784*053f45beSAndroid Build Coastguard Worker 		EXPECT_GT(i, 0);
785*053f45beSAndroid Build Coastguard Worker 		n += i;
786*053f45beSAndroid Build Coastguard Worker 	}
787*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(n, send_len);
788*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(read(p[0], mem_recv, send_len), send_len);
789*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
790*053f45beSAndroid Build Coastguard Worker }
791*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recvmsg_single)792*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recvmsg_single)
793*053f45beSAndroid Build Coastguard Worker {
794*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_recvmsg_single";
795*053f45beSAndroid Build Coastguard Worker 	int send_len = strlen(test_str) + 1;
796*053f45beSAndroid Build Coastguard Worker 	char buf[20];
797*053f45beSAndroid Build Coastguard Worker 	struct msghdr hdr;
798*053f45beSAndroid Build Coastguard Worker 	struct iovec vec;
799*053f45beSAndroid Build Coastguard Worker 
800*053f45beSAndroid Build Coastguard Worker 	memset(&hdr, 0, sizeof(hdr));
801*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
802*053f45beSAndroid Build Coastguard Worker 	vec.iov_base = (char *)buf;
803*053f45beSAndroid Build Coastguard Worker 	vec.iov_len = send_len;
804*053f45beSAndroid Build Coastguard Worker 	hdr.msg_iovlen = 1;
805*053f45beSAndroid Build Coastguard Worker 	hdr.msg_iov = &vec;
806*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
807*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
808*053f45beSAndroid Build Coastguard Worker }
809*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recvmsg_single_max)810*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recvmsg_single_max)
811*053f45beSAndroid Build Coastguard Worker {
812*053f45beSAndroid Build Coastguard Worker 	int send_len = TLS_PAYLOAD_MAX_LEN;
813*053f45beSAndroid Build Coastguard Worker 	char send_mem[TLS_PAYLOAD_MAX_LEN];
814*053f45beSAndroid Build Coastguard Worker 	char recv_mem[TLS_PAYLOAD_MAX_LEN];
815*053f45beSAndroid Build Coastguard Worker 	struct iovec vec;
816*053f45beSAndroid Build Coastguard Worker 	struct msghdr hdr;
817*053f45beSAndroid Build Coastguard Worker 
818*053f45beSAndroid Build Coastguard Worker 	memrnd(send_mem, sizeof(send_mem));
819*053f45beSAndroid Build Coastguard Worker 
820*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, send_mem, send_len, 0), send_len);
821*053f45beSAndroid Build Coastguard Worker 	vec.iov_base = (char *)recv_mem;
822*053f45beSAndroid Build Coastguard Worker 	vec.iov_len = TLS_PAYLOAD_MAX_LEN;
823*053f45beSAndroid Build Coastguard Worker 
824*053f45beSAndroid Build Coastguard Worker 	hdr.msg_iovlen = 1;
825*053f45beSAndroid Build Coastguard Worker 	hdr.msg_iov = &vec;
826*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
827*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem, send_len), 0);
828*053f45beSAndroid Build Coastguard Worker }
829*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recvmsg_multiple)830*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recvmsg_multiple)
831*053f45beSAndroid Build Coastguard Worker {
832*053f45beSAndroid Build Coastguard Worker 	unsigned int msg_iovlen = 1024;
833*053f45beSAndroid Build Coastguard Worker 	struct iovec vec[1024];
834*053f45beSAndroid Build Coastguard Worker 	char *iov_base[1024];
835*053f45beSAndroid Build Coastguard Worker 	unsigned int iov_len = 16;
836*053f45beSAndroid Build Coastguard Worker 	int send_len = 1 << 14;
837*053f45beSAndroid Build Coastguard Worker 	char buf[1 << 14];
838*053f45beSAndroid Build Coastguard Worker 	struct msghdr hdr;
839*053f45beSAndroid Build Coastguard Worker 	int i;
840*053f45beSAndroid Build Coastguard Worker 
841*053f45beSAndroid Build Coastguard Worker 	memrnd(buf, sizeof(buf));
842*053f45beSAndroid Build Coastguard Worker 
843*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, buf, send_len, 0), send_len);
844*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < msg_iovlen; i++) {
845*053f45beSAndroid Build Coastguard Worker 		iov_base[i] = (char *)malloc(iov_len);
846*053f45beSAndroid Build Coastguard Worker 		vec[i].iov_base = iov_base[i];
847*053f45beSAndroid Build Coastguard Worker 		vec[i].iov_len = iov_len;
848*053f45beSAndroid Build Coastguard Worker 	}
849*053f45beSAndroid Build Coastguard Worker 
850*053f45beSAndroid Build Coastguard Worker 	hdr.msg_iovlen = msg_iovlen;
851*053f45beSAndroid Build Coastguard Worker 	hdr.msg_iov = vec;
852*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
853*053f45beSAndroid Build Coastguard Worker 
854*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < msg_iovlen; i++)
855*053f45beSAndroid Build Coastguard Worker 		free(iov_base[i]);
856*053f45beSAndroid Build Coastguard Worker }
857*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,single_send_multiple_recv)858*053f45beSAndroid Build Coastguard Worker TEST_F(tls, single_send_multiple_recv)
859*053f45beSAndroid Build Coastguard Worker {
860*053f45beSAndroid Build Coastguard Worker 	unsigned int total_len = TLS_PAYLOAD_MAX_LEN * 2;
861*053f45beSAndroid Build Coastguard Worker 	unsigned int send_len = TLS_PAYLOAD_MAX_LEN;
862*053f45beSAndroid Build Coastguard Worker 	char send_mem[TLS_PAYLOAD_MAX_LEN * 2];
863*053f45beSAndroid Build Coastguard Worker 	char recv_mem[TLS_PAYLOAD_MAX_LEN * 2];
864*053f45beSAndroid Build Coastguard Worker 
865*053f45beSAndroid Build Coastguard Worker 	memrnd(send_mem, sizeof(send_mem));
866*053f45beSAndroid Build Coastguard Worker 
867*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(send(self->fd, send_mem, total_len, 0), 0);
868*053f45beSAndroid Build Coastguard Worker 	memset(recv_mem, 0, total_len);
869*053f45beSAndroid Build Coastguard Worker 
870*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, recv_mem, send_len, 0), -1);
871*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, recv_mem + send_len, send_len, 0), -1);
872*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem, total_len), 0);
873*053f45beSAndroid Build Coastguard Worker }
874*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,multiple_send_single_recv)875*053f45beSAndroid Build Coastguard Worker TEST_F(tls, multiple_send_single_recv)
876*053f45beSAndroid Build Coastguard Worker {
877*053f45beSAndroid Build Coastguard Worker 	unsigned int total_len = 2 * 10;
878*053f45beSAndroid Build Coastguard Worker 	unsigned int send_len = 10;
879*053f45beSAndroid Build Coastguard Worker 	char recv_mem[2 * 10];
880*053f45beSAndroid Build Coastguard Worker 	char send_mem[10];
881*053f45beSAndroid Build Coastguard Worker 
882*053f45beSAndroid Build Coastguard Worker 	memrnd(send_mem, sizeof(send_mem));
883*053f45beSAndroid Build Coastguard Worker 
884*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(send(self->fd, send_mem, send_len, 0), 0);
885*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(send(self->fd, send_mem, send_len, 0), 0);
886*053f45beSAndroid Build Coastguard Worker 	memset(recv_mem, 0, total_len);
887*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem, total_len, MSG_WAITALL), total_len);
888*053f45beSAndroid Build Coastguard Worker 
889*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem, send_len), 0);
890*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem + send_len, send_len), 0);
891*053f45beSAndroid Build Coastguard Worker }
892*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,single_send_multiple_recv_non_align)893*053f45beSAndroid Build Coastguard Worker TEST_F(tls, single_send_multiple_recv_non_align)
894*053f45beSAndroid Build Coastguard Worker {
895*053f45beSAndroid Build Coastguard Worker 	const unsigned int total_len = 15;
896*053f45beSAndroid Build Coastguard Worker 	const unsigned int recv_len = 10;
897*053f45beSAndroid Build Coastguard Worker 	char recv_mem[recv_len * 2];
898*053f45beSAndroid Build Coastguard Worker 	char send_mem[total_len];
899*053f45beSAndroid Build Coastguard Worker 
900*053f45beSAndroid Build Coastguard Worker 	memrnd(send_mem, sizeof(send_mem));
901*053f45beSAndroid Build Coastguard Worker 
902*053f45beSAndroid Build Coastguard Worker 	EXPECT_GE(send(self->fd, send_mem, total_len, 0), 0);
903*053f45beSAndroid Build Coastguard Worker 	memset(recv_mem, 0, total_len);
904*053f45beSAndroid Build Coastguard Worker 
905*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem, recv_len, 0), recv_len);
906*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem + recv_len, recv_len, 0), 5);
907*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem, total_len), 0);
908*053f45beSAndroid Build Coastguard Worker }
909*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_partial)910*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_partial)
911*053f45beSAndroid Build Coastguard Worker {
912*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read_partial";
913*053f45beSAndroid Build Coastguard Worker 	char const *test_str_first = "test_read";
914*053f45beSAndroid Build Coastguard Worker 	char const *test_str_second = "_partial";
915*053f45beSAndroid Build Coastguard Worker 	int send_len = strlen(test_str) + 1;
916*053f45beSAndroid Build Coastguard Worker 	char recv_mem[18];
917*053f45beSAndroid Build Coastguard Worker 
918*053f45beSAndroid Build Coastguard Worker 	memset(recv_mem, 0, sizeof(recv_mem));
919*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
920*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, recv_mem, strlen(test_str_first),
921*053f45beSAndroid Build Coastguard Worker 		       MSG_WAITALL), -1);
922*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str_first, recv_mem, strlen(test_str_first)), 0);
923*053f45beSAndroid Build Coastguard Worker 	memset(recv_mem, 0, sizeof(recv_mem));
924*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, recv_mem, strlen(test_str_second),
925*053f45beSAndroid Build Coastguard Worker 		       MSG_WAITALL), -1);
926*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str_second, recv_mem, strlen(test_str_second)),
927*053f45beSAndroid Build Coastguard Worker 		  0);
928*053f45beSAndroid Build Coastguard Worker }
929*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_nonblock)930*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_nonblock)
931*053f45beSAndroid Build Coastguard Worker {
932*053f45beSAndroid Build Coastguard Worker 	char buf[4096];
933*053f45beSAndroid Build Coastguard Worker 	bool err;
934*053f45beSAndroid Build Coastguard Worker 
935*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, sizeof(buf), MSG_DONTWAIT), -1);
936*053f45beSAndroid Build Coastguard Worker 	err = (errno == EAGAIN || errno == EWOULDBLOCK);
937*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(err, true);
938*053f45beSAndroid Build Coastguard Worker }
939*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_peek)940*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_peek)
941*053f45beSAndroid Build Coastguard Worker {
942*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read_peek";
943*053f45beSAndroid Build Coastguard Worker 	int send_len = strlen(test_str) + 1;
944*053f45beSAndroid Build Coastguard Worker 	char buf[15];
945*053f45beSAndroid Build Coastguard Worker 
946*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
947*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_PEEK), send_len);
948*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
949*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, sizeof(buf));
950*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, 0), send_len);
951*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
952*053f45beSAndroid Build Coastguard Worker }
953*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_peek_multiple)954*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_peek_multiple)
955*053f45beSAndroid Build Coastguard Worker {
956*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read_peek";
957*053f45beSAndroid Build Coastguard Worker 	int send_len = strlen(test_str) + 1;
958*053f45beSAndroid Build Coastguard Worker 	unsigned int num_peeks = 100;
959*053f45beSAndroid Build Coastguard Worker 	char buf[15];
960*053f45beSAndroid Build Coastguard Worker 	int i;
961*053f45beSAndroid Build Coastguard Worker 
962*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
963*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < num_peeks; i++) {
964*053f45beSAndroid Build Coastguard Worker 		EXPECT_NE(recv(self->cfd, buf, send_len, MSG_PEEK), -1);
965*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
966*053f45beSAndroid Build Coastguard Worker 		memset(buf, 0, sizeof(buf));
967*053f45beSAndroid Build Coastguard Worker 	}
968*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
969*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
970*053f45beSAndroid Build Coastguard Worker }
971*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_peek_multiple_records)972*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_peek_multiple_records)
973*053f45beSAndroid Build Coastguard Worker {
974*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read_peek_mult_recs";
975*053f45beSAndroid Build Coastguard Worker 	char const *test_str_first = "test_read_peek";
976*053f45beSAndroid Build Coastguard Worker 	char const *test_str_second = "_mult_recs";
977*053f45beSAndroid Build Coastguard Worker 	int len;
978*053f45beSAndroid Build Coastguard Worker 	char buf[64];
979*053f45beSAndroid Build Coastguard Worker 
980*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_first);
981*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str_first, len, 0), len);
982*053f45beSAndroid Build Coastguard Worker 
983*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_second) + 1;
984*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str_second, len, 0), len);
985*053f45beSAndroid Build Coastguard Worker 
986*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_first);
987*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, len);
988*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, len, MSG_PEEK | MSG_WAITALL), len);
989*053f45beSAndroid Build Coastguard Worker 
990*053f45beSAndroid Build Coastguard Worker 	/* MSG_PEEK can only peek into the current record. */
991*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_first);
992*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str_first, buf, len), 0);
993*053f45beSAndroid Build Coastguard Worker 
994*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str) + 1;
995*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, len);
996*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, len, MSG_WAITALL), len);
997*053f45beSAndroid Build Coastguard Worker 
998*053f45beSAndroid Build Coastguard Worker 	/* Non-MSG_PEEK will advance strparser (and therefore record)
999*053f45beSAndroid Build Coastguard Worker 	 * however.
1000*053f45beSAndroid Build Coastguard Worker 	 */
1001*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str) + 1;
1002*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, len), 0);
1003*053f45beSAndroid Build Coastguard Worker 
1004*053f45beSAndroid Build Coastguard Worker 	/* MSG_MORE will hold current record open, so later MSG_PEEK
1005*053f45beSAndroid Build Coastguard Worker 	 * will see everything.
1006*053f45beSAndroid Build Coastguard Worker 	 */
1007*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_first);
1008*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str_first, len, MSG_MORE), len);
1009*053f45beSAndroid Build Coastguard Worker 
1010*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_second) + 1;
1011*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str_second, len, 0), len);
1012*053f45beSAndroid Build Coastguard Worker 
1013*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str) + 1;
1014*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, len);
1015*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, len, MSG_PEEK | MSG_WAITALL), len);
1016*053f45beSAndroid Build Coastguard Worker 
1017*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str) + 1;
1018*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, len), 0);
1019*053f45beSAndroid Build Coastguard Worker }
1020*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_peek_large_buf_mult_recs)1021*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_peek_large_buf_mult_recs)
1022*053f45beSAndroid Build Coastguard Worker {
1023*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read_peek_mult_recs";
1024*053f45beSAndroid Build Coastguard Worker 	char const *test_str_first = "test_read_peek";
1025*053f45beSAndroid Build Coastguard Worker 	char const *test_str_second = "_mult_recs";
1026*053f45beSAndroid Build Coastguard Worker 	int len;
1027*053f45beSAndroid Build Coastguard Worker 	char buf[64];
1028*053f45beSAndroid Build Coastguard Worker 
1029*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_first);
1030*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str_first, len, 0), len);
1031*053f45beSAndroid Build Coastguard Worker 
1032*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str_second) + 1;
1033*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str_second, len, 0), len);
1034*053f45beSAndroid Build Coastguard Worker 
1035*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str) + 1;
1036*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, len);
1037*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE((len = recv(self->cfd, buf, len,
1038*053f45beSAndroid Build Coastguard Worker 			      MSG_PEEK | MSG_WAITALL)), -1);
1039*053f45beSAndroid Build Coastguard Worker 	len = strlen(test_str) + 1;
1040*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(test_str, buf, len), 0);
1041*053f45beSAndroid Build Coastguard Worker }
1042*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,recv_lowat)1043*053f45beSAndroid Build Coastguard Worker TEST_F(tls, recv_lowat)
1044*053f45beSAndroid Build Coastguard Worker {
1045*053f45beSAndroid Build Coastguard Worker 	char send_mem[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
1046*053f45beSAndroid Build Coastguard Worker 	char recv_mem[20];
1047*053f45beSAndroid Build Coastguard Worker 	int lowat = 8;
1048*053f45beSAndroid Build Coastguard Worker 
1049*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, send_mem, 10, 0), 10);
1050*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, send_mem, 5, 0), 5);
1051*053f45beSAndroid Build Coastguard Worker 
1052*053f45beSAndroid Build Coastguard Worker 	memset(recv_mem, 0, 20);
1053*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVLOWAT,
1054*053f45beSAndroid Build Coastguard Worker 			     &lowat, sizeof(lowat)), 0);
1055*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem, 1, MSG_WAITALL), 1);
1056*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem + 1, 6, MSG_WAITALL), 6);
1057*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem + 7, 10, 0), 8);
1058*053f45beSAndroid Build Coastguard Worker 
1059*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem, 10), 0);
1060*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0);
1061*053f45beSAndroid Build Coastguard Worker }
1062*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,bidir)1063*053f45beSAndroid Build Coastguard Worker TEST_F(tls, bidir)
1064*053f45beSAndroid Build Coastguard Worker {
1065*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
1066*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
1067*053f45beSAndroid Build Coastguard Worker 	char buf[10];
1068*053f45beSAndroid Build Coastguard Worker 	int ret;
1069*053f45beSAndroid Build Coastguard Worker 
1070*053f45beSAndroid Build Coastguard Worker 	if (!self->notls) {
1071*053f45beSAndroid Build Coastguard Worker 		struct tls_crypto_info_keys tls12;
1072*053f45beSAndroid Build Coastguard Worker 
1073*053f45beSAndroid Build Coastguard Worker 		tls_crypto_info_init(variant->tls_version, variant->cipher_type,
1074*053f45beSAndroid Build Coastguard Worker 				     &tls12);
1075*053f45beSAndroid Build Coastguard Worker 
1076*053f45beSAndroid Build Coastguard Worker 		ret = setsockopt(self->fd, SOL_TLS, TLS_RX, &tls12,
1077*053f45beSAndroid Build Coastguard Worker 				 tls12.len);
1078*053f45beSAndroid Build Coastguard Worker 		ASSERT_EQ(ret, 0);
1079*053f45beSAndroid Build Coastguard Worker 
1080*053f45beSAndroid Build Coastguard Worker 		ret = setsockopt(self->cfd, SOL_TLS, TLS_TX, &tls12,
1081*053f45beSAndroid Build Coastguard Worker 				 tls12.len);
1082*053f45beSAndroid Build Coastguard Worker 		ASSERT_EQ(ret, 0);
1083*053f45beSAndroid Build Coastguard Worker 	}
1084*053f45beSAndroid Build Coastguard Worker 
1085*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(strlen(test_str) + 1, send_len);
1086*053f45beSAndroid Build Coastguard Worker 
1087*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
1088*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
1089*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
1090*053f45beSAndroid Build Coastguard Worker 
1091*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, sizeof(buf));
1092*053f45beSAndroid Build Coastguard Worker 
1093*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->cfd, test_str, send_len, 0), send_len);
1094*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->fd, buf, send_len, 0), -1);
1095*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
1096*053f45beSAndroid Build Coastguard Worker };
1097*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,pollin)1098*053f45beSAndroid Build Coastguard Worker TEST_F(tls, pollin)
1099*053f45beSAndroid Build Coastguard Worker {
1100*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_poll";
1101*053f45beSAndroid Build Coastguard Worker 	struct pollfd fd = { 0, 0, 0 };
1102*053f45beSAndroid Build Coastguard Worker 	char buf[10];
1103*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
1104*053f45beSAndroid Build Coastguard Worker 
1105*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
1106*053f45beSAndroid Build Coastguard Worker 	fd.fd = self->cfd;
1107*053f45beSAndroid Build Coastguard Worker 	fd.events = POLLIN;
1108*053f45beSAndroid Build Coastguard Worker 
1109*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(poll(&fd, 1, 20), 1);
1110*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(fd.revents & POLLIN, 1);
1111*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_WAITALL), send_len);
1112*053f45beSAndroid Build Coastguard Worker 	/* Test timing out */
1113*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(poll(&fd, 1, 20), 0);
1114*053f45beSAndroid Build Coastguard Worker }
1115*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,poll_wait)1116*053f45beSAndroid Build Coastguard Worker TEST_F(tls, poll_wait)
1117*053f45beSAndroid Build Coastguard Worker {
1118*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_poll_wait";
1119*053f45beSAndroid Build Coastguard Worker 	int send_len = strlen(test_str) + 1;
1120*053f45beSAndroid Build Coastguard Worker 	struct pollfd fd = { 0, 0, 0 };
1121*053f45beSAndroid Build Coastguard Worker 	char recv_mem[15];
1122*053f45beSAndroid Build Coastguard Worker 
1123*053f45beSAndroid Build Coastguard Worker 	fd.fd = self->cfd;
1124*053f45beSAndroid Build Coastguard Worker 	fd.events = POLLIN;
1125*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
1126*053f45beSAndroid Build Coastguard Worker 	/* Set timeout to inf. secs */
1127*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(poll(&fd, 1, -1), 1);
1128*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(fd.revents & POLLIN, 1);
1129*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem, send_len, MSG_WAITALL), send_len);
1130*053f45beSAndroid Build Coastguard Worker }
1131*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,poll_wait_split)1132*053f45beSAndroid Build Coastguard Worker TEST_F(tls, poll_wait_split)
1133*053f45beSAndroid Build Coastguard Worker {
1134*053f45beSAndroid Build Coastguard Worker 	struct pollfd fd = { 0, 0, 0 };
1135*053f45beSAndroid Build Coastguard Worker 	char send_mem[20] = {};
1136*053f45beSAndroid Build Coastguard Worker 	char recv_mem[15];
1137*053f45beSAndroid Build Coastguard Worker 
1138*053f45beSAndroid Build Coastguard Worker 	fd.fd = self->cfd;
1139*053f45beSAndroid Build Coastguard Worker 	fd.events = POLLIN;
1140*053f45beSAndroid Build Coastguard Worker 	/* Send 20 bytes */
1141*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, send_mem, sizeof(send_mem), 0),
1142*053f45beSAndroid Build Coastguard Worker 		  sizeof(send_mem));
1143*053f45beSAndroid Build Coastguard Worker 	/* Poll with inf. timeout */
1144*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(poll(&fd, 1, -1), 1);
1145*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(fd.revents & POLLIN, 1);
1146*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), MSG_WAITALL),
1147*053f45beSAndroid Build Coastguard Worker 		  sizeof(recv_mem));
1148*053f45beSAndroid Build Coastguard Worker 
1149*053f45beSAndroid Build Coastguard Worker 	/* Now the remaining 5 bytes of record data are in TLS ULP */
1150*053f45beSAndroid Build Coastguard Worker 	fd.fd = self->cfd;
1151*053f45beSAndroid Build Coastguard Worker 	fd.events = POLLIN;
1152*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(poll(&fd, 1, -1), 1);
1153*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(fd.revents & POLLIN, 1);
1154*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0),
1155*053f45beSAndroid Build Coastguard Worker 		  sizeof(send_mem) - sizeof(recv_mem));
1156*053f45beSAndroid Build Coastguard Worker }
1157*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,blocking)1158*053f45beSAndroid Build Coastguard Worker TEST_F(tls, blocking)
1159*053f45beSAndroid Build Coastguard Worker {
1160*053f45beSAndroid Build Coastguard Worker 	size_t data = 100000;
1161*053f45beSAndroid Build Coastguard Worker 	int res = fork();
1162*053f45beSAndroid Build Coastguard Worker 
1163*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(res, -1);
1164*053f45beSAndroid Build Coastguard Worker 
1165*053f45beSAndroid Build Coastguard Worker 	if (res) {
1166*053f45beSAndroid Build Coastguard Worker 		/* parent */
1167*053f45beSAndroid Build Coastguard Worker 		size_t left = data;
1168*053f45beSAndroid Build Coastguard Worker 		char buf[16384];
1169*053f45beSAndroid Build Coastguard Worker 		int status;
1170*053f45beSAndroid Build Coastguard Worker 		int pid2;
1171*053f45beSAndroid Build Coastguard Worker 
1172*053f45beSAndroid Build Coastguard Worker 		while (left) {
1173*053f45beSAndroid Build Coastguard Worker 			int res = send(self->fd, buf,
1174*053f45beSAndroid Build Coastguard Worker 				       left > 16384 ? 16384 : left, 0);
1175*053f45beSAndroid Build Coastguard Worker 
1176*053f45beSAndroid Build Coastguard Worker 			EXPECT_GE(res, 0);
1177*053f45beSAndroid Build Coastguard Worker 			left -= res;
1178*053f45beSAndroid Build Coastguard Worker 		}
1179*053f45beSAndroid Build Coastguard Worker 
1180*053f45beSAndroid Build Coastguard Worker 		pid2 = wait(&status);
1181*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(status, 0);
1182*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(res, pid2);
1183*053f45beSAndroid Build Coastguard Worker 	} else {
1184*053f45beSAndroid Build Coastguard Worker 		/* child */
1185*053f45beSAndroid Build Coastguard Worker 		size_t left = data;
1186*053f45beSAndroid Build Coastguard Worker 		char buf[16384];
1187*053f45beSAndroid Build Coastguard Worker 
1188*053f45beSAndroid Build Coastguard Worker 		while (left) {
1189*053f45beSAndroid Build Coastguard Worker 			int res = recv(self->cfd, buf,
1190*053f45beSAndroid Build Coastguard Worker 				       left > 16384 ? 16384 : left, 0);
1191*053f45beSAndroid Build Coastguard Worker 
1192*053f45beSAndroid Build Coastguard Worker 			EXPECT_GE(res, 0);
1193*053f45beSAndroid Build Coastguard Worker 			left -= res;
1194*053f45beSAndroid Build Coastguard Worker 		}
1195*053f45beSAndroid Build Coastguard Worker 	}
1196*053f45beSAndroid Build Coastguard Worker }
1197*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,nonblocking)1198*053f45beSAndroid Build Coastguard Worker TEST_F(tls, nonblocking)
1199*053f45beSAndroid Build Coastguard Worker {
1200*053f45beSAndroid Build Coastguard Worker 	size_t data = 100000;
1201*053f45beSAndroid Build Coastguard Worker 	int sendbuf = 100;
1202*053f45beSAndroid Build Coastguard Worker 	int flags;
1203*053f45beSAndroid Build Coastguard Worker 	int res;
1204*053f45beSAndroid Build Coastguard Worker 
1205*053f45beSAndroid Build Coastguard Worker 	flags = fcntl(self->fd, F_GETFL, 0);
1206*053f45beSAndroid Build Coastguard Worker 	fcntl(self->fd, F_SETFL, flags | O_NONBLOCK);
1207*053f45beSAndroid Build Coastguard Worker 	fcntl(self->cfd, F_SETFL, flags | O_NONBLOCK);
1208*053f45beSAndroid Build Coastguard Worker 
1209*053f45beSAndroid Build Coastguard Worker 	/* Ensure nonblocking behavior by imposing a small send
1210*053f45beSAndroid Build Coastguard Worker 	 * buffer.
1211*053f45beSAndroid Build Coastguard Worker 	 */
1212*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(setsockopt(self->fd, SOL_SOCKET, SO_SNDBUF,
1213*053f45beSAndroid Build Coastguard Worker 			     &sendbuf, sizeof(sendbuf)), 0);
1214*053f45beSAndroid Build Coastguard Worker 
1215*053f45beSAndroid Build Coastguard Worker 	res = fork();
1216*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(res, -1);
1217*053f45beSAndroid Build Coastguard Worker 
1218*053f45beSAndroid Build Coastguard Worker 	if (res) {
1219*053f45beSAndroid Build Coastguard Worker 		/* parent */
1220*053f45beSAndroid Build Coastguard Worker 		bool eagain = false;
1221*053f45beSAndroid Build Coastguard Worker 		size_t left = data;
1222*053f45beSAndroid Build Coastguard Worker 		char buf[16384];
1223*053f45beSAndroid Build Coastguard Worker 		int status;
1224*053f45beSAndroid Build Coastguard Worker 		int pid2;
1225*053f45beSAndroid Build Coastguard Worker 
1226*053f45beSAndroid Build Coastguard Worker 		while (left) {
1227*053f45beSAndroid Build Coastguard Worker 			int res = send(self->fd, buf,
1228*053f45beSAndroid Build Coastguard Worker 				       left > 16384 ? 16384 : left, 0);
1229*053f45beSAndroid Build Coastguard Worker 
1230*053f45beSAndroid Build Coastguard Worker 			if (res == -1 && errno == EAGAIN) {
1231*053f45beSAndroid Build Coastguard Worker 				eagain = true;
1232*053f45beSAndroid Build Coastguard Worker 				usleep(10000);
1233*053f45beSAndroid Build Coastguard Worker 				continue;
1234*053f45beSAndroid Build Coastguard Worker 			}
1235*053f45beSAndroid Build Coastguard Worker 			EXPECT_GE(res, 0);
1236*053f45beSAndroid Build Coastguard Worker 			left -= res;
1237*053f45beSAndroid Build Coastguard Worker 		}
1238*053f45beSAndroid Build Coastguard Worker 
1239*053f45beSAndroid Build Coastguard Worker 		EXPECT_TRUE(eagain);
1240*053f45beSAndroid Build Coastguard Worker 		pid2 = wait(&status);
1241*053f45beSAndroid Build Coastguard Worker 
1242*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(status, 0);
1243*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(res, pid2);
1244*053f45beSAndroid Build Coastguard Worker 	} else {
1245*053f45beSAndroid Build Coastguard Worker 		/* child */
1246*053f45beSAndroid Build Coastguard Worker 		bool eagain = false;
1247*053f45beSAndroid Build Coastguard Worker 		size_t left = data;
1248*053f45beSAndroid Build Coastguard Worker 		char buf[16384];
1249*053f45beSAndroid Build Coastguard Worker 
1250*053f45beSAndroid Build Coastguard Worker 		while (left) {
1251*053f45beSAndroid Build Coastguard Worker 			int res = recv(self->cfd, buf,
1252*053f45beSAndroid Build Coastguard Worker 				       left > 16384 ? 16384 : left, 0);
1253*053f45beSAndroid Build Coastguard Worker 
1254*053f45beSAndroid Build Coastguard Worker 			if (res == -1 && errno == EAGAIN) {
1255*053f45beSAndroid Build Coastguard Worker 				eagain = true;
1256*053f45beSAndroid Build Coastguard Worker 				usleep(10000);
1257*053f45beSAndroid Build Coastguard Worker 				continue;
1258*053f45beSAndroid Build Coastguard Worker 			}
1259*053f45beSAndroid Build Coastguard Worker 			EXPECT_GE(res, 0);
1260*053f45beSAndroid Build Coastguard Worker 			left -= res;
1261*053f45beSAndroid Build Coastguard Worker 		}
1262*053f45beSAndroid Build Coastguard Worker 		EXPECT_TRUE(eagain);
1263*053f45beSAndroid Build Coastguard Worker 	}
1264*053f45beSAndroid Build Coastguard Worker }
1265*053f45beSAndroid Build Coastguard Worker 
1266*053f45beSAndroid Build Coastguard Worker static void
test_mutliproc(struct __test_metadata * _metadata,struct _test_data_tls * self,bool sendpg,unsigned int n_readers,unsigned int n_writers)1267*053f45beSAndroid Build Coastguard Worker test_mutliproc(struct __test_metadata *_metadata, struct _test_data_tls *self,
1268*053f45beSAndroid Build Coastguard Worker 	       bool sendpg, unsigned int n_readers, unsigned int n_writers)
1269*053f45beSAndroid Build Coastguard Worker {
1270*053f45beSAndroid Build Coastguard Worker 	const unsigned int n_children = n_readers + n_writers;
1271*053f45beSAndroid Build Coastguard Worker 	const size_t data = 6 * 1000 * 1000;
1272*053f45beSAndroid Build Coastguard Worker 	const size_t file_sz = data / 100;
1273*053f45beSAndroid Build Coastguard Worker 	size_t read_bias, write_bias;
1274*053f45beSAndroid Build Coastguard Worker 	int i, fd, child_id;
1275*053f45beSAndroid Build Coastguard Worker 	char buf[file_sz];
1276*053f45beSAndroid Build Coastguard Worker 	pid_t pid;
1277*053f45beSAndroid Build Coastguard Worker 
1278*053f45beSAndroid Build Coastguard Worker 	/* Only allow multiples for simplicity */
1279*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(!(n_readers % n_writers) || !(n_writers % n_readers), true);
1280*053f45beSAndroid Build Coastguard Worker 	read_bias = n_writers / n_readers ?: 1;
1281*053f45beSAndroid Build Coastguard Worker 	write_bias = n_readers / n_writers ?: 1;
1282*053f45beSAndroid Build Coastguard Worker 
1283*053f45beSAndroid Build Coastguard Worker 	/* prep a file to send */
1284*053f45beSAndroid Build Coastguard Worker 	fd = open("/tmp/", O_TMPFILE | O_RDWR, 0600);
1285*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(fd, 0);
1286*053f45beSAndroid Build Coastguard Worker 
1287*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0xac, file_sz);
1288*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(write(fd, buf, file_sz), file_sz);
1289*053f45beSAndroid Build Coastguard Worker 
1290*053f45beSAndroid Build Coastguard Worker 	/* spawn children */
1291*053f45beSAndroid Build Coastguard Worker 	for (child_id = 0; child_id < n_children; child_id++) {
1292*053f45beSAndroid Build Coastguard Worker 		pid = fork();
1293*053f45beSAndroid Build Coastguard Worker 		ASSERT_NE(pid, -1);
1294*053f45beSAndroid Build Coastguard Worker 		if (!pid)
1295*053f45beSAndroid Build Coastguard Worker 			break;
1296*053f45beSAndroid Build Coastguard Worker 	}
1297*053f45beSAndroid Build Coastguard Worker 
1298*053f45beSAndroid Build Coastguard Worker 	/* parent waits for all children */
1299*053f45beSAndroid Build Coastguard Worker 	if (pid) {
1300*053f45beSAndroid Build Coastguard Worker 		for (i = 0; i < n_children; i++) {
1301*053f45beSAndroid Build Coastguard Worker 			int status;
1302*053f45beSAndroid Build Coastguard Worker 
1303*053f45beSAndroid Build Coastguard Worker 			wait(&status);
1304*053f45beSAndroid Build Coastguard Worker 			EXPECT_EQ(status, 0);
1305*053f45beSAndroid Build Coastguard Worker 		}
1306*053f45beSAndroid Build Coastguard Worker 
1307*053f45beSAndroid Build Coastguard Worker 		return;
1308*053f45beSAndroid Build Coastguard Worker 	}
1309*053f45beSAndroid Build Coastguard Worker 
1310*053f45beSAndroid Build Coastguard Worker 	/* Split threads for reading and writing */
1311*053f45beSAndroid Build Coastguard Worker 	if (child_id < n_readers) {
1312*053f45beSAndroid Build Coastguard Worker 		size_t left = data * read_bias;
1313*053f45beSAndroid Build Coastguard Worker 		char rb[8001];
1314*053f45beSAndroid Build Coastguard Worker 
1315*053f45beSAndroid Build Coastguard Worker 		while (left) {
1316*053f45beSAndroid Build Coastguard Worker 			int res;
1317*053f45beSAndroid Build Coastguard Worker 
1318*053f45beSAndroid Build Coastguard Worker 			res = recv(self->cfd, rb,
1319*053f45beSAndroid Build Coastguard Worker 				   left > sizeof(rb) ? sizeof(rb) : left, 0);
1320*053f45beSAndroid Build Coastguard Worker 
1321*053f45beSAndroid Build Coastguard Worker 			EXPECT_GE(res, 0);
1322*053f45beSAndroid Build Coastguard Worker 			left -= res;
1323*053f45beSAndroid Build Coastguard Worker 		}
1324*053f45beSAndroid Build Coastguard Worker 	} else {
1325*053f45beSAndroid Build Coastguard Worker 		size_t left = data * write_bias;
1326*053f45beSAndroid Build Coastguard Worker 
1327*053f45beSAndroid Build Coastguard Worker 		while (left) {
1328*053f45beSAndroid Build Coastguard Worker 			int res;
1329*053f45beSAndroid Build Coastguard Worker 
1330*053f45beSAndroid Build Coastguard Worker 			ASSERT_EQ(lseek(fd, 0, SEEK_SET), 0);
1331*053f45beSAndroid Build Coastguard Worker 			if (sendpg)
1332*053f45beSAndroid Build Coastguard Worker 				res = sendfile(self->fd, fd, NULL,
1333*053f45beSAndroid Build Coastguard Worker 					       left > file_sz ? file_sz : left);
1334*053f45beSAndroid Build Coastguard Worker 			else
1335*053f45beSAndroid Build Coastguard Worker 				res = send(self->fd, buf,
1336*053f45beSAndroid Build Coastguard Worker 					   left > file_sz ? file_sz : left, 0);
1337*053f45beSAndroid Build Coastguard Worker 
1338*053f45beSAndroid Build Coastguard Worker 			EXPECT_GE(res, 0);
1339*053f45beSAndroid Build Coastguard Worker 			left -= res;
1340*053f45beSAndroid Build Coastguard Worker 		}
1341*053f45beSAndroid Build Coastguard Worker 	}
1342*053f45beSAndroid Build Coastguard Worker }
1343*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,mutliproc_even)1344*053f45beSAndroid Build Coastguard Worker TEST_F(tls, mutliproc_even)
1345*053f45beSAndroid Build Coastguard Worker {
1346*053f45beSAndroid Build Coastguard Worker 	test_mutliproc(_metadata, self, false, 6, 6);
1347*053f45beSAndroid Build Coastguard Worker }
1348*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,mutliproc_readers)1349*053f45beSAndroid Build Coastguard Worker TEST_F(tls, mutliproc_readers)
1350*053f45beSAndroid Build Coastguard Worker {
1351*053f45beSAndroid Build Coastguard Worker 	test_mutliproc(_metadata, self, false, 4, 12);
1352*053f45beSAndroid Build Coastguard Worker }
1353*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,mutliproc_writers)1354*053f45beSAndroid Build Coastguard Worker TEST_F(tls, mutliproc_writers)
1355*053f45beSAndroid Build Coastguard Worker {
1356*053f45beSAndroid Build Coastguard Worker 	test_mutliproc(_metadata, self, false, 10, 2);
1357*053f45beSAndroid Build Coastguard Worker }
1358*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,mutliproc_sendpage_even)1359*053f45beSAndroid Build Coastguard Worker TEST_F(tls, mutliproc_sendpage_even)
1360*053f45beSAndroid Build Coastguard Worker {
1361*053f45beSAndroid Build Coastguard Worker 	test_mutliproc(_metadata, self, true, 6, 6);
1362*053f45beSAndroid Build Coastguard Worker }
1363*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,mutliproc_sendpage_readers)1364*053f45beSAndroid Build Coastguard Worker TEST_F(tls, mutliproc_sendpage_readers)
1365*053f45beSAndroid Build Coastguard Worker {
1366*053f45beSAndroid Build Coastguard Worker 	test_mutliproc(_metadata, self, true, 4, 12);
1367*053f45beSAndroid Build Coastguard Worker }
1368*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,mutliproc_sendpage_writers)1369*053f45beSAndroid Build Coastguard Worker TEST_F(tls, mutliproc_sendpage_writers)
1370*053f45beSAndroid Build Coastguard Worker {
1371*053f45beSAndroid Build Coastguard Worker 	test_mutliproc(_metadata, self, true, 10, 2);
1372*053f45beSAndroid Build Coastguard Worker }
1373*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,control_msg)1374*053f45beSAndroid Build Coastguard Worker TEST_F(tls, control_msg)
1375*053f45beSAndroid Build Coastguard Worker {
1376*053f45beSAndroid Build Coastguard Worker 	char *test_str = "test_read";
1377*053f45beSAndroid Build Coastguard Worker 	char record_type = 100;
1378*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
1379*053f45beSAndroid Build Coastguard Worker 	char buf[10];
1380*053f45beSAndroid Build Coastguard Worker 
1381*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1382*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1383*053f45beSAndroid Build Coastguard Worker 
1384*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_send_cmsg(self->fd, record_type, test_str, send_len, 0),
1385*053f45beSAndroid Build Coastguard Worker 		  send_len);
1386*053f45beSAndroid Build Coastguard Worker 	/* Should fail because we didn't provide a control message */
1387*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd, buf, send_len, 0), -1);
1388*053f45beSAndroid Build Coastguard Worker 
1389*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
1390*053f45beSAndroid Build Coastguard Worker 				buf, sizeof(buf), MSG_WAITALL | MSG_PEEK),
1391*053f45beSAndroid Build Coastguard Worker 		  send_len);
1392*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
1393*053f45beSAndroid Build Coastguard Worker 
1394*053f45beSAndroid Build Coastguard Worker 	/* Recv the message again without MSG_PEEK */
1395*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0, sizeof(buf));
1396*053f45beSAndroid Build Coastguard Worker 
1397*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
1398*053f45beSAndroid Build Coastguard Worker 				buf, sizeof(buf), MSG_WAITALL),
1399*053f45beSAndroid Build Coastguard Worker 		  send_len);
1400*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
1401*053f45beSAndroid Build Coastguard Worker }
1402*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,shutdown)1403*053f45beSAndroid Build Coastguard Worker TEST_F(tls, shutdown)
1404*053f45beSAndroid Build Coastguard Worker {
1405*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
1406*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
1407*053f45beSAndroid Build Coastguard Worker 	char buf[10];
1408*053f45beSAndroid Build Coastguard Worker 
1409*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(strlen(test_str) + 1, send_len);
1410*053f45beSAndroid Build Coastguard Worker 
1411*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
1412*053f45beSAndroid Build Coastguard Worker 	EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
1413*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
1414*053f45beSAndroid Build Coastguard Worker 
1415*053f45beSAndroid Build Coastguard Worker 	shutdown(self->fd, SHUT_RDWR);
1416*053f45beSAndroid Build Coastguard Worker 	shutdown(self->cfd, SHUT_RDWR);
1417*053f45beSAndroid Build Coastguard Worker }
1418*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,shutdown_unsent)1419*053f45beSAndroid Build Coastguard Worker TEST_F(tls, shutdown_unsent)
1420*053f45beSAndroid Build Coastguard Worker {
1421*053f45beSAndroid Build Coastguard Worker 	char const *test_str = "test_read";
1422*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
1423*053f45beSAndroid Build Coastguard Worker 
1424*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
1425*053f45beSAndroid Build Coastguard Worker 
1426*053f45beSAndroid Build Coastguard Worker 	shutdown(self->fd, SHUT_RDWR);
1427*053f45beSAndroid Build Coastguard Worker 	shutdown(self->cfd, SHUT_RDWR);
1428*053f45beSAndroid Build Coastguard Worker }
1429*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls,shutdown_reuse)1430*053f45beSAndroid Build Coastguard Worker TEST_F(tls, shutdown_reuse)
1431*053f45beSAndroid Build Coastguard Worker {
1432*053f45beSAndroid Build Coastguard Worker 	struct sockaddr_in addr;
1433*053f45beSAndroid Build Coastguard Worker 	int ret;
1434*053f45beSAndroid Build Coastguard Worker 
1435*053f45beSAndroid Build Coastguard Worker 	shutdown(self->fd, SHUT_RDWR);
1436*053f45beSAndroid Build Coastguard Worker 	shutdown(self->cfd, SHUT_RDWR);
1437*053f45beSAndroid Build Coastguard Worker 	close(self->cfd);
1438*053f45beSAndroid Build Coastguard Worker 
1439*053f45beSAndroid Build Coastguard Worker 	addr.sin_family = AF_INET;
1440*053f45beSAndroid Build Coastguard Worker 	addr.sin_addr.s_addr = htonl(INADDR_ANY);
1441*053f45beSAndroid Build Coastguard Worker 	addr.sin_port = 0;
1442*053f45beSAndroid Build Coastguard Worker 
1443*053f45beSAndroid Build Coastguard Worker 	ret = bind(self->fd, &addr, sizeof(addr));
1444*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1445*053f45beSAndroid Build Coastguard Worker 	ret = listen(self->fd, 10);
1446*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, -1);
1447*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EINVAL);
1448*053f45beSAndroid Build Coastguard Worker 
1449*053f45beSAndroid Build Coastguard Worker 	ret = connect(self->fd, &addr, sizeof(addr));
1450*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, -1);
1451*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EISCONN);
1452*053f45beSAndroid Build Coastguard Worker }
1453*053f45beSAndroid Build Coastguard Worker 
FIXTURE(tls_err)1454*053f45beSAndroid Build Coastguard Worker FIXTURE(tls_err)
1455*053f45beSAndroid Build Coastguard Worker {
1456*053f45beSAndroid Build Coastguard Worker 	int fd, cfd;
1457*053f45beSAndroid Build Coastguard Worker 	int fd2, cfd2;
1458*053f45beSAndroid Build Coastguard Worker 	bool notls;
1459*053f45beSAndroid Build Coastguard Worker };
1460*053f45beSAndroid Build Coastguard Worker 
FIXTURE_VARIANT(tls_err)1461*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT(tls_err)
1462*053f45beSAndroid Build Coastguard Worker {
1463*053f45beSAndroid Build Coastguard Worker 	uint16_t tls_version;
1464*053f45beSAndroid Build Coastguard Worker };
1465*053f45beSAndroid Build Coastguard Worker 
1466*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls_err, 12_aes_gcm)
1467*053f45beSAndroid Build Coastguard Worker {
1468*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_2_VERSION,
1469*053f45beSAndroid Build Coastguard Worker };
1470*053f45beSAndroid Build Coastguard Worker 
1471*053f45beSAndroid Build Coastguard Worker FIXTURE_VARIANT_ADD(tls_err, 13_aes_gcm)
1472*053f45beSAndroid Build Coastguard Worker {
1473*053f45beSAndroid Build Coastguard Worker 	.tls_version = TLS_1_3_VERSION,
1474*053f45beSAndroid Build Coastguard Worker };
1475*053f45beSAndroid Build Coastguard Worker 
FIXTURE_SETUP(tls_err)1476*053f45beSAndroid Build Coastguard Worker FIXTURE_SETUP(tls_err)
1477*053f45beSAndroid Build Coastguard Worker {
1478*053f45beSAndroid Build Coastguard Worker 	struct tls_crypto_info_keys tls12;
1479*053f45beSAndroid Build Coastguard Worker 	int ret;
1480*053f45beSAndroid Build Coastguard Worker 
1481*053f45beSAndroid Build Coastguard Worker 	tls_crypto_info_init(variant->tls_version, TLS_CIPHER_AES_GCM_128,
1482*053f45beSAndroid Build Coastguard Worker 			     &tls12);
1483*053f45beSAndroid Build Coastguard Worker 
1484*053f45beSAndroid Build Coastguard Worker 	ulp_sock_pair(_metadata, &self->fd, &self->cfd, &self->notls);
1485*053f45beSAndroid Build Coastguard Worker 	ulp_sock_pair(_metadata, &self->fd2, &self->cfd2, &self->notls);
1486*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1487*053f45beSAndroid Build Coastguard Worker 		return;
1488*053f45beSAndroid Build Coastguard Worker 
1489*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(self->fd, SOL_TLS, TLS_TX, &tls12, tls12.len);
1490*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1491*053f45beSAndroid Build Coastguard Worker 
1492*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(self->cfd2, SOL_TLS, TLS_RX, &tls12, tls12.len);
1493*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1494*053f45beSAndroid Build Coastguard Worker }
1495*053f45beSAndroid Build Coastguard Worker 
FIXTURE_TEARDOWN(tls_err)1496*053f45beSAndroid Build Coastguard Worker FIXTURE_TEARDOWN(tls_err)
1497*053f45beSAndroid Build Coastguard Worker {
1498*053f45beSAndroid Build Coastguard Worker 	close(self->fd);
1499*053f45beSAndroid Build Coastguard Worker 	close(self->cfd);
1500*053f45beSAndroid Build Coastguard Worker 	close(self->fd2);
1501*053f45beSAndroid Build Coastguard Worker 	close(self->cfd2);
1502*053f45beSAndroid Build Coastguard Worker }
1503*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls_err,bad_rec)1504*053f45beSAndroid Build Coastguard Worker TEST_F(tls_err, bad_rec)
1505*053f45beSAndroid Build Coastguard Worker {
1506*053f45beSAndroid Build Coastguard Worker 	char buf[64];
1507*053f45beSAndroid Build Coastguard Worker 
1508*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1509*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1510*053f45beSAndroid Build Coastguard Worker 
1511*053f45beSAndroid Build Coastguard Worker 	memset(buf, 0x55, sizeof(buf));
1512*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd2, buf, sizeof(buf), 0), sizeof(buf));
1513*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1514*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EMSGSIZE);
1515*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), MSG_DONTWAIT), -1);
1516*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EAGAIN);
1517*053f45beSAndroid Build Coastguard Worker }
1518*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls_err,bad_auth)1519*053f45beSAndroid Build Coastguard Worker TEST_F(tls_err, bad_auth)
1520*053f45beSAndroid Build Coastguard Worker {
1521*053f45beSAndroid Build Coastguard Worker 	char buf[128];
1522*053f45beSAndroid Build Coastguard Worker 	int n;
1523*053f45beSAndroid Build Coastguard Worker 
1524*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1525*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1526*053f45beSAndroid Build Coastguard Worker 
1527*053f45beSAndroid Build Coastguard Worker 	memrnd(buf, sizeof(buf) / 2);
1528*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, buf, sizeof(buf) / 2, 0), sizeof(buf) / 2);
1529*053f45beSAndroid Build Coastguard Worker 	n = recv(self->cfd, buf, sizeof(buf), 0);
1530*053f45beSAndroid Build Coastguard Worker 	EXPECT_GT(n, sizeof(buf) / 2);
1531*053f45beSAndroid Build Coastguard Worker 
1532*053f45beSAndroid Build Coastguard Worker 	buf[n - 1]++;
1533*053f45beSAndroid Build Coastguard Worker 
1534*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd2, buf, n, 0), n);
1535*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1536*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EBADMSG);
1537*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1538*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EBADMSG);
1539*053f45beSAndroid Build Coastguard Worker }
1540*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls_err,bad_in_large_read)1541*053f45beSAndroid Build Coastguard Worker TEST_F(tls_err, bad_in_large_read)
1542*053f45beSAndroid Build Coastguard Worker {
1543*053f45beSAndroid Build Coastguard Worker 	char txt[3][64];
1544*053f45beSAndroid Build Coastguard Worker 	char cip[3][128];
1545*053f45beSAndroid Build Coastguard Worker 	char buf[3 * 128];
1546*053f45beSAndroid Build Coastguard Worker 	int i, n;
1547*053f45beSAndroid Build Coastguard Worker 
1548*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1549*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1550*053f45beSAndroid Build Coastguard Worker 
1551*053f45beSAndroid Build Coastguard Worker 	/* Put 3 records in the sockets */
1552*053f45beSAndroid Build Coastguard Worker 	for (i = 0; i < 3; i++) {
1553*053f45beSAndroid Build Coastguard Worker 		memrnd(txt[i], sizeof(txt[i]));
1554*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(send(self->fd, txt[i], sizeof(txt[i]), 0),
1555*053f45beSAndroid Build Coastguard Worker 			  sizeof(txt[i]));
1556*053f45beSAndroid Build Coastguard Worker 		n = recv(self->cfd, cip[i], sizeof(cip[i]), 0);
1557*053f45beSAndroid Build Coastguard Worker 		EXPECT_GT(n, sizeof(txt[i]));
1558*053f45beSAndroid Build Coastguard Worker 		/* Break the third message */
1559*053f45beSAndroid Build Coastguard Worker 		if (i == 2)
1560*053f45beSAndroid Build Coastguard Worker 			cip[2][n - 1]++;
1561*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(send(self->fd2, cip[i], n, 0), n);
1562*053f45beSAndroid Build Coastguard Worker 	}
1563*053f45beSAndroid Build Coastguard Worker 
1564*053f45beSAndroid Build Coastguard Worker 	/* We should be able to receive the first two messages */
1565*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), sizeof(txt[0]) * 2);
1566*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, txt[0], sizeof(txt[0])), 0);
1567*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf + sizeof(txt[0]), txt[1], sizeof(txt[1])), 0);
1568*053f45beSAndroid Build Coastguard Worker 	/* Third mesasge is bad */
1569*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1570*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EBADMSG);
1571*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1572*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EBADMSG);
1573*053f45beSAndroid Build Coastguard Worker }
1574*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls_err,bad_cmsg)1575*053f45beSAndroid Build Coastguard Worker TEST_F(tls_err, bad_cmsg)
1576*053f45beSAndroid Build Coastguard Worker {
1577*053f45beSAndroid Build Coastguard Worker 	char *test_str = "test_read";
1578*053f45beSAndroid Build Coastguard Worker 	int send_len = 10;
1579*053f45beSAndroid Build Coastguard Worker 	char cip[128];
1580*053f45beSAndroid Build Coastguard Worker 	char buf[128];
1581*053f45beSAndroid Build Coastguard Worker 	char txt[64];
1582*053f45beSAndroid Build Coastguard Worker 	int n;
1583*053f45beSAndroid Build Coastguard Worker 
1584*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1585*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1586*053f45beSAndroid Build Coastguard Worker 
1587*053f45beSAndroid Build Coastguard Worker 	/* Queue up one data record */
1588*053f45beSAndroid Build Coastguard Worker 	memrnd(txt, sizeof(txt));
1589*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd, txt, sizeof(txt), 0), sizeof(txt));
1590*053f45beSAndroid Build Coastguard Worker 	n = recv(self->cfd, cip, sizeof(cip), 0);
1591*053f45beSAndroid Build Coastguard Worker 	EXPECT_GT(n, sizeof(txt));
1592*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd2, cip, n, 0), n);
1593*053f45beSAndroid Build Coastguard Worker 
1594*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(tls_send_cmsg(self->fd, 100, test_str, send_len, 0), 10);
1595*053f45beSAndroid Build Coastguard Worker 	n = recv(self->cfd, cip, sizeof(cip), 0);
1596*053f45beSAndroid Build Coastguard Worker 	cip[n - 1]++; /* Break it */
1597*053f45beSAndroid Build Coastguard Worker 	EXPECT_GT(n, send_len);
1598*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(send(self->fd2, cip, n, 0), n);
1599*053f45beSAndroid Build Coastguard Worker 
1600*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), sizeof(txt));
1601*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(buf, txt, sizeof(txt)), 0);
1602*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1603*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EBADMSG);
1604*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1605*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EBADMSG);
1606*053f45beSAndroid Build Coastguard Worker }
1607*053f45beSAndroid Build Coastguard Worker 
TEST_F(tls_err,timeo)1608*053f45beSAndroid Build Coastguard Worker TEST_F(tls_err, timeo)
1609*053f45beSAndroid Build Coastguard Worker {
1610*053f45beSAndroid Build Coastguard Worker 	struct timeval tv = { .tv_usec = 10000, };
1611*053f45beSAndroid Build Coastguard Worker 	char buf[128];
1612*053f45beSAndroid Build Coastguard Worker 	int ret;
1613*053f45beSAndroid Build Coastguard Worker 
1614*053f45beSAndroid Build Coastguard Worker 	if (self->notls)
1615*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1616*053f45beSAndroid Build Coastguard Worker 
1617*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(self->cfd2, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
1618*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1619*053f45beSAndroid Build Coastguard Worker 
1620*053f45beSAndroid Build Coastguard Worker 	ret = fork();
1621*053f45beSAndroid Build Coastguard Worker 	ASSERT_GE(ret, 0);
1622*053f45beSAndroid Build Coastguard Worker 
1623*053f45beSAndroid Build Coastguard Worker 	if (ret) {
1624*053f45beSAndroid Build Coastguard Worker 		usleep(1000); /* Give child a head start */
1625*053f45beSAndroid Build Coastguard Worker 
1626*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1627*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(errno, EAGAIN);
1628*053f45beSAndroid Build Coastguard Worker 
1629*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1630*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(errno, EAGAIN);
1631*053f45beSAndroid Build Coastguard Worker 
1632*053f45beSAndroid Build Coastguard Worker 		wait(&ret);
1633*053f45beSAndroid Build Coastguard Worker 	} else {
1634*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(recv(self->cfd2, buf, sizeof(buf), 0), -1);
1635*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(errno, EAGAIN);
1636*053f45beSAndroid Build Coastguard Worker 		exit(0);
1637*053f45beSAndroid Build Coastguard Worker 	}
1638*053f45beSAndroid Build Coastguard Worker }
1639*053f45beSAndroid Build Coastguard Worker 
TEST(non_established)1640*053f45beSAndroid Build Coastguard Worker TEST(non_established) {
1641*053f45beSAndroid Build Coastguard Worker 	struct tls12_crypto_info_aes_gcm_256 tls12;
1642*053f45beSAndroid Build Coastguard Worker 	struct sockaddr_in addr;
1643*053f45beSAndroid Build Coastguard Worker 	int sfd, ret, fd;
1644*053f45beSAndroid Build Coastguard Worker 	socklen_t len;
1645*053f45beSAndroid Build Coastguard Worker 
1646*053f45beSAndroid Build Coastguard Worker 	len = sizeof(addr);
1647*053f45beSAndroid Build Coastguard Worker 
1648*053f45beSAndroid Build Coastguard Worker 	memset(&tls12, 0, sizeof(tls12));
1649*053f45beSAndroid Build Coastguard Worker 	tls12.info.version = TLS_1_2_VERSION;
1650*053f45beSAndroid Build Coastguard Worker 	tls12.info.cipher_type = TLS_CIPHER_AES_GCM_256;
1651*053f45beSAndroid Build Coastguard Worker 
1652*053f45beSAndroid Build Coastguard Worker 	addr.sin_family = AF_INET;
1653*053f45beSAndroid Build Coastguard Worker 	addr.sin_addr.s_addr = htonl(INADDR_ANY);
1654*053f45beSAndroid Build Coastguard Worker 	addr.sin_port = 0;
1655*053f45beSAndroid Build Coastguard Worker 
1656*053f45beSAndroid Build Coastguard Worker 	fd = socket(AF_INET, SOCK_STREAM, 0);
1657*053f45beSAndroid Build Coastguard Worker 	sfd = socket(AF_INET, SOCK_STREAM, 0);
1658*053f45beSAndroid Build Coastguard Worker 
1659*053f45beSAndroid Build Coastguard Worker 	ret = bind(sfd, &addr, sizeof(addr));
1660*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1661*053f45beSAndroid Build Coastguard Worker 	ret = listen(sfd, 10);
1662*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1663*053f45beSAndroid Build Coastguard Worker 
1664*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
1665*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, -1);
1666*053f45beSAndroid Build Coastguard Worker 	/* TLS ULP not supported */
1667*053f45beSAndroid Build Coastguard Worker 	if (errno == ENOENT)
1668*053f45beSAndroid Build Coastguard Worker 		return;
1669*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, ENOTCONN);
1670*053f45beSAndroid Build Coastguard Worker 
1671*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(sfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
1672*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, -1);
1673*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, ENOTCONN);
1674*053f45beSAndroid Build Coastguard Worker 
1675*053f45beSAndroid Build Coastguard Worker 	ret = getsockname(sfd, &addr, &len);
1676*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1677*053f45beSAndroid Build Coastguard Worker 
1678*053f45beSAndroid Build Coastguard Worker 	ret = connect(fd, &addr, sizeof(addr));
1679*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1680*053f45beSAndroid Build Coastguard Worker 
1681*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
1682*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1683*053f45beSAndroid Build Coastguard Worker 
1684*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
1685*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, -1);
1686*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(errno, EEXIST);
1687*053f45beSAndroid Build Coastguard Worker 
1688*053f45beSAndroid Build Coastguard Worker 	close(fd);
1689*053f45beSAndroid Build Coastguard Worker 	close(sfd);
1690*053f45beSAndroid Build Coastguard Worker }
1691*053f45beSAndroid Build Coastguard Worker 
TEST(keysizes)1692*053f45beSAndroid Build Coastguard Worker TEST(keysizes) {
1693*053f45beSAndroid Build Coastguard Worker 	struct tls12_crypto_info_aes_gcm_256 tls12;
1694*053f45beSAndroid Build Coastguard Worker 	int ret, fd, cfd;
1695*053f45beSAndroid Build Coastguard Worker 	bool notls;
1696*053f45beSAndroid Build Coastguard Worker 
1697*053f45beSAndroid Build Coastguard Worker 	memset(&tls12, 0, sizeof(tls12));
1698*053f45beSAndroid Build Coastguard Worker 	tls12.info.version = TLS_1_2_VERSION;
1699*053f45beSAndroid Build Coastguard Worker 	tls12.info.cipher_type = TLS_CIPHER_AES_GCM_256;
1700*053f45beSAndroid Build Coastguard Worker 
1701*053f45beSAndroid Build Coastguard Worker 	ulp_sock_pair(_metadata, &fd, &cfd, &notls);
1702*053f45beSAndroid Build Coastguard Worker 
1703*053f45beSAndroid Build Coastguard Worker 	if (!notls) {
1704*053f45beSAndroid Build Coastguard Worker 		ret = setsockopt(fd, SOL_TLS, TLS_TX, &tls12,
1705*053f45beSAndroid Build Coastguard Worker 				 sizeof(tls12));
1706*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(ret, 0);
1707*053f45beSAndroid Build Coastguard Worker 
1708*053f45beSAndroid Build Coastguard Worker 		ret = setsockopt(cfd, SOL_TLS, TLS_RX, &tls12,
1709*053f45beSAndroid Build Coastguard Worker 				 sizeof(tls12));
1710*053f45beSAndroid Build Coastguard Worker 		EXPECT_EQ(ret, 0);
1711*053f45beSAndroid Build Coastguard Worker 	}
1712*053f45beSAndroid Build Coastguard Worker 
1713*053f45beSAndroid Build Coastguard Worker 	close(fd);
1714*053f45beSAndroid Build Coastguard Worker 	close(cfd);
1715*053f45beSAndroid Build Coastguard Worker }
1716*053f45beSAndroid Build Coastguard Worker 
TEST(no_pad)1717*053f45beSAndroid Build Coastguard Worker TEST(no_pad) {
1718*053f45beSAndroid Build Coastguard Worker 	struct tls12_crypto_info_aes_gcm_256 tls12;
1719*053f45beSAndroid Build Coastguard Worker 	int ret, fd, cfd, val;
1720*053f45beSAndroid Build Coastguard Worker 	socklen_t len;
1721*053f45beSAndroid Build Coastguard Worker 	bool notls;
1722*053f45beSAndroid Build Coastguard Worker 
1723*053f45beSAndroid Build Coastguard Worker 	memset(&tls12, 0, sizeof(tls12));
1724*053f45beSAndroid Build Coastguard Worker 	tls12.info.version = TLS_1_3_VERSION;
1725*053f45beSAndroid Build Coastguard Worker 	tls12.info.cipher_type = TLS_CIPHER_AES_GCM_256;
1726*053f45beSAndroid Build Coastguard Worker 
1727*053f45beSAndroid Build Coastguard Worker 	ulp_sock_pair(_metadata, &fd, &cfd, &notls);
1728*053f45beSAndroid Build Coastguard Worker 
1729*053f45beSAndroid Build Coastguard Worker 	if (notls)
1730*053f45beSAndroid Build Coastguard Worker 		exit(KSFT_SKIP);
1731*053f45beSAndroid Build Coastguard Worker 
1732*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, SOL_TLS, TLS_TX, &tls12, sizeof(tls12));
1733*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1734*053f45beSAndroid Build Coastguard Worker 
1735*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(cfd, SOL_TLS, TLS_RX, &tls12, sizeof(tls12));
1736*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1737*053f45beSAndroid Build Coastguard Worker 
1738*053f45beSAndroid Build Coastguard Worker 	val = 1;
1739*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(cfd, SOL_TLS, TLS_RX_EXPECT_NO_PAD,
1740*053f45beSAndroid Build Coastguard Worker 			 (void *)&val, sizeof(val));
1741*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1742*053f45beSAndroid Build Coastguard Worker 
1743*053f45beSAndroid Build Coastguard Worker 	len = sizeof(val);
1744*053f45beSAndroid Build Coastguard Worker 	val = 2;
1745*053f45beSAndroid Build Coastguard Worker 	ret = getsockopt(cfd, SOL_TLS, TLS_RX_EXPECT_NO_PAD,
1746*053f45beSAndroid Build Coastguard Worker 			 (void *)&val, &len);
1747*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1748*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(val, 1);
1749*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(len, 4);
1750*053f45beSAndroid Build Coastguard Worker 
1751*053f45beSAndroid Build Coastguard Worker 	val = 0;
1752*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(cfd, SOL_TLS, TLS_RX_EXPECT_NO_PAD,
1753*053f45beSAndroid Build Coastguard Worker 			 (void *)&val, sizeof(val));
1754*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1755*053f45beSAndroid Build Coastguard Worker 
1756*053f45beSAndroid Build Coastguard Worker 	len = sizeof(val);
1757*053f45beSAndroid Build Coastguard Worker 	val = 2;
1758*053f45beSAndroid Build Coastguard Worker 	ret = getsockopt(cfd, SOL_TLS, TLS_RX_EXPECT_NO_PAD,
1759*053f45beSAndroid Build Coastguard Worker 			 (void *)&val, &len);
1760*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(ret, 0);
1761*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(val, 0);
1762*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(len, 4);
1763*053f45beSAndroid Build Coastguard Worker 
1764*053f45beSAndroid Build Coastguard Worker 	close(fd);
1765*053f45beSAndroid Build Coastguard Worker 	close(cfd);
1766*053f45beSAndroid Build Coastguard Worker }
1767*053f45beSAndroid Build Coastguard Worker 
TEST(tls_v6ops)1768*053f45beSAndroid Build Coastguard Worker TEST(tls_v6ops) {
1769*053f45beSAndroid Build Coastguard Worker 	struct tls_crypto_info_keys tls12;
1770*053f45beSAndroid Build Coastguard Worker 	struct sockaddr_in6 addr, addr2;
1771*053f45beSAndroid Build Coastguard Worker 	int sfd, ret, fd;
1772*053f45beSAndroid Build Coastguard Worker 	socklen_t len, len2;
1773*053f45beSAndroid Build Coastguard Worker 
1774*053f45beSAndroid Build Coastguard Worker 	tls_crypto_info_init(TLS_1_2_VERSION, TLS_CIPHER_AES_GCM_128, &tls12);
1775*053f45beSAndroid Build Coastguard Worker 
1776*053f45beSAndroid Build Coastguard Worker 	addr.sin6_family = AF_INET6;
1777*053f45beSAndroid Build Coastguard Worker 	addr.sin6_addr = in6addr_any;
1778*053f45beSAndroid Build Coastguard Worker 	addr.sin6_port = 0;
1779*053f45beSAndroid Build Coastguard Worker 
1780*053f45beSAndroid Build Coastguard Worker 	fd = socket(AF_INET6, SOCK_STREAM, 0);
1781*053f45beSAndroid Build Coastguard Worker 	sfd = socket(AF_INET6, SOCK_STREAM, 0);
1782*053f45beSAndroid Build Coastguard Worker 
1783*053f45beSAndroid Build Coastguard Worker 	ret = bind(sfd, &addr, sizeof(addr));
1784*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1785*053f45beSAndroid Build Coastguard Worker 	ret = listen(sfd, 10);
1786*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1787*053f45beSAndroid Build Coastguard Worker 
1788*053f45beSAndroid Build Coastguard Worker 	len = sizeof(addr);
1789*053f45beSAndroid Build Coastguard Worker 	ret = getsockname(sfd, &addr, &len);
1790*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1791*053f45beSAndroid Build Coastguard Worker 
1792*053f45beSAndroid Build Coastguard Worker 	ret = connect(fd, &addr, sizeof(addr));
1793*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1794*053f45beSAndroid Build Coastguard Worker 
1795*053f45beSAndroid Build Coastguard Worker 	len = sizeof(addr);
1796*053f45beSAndroid Build Coastguard Worker 	ret = getsockname(fd, &addr, &len);
1797*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1798*053f45beSAndroid Build Coastguard Worker 
1799*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
1800*053f45beSAndroid Build Coastguard Worker 	if (ret) {
1801*053f45beSAndroid Build Coastguard Worker 		ASSERT_EQ(errno, ENOENT);
1802*053f45beSAndroid Build Coastguard Worker 		SKIP(return, "no TLS support");
1803*053f45beSAndroid Build Coastguard Worker 	}
1804*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1805*053f45beSAndroid Build Coastguard Worker 
1806*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, SOL_TLS, TLS_TX, &tls12, tls12.len);
1807*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1808*053f45beSAndroid Build Coastguard Worker 
1809*053f45beSAndroid Build Coastguard Worker 	ret = setsockopt(fd, SOL_TLS, TLS_RX, &tls12, tls12.len);
1810*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1811*053f45beSAndroid Build Coastguard Worker 
1812*053f45beSAndroid Build Coastguard Worker 	len2 = sizeof(addr2);
1813*053f45beSAndroid Build Coastguard Worker 	ret = getsockname(fd, &addr2, &len2);
1814*053f45beSAndroid Build Coastguard Worker 	ASSERT_EQ(ret, 0);
1815*053f45beSAndroid Build Coastguard Worker 
1816*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(len2, len);
1817*053f45beSAndroid Build Coastguard Worker 	EXPECT_EQ(memcmp(&addr, &addr2, len), 0);
1818*053f45beSAndroid Build Coastguard Worker 
1819*053f45beSAndroid Build Coastguard Worker 	close(fd);
1820*053f45beSAndroid Build Coastguard Worker 	close(sfd);
1821*053f45beSAndroid Build Coastguard Worker }
1822*053f45beSAndroid Build Coastguard Worker 
1823*053f45beSAndroid Build Coastguard Worker TEST_HARNESS_MAIN
1824