xref: /freebsd/tests/sys/kern/ktls_test.c (revision 883d1742d3d74635afc3ae2d8208974ac51e3dd9)
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 
2965bd3adbSJohn Baldwin #include <sys/param.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>
4170bb2286SJohn Baldwin #include <libutil.h>
422400a7b1SJohn Baldwin #include <netdb.h>
43a10482eaSJohn Baldwin #include <poll.h>
44a10482eaSJohn Baldwin #include <stdbool.h>
45a10482eaSJohn Baldwin #include <stdlib.h>
46a10482eaSJohn Baldwin #include <atf-c.h>
47a10482eaSJohn Baldwin 
48a10482eaSJohn Baldwin #include <openssl/err.h>
49a10482eaSJohn Baldwin #include <openssl/evp.h>
50a10482eaSJohn Baldwin #include <openssl/hmac.h>
51a10482eaSJohn Baldwin 
52a10482eaSJohn Baldwin static void
53a10482eaSJohn Baldwin require_ktls(void)
54a10482eaSJohn Baldwin {
55a10482eaSJohn Baldwin 	size_t len;
56a10482eaSJohn Baldwin 	bool enable;
57a10482eaSJohn Baldwin 
58a10482eaSJohn Baldwin 	len = sizeof(enable);
59a10482eaSJohn Baldwin 	if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) {
60a10482eaSJohn Baldwin 		if (errno == ENOENT)
61a10482eaSJohn Baldwin 			atf_tc_skip("kernel does not support TLS offload");
62a10482eaSJohn Baldwin 		atf_libc_error(errno, "Failed to read kern.ipc.tls.enable");
63a10482eaSJohn Baldwin 	}
64a10482eaSJohn Baldwin 
65a10482eaSJohn Baldwin 	if (!enable)
66a10482eaSJohn Baldwin 		atf_tc_skip("Kernel TLS is disabled");
67a10482eaSJohn Baldwin }
68a10482eaSJohn Baldwin 
69a10482eaSJohn Baldwin #define	ATF_REQUIRE_KTLS()	require_ktls()
70a10482eaSJohn Baldwin 
71ea4ebdcbSJohn Baldwin static void
72ea4ebdcbSJohn Baldwin check_tls_mode(const atf_tc_t *tc, int s, int sockopt)
73ea4ebdcbSJohn Baldwin {
74ea4ebdcbSJohn Baldwin 	if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_ifnet", false)) {
75ea4ebdcbSJohn Baldwin 		socklen_t len;
76ea4ebdcbSJohn Baldwin 		int mode;
77ea4ebdcbSJohn Baldwin 
78ea4ebdcbSJohn Baldwin 		len = sizeof(mode);
79ea4ebdcbSJohn Baldwin 		if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1)
80ea4ebdcbSJohn Baldwin 			atf_libc_error(errno, "Failed to fetch TLS mode");
81ea4ebdcbSJohn Baldwin 
82ea4ebdcbSJohn Baldwin 		if (mode != TCP_TLS_MODE_IFNET)
83ea4ebdcbSJohn Baldwin 			atf_tc_skip("connection did not use ifnet TLS");
84ea4ebdcbSJohn Baldwin 	}
85cc13c983SJohn Baldwin 
86cc13c983SJohn Baldwin 	if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_toe", false)) {
87cc13c983SJohn Baldwin 		socklen_t len;
88cc13c983SJohn Baldwin 		int mode;
89cc13c983SJohn Baldwin 
90cc13c983SJohn Baldwin 		len = sizeof(mode);
91cc13c983SJohn Baldwin 		if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1)
92cc13c983SJohn Baldwin 			atf_libc_error(errno, "Failed to fetch TLS mode");
93cc13c983SJohn Baldwin 
94cc13c983SJohn Baldwin 		if (mode != TCP_TLS_MODE_TOE)
95cc13c983SJohn Baldwin 			atf_tc_skip("connection did not use TOE TLS");
96cc13c983SJohn Baldwin 	}
97ea4ebdcbSJohn Baldwin }
98ea4ebdcbSJohn Baldwin 
9970bb2286SJohn Baldwin static void __printflike(2, 3)
10070bb2286SJohn Baldwin debug(const atf_tc_t *tc, const char *fmt, ...)
10170bb2286SJohn Baldwin {
10270bb2286SJohn Baldwin 	if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false))
10370bb2286SJohn Baldwin 		return;
10470bb2286SJohn Baldwin 
10570bb2286SJohn Baldwin 	va_list ap;
10670bb2286SJohn Baldwin 	va_start(ap, fmt);
10770bb2286SJohn Baldwin 	vprintf(fmt, ap);
10870bb2286SJohn Baldwin 	va_end(ap);
10970bb2286SJohn Baldwin }
11070bb2286SJohn Baldwin 
11170bb2286SJohn Baldwin static void
11270bb2286SJohn Baldwin debug_hexdump(const atf_tc_t *tc, const void *buf, int length,
11370bb2286SJohn Baldwin     const char *label)
11470bb2286SJohn Baldwin {
11570bb2286SJohn Baldwin 	if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false))
11670bb2286SJohn Baldwin 		return;
11770bb2286SJohn Baldwin 
11870bb2286SJohn Baldwin 	if (label != NULL)
11970bb2286SJohn Baldwin 		printf("%s:\n", label);
12070bb2286SJohn Baldwin 	hexdump(buf, length, NULL, 0);
12170bb2286SJohn Baldwin }
12270bb2286SJohn Baldwin 
123a10482eaSJohn Baldwin static char
124a10482eaSJohn Baldwin rdigit(void)
125a10482eaSJohn Baldwin {
126a10482eaSJohn Baldwin 	/* ASCII printable values between 0x20 and 0x7e */
127a10482eaSJohn Baldwin 	return (0x20 + random() % (0x7f - 0x20));
128a10482eaSJohn Baldwin }
129a10482eaSJohn Baldwin 
130a10482eaSJohn Baldwin static char *
131a10482eaSJohn Baldwin alloc_buffer(size_t len)
132a10482eaSJohn Baldwin {
133a10482eaSJohn Baldwin 	char *buf;
134a10482eaSJohn Baldwin 	size_t i;
135a10482eaSJohn Baldwin 
136a10482eaSJohn Baldwin 	if (len == 0)
137a10482eaSJohn Baldwin 		return (NULL);
138a10482eaSJohn Baldwin 	buf = malloc(len);
139a10482eaSJohn Baldwin 	for (i = 0; i < len; i++)
140a10482eaSJohn Baldwin 		buf[i] = rdigit();
141a10482eaSJohn Baldwin 	return (buf);
142a10482eaSJohn Baldwin }
143a10482eaSJohn Baldwin 
144a10482eaSJohn Baldwin static bool
1452c105205SJohn Baldwin socketpair_tcp(int sv[2])
146a10482eaSJohn Baldwin {
147a10482eaSJohn Baldwin 	struct pollfd pfd;
148a10482eaSJohn Baldwin 	struct sockaddr_in sin;
149a10482eaSJohn Baldwin 	socklen_t len;
150a10482eaSJohn Baldwin 	int as, cs, ls;
151a10482eaSJohn Baldwin 
152a10482eaSJohn Baldwin 	ls = socket(PF_INET, SOCK_STREAM, 0);
153a10482eaSJohn Baldwin 	if (ls == -1) {
154a10482eaSJohn Baldwin 		warn("socket() for listen");
155a10482eaSJohn Baldwin 		return (false);
156a10482eaSJohn Baldwin 	}
157a10482eaSJohn Baldwin 
158a10482eaSJohn Baldwin 	memset(&sin, 0, sizeof(sin));
159a10482eaSJohn Baldwin 	sin.sin_len = sizeof(sin);
160a10482eaSJohn Baldwin 	sin.sin_family = AF_INET;
161a10482eaSJohn Baldwin 	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
162a10482eaSJohn Baldwin 	if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
163a10482eaSJohn Baldwin 		warn("bind");
164a10482eaSJohn Baldwin 		close(ls);
165a10482eaSJohn Baldwin 		return (false);
166a10482eaSJohn Baldwin 	}
167a10482eaSJohn Baldwin 
168a10482eaSJohn Baldwin 	if (listen(ls, 1) == -1) {
169a10482eaSJohn Baldwin 		warn("listen");
170a10482eaSJohn Baldwin 		close(ls);
171a10482eaSJohn Baldwin 		return (false);
172a10482eaSJohn Baldwin 	}
173a10482eaSJohn Baldwin 
174a10482eaSJohn Baldwin 	len = sizeof(sin);
175a10482eaSJohn Baldwin 	if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) {
176a10482eaSJohn Baldwin 		warn("getsockname");
177a10482eaSJohn Baldwin 		close(ls);
178a10482eaSJohn Baldwin 		return (false);
179a10482eaSJohn Baldwin 	}
180a10482eaSJohn Baldwin 
181a10482eaSJohn Baldwin 	cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
182a10482eaSJohn Baldwin 	if (cs == -1) {
183a10482eaSJohn Baldwin 		warn("socket() for connect");
184a10482eaSJohn Baldwin 		close(ls);
185a10482eaSJohn Baldwin 		return (false);
186a10482eaSJohn Baldwin 	}
187a10482eaSJohn Baldwin 
188a10482eaSJohn Baldwin 	if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
189a10482eaSJohn Baldwin 		if (errno != EINPROGRESS) {
190a10482eaSJohn Baldwin 			warn("connect");
191a10482eaSJohn Baldwin 			close(ls);
192a10482eaSJohn Baldwin 			close(cs);
193a10482eaSJohn Baldwin 			return (false);
194a10482eaSJohn Baldwin 		}
195a10482eaSJohn Baldwin 	}
196a10482eaSJohn Baldwin 
197a10482eaSJohn Baldwin 	as = accept4(ls, NULL, NULL, SOCK_NONBLOCK);
198a10482eaSJohn Baldwin 	if (as == -1) {
199a10482eaSJohn Baldwin 		warn("accept4");
200a10482eaSJohn Baldwin 		close(ls);
201a10482eaSJohn Baldwin 		close(cs);
202a10482eaSJohn Baldwin 		return (false);
203a10482eaSJohn Baldwin 	}
204a10482eaSJohn Baldwin 
205a10482eaSJohn Baldwin 	close(ls);
206a10482eaSJohn Baldwin 
207a10482eaSJohn Baldwin 	pfd.fd = cs;
208a10482eaSJohn Baldwin 	pfd.events = POLLOUT;
209a10482eaSJohn Baldwin 	pfd.revents = 0;
210*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(1, poll(&pfd, 1, INFTIM));
211*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(POLLOUT, pfd.revents);
212a10482eaSJohn Baldwin 
213a10482eaSJohn Baldwin 	sv[0] = cs;
214a10482eaSJohn Baldwin 	sv[1] = as;
215a10482eaSJohn Baldwin 	return (true);
216a10482eaSJohn Baldwin }
217a10482eaSJohn Baldwin 
2182400a7b1SJohn Baldwin static bool
2192400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2])
2202400a7b1SJohn Baldwin {
2212400a7b1SJohn Baldwin 	const char *cause, *host, *port;
2222400a7b1SJohn Baldwin 	struct addrinfo hints, *ai, *tofree;
2232400a7b1SJohn Baldwin 	int error, flags, s;
2242400a7b1SJohn Baldwin 
2252400a7b1SJohn Baldwin 	host = atf_tc_get_config_var(tc, "ktls.host");
2262400a7b1SJohn Baldwin 	port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo");
2272400a7b1SJohn Baldwin 	memset(&hints, 0, sizeof(hints));
2282400a7b1SJohn Baldwin 	hints.ai_family = AF_UNSPEC;
2292400a7b1SJohn Baldwin 	hints.ai_socktype = SOCK_STREAM;
2302400a7b1SJohn Baldwin 	hints.ai_protocol = IPPROTO_TCP;
2312400a7b1SJohn Baldwin 	error = getaddrinfo(host, port, &hints, &tofree);
2322400a7b1SJohn Baldwin 	if (error != 0) {
2332400a7b1SJohn Baldwin 		warnx("getaddrinfo(%s:%s) failed: %s", host, port,
2342400a7b1SJohn Baldwin 		    gai_strerror(error));
2352400a7b1SJohn Baldwin 		return (false);
2362400a7b1SJohn Baldwin 	}
2372400a7b1SJohn Baldwin 
2382400a7b1SJohn Baldwin 	cause = NULL;
2392400a7b1SJohn Baldwin 	for (ai = tofree; ai != NULL; ai = ai->ai_next) {
2402400a7b1SJohn Baldwin 		s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
2412400a7b1SJohn Baldwin 		if (s == -1) {
2422400a7b1SJohn Baldwin 			cause = "socket";
2432400a7b1SJohn Baldwin 			error = errno;
2442400a7b1SJohn Baldwin 			continue;
2452400a7b1SJohn Baldwin 		}
2462400a7b1SJohn Baldwin 
2472400a7b1SJohn Baldwin 		if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) {
2482400a7b1SJohn Baldwin 			cause = "connect";
2492400a7b1SJohn Baldwin 			error = errno;
2502400a7b1SJohn Baldwin 			close(s);
2512400a7b1SJohn Baldwin 			continue;
2522400a7b1SJohn Baldwin 		}
2532400a7b1SJohn Baldwin 
2542400a7b1SJohn Baldwin 		freeaddrinfo(tofree);
2552400a7b1SJohn Baldwin 
2562400a7b1SJohn Baldwin 		ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1);
2572400a7b1SJohn Baldwin 		flags |= O_NONBLOCK;
2582400a7b1SJohn Baldwin 		ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1);
2592400a7b1SJohn Baldwin 
2602400a7b1SJohn Baldwin 		sv[0] = s;
2612400a7b1SJohn Baldwin 		sv[1] = s;
2622400a7b1SJohn Baldwin 		return (true);
2632400a7b1SJohn Baldwin 	}
2642400a7b1SJohn Baldwin 
2652400a7b1SJohn Baldwin 	warnc(error, "%s", cause);
2662400a7b1SJohn Baldwin 	freeaddrinfo(tofree);
2672400a7b1SJohn Baldwin 	return (false);
2682400a7b1SJohn Baldwin }
2692400a7b1SJohn Baldwin 
2702400a7b1SJohn Baldwin static bool
2712400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2])
2722400a7b1SJohn Baldwin {
2732400a7b1SJohn Baldwin 	if (atf_tc_has_config_var(tc, "ktls.host"))
2742400a7b1SJohn Baldwin 		return (echo_socket(tc, sv));
2752400a7b1SJohn Baldwin 	else
2762400a7b1SJohn Baldwin 		return (socketpair_tcp(sv));
2772400a7b1SJohn Baldwin }
2782400a7b1SJohn Baldwin 
279a10482eaSJohn Baldwin static void
2802c105205SJohn Baldwin close_sockets(int sv[2])
2812c105205SJohn Baldwin {
2822400a7b1SJohn Baldwin 	if (sv[0] != sv[1])
2832c105205SJohn Baldwin 		ATF_REQUIRE(close(sv[1]) == 0);
2842c105205SJohn Baldwin 	ATF_REQUIRE(close(sv[0]) == 0);
2852c105205SJohn Baldwin }
2862c105205SJohn Baldwin 
2872c105205SJohn Baldwin static void
288a10482eaSJohn Baldwin fd_set_blocking(int fd)
289a10482eaSJohn Baldwin {
290a10482eaSJohn Baldwin 	int flags;
291a10482eaSJohn Baldwin 
292a10482eaSJohn Baldwin 	ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1);
293a10482eaSJohn Baldwin 	flags &= ~O_NONBLOCK;
294a10482eaSJohn Baldwin 	ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1);
295a10482eaSJohn Baldwin }
296a10482eaSJohn Baldwin 
297a10482eaSJohn Baldwin static bool
29864811651SJohn Baldwin cbc_crypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
29964811651SJohn Baldwin     const char *input, char *output, size_t size, int enc)
300a10482eaSJohn Baldwin {
301a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
302a10482eaSJohn Baldwin 	int outl, total;
303a10482eaSJohn Baldwin 
304a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
305a10482eaSJohn Baldwin 	if (ctx == NULL) {
306a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
307a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
308a10482eaSJohn Baldwin 		return (false);
309a10482eaSJohn Baldwin 	}
310a10482eaSJohn Baldwin 	if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key,
31164811651SJohn Baldwin 	    (const u_char *)iv, enc) != 1) {
312a10482eaSJohn Baldwin 		warnx("EVP_CipherInit_ex failed: %s",
313a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
314a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
315a10482eaSJohn Baldwin 		return (false);
316a10482eaSJohn Baldwin 	}
317a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
318a10482eaSJohn Baldwin 	if (EVP_CipherUpdate(ctx, (u_char *)output, &outl,
319a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
320a10482eaSJohn Baldwin 		warnx("EVP_CipherUpdate failed: %s",
321a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
322a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
323a10482eaSJohn Baldwin 		return (false);
324a10482eaSJohn Baldwin 	}
325a10482eaSJohn Baldwin 	total = outl;
326a10482eaSJohn Baldwin 	if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
327a10482eaSJohn Baldwin 		warnx("EVP_CipherFinal_ex failed: %s",
328a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
329a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
330a10482eaSJohn Baldwin 		return (false);
331a10482eaSJohn Baldwin 	}
332a10482eaSJohn Baldwin 	total += outl;
333a10482eaSJohn Baldwin 	if ((size_t)total != size) {
334a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
335a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
336a10482eaSJohn Baldwin 		return (false);
337a10482eaSJohn Baldwin 	}
338a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
339a10482eaSJohn Baldwin 	return (true);
340a10482eaSJohn Baldwin }
341a10482eaSJohn Baldwin 
342a10482eaSJohn Baldwin static bool
34364811651SJohn Baldwin cbc_encrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
34464811651SJohn Baldwin     const char *input, char *output, size_t size)
34564811651SJohn Baldwin {
34664811651SJohn Baldwin 	return (cbc_crypt(cipher, key, iv, input, output, size, 1));
34764811651SJohn Baldwin }
34864811651SJohn Baldwin 
34964811651SJohn Baldwin static bool
35064811651SJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
35164811651SJohn Baldwin     const char *input, char *output, size_t size)
35264811651SJohn Baldwin {
35364811651SJohn Baldwin 	return (cbc_crypt(cipher, key, iv, input, output, size, 0));
35464811651SJohn Baldwin }
35564811651SJohn Baldwin 
35664811651SJohn Baldwin static bool
35764811651SJohn Baldwin compute_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
35864811651SJohn Baldwin     size_t aad_len, const void *buffer, size_t len, void *digest,
35964811651SJohn Baldwin     u_int *digest_len)
360a10482eaSJohn Baldwin {
361a10482eaSJohn Baldwin 	HMAC_CTX *ctx;
362a10482eaSJohn Baldwin 
363a10482eaSJohn Baldwin 	ctx = HMAC_CTX_new();
364a10482eaSJohn Baldwin 	if (ctx == NULL) {
365a10482eaSJohn Baldwin 		warnx("HMAC_CTX_new failed: %s",
366a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
367a10482eaSJohn Baldwin 		return (false);
368a10482eaSJohn Baldwin 	}
369a10482eaSJohn Baldwin 	if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) {
370a10482eaSJohn Baldwin 		warnx("HMAC_Init_ex failed: %s",
371a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
372a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
373a10482eaSJohn Baldwin 		return (false);
374a10482eaSJohn Baldwin 	}
375a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, aad, aad_len) != 1) {
376a10482eaSJohn Baldwin 		warnx("HMAC_Update (aad) failed: %s",
377a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
378a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
379a10482eaSJohn Baldwin 		return (false);
380a10482eaSJohn Baldwin 	}
381a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, buffer, len) != 1) {
382a10482eaSJohn Baldwin 		warnx("HMAC_Update (payload) failed: %s",
383a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
384a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
385a10482eaSJohn Baldwin 		return (false);
386a10482eaSJohn Baldwin 	}
38764811651SJohn Baldwin 	if (HMAC_Final(ctx, digest, digest_len) != 1) {
388a10482eaSJohn Baldwin 		warnx("HMAC_Final failed: %s",
389a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
390a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
391a10482eaSJohn Baldwin 		return (false);
392a10482eaSJohn Baldwin 	}
393a10482eaSJohn Baldwin 	HMAC_CTX_free(ctx);
39464811651SJohn Baldwin 	return (true);
39564811651SJohn Baldwin }
39664811651SJohn Baldwin 
39764811651SJohn Baldwin static bool
39864811651SJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
39964811651SJohn Baldwin     size_t aad_len, const void *buffer, size_t len, const void *digest)
40064811651SJohn Baldwin {
40164811651SJohn Baldwin 	unsigned char digest2[EVP_MAX_MD_SIZE];
40264811651SJohn Baldwin 	u_int digest_len;
40364811651SJohn Baldwin 
40464811651SJohn Baldwin 	if (!compute_hash(md, key, key_len, aad, aad_len, buffer, len, digest2,
40564811651SJohn Baldwin 	    &digest_len))
40664811651SJohn Baldwin 		return (false);
407a10482eaSJohn Baldwin 	if (memcmp(digest, digest2, digest_len) != 0) {
408a10482eaSJohn Baldwin 		warnx("HMAC mismatch");
409a10482eaSJohn Baldwin 		return (false);
410a10482eaSJohn Baldwin 	}
411a10482eaSJohn Baldwin 	return (true);
412a10482eaSJohn Baldwin }
413a10482eaSJohn Baldwin 
414a10482eaSJohn Baldwin static bool
4153e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
4163e7f8a8dSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
4173e7f8a8dSJohn Baldwin     size_t size, char *tag, size_t tag_len)
4183e7f8a8dSJohn Baldwin {
4193e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
4203e7f8a8dSJohn Baldwin 	int outl, total;
4213e7f8a8dSJohn Baldwin 
4223e7f8a8dSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
4233e7f8a8dSJohn Baldwin 	if (ctx == NULL) {
4243e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
4253e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4263e7f8a8dSJohn Baldwin 		return (false);
4273e7f8a8dSJohn Baldwin 	}
4283e7f8a8dSJohn Baldwin 	if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
4293e7f8a8dSJohn Baldwin 	    (const u_char *)nonce) != 1) {
4303e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptInit_ex failed: %s",
4313e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4323e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4333e7f8a8dSJohn Baldwin 		return (false);
4343e7f8a8dSJohn Baldwin 	}
4353e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
4363e7f8a8dSJohn Baldwin 	if (aad != NULL) {
4373e7f8a8dSJohn Baldwin 		if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
4383e7f8a8dSJohn Baldwin 		    aad_len) != 1) {
4393e7f8a8dSJohn Baldwin 			warnx("EVP_EncryptUpdate for AAD failed: %s",
4403e7f8a8dSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
4413e7f8a8dSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
4423e7f8a8dSJohn Baldwin 			return (false);
4433e7f8a8dSJohn Baldwin 		}
4443e7f8a8dSJohn Baldwin 	}
4453e7f8a8dSJohn Baldwin 	if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl,
4463e7f8a8dSJohn Baldwin 	    (const u_char *)input, size) != 1) {
4473e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptUpdate failed: %s",
4483e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4493e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4503e7f8a8dSJohn Baldwin 		return (false);
4513e7f8a8dSJohn Baldwin 	}
4523e7f8a8dSJohn Baldwin 	total = outl;
4533e7f8a8dSJohn Baldwin 	if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
4543e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptFinal_ex failed: %s",
4553e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4563e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4573e7f8a8dSJohn Baldwin 		return (false);
4583e7f8a8dSJohn Baldwin 	}
4593e7f8a8dSJohn Baldwin 	total += outl;
4603e7f8a8dSJohn Baldwin 	if ((size_t)total != size) {
4613e7f8a8dSJohn Baldwin 		warnx("encrypt size mismatch: %zu vs %d", size, total);
4623e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4633e7f8a8dSJohn Baldwin 		return (false);
4643e7f8a8dSJohn Baldwin 	}
4653e7f8a8dSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) !=
4663e7f8a8dSJohn Baldwin 	    1) {
4673e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s",
4683e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4693e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4703e7f8a8dSJohn Baldwin 		return (false);
4713e7f8a8dSJohn Baldwin 	}
4723e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
4733e7f8a8dSJohn Baldwin 	return (true);
4743e7f8a8dSJohn Baldwin }
4753e7f8a8dSJohn Baldwin 
4763e7f8a8dSJohn Baldwin static bool
477a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
478a10482eaSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
479a10482eaSJohn Baldwin     size_t size, const char *tag, size_t tag_len)
480a10482eaSJohn Baldwin {
481a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
482a10482eaSJohn Baldwin 	int outl, total;
483a10482eaSJohn Baldwin 	bool valid;
484a10482eaSJohn Baldwin 
485a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
486a10482eaSJohn Baldwin 	if (ctx == NULL) {
487a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
488a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
489a10482eaSJohn Baldwin 		return (false);
490a10482eaSJohn Baldwin 	}
491a10482eaSJohn Baldwin 	if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
492a10482eaSJohn Baldwin 	    (const u_char *)nonce) != 1) {
493a10482eaSJohn Baldwin 		warnx("EVP_DecryptInit_ex failed: %s",
494a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
495a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
496a10482eaSJohn Baldwin 		return (false);
497a10482eaSJohn Baldwin 	}
498a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
499a10482eaSJohn Baldwin 	if (aad != NULL) {
500a10482eaSJohn Baldwin 		if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
501a10482eaSJohn Baldwin 		    aad_len) != 1) {
502a10482eaSJohn Baldwin 			warnx("EVP_DecryptUpdate for AAD failed: %s",
503a10482eaSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
504a10482eaSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
505a10482eaSJohn Baldwin 			return (false);
506a10482eaSJohn Baldwin 		}
507a10482eaSJohn Baldwin 	}
508a10482eaSJohn Baldwin 	if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl,
509a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
510a10482eaSJohn Baldwin 		warnx("EVP_DecryptUpdate failed: %s",
511a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
512a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
513a10482eaSJohn Baldwin 		return (false);
514a10482eaSJohn Baldwin 	}
515a10482eaSJohn Baldwin 	total = outl;
516a10482eaSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
517a10482eaSJohn Baldwin 	    __DECONST(char *, tag)) != 1) {
518a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s",
519a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
520a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
521a10482eaSJohn Baldwin 		return (false);
522a10482eaSJohn Baldwin 	}
523a10482eaSJohn Baldwin 	valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1);
524a10482eaSJohn Baldwin 	total += outl;
525a10482eaSJohn Baldwin 	if ((size_t)total != size) {
526a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
527a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
528a10482eaSJohn Baldwin 		return (false);
529a10482eaSJohn Baldwin 	}
530a10482eaSJohn Baldwin 	if (!valid)
531a10482eaSJohn Baldwin 		warnx("tag mismatch");
532a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
533a10482eaSJohn Baldwin 	return (valid);
534a10482eaSJohn Baldwin }
535a10482eaSJohn Baldwin 
536a10482eaSJohn Baldwin static void
53770bb2286SJohn Baldwin build_tls_enable(const atf_tc_t *tc, int cipher_alg, size_t cipher_key_len,
53870bb2286SJohn Baldwin     int auth_alg, int minor, uint64_t seqno, struct tls_enable *en)
539a10482eaSJohn Baldwin {
540a10482eaSJohn Baldwin 	u_int auth_key_len, iv_len;
541a10482eaSJohn Baldwin 
542a10482eaSJohn Baldwin 	memset(en, 0, sizeof(*en));
543a10482eaSJohn Baldwin 
544a10482eaSJohn Baldwin 	switch (cipher_alg) {
545a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
546a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_ZERO)
547a10482eaSJohn Baldwin 			iv_len = AES_BLOCK_LEN;
548a10482eaSJohn Baldwin 		else
549a10482eaSJohn Baldwin 			iv_len = 0;
550a10482eaSJohn Baldwin 		break;
551a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
552a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_TWO)
553a10482eaSJohn Baldwin 			iv_len = TLS_AEAD_GCM_LEN;
554a10482eaSJohn Baldwin 		else
555a10482eaSJohn Baldwin 			iv_len = TLS_1_3_GCM_IV_LEN;
556a10482eaSJohn Baldwin 		break;
557a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
558a10482eaSJohn Baldwin 		iv_len = TLS_CHACHA20_IV_LEN;
559a10482eaSJohn Baldwin 		break;
560a10482eaSJohn Baldwin 	default:
561a10482eaSJohn Baldwin 		iv_len = 0;
562a10482eaSJohn Baldwin 		break;
563a10482eaSJohn Baldwin 	}
564a10482eaSJohn Baldwin 	switch (auth_alg) {
565a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
566a10482eaSJohn Baldwin 		auth_key_len = SHA1_HASH_LEN;
567a10482eaSJohn Baldwin 		break;
568a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
569a10482eaSJohn Baldwin 		auth_key_len = SHA2_256_HASH_LEN;
570a10482eaSJohn Baldwin 		break;
571a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
572a10482eaSJohn Baldwin 		auth_key_len = SHA2_384_HASH_LEN;
573a10482eaSJohn Baldwin 		break;
574a10482eaSJohn Baldwin 	default:
575a10482eaSJohn Baldwin 		auth_key_len = 0;
576a10482eaSJohn Baldwin 		break;
577a10482eaSJohn Baldwin 	}
578a10482eaSJohn Baldwin 	en->cipher_key = alloc_buffer(cipher_key_len);
57970bb2286SJohn Baldwin 	debug_hexdump(tc, en->cipher_key, cipher_key_len, "cipher key");
580a10482eaSJohn Baldwin 	en->iv = alloc_buffer(iv_len);
58170bb2286SJohn Baldwin 	if (iv_len != 0)
58270bb2286SJohn Baldwin 		debug_hexdump(tc, en->iv, iv_len, "iv");
583a10482eaSJohn Baldwin 	en->auth_key = alloc_buffer(auth_key_len);
58470bb2286SJohn Baldwin 	if (auth_key_len != 0)
58570bb2286SJohn Baldwin 		debug_hexdump(tc, en->auth_key, auth_key_len, "auth key");
586a10482eaSJohn Baldwin 	en->cipher_algorithm = cipher_alg;
587a10482eaSJohn Baldwin 	en->cipher_key_len = cipher_key_len;
588a10482eaSJohn Baldwin 	en->iv_len = iv_len;
589a10482eaSJohn Baldwin 	en->auth_algorithm = auth_alg;
590a10482eaSJohn Baldwin 	en->auth_key_len = auth_key_len;
591a10482eaSJohn Baldwin 	en->tls_vmajor = TLS_MAJOR_VER_ONE;
592a10482eaSJohn Baldwin 	en->tls_vminor = minor;
593a10482eaSJohn Baldwin 	be64enc(en->rec_seq, seqno);
59470bb2286SJohn Baldwin 	debug(tc, "seqno: %ju\n", (uintmax_t)seqno);
595a10482eaSJohn Baldwin }
596a10482eaSJohn Baldwin 
597a10482eaSJohn Baldwin static void
598a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en)
599a10482eaSJohn Baldwin {
600a10482eaSJohn Baldwin 	free(__DECONST(void *, en->cipher_key));
601a10482eaSJohn Baldwin 	free(__DECONST(void *, en->iv));
602a10482eaSJohn Baldwin 	free(__DECONST(void *, en->auth_key));
603a10482eaSJohn Baldwin }
604a10482eaSJohn Baldwin 
605a10482eaSJohn Baldwin static const EVP_CIPHER *
606a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en)
607a10482eaSJohn Baldwin {
608a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
609a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
610a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
611a10482eaSJohn Baldwin 		case 128 / 8:
612a10482eaSJohn Baldwin 			return (EVP_aes_128_cbc());
613a10482eaSJohn Baldwin 		case 256 / 8:
614a10482eaSJohn Baldwin 			return (EVP_aes_256_cbc());
615a10482eaSJohn Baldwin 		default:
616a10482eaSJohn Baldwin 			return (NULL);
617a10482eaSJohn Baldwin 		}
618a10482eaSJohn Baldwin 		break;
619a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
620a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
621a10482eaSJohn Baldwin 		case 128 / 8:
622a10482eaSJohn Baldwin 			return (EVP_aes_128_gcm());
623a10482eaSJohn Baldwin 		case 256 / 8:
624a10482eaSJohn Baldwin 			return (EVP_aes_256_gcm());
625a10482eaSJohn Baldwin 		default:
626a10482eaSJohn Baldwin 			return (NULL);
627a10482eaSJohn Baldwin 		}
628a10482eaSJohn Baldwin 		break;
629a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
630a10482eaSJohn Baldwin 		return (EVP_chacha20_poly1305());
631a10482eaSJohn Baldwin 	default:
632a10482eaSJohn Baldwin 		return (NULL);
633a10482eaSJohn Baldwin 	}
634a10482eaSJohn Baldwin }
635a10482eaSJohn Baldwin 
636a10482eaSJohn Baldwin static const EVP_MD *
637a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en)
638a10482eaSJohn Baldwin {
639a10482eaSJohn Baldwin 	switch (en->auth_algorithm) {
640a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
641a10482eaSJohn Baldwin 		return (EVP_sha1());
642a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
643a10482eaSJohn Baldwin 		return (EVP_sha256());
644a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
645a10482eaSJohn Baldwin 		return (EVP_sha384());
646a10482eaSJohn Baldwin 	default:
647a10482eaSJohn Baldwin 		return (NULL);
648a10482eaSJohn Baldwin 	}
649a10482eaSJohn Baldwin }
650a10482eaSJohn Baldwin 
651a10482eaSJohn Baldwin static size_t
652a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en)
653a10482eaSJohn Baldwin {
654a10482eaSJohn Baldwin 	size_t len;
655a10482eaSJohn Baldwin 
656a10482eaSJohn Baldwin 	len = sizeof(struct tls_record_layer);
657a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
658a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
659a10482eaSJohn Baldwin 		if (en->tls_vminor != TLS_MINOR_VER_ZERO)
660a10482eaSJohn Baldwin 			len += AES_BLOCK_LEN;
661a10482eaSJohn Baldwin 		return (len);
662a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
663a10482eaSJohn Baldwin 		if (en->tls_vminor == TLS_MINOR_VER_TWO)
664a10482eaSJohn Baldwin 			len += sizeof(uint64_t);
665a10482eaSJohn Baldwin 		return (len);
666a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
667a10482eaSJohn Baldwin 		return (len);
668a10482eaSJohn Baldwin 	default:
669a10482eaSJohn Baldwin 		return (0);
670a10482eaSJohn Baldwin 	}
671a10482eaSJohn Baldwin }
672a10482eaSJohn Baldwin 
673a10482eaSJohn Baldwin static size_t
674a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en)
675a10482eaSJohn Baldwin {
676a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
677a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
678a10482eaSJohn Baldwin 		switch (en->auth_algorithm) {
679a10482eaSJohn Baldwin 		case CRYPTO_SHA1_HMAC:
680a10482eaSJohn Baldwin 			return (SHA1_HASH_LEN);
681a10482eaSJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
682a10482eaSJohn Baldwin 			return (SHA2_256_HASH_LEN);
683a10482eaSJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
684a10482eaSJohn Baldwin 			return (SHA2_384_HASH_LEN);
685a10482eaSJohn Baldwin 		default:
686a10482eaSJohn Baldwin 			return (0);
687a10482eaSJohn Baldwin 		}
688a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
689a10482eaSJohn Baldwin 		return (AES_GMAC_HASH_LEN);
690a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
691a10482eaSJohn Baldwin 		return (POLY1305_HASH_LEN);
692a10482eaSJohn Baldwin 	default:
693a10482eaSJohn Baldwin 		return (0);
694a10482eaSJohn Baldwin 	}
695a10482eaSJohn Baldwin }
696a10482eaSJohn Baldwin 
697a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */
698a10482eaSJohn Baldwin static size_t
699a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en)
700a10482eaSJohn Baldwin {
701a10482eaSJohn Baldwin 	size_t len;
702a10482eaSJohn Baldwin 
703a10482eaSJohn Baldwin 	len = tls_mac_len(en);
704a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
705a10482eaSJohn Baldwin 		len += AES_BLOCK_LEN;
706a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
707a10482eaSJohn Baldwin 		len++;
708a10482eaSJohn Baldwin 	return (len);
709a10482eaSJohn Baldwin }
710a10482eaSJohn Baldwin 
71165bd3adbSJohn Baldwin /* Minimum valid record payload size for a given cipher suite. */
71265bd3adbSJohn Baldwin static size_t
71365bd3adbSJohn Baldwin tls_minimum_record_payload(struct tls_enable *en)
71465bd3adbSJohn Baldwin {
71565bd3adbSJohn Baldwin 	size_t len;
71665bd3adbSJohn Baldwin 
71765bd3adbSJohn Baldwin 	len = tls_header_len(en);
71865bd3adbSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
71965bd3adbSJohn Baldwin 		len += roundup2(tls_mac_len(en) + 1, AES_BLOCK_LEN);
72065bd3adbSJohn Baldwin 	else
72165bd3adbSJohn Baldwin 		len += tls_mac_len(en);
72265bd3adbSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
72365bd3adbSJohn Baldwin 		len++;
72465bd3adbSJohn Baldwin 	return (len - sizeof(struct tls_record_layer));
72565bd3adbSJohn Baldwin }
72665bd3adbSJohn Baldwin 
727a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */
728a10482eaSJohn Baldwin static void
729a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len,
730a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad)
731a10482eaSJohn Baldwin {
732a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
733a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
734a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
735a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
736a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
737a10482eaSJohn Baldwin }
738a10482eaSJohn Baldwin 
739a10482eaSJohn Baldwin static void
740a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len,
741a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno,
742a10482eaSJohn Baldwin     struct tls_aead_data *ad)
743a10482eaSJohn Baldwin {
744a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
745a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
746a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
747a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
748a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
749a10482eaSJohn Baldwin }
750a10482eaSJohn Baldwin 
751a10482eaSJohn Baldwin static void
752a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr,
753a10482eaSJohn Baldwin     uint64_t seqno, struct tls_aead_data_13 *ad)
754a10482eaSJohn Baldwin {
755a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
756a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
757a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
758a10482eaSJohn Baldwin 	ad->tls_length = hdr->tls_length;
759a10482eaSJohn Baldwin }
760a10482eaSJohn Baldwin 
761a10482eaSJohn Baldwin static void
762a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr,
763a10482eaSJohn Baldwin     char *nonce)
764a10482eaSJohn Baldwin {
765a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN);
766a10482eaSJohn Baldwin 	memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t));
767a10482eaSJohn Baldwin }
768a10482eaSJohn Baldwin 
769a10482eaSJohn Baldwin static void
770a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce)
771a10482eaSJohn Baldwin {
772a10482eaSJohn Baldwin 	static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN,
773a10482eaSJohn Baldwin 	    "TLS 1.3 nonce length mismatch");
774a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN);
775a10482eaSJohn Baldwin 	*(uint64_t *)(nonce + 4) ^= htobe64(seqno);
776a10482eaSJohn Baldwin }
777a10482eaSJohn Baldwin 
778a10482eaSJohn Baldwin /*
779a10482eaSJohn Baldwin  * Decrypt a TLS record 'len' bytes long at 'src' and store the result at
780a10482eaSJohn Baldwin  * 'dst'.  If the TLS record header length doesn't match or 'dst' doesn't
781a10482eaSJohn Baldwin  * have sufficient room ('avail'), fail the test.
782a10482eaSJohn Baldwin  */
783a10482eaSJohn Baldwin static size_t
78470bb2286SJohn Baldwin decrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en,
78570bb2286SJohn Baldwin     uint64_t seqno, const void *src, size_t len, void *dst, size_t avail,
78670bb2286SJohn Baldwin     uint8_t *record_type)
787a10482eaSJohn Baldwin {
788a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
789a10482eaSJohn Baldwin 	struct tls_mac_data aad;
790a10482eaSJohn Baldwin 	const char *iv;
791a10482eaSJohn Baldwin 	char *buf;
792a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
793a10482eaSJohn Baldwin 	int padding;
794a10482eaSJohn Baldwin 
795a10482eaSJohn Baldwin 	hdr = src;
796a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
797a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
798*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor);
799*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(en->tls_vminor, hdr->tls_vminor);
80070bb2286SJohn Baldwin 	debug(tc, "decrypting MTE record seqno %ju:\n", (uintmax_t)seqno);
80170bb2286SJohn Baldwin 	debug_hexdump(tc, src, len, NULL);
802a10482eaSJohn Baldwin 
803a10482eaSJohn Baldwin 	/* First, decrypt the outer payload into a temporary buffer. */
804a10482eaSJohn Baldwin 	payload_len = len - hdr_len;
805a10482eaSJohn Baldwin 	buf = malloc(payload_len);
806a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
807a10482eaSJohn Baldwin 		iv = en->iv;
808a10482eaSJohn Baldwin 	else
809a10482eaSJohn Baldwin 		iv = (void *)(hdr + 1);
81070bb2286SJohn Baldwin 	debug_hexdump(tc, iv, AES_BLOCK_LEN, "iv");
811a10482eaSJohn Baldwin 	ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
812a10482eaSJohn Baldwin 	    (const u_char *)src + hdr_len, buf, payload_len));
81370bb2286SJohn Baldwin 	debug_hexdump(tc, buf, payload_len, "decrypted buffer");
814a10482eaSJohn Baldwin 
815a10482eaSJohn Baldwin 	/*
816a10482eaSJohn Baldwin 	 * Copy the last encrypted block to use as the IV for the next
817a10482eaSJohn Baldwin 	 * record for TLS 1.0.
818a10482eaSJohn Baldwin 	 */
819a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
820a10482eaSJohn Baldwin 		memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src +
821a10482eaSJohn Baldwin 		    (len - AES_BLOCK_LEN), AES_BLOCK_LEN);
822a10482eaSJohn Baldwin 
823a10482eaSJohn Baldwin 	/*
824a10482eaSJohn Baldwin 	 * Verify trailing padding and strip.
825a10482eaSJohn Baldwin 	 *
826a10482eaSJohn Baldwin 	 * The kernel always generates the smallest amount of padding.
827a10482eaSJohn Baldwin 	 */
828a10482eaSJohn Baldwin 	padding = buf[payload_len - 1] + 1;
829*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(padding > 0 && padding <= AES_BLOCK_LEN,
830*883d1742SJohn Baldwin 	    "invalid padding %d", padding);
831*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(payload_len >= mac_len + padding,
832*883d1742SJohn Baldwin 	    "payload_len (%zu) < mac_len (%zu) + padding (%d)", payload_len,
833*883d1742SJohn Baldwin 	    mac_len, padding);
834a10482eaSJohn Baldwin 	payload_len -= padding;
835a10482eaSJohn Baldwin 
836a10482eaSJohn Baldwin 	/* Verify HMAC. */
837a10482eaSJohn Baldwin 	payload_len -= mac_len;
838a10482eaSJohn Baldwin 	tls_mte_aad(en, payload_len, hdr, seqno, &aad);
83970bb2286SJohn Baldwin 	debug_hexdump(tc, &aad, sizeof(aad), "aad");
840a10482eaSJohn Baldwin 	ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
841a10482eaSJohn Baldwin 	    &aad, sizeof(aad), buf, payload_len, buf + payload_len));
842a10482eaSJohn Baldwin 
843*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(payload_len <= avail, "payload_len (%zu) < avail (%zu)",
844*883d1742SJohn Baldwin 	    payload_len, avail);
845a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
846a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
847a10482eaSJohn Baldwin 	return (payload_len);
848a10482eaSJohn Baldwin }
849a10482eaSJohn Baldwin 
850a10482eaSJohn Baldwin static size_t
85170bb2286SJohn Baldwin decrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
85270bb2286SJohn Baldwin     const void *src, size_t len, void *dst, uint8_t *record_type)
853a10482eaSJohn Baldwin {
854a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
855a10482eaSJohn Baldwin 	struct tls_aead_data aad;
856a10482eaSJohn Baldwin 	char nonce[12];
857a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
858a10482eaSJohn Baldwin 
859a10482eaSJohn Baldwin 	hdr = src;
860a10482eaSJohn Baldwin 
861a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
862a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
863a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
864*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor);
865*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, hdr->tls_vminor);
86670bb2286SJohn Baldwin 	debug(tc, "decrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno);
86770bb2286SJohn Baldwin 	debug_hexdump(tc, src, len, NULL);
868a10482eaSJohn Baldwin 
869a10482eaSJohn Baldwin 	tls_12_aead_aad(en, payload_len, hdr, seqno, &aad);
87070bb2286SJohn Baldwin 	debug_hexdump(tc, &aad, sizeof(aad), "aad");
871a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
872a10482eaSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
873a10482eaSJohn Baldwin 	else
874a10482eaSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
87570bb2286SJohn Baldwin 	debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
876a10482eaSJohn Baldwin 
877a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
878a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len,
879a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
880a10482eaSJohn Baldwin 
881a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
882a10482eaSJohn Baldwin 	return (payload_len);
883a10482eaSJohn Baldwin }
884a10482eaSJohn Baldwin 
885a10482eaSJohn Baldwin static size_t
88670bb2286SJohn Baldwin decrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
88770bb2286SJohn Baldwin     const void *src, size_t len, void *dst, uint8_t *record_type)
888a10482eaSJohn Baldwin {
889a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
890a10482eaSJohn Baldwin 	struct tls_aead_data_13 aad;
891a10482eaSJohn Baldwin 	char nonce[12];
892a10482eaSJohn Baldwin 	char *buf;
893a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
894a10482eaSJohn Baldwin 
895a10482eaSJohn Baldwin 	hdr = src;
896a10482eaSJohn Baldwin 
897a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
898a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
899a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
900*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(payload_len >= 1,
901*883d1742SJohn Baldwin 	    "payload_len (%zu) too short: len %zu hdr_len %zu mac_len %zu",
902*883d1742SJohn Baldwin 	    payload_len, len, hdr_len, mac_len);
903*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, hdr->tls_type);
904*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor);
905*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, hdr->tls_vminor);
90670bb2286SJohn Baldwin 	debug(tc, "decrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno);
90770bb2286SJohn Baldwin 	debug_hexdump(tc, src, len, NULL);
908a10482eaSJohn Baldwin 
909a10482eaSJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
91070bb2286SJohn Baldwin 	debug_hexdump(tc, &aad, sizeof(aad), "aad");
911a10482eaSJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
91270bb2286SJohn Baldwin 	debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
913a10482eaSJohn Baldwin 
914a10482eaSJohn Baldwin 	/*
915a10482eaSJohn Baldwin 	 * Have to use a temporary buffer for the output due to the
916a10482eaSJohn Baldwin 	 * record type as the last byte of the trailer.
917a10482eaSJohn Baldwin 	 */
918a10482eaSJohn Baldwin 	buf = malloc(payload_len);
919a10482eaSJohn Baldwin 
920a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
921a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len,
922a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
92370bb2286SJohn Baldwin 	debug_hexdump(tc, buf, payload_len, "decrypted buffer");
924a10482eaSJohn Baldwin 
925a10482eaSJohn Baldwin 	/* Trim record type. */
926a10482eaSJohn Baldwin 	*record_type = buf[payload_len - 1];
927a10482eaSJohn Baldwin 	payload_len--;
928a10482eaSJohn Baldwin 
929a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
930a10482eaSJohn Baldwin 	free(buf);
931a10482eaSJohn Baldwin 
932a10482eaSJohn Baldwin 	return (payload_len);
933a10482eaSJohn Baldwin }
934a10482eaSJohn Baldwin 
935a10482eaSJohn Baldwin static size_t
93670bb2286SJohn Baldwin decrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
93770bb2286SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type)
938a10482eaSJohn Baldwin {
939a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
940a10482eaSJohn Baldwin 	size_t payload_len;
941a10482eaSJohn Baldwin 
942a10482eaSJohn Baldwin 	hdr = src;
943*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(len, ntohs(hdr->tls_length) + sizeof(*hdr));
944a10482eaSJohn Baldwin 
945a10482eaSJohn Baldwin 	payload_len = len - (tls_header_len(en) + tls_trailer_len(en));
946*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(payload_len <= avail, "payload_len (%zu) > avail (%zu)",
947*883d1742SJohn Baldwin 	    payload_len, avail);
948a10482eaSJohn Baldwin 
949a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
950*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(payload_len, decrypt_tls_12_aead(tc, en,
951*883d1742SJohn Baldwin 		    seqno, src, len, dst, record_type));
952a10482eaSJohn Baldwin 	} else {
953*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(payload_len, decrypt_tls_13_aead(tc, en,
954*883d1742SJohn Baldwin 		    seqno, src, len, dst, record_type));
955a10482eaSJohn Baldwin 	}
956a10482eaSJohn Baldwin 
957a10482eaSJohn Baldwin 	return (payload_len);
958a10482eaSJohn Baldwin }
959a10482eaSJohn Baldwin 
960a10482eaSJohn Baldwin static size_t
96170bb2286SJohn Baldwin decrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
96270bb2286SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type)
963a10482eaSJohn Baldwin {
964a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
96570bb2286SJohn Baldwin 		return (decrypt_tls_aes_cbc_mte(tc, en, seqno, src, len, dst,
96670bb2286SJohn Baldwin 		    avail, record_type));
967a10482eaSJohn Baldwin 	else
96870bb2286SJohn Baldwin 		return (decrypt_tls_aead(tc, en, seqno, src, len, dst, avail,
969a10482eaSJohn Baldwin 		    record_type));
970a10482eaSJohn Baldwin }
971a10482eaSJohn Baldwin 
9723e7f8a8dSJohn Baldwin /*
9733e7f8a8dSJohn Baldwin  * Encrypt a TLS record of type 'record_type' with payload 'len' bytes
9743e7f8a8dSJohn Baldwin  * long at 'src' and store the result at 'dst'.  If 'dst' doesn't have
97564811651SJohn Baldwin  * sufficient room ('avail'), fail the test.  'padding' is the amount
97664811651SJohn Baldwin  * of additional padding to include beyond any amount mandated by the
97764811651SJohn Baldwin  * cipher suite.
9783e7f8a8dSJohn Baldwin  */
9793e7f8a8dSJohn Baldwin static size_t
98070bb2286SJohn Baldwin encrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en,
98170bb2286SJohn Baldwin     uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
98270bb2286SJohn Baldwin     size_t avail, size_t padding)
98364811651SJohn Baldwin {
98464811651SJohn Baldwin 	struct tls_record_layer *hdr;
98564811651SJohn Baldwin 	struct tls_mac_data aad;
98664811651SJohn Baldwin 	char *buf, *iv;
98764811651SJohn Baldwin 	size_t hdr_len, mac_len, record_len;
98864811651SJohn Baldwin 	u_int digest_len, i;
98964811651SJohn Baldwin 
990*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(0, padding % 16);
99164811651SJohn Baldwin 
99264811651SJohn Baldwin 	hdr = dst;
99364811651SJohn Baldwin 	buf = dst;
99464811651SJohn Baldwin 
99570bb2286SJohn Baldwin 	debug(tc, "encrypting MTE record seqno %ju:\n", (uintmax_t)seqno);
99664811651SJohn Baldwin 	hdr_len = tls_header_len(en);
99764811651SJohn Baldwin 	mac_len = tls_mac_len(en);
99864811651SJohn Baldwin 	padding += (AES_BLOCK_LEN - (len + mac_len) % AES_BLOCK_LEN);
999*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(padding > 0 && padding <= 255, "invalid padding (%zu)",
1000*883d1742SJohn Baldwin 	    padding);
100164811651SJohn Baldwin 
100264811651SJohn Baldwin 	record_len = hdr_len + len + mac_len + padding;
1003*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(record_len <= avail, "record_len (%zu) > avail (%zu): "
1004*883d1742SJohn Baldwin 	    "hdr_len %zu, len %zu, mac_len %zu, padding %zu", record_len,
1005*883d1742SJohn Baldwin 	    avail, hdr_len, len, mac_len, padding);
100664811651SJohn Baldwin 
100764811651SJohn Baldwin 	hdr->tls_type = record_type;
100864811651SJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
100964811651SJohn Baldwin 	hdr->tls_vminor = en->tls_vminor;
101064811651SJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
101164811651SJohn Baldwin 	iv = (char *)(hdr + 1);
101264811651SJohn Baldwin 	for (i = 0; i < AES_BLOCK_LEN; i++)
101364811651SJohn Baldwin 		iv[i] = rdigit();
101470bb2286SJohn Baldwin 	debug_hexdump(tc, iv, AES_BLOCK_LEN, "explicit IV");
101564811651SJohn Baldwin 
101664811651SJohn Baldwin 	/* Copy plaintext to ciphertext region. */
101764811651SJohn Baldwin 	memcpy(buf + hdr_len, src, len);
101864811651SJohn Baldwin 
101964811651SJohn Baldwin 	/* Compute HMAC. */
102064811651SJohn Baldwin 	tls_mte_aad(en, len, hdr, seqno, &aad);
102170bb2286SJohn Baldwin 	debug_hexdump(tc, &aad, sizeof(aad), "aad");
102270bb2286SJohn Baldwin 	debug_hexdump(tc, src, len, "plaintext");
102364811651SJohn Baldwin 	ATF_REQUIRE(compute_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
102464811651SJohn Baldwin 	    &aad, sizeof(aad), src, len, buf + hdr_len + len, &digest_len));
1025*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(mac_len, digest_len);
102664811651SJohn Baldwin 
102764811651SJohn Baldwin 	/* Store padding. */
102864811651SJohn Baldwin 	for (i = 0; i < padding; i++)
102964811651SJohn Baldwin 		buf[hdr_len + len + mac_len + i] = padding - 1;
1030*883d1742SJohn Baldwin 	debug_hexdump(tc, buf + hdr_len + len, mac_len + padding,
1031*883d1742SJohn Baldwin 	    "MAC and padding");
103264811651SJohn Baldwin 
103364811651SJohn Baldwin 	/* Encrypt the record. */
103464811651SJohn Baldwin 	ATF_REQUIRE(cbc_encrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
103564811651SJohn Baldwin 	    buf + hdr_len, buf + hdr_len, len + mac_len + padding));
103670bb2286SJohn Baldwin 	debug_hexdump(tc, dst, record_len, "encrypted record");
103764811651SJohn Baldwin 
103864811651SJohn Baldwin 	return (record_len);
103964811651SJohn Baldwin }
104064811651SJohn Baldwin 
104164811651SJohn Baldwin static size_t
104270bb2286SJohn Baldwin encrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en,
104370bb2286SJohn Baldwin     uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst)
10443e7f8a8dSJohn Baldwin {
10453e7f8a8dSJohn Baldwin 	struct tls_record_layer *hdr;
10463e7f8a8dSJohn Baldwin 	struct tls_aead_data aad;
10473e7f8a8dSJohn Baldwin 	char nonce[12];
10483e7f8a8dSJohn Baldwin 	size_t hdr_len, mac_len, record_len;
10493e7f8a8dSJohn Baldwin 
10503e7f8a8dSJohn Baldwin 	hdr = dst;
10513e7f8a8dSJohn Baldwin 
105270bb2286SJohn Baldwin 	debug(tc, "encrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno);
10533e7f8a8dSJohn Baldwin 	hdr_len = tls_header_len(en);
10543e7f8a8dSJohn Baldwin 	mac_len = tls_mac_len(en);
10553e7f8a8dSJohn Baldwin 	record_len = hdr_len + len + mac_len;
10563e7f8a8dSJohn Baldwin 
10573e7f8a8dSJohn Baldwin 	hdr->tls_type = record_type;
10583e7f8a8dSJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
10593e7f8a8dSJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
10603e7f8a8dSJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
10613e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
10623e7f8a8dSJohn Baldwin 		memcpy(hdr + 1, &seqno, sizeof(seqno));
10633e7f8a8dSJohn Baldwin 
10643e7f8a8dSJohn Baldwin 	tls_12_aead_aad(en, len, hdr, seqno, &aad);
106570bb2286SJohn Baldwin 	debug_hexdump(tc, &aad, sizeof(aad), "aad");
10663e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
10673e7f8a8dSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
10683e7f8a8dSJohn Baldwin 	else
10693e7f8a8dSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
107070bb2286SJohn Baldwin 	debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
10713e7f8a8dSJohn Baldwin 
107270bb2286SJohn Baldwin 	debug_hexdump(tc, src, len, "plaintext");
10733e7f8a8dSJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
10743e7f8a8dSJohn Baldwin 	    &aad, sizeof(aad), src, (char *)dst + hdr_len, len,
10753e7f8a8dSJohn Baldwin 	    (char *)dst + hdr_len + len, mac_len));
107670bb2286SJohn Baldwin 	debug_hexdump(tc, dst, record_len, "encrypted record");
10773e7f8a8dSJohn Baldwin 
10783e7f8a8dSJohn Baldwin 	return (record_len);
10793e7f8a8dSJohn Baldwin }
10803e7f8a8dSJohn Baldwin 
10813e7f8a8dSJohn Baldwin static size_t
108270bb2286SJohn Baldwin encrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en,
108370bb2286SJohn Baldwin     uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
108470bb2286SJohn Baldwin     size_t padding)
108505a1d0f5SJohn Baldwin {
108605a1d0f5SJohn Baldwin 	struct tls_record_layer *hdr;
108705a1d0f5SJohn Baldwin 	struct tls_aead_data_13 aad;
108805a1d0f5SJohn Baldwin 	char nonce[12];
108905a1d0f5SJohn Baldwin 	char *buf;
109005a1d0f5SJohn Baldwin 	size_t hdr_len, mac_len, record_len;
109105a1d0f5SJohn Baldwin 
109205a1d0f5SJohn Baldwin 	hdr = dst;
109305a1d0f5SJohn Baldwin 
109470bb2286SJohn Baldwin 	debug(tc, "encrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno);
109505a1d0f5SJohn Baldwin 	hdr_len = tls_header_len(en);
109605a1d0f5SJohn Baldwin 	mac_len = tls_mac_len(en);
109705a1d0f5SJohn Baldwin 	record_len = hdr_len + len + 1 + padding + mac_len;
109805a1d0f5SJohn Baldwin 
109905a1d0f5SJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP;
110005a1d0f5SJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
110105a1d0f5SJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
110205a1d0f5SJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
110305a1d0f5SJohn Baldwin 
110405a1d0f5SJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
110570bb2286SJohn Baldwin 	debug_hexdump(tc, &aad, sizeof(aad), "aad");
110605a1d0f5SJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
110770bb2286SJohn Baldwin 	debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
110805a1d0f5SJohn Baldwin 
110905a1d0f5SJohn Baldwin 	/*
111005a1d0f5SJohn Baldwin 	 * Have to use a temporary buffer for the input so that the record
111105a1d0f5SJohn Baldwin 	 * type can be appended.
111205a1d0f5SJohn Baldwin 	 */
111305a1d0f5SJohn Baldwin 	buf = malloc(len + 1 + padding);
111405a1d0f5SJohn Baldwin 	memcpy(buf, src, len);
111505a1d0f5SJohn Baldwin 	buf[len] = record_type;
111605a1d0f5SJohn Baldwin 	memset(buf + len + 1, 0, padding);
111770bb2286SJohn Baldwin 	debug_hexdump(tc, buf, len + 1 + padding, "plaintext + type + padding");
111805a1d0f5SJohn Baldwin 
111905a1d0f5SJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
112005a1d0f5SJohn Baldwin 	    &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding,
112105a1d0f5SJohn Baldwin 	    (char *)dst + hdr_len + len + 1 + padding, mac_len));
112270bb2286SJohn Baldwin 	debug_hexdump(tc, dst, record_len, "encrypted record");
112305a1d0f5SJohn Baldwin 
112405a1d0f5SJohn Baldwin 	free(buf);
112505a1d0f5SJohn Baldwin 
112605a1d0f5SJohn Baldwin 	return (record_len);
112705a1d0f5SJohn Baldwin }
112805a1d0f5SJohn Baldwin 
112905a1d0f5SJohn Baldwin static size_t
113070bb2286SJohn Baldwin encrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en,
113170bb2286SJohn Baldwin     uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
113270bb2286SJohn Baldwin     size_t avail, size_t padding)
11333e7f8a8dSJohn Baldwin {
11343e7f8a8dSJohn Baldwin 	size_t record_len;
11353e7f8a8dSJohn Baldwin 
113605a1d0f5SJohn Baldwin 	record_len = tls_header_len(en) + len + padding + tls_trailer_len(en);
1137*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(record_len <= avail, "record_len (%zu) > avail (%zu): "
1138*883d1742SJohn Baldwin 	    "header %zu len %zu padding %zu trailer %zu", record_len, avail,
1139*883d1742SJohn Baldwin 	    tls_header_len(en), len, padding, tls_trailer_len(en));
11403e7f8a8dSJohn Baldwin 
114105a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
1142*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(0, padding);
1143*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(record_len, encrypt_tls_12_aead(tc, en,
1144*883d1742SJohn Baldwin 		    record_type, seqno, src, len, dst));
114505a1d0f5SJohn Baldwin 	} else
1146*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(record_len, encrypt_tls_13_aead(tc, en,
1147*883d1742SJohn Baldwin 		    record_type, seqno, src, len, dst, padding));
11483e7f8a8dSJohn Baldwin 
11493e7f8a8dSJohn Baldwin 	return (record_len);
11503e7f8a8dSJohn Baldwin }
11513e7f8a8dSJohn Baldwin 
11523e7f8a8dSJohn Baldwin static size_t
115370bb2286SJohn Baldwin encrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en,
115470bb2286SJohn Baldwin     uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
115570bb2286SJohn Baldwin     size_t avail, size_t padding)
11563e7f8a8dSJohn Baldwin {
115764811651SJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
115870bb2286SJohn Baldwin 		return (encrypt_tls_aes_cbc_mte(tc, en, record_type, seqno, src,
115964811651SJohn Baldwin 		    len, dst, avail, padding));
116064811651SJohn Baldwin 	else
116170bb2286SJohn Baldwin 		return (encrypt_tls_aead(tc, en, record_type, seqno, src, len,
116264811651SJohn Baldwin 		    dst, avail, padding));
11633e7f8a8dSJohn Baldwin }
11643e7f8a8dSJohn Baldwin 
1165a10482eaSJohn Baldwin static void
11662400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en,
11672400a7b1SJohn Baldwin     uint64_t seqno, size_t len)
1168a10482eaSJohn Baldwin {
1169a10482eaSJohn Baldwin 	struct kevent ev;
1170a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
1171a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
1172a10482eaSJohn Baldwin 	size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written;
1173a10482eaSJohn Baldwin 	ssize_t rv;
1174a10482eaSJohn Baldwin 	int kq, sockets[2];
1175a10482eaSJohn Baldwin 	uint8_t record_type;
1176a10482eaSJohn Baldwin 
1177a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
117870bb2286SJohn Baldwin 	debug_hexdump(tc, plaintext, len, "plaintext");
1179a10482eaSJohn Baldwin 	decrypted = malloc(len);
1180a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
1181a10482eaSJohn Baldwin 	    tls_trailer_len(en);
1182a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1183a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
1184a10482eaSJohn Baldwin 
1185a10482eaSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
1186a10482eaSJohn Baldwin 
11872400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1188a10482eaSJohn Baldwin 
1189a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1190a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
1191ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
1192a10482eaSJohn Baldwin 
1193a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
1194a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
1195a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
1196a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
1197a10482eaSJohn Baldwin 
1198a10482eaSJohn Baldwin 	decrypted_len = 0;
1199a10482eaSJohn Baldwin 	outbuf_len = 0;
1200a10482eaSJohn Baldwin 	written = 0;
1201a10482eaSJohn Baldwin 
1202a10482eaSJohn Baldwin 	while (decrypted_len != len) {
1203a10482eaSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
1204a10482eaSJohn Baldwin 
1205a10482eaSJohn Baldwin 		switch (ev.filter) {
1206a10482eaSJohn Baldwin 		case EVFILT_WRITE:
1207a10482eaSJohn Baldwin 			/* Try to write any remaining data. */
1208a10482eaSJohn Baldwin 			rv = write(ev.ident, plaintext + written,
1209a10482eaSJohn Baldwin 			    len - written);
1210a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
1211a10482eaSJohn Baldwin 			    "failed to write to socket");
1212a10482eaSJohn Baldwin 			written += rv;
1213a10482eaSJohn Baldwin 			if (written == len) {
1214a10482eaSJohn Baldwin 				ev.flags = EV_DISABLE;
1215a10482eaSJohn Baldwin 				ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
1216a10482eaSJohn Baldwin 				    NULL) == 0);
1217a10482eaSJohn Baldwin 			}
1218a10482eaSJohn Baldwin 			break;
1219a10482eaSJohn Baldwin 
1220a10482eaSJohn Baldwin 		case EVFILT_READ:
1221a10482eaSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
1222a10482eaSJohn Baldwin 
1223a10482eaSJohn Baldwin 			/*
1224a10482eaSJohn Baldwin 			 * Try to read data for the next TLS record
1225a10482eaSJohn Baldwin 			 * into outbuf.  Start by reading the header
1226a10482eaSJohn Baldwin 			 * to determine how much additional data to
1227a10482eaSJohn Baldwin 			 * read.
1228a10482eaSJohn Baldwin 			 */
1229a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer)) {
1230a10482eaSJohn Baldwin 				rv = read(ev.ident, outbuf + outbuf_len,
1231a10482eaSJohn Baldwin 				    sizeof(struct tls_record_layer) -
1232a10482eaSJohn Baldwin 				    outbuf_len);
1233a10482eaSJohn Baldwin 				ATF_REQUIRE_MSG(rv > 0,
1234a10482eaSJohn Baldwin 				    "failed to read from socket");
1235a10482eaSJohn Baldwin 				outbuf_len += rv;
123670bb2286SJohn Baldwin 
123770bb2286SJohn Baldwin 				if (outbuf_len ==
123870bb2286SJohn Baldwin 				    sizeof(struct tls_record_layer)) {
123970bb2286SJohn Baldwin 					debug(tc, "TLS header for seqno %ju:\n",
124070bb2286SJohn Baldwin 					    (uintmax_t)seqno);
124170bb2286SJohn Baldwin 					debug_hexdump(tc, outbuf, outbuf_len,
124270bb2286SJohn Baldwin 					    NULL);
124370bb2286SJohn Baldwin 				}
1244a10482eaSJohn Baldwin 			}
1245a10482eaSJohn Baldwin 
1246a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer))
1247a10482eaSJohn Baldwin 				break;
1248a10482eaSJohn Baldwin 
1249a10482eaSJohn Baldwin 			record_len = sizeof(struct tls_record_layer) +
1250a10482eaSJohn Baldwin 			    ntohs(hdr->tls_length);
125170bb2286SJohn Baldwin 			debug(tc, "record_len %zu outbuf_cap %zu\n",
125270bb2286SJohn Baldwin 			    record_len, outbuf_cap);
1253d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len <= outbuf_cap);
1254d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len > outbuf_len);
1255a10482eaSJohn Baldwin 			rv = read(ev.ident, outbuf + outbuf_len,
1256a10482eaSJohn Baldwin 			    record_len - outbuf_len);
1257a10482eaSJohn Baldwin 			if (rv == -1 && errno == EAGAIN)
1258a10482eaSJohn Baldwin 				break;
1259*883d1742SJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
1260*883d1742SJohn Baldwin 			    "failed to read from socket: %s", strerror(errno));
1261a10482eaSJohn Baldwin 
1262a10482eaSJohn Baldwin 			outbuf_len += rv;
1263a10482eaSJohn Baldwin 			if (outbuf_len == record_len) {
126470bb2286SJohn Baldwin 				decrypted_len += decrypt_tls_record(tc, en,
126570bb2286SJohn Baldwin 				    seqno, outbuf, outbuf_len,
1266a10482eaSJohn Baldwin 				    decrypted + decrypted_len,
1267a10482eaSJohn Baldwin 				    len - decrypted_len, &record_type);
1268*883d1742SJohn Baldwin 				ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, record_type);
1269a10482eaSJohn Baldwin 
1270a10482eaSJohn Baldwin 				seqno++;
1271a10482eaSJohn Baldwin 				outbuf_len = 0;
1272a10482eaSJohn Baldwin 			}
1273a10482eaSJohn Baldwin 			break;
1274a10482eaSJohn Baldwin 		}
1275a10482eaSJohn Baldwin 	}
1276a10482eaSJohn Baldwin 
1277a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG(written == decrypted_len,
1278a10482eaSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", decrypted_len, written);
1279a10482eaSJohn Baldwin 
1280a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1281a10482eaSJohn Baldwin 
1282a10482eaSJohn Baldwin 	free(outbuf);
1283a10482eaSJohn Baldwin 	free(decrypted);
1284a10482eaSJohn Baldwin 	free(plaintext);
1285a10482eaSJohn Baldwin 
12862c105205SJohn Baldwin 	close_sockets(sockets);
1287694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
1288a10482eaSJohn Baldwin }
1289a10482eaSJohn Baldwin 
1290a10482eaSJohn Baldwin static void
1291a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len)
1292a10482eaSJohn Baldwin {
1293a10482eaSJohn Baldwin 	struct msghdr msg;
1294a10482eaSJohn Baldwin 	struct cmsghdr *cmsg;
1295a10482eaSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(type))];
1296a10482eaSJohn Baldwin 	struct iovec iov;
1297a10482eaSJohn Baldwin 
1298a10482eaSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
1299a10482eaSJohn Baldwin 
1300a10482eaSJohn Baldwin 	msg.msg_control = cbuf;
1301a10482eaSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
1302a10482eaSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
1303a10482eaSJohn Baldwin 	cmsg->cmsg_level = IPPROTO_TCP;
1304a10482eaSJohn Baldwin 	cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
1305a10482eaSJohn Baldwin 	cmsg->cmsg_len = CMSG_LEN(sizeof(type));
1306a10482eaSJohn Baldwin 	*(uint8_t *)CMSG_DATA(cmsg) = type;
1307a10482eaSJohn Baldwin 
1308a10482eaSJohn Baldwin 	iov.iov_base = data;
1309a10482eaSJohn Baldwin 	iov.iov_len = len;
1310a10482eaSJohn Baldwin 	msg.msg_iov = &iov;
1311a10482eaSJohn Baldwin 	msg.msg_iovlen = 1;
1312a10482eaSJohn Baldwin 
1313*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)len, sendmsg(fd, &msg, 0));
1314a10482eaSJohn Baldwin }
1315a10482eaSJohn Baldwin 
1316a10482eaSJohn Baldwin static void
13172400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en,
13182400a7b1SJohn Baldwin     uint64_t seqno, uint8_t type, size_t len)
1319a10482eaSJohn Baldwin {
1320a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
1321a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
1322a10482eaSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
1323a10482eaSJohn Baldwin 	ssize_t rv;
1324a10482eaSJohn Baldwin 	int sockets[2];
1325a10482eaSJohn Baldwin 	uint8_t record_type;
1326a10482eaSJohn Baldwin 
1327a10482eaSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1328a10482eaSJohn Baldwin 
1329a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
1330a10482eaSJohn Baldwin 	decrypted = malloc(len);
1331a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1332a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1333a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
1334a10482eaSJohn Baldwin 
13352400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1336a10482eaSJohn Baldwin 
1337a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1338a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
1339ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
1340a10482eaSJohn Baldwin 
1341a10482eaSJohn Baldwin 	fd_set_blocking(sockets[0]);
1342a10482eaSJohn Baldwin 	fd_set_blocking(sockets[1]);
1343a10482eaSJohn Baldwin 
1344a10482eaSJohn Baldwin 	ktls_send_control_message(sockets[1], type, plaintext, len);
1345a10482eaSJohn Baldwin 
1346a10482eaSJohn Baldwin 	/*
1347a10482eaSJohn Baldwin 	 * First read the header to determine how much additional data
1348a10482eaSJohn Baldwin 	 * to read.
1349a10482eaSJohn Baldwin 	 */
1350a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1351*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(sizeof(struct tls_record_layer), rv);
1352a10482eaSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
1353a10482eaSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
1354*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(record_len <= outbuf_cap,
1355*883d1742SJohn Baldwin 	    "record_len (%zu) > outbuf_cap (%zu)", record_len, outbuf_cap);
1356a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
1357a10482eaSJohn Baldwin 	    payload_len);
1358*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)payload_len, rv);
1359a10482eaSJohn Baldwin 
136070bb2286SJohn Baldwin 	rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, decrypted,
136170bb2286SJohn Baldwin 	    len, &record_type);
1362a10482eaSJohn Baldwin 
1363a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG((ssize_t)len == rv,
1364a10482eaSJohn Baldwin 	    "read %zd decrypted bytes, but wrote %zu", rv, len);
1365*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(type, record_type);
1366a10482eaSJohn Baldwin 
1367a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1368a10482eaSJohn Baldwin 
1369a10482eaSJohn Baldwin 	free(outbuf);
1370a10482eaSJohn Baldwin 	free(decrypted);
1371a10482eaSJohn Baldwin 	free(plaintext);
1372a10482eaSJohn Baldwin 
13732c105205SJohn Baldwin 	close_sockets(sockets);
1374a10482eaSJohn Baldwin }
1375a10482eaSJohn Baldwin 
13760ff2a12aSJohn Baldwin static void
13772400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en,
13782400a7b1SJohn Baldwin     uint64_t seqno)
13790ff2a12aSJohn Baldwin {
13800ff2a12aSJohn Baldwin 	struct tls_record_layer *hdr;
13810ff2a12aSJohn Baldwin 	char *outbuf;
13820ff2a12aSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
13830ff2a12aSJohn Baldwin 	ssize_t rv;
13840ff2a12aSJohn Baldwin 	int sockets[2];
13850ff2a12aSJohn Baldwin 	uint8_t record_type;
13860ff2a12aSJohn Baldwin 
13870ff2a12aSJohn Baldwin 	outbuf_cap = tls_header_len(en) + tls_trailer_len(en);
13880ff2a12aSJohn Baldwin 	outbuf = malloc(outbuf_cap);
13890ff2a12aSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
13900ff2a12aSJohn Baldwin 
13912400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
13920ff2a12aSJohn Baldwin 
13930ff2a12aSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
13940ff2a12aSJohn Baldwin 	    sizeof(*en)) == 0);
1395ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
13960ff2a12aSJohn Baldwin 
13970ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[0]);
13980ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[1]);
13990ff2a12aSJohn Baldwin 
14005de79eedSMark Johnston 	/*
14015de79eedSMark Johnston 	 * A write of zero bytes should send an empty fragment only for
14025de79eedSMark Johnston 	 * TLS 1.0, otherwise an error should be raised.
14035de79eedSMark Johnston 	 */
14040ff2a12aSJohn Baldwin 	rv = write(sockets[1], NULL, 0);
14055de79eedSMark Johnston 	if (rv == 0) {
1406*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(CRYPTO_AES_CBC, en->cipher_algorithm);
1407*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(TLS_MINOR_VER_ZERO, en->tls_vminor);
14085de79eedSMark Johnston 	} else {
1409*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(-1, rv);
1410*883d1742SJohn Baldwin 		ATF_REQUIRE_ERRNO(EINVAL, true);
14115de79eedSMark Johnston 		goto out;
14125de79eedSMark Johnston 	}
14130ff2a12aSJohn Baldwin 
14140ff2a12aSJohn Baldwin 	/*
14150ff2a12aSJohn Baldwin 	 * First read the header to determine how much additional data
14160ff2a12aSJohn Baldwin 	 * to read.
14170ff2a12aSJohn Baldwin 	 */
14180ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1419*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(sizeof(struct tls_record_layer), rv);
14200ff2a12aSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
14210ff2a12aSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
1422*883d1742SJohn Baldwin 	ATF_REQUIRE_MSG(record_len <= outbuf_cap,
1423*883d1742SJohn Baldwin 	    "record_len (%zu) > outbuf_cap (%zu)", record_len, outbuf_cap);
14240ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
14250ff2a12aSJohn Baldwin 	    payload_len);
1426*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)payload_len, rv);
14270ff2a12aSJohn Baldwin 
142870bb2286SJohn Baldwin 	rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, NULL, 0,
14290ff2a12aSJohn Baldwin 	    &record_type);
14300ff2a12aSJohn Baldwin 
14310ff2a12aSJohn Baldwin 	ATF_REQUIRE_MSG(rv == 0,
14320ff2a12aSJohn Baldwin 	    "read %zd decrypted bytes for an empty fragment", rv);
1433*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, record_type);
14340ff2a12aSJohn Baldwin 
14355de79eedSMark Johnston out:
14360ff2a12aSJohn Baldwin 	free(outbuf);
14370ff2a12aSJohn Baldwin 
14382c105205SJohn Baldwin 	close_sockets(sockets);
14390ff2a12aSJohn Baldwin }
14400ff2a12aSJohn Baldwin 
14413e7f8a8dSJohn Baldwin static size_t
14423e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type,
14433e7f8a8dSJohn Baldwin     void *data, size_t len)
14443e7f8a8dSJohn Baldwin {
14453e7f8a8dSJohn Baldwin 	struct msghdr msg;
14463e7f8a8dSJohn Baldwin 	struct cmsghdr *cmsg;
14473e7f8a8dSJohn Baldwin 	struct tls_get_record *tgr;
14483e7f8a8dSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(*tgr))];
14493e7f8a8dSJohn Baldwin 	struct iovec iov;
14503e7f8a8dSJohn Baldwin 	ssize_t rv;
14513e7f8a8dSJohn Baldwin 
14523e7f8a8dSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
14533e7f8a8dSJohn Baldwin 
14543e7f8a8dSJohn Baldwin 	msg.msg_control = cbuf;
14553e7f8a8dSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
14563e7f8a8dSJohn Baldwin 
14573e7f8a8dSJohn Baldwin 	iov.iov_base = data;
14583e7f8a8dSJohn Baldwin 	iov.iov_len = len;
14593e7f8a8dSJohn Baldwin 	msg.msg_iov = &iov;
14603e7f8a8dSJohn Baldwin 	msg.msg_iovlen = 1;
14613e7f8a8dSJohn Baldwin 
14623e7f8a8dSJohn Baldwin 	ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0);
14633e7f8a8dSJohn Baldwin 
14643e7f8a8dSJohn Baldwin 	ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR);
14653e7f8a8dSJohn Baldwin 
14663e7f8a8dSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
14673e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg != NULL);
1468*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(IPPROTO_TCP, cmsg->cmsg_level);
1469*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_GET_RECORD, cmsg->cmsg_type);
1470*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(CMSG_LEN(sizeof(*tgr)), cmsg->cmsg_len);
14713e7f8a8dSJohn Baldwin 
14723e7f8a8dSJohn Baldwin 	tgr = (struct tls_get_record *)CMSG_DATA(cmsg);
1473*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(record_type, tgr->tls_type);
1474*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(en->tls_vmajor, tgr->tls_vmajor);
147505a1d0f5SJohn Baldwin 	/* XXX: Not sure if this is what OpenSSL expects? */
147605a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
1477*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, tgr->tls_vminor);
147805a1d0f5SJohn Baldwin 	else
1479*883d1742SJohn Baldwin 		ATF_REQUIRE_INTEQ(en->tls_vminor, tgr->tls_vminor);
1480*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(htons(rv), tgr->tls_length);
14813e7f8a8dSJohn Baldwin 
14823e7f8a8dSJohn Baldwin 	return (rv);
14833e7f8a8dSJohn Baldwin }
14843e7f8a8dSJohn Baldwin 
14853e7f8a8dSJohn Baldwin static void
14862400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en,
14872400a7b1SJohn Baldwin     uint64_t seqno, size_t len, size_t padding)
14883e7f8a8dSJohn Baldwin {
14893e7f8a8dSJohn Baldwin 	struct kevent ev;
14903e7f8a8dSJohn Baldwin 	char *plaintext, *received, *outbuf;
14913e7f8a8dSJohn Baldwin 	size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written;
14923e7f8a8dSJohn Baldwin 	ssize_t rv;
14933e7f8a8dSJohn Baldwin 	int kq, sockets[2];
14943e7f8a8dSJohn Baldwin 
14953e7f8a8dSJohn Baldwin 	plaintext = alloc_buffer(len);
14963e7f8a8dSJohn Baldwin 	received = malloc(len);
14973e7f8a8dSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
14983e7f8a8dSJohn Baldwin 	    tls_trailer_len(en);
14993e7f8a8dSJohn Baldwin 	outbuf = malloc(outbuf_cap);
15003e7f8a8dSJohn Baldwin 
15013e7f8a8dSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
15023e7f8a8dSJohn Baldwin 
15032400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
15043e7f8a8dSJohn Baldwin 
15053e7f8a8dSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
15063e7f8a8dSJohn Baldwin 	    sizeof(*en)) == 0);
1507ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
15083e7f8a8dSJohn Baldwin 
15093e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
15103e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
15113e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
15123e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
15133e7f8a8dSJohn Baldwin 
15143e7f8a8dSJohn Baldwin 	received_len = 0;
15153e7f8a8dSJohn Baldwin 	outbuf_len = 0;
15163e7f8a8dSJohn Baldwin 	written = 0;
15173e7f8a8dSJohn Baldwin 
15183e7f8a8dSJohn Baldwin 	while (received_len != len) {
15193e7f8a8dSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
15203e7f8a8dSJohn Baldwin 
15213e7f8a8dSJohn Baldwin 		switch (ev.filter) {
15223e7f8a8dSJohn Baldwin 		case EVFILT_WRITE:
15233e7f8a8dSJohn Baldwin 			/*
15243e7f8a8dSJohn Baldwin 			 * Compose the next TLS record to send.
15253e7f8a8dSJohn Baldwin 			 */
15263e7f8a8dSJohn Baldwin 			if (outbuf_len == 0) {
15273e7f8a8dSJohn Baldwin 				ATF_REQUIRE(written < len);
15283e7f8a8dSJohn Baldwin 				todo = len - written;
152905a1d0f5SJohn Baldwin 				if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding)
153005a1d0f5SJohn Baldwin 					todo = TLS_MAX_MSG_SIZE_V10_2 - padding;
153170bb2286SJohn Baldwin 				outbuf_len = encrypt_tls_record(tc, en,
15323e7f8a8dSJohn Baldwin 				    TLS_RLTYPE_APP, seqno, plaintext + written,
153305a1d0f5SJohn Baldwin 				    todo, outbuf, outbuf_cap, padding);
15343e7f8a8dSJohn Baldwin 				outbuf_sent = 0;
15353e7f8a8dSJohn Baldwin 				written += todo;
15363e7f8a8dSJohn Baldwin 				seqno++;
15373e7f8a8dSJohn Baldwin 			}
15383e7f8a8dSJohn Baldwin 
15393e7f8a8dSJohn Baldwin 			/*
15403e7f8a8dSJohn Baldwin 			 * Try to write the remainder of the current
15413e7f8a8dSJohn Baldwin 			 * TLS record.
15423e7f8a8dSJohn Baldwin 			 */
15433e7f8a8dSJohn Baldwin 			rv = write(ev.ident, outbuf + outbuf_sent,
15443e7f8a8dSJohn Baldwin 			    outbuf_len - outbuf_sent);
15453e7f8a8dSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
1546*883d1742SJohn Baldwin 			    "failed to write to socket: %s", strerror(errno));
15473e7f8a8dSJohn Baldwin 			outbuf_sent += rv;
15483e7f8a8dSJohn Baldwin 			if (outbuf_sent == outbuf_len) {
15493e7f8a8dSJohn Baldwin 				outbuf_len = 0;
15503e7f8a8dSJohn Baldwin 				if (written == len) {
15513e7f8a8dSJohn Baldwin 					ev.flags = EV_DISABLE;
15523e7f8a8dSJohn Baldwin 					ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
15533e7f8a8dSJohn Baldwin 					    NULL) == 0);
15543e7f8a8dSJohn Baldwin 				}
15553e7f8a8dSJohn Baldwin 			}
15563e7f8a8dSJohn Baldwin 			break;
15573e7f8a8dSJohn Baldwin 
15583e7f8a8dSJohn Baldwin 		case EVFILT_READ:
15593e7f8a8dSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
15603e7f8a8dSJohn Baldwin 
15613e7f8a8dSJohn Baldwin 			rv = ktls_receive_tls_record(en, ev.ident,
15623e7f8a8dSJohn Baldwin 			    TLS_RLTYPE_APP, received + received_len,
15633e7f8a8dSJohn Baldwin 			    len - received_len);
15643e7f8a8dSJohn Baldwin 			received_len += rv;
15653e7f8a8dSJohn Baldwin 			break;
15663e7f8a8dSJohn Baldwin 		}
15673e7f8a8dSJohn Baldwin 	}
15683e7f8a8dSJohn Baldwin 
15693e7f8a8dSJohn Baldwin 	ATF_REQUIRE_MSG(written == received_len,
15703e7f8a8dSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", received_len, written);
15713e7f8a8dSJohn Baldwin 
15723e7f8a8dSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, received, len) == 0);
15733e7f8a8dSJohn Baldwin 
15743e7f8a8dSJohn Baldwin 	free(outbuf);
15753e7f8a8dSJohn Baldwin 	free(received);
15763e7f8a8dSJohn Baldwin 	free(plaintext);
15773e7f8a8dSJohn Baldwin 
15782c105205SJohn Baldwin 	close_sockets(sockets);
1579694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
15803e7f8a8dSJohn Baldwin }
15813e7f8a8dSJohn Baldwin 
158265bd3adbSJohn Baldwin static void
158365bd3adbSJohn Baldwin ktls_receive_tls_error(int fd, int expected_error)
158465bd3adbSJohn Baldwin {
158565bd3adbSJohn Baldwin 	struct msghdr msg;
158665bd3adbSJohn Baldwin 	struct tls_get_record *tgr;
158765bd3adbSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(*tgr))];
158865bd3adbSJohn Baldwin 	char buf[64];
158965bd3adbSJohn Baldwin 	struct iovec iov;
159065bd3adbSJohn Baldwin 
159165bd3adbSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
159265bd3adbSJohn Baldwin 
159365bd3adbSJohn Baldwin 	msg.msg_control = cbuf;
159465bd3adbSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
159565bd3adbSJohn Baldwin 
159665bd3adbSJohn Baldwin 	iov.iov_base = buf;
159765bd3adbSJohn Baldwin 	iov.iov_len = sizeof(buf);
159865bd3adbSJohn Baldwin 	msg.msg_iov = &iov;
159965bd3adbSJohn Baldwin 	msg.msg_iovlen = 1;
160065bd3adbSJohn Baldwin 
160165bd3adbSJohn Baldwin 	ATF_REQUIRE(recvmsg(fd, &msg, 0) == -1);
160265bd3adbSJohn Baldwin 	if (expected_error != 0)
1603*883d1742SJohn Baldwin 		ATF_REQUIRE_ERRNO(expected_error, true);
160465bd3adbSJohn Baldwin }
160565bd3adbSJohn Baldwin 
160665bd3adbSJohn Baldwin static void
160765bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(const atf_tc_t *tc, struct tls_enable *en,
160865bd3adbSJohn Baldwin     uint64_t seqno, size_t len, ssize_t offset)
160965bd3adbSJohn Baldwin {
161065bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
161165bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
161265bd3adbSJohn Baldwin 	ssize_t rv;
161365bd3adbSJohn Baldwin 	int sockets[2];
161465bd3adbSJohn Baldwin 
161565bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
161665bd3adbSJohn Baldwin 
161765bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
161865bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
161965bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
162065bd3adbSJohn Baldwin 
162165bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
162265bd3adbSJohn Baldwin 
162365bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
162465bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
162565bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
162665bd3adbSJohn Baldwin 
162765bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
162865bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
162965bd3adbSJohn Baldwin 
163070bb2286SJohn Baldwin 	outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
163165bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
163265bd3adbSJohn Baldwin 
163365bd3adbSJohn Baldwin 	/* A negative offset is an offset from the end. */
163465bd3adbSJohn Baldwin 	if (offset < 0)
163565bd3adbSJohn Baldwin 		offset += outbuf_len;
163665bd3adbSJohn Baldwin 	outbuf[offset] ^= 0x01;
163765bd3adbSJohn Baldwin 
163865bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1639*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
164065bd3adbSJohn Baldwin 
164165bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EBADMSG);
164265bd3adbSJohn Baldwin 
164365bd3adbSJohn Baldwin 	free(outbuf);
164465bd3adbSJohn Baldwin 	free(plaintext);
164565bd3adbSJohn Baldwin 
164665bd3adbSJohn Baldwin 	close_sockets(sockets);
164765bd3adbSJohn Baldwin }
164865bd3adbSJohn Baldwin 
164965bd3adbSJohn Baldwin static void
165065bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(const atf_tc_t *tc, struct tls_enable *en,
165165bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
165265bd3adbSJohn Baldwin {
165365bd3adbSJohn Baldwin 	ATF_REQUIRE(tls_header_len(en) > sizeof(struct tls_record_layer));
165465bd3adbSJohn Baldwin 
165565bd3adbSJohn Baldwin 	/* Corrupt the first byte of the explicit IV after the header. */
165665bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len,
165765bd3adbSJohn Baldwin 	    sizeof(struct tls_record_layer));
165865bd3adbSJohn Baldwin }
165965bd3adbSJohn Baldwin 
166065bd3adbSJohn Baldwin static void
166165bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(const atf_tc_t *tc, struct tls_enable *en,
166265bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
166365bd3adbSJohn Baldwin {
166465bd3adbSJohn Baldwin 	ATF_REQUIRE(len > 0);
166565bd3adbSJohn Baldwin 
166665bd3adbSJohn Baldwin 	/* Corrupt the first ciphertext byte after the header. */
166765bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len,
166865bd3adbSJohn Baldwin 	    tls_header_len(en));
166965bd3adbSJohn Baldwin }
167065bd3adbSJohn Baldwin 
167165bd3adbSJohn Baldwin static void
167265bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(const atf_tc_t *tc, struct tls_enable *en,
167365bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
167465bd3adbSJohn Baldwin {
167565bd3adbSJohn Baldwin 	size_t offset;
167665bd3adbSJohn Baldwin 
167765bd3adbSJohn Baldwin 	/* Corrupt the first byte of the MAC. */
167865bd3adbSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
167965bd3adbSJohn Baldwin 		offset = tls_header_len(en) + len;
168065bd3adbSJohn Baldwin 	else
168165bd3adbSJohn Baldwin 		offset = -tls_mac_len(en);
168265bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len, offset);
168365bd3adbSJohn Baldwin }
168465bd3adbSJohn Baldwin 
168565bd3adbSJohn Baldwin static void
168665bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(const atf_tc_t *tc, struct tls_enable *en,
168765bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
168865bd3adbSJohn Baldwin {
1689*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(CRYPTO_AES_CBC, en->cipher_algorithm);
169065bd3adbSJohn Baldwin 
169165bd3adbSJohn Baldwin 	/* Corrupt the last byte of the padding. */
169265bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len, -1);
169365bd3adbSJohn Baldwin }
169465bd3adbSJohn Baldwin 
169565bd3adbSJohn Baldwin static void
169665bd3adbSJohn Baldwin test_ktls_receive_truncated_record(const atf_tc_t *tc, struct tls_enable *en,
169765bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
169865bd3adbSJohn Baldwin {
169965bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
170065bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
170165bd3adbSJohn Baldwin 	ssize_t rv;
170265bd3adbSJohn Baldwin 	int sockets[2];
170365bd3adbSJohn Baldwin 
170465bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
170565bd3adbSJohn Baldwin 
170665bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
170765bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
170865bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
170965bd3adbSJohn Baldwin 
171065bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
171165bd3adbSJohn Baldwin 
171265bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
171365bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
171465bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
171565bd3adbSJohn Baldwin 
171665bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
171765bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
171865bd3adbSJohn Baldwin 
171970bb2286SJohn Baldwin 	outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
172065bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
172165bd3adbSJohn Baldwin 
172265bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len / 2);
1723*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)(outbuf_len / 2), rv);
172465bd3adbSJohn Baldwin 
172565bd3adbSJohn Baldwin 	ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0);
172665bd3adbSJohn Baldwin 
172765bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EMSGSIZE);
172865bd3adbSJohn Baldwin 
172965bd3adbSJohn Baldwin 	free(outbuf);
173065bd3adbSJohn Baldwin 	free(plaintext);
173165bd3adbSJohn Baldwin 
173265bd3adbSJohn Baldwin 	close_sockets(sockets);
173365bd3adbSJohn Baldwin }
173465bd3adbSJohn Baldwin 
173565bd3adbSJohn Baldwin static void
173665bd3adbSJohn Baldwin test_ktls_receive_bad_major(const atf_tc_t *tc, struct tls_enable *en,
173765bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
173865bd3adbSJohn Baldwin {
173965bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
174065bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
174165bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
174265bd3adbSJohn Baldwin 	ssize_t rv;
174365bd3adbSJohn Baldwin 	int sockets[2];
174465bd3adbSJohn Baldwin 
174565bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
174665bd3adbSJohn Baldwin 
174765bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
174865bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
174965bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
175065bd3adbSJohn Baldwin 
175165bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
175265bd3adbSJohn Baldwin 
175365bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
175465bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
175565bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
175665bd3adbSJohn Baldwin 
175765bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
175865bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
175965bd3adbSJohn Baldwin 
176070bb2286SJohn Baldwin 	outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
176165bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
176265bd3adbSJohn Baldwin 
176365bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
176465bd3adbSJohn Baldwin 	hdr->tls_vmajor++;
176565bd3adbSJohn Baldwin 
176665bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1767*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
176865bd3adbSJohn Baldwin 
176965bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EINVAL);
177065bd3adbSJohn Baldwin 
177165bd3adbSJohn Baldwin 	free(outbuf);
177265bd3adbSJohn Baldwin 	free(plaintext);
177365bd3adbSJohn Baldwin 
177465bd3adbSJohn Baldwin 	close_sockets(sockets);
177565bd3adbSJohn Baldwin }
177665bd3adbSJohn Baldwin 
177765bd3adbSJohn Baldwin static void
177865bd3adbSJohn Baldwin test_ktls_receive_bad_minor(const atf_tc_t *tc, struct tls_enable *en,
177965bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
178065bd3adbSJohn Baldwin {
178165bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
178265bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
178365bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
178465bd3adbSJohn Baldwin 	ssize_t rv;
178565bd3adbSJohn Baldwin 	int sockets[2];
178665bd3adbSJohn Baldwin 
178765bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
178865bd3adbSJohn Baldwin 
178965bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
179065bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
179165bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
179265bd3adbSJohn Baldwin 
179365bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
179465bd3adbSJohn Baldwin 
179565bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
179665bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
179765bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
179865bd3adbSJohn Baldwin 
179965bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
180065bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
180165bd3adbSJohn Baldwin 
180270bb2286SJohn Baldwin 	outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
180365bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
180465bd3adbSJohn Baldwin 
180565bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
180665bd3adbSJohn Baldwin 	hdr->tls_vminor++;
180765bd3adbSJohn Baldwin 
180865bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1809*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
181065bd3adbSJohn Baldwin 
181165bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EINVAL);
181265bd3adbSJohn Baldwin 
181365bd3adbSJohn Baldwin 	free(outbuf);
181465bd3adbSJohn Baldwin 	free(plaintext);
181565bd3adbSJohn Baldwin 
181665bd3adbSJohn Baldwin 	close_sockets(sockets);
181765bd3adbSJohn Baldwin }
181865bd3adbSJohn Baldwin 
181965bd3adbSJohn Baldwin static void
182065bd3adbSJohn Baldwin test_ktls_receive_bad_type(const atf_tc_t *tc, struct tls_enable *en,
182165bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
182265bd3adbSJohn Baldwin {
182365bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
182465bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
182565bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
182665bd3adbSJohn Baldwin 	ssize_t rv;
182765bd3adbSJohn Baldwin 	int sockets[2];
182865bd3adbSJohn Baldwin 
182965bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1830*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ(TLS_MINOR_VER_THREE, en->tls_vminor);
183165bd3adbSJohn Baldwin 
183265bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
183365bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
183465bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
183565bd3adbSJohn Baldwin 
183665bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
183765bd3adbSJohn Baldwin 
183865bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
183965bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
184065bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
184165bd3adbSJohn Baldwin 
184265bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
184365bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
184465bd3adbSJohn Baldwin 
184570bb2286SJohn Baldwin 	outbuf_len = encrypt_tls_record(tc, en, 0x21 /* Alert */, seqno,
184665bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
184765bd3adbSJohn Baldwin 
184865bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
184965bd3adbSJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP + 1;
185065bd3adbSJohn Baldwin 
185165bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1852*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
185365bd3adbSJohn Baldwin 
185465bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EINVAL);
185565bd3adbSJohn Baldwin 
185665bd3adbSJohn Baldwin 	free(outbuf);
185765bd3adbSJohn Baldwin 	free(plaintext);
185865bd3adbSJohn Baldwin 
185965bd3adbSJohn Baldwin 	close_sockets(sockets);
186065bd3adbSJohn Baldwin }
186165bd3adbSJohn Baldwin 
186265bd3adbSJohn Baldwin static void
186365bd3adbSJohn Baldwin test_ktls_receive_bad_size(const atf_tc_t *tc, struct tls_enable *en,
186465bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
186565bd3adbSJohn Baldwin {
186665bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
186765bd3adbSJohn Baldwin 	char *outbuf;
186865bd3adbSJohn Baldwin 	size_t outbuf_len;
186965bd3adbSJohn Baldwin 	ssize_t rv;
187065bd3adbSJohn Baldwin 	int sockets[2];
187165bd3adbSJohn Baldwin 
187265bd3adbSJohn Baldwin 	outbuf_len = sizeof(*hdr) + len;
187365bd3adbSJohn Baldwin 	outbuf = calloc(1, outbuf_len);
187465bd3adbSJohn Baldwin 
187565bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
187665bd3adbSJohn Baldwin 
187765bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
187865bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
187965bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
188065bd3adbSJohn Baldwin 
188165bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
188265bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
188365bd3adbSJohn Baldwin 
188465bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
188565bd3adbSJohn Baldwin 	hdr->tls_vmajor = en->tls_vmajor;
188665bd3adbSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
188765bd3adbSJohn Baldwin 		hdr->tls_vminor = TLS_MINOR_VER_TWO;
188865bd3adbSJohn Baldwin 	else
188965bd3adbSJohn Baldwin 		hdr->tls_vminor = en->tls_vminor;
189065bd3adbSJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP;
189165bd3adbSJohn Baldwin 	hdr->tls_length = htons(len);
189265bd3adbSJohn Baldwin 
189365bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1894*883d1742SJohn Baldwin 	ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
189565bd3adbSJohn Baldwin 
189665bd3adbSJohn Baldwin 	ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0);
189765bd3adbSJohn Baldwin 
189865bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EMSGSIZE);
189965bd3adbSJohn Baldwin 
190065bd3adbSJohn Baldwin 	free(outbuf);
190165bd3adbSJohn Baldwin 
190265bd3adbSJohn Baldwin 	close_sockets(sockets);
190365bd3adbSJohn Baldwin }
190465bd3adbSJohn Baldwin 
19050ff2a12aSJohn Baldwin #define	TLS_10_TESTS(M)							\
19060ff2a12aSJohn Baldwin 	M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8,			\
190764811651SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)			\
19080ff2a12aSJohn Baldwin 	M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8,			\
190964811651SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)
19100ff2a12aSJohn Baldwin 
191183a54b58SJohn Baldwin #define	TLS_13_TESTS(M)							\
191283a54b58SJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
191383a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
191483a54b58SJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
191583a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
191683a54b58SJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
191783a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)
191883a54b58SJohn Baldwin 
191964811651SJohn Baldwin #define	AES_CBC_NONZERO_TESTS(M)					\
1920a10482eaSJohn Baldwin 	M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1921a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1922a10482eaSJohn Baldwin 	M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1923a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1924a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1925a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1926a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1927a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1928a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1929a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1930a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8,		\
1931a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1932a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1933a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1934a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8,		\
1935a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1936a10482eaSJohn Baldwin 
193764811651SJohn Baldwin #define	AES_CBC_TESTS(M)						\
193864811651SJohn Baldwin 	TLS_10_TESTS(M)							\
193964811651SJohn Baldwin 	AES_CBC_NONZERO_TESTS(M)
194064811651SJohn Baldwin 
194165bd3adbSJohn Baldwin #define AES_GCM_12_TESTS(M)						\
1942a10482eaSJohn Baldwin 	M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1943a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1944a10482eaSJohn Baldwin 	M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
194565bd3adbSJohn Baldwin 	    TLS_MINOR_VER_TWO)
194665bd3adbSJohn Baldwin 
194765bd3adbSJohn Baldwin #define AES_GCM_TESTS(M)						\
194865bd3adbSJohn Baldwin 	AES_GCM_12_TESTS(M)						\
1949a10482eaSJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1950a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
1951a10482eaSJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1952a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1953a10482eaSJohn Baldwin 
1954a10482eaSJohn Baldwin #define CHACHA20_TESTS(M)						\
1955a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1956a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1957a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1958a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1959a10482eaSJohn Baldwin 
1960a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1961a10482eaSJohn Baldwin 	    auth_alg, minor, name, len)					\
1962a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
1963a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1964a10482eaSJohn Baldwin {									\
1965a10482eaSJohn Baldwin 	struct tls_enable en;						\
1966a10482eaSJohn Baldwin 	uint64_t seqno;							\
1967a10482eaSJohn Baldwin 									\
1968a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1969a10482eaSJohn Baldwin 	seqno = random();						\
197070bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
197170bb2286SJohn Baldwin 	    seqno, &en);						\
19722400a7b1SJohn Baldwin 	test_ktls_transmit_app_data(tc, &en, seqno, len);		\
1973a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1974a10482eaSJohn Baldwin }
1975a10482eaSJohn Baldwin 
1976a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1977a10482eaSJohn Baldwin 	    auth_alg, minor, name)					\
1978a10482eaSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1979a10482eaSJohn Baldwin 
1980a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
198144265dc3SJohn Baldwin 	    auth_alg, minor, name, type, len)				\
198244265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
198344265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1984a10482eaSJohn Baldwin {									\
1985a10482eaSJohn Baldwin 	struct tls_enable en;						\
1986a10482eaSJohn Baldwin 	uint64_t seqno;							\
1987a10482eaSJohn Baldwin 									\
1988a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1989a10482eaSJohn Baldwin 	seqno = random();						\
199070bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
199170bb2286SJohn Baldwin 	    seqno, &en);						\
19922400a7b1SJohn Baldwin 	test_ktls_transmit_control(tc, &en, seqno, type, len);		\
1993a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1994a10482eaSJohn Baldwin }
1995a10482eaSJohn Baldwin 
1996a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
199744265dc3SJohn Baldwin 	    auth_alg, minor, name)					\
199844265dc3SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1999a10482eaSJohn Baldwin 
20000ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
20015de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
20020ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment);	\
20030ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc)		\
20040ff2a12aSJohn Baldwin {									\
20050ff2a12aSJohn Baldwin 	struct tls_enable en;						\
20060ff2a12aSJohn Baldwin 	uint64_t seqno;							\
20070ff2a12aSJohn Baldwin 									\
20080ff2a12aSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
20090ff2a12aSJohn Baldwin 	seqno = random();						\
201070bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
201170bb2286SJohn Baldwin 	    seqno, &en);						\
20122400a7b1SJohn Baldwin 	test_ktls_transmit_empty_fragment(tc, &en, seqno);		\
20130ff2a12aSJohn Baldwin 	free_tls_enable(&en);						\
20140ff2a12aSJohn Baldwin }
20150ff2a12aSJohn Baldwin 
20160ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
20175de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
20180ff2a12aSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment);
20190ff2a12aSJohn Baldwin 
2020a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
2021a10482eaSJohn Baldwin 	    minor)							\
2022a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2023a10482eaSJohn Baldwin 	    auth_alg, minor, short, 64)					\
2024a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2025a10482eaSJohn Baldwin 	    auth_alg, minor, long, 64 * 1024)				\
2026a10482eaSJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
202744265dc3SJohn Baldwin 	    auth_alg, minor, control, 0x21 /* Alert */, 32)
2028a10482eaSJohn Baldwin 
2029a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
2030a10482eaSJohn Baldwin 	    minor)							\
2031a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2032a10482eaSJohn Baldwin 	    auth_alg, minor, short)					\
2033a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2034a10482eaSJohn Baldwin 	    auth_alg, minor, long)					\
2035a10482eaSJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
203644265dc3SJohn Baldwin 	    auth_alg, minor, control)
2037a10482eaSJohn Baldwin 
2038a10482eaSJohn Baldwin /*
2039a10482eaSJohn Baldwin  * For each supported cipher suite, run three transmit tests:
2040a10482eaSJohn Baldwin  *
2041a10482eaSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
2042a10482eaSJohn Baldwin  *   a single TLS record)
2043a10482eaSJohn Baldwin  *
2044a10482eaSJohn Baldwin  * - a long test which sends 64KB of application data (split across
2045a10482eaSJohn Baldwin  *   multiple TLS records)
2046a10482eaSJohn Baldwin  *
2047a10482eaSJohn Baldwin  * - a control test which sends a single record with a specific
2048a10482eaSJohn Baldwin  *   content type via sendmsg()
2049a10482eaSJohn Baldwin  */
2050a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS);
2051a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS);
2052a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS);
2053a10482eaSJohn Baldwin 
205444265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
205544265dc3SJohn Baldwin 	    auth_alg, minor)						\
205644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
205744265dc3SJohn Baldwin 	    auth_alg, minor, padding_1, 0x21 /* Alert */, 1)		\
205844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
205944265dc3SJohn Baldwin 	    auth_alg, minor, padding_2, 0x21 /* Alert */, 2)		\
206044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
206144265dc3SJohn Baldwin 	    auth_alg, minor, padding_3, 0x21 /* Alert */, 3)		\
206244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
206344265dc3SJohn Baldwin 	    auth_alg, minor, padding_4, 0x21 /* Alert */, 4)		\
206444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
206544265dc3SJohn Baldwin 	    auth_alg, minor, padding_5, 0x21 /* Alert */, 5)		\
206644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
206744265dc3SJohn Baldwin 	    auth_alg, minor, padding_6, 0x21 /* Alert */, 6)		\
206844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
206944265dc3SJohn Baldwin 	    auth_alg, minor, padding_7, 0x21 /* Alert */, 7)		\
207044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
207144265dc3SJohn Baldwin 	    auth_alg, minor, padding_8, 0x21 /* Alert */, 8)		\
207244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
207344265dc3SJohn Baldwin 	    auth_alg, minor, padding_9, 0x21 /* Alert */, 9)		\
207444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
207544265dc3SJohn Baldwin 	    auth_alg, minor, padding_10, 0x21 /* Alert */, 10)		\
207644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
207744265dc3SJohn Baldwin 	    auth_alg, minor, padding_11, 0x21 /* Alert */, 11)		\
207844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
207944265dc3SJohn Baldwin 	    auth_alg, minor, padding_12, 0x21 /* Alert */, 12)		\
208044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
208144265dc3SJohn Baldwin 	    auth_alg, minor, padding_13, 0x21 /* Alert */, 13)		\
208244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
208344265dc3SJohn Baldwin 	    auth_alg, minor, padding_14, 0x21 /* Alert */, 14)		\
208444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
208544265dc3SJohn Baldwin 	    auth_alg, minor, padding_15, 0x21 /* Alert */, 15)		\
208644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
208744265dc3SJohn Baldwin 	    auth_alg, minor, padding_16, 0x21 /* Alert */, 16)
208844265dc3SJohn Baldwin 
208944265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
209044265dc3SJohn Baldwin 	    auth_alg, minor)						\
209144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
209244265dc3SJohn Baldwin 	    auth_alg, minor, padding_1)					\
209344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
209444265dc3SJohn Baldwin 	    auth_alg, minor, padding_2)					\
209544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
209644265dc3SJohn Baldwin 	    auth_alg, minor, padding_3)					\
209744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
209844265dc3SJohn Baldwin 	    auth_alg, minor, padding_4)					\
209944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
210044265dc3SJohn Baldwin 	    auth_alg, minor, padding_5)					\
210144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
210244265dc3SJohn Baldwin 	    auth_alg, minor, padding_6)					\
210344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
210444265dc3SJohn Baldwin 	    auth_alg, minor, padding_7)					\
210544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
210644265dc3SJohn Baldwin 	    auth_alg, minor, padding_8)					\
210744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
210844265dc3SJohn Baldwin 	    auth_alg, minor, padding_9)					\
210944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
211044265dc3SJohn Baldwin 	    auth_alg, minor, padding_10)				\
211144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
211244265dc3SJohn Baldwin 	    auth_alg, minor, padding_11)				\
211344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
211444265dc3SJohn Baldwin 	    auth_alg, minor, padding_12)				\
211544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
211644265dc3SJohn Baldwin 	    auth_alg, minor, padding_13)				\
211744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
211844265dc3SJohn Baldwin 	    auth_alg, minor, padding_14)				\
211944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
212044265dc3SJohn Baldwin 	    auth_alg, minor, padding_15)				\
212144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
212244265dc3SJohn Baldwin 	    auth_alg, minor, padding_16)
212344265dc3SJohn Baldwin 
212444265dc3SJohn Baldwin /*
212544265dc3SJohn Baldwin  * For AES-CBC MTE cipher suites using padding, add tests of messages
212644265dc3SJohn Baldwin  * with each possible padding size.  Note that the padding_<N> tests
212744265dc3SJohn Baldwin  * do not necessarily test <N> bytes of padding as the padding is a
212844265dc3SJohn Baldwin  * function of the cipher suite's MAC length.  However, cycling
212944265dc3SJohn Baldwin  * through all of the payload sizes from 1 to 16 should exercise all
213044265dc3SJohn Baldwin  * of the possible padding lengths for each suite.
213144265dc3SJohn Baldwin  */
213244265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS);
213344265dc3SJohn Baldwin 
21340ff2a12aSJohn Baldwin /*
21350ff2a12aSJohn Baldwin  * Test "empty fragments" which are TLS records with no payload that
21360ff2a12aSJohn Baldwin  * OpenSSL can send for TLS 1.0 connections.
21370ff2a12aSJohn Baldwin  */
21385de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
21395de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
21405de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
21410ff2a12aSJohn Baldwin 
2142d1c369f9SJohn Baldwin static void
21432400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc,
21442400a7b1SJohn Baldwin     struct tls_enable *en)
2145d1c369f9SJohn Baldwin {
2146d1c369f9SJohn Baldwin 	int sockets[2];
2147d1c369f9SJohn Baldwin 
21482400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
2149d1c369f9SJohn Baldwin 
2150*883d1742SJohn Baldwin 	ATF_REQUIRE_ERRNO(EINVAL, setsockopt(sockets[1], IPPROTO_TCP,
2151*883d1742SJohn Baldwin 	    TCP_TXTLS_ENABLE, en, sizeof(*en)) == -1);
2152d1c369f9SJohn Baldwin 
21532c105205SJohn Baldwin 	close_sockets(sockets);
2154d1c369f9SJohn Baldwin }
2155d1c369f9SJohn Baldwin 
2156d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg,	\
2157d1c369f9SJohn Baldwin 	    minor)							\
2158d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name);			\
2159d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc)				\
2160d1c369f9SJohn Baldwin {									\
2161d1c369f9SJohn Baldwin 	struct tls_enable en;						\
2162d1c369f9SJohn Baldwin 	uint64_t seqno;							\
2163d1c369f9SJohn Baldwin 									\
2164d1c369f9SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2165d1c369f9SJohn Baldwin 	seqno = random();						\
216670bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
216770bb2286SJohn Baldwin 	    seqno, &en);						\
21682400a7b1SJohn Baldwin 	test_ktls_invalid_transmit_cipher_suite(tc, &en);		\
2169d1c369f9SJohn Baldwin 	free_tls_enable(&en);						\
2170d1c369f9SJohn Baldwin }
2171d1c369f9SJohn Baldwin 
2172d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \
2173d1c369f9SJohn Baldwin 	    minor)							\
2174d1c369f9SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name);
2175d1c369f9SJohn Baldwin 
2176d1c369f9SJohn Baldwin #define	INVALID_CIPHER_SUITES(M)					\
2177d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8,		\
2178d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO)			\
2179d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8,		\
2180d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO)			\
2181d1c369f9SJohn Baldwin 	M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
2182d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
2183d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
2184d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
2185d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8,		\
2186d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE)			\
2187d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8,		\
2188d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE)			\
2189d1c369f9SJohn Baldwin 	M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
2190d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
2191d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
2192d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
2193d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8,			\
2194d1c369f9SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE)			\
2195d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8,		\
2196d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE)			\
2197d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8,		\
2198d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE)
2199d1c369f9SJohn Baldwin 
2200d1c369f9SJohn Baldwin /*
2201d1c369f9SJohn Baldwin  * Ensure that invalid cipher suites are rejected for transmit.
2202d1c369f9SJohn Baldwin  */
2203d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST);
2204d1c369f9SJohn Baldwin 
22053e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
220605a1d0f5SJohn Baldwin 	    auth_alg, minor, name, len, padding)			\
22073e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name);		\
22083e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc)			\
22093e7f8a8dSJohn Baldwin {									\
22103e7f8a8dSJohn Baldwin 	struct tls_enable en;						\
22113e7f8a8dSJohn Baldwin 	uint64_t seqno;							\
22123e7f8a8dSJohn Baldwin 									\
22133e7f8a8dSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
22143e7f8a8dSJohn Baldwin 	seqno = random();						\
221570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
221670bb2286SJohn Baldwin 	    seqno, &en);						\
22172400a7b1SJohn Baldwin 	test_ktls_receive_app_data(tc, &en, seqno, len, padding);	\
22183e7f8a8dSJohn Baldwin 	free_tls_enable(&en);						\
22193e7f8a8dSJohn Baldwin }
22203e7f8a8dSJohn Baldwin 
22213e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
22223e7f8a8dSJohn Baldwin 	    auth_alg, minor, name)					\
22233e7f8a8dSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
22243e7f8a8dSJohn Baldwin 
222565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
222665bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
222765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_data);		\
222865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc)			\
222965bd3adbSJohn Baldwin {									\
223065bd3adbSJohn Baldwin 	struct tls_enable en;						\
223165bd3adbSJohn Baldwin 	uint64_t seqno;							\
223265bd3adbSJohn Baldwin 									\
223365bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
223465bd3adbSJohn Baldwin 	seqno = random();						\
223570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
223670bb2286SJohn Baldwin 	    seqno, &en);						\
223765bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_data(tc, &en, seqno, len);		\
223865bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
223965bd3adbSJohn Baldwin }
224065bd3adbSJohn Baldwin 
224165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
224265bd3adbSJohn Baldwin 	    auth_alg, minor)						\
224365bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_data);
224465bd3adbSJohn Baldwin 
224565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
224665bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
224765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_mac);		\
224865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc)			\
224965bd3adbSJohn Baldwin {									\
225065bd3adbSJohn Baldwin 	struct tls_enable en;						\
225165bd3adbSJohn Baldwin 	uint64_t seqno;							\
225265bd3adbSJohn Baldwin 									\
225365bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
225465bd3adbSJohn Baldwin 	seqno = random();						\
225570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
225670bb2286SJohn Baldwin 	    seqno, &en);						\
225765bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_mac(tc, &en, seqno, len);		\
225865bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
225965bd3adbSJohn Baldwin }
226065bd3adbSJohn Baldwin 
226165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
226265bd3adbSJohn Baldwin 	    auth_alg, minor)						\
226365bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_mac);
226465bd3adbSJohn Baldwin 
226565bd3adbSJohn Baldwin #define GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
226665bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
226765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_truncated_record);	\
226865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc)		\
226965bd3adbSJohn Baldwin {									\
227065bd3adbSJohn Baldwin 	struct tls_enable en;						\
227165bd3adbSJohn Baldwin 	uint64_t seqno;							\
227265bd3adbSJohn Baldwin 									\
227365bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
227465bd3adbSJohn Baldwin 	seqno = random();						\
227570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
227670bb2286SJohn Baldwin 	    seqno, &en);						\
227765bd3adbSJohn Baldwin 	test_ktls_receive_truncated_record(tc, &en, seqno, len);	\
227865bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
227965bd3adbSJohn Baldwin }
228065bd3adbSJohn Baldwin 
228165bd3adbSJohn Baldwin #define ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
228265bd3adbSJohn Baldwin 	    auth_alg, minor)						\
228365bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_truncated_record);
228465bd3adbSJohn Baldwin 
228565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
228665bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
228765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_major);		\
228865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc)			\
228965bd3adbSJohn Baldwin {									\
229065bd3adbSJohn Baldwin 	struct tls_enable en;						\
229165bd3adbSJohn Baldwin 	uint64_t seqno;							\
229265bd3adbSJohn Baldwin 									\
229365bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
229465bd3adbSJohn Baldwin 	seqno = random();						\
229570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
229670bb2286SJohn Baldwin 	    seqno, &en);						\
229765bd3adbSJohn Baldwin 	test_ktls_receive_bad_major(tc, &en, seqno, len);		\
229865bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
229965bd3adbSJohn Baldwin }
230065bd3adbSJohn Baldwin 
230165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
230265bd3adbSJohn Baldwin 	    auth_alg, minor)						\
230365bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_major);
230465bd3adbSJohn Baldwin 
230565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
230665bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
230765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_minor);		\
230865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc)			\
230965bd3adbSJohn Baldwin {									\
231065bd3adbSJohn Baldwin 	struct tls_enable en;						\
231165bd3adbSJohn Baldwin 	uint64_t seqno;							\
231265bd3adbSJohn Baldwin 									\
231365bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
231465bd3adbSJohn Baldwin 	seqno = random();						\
231570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
231670bb2286SJohn Baldwin 	    seqno, &en);						\
231765bd3adbSJohn Baldwin 	test_ktls_receive_bad_minor(tc, &en, seqno, len);		\
231865bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
231965bd3adbSJohn Baldwin }
232065bd3adbSJohn Baldwin 
232165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
232265bd3adbSJohn Baldwin 	    auth_alg, minor)						\
232365bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_minor);
232465bd3adbSJohn Baldwin 
232565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
232665bd3adbSJohn Baldwin 	    auth_alg, minor, name, len)					\
232765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name);		\
232865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc)			\
232965bd3adbSJohn Baldwin {									\
233065bd3adbSJohn Baldwin 	struct tls_enable en;						\
233165bd3adbSJohn Baldwin 	uint64_t seqno;							\
233265bd3adbSJohn Baldwin 									\
233365bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
233465bd3adbSJohn Baldwin 	seqno = random();						\
233570bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
233670bb2286SJohn Baldwin 	    seqno, &en);						\
233765bd3adbSJohn Baldwin 	test_ktls_receive_bad_size(tc, &en, seqno, (len));		\
233865bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
233965bd3adbSJohn Baldwin }
234065bd3adbSJohn Baldwin 
234165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
234265bd3adbSJohn Baldwin 	    auth_alg, minor, name)					\
234365bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
234465bd3adbSJohn Baldwin 
23453e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
23463e7f8a8dSJohn Baldwin 	    minor)							\
23473e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
234805a1d0f5SJohn Baldwin 	    auth_alg, minor, short, 64, 0)				\
23493e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235065bd3adbSJohn Baldwin 	    auth_alg, minor, long, 64 * 1024, 0)			\
235165bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235265bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
235365bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
235465bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
235565bd3adbSJohn Baldwin 	GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
235665bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
235765bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
235865bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
235965bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
236065bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
236165bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
236265bd3adbSJohn Baldwin 	    auth_alg, minor, small_record,				\
236365bd3adbSJohn Baldwin 	    tls_minimum_record_payload(&en) - 1)			\
236465bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
236565bd3adbSJohn Baldwin 	    auth_alg, minor, oversized_record,				\
236665bd3adbSJohn Baldwin 	    TLS_MAX_MSG_SIZE_V10_2 * 2)
23673e7f8a8dSJohn Baldwin 
23683e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
23693e7f8a8dSJohn Baldwin 	    minor)							\
23703e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
23713e7f8a8dSJohn Baldwin 	    auth_alg, minor, short)					\
23723e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237365bd3adbSJohn Baldwin 	    auth_alg, minor, long)					\
237465bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237565bd3adbSJohn Baldwin 	    auth_alg, minor)						\
237665bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
237765bd3adbSJohn Baldwin 	    auth_alg, minor)						\
237865bd3adbSJohn Baldwin 	ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
237965bd3adbSJohn Baldwin 	    auth_alg, minor)						\
238065bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
238165bd3adbSJohn Baldwin 	    auth_alg, minor)						\
238265bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
238365bd3adbSJohn Baldwin 	    auth_alg, minor)						\
238465bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
238565bd3adbSJohn Baldwin 	    auth_alg, minor, small_record)				\
238665bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
238765bd3adbSJohn Baldwin 	    auth_alg, minor, oversized_record)
23883e7f8a8dSJohn Baldwin 
23893e7f8a8dSJohn Baldwin /*
239065bd3adbSJohn Baldwin  * For each supported cipher suite, run several receive tests:
23913e7f8a8dSJohn Baldwin  *
23923e7f8a8dSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
23933e7f8a8dSJohn Baldwin  *   a single TLS record)
23943e7f8a8dSJohn Baldwin  *
23953e7f8a8dSJohn Baldwin  * - a long test which sends 64KB of application data (split across
23963e7f8a8dSJohn Baldwin  *   multiple TLS records)
239765bd3adbSJohn Baldwin  *
239865bd3adbSJohn Baldwin  * - a test with corrupted payload data in a single TLS record
239965bd3adbSJohn Baldwin  *
240065bd3adbSJohn Baldwin  * - a test with a corrupted MAC in a single TLS record
240165bd3adbSJohn Baldwin  *
240265bd3adbSJohn Baldwin  * - a test with a truncated TLS record
240365bd3adbSJohn Baldwin  *
240465bd3adbSJohn Baldwin  * - tests with invalid TLS major and minor versions
240565bd3adbSJohn Baldwin  *
240665bd3adbSJohn Baldwin  * - a tests with a record whose is one less than the smallest valid
240765bd3adbSJohn Baldwin  *   size
240865bd3adbSJohn Baldwin  *
240965bd3adbSJohn Baldwin  * - a test with an oversized TLS record
24103e7f8a8dSJohn Baldwin  */
241164811651SJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_TESTS);
241205a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS);
241305a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS);
241405a1d0f5SJohn Baldwin 
241564811651SJohn Baldwin #define	GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
241664811651SJohn Baldwin 	    key_size, auth_alg, minor)					\
241764811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
241864811651SJohn Baldwin 	    auth_alg, minor, padding_1, 1, 0)				\
241964811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
242064811651SJohn Baldwin 	    auth_alg, minor, padding_2, 2, 0)				\
242164811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
242264811651SJohn Baldwin 	    auth_alg, minor, padding_3, 3, 0)				\
242364811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
242464811651SJohn Baldwin 	    auth_alg, minor, padding_4, 4, 0)				\
242564811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
242664811651SJohn Baldwin 	    auth_alg, minor, padding_5, 5, 0)				\
242764811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
242864811651SJohn Baldwin 	    auth_alg, minor, padding_6, 6, 0)				\
242964811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
243064811651SJohn Baldwin 	    auth_alg, minor, padding_7, 7, 0)				\
243164811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
243264811651SJohn Baldwin 	    auth_alg, minor, padding_8, 8, 0)				\
243364811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
243464811651SJohn Baldwin 	    auth_alg, minor, padding_9, 9, 0)				\
243564811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
243664811651SJohn Baldwin 	    auth_alg, minor, padding_10, 10, 0)				\
243764811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
243864811651SJohn Baldwin 	    auth_alg, minor, padding_11, 11, 0)				\
243964811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
244064811651SJohn Baldwin 	    auth_alg, minor, padding_12, 12, 0)				\
244164811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
244264811651SJohn Baldwin 	    auth_alg, minor, padding_13, 13, 0)				\
244364811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
244464811651SJohn Baldwin 	    auth_alg, minor, padding_14, 14, 0)				\
244564811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
244664811651SJohn Baldwin 	    auth_alg, minor, padding_15, 15, 0)				\
244764811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
244864811651SJohn Baldwin 	    auth_alg, minor, padding_16, 16, 0)				\
244964811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
245064811651SJohn Baldwin 	    auth_alg, minor, padding_16_extra, 16, 16)			\
245164811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
245264811651SJohn Baldwin 	    auth_alg, minor, padding_32_extra, 16, 32)
245364811651SJohn Baldwin 
245464811651SJohn Baldwin #define ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
245564811651SJohn Baldwin 	    key_size, auth_alg, minor)					\
245664811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
245764811651SJohn Baldwin 	    auth_alg, minor, padding_1)					\
245864811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
245964811651SJohn Baldwin 	    auth_alg, minor, padding_2)					\
246064811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
246164811651SJohn Baldwin 	    auth_alg, minor, padding_3)					\
246264811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
246364811651SJohn Baldwin 	    auth_alg, minor, padding_4)					\
246464811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
246564811651SJohn Baldwin 	    auth_alg, minor, padding_5)					\
246664811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
246764811651SJohn Baldwin 	    auth_alg, minor, padding_6)					\
246864811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
246964811651SJohn Baldwin 	    auth_alg, minor, padding_7)					\
247064811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
247164811651SJohn Baldwin 	    auth_alg, minor, padding_8)					\
247264811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
247364811651SJohn Baldwin 	    auth_alg, minor, padding_9)					\
247464811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
247564811651SJohn Baldwin 	    auth_alg, minor, padding_10)				\
247664811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
247764811651SJohn Baldwin 	    auth_alg, minor, padding_11)				\
247864811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
247964811651SJohn Baldwin 	    auth_alg, minor, padding_12)				\
248064811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
248164811651SJohn Baldwin 	    auth_alg, minor, padding_13)				\
248264811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
248364811651SJohn Baldwin 	    auth_alg, minor, padding_14)				\
248464811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
248564811651SJohn Baldwin 	    auth_alg, minor, padding_15)				\
248664811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
248764811651SJohn Baldwin 	    auth_alg, minor, padding_16)				\
248864811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
248964811651SJohn Baldwin 	    auth_alg, minor, padding_16_extra)				\
249064811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
249164811651SJohn Baldwin 	    auth_alg, minor, padding_32_extra)
249264811651SJohn Baldwin 
249365bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
249465bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
249565bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_padding);		\
249665bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc)		\
249765bd3adbSJohn Baldwin {									\
249865bd3adbSJohn Baldwin 	struct tls_enable en;						\
249965bd3adbSJohn Baldwin 	uint64_t seqno;							\
250065bd3adbSJohn Baldwin 									\
250165bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
250265bd3adbSJohn Baldwin 	seqno = random();						\
250370bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
250470bb2286SJohn Baldwin 	    seqno, &en);						\
250565bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_padding(tc, &en, seqno, len);	\
250665bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
250765bd3adbSJohn Baldwin }
250865bd3adbSJohn Baldwin 
250965bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
251065bd3adbSJohn Baldwin 	    auth_alg, minor)						\
251165bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_padding);
251265bd3adbSJohn Baldwin 
251365bd3adbSJohn Baldwin #define	GEN_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size,	\
251465bd3adbSJohn Baldwin 	    auth_alg, minor)						\
251565bd3adbSJohn Baldwin 	GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
251665bd3adbSJohn Baldwin 	    key_size, auth_alg, minor)					\
251765bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
251865bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
251965bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
252065bd3adbSJohn Baldwin 	    auth_alg, minor, non_block_size,				\
252165bd3adbSJohn Baldwin 	    tls_minimum_record_payload(&en) + 1)
252265bd3adbSJohn Baldwin 
252365bd3adbSJohn Baldwin #define	ADD_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size,	\
252465bd3adbSJohn Baldwin 	    auth_alg, minor)						\
252565bd3adbSJohn Baldwin 	ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
252665bd3adbSJohn Baldwin 	    key_size, auth_alg, minor)					\
252765bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
252865bd3adbSJohn Baldwin 	    auth_alg, minor)						\
252965bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
253065bd3adbSJohn Baldwin 	    auth_alg, minor, non_block_size)
253165bd3adbSJohn Baldwin 
253264811651SJohn Baldwin /*
253364811651SJohn Baldwin  * For AES-CBC MTE cipher suites using padding, add tests of messages
253464811651SJohn Baldwin  * with each possible padding size.  Note that the padding_<N> tests
253564811651SJohn Baldwin  * do not necessarily test <N> bytes of padding as the padding is a
253664811651SJohn Baldwin  * function of the cipher suite's MAC length.  However, cycling
253764811651SJohn Baldwin  * through all of the payload sizes from 1 to 16 should exercise all
253864811651SJohn Baldwin  * of the possible padding lengths for each suite.
253964811651SJohn Baldwin  *
254064811651SJohn Baldwin  * Two additional tests check for additional padding with an extra
254164811651SJohn Baldwin  * 16 or 32 bytes beyond the normal padding.
254265bd3adbSJohn Baldwin  *
254365bd3adbSJohn Baldwin  * Another test checks for corrupted padding.
254465bd3adbSJohn Baldwin  *
254565bd3adbSJohn Baldwin  * Another test checks for a record whose payload is not a multiple of
254665bd3adbSJohn Baldwin  * the AES block size.
254764811651SJohn Baldwin  */
254865bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_MTE_TESTS);
254964811651SJohn Baldwin 
255065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
255165bd3adbSJohn Baldwin 	    auth_alg, minor)						\
255265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_iv);		\
255365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc)			\
255465bd3adbSJohn Baldwin {									\
255565bd3adbSJohn Baldwin 	struct tls_enable en;						\
255665bd3adbSJohn Baldwin 	uint64_t seqno;							\
255765bd3adbSJohn Baldwin 									\
255865bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
255965bd3adbSJohn Baldwin 	seqno = random();						\
256070bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
256170bb2286SJohn Baldwin 	    seqno, &en);						\
256265bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_iv(tc, &en, seqno, 64);		\
256365bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
256465bd3adbSJohn Baldwin }
256565bd3adbSJohn Baldwin 
256665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
256765bd3adbSJohn Baldwin 	    auth_alg, minor)						\
256865bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_iv);
256965bd3adbSJohn Baldwin 
257065bd3adbSJohn Baldwin #define	GEN_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg,		\
257164811651SJohn Baldwin 	    key_size, auth_alg, minor)					\
257265bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
257365bd3adbSJohn Baldwin 	    auth_alg, minor)						\
257465bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
257565bd3adbSJohn Baldwin 	    auth_alg, minor, short_header,				\
257665bd3adbSJohn Baldwin 	    sizeof(struct tls_record_layer) + 1)
257765bd3adbSJohn Baldwin 
257865bd3adbSJohn Baldwin #define	ADD_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg,		\
257965bd3adbSJohn Baldwin 	    key_size, auth_alg, minor)					\
258065bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
258165bd3adbSJohn Baldwin 	    auth_alg, minor)						\
258265bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
258365bd3adbSJohn Baldwin 	    auth_alg, minor, short_header)
258465bd3adbSJohn Baldwin 
258565bd3adbSJohn Baldwin /*
258665bd3adbSJohn Baldwin  * For cipher suites with an explicit IV, run a receive test where the
258765bd3adbSJohn Baldwin  * explicit IV has been corrupted.  Also run a receive test that sends
258865bd3adbSJohn Baldwin  * a short record without a complete IV.
258965bd3adbSJohn Baldwin  */
259065bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS);
259165bd3adbSJohn Baldwin AES_GCM_12_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS);
259265bd3adbSJohn Baldwin 
259365bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
259465bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
259565bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_type);		\
259665bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc)			\
259765bd3adbSJohn Baldwin {									\
259865bd3adbSJohn Baldwin 	struct tls_enable en;						\
259965bd3adbSJohn Baldwin 	uint64_t seqno;							\
260065bd3adbSJohn Baldwin 									\
260165bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
260265bd3adbSJohn Baldwin 	seqno = random();						\
260370bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
260470bb2286SJohn Baldwin 	    seqno, &en);						\
260565bd3adbSJohn Baldwin 	test_ktls_receive_bad_type(tc, &en, seqno, len);		\
260665bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
260765bd3adbSJohn Baldwin }
260865bd3adbSJohn Baldwin 
260965bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
261065bd3adbSJohn Baldwin 	    auth_alg, minor)						\
261165bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_type);
261265bd3adbSJohn Baldwin 
261365bd3adbSJohn Baldwin #define GEN_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size,	\
261465bd3adbSJohn Baldwin 	    auth_alg, minor)						\
261505a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
261605a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded, 64, 16)			\
261705a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
261865bd3adbSJohn Baldwin 	    auth_alg, minor, long_padded, 64 * 1024, 15)		\
261965bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
262065bd3adbSJohn Baldwin 	    auth_alg, minor, 64)
262105a1d0f5SJohn Baldwin 
262265bd3adbSJohn Baldwin #define ADD_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size,	\
262365bd3adbSJohn Baldwin 	    auth_alg, minor)						\
262405a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
262505a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded)				\
262605a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
262765bd3adbSJohn Baldwin 	    auth_alg, minor, long_padded)				\
262865bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
262965bd3adbSJohn Baldwin 	    auth_alg, minor)
263005a1d0f5SJohn Baldwin 
263105a1d0f5SJohn Baldwin /*
263205a1d0f5SJohn Baldwin  * For TLS 1.3 cipher suites, run two additional receive tests which
263365bd3adbSJohn Baldwin  * use add padding to each record.  Also run a test that uses an
263465bd3adbSJohn Baldwin  * invalid "outer" record type.
263505a1d0f5SJohn Baldwin  */
263665bd3adbSJohn Baldwin TLS_13_TESTS(GEN_RECEIVE_TLS13_TESTS);
26373e7f8a8dSJohn Baldwin 
2638233ce578SJohn Baldwin static void
26392400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc,
26402400a7b1SJohn Baldwin     struct tls_enable *en)
2641233ce578SJohn Baldwin {
2642233ce578SJohn Baldwin 	int sockets[2];
2643233ce578SJohn Baldwin 
26442400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
2645233ce578SJohn Baldwin 
2646*883d1742SJohn Baldwin 	ATF_REQUIRE_ERRNO(EINVAL, setsockopt(sockets[1], IPPROTO_TCP,
2647*883d1742SJohn Baldwin 	    TCP_RXTLS_ENABLE, en, sizeof(*en)) == -1);
2648233ce578SJohn Baldwin 
26492c105205SJohn Baldwin 	close_sockets(sockets);
2650233ce578SJohn Baldwin }
2651233ce578SJohn Baldwin 
2652233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
2653233ce578SJohn Baldwin 	    minor)							\
2654233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name);			\
2655233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc)				\
2656233ce578SJohn Baldwin {									\
2657233ce578SJohn Baldwin 	struct tls_enable en;						\
2658233ce578SJohn Baldwin 	uint64_t seqno;							\
2659233ce578SJohn Baldwin 									\
2660233ce578SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2661233ce578SJohn Baldwin 	seqno = random();						\
266270bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
266370bb2286SJohn Baldwin 	    seqno, &en);						\
26642400a7b1SJohn Baldwin 	test_ktls_invalid_receive_cipher_suite(tc, &en);		\
2665233ce578SJohn Baldwin 	free_tls_enable(&en);						\
2666233ce578SJohn Baldwin }
2667233ce578SJohn Baldwin 
2668233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
2669233ce578SJohn Baldwin 	    minor)							\
2670233ce578SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name);
2671233ce578SJohn Baldwin 
2672233ce578SJohn Baldwin /*
2673233ce578SJohn Baldwin  * Ensure that invalid cipher suites are rejected for receive.
2674233ce578SJohn Baldwin  */
2675233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST);
2676233ce578SJohn Baldwin 
267783a54b58SJohn Baldwin static void
26782400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc,
26792400a7b1SJohn Baldwin     struct tls_enable *en)
268083a54b58SJohn Baldwin {
268183a54b58SJohn Baldwin 	int sockets[2];
268283a54b58SJohn Baldwin 
26832400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
268483a54b58SJohn Baldwin 
2685*883d1742SJohn Baldwin 	ATF_REQUIRE_ERRNO(EPROTONOSUPPORT, setsockopt(sockets[1], IPPROTO_TCP,
2686*883d1742SJohn Baldwin 	    TCP_RXTLS_ENABLE, en, sizeof(*en)) == -1);
268783a54b58SJohn Baldwin 
26882c105205SJohn Baldwin 	close_sockets(sockets);
268983a54b58SJohn Baldwin }
269083a54b58SJohn Baldwin 
269183a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
269283a54b58SJohn Baldwin 	    auth_alg, minor)						\
269383a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name);			\
269483a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc)			\
269583a54b58SJohn Baldwin {									\
269683a54b58SJohn Baldwin 	struct tls_enable en;						\
269783a54b58SJohn Baldwin 	uint64_t seqno;							\
269883a54b58SJohn Baldwin 									\
269983a54b58SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
270083a54b58SJohn Baldwin 	seqno = random();						\
270170bb2286SJohn Baldwin 	build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor,	\
270270bb2286SJohn Baldwin 	    seqno, &en);						\
27032400a7b1SJohn Baldwin 	test_ktls_unsupported_receive_cipher_suite(tc, &en);		\
270483a54b58SJohn Baldwin 	free_tls_enable(&en);						\
270583a54b58SJohn Baldwin }
270683a54b58SJohn Baldwin 
270783a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
270883a54b58SJohn Baldwin 	    auth_alg, minor)						\
270983a54b58SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name);
271083a54b58SJohn Baldwin 
271183a54b58SJohn Baldwin /*
271283a54b58SJohn Baldwin  * Ensure that valid cipher suites not supported for receive are
271383a54b58SJohn Baldwin  * rejected.
271483a54b58SJohn Baldwin  */
271564811651SJohn Baldwin TLS_10_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST);
271683a54b58SJohn Baldwin 
2717ee5686c6SMark Johnston /*
2718ee5686c6SMark Johnston  * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise
2719ee5686c6SMark Johnston  * KTLS error handling in the socket layer.
2720ee5686c6SMark Johnston  */
2721ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst);
2722ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc)
2723ee5686c6SMark Johnston {
2724ee5686c6SMark Johnston 	char buf[32];
2725ee5686c6SMark Johnston 	struct sockaddr_in dst;
2726ee5686c6SMark Johnston 	struct tls_enable en;
2727ee5686c6SMark Johnston 	ssize_t n;
2728ee5686c6SMark Johnston 	int s;
2729ee5686c6SMark Johnston 
2730ee5686c6SMark Johnston 	ATF_REQUIRE_KTLS();
2731ee5686c6SMark Johnston 
2732ee5686c6SMark Johnston 	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2733ee5686c6SMark Johnston 	ATF_REQUIRE(s >= 0);
2734ee5686c6SMark Johnston 
273570bb2286SJohn Baldwin 	build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
2736ee5686c6SMark Johnston 	    TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
2737ee5686c6SMark Johnston 
2738ee5686c6SMark Johnston 	ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en,
2739ee5686c6SMark Johnston 	    sizeof(en)) == 0);
2740ee5686c6SMark Johnston 
2741ee5686c6SMark Johnston 	memset(&dst, 0, sizeof(dst));
2742ee5686c6SMark Johnston 	dst.sin_family = AF_INET;
2743ee5686c6SMark Johnston 	dst.sin_len = sizeof(dst);
2744ee5686c6SMark Johnston 	dst.sin_addr.s_addr = htonl(INADDR_BROADCAST);
2745ee5686c6SMark Johnston 	dst.sin_port = htons(12345);
2746ee5686c6SMark Johnston 
2747ee5686c6SMark Johnston 	memset(buf, 0, sizeof(buf));
2748ee5686c6SMark Johnston 	n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst,
2749ee5686c6SMark Johnston 	    sizeof(dst));
2750ee5686c6SMark Johnston 
2751ee5686c6SMark Johnston 	/* Can't transmit to the broadcast address over TCP. */
2752ee5686c6SMark Johnston 	ATF_REQUIRE_ERRNO(EACCES, n == -1);
2753ee5686c6SMark Johnston 	ATF_REQUIRE(close(s) == 0);
2754ee5686c6SMark Johnston }
2755ee5686c6SMark Johnston 
2756a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp)
2757a10482eaSJohn Baldwin {
27583e7f8a8dSJohn Baldwin 	/* Transmit tests */
2759a10482eaSJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_TESTS);
2760a10482eaSJohn Baldwin 	AES_GCM_TESTS(ADD_TRANSMIT_TESTS);
2761a10482eaSJohn Baldwin 	CHACHA20_TESTS(ADD_TRANSMIT_TESTS);
276244265dc3SJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS);
27635de79eedSMark Johnston 	AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
27645de79eedSMark Johnston 	AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
27655de79eedSMark Johnston 	CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
2766d1c369f9SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST);
2767a10482eaSJohn Baldwin 
27683e7f8a8dSJohn Baldwin 	/* Receive tests */
276964811651SJohn Baldwin 	TLS_10_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST);
277064811651SJohn Baldwin 	AES_CBC_NONZERO_TESTS(ADD_RECEIVE_TESTS);
277105a1d0f5SJohn Baldwin 	AES_GCM_TESTS(ADD_RECEIVE_TESTS);
277205a1d0f5SJohn Baldwin 	CHACHA20_TESTS(ADD_RECEIVE_TESTS);
277365bd3adbSJohn Baldwin 	AES_CBC_NONZERO_TESTS(ADD_RECEIVE_MTE_TESTS);
277465bd3adbSJohn Baldwin 	AES_CBC_NONZERO_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS);
277565bd3adbSJohn Baldwin 	AES_GCM_12_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS);
277665bd3adbSJohn Baldwin 	TLS_13_TESTS(ADD_RECEIVE_TLS13_TESTS);
2777233ce578SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST);
2778233ce578SJohn Baldwin 
2779ee5686c6SMark Johnston 	/* Miscellaneous */
2780ee5686c6SMark Johnston 	ATF_TP_ADD_TC(tp, ktls_sendto_baddst);
2781ee5686c6SMark Johnston 
2782a10482eaSJohn Baldwin 	return (atf_no_error());
2783a10482eaSJohn Baldwin }
2784