xref: /freebsd/tests/sys/kern/ktls_test.c (revision 2400a7b18f984664638cbf978687e6d2c00da2e7)
1a10482eaSJohn Baldwin /*-
2a10482eaSJohn Baldwin  * SPDX-License-Identifier: BSD-2-Clause
3a10482eaSJohn Baldwin  *
4a10482eaSJohn Baldwin  * Copyright (c) 2021 Netflix Inc.
5a10482eaSJohn Baldwin  * Written by: John Baldwin <jhb@FreeBSD.org>
6a10482eaSJohn Baldwin  *
7a10482eaSJohn Baldwin  * Redistribution and use in source and binary forms, with or without
8a10482eaSJohn Baldwin  * modification, are permitted provided that the following conditions
9a10482eaSJohn Baldwin  * are met:
10a10482eaSJohn Baldwin  * 1. Redistributions of source code must retain the above copyright
11a10482eaSJohn Baldwin  *    notice, this list of conditions and the following disclaimer.
12a10482eaSJohn Baldwin  * 2. Redistributions in binary form must reproduce the above copyright
13a10482eaSJohn Baldwin  *    notice, this list of conditions and the following disclaimer in the
14a10482eaSJohn Baldwin  *    documentation and/or other materials provided with the distribution.
15a10482eaSJohn Baldwin  *
16a10482eaSJohn Baldwin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17a10482eaSJohn Baldwin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18a10482eaSJohn Baldwin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19a10482eaSJohn Baldwin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20a10482eaSJohn Baldwin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21a10482eaSJohn Baldwin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22a10482eaSJohn Baldwin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23a10482eaSJohn Baldwin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24a10482eaSJohn Baldwin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25a10482eaSJohn Baldwin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26a10482eaSJohn Baldwin  * SUCH DAMAGE.
27a10482eaSJohn Baldwin  */
28a10482eaSJohn Baldwin 
29a10482eaSJohn Baldwin #include <sys/types.h>
30a10482eaSJohn Baldwin #include <sys/endian.h>
31a10482eaSJohn Baldwin #include <sys/event.h>
32a10482eaSJohn Baldwin #include <sys/ktls.h>
33a10482eaSJohn Baldwin #include <sys/socket.h>
34a10482eaSJohn Baldwin #include <sys/sysctl.h>
35a10482eaSJohn Baldwin #include <netinet/in.h>
36a10482eaSJohn Baldwin #include <netinet/tcp.h>
37a10482eaSJohn Baldwin #include <crypto/cryptodev.h>
38a10482eaSJohn Baldwin #include <assert.h>
39a10482eaSJohn Baldwin #include <err.h>
40a10482eaSJohn Baldwin #include <fcntl.h>
41*2400a7b1SJohn Baldwin #include <netdb.h>
42a10482eaSJohn Baldwin #include <poll.h>
43a10482eaSJohn Baldwin #include <stdbool.h>
44a10482eaSJohn Baldwin #include <stdlib.h>
45a10482eaSJohn Baldwin #include <atf-c.h>
46a10482eaSJohn Baldwin 
47a10482eaSJohn Baldwin #include <openssl/err.h>
48a10482eaSJohn Baldwin #include <openssl/evp.h>
49a10482eaSJohn Baldwin #include <openssl/hmac.h>
50a10482eaSJohn Baldwin 
51a10482eaSJohn Baldwin static void
52a10482eaSJohn Baldwin require_ktls(void)
53a10482eaSJohn Baldwin {
54a10482eaSJohn Baldwin 	size_t len;
55a10482eaSJohn Baldwin 	bool enable;
56a10482eaSJohn Baldwin 
57a10482eaSJohn Baldwin 	len = sizeof(enable);
58a10482eaSJohn Baldwin 	if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) {
59a10482eaSJohn Baldwin 		if (errno == ENOENT)
60a10482eaSJohn Baldwin 			atf_tc_skip("kernel does not support TLS offload");
61a10482eaSJohn Baldwin 		atf_libc_error(errno, "Failed to read kern.ipc.tls.enable");
62a10482eaSJohn Baldwin 	}
63a10482eaSJohn Baldwin 
64a10482eaSJohn Baldwin 	if (!enable)
65a10482eaSJohn Baldwin 		atf_tc_skip("Kernel TLS is disabled");
66a10482eaSJohn Baldwin }
67a10482eaSJohn Baldwin 
68a10482eaSJohn Baldwin #define	ATF_REQUIRE_KTLS()	require_ktls()
69a10482eaSJohn Baldwin 
70a10482eaSJohn Baldwin static char
71a10482eaSJohn Baldwin rdigit(void)
72a10482eaSJohn Baldwin {
73a10482eaSJohn Baldwin 	/* ASCII printable values between 0x20 and 0x7e */
74a10482eaSJohn Baldwin 	return (0x20 + random() % (0x7f - 0x20));
75a10482eaSJohn Baldwin }
76a10482eaSJohn Baldwin 
77a10482eaSJohn Baldwin static char *
78a10482eaSJohn Baldwin alloc_buffer(size_t len)
79a10482eaSJohn Baldwin {
80a10482eaSJohn Baldwin 	char *buf;
81a10482eaSJohn Baldwin 	size_t i;
82a10482eaSJohn Baldwin 
83a10482eaSJohn Baldwin 	if (len == 0)
84a10482eaSJohn Baldwin 		return (NULL);
85a10482eaSJohn Baldwin 	buf = malloc(len);
86a10482eaSJohn Baldwin 	for (i = 0; i < len; i++)
87a10482eaSJohn Baldwin 		buf[i] = rdigit();
88a10482eaSJohn Baldwin 	return (buf);
89a10482eaSJohn Baldwin }
90a10482eaSJohn Baldwin 
91a10482eaSJohn Baldwin static bool
922c105205SJohn Baldwin socketpair_tcp(int sv[2])
93a10482eaSJohn Baldwin {
94a10482eaSJohn Baldwin 	struct pollfd pfd;
95a10482eaSJohn Baldwin 	struct sockaddr_in sin;
96a10482eaSJohn Baldwin 	socklen_t len;
97a10482eaSJohn Baldwin 	int as, cs, ls;
98a10482eaSJohn Baldwin 
99a10482eaSJohn Baldwin 	ls = socket(PF_INET, SOCK_STREAM, 0);
100a10482eaSJohn Baldwin 	if (ls == -1) {
101a10482eaSJohn Baldwin 		warn("socket() for listen");
102a10482eaSJohn Baldwin 		return (false);
103a10482eaSJohn Baldwin 	}
104a10482eaSJohn Baldwin 
105a10482eaSJohn Baldwin 	memset(&sin, 0, sizeof(sin));
106a10482eaSJohn Baldwin 	sin.sin_len = sizeof(sin);
107a10482eaSJohn Baldwin 	sin.sin_family = AF_INET;
108a10482eaSJohn Baldwin 	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
109a10482eaSJohn Baldwin 	if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
110a10482eaSJohn Baldwin 		warn("bind");
111a10482eaSJohn Baldwin 		close(ls);
112a10482eaSJohn Baldwin 		return (false);
113a10482eaSJohn Baldwin 	}
114a10482eaSJohn Baldwin 
115a10482eaSJohn Baldwin 	if (listen(ls, 1) == -1) {
116a10482eaSJohn Baldwin 		warn("listen");
117a10482eaSJohn Baldwin 		close(ls);
118a10482eaSJohn Baldwin 		return (false);
119a10482eaSJohn Baldwin 	}
120a10482eaSJohn Baldwin 
121a10482eaSJohn Baldwin 	len = sizeof(sin);
122a10482eaSJohn Baldwin 	if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) {
123a10482eaSJohn Baldwin 		warn("getsockname");
124a10482eaSJohn Baldwin 		close(ls);
125a10482eaSJohn Baldwin 		return (false);
126a10482eaSJohn Baldwin 	}
127a10482eaSJohn Baldwin 
128a10482eaSJohn Baldwin 	cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
129a10482eaSJohn Baldwin 	if (cs == -1) {
130a10482eaSJohn Baldwin 		warn("socket() for connect");
131a10482eaSJohn Baldwin 		close(ls);
132a10482eaSJohn Baldwin 		return (false);
133a10482eaSJohn Baldwin 	}
134a10482eaSJohn Baldwin 
135a10482eaSJohn Baldwin 	if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
136a10482eaSJohn Baldwin 		if (errno != EINPROGRESS) {
137a10482eaSJohn Baldwin 			warn("connect");
138a10482eaSJohn Baldwin 			close(ls);
139a10482eaSJohn Baldwin 			close(cs);
140a10482eaSJohn Baldwin 			return (false);
141a10482eaSJohn Baldwin 		}
142a10482eaSJohn Baldwin 	}
143a10482eaSJohn Baldwin 
144a10482eaSJohn Baldwin 	as = accept4(ls, NULL, NULL, SOCK_NONBLOCK);
145a10482eaSJohn Baldwin 	if (as == -1) {
146a10482eaSJohn Baldwin 		warn("accept4");
147a10482eaSJohn Baldwin 		close(ls);
148a10482eaSJohn Baldwin 		close(cs);
149a10482eaSJohn Baldwin 		return (false);
150a10482eaSJohn Baldwin 	}
151a10482eaSJohn Baldwin 
152a10482eaSJohn Baldwin 	close(ls);
153a10482eaSJohn Baldwin 
154a10482eaSJohn Baldwin 	pfd.fd = cs;
155a10482eaSJohn Baldwin 	pfd.events = POLLOUT;
156a10482eaSJohn Baldwin 	pfd.revents = 0;
157a10482eaSJohn Baldwin 	ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1);
158a10482eaSJohn Baldwin 	ATF_REQUIRE(pfd.revents == POLLOUT);
159a10482eaSJohn Baldwin 
160a10482eaSJohn Baldwin 	sv[0] = cs;
161a10482eaSJohn Baldwin 	sv[1] = as;
162a10482eaSJohn Baldwin 	return (true);
163a10482eaSJohn Baldwin }
164a10482eaSJohn Baldwin 
165*2400a7b1SJohn Baldwin static bool
166*2400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2])
167*2400a7b1SJohn Baldwin {
168*2400a7b1SJohn Baldwin 	const char *cause, *host, *port;
169*2400a7b1SJohn Baldwin 	struct addrinfo hints, *ai, *tofree;
170*2400a7b1SJohn Baldwin 	int error, flags, s;
171*2400a7b1SJohn Baldwin 
172*2400a7b1SJohn Baldwin 	host = atf_tc_get_config_var(tc, "ktls.host");
173*2400a7b1SJohn Baldwin 	port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo");
174*2400a7b1SJohn Baldwin 	memset(&hints, 0, sizeof(hints));
175*2400a7b1SJohn Baldwin 	hints.ai_family = AF_UNSPEC;
176*2400a7b1SJohn Baldwin 	hints.ai_socktype = SOCK_STREAM;
177*2400a7b1SJohn Baldwin 	hints.ai_protocol = IPPROTO_TCP;
178*2400a7b1SJohn Baldwin 	error = getaddrinfo(host, port, &hints, &tofree);
179*2400a7b1SJohn Baldwin 	if (error != 0) {
180*2400a7b1SJohn Baldwin 		warnx("getaddrinfo(%s:%s) failed: %s", host, port,
181*2400a7b1SJohn Baldwin 		    gai_strerror(error));
182*2400a7b1SJohn Baldwin 		return (false);
183*2400a7b1SJohn Baldwin 	}
184*2400a7b1SJohn Baldwin 
185*2400a7b1SJohn Baldwin 	cause = NULL;
186*2400a7b1SJohn Baldwin 	for (ai = tofree; ai != NULL; ai = ai->ai_next) {
187*2400a7b1SJohn Baldwin 		s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
188*2400a7b1SJohn Baldwin 		if (s == -1) {
189*2400a7b1SJohn Baldwin 			cause = "socket";
190*2400a7b1SJohn Baldwin 			error = errno;
191*2400a7b1SJohn Baldwin 			continue;
192*2400a7b1SJohn Baldwin 		}
193*2400a7b1SJohn Baldwin 
194*2400a7b1SJohn Baldwin 		if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) {
195*2400a7b1SJohn Baldwin 			cause = "connect";
196*2400a7b1SJohn Baldwin 			error = errno;
197*2400a7b1SJohn Baldwin 			close(s);
198*2400a7b1SJohn Baldwin 			continue;
199*2400a7b1SJohn Baldwin 		}
200*2400a7b1SJohn Baldwin 
201*2400a7b1SJohn Baldwin 		freeaddrinfo(tofree);
202*2400a7b1SJohn Baldwin 
203*2400a7b1SJohn Baldwin 		ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1);
204*2400a7b1SJohn Baldwin 		flags |= O_NONBLOCK;
205*2400a7b1SJohn Baldwin 		ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1);
206*2400a7b1SJohn Baldwin 
207*2400a7b1SJohn Baldwin 		sv[0] = s;
208*2400a7b1SJohn Baldwin 		sv[1] = s;
209*2400a7b1SJohn Baldwin 		return (true);
210*2400a7b1SJohn Baldwin 	}
211*2400a7b1SJohn Baldwin 
212*2400a7b1SJohn Baldwin 	warnc(error, "%s", cause);
213*2400a7b1SJohn Baldwin 	freeaddrinfo(tofree);
214*2400a7b1SJohn Baldwin 	return (false);
215*2400a7b1SJohn Baldwin }
216*2400a7b1SJohn Baldwin 
217*2400a7b1SJohn Baldwin static bool
218*2400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2])
219*2400a7b1SJohn Baldwin {
220*2400a7b1SJohn Baldwin 	if (atf_tc_has_config_var(tc, "ktls.host"))
221*2400a7b1SJohn Baldwin 		return (echo_socket(tc, sv));
222*2400a7b1SJohn Baldwin 	else
223*2400a7b1SJohn Baldwin 		return (socketpair_tcp(sv));
224*2400a7b1SJohn Baldwin }
225*2400a7b1SJohn Baldwin 
226a10482eaSJohn Baldwin static void
2272c105205SJohn Baldwin close_sockets(int sv[2])
2282c105205SJohn Baldwin {
229*2400a7b1SJohn Baldwin 	if (sv[0] != sv[1])
2302c105205SJohn Baldwin 		ATF_REQUIRE(close(sv[1]) == 0);
2312c105205SJohn Baldwin 	ATF_REQUIRE(close(sv[0]) == 0);
2322c105205SJohn Baldwin }
2332c105205SJohn Baldwin 
2342c105205SJohn Baldwin static void
235a10482eaSJohn Baldwin fd_set_blocking(int fd)
236a10482eaSJohn Baldwin {
237a10482eaSJohn Baldwin 	int flags;
238a10482eaSJohn Baldwin 
239a10482eaSJohn Baldwin 	ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1);
240a10482eaSJohn Baldwin 	flags &= ~O_NONBLOCK;
241a10482eaSJohn Baldwin 	ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1);
242a10482eaSJohn Baldwin }
243a10482eaSJohn Baldwin 
244a10482eaSJohn Baldwin static bool
245a10482eaSJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
246a10482eaSJohn Baldwin     const char *input, char *output, size_t size)
247a10482eaSJohn Baldwin {
248a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
249a10482eaSJohn Baldwin 	int outl, total;
250a10482eaSJohn Baldwin 
251a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
252a10482eaSJohn Baldwin 	if (ctx == NULL) {
253a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
254a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
255a10482eaSJohn Baldwin 		return (false);
256a10482eaSJohn Baldwin 	}
257a10482eaSJohn Baldwin 	if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key,
258a10482eaSJohn Baldwin 	    (const u_char *)iv, 0) != 1) {
259a10482eaSJohn Baldwin 		warnx("EVP_CipherInit_ex failed: %s",
260a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
261a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
262a10482eaSJohn Baldwin 		return (false);
263a10482eaSJohn Baldwin 	}
264a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
265a10482eaSJohn Baldwin 	if (EVP_CipherUpdate(ctx, (u_char *)output, &outl,
266a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
267a10482eaSJohn Baldwin 		warnx("EVP_CipherUpdate failed: %s",
268a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
269a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
270a10482eaSJohn Baldwin 		return (false);
271a10482eaSJohn Baldwin 	}
272a10482eaSJohn Baldwin 	total = outl;
273a10482eaSJohn Baldwin 	if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
274a10482eaSJohn Baldwin 		warnx("EVP_CipherFinal_ex failed: %s",
275a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
276a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
277a10482eaSJohn Baldwin 		return (false);
278a10482eaSJohn Baldwin 	}
279a10482eaSJohn Baldwin 	total += outl;
280a10482eaSJohn Baldwin 	if ((size_t)total != size) {
281a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
282a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
283a10482eaSJohn Baldwin 		return (false);
284a10482eaSJohn Baldwin 	}
285a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
286a10482eaSJohn Baldwin 	return (true);
287a10482eaSJohn Baldwin }
288a10482eaSJohn Baldwin 
289a10482eaSJohn Baldwin static bool
290a10482eaSJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
291a10482eaSJohn Baldwin     size_t aad_len, const void *buffer, size_t len, const void *digest)
292a10482eaSJohn Baldwin {
293a10482eaSJohn Baldwin 	HMAC_CTX *ctx;
294a10482eaSJohn Baldwin 	unsigned char digest2[EVP_MAX_MD_SIZE];
295a10482eaSJohn Baldwin 	u_int digest_len;
296a10482eaSJohn Baldwin 
297a10482eaSJohn Baldwin 	ctx = HMAC_CTX_new();
298a10482eaSJohn Baldwin 	if (ctx == NULL) {
299a10482eaSJohn Baldwin 		warnx("HMAC_CTX_new failed: %s",
300a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
301a10482eaSJohn Baldwin 		return (false);
302a10482eaSJohn Baldwin 	}
303a10482eaSJohn Baldwin 	if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) {
304a10482eaSJohn Baldwin 		warnx("HMAC_Init_ex failed: %s",
305a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
306a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
307a10482eaSJohn Baldwin 		return (false);
308a10482eaSJohn Baldwin 	}
309a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, aad, aad_len) != 1) {
310a10482eaSJohn Baldwin 		warnx("HMAC_Update (aad) failed: %s",
311a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
312a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
313a10482eaSJohn Baldwin 		return (false);
314a10482eaSJohn Baldwin 	}
315a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, buffer, len) != 1) {
316a10482eaSJohn Baldwin 		warnx("HMAC_Update (payload) failed: %s",
317a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
318a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
319a10482eaSJohn Baldwin 		return (false);
320a10482eaSJohn Baldwin 	}
321a10482eaSJohn Baldwin 	if (HMAC_Final(ctx, digest2, &digest_len) != 1) {
322a10482eaSJohn Baldwin 		warnx("HMAC_Final failed: %s",
323a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
324a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
325a10482eaSJohn Baldwin 		return (false);
326a10482eaSJohn Baldwin 	}
327a10482eaSJohn Baldwin 	HMAC_CTX_free(ctx);
328a10482eaSJohn Baldwin 	if (memcmp(digest, digest2, digest_len) != 0) {
329a10482eaSJohn Baldwin 		warnx("HMAC mismatch");
330a10482eaSJohn Baldwin 		return (false);
331a10482eaSJohn Baldwin 	}
332a10482eaSJohn Baldwin 	return (true);
333a10482eaSJohn Baldwin }
334a10482eaSJohn Baldwin 
335a10482eaSJohn Baldwin static bool
3363e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
3373e7f8a8dSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
3383e7f8a8dSJohn Baldwin     size_t size, char *tag, size_t tag_len)
3393e7f8a8dSJohn Baldwin {
3403e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
3413e7f8a8dSJohn Baldwin 	int outl, total;
3423e7f8a8dSJohn Baldwin 
3433e7f8a8dSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
3443e7f8a8dSJohn Baldwin 	if (ctx == NULL) {
3453e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
3463e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3473e7f8a8dSJohn Baldwin 		return (false);
3483e7f8a8dSJohn Baldwin 	}
3493e7f8a8dSJohn Baldwin 	if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
3503e7f8a8dSJohn Baldwin 	    (const u_char *)nonce) != 1) {
3513e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptInit_ex failed: %s",
3523e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3533e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3543e7f8a8dSJohn Baldwin 		return (false);
3553e7f8a8dSJohn Baldwin 	}
3563e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
3573e7f8a8dSJohn Baldwin 	if (aad != NULL) {
3583e7f8a8dSJohn Baldwin 		if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
3593e7f8a8dSJohn Baldwin 		    aad_len) != 1) {
3603e7f8a8dSJohn Baldwin 			warnx("EVP_EncryptUpdate for AAD failed: %s",
3613e7f8a8dSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
3623e7f8a8dSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
3633e7f8a8dSJohn Baldwin 			return (false);
3643e7f8a8dSJohn Baldwin 		}
3653e7f8a8dSJohn Baldwin 	}
3663e7f8a8dSJohn Baldwin 	if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl,
3673e7f8a8dSJohn Baldwin 	    (const u_char *)input, size) != 1) {
3683e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptUpdate failed: %s",
3693e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3703e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3713e7f8a8dSJohn Baldwin 		return (false);
3723e7f8a8dSJohn Baldwin 	}
3733e7f8a8dSJohn Baldwin 	total = outl;
3743e7f8a8dSJohn Baldwin 	if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
3753e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptFinal_ex failed: %s",
3763e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3773e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3783e7f8a8dSJohn Baldwin 		return (false);
3793e7f8a8dSJohn Baldwin 	}
3803e7f8a8dSJohn Baldwin 	total += outl;
3813e7f8a8dSJohn Baldwin 	if ((size_t)total != size) {
3823e7f8a8dSJohn Baldwin 		warnx("encrypt size mismatch: %zu vs %d", size, total);
3833e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3843e7f8a8dSJohn Baldwin 		return (false);
3853e7f8a8dSJohn Baldwin 	}
3863e7f8a8dSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) !=
3873e7f8a8dSJohn Baldwin 	    1) {
3883e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s",
3893e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3903e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3913e7f8a8dSJohn Baldwin 		return (false);
3923e7f8a8dSJohn Baldwin 	}
3933e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
3943e7f8a8dSJohn Baldwin 	return (true);
3953e7f8a8dSJohn Baldwin }
3963e7f8a8dSJohn Baldwin 
3973e7f8a8dSJohn Baldwin static bool
398a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
399a10482eaSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
400a10482eaSJohn Baldwin     size_t size, const char *tag, size_t tag_len)
401a10482eaSJohn Baldwin {
402a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
403a10482eaSJohn Baldwin 	int outl, total;
404a10482eaSJohn Baldwin 	bool valid;
405a10482eaSJohn Baldwin 
406a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
407a10482eaSJohn Baldwin 	if (ctx == NULL) {
408a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
409a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
410a10482eaSJohn Baldwin 		return (false);
411a10482eaSJohn Baldwin 	}
412a10482eaSJohn Baldwin 	if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
413a10482eaSJohn Baldwin 	    (const u_char *)nonce) != 1) {
414a10482eaSJohn Baldwin 		warnx("EVP_DecryptInit_ex failed: %s",
415a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
416a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
417a10482eaSJohn Baldwin 		return (false);
418a10482eaSJohn Baldwin 	}
419a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
420a10482eaSJohn Baldwin 	if (aad != NULL) {
421a10482eaSJohn Baldwin 		if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
422a10482eaSJohn Baldwin 		    aad_len) != 1) {
423a10482eaSJohn Baldwin 			warnx("EVP_DecryptUpdate for AAD failed: %s",
424a10482eaSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
425a10482eaSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
426a10482eaSJohn Baldwin 			return (false);
427a10482eaSJohn Baldwin 		}
428a10482eaSJohn Baldwin 	}
429a10482eaSJohn Baldwin 	if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl,
430a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
431a10482eaSJohn Baldwin 		warnx("EVP_DecryptUpdate failed: %s",
432a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
433a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
434a10482eaSJohn Baldwin 		return (false);
435a10482eaSJohn Baldwin 	}
436a10482eaSJohn Baldwin 	total = outl;
437a10482eaSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
438a10482eaSJohn Baldwin 	    __DECONST(char *, tag)) != 1) {
439a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s",
440a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
441a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
442a10482eaSJohn Baldwin 		return (false);
443a10482eaSJohn Baldwin 	}
444a10482eaSJohn Baldwin 	valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1);
445a10482eaSJohn Baldwin 	total += outl;
446a10482eaSJohn Baldwin 	if ((size_t)total != size) {
447a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
448a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
449a10482eaSJohn Baldwin 		return (false);
450a10482eaSJohn Baldwin 	}
451a10482eaSJohn Baldwin 	if (!valid)
452a10482eaSJohn Baldwin 		warnx("tag mismatch");
453a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
454a10482eaSJohn Baldwin 	return (valid);
455a10482eaSJohn Baldwin }
456a10482eaSJohn Baldwin 
457a10482eaSJohn Baldwin static void
458a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg,
459a10482eaSJohn Baldwin     int minor, uint64_t seqno, struct tls_enable *en)
460a10482eaSJohn Baldwin {
461a10482eaSJohn Baldwin 	u_int auth_key_len, iv_len;
462a10482eaSJohn Baldwin 
463a10482eaSJohn Baldwin 	memset(en, 0, sizeof(*en));
464a10482eaSJohn Baldwin 
465a10482eaSJohn Baldwin 	switch (cipher_alg) {
466a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
467a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_ZERO)
468a10482eaSJohn Baldwin 			iv_len = AES_BLOCK_LEN;
469a10482eaSJohn Baldwin 		else
470a10482eaSJohn Baldwin 			iv_len = 0;
471a10482eaSJohn Baldwin 		break;
472a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
473a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_TWO)
474a10482eaSJohn Baldwin 			iv_len = TLS_AEAD_GCM_LEN;
475a10482eaSJohn Baldwin 		else
476a10482eaSJohn Baldwin 			iv_len = TLS_1_3_GCM_IV_LEN;
477a10482eaSJohn Baldwin 		break;
478a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
479a10482eaSJohn Baldwin 		iv_len = TLS_CHACHA20_IV_LEN;
480a10482eaSJohn Baldwin 		break;
481a10482eaSJohn Baldwin 	default:
482a10482eaSJohn Baldwin 		iv_len = 0;
483a10482eaSJohn Baldwin 		break;
484a10482eaSJohn Baldwin 	}
485a10482eaSJohn Baldwin 	switch (auth_alg) {
486a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
487a10482eaSJohn Baldwin 		auth_key_len = SHA1_HASH_LEN;
488a10482eaSJohn Baldwin 		break;
489a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
490a10482eaSJohn Baldwin 		auth_key_len = SHA2_256_HASH_LEN;
491a10482eaSJohn Baldwin 		break;
492a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
493a10482eaSJohn Baldwin 		auth_key_len = SHA2_384_HASH_LEN;
494a10482eaSJohn Baldwin 		break;
495a10482eaSJohn Baldwin 	default:
496a10482eaSJohn Baldwin 		auth_key_len = 0;
497a10482eaSJohn Baldwin 		break;
498a10482eaSJohn Baldwin 	}
499a10482eaSJohn Baldwin 	en->cipher_key = alloc_buffer(cipher_key_len);
500a10482eaSJohn Baldwin 	en->iv = alloc_buffer(iv_len);
501a10482eaSJohn Baldwin 	en->auth_key = alloc_buffer(auth_key_len);
502a10482eaSJohn Baldwin 	en->cipher_algorithm = cipher_alg;
503a10482eaSJohn Baldwin 	en->cipher_key_len = cipher_key_len;
504a10482eaSJohn Baldwin 	en->iv_len = iv_len;
505a10482eaSJohn Baldwin 	en->auth_algorithm = auth_alg;
506a10482eaSJohn Baldwin 	en->auth_key_len = auth_key_len;
507a10482eaSJohn Baldwin 	en->tls_vmajor = TLS_MAJOR_VER_ONE;
508a10482eaSJohn Baldwin 	en->tls_vminor = minor;
509a10482eaSJohn Baldwin 	be64enc(en->rec_seq, seqno);
510a10482eaSJohn Baldwin }
511a10482eaSJohn Baldwin 
512a10482eaSJohn Baldwin static void
513a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en)
514a10482eaSJohn Baldwin {
515a10482eaSJohn Baldwin 	free(__DECONST(void *, en->cipher_key));
516a10482eaSJohn Baldwin 	free(__DECONST(void *, en->iv));
517a10482eaSJohn Baldwin 	free(__DECONST(void *, en->auth_key));
518a10482eaSJohn Baldwin }
519a10482eaSJohn Baldwin 
520a10482eaSJohn Baldwin static const EVP_CIPHER *
521a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en)
522a10482eaSJohn Baldwin {
523a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
524a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
525a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
526a10482eaSJohn Baldwin 		case 128 / 8:
527a10482eaSJohn Baldwin 			return (EVP_aes_128_cbc());
528a10482eaSJohn Baldwin 		case 256 / 8:
529a10482eaSJohn Baldwin 			return (EVP_aes_256_cbc());
530a10482eaSJohn Baldwin 		default:
531a10482eaSJohn Baldwin 			return (NULL);
532a10482eaSJohn Baldwin 		}
533a10482eaSJohn Baldwin 		break;
534a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
535a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
536a10482eaSJohn Baldwin 		case 128 / 8:
537a10482eaSJohn Baldwin 			return (EVP_aes_128_gcm());
538a10482eaSJohn Baldwin 		case 256 / 8:
539a10482eaSJohn Baldwin 			return (EVP_aes_256_gcm());
540a10482eaSJohn Baldwin 		default:
541a10482eaSJohn Baldwin 			return (NULL);
542a10482eaSJohn Baldwin 		}
543a10482eaSJohn Baldwin 		break;
544a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
545a10482eaSJohn Baldwin 		return (EVP_chacha20_poly1305());
546a10482eaSJohn Baldwin 	default:
547a10482eaSJohn Baldwin 		return (NULL);
548a10482eaSJohn Baldwin 	}
549a10482eaSJohn Baldwin }
550a10482eaSJohn Baldwin 
551a10482eaSJohn Baldwin static const EVP_MD *
552a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en)
553a10482eaSJohn Baldwin {
554a10482eaSJohn Baldwin 	switch (en->auth_algorithm) {
555a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
556a10482eaSJohn Baldwin 		return (EVP_sha1());
557a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
558a10482eaSJohn Baldwin 		return (EVP_sha256());
559a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
560a10482eaSJohn Baldwin 		return (EVP_sha384());
561a10482eaSJohn Baldwin 	default:
562a10482eaSJohn Baldwin 		return (NULL);
563a10482eaSJohn Baldwin 	}
564a10482eaSJohn Baldwin }
565a10482eaSJohn Baldwin 
566a10482eaSJohn Baldwin static size_t
567a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en)
568a10482eaSJohn Baldwin {
569a10482eaSJohn Baldwin 	size_t len;
570a10482eaSJohn Baldwin 
571a10482eaSJohn Baldwin 	len = sizeof(struct tls_record_layer);
572a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
573a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
574a10482eaSJohn Baldwin 		if (en->tls_vminor != TLS_MINOR_VER_ZERO)
575a10482eaSJohn Baldwin 			len += AES_BLOCK_LEN;
576a10482eaSJohn Baldwin 		return (len);
577a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
578a10482eaSJohn Baldwin 		if (en->tls_vminor == TLS_MINOR_VER_TWO)
579a10482eaSJohn Baldwin 			len += sizeof(uint64_t);
580a10482eaSJohn Baldwin 		return (len);
581a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
582a10482eaSJohn Baldwin 		return (len);
583a10482eaSJohn Baldwin 	default:
584a10482eaSJohn Baldwin 		return (0);
585a10482eaSJohn Baldwin 	}
586a10482eaSJohn Baldwin }
587a10482eaSJohn Baldwin 
588a10482eaSJohn Baldwin static size_t
589a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en)
590a10482eaSJohn Baldwin {
591a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
592a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
593a10482eaSJohn Baldwin 		switch (en->auth_algorithm) {
594a10482eaSJohn Baldwin 		case CRYPTO_SHA1_HMAC:
595a10482eaSJohn Baldwin 			return (SHA1_HASH_LEN);
596a10482eaSJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
597a10482eaSJohn Baldwin 			return (SHA2_256_HASH_LEN);
598a10482eaSJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
599a10482eaSJohn Baldwin 			return (SHA2_384_HASH_LEN);
600a10482eaSJohn Baldwin 		default:
601a10482eaSJohn Baldwin 			return (0);
602a10482eaSJohn Baldwin 		}
603a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
604a10482eaSJohn Baldwin 		return (AES_GMAC_HASH_LEN);
605a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
606a10482eaSJohn Baldwin 		return (POLY1305_HASH_LEN);
607a10482eaSJohn Baldwin 	default:
608a10482eaSJohn Baldwin 		return (0);
609a10482eaSJohn Baldwin 	}
610a10482eaSJohn Baldwin }
611a10482eaSJohn Baldwin 
612a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */
613a10482eaSJohn Baldwin static size_t
614a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en)
615a10482eaSJohn Baldwin {
616a10482eaSJohn Baldwin 	size_t len;
617a10482eaSJohn Baldwin 
618a10482eaSJohn Baldwin 	len = tls_mac_len(en);
619a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
620a10482eaSJohn Baldwin 		len += AES_BLOCK_LEN;
621a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
622a10482eaSJohn Baldwin 		len++;
623a10482eaSJohn Baldwin 	return (len);
624a10482eaSJohn Baldwin }
625a10482eaSJohn Baldwin 
626a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */
627a10482eaSJohn Baldwin static void
628a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len,
629a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad)
630a10482eaSJohn Baldwin {
631a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
632a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
633a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
634a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
635a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
636a10482eaSJohn Baldwin }
637a10482eaSJohn Baldwin 
638a10482eaSJohn Baldwin static void
639a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len,
640a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno,
641a10482eaSJohn Baldwin     struct tls_aead_data *ad)
642a10482eaSJohn Baldwin {
643a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
644a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
645a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
646a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
647a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
648a10482eaSJohn Baldwin }
649a10482eaSJohn Baldwin 
650a10482eaSJohn Baldwin static void
651a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr,
652a10482eaSJohn Baldwin     uint64_t seqno, struct tls_aead_data_13 *ad)
653a10482eaSJohn Baldwin {
654a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
655a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
656a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
657a10482eaSJohn Baldwin 	ad->tls_length = hdr->tls_length;
658a10482eaSJohn Baldwin }
659a10482eaSJohn Baldwin 
660a10482eaSJohn Baldwin static void
661a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr,
662a10482eaSJohn Baldwin     char *nonce)
663a10482eaSJohn Baldwin {
664a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN);
665a10482eaSJohn Baldwin 	memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t));
666a10482eaSJohn Baldwin }
667a10482eaSJohn Baldwin 
668a10482eaSJohn Baldwin static void
669a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce)
670a10482eaSJohn Baldwin {
671a10482eaSJohn Baldwin 	static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN,
672a10482eaSJohn Baldwin 	    "TLS 1.3 nonce length mismatch");
673a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN);
674a10482eaSJohn Baldwin 	*(uint64_t *)(nonce + 4) ^= htobe64(seqno);
675a10482eaSJohn Baldwin }
676a10482eaSJohn Baldwin 
677a10482eaSJohn Baldwin /*
678a10482eaSJohn Baldwin  * Decrypt a TLS record 'len' bytes long at 'src' and store the result at
679a10482eaSJohn Baldwin  * 'dst'.  If the TLS record header length doesn't match or 'dst' doesn't
680a10482eaSJohn Baldwin  * have sufficient room ('avail'), fail the test.
681a10482eaSJohn Baldwin  */
682a10482eaSJohn Baldwin static size_t
683a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src,
684a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
685a10482eaSJohn Baldwin {
686a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
687a10482eaSJohn Baldwin 	struct tls_mac_data aad;
688a10482eaSJohn Baldwin 	const char *iv;
689a10482eaSJohn Baldwin 	char *buf;
690a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
691a10482eaSJohn Baldwin 	int padding;
692a10482eaSJohn Baldwin 
693a10482eaSJohn Baldwin 	hdr = src;
694a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
695a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
696a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
697a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor);
698a10482eaSJohn Baldwin 
699a10482eaSJohn Baldwin 	/* First, decrypt the outer payload into a temporary buffer. */
700a10482eaSJohn Baldwin 	payload_len = len - hdr_len;
701a10482eaSJohn Baldwin 	buf = malloc(payload_len);
702a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
703a10482eaSJohn Baldwin 		iv = en->iv;
704a10482eaSJohn Baldwin 	else
705a10482eaSJohn Baldwin 		iv = (void *)(hdr + 1);
706a10482eaSJohn Baldwin 	ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
707a10482eaSJohn Baldwin 	    (const u_char *)src + hdr_len, buf, payload_len));
708a10482eaSJohn Baldwin 
709a10482eaSJohn Baldwin 	/*
710a10482eaSJohn Baldwin 	 * Copy the last encrypted block to use as the IV for the next
711a10482eaSJohn Baldwin 	 * record for TLS 1.0.
712a10482eaSJohn Baldwin 	 */
713a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
714a10482eaSJohn Baldwin 		memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src +
715a10482eaSJohn Baldwin 		    (len - AES_BLOCK_LEN), AES_BLOCK_LEN);
716a10482eaSJohn Baldwin 
717a10482eaSJohn Baldwin 	/*
718a10482eaSJohn Baldwin 	 * Verify trailing padding and strip.
719a10482eaSJohn Baldwin 	 *
720a10482eaSJohn Baldwin 	 * The kernel always generates the smallest amount of padding.
721a10482eaSJohn Baldwin 	 */
722a10482eaSJohn Baldwin 	padding = buf[payload_len - 1] + 1;
723a10482eaSJohn Baldwin 	ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN);
724a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len >= mac_len + padding);
725a10482eaSJohn Baldwin 	payload_len -= padding;
726a10482eaSJohn Baldwin 
727a10482eaSJohn Baldwin 	/* Verify HMAC. */
728a10482eaSJohn Baldwin 	payload_len -= mac_len;
729a10482eaSJohn Baldwin 	tls_mte_aad(en, payload_len, hdr, seqno, &aad);
730a10482eaSJohn Baldwin 	ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
731a10482eaSJohn Baldwin 	    &aad, sizeof(aad), buf, payload_len, buf + payload_len));
732a10482eaSJohn Baldwin 
733a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len <= avail);
734a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
735a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
736a10482eaSJohn Baldwin 	return (payload_len);
737a10482eaSJohn Baldwin }
738a10482eaSJohn Baldwin 
739a10482eaSJohn Baldwin static size_t
740a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src,
741a10482eaSJohn Baldwin     size_t len, void *dst, uint8_t *record_type)
742a10482eaSJohn Baldwin {
743a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
744a10482eaSJohn Baldwin 	struct tls_aead_data aad;
745a10482eaSJohn Baldwin 	char nonce[12];
746a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
747a10482eaSJohn Baldwin 
748a10482eaSJohn Baldwin 	hdr = src;
749a10482eaSJohn Baldwin 
750a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
751a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
752a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
753a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
754a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO);
755a10482eaSJohn Baldwin 
756a10482eaSJohn Baldwin 	tls_12_aead_aad(en, payload_len, hdr, seqno, &aad);
757a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
758a10482eaSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
759a10482eaSJohn Baldwin 	else
760a10482eaSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
761a10482eaSJohn Baldwin 
762a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
763a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len,
764a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
765a10482eaSJohn Baldwin 
766a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
767a10482eaSJohn Baldwin 	return (payload_len);
768a10482eaSJohn Baldwin }
769a10482eaSJohn Baldwin 
770a10482eaSJohn Baldwin static size_t
771a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src,
772a10482eaSJohn Baldwin     size_t len, void *dst, uint8_t *record_type)
773a10482eaSJohn Baldwin {
774a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
775a10482eaSJohn Baldwin 	struct tls_aead_data_13 aad;
776a10482eaSJohn Baldwin 	char nonce[12];
777a10482eaSJohn Baldwin 	char *buf;
778a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
779a10482eaSJohn Baldwin 
780a10482eaSJohn Baldwin 	hdr = src;
781a10482eaSJohn Baldwin 
782a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
783a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
784a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
785a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len >= 1);
786a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP);
787a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
788a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO);
789a10482eaSJohn Baldwin 
790a10482eaSJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
791a10482eaSJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
792a10482eaSJohn Baldwin 
793a10482eaSJohn Baldwin 	/*
794a10482eaSJohn Baldwin 	 * Have to use a temporary buffer for the output due to the
795a10482eaSJohn Baldwin 	 * record type as the last byte of the trailer.
796a10482eaSJohn Baldwin 	 */
797a10482eaSJohn Baldwin 	buf = malloc(payload_len);
798a10482eaSJohn Baldwin 
799a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
800a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len,
801a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
802a10482eaSJohn Baldwin 
803a10482eaSJohn Baldwin 	/* Trim record type. */
804a10482eaSJohn Baldwin 	*record_type = buf[payload_len - 1];
805a10482eaSJohn Baldwin 	payload_len--;
806a10482eaSJohn Baldwin 
807a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
808a10482eaSJohn Baldwin 	free(buf);
809a10482eaSJohn Baldwin 
810a10482eaSJohn Baldwin 	return (payload_len);
811a10482eaSJohn Baldwin }
812a10482eaSJohn Baldwin 
813a10482eaSJohn Baldwin static size_t
814a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src,
815a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
816a10482eaSJohn Baldwin {
817a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
818a10482eaSJohn Baldwin 	size_t payload_len;
819a10482eaSJohn Baldwin 
820a10482eaSJohn Baldwin 	hdr = src;
821a10482eaSJohn Baldwin 	ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len);
822a10482eaSJohn Baldwin 
823a10482eaSJohn Baldwin 	payload_len = len - (tls_header_len(en) + tls_trailer_len(en));
824a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len <= avail);
825a10482eaSJohn Baldwin 
826a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
827a10482eaSJohn Baldwin 		ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst,
828a10482eaSJohn Baldwin 		    record_type) == payload_len);
829a10482eaSJohn Baldwin 	} else {
830a10482eaSJohn Baldwin 		ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst,
831a10482eaSJohn Baldwin 		    record_type) == payload_len);
832a10482eaSJohn Baldwin 	}
833a10482eaSJohn Baldwin 
834a10482eaSJohn Baldwin 	return (payload_len);
835a10482eaSJohn Baldwin }
836a10482eaSJohn Baldwin 
837a10482eaSJohn Baldwin static size_t
838a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src,
839a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
840a10482eaSJohn Baldwin {
841a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
842a10482eaSJohn Baldwin 		return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail,
843a10482eaSJohn Baldwin 		    record_type));
844a10482eaSJohn Baldwin 	else
845a10482eaSJohn Baldwin 		return (decrypt_tls_aead(en, seqno, src, len, dst, avail,
846a10482eaSJohn Baldwin 		    record_type));
847a10482eaSJohn Baldwin }
848a10482eaSJohn Baldwin 
8493e7f8a8dSJohn Baldwin /*
8503e7f8a8dSJohn Baldwin  * Encrypt a TLS record of type 'record_type' with payload 'len' bytes
8513e7f8a8dSJohn Baldwin  * long at 'src' and store the result at 'dst'.  If 'dst' doesn't have
8523e7f8a8dSJohn Baldwin  * sufficient room ('avail'), fail the test.
8533e7f8a8dSJohn Baldwin  */
8543e7f8a8dSJohn Baldwin static size_t
8553e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
8563e7f8a8dSJohn Baldwin     const void *src, size_t len, void *dst)
8573e7f8a8dSJohn Baldwin {
8583e7f8a8dSJohn Baldwin 	struct tls_record_layer *hdr;
8593e7f8a8dSJohn Baldwin 	struct tls_aead_data aad;
8603e7f8a8dSJohn Baldwin 	char nonce[12];
8613e7f8a8dSJohn Baldwin 	size_t hdr_len, mac_len, record_len;
8623e7f8a8dSJohn Baldwin 
8633e7f8a8dSJohn Baldwin 	hdr = dst;
8643e7f8a8dSJohn Baldwin 
8653e7f8a8dSJohn Baldwin 	hdr_len = tls_header_len(en);
8663e7f8a8dSJohn Baldwin 	mac_len = tls_mac_len(en);
8673e7f8a8dSJohn Baldwin 	record_len = hdr_len + len + mac_len;
8683e7f8a8dSJohn Baldwin 
8693e7f8a8dSJohn Baldwin 	hdr->tls_type = record_type;
8703e7f8a8dSJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
8713e7f8a8dSJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
8723e7f8a8dSJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
8733e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
8743e7f8a8dSJohn Baldwin 		memcpy(hdr + 1, &seqno, sizeof(seqno));
8753e7f8a8dSJohn Baldwin 
8763e7f8a8dSJohn Baldwin 	tls_12_aead_aad(en, len, hdr, seqno, &aad);
8773e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
8783e7f8a8dSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
8793e7f8a8dSJohn Baldwin 	else
8803e7f8a8dSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
8813e7f8a8dSJohn Baldwin 
8823e7f8a8dSJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
8833e7f8a8dSJohn Baldwin 	    &aad, sizeof(aad), src, (char *)dst + hdr_len, len,
8843e7f8a8dSJohn Baldwin 	    (char *)dst + hdr_len + len, mac_len));
8853e7f8a8dSJohn Baldwin 
8863e7f8a8dSJohn Baldwin 	return (record_len);
8873e7f8a8dSJohn Baldwin }
8883e7f8a8dSJohn Baldwin 
8893e7f8a8dSJohn Baldwin static size_t
89005a1d0f5SJohn Baldwin encrypt_tls_13_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
89105a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t padding)
89205a1d0f5SJohn Baldwin {
89305a1d0f5SJohn Baldwin 	struct tls_record_layer *hdr;
89405a1d0f5SJohn Baldwin 	struct tls_aead_data_13 aad;
89505a1d0f5SJohn Baldwin 	char nonce[12];
89605a1d0f5SJohn Baldwin 	char *buf;
89705a1d0f5SJohn Baldwin 	size_t hdr_len, mac_len, record_len;
89805a1d0f5SJohn Baldwin 
89905a1d0f5SJohn Baldwin 	hdr = dst;
90005a1d0f5SJohn Baldwin 
90105a1d0f5SJohn Baldwin 	hdr_len = tls_header_len(en);
90205a1d0f5SJohn Baldwin 	mac_len = tls_mac_len(en);
90305a1d0f5SJohn Baldwin 	record_len = hdr_len + len + 1 + padding + mac_len;
90405a1d0f5SJohn Baldwin 
90505a1d0f5SJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP;
90605a1d0f5SJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
90705a1d0f5SJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
90805a1d0f5SJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
90905a1d0f5SJohn Baldwin 
91005a1d0f5SJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
91105a1d0f5SJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
91205a1d0f5SJohn Baldwin 
91305a1d0f5SJohn Baldwin 	/*
91405a1d0f5SJohn Baldwin 	 * Have to use a temporary buffer for the input so that the record
91505a1d0f5SJohn Baldwin 	 * type can be appended.
91605a1d0f5SJohn Baldwin 	 */
91705a1d0f5SJohn Baldwin 	buf = malloc(len + 1 + padding);
91805a1d0f5SJohn Baldwin 	memcpy(buf, src, len);
91905a1d0f5SJohn Baldwin 	buf[len] = record_type;
92005a1d0f5SJohn Baldwin 	memset(buf + len + 1, 0, padding);
92105a1d0f5SJohn Baldwin 
92205a1d0f5SJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
92305a1d0f5SJohn Baldwin 	    &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding,
92405a1d0f5SJohn Baldwin 	    (char *)dst + hdr_len + len + 1 + padding, mac_len));
92505a1d0f5SJohn Baldwin 
92605a1d0f5SJohn Baldwin 	free(buf);
92705a1d0f5SJohn Baldwin 
92805a1d0f5SJohn Baldwin 	return (record_len);
92905a1d0f5SJohn Baldwin }
93005a1d0f5SJohn Baldwin 
93105a1d0f5SJohn Baldwin static size_t
9323e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
93305a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, size_t padding)
9343e7f8a8dSJohn Baldwin {
9353e7f8a8dSJohn Baldwin 	size_t record_len;
9363e7f8a8dSJohn Baldwin 
93705a1d0f5SJohn Baldwin 	record_len = tls_header_len(en) + len + padding + tls_trailer_len(en);
9383e7f8a8dSJohn Baldwin 	ATF_REQUIRE(record_len <= avail);
9393e7f8a8dSJohn Baldwin 
94005a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
94105a1d0f5SJohn Baldwin 		ATF_REQUIRE(padding == 0);
94205a1d0f5SJohn Baldwin 		ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src,
94305a1d0f5SJohn Baldwin 		    len, dst) == record_len);
94405a1d0f5SJohn Baldwin 	} else
94505a1d0f5SJohn Baldwin 		ATF_REQUIRE(encrypt_tls_13_aead(en, record_type, seqno, src,
94605a1d0f5SJohn Baldwin 		    len, dst, padding) == record_len);
9473e7f8a8dSJohn Baldwin 
9483e7f8a8dSJohn Baldwin 	return (record_len);
9493e7f8a8dSJohn Baldwin }
9503e7f8a8dSJohn Baldwin 
9513e7f8a8dSJohn Baldwin static size_t
9523e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
95305a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, size_t padding)
9543e7f8a8dSJohn Baldwin {
95505a1d0f5SJohn Baldwin 	return (encrypt_tls_aead(en, record_type, seqno, src, len, dst, avail,
95605a1d0f5SJohn Baldwin 	    padding));
9573e7f8a8dSJohn Baldwin }
9583e7f8a8dSJohn Baldwin 
959a10482eaSJohn Baldwin static void
960*2400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en,
961*2400a7b1SJohn Baldwin     uint64_t seqno, size_t len)
962a10482eaSJohn Baldwin {
963a10482eaSJohn Baldwin 	struct kevent ev;
964a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
965a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
966a10482eaSJohn Baldwin 	size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written;
967a10482eaSJohn Baldwin 	ssize_t rv;
968a10482eaSJohn Baldwin 	int kq, sockets[2];
969a10482eaSJohn Baldwin 	uint8_t record_type;
970a10482eaSJohn Baldwin 
971a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
972a10482eaSJohn Baldwin 	decrypted = malloc(len);
973a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
974a10482eaSJohn Baldwin 	    tls_trailer_len(en);
975a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
976a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
977a10482eaSJohn Baldwin 
978a10482eaSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
979a10482eaSJohn Baldwin 
980*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
981a10482eaSJohn Baldwin 
982a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
983a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
984a10482eaSJohn Baldwin 
985a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
986a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
987a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
988a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
989a10482eaSJohn Baldwin 
990a10482eaSJohn Baldwin 	decrypted_len = 0;
991a10482eaSJohn Baldwin 	outbuf_len = 0;
992a10482eaSJohn Baldwin 	written = 0;
993a10482eaSJohn Baldwin 
994a10482eaSJohn Baldwin 	while (decrypted_len != len) {
995a10482eaSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
996a10482eaSJohn Baldwin 
997a10482eaSJohn Baldwin 		switch (ev.filter) {
998a10482eaSJohn Baldwin 		case EVFILT_WRITE:
999a10482eaSJohn Baldwin 			/* Try to write any remaining data. */
1000a10482eaSJohn Baldwin 			rv = write(ev.ident, plaintext + written,
1001a10482eaSJohn Baldwin 			    len - written);
1002a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
1003a10482eaSJohn Baldwin 			    "failed to write to socket");
1004a10482eaSJohn Baldwin 			written += rv;
1005a10482eaSJohn Baldwin 			if (written == len) {
1006a10482eaSJohn Baldwin 				ev.flags = EV_DISABLE;
1007a10482eaSJohn Baldwin 				ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
1008a10482eaSJohn Baldwin 				    NULL) == 0);
1009a10482eaSJohn Baldwin 			}
1010a10482eaSJohn Baldwin 			break;
1011a10482eaSJohn Baldwin 
1012a10482eaSJohn Baldwin 		case EVFILT_READ:
1013a10482eaSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
1014a10482eaSJohn Baldwin 
1015a10482eaSJohn Baldwin 			/*
1016a10482eaSJohn Baldwin 			 * Try to read data for the next TLS record
1017a10482eaSJohn Baldwin 			 * into outbuf.  Start by reading the header
1018a10482eaSJohn Baldwin 			 * to determine how much additional data to
1019a10482eaSJohn Baldwin 			 * read.
1020a10482eaSJohn Baldwin 			 */
1021a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer)) {
1022a10482eaSJohn Baldwin 				rv = read(ev.ident, outbuf + outbuf_len,
1023a10482eaSJohn Baldwin 				    sizeof(struct tls_record_layer) -
1024a10482eaSJohn Baldwin 				    outbuf_len);
1025a10482eaSJohn Baldwin 				ATF_REQUIRE_MSG(rv > 0,
1026a10482eaSJohn Baldwin 				    "failed to read from socket");
1027a10482eaSJohn Baldwin 				outbuf_len += rv;
1028a10482eaSJohn Baldwin 			}
1029a10482eaSJohn Baldwin 
1030a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer))
1031a10482eaSJohn Baldwin 				break;
1032a10482eaSJohn Baldwin 
1033a10482eaSJohn Baldwin 			record_len = sizeof(struct tls_record_layer) +
1034a10482eaSJohn Baldwin 			    ntohs(hdr->tls_length);
1035d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len <= outbuf_cap);
1036d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len > outbuf_len);
1037a10482eaSJohn Baldwin 			rv = read(ev.ident, outbuf + outbuf_len,
1038a10482eaSJohn Baldwin 			    record_len - outbuf_len);
1039a10482eaSJohn Baldwin 			if (rv == -1 && errno == EAGAIN)
1040a10482eaSJohn Baldwin 				break;
1041a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0, "failed to read from socket");
1042a10482eaSJohn Baldwin 
1043a10482eaSJohn Baldwin 			outbuf_len += rv;
1044a10482eaSJohn Baldwin 			if (outbuf_len == record_len) {
1045a10482eaSJohn Baldwin 				decrypted_len += decrypt_tls_record(en, seqno,
1046a10482eaSJohn Baldwin 				    outbuf, outbuf_len,
1047a10482eaSJohn Baldwin 				    decrypted + decrypted_len,
1048a10482eaSJohn Baldwin 				    len - decrypted_len, &record_type);
1049a10482eaSJohn Baldwin 				ATF_REQUIRE(record_type == TLS_RLTYPE_APP);
1050a10482eaSJohn Baldwin 
1051a10482eaSJohn Baldwin 				seqno++;
1052a10482eaSJohn Baldwin 				outbuf_len = 0;
1053a10482eaSJohn Baldwin 			}
1054a10482eaSJohn Baldwin 			break;
1055a10482eaSJohn Baldwin 		}
1056a10482eaSJohn Baldwin 	}
1057a10482eaSJohn Baldwin 
1058a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG(written == decrypted_len,
1059a10482eaSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", decrypted_len, written);
1060a10482eaSJohn Baldwin 
1061a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1062a10482eaSJohn Baldwin 
1063a10482eaSJohn Baldwin 	free(outbuf);
1064a10482eaSJohn Baldwin 	free(decrypted);
1065a10482eaSJohn Baldwin 	free(plaintext);
1066a10482eaSJohn Baldwin 
10672c105205SJohn Baldwin 	close_sockets(sockets);
1068694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
1069a10482eaSJohn Baldwin }
1070a10482eaSJohn Baldwin 
1071a10482eaSJohn Baldwin static void
1072a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len)
1073a10482eaSJohn Baldwin {
1074a10482eaSJohn Baldwin 	struct msghdr msg;
1075a10482eaSJohn Baldwin 	struct cmsghdr *cmsg;
1076a10482eaSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(type))];
1077a10482eaSJohn Baldwin 	struct iovec iov;
1078a10482eaSJohn Baldwin 
1079a10482eaSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
1080a10482eaSJohn Baldwin 
1081a10482eaSJohn Baldwin 	msg.msg_control = cbuf;
1082a10482eaSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
1083a10482eaSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
1084a10482eaSJohn Baldwin 	cmsg->cmsg_level = IPPROTO_TCP;
1085a10482eaSJohn Baldwin 	cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
1086a10482eaSJohn Baldwin 	cmsg->cmsg_len = CMSG_LEN(sizeof(type));
1087a10482eaSJohn Baldwin 	*(uint8_t *)CMSG_DATA(cmsg) = type;
1088a10482eaSJohn Baldwin 
1089a10482eaSJohn Baldwin 	iov.iov_base = data;
1090a10482eaSJohn Baldwin 	iov.iov_len = len;
1091a10482eaSJohn Baldwin 	msg.msg_iov = &iov;
1092a10482eaSJohn Baldwin 	msg.msg_iovlen = 1;
1093a10482eaSJohn Baldwin 
1094a10482eaSJohn Baldwin 	ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len);
1095a10482eaSJohn Baldwin }
1096a10482eaSJohn Baldwin 
1097a10482eaSJohn Baldwin static void
1098*2400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en,
1099*2400a7b1SJohn Baldwin     uint64_t seqno, uint8_t type, size_t len)
1100a10482eaSJohn Baldwin {
1101a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
1102a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
1103a10482eaSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
1104a10482eaSJohn Baldwin 	ssize_t rv;
1105a10482eaSJohn Baldwin 	int sockets[2];
1106a10482eaSJohn Baldwin 	uint8_t record_type;
1107a10482eaSJohn Baldwin 
1108a10482eaSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1109a10482eaSJohn Baldwin 
1110a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
1111a10482eaSJohn Baldwin 	decrypted = malloc(len);
1112a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1113a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1114a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
1115a10482eaSJohn Baldwin 
1116*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1117a10482eaSJohn Baldwin 
1118a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1119a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
1120a10482eaSJohn Baldwin 
1121a10482eaSJohn Baldwin 	fd_set_blocking(sockets[0]);
1122a10482eaSJohn Baldwin 	fd_set_blocking(sockets[1]);
1123a10482eaSJohn Baldwin 
1124a10482eaSJohn Baldwin 	ktls_send_control_message(sockets[1], type, plaintext, len);
1125a10482eaSJohn Baldwin 
1126a10482eaSJohn Baldwin 	/*
1127a10482eaSJohn Baldwin 	 * First read the header to determine how much additional data
1128a10482eaSJohn Baldwin 	 * to read.
1129a10482eaSJohn Baldwin 	 */
1130a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1131a10482eaSJohn Baldwin 	ATF_REQUIRE(rv == sizeof(struct tls_record_layer));
1132a10482eaSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
1133a10482eaSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
1134d71830cdSJohn Baldwin 	ATF_REQUIRE(record_len <= outbuf_cap);
1135a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
1136a10482eaSJohn Baldwin 	    payload_len);
1137a10482eaSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)payload_len);
1138a10482eaSJohn Baldwin 
1139a10482eaSJohn Baldwin 	rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len,
1140a10482eaSJohn Baldwin 	    &record_type);
1141a10482eaSJohn Baldwin 
1142a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG((ssize_t)len == rv,
1143a10482eaSJohn Baldwin 	    "read %zd decrypted bytes, but wrote %zu", rv, len);
1144a10482eaSJohn Baldwin 	ATF_REQUIRE(record_type == type);
1145a10482eaSJohn Baldwin 
1146a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1147a10482eaSJohn Baldwin 
1148a10482eaSJohn Baldwin 	free(outbuf);
1149a10482eaSJohn Baldwin 	free(decrypted);
1150a10482eaSJohn Baldwin 	free(plaintext);
1151a10482eaSJohn Baldwin 
11522c105205SJohn Baldwin 	close_sockets(sockets);
1153a10482eaSJohn Baldwin }
1154a10482eaSJohn Baldwin 
11550ff2a12aSJohn Baldwin static void
1156*2400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en,
1157*2400a7b1SJohn Baldwin     uint64_t seqno)
11580ff2a12aSJohn Baldwin {
11590ff2a12aSJohn Baldwin 	struct tls_record_layer *hdr;
11600ff2a12aSJohn Baldwin 	char *outbuf;
11610ff2a12aSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
11620ff2a12aSJohn Baldwin 	ssize_t rv;
11630ff2a12aSJohn Baldwin 	int sockets[2];
11640ff2a12aSJohn Baldwin 	uint8_t record_type;
11650ff2a12aSJohn Baldwin 
11660ff2a12aSJohn Baldwin 	outbuf_cap = tls_header_len(en) + tls_trailer_len(en);
11670ff2a12aSJohn Baldwin 	outbuf = malloc(outbuf_cap);
11680ff2a12aSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
11690ff2a12aSJohn Baldwin 
1170*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
11710ff2a12aSJohn Baldwin 
11720ff2a12aSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
11730ff2a12aSJohn Baldwin 	    sizeof(*en)) == 0);
11740ff2a12aSJohn Baldwin 
11750ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[0]);
11760ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[1]);
11770ff2a12aSJohn Baldwin 
11785de79eedSMark Johnston 	/*
11795de79eedSMark Johnston 	 * A write of zero bytes should send an empty fragment only for
11805de79eedSMark Johnston 	 * TLS 1.0, otherwise an error should be raised.
11815de79eedSMark Johnston 	 */
11820ff2a12aSJohn Baldwin 	rv = write(sockets[1], NULL, 0);
11835de79eedSMark Johnston 	if (rv == 0) {
11845de79eedSMark Johnston 		ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC);
11855de79eedSMark Johnston 		ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO);
11865de79eedSMark Johnston 	} else {
11875de79eedSMark Johnston 		ATF_REQUIRE(rv == -1);
11885de79eedSMark Johnston 		ATF_REQUIRE(errno == EINVAL);
11895de79eedSMark Johnston 		goto out;
11905de79eedSMark Johnston 	}
11910ff2a12aSJohn Baldwin 
11920ff2a12aSJohn Baldwin 	/*
11930ff2a12aSJohn Baldwin 	 * First read the header to determine how much additional data
11940ff2a12aSJohn Baldwin 	 * to read.
11950ff2a12aSJohn Baldwin 	 */
11960ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
11970ff2a12aSJohn Baldwin 	ATF_REQUIRE(rv == sizeof(struct tls_record_layer));
11980ff2a12aSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
11990ff2a12aSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
12000ff2a12aSJohn Baldwin 	ATF_REQUIRE(record_len <= outbuf_cap);
12010ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
12020ff2a12aSJohn Baldwin 	    payload_len);
12030ff2a12aSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)payload_len);
12040ff2a12aSJohn Baldwin 
12050ff2a12aSJohn Baldwin 	rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0,
12060ff2a12aSJohn Baldwin 	    &record_type);
12070ff2a12aSJohn Baldwin 
12080ff2a12aSJohn Baldwin 	ATF_REQUIRE_MSG(rv == 0,
12090ff2a12aSJohn Baldwin 	    "read %zd decrypted bytes for an empty fragment", rv);
12100ff2a12aSJohn Baldwin 	ATF_REQUIRE(record_type == TLS_RLTYPE_APP);
12110ff2a12aSJohn Baldwin 
12125de79eedSMark Johnston out:
12130ff2a12aSJohn Baldwin 	free(outbuf);
12140ff2a12aSJohn Baldwin 
12152c105205SJohn Baldwin 	close_sockets(sockets);
12160ff2a12aSJohn Baldwin }
12170ff2a12aSJohn Baldwin 
12183e7f8a8dSJohn Baldwin static size_t
12193e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type,
12203e7f8a8dSJohn Baldwin     void *data, size_t len)
12213e7f8a8dSJohn Baldwin {
12223e7f8a8dSJohn Baldwin 	struct msghdr msg;
12233e7f8a8dSJohn Baldwin 	struct cmsghdr *cmsg;
12243e7f8a8dSJohn Baldwin 	struct tls_get_record *tgr;
12253e7f8a8dSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(*tgr))];
12263e7f8a8dSJohn Baldwin 	struct iovec iov;
12273e7f8a8dSJohn Baldwin 	ssize_t rv;
12283e7f8a8dSJohn Baldwin 
12293e7f8a8dSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
12303e7f8a8dSJohn Baldwin 
12313e7f8a8dSJohn Baldwin 	msg.msg_control = cbuf;
12323e7f8a8dSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
12333e7f8a8dSJohn Baldwin 
12343e7f8a8dSJohn Baldwin 	iov.iov_base = data;
12353e7f8a8dSJohn Baldwin 	iov.iov_len = len;
12363e7f8a8dSJohn Baldwin 	msg.msg_iov = &iov;
12373e7f8a8dSJohn Baldwin 	msg.msg_iovlen = 1;
12383e7f8a8dSJohn Baldwin 
12393e7f8a8dSJohn Baldwin 	ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0);
12403e7f8a8dSJohn Baldwin 
12413e7f8a8dSJohn Baldwin 	ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR);
12423e7f8a8dSJohn Baldwin 
12433e7f8a8dSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
12443e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg != NULL);
12453e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP);
12463e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD);
12473e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr)));
12483e7f8a8dSJohn Baldwin 
12493e7f8a8dSJohn Baldwin 	tgr = (struct tls_get_record *)CMSG_DATA(cmsg);
12503e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_type == record_type);
12513e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor);
125205a1d0f5SJohn Baldwin 	/* XXX: Not sure if this is what OpenSSL expects? */
125305a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
125405a1d0f5SJohn Baldwin 		ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO);
125505a1d0f5SJohn Baldwin 	else
12563e7f8a8dSJohn Baldwin 		ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor);
12573e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_length == htons(rv));
12583e7f8a8dSJohn Baldwin 
12593e7f8a8dSJohn Baldwin 	return (rv);
12603e7f8a8dSJohn Baldwin }
12613e7f8a8dSJohn Baldwin 
12623e7f8a8dSJohn Baldwin static void
1263*2400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en,
1264*2400a7b1SJohn Baldwin     uint64_t seqno, size_t len, size_t padding)
12653e7f8a8dSJohn Baldwin {
12663e7f8a8dSJohn Baldwin 	struct kevent ev;
12673e7f8a8dSJohn Baldwin 	char *plaintext, *received, *outbuf;
12683e7f8a8dSJohn Baldwin 	size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written;
12693e7f8a8dSJohn Baldwin 	ssize_t rv;
12703e7f8a8dSJohn Baldwin 	int kq, sockets[2];
12713e7f8a8dSJohn Baldwin 
12723e7f8a8dSJohn Baldwin 	plaintext = alloc_buffer(len);
12733e7f8a8dSJohn Baldwin 	received = malloc(len);
12743e7f8a8dSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
12753e7f8a8dSJohn Baldwin 	    tls_trailer_len(en);
12763e7f8a8dSJohn Baldwin 	outbuf = malloc(outbuf_cap);
12773e7f8a8dSJohn Baldwin 
12783e7f8a8dSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
12793e7f8a8dSJohn Baldwin 
1280*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
12813e7f8a8dSJohn Baldwin 
12823e7f8a8dSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
12833e7f8a8dSJohn Baldwin 	    sizeof(*en)) == 0);
12843e7f8a8dSJohn Baldwin 
12853e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
12863e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
12873e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
12883e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
12893e7f8a8dSJohn Baldwin 
12903e7f8a8dSJohn Baldwin 	received_len = 0;
12913e7f8a8dSJohn Baldwin 	outbuf_len = 0;
12923e7f8a8dSJohn Baldwin 	written = 0;
12933e7f8a8dSJohn Baldwin 
12943e7f8a8dSJohn Baldwin 	while (received_len != len) {
12953e7f8a8dSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
12963e7f8a8dSJohn Baldwin 
12973e7f8a8dSJohn Baldwin 		switch (ev.filter) {
12983e7f8a8dSJohn Baldwin 		case EVFILT_WRITE:
12993e7f8a8dSJohn Baldwin 			/*
13003e7f8a8dSJohn Baldwin 			 * Compose the next TLS record to send.
13013e7f8a8dSJohn Baldwin 			 */
13023e7f8a8dSJohn Baldwin 			if (outbuf_len == 0) {
13033e7f8a8dSJohn Baldwin 				ATF_REQUIRE(written < len);
13043e7f8a8dSJohn Baldwin 				todo = len - written;
130505a1d0f5SJohn Baldwin 				if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding)
130605a1d0f5SJohn Baldwin 					todo = TLS_MAX_MSG_SIZE_V10_2 - padding;
13073e7f8a8dSJohn Baldwin 				outbuf_len = encrypt_tls_record(en,
13083e7f8a8dSJohn Baldwin 				    TLS_RLTYPE_APP, seqno, plaintext + written,
130905a1d0f5SJohn Baldwin 				    todo, outbuf, outbuf_cap, padding);
13103e7f8a8dSJohn Baldwin 				outbuf_sent = 0;
13113e7f8a8dSJohn Baldwin 				written += todo;
13123e7f8a8dSJohn Baldwin 				seqno++;
13133e7f8a8dSJohn Baldwin 			}
13143e7f8a8dSJohn Baldwin 
13153e7f8a8dSJohn Baldwin 			/*
13163e7f8a8dSJohn Baldwin 			 * Try to write the remainder of the current
13173e7f8a8dSJohn Baldwin 			 * TLS record.
13183e7f8a8dSJohn Baldwin 			 */
13193e7f8a8dSJohn Baldwin 			rv = write(ev.ident, outbuf + outbuf_sent,
13203e7f8a8dSJohn Baldwin 			    outbuf_len - outbuf_sent);
13213e7f8a8dSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
13223e7f8a8dSJohn Baldwin 			    "failed to write to socket");
13233e7f8a8dSJohn Baldwin 			outbuf_sent += rv;
13243e7f8a8dSJohn Baldwin 			if (outbuf_sent == outbuf_len) {
13253e7f8a8dSJohn Baldwin 				outbuf_len = 0;
13263e7f8a8dSJohn Baldwin 				if (written == len) {
13273e7f8a8dSJohn Baldwin 					ev.flags = EV_DISABLE;
13283e7f8a8dSJohn Baldwin 					ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
13293e7f8a8dSJohn Baldwin 					    NULL) == 0);
13303e7f8a8dSJohn Baldwin 				}
13313e7f8a8dSJohn Baldwin 			}
13323e7f8a8dSJohn Baldwin 			break;
13333e7f8a8dSJohn Baldwin 
13343e7f8a8dSJohn Baldwin 		case EVFILT_READ:
13353e7f8a8dSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
13363e7f8a8dSJohn Baldwin 
13373e7f8a8dSJohn Baldwin 			rv = ktls_receive_tls_record(en, ev.ident,
13383e7f8a8dSJohn Baldwin 			    TLS_RLTYPE_APP, received + received_len,
13393e7f8a8dSJohn Baldwin 			    len - received_len);
13403e7f8a8dSJohn Baldwin 			received_len += rv;
13413e7f8a8dSJohn Baldwin 			break;
13423e7f8a8dSJohn Baldwin 		}
13433e7f8a8dSJohn Baldwin 	}
13443e7f8a8dSJohn Baldwin 
13453e7f8a8dSJohn Baldwin 	ATF_REQUIRE_MSG(written == received_len,
13463e7f8a8dSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", received_len, written);
13473e7f8a8dSJohn Baldwin 
13483e7f8a8dSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, received, len) == 0);
13493e7f8a8dSJohn Baldwin 
13503e7f8a8dSJohn Baldwin 	free(outbuf);
13513e7f8a8dSJohn Baldwin 	free(received);
13523e7f8a8dSJohn Baldwin 	free(plaintext);
13533e7f8a8dSJohn Baldwin 
13542c105205SJohn Baldwin 	close_sockets(sockets);
1355694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
13563e7f8a8dSJohn Baldwin }
13573e7f8a8dSJohn Baldwin 
13580ff2a12aSJohn Baldwin #define	TLS_10_TESTS(M)							\
13590ff2a12aSJohn Baldwin 	M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8,			\
13600ff2a12aSJohn Baldwin 	    CRYPTO_SHA1_HMAC)						\
13610ff2a12aSJohn Baldwin 	M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8,			\
13620ff2a12aSJohn Baldwin 	    CRYPTO_SHA1_HMAC)
13630ff2a12aSJohn Baldwin 
136483a54b58SJohn Baldwin #define	TLS_13_TESTS(M)							\
136583a54b58SJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
136683a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
136783a54b58SJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
136883a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
136983a54b58SJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
137083a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)
137183a54b58SJohn Baldwin 
1372a10482eaSJohn Baldwin #define	AES_CBC_TESTS(M)						\
1373a10482eaSJohn Baldwin 	M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1374a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)			\
1375a10482eaSJohn Baldwin 	M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1376a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)			\
1377a10482eaSJohn Baldwin 	M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1378a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1379a10482eaSJohn Baldwin 	M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1380a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1381a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1382a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1383a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1384a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1385a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1386a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1387a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8,		\
1388a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1389a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1390a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1391a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8,		\
1392a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1393a10482eaSJohn Baldwin 
1394a10482eaSJohn Baldwin #define AES_GCM_TESTS(M)						\
1395a10482eaSJohn Baldwin 	M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1396a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1397a10482eaSJohn Baldwin 	M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1398a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1399a10482eaSJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1400a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
1401a10482eaSJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1402a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1403a10482eaSJohn Baldwin 
1404a10482eaSJohn Baldwin #define CHACHA20_TESTS(M)						\
1405a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1406a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1407a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1408a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1409a10482eaSJohn Baldwin 
1410a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1411a10482eaSJohn Baldwin 	    auth_alg, minor, name, len)					\
1412a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
1413a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1414a10482eaSJohn Baldwin {									\
1415a10482eaSJohn Baldwin 	struct tls_enable en;						\
1416a10482eaSJohn Baldwin 	uint64_t seqno;							\
1417a10482eaSJohn Baldwin 									\
1418a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1419a10482eaSJohn Baldwin 	seqno = random();						\
1420a10482eaSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
1421a10482eaSJohn Baldwin 	    &en);							\
1422*2400a7b1SJohn Baldwin 	test_ktls_transmit_app_data(tc, &en, seqno, len);		\
1423a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1424a10482eaSJohn Baldwin }
1425a10482eaSJohn Baldwin 
1426a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1427a10482eaSJohn Baldwin 	    auth_alg, minor, name)					\
1428a10482eaSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1429a10482eaSJohn Baldwin 
1430a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
143144265dc3SJohn Baldwin 	    auth_alg, minor, name, type, len)				\
143244265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
143344265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1434a10482eaSJohn Baldwin {									\
1435a10482eaSJohn Baldwin 	struct tls_enable en;						\
1436a10482eaSJohn Baldwin 	uint64_t seqno;							\
1437a10482eaSJohn Baldwin 									\
1438a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1439a10482eaSJohn Baldwin 	seqno = random();						\
1440a10482eaSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1441a10482eaSJohn Baldwin 	    &en);							\
1442*2400a7b1SJohn Baldwin 	test_ktls_transmit_control(tc, &en, seqno, type, len);		\
1443a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1444a10482eaSJohn Baldwin }
1445a10482eaSJohn Baldwin 
1446a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
144744265dc3SJohn Baldwin 	    auth_alg, minor, name)					\
144844265dc3SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1449a10482eaSJohn Baldwin 
14500ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
14515de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
14520ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment);	\
14530ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc)		\
14540ff2a12aSJohn Baldwin {									\
14550ff2a12aSJohn Baldwin 	struct tls_enable en;						\
14560ff2a12aSJohn Baldwin 	uint64_t seqno;							\
14570ff2a12aSJohn Baldwin 									\
14580ff2a12aSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
14590ff2a12aSJohn Baldwin 	seqno = random();						\
14605de79eedSMark Johnston 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
14615de79eedSMark Johnston 	    &en);							\
1462*2400a7b1SJohn Baldwin 	test_ktls_transmit_empty_fragment(tc, &en, seqno);		\
14630ff2a12aSJohn Baldwin 	free_tls_enable(&en);						\
14640ff2a12aSJohn Baldwin }
14650ff2a12aSJohn Baldwin 
14660ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
14675de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
14680ff2a12aSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment);
14690ff2a12aSJohn Baldwin 
1470a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
1471a10482eaSJohn Baldwin 	    minor)							\
1472a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1473a10482eaSJohn Baldwin 	    auth_alg, minor, short, 64)					\
1474a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1475a10482eaSJohn Baldwin 	    auth_alg, minor, long, 64 * 1024)				\
1476a10482eaSJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
147744265dc3SJohn Baldwin 	    auth_alg, minor, control, 0x21 /* Alert */, 32)
1478a10482eaSJohn Baldwin 
1479a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
1480a10482eaSJohn Baldwin 	    minor)							\
1481a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1482a10482eaSJohn Baldwin 	    auth_alg, minor, short)					\
1483a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1484a10482eaSJohn Baldwin 	    auth_alg, minor, long)					\
1485a10482eaSJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
148644265dc3SJohn Baldwin 	    auth_alg, minor, control)
1487a10482eaSJohn Baldwin 
1488a10482eaSJohn Baldwin /*
1489a10482eaSJohn Baldwin  * For each supported cipher suite, run three transmit tests:
1490a10482eaSJohn Baldwin  *
1491a10482eaSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
1492a10482eaSJohn Baldwin  *   a single TLS record)
1493a10482eaSJohn Baldwin  *
1494a10482eaSJohn Baldwin  * - a long test which sends 64KB of application data (split across
1495a10482eaSJohn Baldwin  *   multiple TLS records)
1496a10482eaSJohn Baldwin  *
1497a10482eaSJohn Baldwin  * - a control test which sends a single record with a specific
1498a10482eaSJohn Baldwin  *   content type via sendmsg()
1499a10482eaSJohn Baldwin  */
1500a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS);
1501a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS);
1502a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS);
1503a10482eaSJohn Baldwin 
150444265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
150544265dc3SJohn Baldwin 	    auth_alg, minor)						\
150644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
150744265dc3SJohn Baldwin 	    auth_alg, minor, padding_1, 0x21 /* Alert */, 1)		\
150844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
150944265dc3SJohn Baldwin 	    auth_alg, minor, padding_2, 0x21 /* Alert */, 2)		\
151044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
151144265dc3SJohn Baldwin 	    auth_alg, minor, padding_3, 0x21 /* Alert */, 3)		\
151244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
151344265dc3SJohn Baldwin 	    auth_alg, minor, padding_4, 0x21 /* Alert */, 4)		\
151444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
151544265dc3SJohn Baldwin 	    auth_alg, minor, padding_5, 0x21 /* Alert */, 5)		\
151644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
151744265dc3SJohn Baldwin 	    auth_alg, minor, padding_6, 0x21 /* Alert */, 6)		\
151844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
151944265dc3SJohn Baldwin 	    auth_alg, minor, padding_7, 0x21 /* Alert */, 7)		\
152044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
152144265dc3SJohn Baldwin 	    auth_alg, minor, padding_8, 0x21 /* Alert */, 8)		\
152244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
152344265dc3SJohn Baldwin 	    auth_alg, minor, padding_9, 0x21 /* Alert */, 9)		\
152444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
152544265dc3SJohn Baldwin 	    auth_alg, minor, padding_10, 0x21 /* Alert */, 10)		\
152644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
152744265dc3SJohn Baldwin 	    auth_alg, minor, padding_11, 0x21 /* Alert */, 11)		\
152844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
152944265dc3SJohn Baldwin 	    auth_alg, minor, padding_12, 0x21 /* Alert */, 12)		\
153044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
153144265dc3SJohn Baldwin 	    auth_alg, minor, padding_13, 0x21 /* Alert */, 13)		\
153244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
153344265dc3SJohn Baldwin 	    auth_alg, minor, padding_14, 0x21 /* Alert */, 14)		\
153444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
153544265dc3SJohn Baldwin 	    auth_alg, minor, padding_15, 0x21 /* Alert */, 15)		\
153644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
153744265dc3SJohn Baldwin 	    auth_alg, minor, padding_16, 0x21 /* Alert */, 16)
153844265dc3SJohn Baldwin 
153944265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
154044265dc3SJohn Baldwin 	    auth_alg, minor)						\
154144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
154244265dc3SJohn Baldwin 	    auth_alg, minor, padding_1)					\
154344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
154444265dc3SJohn Baldwin 	    auth_alg, minor, padding_2)					\
154544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
154644265dc3SJohn Baldwin 	    auth_alg, minor, padding_3)					\
154744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
154844265dc3SJohn Baldwin 	    auth_alg, minor, padding_4)					\
154944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
155044265dc3SJohn Baldwin 	    auth_alg, minor, padding_5)					\
155144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
155244265dc3SJohn Baldwin 	    auth_alg, minor, padding_6)					\
155344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
155444265dc3SJohn Baldwin 	    auth_alg, minor, padding_7)					\
155544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
155644265dc3SJohn Baldwin 	    auth_alg, minor, padding_8)					\
155744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
155844265dc3SJohn Baldwin 	    auth_alg, minor, padding_9)					\
155944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
156044265dc3SJohn Baldwin 	    auth_alg, minor, padding_10)				\
156144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
156244265dc3SJohn Baldwin 	    auth_alg, minor, padding_11)				\
156344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
156444265dc3SJohn Baldwin 	    auth_alg, minor, padding_12)				\
156544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
156644265dc3SJohn Baldwin 	    auth_alg, minor, padding_13)				\
156744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
156844265dc3SJohn Baldwin 	    auth_alg, minor, padding_14)				\
156944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
157044265dc3SJohn Baldwin 	    auth_alg, minor, padding_15)				\
157144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
157244265dc3SJohn Baldwin 	    auth_alg, minor, padding_16)
157344265dc3SJohn Baldwin 
157444265dc3SJohn Baldwin /*
157544265dc3SJohn Baldwin  * For AES-CBC MTE cipher suites using padding, add tests of messages
157644265dc3SJohn Baldwin  * with each possible padding size.  Note that the padding_<N> tests
157744265dc3SJohn Baldwin  * do not necessarily test <N> bytes of padding as the padding is a
157844265dc3SJohn Baldwin  * function of the cipher suite's MAC length.  However, cycling
157944265dc3SJohn Baldwin  * through all of the payload sizes from 1 to 16 should exercise all
158044265dc3SJohn Baldwin  * of the possible padding lengths for each suite.
158144265dc3SJohn Baldwin  */
158244265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS);
158344265dc3SJohn Baldwin 
15840ff2a12aSJohn Baldwin /*
15850ff2a12aSJohn Baldwin  * Test "empty fragments" which are TLS records with no payload that
15860ff2a12aSJohn Baldwin  * OpenSSL can send for TLS 1.0 connections.
15870ff2a12aSJohn Baldwin  */
15885de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
15895de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
15905de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
15910ff2a12aSJohn Baldwin 
1592d1c369f9SJohn Baldwin static void
1593*2400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc,
1594*2400a7b1SJohn Baldwin     struct tls_enable *en)
1595d1c369f9SJohn Baldwin {
1596d1c369f9SJohn Baldwin 	int sockets[2];
1597d1c369f9SJohn Baldwin 
1598*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1599d1c369f9SJohn Baldwin 
1600d1c369f9SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1601d1c369f9SJohn Baldwin 	    sizeof(*en)) == -1);
1602d1c369f9SJohn Baldwin 	ATF_REQUIRE(errno == EINVAL);
1603d1c369f9SJohn Baldwin 
16042c105205SJohn Baldwin 	close_sockets(sockets);
1605d1c369f9SJohn Baldwin }
1606d1c369f9SJohn Baldwin 
1607d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg,	\
1608d1c369f9SJohn Baldwin 	    minor)							\
1609d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name);			\
1610d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc)				\
1611d1c369f9SJohn Baldwin {									\
1612d1c369f9SJohn Baldwin 	struct tls_enable en;						\
1613d1c369f9SJohn Baldwin 	uint64_t seqno;							\
1614d1c369f9SJohn Baldwin 									\
1615d1c369f9SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1616d1c369f9SJohn Baldwin 	seqno = random();						\
1617d1c369f9SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1618d1c369f9SJohn Baldwin 	    &en);							\
1619*2400a7b1SJohn Baldwin 	test_ktls_invalid_transmit_cipher_suite(tc, &en);		\
1620d1c369f9SJohn Baldwin 	free_tls_enable(&en);						\
1621d1c369f9SJohn Baldwin }
1622d1c369f9SJohn Baldwin 
1623d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \
1624d1c369f9SJohn Baldwin 	    minor)							\
1625d1c369f9SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name);
1626d1c369f9SJohn Baldwin 
1627d1c369f9SJohn Baldwin #define	INVALID_CIPHER_SUITES(M)					\
1628d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1629d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO)			\
1630d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1631d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO)			\
1632d1c369f9SJohn Baldwin 	M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1633d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
1634d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1635d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
1636d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1637d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE)			\
1638d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1639d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE)			\
1640d1c369f9SJohn Baldwin 	M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1641d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
1642d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1643d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
1644d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1645d1c369f9SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE)			\
1646d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1647d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE)			\
1648d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1649d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE)
1650d1c369f9SJohn Baldwin 
1651d1c369f9SJohn Baldwin /*
1652d1c369f9SJohn Baldwin  * Ensure that invalid cipher suites are rejected for transmit.
1653d1c369f9SJohn Baldwin  */
1654d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST);
1655d1c369f9SJohn Baldwin 
16563e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
165705a1d0f5SJohn Baldwin 	    auth_alg, minor, name, len, padding)			\
16583e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name);		\
16593e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc)			\
16603e7f8a8dSJohn Baldwin {									\
16613e7f8a8dSJohn Baldwin 	struct tls_enable en;						\
16623e7f8a8dSJohn Baldwin 	uint64_t seqno;							\
16633e7f8a8dSJohn Baldwin 									\
16643e7f8a8dSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
16653e7f8a8dSJohn Baldwin 	seqno = random();						\
16663e7f8a8dSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
16673e7f8a8dSJohn Baldwin 	    &en);							\
1668*2400a7b1SJohn Baldwin 	test_ktls_receive_app_data(tc, &en, seqno, len, padding);	\
16693e7f8a8dSJohn Baldwin 	free_tls_enable(&en);						\
16703e7f8a8dSJohn Baldwin }
16713e7f8a8dSJohn Baldwin 
16723e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
16733e7f8a8dSJohn Baldwin 	    auth_alg, minor, name)					\
16743e7f8a8dSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
16753e7f8a8dSJohn Baldwin 
16763e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
16773e7f8a8dSJohn Baldwin 	    minor)							\
16783e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
167905a1d0f5SJohn Baldwin 	    auth_alg, minor, short, 64, 0)				\
16803e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
168105a1d0f5SJohn Baldwin 	    auth_alg, minor, long, 64 * 1024, 0)
16823e7f8a8dSJohn Baldwin 
16833e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
16843e7f8a8dSJohn Baldwin 	    minor)							\
16853e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
16863e7f8a8dSJohn Baldwin 	    auth_alg, minor, short)					\
16873e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
16883e7f8a8dSJohn Baldwin 	    auth_alg, minor, long)
16893e7f8a8dSJohn Baldwin 
16903e7f8a8dSJohn Baldwin /*
16913e7f8a8dSJohn Baldwin  * For each supported cipher suite, run two receive tests:
16923e7f8a8dSJohn Baldwin  *
16933e7f8a8dSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
16943e7f8a8dSJohn Baldwin  *   a single TLS record)
16953e7f8a8dSJohn Baldwin  *
16963e7f8a8dSJohn Baldwin  * - a long test which sends 64KB of application data (split across
16973e7f8a8dSJohn Baldwin  *   multiple TLS records)
16983e7f8a8dSJohn Baldwin  *
16993e7f8a8dSJohn Baldwin  * Note that receive is currently only supported for TLS 1.2 AEAD
17003e7f8a8dSJohn Baldwin  * cipher suites.
17013e7f8a8dSJohn Baldwin  */
170205a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS);
170305a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS);
170405a1d0f5SJohn Baldwin 
170505a1d0f5SJohn Baldwin #define GEN_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size,	\
170605a1d0f5SJohn Baldwin 	    auth_alg, minor)						\
170705a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
170805a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded, 64, 16)			\
170905a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
171005a1d0f5SJohn Baldwin 	    auth_alg, minor, long_padded, 64 * 1024, 15)
171105a1d0f5SJohn Baldwin 
171205a1d0f5SJohn Baldwin #define ADD_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size,	\
171305a1d0f5SJohn Baldwin 	    auth_alg, minor)						\
171405a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
171505a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded)				\
171605a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
171705a1d0f5SJohn Baldwin 	    auth_alg, minor, long_padded)
171805a1d0f5SJohn Baldwin 
171905a1d0f5SJohn Baldwin /*
172005a1d0f5SJohn Baldwin  * For TLS 1.3 cipher suites, run two additional receive tests which
172105a1d0f5SJohn Baldwin  * use add padding to each record.
172205a1d0f5SJohn Baldwin  */
172305a1d0f5SJohn Baldwin TLS_13_TESTS(GEN_PADDING_RECEIVE_TESTS);
17243e7f8a8dSJohn Baldwin 
1725233ce578SJohn Baldwin static void
1726*2400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc,
1727*2400a7b1SJohn Baldwin     struct tls_enable *en)
1728233ce578SJohn Baldwin {
1729233ce578SJohn Baldwin 	int sockets[2];
1730233ce578SJohn Baldwin 
1731*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1732233ce578SJohn Baldwin 
1733233ce578SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1734233ce578SJohn Baldwin 	    sizeof(*en)) == -1);
173505a1d0f5SJohn Baldwin 	ATF_REQUIRE(errno == EINVAL);
1736233ce578SJohn Baldwin 
17372c105205SJohn Baldwin 	close_sockets(sockets);
1738233ce578SJohn Baldwin }
1739233ce578SJohn Baldwin 
1740233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
1741233ce578SJohn Baldwin 	    minor)							\
1742233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name);			\
1743233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc)				\
1744233ce578SJohn Baldwin {									\
1745233ce578SJohn Baldwin 	struct tls_enable en;						\
1746233ce578SJohn Baldwin 	uint64_t seqno;							\
1747233ce578SJohn Baldwin 									\
1748233ce578SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1749233ce578SJohn Baldwin 	seqno = random();						\
1750233ce578SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1751233ce578SJohn Baldwin 	    &en);							\
1752*2400a7b1SJohn Baldwin 	test_ktls_invalid_receive_cipher_suite(tc, &en);		\
1753233ce578SJohn Baldwin 	free_tls_enable(&en);						\
1754233ce578SJohn Baldwin }
1755233ce578SJohn Baldwin 
1756233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
1757233ce578SJohn Baldwin 	    minor)							\
1758233ce578SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name);
1759233ce578SJohn Baldwin 
1760233ce578SJohn Baldwin /*
1761233ce578SJohn Baldwin  * Ensure that invalid cipher suites are rejected for receive.
1762233ce578SJohn Baldwin  */
1763233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST);
1764233ce578SJohn Baldwin 
176583a54b58SJohn Baldwin static void
1766*2400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc,
1767*2400a7b1SJohn Baldwin     struct tls_enable *en)
176883a54b58SJohn Baldwin {
176983a54b58SJohn Baldwin 	int sockets[2];
177083a54b58SJohn Baldwin 
1771*2400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
177283a54b58SJohn Baldwin 
177383a54b58SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
177483a54b58SJohn Baldwin 	    sizeof(*en)) == -1);
177505a1d0f5SJohn Baldwin 	ATF_REQUIRE(errno == EPROTONOSUPPORT);
177683a54b58SJohn Baldwin 
17772c105205SJohn Baldwin 	close_sockets(sockets);
177883a54b58SJohn Baldwin }
177983a54b58SJohn Baldwin 
178083a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
178183a54b58SJohn Baldwin 	    auth_alg, minor)						\
178283a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name);			\
178383a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc)			\
178483a54b58SJohn Baldwin {									\
178583a54b58SJohn Baldwin 	struct tls_enable en;						\
178683a54b58SJohn Baldwin 	uint64_t seqno;							\
178783a54b58SJohn Baldwin 									\
178883a54b58SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
178983a54b58SJohn Baldwin 	seqno = random();						\
179083a54b58SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
179183a54b58SJohn Baldwin 	    &en);							\
1792*2400a7b1SJohn Baldwin 	test_ktls_unsupported_receive_cipher_suite(tc, &en);		\
179383a54b58SJohn Baldwin 	free_tls_enable(&en);						\
179483a54b58SJohn Baldwin }
179583a54b58SJohn Baldwin 
179683a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
179783a54b58SJohn Baldwin 	    auth_alg, minor)						\
179883a54b58SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name);
179983a54b58SJohn Baldwin 
180083a54b58SJohn Baldwin /*
180183a54b58SJohn Baldwin  * Ensure that valid cipher suites not supported for receive are
180283a54b58SJohn Baldwin  * rejected.
180383a54b58SJohn Baldwin  */
180483a54b58SJohn Baldwin AES_CBC_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST);
180583a54b58SJohn Baldwin 
1806ee5686c6SMark Johnston /*
1807ee5686c6SMark Johnston  * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise
1808ee5686c6SMark Johnston  * KTLS error handling in the socket layer.
1809ee5686c6SMark Johnston  */
1810ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst);
1811ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc)
1812ee5686c6SMark Johnston {
1813ee5686c6SMark Johnston 	char buf[32];
1814ee5686c6SMark Johnston 	struct sockaddr_in dst;
1815ee5686c6SMark Johnston 	struct tls_enable en;
1816ee5686c6SMark Johnston 	ssize_t n;
1817ee5686c6SMark Johnston 	int s;
1818ee5686c6SMark Johnston 
1819ee5686c6SMark Johnston 	ATF_REQUIRE_KTLS();
1820ee5686c6SMark Johnston 
1821ee5686c6SMark Johnston 	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1822ee5686c6SMark Johnston 	ATF_REQUIRE(s >= 0);
1823ee5686c6SMark Johnston 
1824ee5686c6SMark Johnston 	build_tls_enable(CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
1825ee5686c6SMark Johnston 	    TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
1826ee5686c6SMark Johnston 
1827ee5686c6SMark Johnston 	ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en,
1828ee5686c6SMark Johnston 	    sizeof(en)) == 0);
1829ee5686c6SMark Johnston 
1830ee5686c6SMark Johnston 	memset(&dst, 0, sizeof(dst));
1831ee5686c6SMark Johnston 	dst.sin_family = AF_INET;
1832ee5686c6SMark Johnston 	dst.sin_len = sizeof(dst);
1833ee5686c6SMark Johnston 	dst.sin_addr.s_addr = htonl(INADDR_BROADCAST);
1834ee5686c6SMark Johnston 	dst.sin_port = htons(12345);
1835ee5686c6SMark Johnston 
1836ee5686c6SMark Johnston 	memset(buf, 0, sizeof(buf));
1837ee5686c6SMark Johnston 	n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst,
1838ee5686c6SMark Johnston 	    sizeof(dst));
1839ee5686c6SMark Johnston 
1840ee5686c6SMark Johnston 	/* Can't transmit to the broadcast address over TCP. */
1841ee5686c6SMark Johnston 	ATF_REQUIRE_ERRNO(EACCES, n == -1);
1842ee5686c6SMark Johnston 	ATF_REQUIRE(close(s) == 0);
1843ee5686c6SMark Johnston }
1844ee5686c6SMark Johnston 
1845a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp)
1846a10482eaSJohn Baldwin {
18473e7f8a8dSJohn Baldwin 	/* Transmit tests */
1848a10482eaSJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_TESTS);
1849a10482eaSJohn Baldwin 	AES_GCM_TESTS(ADD_TRANSMIT_TESTS);
1850a10482eaSJohn Baldwin 	CHACHA20_TESTS(ADD_TRANSMIT_TESTS);
185144265dc3SJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS);
18525de79eedSMark Johnston 	AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
18535de79eedSMark Johnston 	AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
18545de79eedSMark Johnston 	CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
1855d1c369f9SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST);
1856a10482eaSJohn Baldwin 
18573e7f8a8dSJohn Baldwin 	/* Receive tests */
185883a54b58SJohn Baldwin 	AES_CBC_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST);
185905a1d0f5SJohn Baldwin 	AES_GCM_TESTS(ADD_RECEIVE_TESTS);
186005a1d0f5SJohn Baldwin 	CHACHA20_TESTS(ADD_RECEIVE_TESTS);
186105a1d0f5SJohn Baldwin 	TLS_13_TESTS(ADD_PADDING_RECEIVE_TESTS);
1862233ce578SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST);
1863233ce578SJohn Baldwin 
1864ee5686c6SMark Johnston 	/* Miscellaneous */
1865ee5686c6SMark Johnston 	ATF_TP_ADD_TC(tp, ktls_sendto_baddst);
1866ee5686c6SMark Johnston 
1867a10482eaSJohn Baldwin 	return (atf_no_error());
1868a10482eaSJohn Baldwin }
1869