xref: /freebsd/tests/sys/kern/ktls_test.c (revision 65bd3adbed1526cfedc4474c1a390e058303128f)
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 
29*65bd3adbSJohn 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>
412400a7b1SJohn Baldwin #include <netdb.h>
42a10482eaSJohn Baldwin #include <poll.h>
43a10482eaSJohn Baldwin #include <stdbool.h>
44a10482eaSJohn Baldwin #include <stdlib.h>
45a10482eaSJohn Baldwin #include <atf-c.h>
46a10482eaSJohn Baldwin 
47a10482eaSJohn Baldwin #include <openssl/err.h>
48a10482eaSJohn Baldwin #include <openssl/evp.h>
49a10482eaSJohn Baldwin #include <openssl/hmac.h>
50a10482eaSJohn Baldwin 
51a10482eaSJohn Baldwin static void
52a10482eaSJohn Baldwin require_ktls(void)
53a10482eaSJohn Baldwin {
54a10482eaSJohn Baldwin 	size_t len;
55a10482eaSJohn Baldwin 	bool enable;
56a10482eaSJohn Baldwin 
57a10482eaSJohn Baldwin 	len = sizeof(enable);
58a10482eaSJohn Baldwin 	if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) {
59a10482eaSJohn Baldwin 		if (errno == ENOENT)
60a10482eaSJohn Baldwin 			atf_tc_skip("kernel does not support TLS offload");
61a10482eaSJohn Baldwin 		atf_libc_error(errno, "Failed to read kern.ipc.tls.enable");
62a10482eaSJohn Baldwin 	}
63a10482eaSJohn Baldwin 
64a10482eaSJohn Baldwin 	if (!enable)
65a10482eaSJohn Baldwin 		atf_tc_skip("Kernel TLS is disabled");
66a10482eaSJohn Baldwin }
67a10482eaSJohn Baldwin 
68a10482eaSJohn Baldwin #define	ATF_REQUIRE_KTLS()	require_ktls()
69a10482eaSJohn Baldwin 
70ea4ebdcbSJohn Baldwin static void
71ea4ebdcbSJohn Baldwin check_tls_mode(const atf_tc_t *tc, int s, int sockopt)
72ea4ebdcbSJohn Baldwin {
73ea4ebdcbSJohn Baldwin 	if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_ifnet", false)) {
74ea4ebdcbSJohn Baldwin 		socklen_t len;
75ea4ebdcbSJohn Baldwin 		int mode;
76ea4ebdcbSJohn Baldwin 
77ea4ebdcbSJohn Baldwin 		len = sizeof(mode);
78ea4ebdcbSJohn Baldwin 		if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1)
79ea4ebdcbSJohn Baldwin 			atf_libc_error(errno, "Failed to fetch TLS mode");
80ea4ebdcbSJohn Baldwin 
81ea4ebdcbSJohn Baldwin 		if (mode != TCP_TLS_MODE_IFNET)
82ea4ebdcbSJohn Baldwin 			atf_tc_skip("connection did not use ifnet TLS");
83ea4ebdcbSJohn Baldwin 	}
84cc13c983SJohn Baldwin 
85cc13c983SJohn Baldwin 	if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_toe", false)) {
86cc13c983SJohn Baldwin 		socklen_t len;
87cc13c983SJohn Baldwin 		int mode;
88cc13c983SJohn Baldwin 
89cc13c983SJohn Baldwin 		len = sizeof(mode);
90cc13c983SJohn Baldwin 		if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1)
91cc13c983SJohn Baldwin 			atf_libc_error(errno, "Failed to fetch TLS mode");
92cc13c983SJohn Baldwin 
93cc13c983SJohn Baldwin 		if (mode != TCP_TLS_MODE_TOE)
94cc13c983SJohn Baldwin 			atf_tc_skip("connection did not use TOE TLS");
95cc13c983SJohn Baldwin 	}
96ea4ebdcbSJohn Baldwin }
97ea4ebdcbSJohn Baldwin 
98a10482eaSJohn Baldwin static char
99a10482eaSJohn Baldwin rdigit(void)
100a10482eaSJohn Baldwin {
101a10482eaSJohn Baldwin 	/* ASCII printable values between 0x20 and 0x7e */
102a10482eaSJohn Baldwin 	return (0x20 + random() % (0x7f - 0x20));
103a10482eaSJohn Baldwin }
104a10482eaSJohn Baldwin 
105a10482eaSJohn Baldwin static char *
106a10482eaSJohn Baldwin alloc_buffer(size_t len)
107a10482eaSJohn Baldwin {
108a10482eaSJohn Baldwin 	char *buf;
109a10482eaSJohn Baldwin 	size_t i;
110a10482eaSJohn Baldwin 
111a10482eaSJohn Baldwin 	if (len == 0)
112a10482eaSJohn Baldwin 		return (NULL);
113a10482eaSJohn Baldwin 	buf = malloc(len);
114a10482eaSJohn Baldwin 	for (i = 0; i < len; i++)
115a10482eaSJohn Baldwin 		buf[i] = rdigit();
116a10482eaSJohn Baldwin 	return (buf);
117a10482eaSJohn Baldwin }
118a10482eaSJohn Baldwin 
119a10482eaSJohn Baldwin static bool
1202c105205SJohn Baldwin socketpair_tcp(int sv[2])
121a10482eaSJohn Baldwin {
122a10482eaSJohn Baldwin 	struct pollfd pfd;
123a10482eaSJohn Baldwin 	struct sockaddr_in sin;
124a10482eaSJohn Baldwin 	socklen_t len;
125a10482eaSJohn Baldwin 	int as, cs, ls;
126a10482eaSJohn Baldwin 
127a10482eaSJohn Baldwin 	ls = socket(PF_INET, SOCK_STREAM, 0);
128a10482eaSJohn Baldwin 	if (ls == -1) {
129a10482eaSJohn Baldwin 		warn("socket() for listen");
130a10482eaSJohn Baldwin 		return (false);
131a10482eaSJohn Baldwin 	}
132a10482eaSJohn Baldwin 
133a10482eaSJohn Baldwin 	memset(&sin, 0, sizeof(sin));
134a10482eaSJohn Baldwin 	sin.sin_len = sizeof(sin);
135a10482eaSJohn Baldwin 	sin.sin_family = AF_INET;
136a10482eaSJohn Baldwin 	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
137a10482eaSJohn Baldwin 	if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
138a10482eaSJohn Baldwin 		warn("bind");
139a10482eaSJohn Baldwin 		close(ls);
140a10482eaSJohn Baldwin 		return (false);
141a10482eaSJohn Baldwin 	}
142a10482eaSJohn Baldwin 
143a10482eaSJohn Baldwin 	if (listen(ls, 1) == -1) {
144a10482eaSJohn Baldwin 		warn("listen");
145a10482eaSJohn Baldwin 		close(ls);
146a10482eaSJohn Baldwin 		return (false);
147a10482eaSJohn Baldwin 	}
148a10482eaSJohn Baldwin 
149a10482eaSJohn Baldwin 	len = sizeof(sin);
150a10482eaSJohn Baldwin 	if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) {
151a10482eaSJohn Baldwin 		warn("getsockname");
152a10482eaSJohn Baldwin 		close(ls);
153a10482eaSJohn Baldwin 		return (false);
154a10482eaSJohn Baldwin 	}
155a10482eaSJohn Baldwin 
156a10482eaSJohn Baldwin 	cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
157a10482eaSJohn Baldwin 	if (cs == -1) {
158a10482eaSJohn Baldwin 		warn("socket() for connect");
159a10482eaSJohn Baldwin 		close(ls);
160a10482eaSJohn Baldwin 		return (false);
161a10482eaSJohn Baldwin 	}
162a10482eaSJohn Baldwin 
163a10482eaSJohn Baldwin 	if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
164a10482eaSJohn Baldwin 		if (errno != EINPROGRESS) {
165a10482eaSJohn Baldwin 			warn("connect");
166a10482eaSJohn Baldwin 			close(ls);
167a10482eaSJohn Baldwin 			close(cs);
168a10482eaSJohn Baldwin 			return (false);
169a10482eaSJohn Baldwin 		}
170a10482eaSJohn Baldwin 	}
171a10482eaSJohn Baldwin 
172a10482eaSJohn Baldwin 	as = accept4(ls, NULL, NULL, SOCK_NONBLOCK);
173a10482eaSJohn Baldwin 	if (as == -1) {
174a10482eaSJohn Baldwin 		warn("accept4");
175a10482eaSJohn Baldwin 		close(ls);
176a10482eaSJohn Baldwin 		close(cs);
177a10482eaSJohn Baldwin 		return (false);
178a10482eaSJohn Baldwin 	}
179a10482eaSJohn Baldwin 
180a10482eaSJohn Baldwin 	close(ls);
181a10482eaSJohn Baldwin 
182a10482eaSJohn Baldwin 	pfd.fd = cs;
183a10482eaSJohn Baldwin 	pfd.events = POLLOUT;
184a10482eaSJohn Baldwin 	pfd.revents = 0;
185a10482eaSJohn Baldwin 	ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1);
186a10482eaSJohn Baldwin 	ATF_REQUIRE(pfd.revents == POLLOUT);
187a10482eaSJohn Baldwin 
188a10482eaSJohn Baldwin 	sv[0] = cs;
189a10482eaSJohn Baldwin 	sv[1] = as;
190a10482eaSJohn Baldwin 	return (true);
191a10482eaSJohn Baldwin }
192a10482eaSJohn Baldwin 
1932400a7b1SJohn Baldwin static bool
1942400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2])
1952400a7b1SJohn Baldwin {
1962400a7b1SJohn Baldwin 	const char *cause, *host, *port;
1972400a7b1SJohn Baldwin 	struct addrinfo hints, *ai, *tofree;
1982400a7b1SJohn Baldwin 	int error, flags, s;
1992400a7b1SJohn Baldwin 
2002400a7b1SJohn Baldwin 	host = atf_tc_get_config_var(tc, "ktls.host");
2012400a7b1SJohn Baldwin 	port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo");
2022400a7b1SJohn Baldwin 	memset(&hints, 0, sizeof(hints));
2032400a7b1SJohn Baldwin 	hints.ai_family = AF_UNSPEC;
2042400a7b1SJohn Baldwin 	hints.ai_socktype = SOCK_STREAM;
2052400a7b1SJohn Baldwin 	hints.ai_protocol = IPPROTO_TCP;
2062400a7b1SJohn Baldwin 	error = getaddrinfo(host, port, &hints, &tofree);
2072400a7b1SJohn Baldwin 	if (error != 0) {
2082400a7b1SJohn Baldwin 		warnx("getaddrinfo(%s:%s) failed: %s", host, port,
2092400a7b1SJohn Baldwin 		    gai_strerror(error));
2102400a7b1SJohn Baldwin 		return (false);
2112400a7b1SJohn Baldwin 	}
2122400a7b1SJohn Baldwin 
2132400a7b1SJohn Baldwin 	cause = NULL;
2142400a7b1SJohn Baldwin 	for (ai = tofree; ai != NULL; ai = ai->ai_next) {
2152400a7b1SJohn Baldwin 		s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
2162400a7b1SJohn Baldwin 		if (s == -1) {
2172400a7b1SJohn Baldwin 			cause = "socket";
2182400a7b1SJohn Baldwin 			error = errno;
2192400a7b1SJohn Baldwin 			continue;
2202400a7b1SJohn Baldwin 		}
2212400a7b1SJohn Baldwin 
2222400a7b1SJohn Baldwin 		if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) {
2232400a7b1SJohn Baldwin 			cause = "connect";
2242400a7b1SJohn Baldwin 			error = errno;
2252400a7b1SJohn Baldwin 			close(s);
2262400a7b1SJohn Baldwin 			continue;
2272400a7b1SJohn Baldwin 		}
2282400a7b1SJohn Baldwin 
2292400a7b1SJohn Baldwin 		freeaddrinfo(tofree);
2302400a7b1SJohn Baldwin 
2312400a7b1SJohn Baldwin 		ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1);
2322400a7b1SJohn Baldwin 		flags |= O_NONBLOCK;
2332400a7b1SJohn Baldwin 		ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1);
2342400a7b1SJohn Baldwin 
2352400a7b1SJohn Baldwin 		sv[0] = s;
2362400a7b1SJohn Baldwin 		sv[1] = s;
2372400a7b1SJohn Baldwin 		return (true);
2382400a7b1SJohn Baldwin 	}
2392400a7b1SJohn Baldwin 
2402400a7b1SJohn Baldwin 	warnc(error, "%s", cause);
2412400a7b1SJohn Baldwin 	freeaddrinfo(tofree);
2422400a7b1SJohn Baldwin 	return (false);
2432400a7b1SJohn Baldwin }
2442400a7b1SJohn Baldwin 
2452400a7b1SJohn Baldwin static bool
2462400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2])
2472400a7b1SJohn Baldwin {
2482400a7b1SJohn Baldwin 	if (atf_tc_has_config_var(tc, "ktls.host"))
2492400a7b1SJohn Baldwin 		return (echo_socket(tc, sv));
2502400a7b1SJohn Baldwin 	else
2512400a7b1SJohn Baldwin 		return (socketpair_tcp(sv));
2522400a7b1SJohn Baldwin }
2532400a7b1SJohn Baldwin 
254a10482eaSJohn Baldwin static void
2552c105205SJohn Baldwin close_sockets(int sv[2])
2562c105205SJohn Baldwin {
2572400a7b1SJohn Baldwin 	if (sv[0] != sv[1])
2582c105205SJohn Baldwin 		ATF_REQUIRE(close(sv[1]) == 0);
2592c105205SJohn Baldwin 	ATF_REQUIRE(close(sv[0]) == 0);
2602c105205SJohn Baldwin }
2612c105205SJohn Baldwin 
2622c105205SJohn Baldwin static void
263a10482eaSJohn Baldwin fd_set_blocking(int fd)
264a10482eaSJohn Baldwin {
265a10482eaSJohn Baldwin 	int flags;
266a10482eaSJohn Baldwin 
267a10482eaSJohn Baldwin 	ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1);
268a10482eaSJohn Baldwin 	flags &= ~O_NONBLOCK;
269a10482eaSJohn Baldwin 	ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1);
270a10482eaSJohn Baldwin }
271a10482eaSJohn Baldwin 
272a10482eaSJohn Baldwin static bool
27364811651SJohn Baldwin cbc_crypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
27464811651SJohn Baldwin     const char *input, char *output, size_t size, int enc)
275a10482eaSJohn Baldwin {
276a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
277a10482eaSJohn Baldwin 	int outl, total;
278a10482eaSJohn Baldwin 
279a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
280a10482eaSJohn Baldwin 	if (ctx == NULL) {
281a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
282a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
283a10482eaSJohn Baldwin 		return (false);
284a10482eaSJohn Baldwin 	}
285a10482eaSJohn Baldwin 	if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key,
28664811651SJohn Baldwin 	    (const u_char *)iv, enc) != 1) {
287a10482eaSJohn Baldwin 		warnx("EVP_CipherInit_ex failed: %s",
288a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
289a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
290a10482eaSJohn Baldwin 		return (false);
291a10482eaSJohn Baldwin 	}
292a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
293a10482eaSJohn Baldwin 	if (EVP_CipherUpdate(ctx, (u_char *)output, &outl,
294a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
295a10482eaSJohn Baldwin 		warnx("EVP_CipherUpdate failed: %s",
296a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
297a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
298a10482eaSJohn Baldwin 		return (false);
299a10482eaSJohn Baldwin 	}
300a10482eaSJohn Baldwin 	total = outl;
301a10482eaSJohn Baldwin 	if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
302a10482eaSJohn Baldwin 		warnx("EVP_CipherFinal_ex failed: %s",
303a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
304a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
305a10482eaSJohn Baldwin 		return (false);
306a10482eaSJohn Baldwin 	}
307a10482eaSJohn Baldwin 	total += outl;
308a10482eaSJohn Baldwin 	if ((size_t)total != size) {
309a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
310a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
311a10482eaSJohn Baldwin 		return (false);
312a10482eaSJohn Baldwin 	}
313a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
314a10482eaSJohn Baldwin 	return (true);
315a10482eaSJohn Baldwin }
316a10482eaSJohn Baldwin 
317a10482eaSJohn Baldwin static bool
31864811651SJohn Baldwin cbc_encrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
31964811651SJohn Baldwin     const char *input, char *output, size_t size)
32064811651SJohn Baldwin {
32164811651SJohn Baldwin 	return (cbc_crypt(cipher, key, iv, input, output, size, 1));
32264811651SJohn Baldwin }
32364811651SJohn Baldwin 
32464811651SJohn Baldwin static bool
32564811651SJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
32664811651SJohn Baldwin     const char *input, char *output, size_t size)
32764811651SJohn Baldwin {
32864811651SJohn Baldwin 	return (cbc_crypt(cipher, key, iv, input, output, size, 0));
32964811651SJohn Baldwin }
33064811651SJohn Baldwin 
33164811651SJohn Baldwin static bool
33264811651SJohn Baldwin compute_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
33364811651SJohn Baldwin     size_t aad_len, const void *buffer, size_t len, void *digest,
33464811651SJohn Baldwin     u_int *digest_len)
335a10482eaSJohn Baldwin {
336a10482eaSJohn Baldwin 	HMAC_CTX *ctx;
337a10482eaSJohn Baldwin 
338a10482eaSJohn Baldwin 	ctx = HMAC_CTX_new();
339a10482eaSJohn Baldwin 	if (ctx == NULL) {
340a10482eaSJohn Baldwin 		warnx("HMAC_CTX_new failed: %s",
341a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
342a10482eaSJohn Baldwin 		return (false);
343a10482eaSJohn Baldwin 	}
344a10482eaSJohn Baldwin 	if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) {
345a10482eaSJohn Baldwin 		warnx("HMAC_Init_ex failed: %s",
346a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
347a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
348a10482eaSJohn Baldwin 		return (false);
349a10482eaSJohn Baldwin 	}
350a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, aad, aad_len) != 1) {
351a10482eaSJohn Baldwin 		warnx("HMAC_Update (aad) failed: %s",
352a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
353a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
354a10482eaSJohn Baldwin 		return (false);
355a10482eaSJohn Baldwin 	}
356a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, buffer, len) != 1) {
357a10482eaSJohn Baldwin 		warnx("HMAC_Update (payload) failed: %s",
358a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
359a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
360a10482eaSJohn Baldwin 		return (false);
361a10482eaSJohn Baldwin 	}
36264811651SJohn Baldwin 	if (HMAC_Final(ctx, digest, digest_len) != 1) {
363a10482eaSJohn Baldwin 		warnx("HMAC_Final failed: %s",
364a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
365a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
366a10482eaSJohn Baldwin 		return (false);
367a10482eaSJohn Baldwin 	}
368a10482eaSJohn Baldwin 	HMAC_CTX_free(ctx);
36964811651SJohn Baldwin 	return (true);
37064811651SJohn Baldwin }
37164811651SJohn Baldwin 
37264811651SJohn Baldwin static bool
37364811651SJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
37464811651SJohn Baldwin     size_t aad_len, const void *buffer, size_t len, const void *digest)
37564811651SJohn Baldwin {
37664811651SJohn Baldwin 	unsigned char digest2[EVP_MAX_MD_SIZE];
37764811651SJohn Baldwin 	u_int digest_len;
37864811651SJohn Baldwin 
37964811651SJohn Baldwin 	if (!compute_hash(md, key, key_len, aad, aad_len, buffer, len, digest2,
38064811651SJohn Baldwin 	    &digest_len))
38164811651SJohn Baldwin 		return (false);
382a10482eaSJohn Baldwin 	if (memcmp(digest, digest2, digest_len) != 0) {
383a10482eaSJohn Baldwin 		warnx("HMAC mismatch");
384a10482eaSJohn Baldwin 		return (false);
385a10482eaSJohn Baldwin 	}
386a10482eaSJohn Baldwin 	return (true);
387a10482eaSJohn Baldwin }
388a10482eaSJohn Baldwin 
389a10482eaSJohn Baldwin static bool
3903e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
3913e7f8a8dSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
3923e7f8a8dSJohn Baldwin     size_t size, char *tag, size_t tag_len)
3933e7f8a8dSJohn Baldwin {
3943e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
3953e7f8a8dSJohn Baldwin 	int outl, total;
3963e7f8a8dSJohn Baldwin 
3973e7f8a8dSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
3983e7f8a8dSJohn Baldwin 	if (ctx == NULL) {
3993e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
4003e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4013e7f8a8dSJohn Baldwin 		return (false);
4023e7f8a8dSJohn Baldwin 	}
4033e7f8a8dSJohn Baldwin 	if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
4043e7f8a8dSJohn Baldwin 	    (const u_char *)nonce) != 1) {
4053e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptInit_ex failed: %s",
4063e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4073e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4083e7f8a8dSJohn Baldwin 		return (false);
4093e7f8a8dSJohn Baldwin 	}
4103e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
4113e7f8a8dSJohn Baldwin 	if (aad != NULL) {
4123e7f8a8dSJohn Baldwin 		if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
4133e7f8a8dSJohn Baldwin 		    aad_len) != 1) {
4143e7f8a8dSJohn Baldwin 			warnx("EVP_EncryptUpdate for AAD failed: %s",
4153e7f8a8dSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
4163e7f8a8dSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
4173e7f8a8dSJohn Baldwin 			return (false);
4183e7f8a8dSJohn Baldwin 		}
4193e7f8a8dSJohn Baldwin 	}
4203e7f8a8dSJohn Baldwin 	if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl,
4213e7f8a8dSJohn Baldwin 	    (const u_char *)input, size) != 1) {
4223e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptUpdate failed: %s",
4233e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4243e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4253e7f8a8dSJohn Baldwin 		return (false);
4263e7f8a8dSJohn Baldwin 	}
4273e7f8a8dSJohn Baldwin 	total = outl;
4283e7f8a8dSJohn Baldwin 	if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
4293e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptFinal_ex failed: %s",
4303e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4313e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4323e7f8a8dSJohn Baldwin 		return (false);
4333e7f8a8dSJohn Baldwin 	}
4343e7f8a8dSJohn Baldwin 	total += outl;
4353e7f8a8dSJohn Baldwin 	if ((size_t)total != size) {
4363e7f8a8dSJohn Baldwin 		warnx("encrypt size mismatch: %zu vs %d", size, total);
4373e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4383e7f8a8dSJohn Baldwin 		return (false);
4393e7f8a8dSJohn Baldwin 	}
4403e7f8a8dSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) !=
4413e7f8a8dSJohn Baldwin 	    1) {
4423e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s",
4433e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
4443e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
4453e7f8a8dSJohn Baldwin 		return (false);
4463e7f8a8dSJohn Baldwin 	}
4473e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
4483e7f8a8dSJohn Baldwin 	return (true);
4493e7f8a8dSJohn Baldwin }
4503e7f8a8dSJohn Baldwin 
4513e7f8a8dSJohn Baldwin static bool
452a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
453a10482eaSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
454a10482eaSJohn Baldwin     size_t size, const char *tag, size_t tag_len)
455a10482eaSJohn Baldwin {
456a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
457a10482eaSJohn Baldwin 	int outl, total;
458a10482eaSJohn Baldwin 	bool valid;
459a10482eaSJohn Baldwin 
460a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
461a10482eaSJohn Baldwin 	if (ctx == NULL) {
462a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
463a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
464a10482eaSJohn Baldwin 		return (false);
465a10482eaSJohn Baldwin 	}
466a10482eaSJohn Baldwin 	if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
467a10482eaSJohn Baldwin 	    (const u_char *)nonce) != 1) {
468a10482eaSJohn Baldwin 		warnx("EVP_DecryptInit_ex failed: %s",
469a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
470a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
471a10482eaSJohn Baldwin 		return (false);
472a10482eaSJohn Baldwin 	}
473a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
474a10482eaSJohn Baldwin 	if (aad != NULL) {
475a10482eaSJohn Baldwin 		if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
476a10482eaSJohn Baldwin 		    aad_len) != 1) {
477a10482eaSJohn Baldwin 			warnx("EVP_DecryptUpdate for AAD failed: %s",
478a10482eaSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
479a10482eaSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
480a10482eaSJohn Baldwin 			return (false);
481a10482eaSJohn Baldwin 		}
482a10482eaSJohn Baldwin 	}
483a10482eaSJohn Baldwin 	if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl,
484a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
485a10482eaSJohn Baldwin 		warnx("EVP_DecryptUpdate failed: %s",
486a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
487a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
488a10482eaSJohn Baldwin 		return (false);
489a10482eaSJohn Baldwin 	}
490a10482eaSJohn Baldwin 	total = outl;
491a10482eaSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
492a10482eaSJohn Baldwin 	    __DECONST(char *, tag)) != 1) {
493a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) 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 	valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1);
499a10482eaSJohn Baldwin 	total += outl;
500a10482eaSJohn Baldwin 	if ((size_t)total != size) {
501a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
502a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
503a10482eaSJohn Baldwin 		return (false);
504a10482eaSJohn Baldwin 	}
505a10482eaSJohn Baldwin 	if (!valid)
506a10482eaSJohn Baldwin 		warnx("tag mismatch");
507a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
508a10482eaSJohn Baldwin 	return (valid);
509a10482eaSJohn Baldwin }
510a10482eaSJohn Baldwin 
511a10482eaSJohn Baldwin static void
512a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg,
513a10482eaSJohn Baldwin     int minor, uint64_t seqno, struct tls_enable *en)
514a10482eaSJohn Baldwin {
515a10482eaSJohn Baldwin 	u_int auth_key_len, iv_len;
516a10482eaSJohn Baldwin 
517a10482eaSJohn Baldwin 	memset(en, 0, sizeof(*en));
518a10482eaSJohn Baldwin 
519a10482eaSJohn Baldwin 	switch (cipher_alg) {
520a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
521a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_ZERO)
522a10482eaSJohn Baldwin 			iv_len = AES_BLOCK_LEN;
523a10482eaSJohn Baldwin 		else
524a10482eaSJohn Baldwin 			iv_len = 0;
525a10482eaSJohn Baldwin 		break;
526a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
527a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_TWO)
528a10482eaSJohn Baldwin 			iv_len = TLS_AEAD_GCM_LEN;
529a10482eaSJohn Baldwin 		else
530a10482eaSJohn Baldwin 			iv_len = TLS_1_3_GCM_IV_LEN;
531a10482eaSJohn Baldwin 		break;
532a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
533a10482eaSJohn Baldwin 		iv_len = TLS_CHACHA20_IV_LEN;
534a10482eaSJohn Baldwin 		break;
535a10482eaSJohn Baldwin 	default:
536a10482eaSJohn Baldwin 		iv_len = 0;
537a10482eaSJohn Baldwin 		break;
538a10482eaSJohn Baldwin 	}
539a10482eaSJohn Baldwin 	switch (auth_alg) {
540a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
541a10482eaSJohn Baldwin 		auth_key_len = SHA1_HASH_LEN;
542a10482eaSJohn Baldwin 		break;
543a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
544a10482eaSJohn Baldwin 		auth_key_len = SHA2_256_HASH_LEN;
545a10482eaSJohn Baldwin 		break;
546a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
547a10482eaSJohn Baldwin 		auth_key_len = SHA2_384_HASH_LEN;
548a10482eaSJohn Baldwin 		break;
549a10482eaSJohn Baldwin 	default:
550a10482eaSJohn Baldwin 		auth_key_len = 0;
551a10482eaSJohn Baldwin 		break;
552a10482eaSJohn Baldwin 	}
553a10482eaSJohn Baldwin 	en->cipher_key = alloc_buffer(cipher_key_len);
554a10482eaSJohn Baldwin 	en->iv = alloc_buffer(iv_len);
555a10482eaSJohn Baldwin 	en->auth_key = alloc_buffer(auth_key_len);
556a10482eaSJohn Baldwin 	en->cipher_algorithm = cipher_alg;
557a10482eaSJohn Baldwin 	en->cipher_key_len = cipher_key_len;
558a10482eaSJohn Baldwin 	en->iv_len = iv_len;
559a10482eaSJohn Baldwin 	en->auth_algorithm = auth_alg;
560a10482eaSJohn Baldwin 	en->auth_key_len = auth_key_len;
561a10482eaSJohn Baldwin 	en->tls_vmajor = TLS_MAJOR_VER_ONE;
562a10482eaSJohn Baldwin 	en->tls_vminor = minor;
563a10482eaSJohn Baldwin 	be64enc(en->rec_seq, seqno);
564a10482eaSJohn Baldwin }
565a10482eaSJohn Baldwin 
566a10482eaSJohn Baldwin static void
567a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en)
568a10482eaSJohn Baldwin {
569a10482eaSJohn Baldwin 	free(__DECONST(void *, en->cipher_key));
570a10482eaSJohn Baldwin 	free(__DECONST(void *, en->iv));
571a10482eaSJohn Baldwin 	free(__DECONST(void *, en->auth_key));
572a10482eaSJohn Baldwin }
573a10482eaSJohn Baldwin 
574a10482eaSJohn Baldwin static const EVP_CIPHER *
575a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en)
576a10482eaSJohn Baldwin {
577a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
578a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
579a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
580a10482eaSJohn Baldwin 		case 128 / 8:
581a10482eaSJohn Baldwin 			return (EVP_aes_128_cbc());
582a10482eaSJohn Baldwin 		case 256 / 8:
583a10482eaSJohn Baldwin 			return (EVP_aes_256_cbc());
584a10482eaSJohn Baldwin 		default:
585a10482eaSJohn Baldwin 			return (NULL);
586a10482eaSJohn Baldwin 		}
587a10482eaSJohn Baldwin 		break;
588a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
589a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
590a10482eaSJohn Baldwin 		case 128 / 8:
591a10482eaSJohn Baldwin 			return (EVP_aes_128_gcm());
592a10482eaSJohn Baldwin 		case 256 / 8:
593a10482eaSJohn Baldwin 			return (EVP_aes_256_gcm());
594a10482eaSJohn Baldwin 		default:
595a10482eaSJohn Baldwin 			return (NULL);
596a10482eaSJohn Baldwin 		}
597a10482eaSJohn Baldwin 		break;
598a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
599a10482eaSJohn Baldwin 		return (EVP_chacha20_poly1305());
600a10482eaSJohn Baldwin 	default:
601a10482eaSJohn Baldwin 		return (NULL);
602a10482eaSJohn Baldwin 	}
603a10482eaSJohn Baldwin }
604a10482eaSJohn Baldwin 
605a10482eaSJohn Baldwin static const EVP_MD *
606a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en)
607a10482eaSJohn Baldwin {
608a10482eaSJohn Baldwin 	switch (en->auth_algorithm) {
609a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
610a10482eaSJohn Baldwin 		return (EVP_sha1());
611a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
612a10482eaSJohn Baldwin 		return (EVP_sha256());
613a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
614a10482eaSJohn Baldwin 		return (EVP_sha384());
615a10482eaSJohn Baldwin 	default:
616a10482eaSJohn Baldwin 		return (NULL);
617a10482eaSJohn Baldwin 	}
618a10482eaSJohn Baldwin }
619a10482eaSJohn Baldwin 
620a10482eaSJohn Baldwin static size_t
621a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en)
622a10482eaSJohn Baldwin {
623a10482eaSJohn Baldwin 	size_t len;
624a10482eaSJohn Baldwin 
625a10482eaSJohn Baldwin 	len = sizeof(struct tls_record_layer);
626a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
627a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
628a10482eaSJohn Baldwin 		if (en->tls_vminor != TLS_MINOR_VER_ZERO)
629a10482eaSJohn Baldwin 			len += AES_BLOCK_LEN;
630a10482eaSJohn Baldwin 		return (len);
631a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
632a10482eaSJohn Baldwin 		if (en->tls_vminor == TLS_MINOR_VER_TWO)
633a10482eaSJohn Baldwin 			len += sizeof(uint64_t);
634a10482eaSJohn Baldwin 		return (len);
635a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
636a10482eaSJohn Baldwin 		return (len);
637a10482eaSJohn Baldwin 	default:
638a10482eaSJohn Baldwin 		return (0);
639a10482eaSJohn Baldwin 	}
640a10482eaSJohn Baldwin }
641a10482eaSJohn Baldwin 
642a10482eaSJohn Baldwin static size_t
643a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en)
644a10482eaSJohn Baldwin {
645a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
646a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
647a10482eaSJohn Baldwin 		switch (en->auth_algorithm) {
648a10482eaSJohn Baldwin 		case CRYPTO_SHA1_HMAC:
649a10482eaSJohn Baldwin 			return (SHA1_HASH_LEN);
650a10482eaSJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
651a10482eaSJohn Baldwin 			return (SHA2_256_HASH_LEN);
652a10482eaSJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
653a10482eaSJohn Baldwin 			return (SHA2_384_HASH_LEN);
654a10482eaSJohn Baldwin 		default:
655a10482eaSJohn Baldwin 			return (0);
656a10482eaSJohn Baldwin 		}
657a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
658a10482eaSJohn Baldwin 		return (AES_GMAC_HASH_LEN);
659a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
660a10482eaSJohn Baldwin 		return (POLY1305_HASH_LEN);
661a10482eaSJohn Baldwin 	default:
662a10482eaSJohn Baldwin 		return (0);
663a10482eaSJohn Baldwin 	}
664a10482eaSJohn Baldwin }
665a10482eaSJohn Baldwin 
666a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */
667a10482eaSJohn Baldwin static size_t
668a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en)
669a10482eaSJohn Baldwin {
670a10482eaSJohn Baldwin 	size_t len;
671a10482eaSJohn Baldwin 
672a10482eaSJohn Baldwin 	len = tls_mac_len(en);
673a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
674a10482eaSJohn Baldwin 		len += AES_BLOCK_LEN;
675a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
676a10482eaSJohn Baldwin 		len++;
677a10482eaSJohn Baldwin 	return (len);
678a10482eaSJohn Baldwin }
679a10482eaSJohn Baldwin 
680*65bd3adbSJohn Baldwin /* Minimum valid record payload size for a given cipher suite. */
681*65bd3adbSJohn Baldwin static size_t
682*65bd3adbSJohn Baldwin tls_minimum_record_payload(struct tls_enable *en)
683*65bd3adbSJohn Baldwin {
684*65bd3adbSJohn Baldwin 	size_t len;
685*65bd3adbSJohn Baldwin 
686*65bd3adbSJohn Baldwin 	len = tls_header_len(en);
687*65bd3adbSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
688*65bd3adbSJohn Baldwin 		len += roundup2(tls_mac_len(en) + 1, AES_BLOCK_LEN);
689*65bd3adbSJohn Baldwin 	else
690*65bd3adbSJohn Baldwin 		len += tls_mac_len(en);
691*65bd3adbSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
692*65bd3adbSJohn Baldwin 		len++;
693*65bd3adbSJohn Baldwin 	return (len - sizeof(struct tls_record_layer));
694*65bd3adbSJohn Baldwin }
695*65bd3adbSJohn Baldwin 
696a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */
697a10482eaSJohn Baldwin static void
698a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len,
699a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad)
700a10482eaSJohn Baldwin {
701a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
702a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
703a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
704a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
705a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
706a10482eaSJohn Baldwin }
707a10482eaSJohn Baldwin 
708a10482eaSJohn Baldwin static void
709a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len,
710a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno,
711a10482eaSJohn Baldwin     struct tls_aead_data *ad)
712a10482eaSJohn Baldwin {
713a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
714a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
715a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
716a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
717a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
718a10482eaSJohn Baldwin }
719a10482eaSJohn Baldwin 
720a10482eaSJohn Baldwin static void
721a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr,
722a10482eaSJohn Baldwin     uint64_t seqno, struct tls_aead_data_13 *ad)
723a10482eaSJohn Baldwin {
724a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
725a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
726a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
727a10482eaSJohn Baldwin 	ad->tls_length = hdr->tls_length;
728a10482eaSJohn Baldwin }
729a10482eaSJohn Baldwin 
730a10482eaSJohn Baldwin static void
731a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr,
732a10482eaSJohn Baldwin     char *nonce)
733a10482eaSJohn Baldwin {
734a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN);
735a10482eaSJohn Baldwin 	memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t));
736a10482eaSJohn Baldwin }
737a10482eaSJohn Baldwin 
738a10482eaSJohn Baldwin static void
739a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce)
740a10482eaSJohn Baldwin {
741a10482eaSJohn Baldwin 	static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN,
742a10482eaSJohn Baldwin 	    "TLS 1.3 nonce length mismatch");
743a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN);
744a10482eaSJohn Baldwin 	*(uint64_t *)(nonce + 4) ^= htobe64(seqno);
745a10482eaSJohn Baldwin }
746a10482eaSJohn Baldwin 
747a10482eaSJohn Baldwin /*
748a10482eaSJohn Baldwin  * Decrypt a TLS record 'len' bytes long at 'src' and store the result at
749a10482eaSJohn Baldwin  * 'dst'.  If the TLS record header length doesn't match or 'dst' doesn't
750a10482eaSJohn Baldwin  * have sufficient room ('avail'), fail the test.
751a10482eaSJohn Baldwin  */
752a10482eaSJohn Baldwin static size_t
753a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src,
754a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
755a10482eaSJohn Baldwin {
756a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
757a10482eaSJohn Baldwin 	struct tls_mac_data aad;
758a10482eaSJohn Baldwin 	const char *iv;
759a10482eaSJohn Baldwin 	char *buf;
760a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
761a10482eaSJohn Baldwin 	int padding;
762a10482eaSJohn Baldwin 
763a10482eaSJohn Baldwin 	hdr = src;
764a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
765a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
766a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
767a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor);
768a10482eaSJohn Baldwin 
769a10482eaSJohn Baldwin 	/* First, decrypt the outer payload into a temporary buffer. */
770a10482eaSJohn Baldwin 	payload_len = len - hdr_len;
771a10482eaSJohn Baldwin 	buf = malloc(payload_len);
772a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
773a10482eaSJohn Baldwin 		iv = en->iv;
774a10482eaSJohn Baldwin 	else
775a10482eaSJohn Baldwin 		iv = (void *)(hdr + 1);
776a10482eaSJohn Baldwin 	ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
777a10482eaSJohn Baldwin 	    (const u_char *)src + hdr_len, buf, payload_len));
778a10482eaSJohn Baldwin 
779a10482eaSJohn Baldwin 	/*
780a10482eaSJohn Baldwin 	 * Copy the last encrypted block to use as the IV for the next
781a10482eaSJohn Baldwin 	 * record for TLS 1.0.
782a10482eaSJohn Baldwin 	 */
783a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
784a10482eaSJohn Baldwin 		memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src +
785a10482eaSJohn Baldwin 		    (len - AES_BLOCK_LEN), AES_BLOCK_LEN);
786a10482eaSJohn Baldwin 
787a10482eaSJohn Baldwin 	/*
788a10482eaSJohn Baldwin 	 * Verify trailing padding and strip.
789a10482eaSJohn Baldwin 	 *
790a10482eaSJohn Baldwin 	 * The kernel always generates the smallest amount of padding.
791a10482eaSJohn Baldwin 	 */
792a10482eaSJohn Baldwin 	padding = buf[payload_len - 1] + 1;
793a10482eaSJohn Baldwin 	ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN);
794a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len >= mac_len + padding);
795a10482eaSJohn Baldwin 	payload_len -= padding;
796a10482eaSJohn Baldwin 
797a10482eaSJohn Baldwin 	/* Verify HMAC. */
798a10482eaSJohn Baldwin 	payload_len -= mac_len;
799a10482eaSJohn Baldwin 	tls_mte_aad(en, payload_len, hdr, seqno, &aad);
800a10482eaSJohn Baldwin 	ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
801a10482eaSJohn Baldwin 	    &aad, sizeof(aad), buf, payload_len, buf + payload_len));
802a10482eaSJohn Baldwin 
803a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len <= avail);
804a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
805a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
806a10482eaSJohn Baldwin 	return (payload_len);
807a10482eaSJohn Baldwin }
808a10482eaSJohn Baldwin 
809a10482eaSJohn Baldwin static size_t
810a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src,
811a10482eaSJohn Baldwin     size_t len, void *dst, uint8_t *record_type)
812a10482eaSJohn Baldwin {
813a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
814a10482eaSJohn Baldwin 	struct tls_aead_data aad;
815a10482eaSJohn Baldwin 	char nonce[12];
816a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
817a10482eaSJohn Baldwin 
818a10482eaSJohn Baldwin 	hdr = src;
819a10482eaSJohn Baldwin 
820a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
821a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
822a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
823a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
824a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO);
825a10482eaSJohn Baldwin 
826a10482eaSJohn Baldwin 	tls_12_aead_aad(en, payload_len, hdr, seqno, &aad);
827a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
828a10482eaSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
829a10482eaSJohn Baldwin 	else
830a10482eaSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
831a10482eaSJohn Baldwin 
832a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
833a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len,
834a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
835a10482eaSJohn Baldwin 
836a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
837a10482eaSJohn Baldwin 	return (payload_len);
838a10482eaSJohn Baldwin }
839a10482eaSJohn Baldwin 
840a10482eaSJohn Baldwin static size_t
841a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src,
842a10482eaSJohn Baldwin     size_t len, void *dst, uint8_t *record_type)
843a10482eaSJohn Baldwin {
844a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
845a10482eaSJohn Baldwin 	struct tls_aead_data_13 aad;
846a10482eaSJohn Baldwin 	char nonce[12];
847a10482eaSJohn Baldwin 	char *buf;
848a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
849a10482eaSJohn Baldwin 
850a10482eaSJohn Baldwin 	hdr = src;
851a10482eaSJohn Baldwin 
852a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
853a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
854a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
855a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len >= 1);
856a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP);
857a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
858a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO);
859a10482eaSJohn Baldwin 
860a10482eaSJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
861a10482eaSJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
862a10482eaSJohn Baldwin 
863a10482eaSJohn Baldwin 	/*
864a10482eaSJohn Baldwin 	 * Have to use a temporary buffer for the output due to the
865a10482eaSJohn Baldwin 	 * record type as the last byte of the trailer.
866a10482eaSJohn Baldwin 	 */
867a10482eaSJohn Baldwin 	buf = malloc(payload_len);
868a10482eaSJohn Baldwin 
869a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
870a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len,
871a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
872a10482eaSJohn Baldwin 
873a10482eaSJohn Baldwin 	/* Trim record type. */
874a10482eaSJohn Baldwin 	*record_type = buf[payload_len - 1];
875a10482eaSJohn Baldwin 	payload_len--;
876a10482eaSJohn Baldwin 
877a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
878a10482eaSJohn Baldwin 	free(buf);
879a10482eaSJohn Baldwin 
880a10482eaSJohn Baldwin 	return (payload_len);
881a10482eaSJohn Baldwin }
882a10482eaSJohn Baldwin 
883a10482eaSJohn Baldwin static size_t
884a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src,
885a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
886a10482eaSJohn Baldwin {
887a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
888a10482eaSJohn Baldwin 	size_t payload_len;
889a10482eaSJohn Baldwin 
890a10482eaSJohn Baldwin 	hdr = src;
891a10482eaSJohn Baldwin 	ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len);
892a10482eaSJohn Baldwin 
893a10482eaSJohn Baldwin 	payload_len = len - (tls_header_len(en) + tls_trailer_len(en));
894a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len <= avail);
895a10482eaSJohn Baldwin 
896a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
897a10482eaSJohn Baldwin 		ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst,
898a10482eaSJohn Baldwin 		    record_type) == payload_len);
899a10482eaSJohn Baldwin 	} else {
900a10482eaSJohn Baldwin 		ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst,
901a10482eaSJohn Baldwin 		    record_type) == payload_len);
902a10482eaSJohn Baldwin 	}
903a10482eaSJohn Baldwin 
904a10482eaSJohn Baldwin 	return (payload_len);
905a10482eaSJohn Baldwin }
906a10482eaSJohn Baldwin 
907a10482eaSJohn Baldwin static size_t
908a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src,
909a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
910a10482eaSJohn Baldwin {
911a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
912a10482eaSJohn Baldwin 		return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail,
913a10482eaSJohn Baldwin 		    record_type));
914a10482eaSJohn Baldwin 	else
915a10482eaSJohn Baldwin 		return (decrypt_tls_aead(en, seqno, src, len, dst, avail,
916a10482eaSJohn Baldwin 		    record_type));
917a10482eaSJohn Baldwin }
918a10482eaSJohn Baldwin 
9193e7f8a8dSJohn Baldwin /*
9203e7f8a8dSJohn Baldwin  * Encrypt a TLS record of type 'record_type' with payload 'len' bytes
9213e7f8a8dSJohn Baldwin  * long at 'src' and store the result at 'dst'.  If 'dst' doesn't have
92264811651SJohn Baldwin  * sufficient room ('avail'), fail the test.  'padding' is the amount
92364811651SJohn Baldwin  * of additional padding to include beyond any amount mandated by the
92464811651SJohn Baldwin  * cipher suite.
9253e7f8a8dSJohn Baldwin  */
9263e7f8a8dSJohn Baldwin static size_t
92764811651SJohn Baldwin encrypt_tls_aes_cbc_mte(struct tls_enable *en, uint8_t record_type,
92864811651SJohn Baldwin     uint64_t seqno, const void *src, size_t len, void *dst, size_t avail,
92964811651SJohn Baldwin     size_t padding)
93064811651SJohn Baldwin {
93164811651SJohn Baldwin 	struct tls_record_layer *hdr;
93264811651SJohn Baldwin 	struct tls_mac_data aad;
93364811651SJohn Baldwin 	char *buf, *iv;
93464811651SJohn Baldwin 	size_t hdr_len, mac_len, record_len;
93564811651SJohn Baldwin 	u_int digest_len, i;
93664811651SJohn Baldwin 
93764811651SJohn Baldwin 	ATF_REQUIRE(padding % 16 == 0);
93864811651SJohn Baldwin 
93964811651SJohn Baldwin 	hdr = dst;
94064811651SJohn Baldwin 	buf = dst;
94164811651SJohn Baldwin 
94264811651SJohn Baldwin 	hdr_len = tls_header_len(en);
94364811651SJohn Baldwin 	mac_len = tls_mac_len(en);
94464811651SJohn Baldwin 	padding += (AES_BLOCK_LEN - (len + mac_len) % AES_BLOCK_LEN);
94564811651SJohn Baldwin 	ATF_REQUIRE(padding > 0 && padding <= 255);
94664811651SJohn Baldwin 
94764811651SJohn Baldwin 	record_len = hdr_len + len + mac_len + padding;
94864811651SJohn Baldwin 	ATF_REQUIRE(record_len <= avail);
94964811651SJohn Baldwin 
95064811651SJohn Baldwin 	hdr->tls_type = record_type;
95164811651SJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
95264811651SJohn Baldwin 	hdr->tls_vminor = en->tls_vminor;
95364811651SJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
95464811651SJohn Baldwin 	iv = (char *)(hdr + 1);
95564811651SJohn Baldwin 	for (i = 0; i < AES_BLOCK_LEN; i++)
95664811651SJohn Baldwin 		iv[i] = rdigit();
95764811651SJohn Baldwin 
95864811651SJohn Baldwin 	/* Copy plaintext to ciphertext region. */
95964811651SJohn Baldwin 	memcpy(buf + hdr_len, src, len);
96064811651SJohn Baldwin 
96164811651SJohn Baldwin 	/* Compute HMAC. */
96264811651SJohn Baldwin 	tls_mte_aad(en, len, hdr, seqno, &aad);
96364811651SJohn Baldwin 	ATF_REQUIRE(compute_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
96464811651SJohn Baldwin 	    &aad, sizeof(aad), src, len, buf + hdr_len + len, &digest_len));
96564811651SJohn Baldwin 	ATF_REQUIRE(digest_len == mac_len);
96664811651SJohn Baldwin 
96764811651SJohn Baldwin 	/* Store padding. */
96864811651SJohn Baldwin 	for (i = 0; i < padding; i++)
96964811651SJohn Baldwin 		buf[hdr_len + len + mac_len + i] = padding - 1;
97064811651SJohn Baldwin 
97164811651SJohn Baldwin 	/* Encrypt the record. */
97264811651SJohn Baldwin 	ATF_REQUIRE(cbc_encrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
97364811651SJohn Baldwin 	    buf + hdr_len, buf + hdr_len, len + mac_len + padding));
97464811651SJohn Baldwin 
97564811651SJohn Baldwin 	return (record_len);
97664811651SJohn Baldwin }
97764811651SJohn Baldwin 
97864811651SJohn Baldwin static size_t
9793e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
9803e7f8a8dSJohn Baldwin     const void *src, size_t len, void *dst)
9813e7f8a8dSJohn Baldwin {
9823e7f8a8dSJohn Baldwin 	struct tls_record_layer *hdr;
9833e7f8a8dSJohn Baldwin 	struct tls_aead_data aad;
9843e7f8a8dSJohn Baldwin 	char nonce[12];
9853e7f8a8dSJohn Baldwin 	size_t hdr_len, mac_len, record_len;
9863e7f8a8dSJohn Baldwin 
9873e7f8a8dSJohn Baldwin 	hdr = dst;
9883e7f8a8dSJohn Baldwin 
9893e7f8a8dSJohn Baldwin 	hdr_len = tls_header_len(en);
9903e7f8a8dSJohn Baldwin 	mac_len = tls_mac_len(en);
9913e7f8a8dSJohn Baldwin 	record_len = hdr_len + len + mac_len;
9923e7f8a8dSJohn Baldwin 
9933e7f8a8dSJohn Baldwin 	hdr->tls_type = record_type;
9943e7f8a8dSJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
9953e7f8a8dSJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
9963e7f8a8dSJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
9973e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
9983e7f8a8dSJohn Baldwin 		memcpy(hdr + 1, &seqno, sizeof(seqno));
9993e7f8a8dSJohn Baldwin 
10003e7f8a8dSJohn Baldwin 	tls_12_aead_aad(en, len, hdr, seqno, &aad);
10013e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
10023e7f8a8dSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
10033e7f8a8dSJohn Baldwin 	else
10043e7f8a8dSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
10053e7f8a8dSJohn Baldwin 
10063e7f8a8dSJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
10073e7f8a8dSJohn Baldwin 	    &aad, sizeof(aad), src, (char *)dst + hdr_len, len,
10083e7f8a8dSJohn Baldwin 	    (char *)dst + hdr_len + len, mac_len));
10093e7f8a8dSJohn Baldwin 
10103e7f8a8dSJohn Baldwin 	return (record_len);
10113e7f8a8dSJohn Baldwin }
10123e7f8a8dSJohn Baldwin 
10133e7f8a8dSJohn Baldwin static size_t
101405a1d0f5SJohn Baldwin encrypt_tls_13_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
101505a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t padding)
101605a1d0f5SJohn Baldwin {
101705a1d0f5SJohn Baldwin 	struct tls_record_layer *hdr;
101805a1d0f5SJohn Baldwin 	struct tls_aead_data_13 aad;
101905a1d0f5SJohn Baldwin 	char nonce[12];
102005a1d0f5SJohn Baldwin 	char *buf;
102105a1d0f5SJohn Baldwin 	size_t hdr_len, mac_len, record_len;
102205a1d0f5SJohn Baldwin 
102305a1d0f5SJohn Baldwin 	hdr = dst;
102405a1d0f5SJohn Baldwin 
102505a1d0f5SJohn Baldwin 	hdr_len = tls_header_len(en);
102605a1d0f5SJohn Baldwin 	mac_len = tls_mac_len(en);
102705a1d0f5SJohn Baldwin 	record_len = hdr_len + len + 1 + padding + mac_len;
102805a1d0f5SJohn Baldwin 
102905a1d0f5SJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP;
103005a1d0f5SJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
103105a1d0f5SJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
103205a1d0f5SJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
103305a1d0f5SJohn Baldwin 
103405a1d0f5SJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
103505a1d0f5SJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
103605a1d0f5SJohn Baldwin 
103705a1d0f5SJohn Baldwin 	/*
103805a1d0f5SJohn Baldwin 	 * Have to use a temporary buffer for the input so that the record
103905a1d0f5SJohn Baldwin 	 * type can be appended.
104005a1d0f5SJohn Baldwin 	 */
104105a1d0f5SJohn Baldwin 	buf = malloc(len + 1 + padding);
104205a1d0f5SJohn Baldwin 	memcpy(buf, src, len);
104305a1d0f5SJohn Baldwin 	buf[len] = record_type;
104405a1d0f5SJohn Baldwin 	memset(buf + len + 1, 0, padding);
104505a1d0f5SJohn Baldwin 
104605a1d0f5SJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
104705a1d0f5SJohn Baldwin 	    &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding,
104805a1d0f5SJohn Baldwin 	    (char *)dst + hdr_len + len + 1 + padding, mac_len));
104905a1d0f5SJohn Baldwin 
105005a1d0f5SJohn Baldwin 	free(buf);
105105a1d0f5SJohn Baldwin 
105205a1d0f5SJohn Baldwin 	return (record_len);
105305a1d0f5SJohn Baldwin }
105405a1d0f5SJohn Baldwin 
105505a1d0f5SJohn Baldwin static size_t
10563e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
105705a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, size_t padding)
10583e7f8a8dSJohn Baldwin {
10593e7f8a8dSJohn Baldwin 	size_t record_len;
10603e7f8a8dSJohn Baldwin 
106105a1d0f5SJohn Baldwin 	record_len = tls_header_len(en) + len + padding + tls_trailer_len(en);
10623e7f8a8dSJohn Baldwin 	ATF_REQUIRE(record_len <= avail);
10633e7f8a8dSJohn Baldwin 
106405a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
106505a1d0f5SJohn Baldwin 		ATF_REQUIRE(padding == 0);
106605a1d0f5SJohn Baldwin 		ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src,
106705a1d0f5SJohn Baldwin 		    len, dst) == record_len);
106805a1d0f5SJohn Baldwin 	} else
106905a1d0f5SJohn Baldwin 		ATF_REQUIRE(encrypt_tls_13_aead(en, record_type, seqno, src,
107005a1d0f5SJohn Baldwin 		    len, dst, padding) == record_len);
10713e7f8a8dSJohn Baldwin 
10723e7f8a8dSJohn Baldwin 	return (record_len);
10733e7f8a8dSJohn Baldwin }
10743e7f8a8dSJohn Baldwin 
10753e7f8a8dSJohn Baldwin static size_t
10763e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
107705a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, size_t padding)
10783e7f8a8dSJohn Baldwin {
107964811651SJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
108064811651SJohn Baldwin 		return (encrypt_tls_aes_cbc_mte(en, record_type, seqno, src,
108164811651SJohn Baldwin 		    len, dst, avail, padding));
108264811651SJohn Baldwin 	else
108364811651SJohn Baldwin 		return (encrypt_tls_aead(en, record_type, seqno, src, len,
108464811651SJohn Baldwin 		    dst, avail, padding));
10853e7f8a8dSJohn Baldwin }
10863e7f8a8dSJohn Baldwin 
1087a10482eaSJohn Baldwin static void
10882400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en,
10892400a7b1SJohn Baldwin     uint64_t seqno, size_t len)
1090a10482eaSJohn Baldwin {
1091a10482eaSJohn Baldwin 	struct kevent ev;
1092a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
1093a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
1094a10482eaSJohn Baldwin 	size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written;
1095a10482eaSJohn Baldwin 	ssize_t rv;
1096a10482eaSJohn Baldwin 	int kq, sockets[2];
1097a10482eaSJohn Baldwin 	uint8_t record_type;
1098a10482eaSJohn Baldwin 
1099a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
1100a10482eaSJohn Baldwin 	decrypted = malloc(len);
1101a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
1102a10482eaSJohn Baldwin 	    tls_trailer_len(en);
1103a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1104a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
1105a10482eaSJohn Baldwin 
1106a10482eaSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
1107a10482eaSJohn Baldwin 
11082400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1109a10482eaSJohn Baldwin 
1110a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1111a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
1112ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
1113a10482eaSJohn Baldwin 
1114a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
1115a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
1116a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
1117a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
1118a10482eaSJohn Baldwin 
1119a10482eaSJohn Baldwin 	decrypted_len = 0;
1120a10482eaSJohn Baldwin 	outbuf_len = 0;
1121a10482eaSJohn Baldwin 	written = 0;
1122a10482eaSJohn Baldwin 
1123a10482eaSJohn Baldwin 	while (decrypted_len != len) {
1124a10482eaSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
1125a10482eaSJohn Baldwin 
1126a10482eaSJohn Baldwin 		switch (ev.filter) {
1127a10482eaSJohn Baldwin 		case EVFILT_WRITE:
1128a10482eaSJohn Baldwin 			/* Try to write any remaining data. */
1129a10482eaSJohn Baldwin 			rv = write(ev.ident, plaintext + written,
1130a10482eaSJohn Baldwin 			    len - written);
1131a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
1132a10482eaSJohn Baldwin 			    "failed to write to socket");
1133a10482eaSJohn Baldwin 			written += rv;
1134a10482eaSJohn Baldwin 			if (written == len) {
1135a10482eaSJohn Baldwin 				ev.flags = EV_DISABLE;
1136a10482eaSJohn Baldwin 				ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
1137a10482eaSJohn Baldwin 				    NULL) == 0);
1138a10482eaSJohn Baldwin 			}
1139a10482eaSJohn Baldwin 			break;
1140a10482eaSJohn Baldwin 
1141a10482eaSJohn Baldwin 		case EVFILT_READ:
1142a10482eaSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
1143a10482eaSJohn Baldwin 
1144a10482eaSJohn Baldwin 			/*
1145a10482eaSJohn Baldwin 			 * Try to read data for the next TLS record
1146a10482eaSJohn Baldwin 			 * into outbuf.  Start by reading the header
1147a10482eaSJohn Baldwin 			 * to determine how much additional data to
1148a10482eaSJohn Baldwin 			 * read.
1149a10482eaSJohn Baldwin 			 */
1150a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer)) {
1151a10482eaSJohn Baldwin 				rv = read(ev.ident, outbuf + outbuf_len,
1152a10482eaSJohn Baldwin 				    sizeof(struct tls_record_layer) -
1153a10482eaSJohn Baldwin 				    outbuf_len);
1154a10482eaSJohn Baldwin 				ATF_REQUIRE_MSG(rv > 0,
1155a10482eaSJohn Baldwin 				    "failed to read from socket");
1156a10482eaSJohn Baldwin 				outbuf_len += rv;
1157a10482eaSJohn Baldwin 			}
1158a10482eaSJohn Baldwin 
1159a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer))
1160a10482eaSJohn Baldwin 				break;
1161a10482eaSJohn Baldwin 
1162a10482eaSJohn Baldwin 			record_len = sizeof(struct tls_record_layer) +
1163a10482eaSJohn Baldwin 			    ntohs(hdr->tls_length);
1164d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len <= outbuf_cap);
1165d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len > outbuf_len);
1166a10482eaSJohn Baldwin 			rv = read(ev.ident, outbuf + outbuf_len,
1167a10482eaSJohn Baldwin 			    record_len - outbuf_len);
1168a10482eaSJohn Baldwin 			if (rv == -1 && errno == EAGAIN)
1169a10482eaSJohn Baldwin 				break;
1170a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0, "failed to read from socket");
1171a10482eaSJohn Baldwin 
1172a10482eaSJohn Baldwin 			outbuf_len += rv;
1173a10482eaSJohn Baldwin 			if (outbuf_len == record_len) {
1174a10482eaSJohn Baldwin 				decrypted_len += decrypt_tls_record(en, seqno,
1175a10482eaSJohn Baldwin 				    outbuf, outbuf_len,
1176a10482eaSJohn Baldwin 				    decrypted + decrypted_len,
1177a10482eaSJohn Baldwin 				    len - decrypted_len, &record_type);
1178a10482eaSJohn Baldwin 				ATF_REQUIRE(record_type == TLS_RLTYPE_APP);
1179a10482eaSJohn Baldwin 
1180a10482eaSJohn Baldwin 				seqno++;
1181a10482eaSJohn Baldwin 				outbuf_len = 0;
1182a10482eaSJohn Baldwin 			}
1183a10482eaSJohn Baldwin 			break;
1184a10482eaSJohn Baldwin 		}
1185a10482eaSJohn Baldwin 	}
1186a10482eaSJohn Baldwin 
1187a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG(written == decrypted_len,
1188a10482eaSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", decrypted_len, written);
1189a10482eaSJohn Baldwin 
1190a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1191a10482eaSJohn Baldwin 
1192a10482eaSJohn Baldwin 	free(outbuf);
1193a10482eaSJohn Baldwin 	free(decrypted);
1194a10482eaSJohn Baldwin 	free(plaintext);
1195a10482eaSJohn Baldwin 
11962c105205SJohn Baldwin 	close_sockets(sockets);
1197694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
1198a10482eaSJohn Baldwin }
1199a10482eaSJohn Baldwin 
1200a10482eaSJohn Baldwin static void
1201a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len)
1202a10482eaSJohn Baldwin {
1203a10482eaSJohn Baldwin 	struct msghdr msg;
1204a10482eaSJohn Baldwin 	struct cmsghdr *cmsg;
1205a10482eaSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(type))];
1206a10482eaSJohn Baldwin 	struct iovec iov;
1207a10482eaSJohn Baldwin 
1208a10482eaSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
1209a10482eaSJohn Baldwin 
1210a10482eaSJohn Baldwin 	msg.msg_control = cbuf;
1211a10482eaSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
1212a10482eaSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
1213a10482eaSJohn Baldwin 	cmsg->cmsg_level = IPPROTO_TCP;
1214a10482eaSJohn Baldwin 	cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
1215a10482eaSJohn Baldwin 	cmsg->cmsg_len = CMSG_LEN(sizeof(type));
1216a10482eaSJohn Baldwin 	*(uint8_t *)CMSG_DATA(cmsg) = type;
1217a10482eaSJohn Baldwin 
1218a10482eaSJohn Baldwin 	iov.iov_base = data;
1219a10482eaSJohn Baldwin 	iov.iov_len = len;
1220a10482eaSJohn Baldwin 	msg.msg_iov = &iov;
1221a10482eaSJohn Baldwin 	msg.msg_iovlen = 1;
1222a10482eaSJohn Baldwin 
1223a10482eaSJohn Baldwin 	ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len);
1224a10482eaSJohn Baldwin }
1225a10482eaSJohn Baldwin 
1226a10482eaSJohn Baldwin static void
12272400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en,
12282400a7b1SJohn Baldwin     uint64_t seqno, uint8_t type, size_t len)
1229a10482eaSJohn Baldwin {
1230a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
1231a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
1232a10482eaSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
1233a10482eaSJohn Baldwin 	ssize_t rv;
1234a10482eaSJohn Baldwin 	int sockets[2];
1235a10482eaSJohn Baldwin 	uint8_t record_type;
1236a10482eaSJohn Baldwin 
1237a10482eaSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1238a10482eaSJohn Baldwin 
1239a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
1240a10482eaSJohn Baldwin 	decrypted = malloc(len);
1241a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1242a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1243a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
1244a10482eaSJohn Baldwin 
12452400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1246a10482eaSJohn Baldwin 
1247a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1248a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
1249ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
1250a10482eaSJohn Baldwin 
1251a10482eaSJohn Baldwin 	fd_set_blocking(sockets[0]);
1252a10482eaSJohn Baldwin 	fd_set_blocking(sockets[1]);
1253a10482eaSJohn Baldwin 
1254a10482eaSJohn Baldwin 	ktls_send_control_message(sockets[1], type, plaintext, len);
1255a10482eaSJohn Baldwin 
1256a10482eaSJohn Baldwin 	/*
1257a10482eaSJohn Baldwin 	 * First read the header to determine how much additional data
1258a10482eaSJohn Baldwin 	 * to read.
1259a10482eaSJohn Baldwin 	 */
1260a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1261a10482eaSJohn Baldwin 	ATF_REQUIRE(rv == sizeof(struct tls_record_layer));
1262a10482eaSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
1263a10482eaSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
1264d71830cdSJohn Baldwin 	ATF_REQUIRE(record_len <= outbuf_cap);
1265a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
1266a10482eaSJohn Baldwin 	    payload_len);
1267a10482eaSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)payload_len);
1268a10482eaSJohn Baldwin 
1269a10482eaSJohn Baldwin 	rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len,
1270a10482eaSJohn Baldwin 	    &record_type);
1271a10482eaSJohn Baldwin 
1272a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG((ssize_t)len == rv,
1273a10482eaSJohn Baldwin 	    "read %zd decrypted bytes, but wrote %zu", rv, len);
1274a10482eaSJohn Baldwin 	ATF_REQUIRE(record_type == type);
1275a10482eaSJohn Baldwin 
1276a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1277a10482eaSJohn Baldwin 
1278a10482eaSJohn Baldwin 	free(outbuf);
1279a10482eaSJohn Baldwin 	free(decrypted);
1280a10482eaSJohn Baldwin 	free(plaintext);
1281a10482eaSJohn Baldwin 
12822c105205SJohn Baldwin 	close_sockets(sockets);
1283a10482eaSJohn Baldwin }
1284a10482eaSJohn Baldwin 
12850ff2a12aSJohn Baldwin static void
12862400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en,
12872400a7b1SJohn Baldwin     uint64_t seqno)
12880ff2a12aSJohn Baldwin {
12890ff2a12aSJohn Baldwin 	struct tls_record_layer *hdr;
12900ff2a12aSJohn Baldwin 	char *outbuf;
12910ff2a12aSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
12920ff2a12aSJohn Baldwin 	ssize_t rv;
12930ff2a12aSJohn Baldwin 	int sockets[2];
12940ff2a12aSJohn Baldwin 	uint8_t record_type;
12950ff2a12aSJohn Baldwin 
12960ff2a12aSJohn Baldwin 	outbuf_cap = tls_header_len(en) + tls_trailer_len(en);
12970ff2a12aSJohn Baldwin 	outbuf = malloc(outbuf_cap);
12980ff2a12aSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
12990ff2a12aSJohn Baldwin 
13002400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
13010ff2a12aSJohn Baldwin 
13020ff2a12aSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
13030ff2a12aSJohn Baldwin 	    sizeof(*en)) == 0);
1304ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
13050ff2a12aSJohn Baldwin 
13060ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[0]);
13070ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[1]);
13080ff2a12aSJohn Baldwin 
13095de79eedSMark Johnston 	/*
13105de79eedSMark Johnston 	 * A write of zero bytes should send an empty fragment only for
13115de79eedSMark Johnston 	 * TLS 1.0, otherwise an error should be raised.
13125de79eedSMark Johnston 	 */
13130ff2a12aSJohn Baldwin 	rv = write(sockets[1], NULL, 0);
13145de79eedSMark Johnston 	if (rv == 0) {
13155de79eedSMark Johnston 		ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC);
13165de79eedSMark Johnston 		ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO);
13175de79eedSMark Johnston 	} else {
13185de79eedSMark Johnston 		ATF_REQUIRE(rv == -1);
13195de79eedSMark Johnston 		ATF_REQUIRE(errno == EINVAL);
13205de79eedSMark Johnston 		goto out;
13215de79eedSMark Johnston 	}
13220ff2a12aSJohn Baldwin 
13230ff2a12aSJohn Baldwin 	/*
13240ff2a12aSJohn Baldwin 	 * First read the header to determine how much additional data
13250ff2a12aSJohn Baldwin 	 * to read.
13260ff2a12aSJohn Baldwin 	 */
13270ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
13280ff2a12aSJohn Baldwin 	ATF_REQUIRE(rv == sizeof(struct tls_record_layer));
13290ff2a12aSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
13300ff2a12aSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
13310ff2a12aSJohn Baldwin 	ATF_REQUIRE(record_len <= outbuf_cap);
13320ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
13330ff2a12aSJohn Baldwin 	    payload_len);
13340ff2a12aSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)payload_len);
13350ff2a12aSJohn Baldwin 
13360ff2a12aSJohn Baldwin 	rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0,
13370ff2a12aSJohn Baldwin 	    &record_type);
13380ff2a12aSJohn Baldwin 
13390ff2a12aSJohn Baldwin 	ATF_REQUIRE_MSG(rv == 0,
13400ff2a12aSJohn Baldwin 	    "read %zd decrypted bytes for an empty fragment", rv);
13410ff2a12aSJohn Baldwin 	ATF_REQUIRE(record_type == TLS_RLTYPE_APP);
13420ff2a12aSJohn Baldwin 
13435de79eedSMark Johnston out:
13440ff2a12aSJohn Baldwin 	free(outbuf);
13450ff2a12aSJohn Baldwin 
13462c105205SJohn Baldwin 	close_sockets(sockets);
13470ff2a12aSJohn Baldwin }
13480ff2a12aSJohn Baldwin 
13493e7f8a8dSJohn Baldwin static size_t
13503e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type,
13513e7f8a8dSJohn Baldwin     void *data, size_t len)
13523e7f8a8dSJohn Baldwin {
13533e7f8a8dSJohn Baldwin 	struct msghdr msg;
13543e7f8a8dSJohn Baldwin 	struct cmsghdr *cmsg;
13553e7f8a8dSJohn Baldwin 	struct tls_get_record *tgr;
13563e7f8a8dSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(*tgr))];
13573e7f8a8dSJohn Baldwin 	struct iovec iov;
13583e7f8a8dSJohn Baldwin 	ssize_t rv;
13593e7f8a8dSJohn Baldwin 
13603e7f8a8dSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
13613e7f8a8dSJohn Baldwin 
13623e7f8a8dSJohn Baldwin 	msg.msg_control = cbuf;
13633e7f8a8dSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
13643e7f8a8dSJohn Baldwin 
13653e7f8a8dSJohn Baldwin 	iov.iov_base = data;
13663e7f8a8dSJohn Baldwin 	iov.iov_len = len;
13673e7f8a8dSJohn Baldwin 	msg.msg_iov = &iov;
13683e7f8a8dSJohn Baldwin 	msg.msg_iovlen = 1;
13693e7f8a8dSJohn Baldwin 
13703e7f8a8dSJohn Baldwin 	ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0);
13713e7f8a8dSJohn Baldwin 
13723e7f8a8dSJohn Baldwin 	ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR);
13733e7f8a8dSJohn Baldwin 
13743e7f8a8dSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
13753e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg != NULL);
13763e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP);
13773e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD);
13783e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr)));
13793e7f8a8dSJohn Baldwin 
13803e7f8a8dSJohn Baldwin 	tgr = (struct tls_get_record *)CMSG_DATA(cmsg);
13813e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_type == record_type);
13823e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor);
138305a1d0f5SJohn Baldwin 	/* XXX: Not sure if this is what OpenSSL expects? */
138405a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
138505a1d0f5SJohn Baldwin 		ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO);
138605a1d0f5SJohn Baldwin 	else
13873e7f8a8dSJohn Baldwin 		ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor);
13883e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_length == htons(rv));
13893e7f8a8dSJohn Baldwin 
13903e7f8a8dSJohn Baldwin 	return (rv);
13913e7f8a8dSJohn Baldwin }
13923e7f8a8dSJohn Baldwin 
13933e7f8a8dSJohn Baldwin static void
13942400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en,
13952400a7b1SJohn Baldwin     uint64_t seqno, size_t len, size_t padding)
13963e7f8a8dSJohn Baldwin {
13973e7f8a8dSJohn Baldwin 	struct kevent ev;
13983e7f8a8dSJohn Baldwin 	char *plaintext, *received, *outbuf;
13993e7f8a8dSJohn Baldwin 	size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written;
14003e7f8a8dSJohn Baldwin 	ssize_t rv;
14013e7f8a8dSJohn Baldwin 	int kq, sockets[2];
14023e7f8a8dSJohn Baldwin 
14033e7f8a8dSJohn Baldwin 	plaintext = alloc_buffer(len);
14043e7f8a8dSJohn Baldwin 	received = malloc(len);
14053e7f8a8dSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
14063e7f8a8dSJohn Baldwin 	    tls_trailer_len(en);
14073e7f8a8dSJohn Baldwin 	outbuf = malloc(outbuf_cap);
14083e7f8a8dSJohn Baldwin 
14093e7f8a8dSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
14103e7f8a8dSJohn Baldwin 
14112400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
14123e7f8a8dSJohn Baldwin 
14133e7f8a8dSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
14143e7f8a8dSJohn Baldwin 	    sizeof(*en)) == 0);
1415ea4ebdcbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
14163e7f8a8dSJohn Baldwin 
14173e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
14183e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
14193e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
14203e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
14213e7f8a8dSJohn Baldwin 
14223e7f8a8dSJohn Baldwin 	received_len = 0;
14233e7f8a8dSJohn Baldwin 	outbuf_len = 0;
14243e7f8a8dSJohn Baldwin 	written = 0;
14253e7f8a8dSJohn Baldwin 
14263e7f8a8dSJohn Baldwin 	while (received_len != len) {
14273e7f8a8dSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
14283e7f8a8dSJohn Baldwin 
14293e7f8a8dSJohn Baldwin 		switch (ev.filter) {
14303e7f8a8dSJohn Baldwin 		case EVFILT_WRITE:
14313e7f8a8dSJohn Baldwin 			/*
14323e7f8a8dSJohn Baldwin 			 * Compose the next TLS record to send.
14333e7f8a8dSJohn Baldwin 			 */
14343e7f8a8dSJohn Baldwin 			if (outbuf_len == 0) {
14353e7f8a8dSJohn Baldwin 				ATF_REQUIRE(written < len);
14363e7f8a8dSJohn Baldwin 				todo = len - written;
143705a1d0f5SJohn Baldwin 				if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding)
143805a1d0f5SJohn Baldwin 					todo = TLS_MAX_MSG_SIZE_V10_2 - padding;
14393e7f8a8dSJohn Baldwin 				outbuf_len = encrypt_tls_record(en,
14403e7f8a8dSJohn Baldwin 				    TLS_RLTYPE_APP, seqno, plaintext + written,
144105a1d0f5SJohn Baldwin 				    todo, outbuf, outbuf_cap, padding);
14423e7f8a8dSJohn Baldwin 				outbuf_sent = 0;
14433e7f8a8dSJohn Baldwin 				written += todo;
14443e7f8a8dSJohn Baldwin 				seqno++;
14453e7f8a8dSJohn Baldwin 			}
14463e7f8a8dSJohn Baldwin 
14473e7f8a8dSJohn Baldwin 			/*
14483e7f8a8dSJohn Baldwin 			 * Try to write the remainder of the current
14493e7f8a8dSJohn Baldwin 			 * TLS record.
14503e7f8a8dSJohn Baldwin 			 */
14513e7f8a8dSJohn Baldwin 			rv = write(ev.ident, outbuf + outbuf_sent,
14523e7f8a8dSJohn Baldwin 			    outbuf_len - outbuf_sent);
14533e7f8a8dSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
14543e7f8a8dSJohn Baldwin 			    "failed to write to socket");
14553e7f8a8dSJohn Baldwin 			outbuf_sent += rv;
14563e7f8a8dSJohn Baldwin 			if (outbuf_sent == outbuf_len) {
14573e7f8a8dSJohn Baldwin 				outbuf_len = 0;
14583e7f8a8dSJohn Baldwin 				if (written == len) {
14593e7f8a8dSJohn Baldwin 					ev.flags = EV_DISABLE;
14603e7f8a8dSJohn Baldwin 					ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
14613e7f8a8dSJohn Baldwin 					    NULL) == 0);
14623e7f8a8dSJohn Baldwin 				}
14633e7f8a8dSJohn Baldwin 			}
14643e7f8a8dSJohn Baldwin 			break;
14653e7f8a8dSJohn Baldwin 
14663e7f8a8dSJohn Baldwin 		case EVFILT_READ:
14673e7f8a8dSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
14683e7f8a8dSJohn Baldwin 
14693e7f8a8dSJohn Baldwin 			rv = ktls_receive_tls_record(en, ev.ident,
14703e7f8a8dSJohn Baldwin 			    TLS_RLTYPE_APP, received + received_len,
14713e7f8a8dSJohn Baldwin 			    len - received_len);
14723e7f8a8dSJohn Baldwin 			received_len += rv;
14733e7f8a8dSJohn Baldwin 			break;
14743e7f8a8dSJohn Baldwin 		}
14753e7f8a8dSJohn Baldwin 	}
14763e7f8a8dSJohn Baldwin 
14773e7f8a8dSJohn Baldwin 	ATF_REQUIRE_MSG(written == received_len,
14783e7f8a8dSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", received_len, written);
14793e7f8a8dSJohn Baldwin 
14803e7f8a8dSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, received, len) == 0);
14813e7f8a8dSJohn Baldwin 
14823e7f8a8dSJohn Baldwin 	free(outbuf);
14833e7f8a8dSJohn Baldwin 	free(received);
14843e7f8a8dSJohn Baldwin 	free(plaintext);
14853e7f8a8dSJohn Baldwin 
14862c105205SJohn Baldwin 	close_sockets(sockets);
1487694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
14883e7f8a8dSJohn Baldwin }
14893e7f8a8dSJohn Baldwin 
1490*65bd3adbSJohn Baldwin static void
1491*65bd3adbSJohn Baldwin ktls_receive_tls_error(int fd, int expected_error)
1492*65bd3adbSJohn Baldwin {
1493*65bd3adbSJohn Baldwin 	struct msghdr msg;
1494*65bd3adbSJohn Baldwin 	struct tls_get_record *tgr;
1495*65bd3adbSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(*tgr))];
1496*65bd3adbSJohn Baldwin 	char buf[64];
1497*65bd3adbSJohn Baldwin 	struct iovec iov;
1498*65bd3adbSJohn Baldwin 
1499*65bd3adbSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
1500*65bd3adbSJohn Baldwin 
1501*65bd3adbSJohn Baldwin 	msg.msg_control = cbuf;
1502*65bd3adbSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
1503*65bd3adbSJohn Baldwin 
1504*65bd3adbSJohn Baldwin 	iov.iov_base = buf;
1505*65bd3adbSJohn Baldwin 	iov.iov_len = sizeof(buf);
1506*65bd3adbSJohn Baldwin 	msg.msg_iov = &iov;
1507*65bd3adbSJohn Baldwin 	msg.msg_iovlen = 1;
1508*65bd3adbSJohn Baldwin 
1509*65bd3adbSJohn Baldwin 	ATF_REQUIRE(recvmsg(fd, &msg, 0) == -1);
1510*65bd3adbSJohn Baldwin 	if (expected_error != 0)
1511*65bd3adbSJohn Baldwin 		ATF_REQUIRE(errno == expected_error);
1512*65bd3adbSJohn Baldwin }
1513*65bd3adbSJohn Baldwin 
1514*65bd3adbSJohn Baldwin static void
1515*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(const atf_tc_t *tc, struct tls_enable *en,
1516*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len, ssize_t offset)
1517*65bd3adbSJohn Baldwin {
1518*65bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
1519*65bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
1520*65bd3adbSJohn Baldwin 	ssize_t rv;
1521*65bd3adbSJohn Baldwin 	int sockets[2];
1522*65bd3adbSJohn Baldwin 
1523*65bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1524*65bd3adbSJohn Baldwin 
1525*65bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
1526*65bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1527*65bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1528*65bd3adbSJohn Baldwin 
1529*65bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1530*65bd3adbSJohn Baldwin 
1531*65bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1532*65bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
1533*65bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
1534*65bd3adbSJohn Baldwin 
1535*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
1536*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
1537*65bd3adbSJohn Baldwin 
1538*65bd3adbSJohn Baldwin 	outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno,
1539*65bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
1540*65bd3adbSJohn Baldwin 
1541*65bd3adbSJohn Baldwin 	/* A negative offset is an offset from the end. */
1542*65bd3adbSJohn Baldwin 	if (offset < 0)
1543*65bd3adbSJohn Baldwin 		offset += outbuf_len;
1544*65bd3adbSJohn Baldwin 	outbuf[offset] ^= 0x01;
1545*65bd3adbSJohn Baldwin 
1546*65bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1547*65bd3adbSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)outbuf_len);
1548*65bd3adbSJohn Baldwin 
1549*65bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EBADMSG);
1550*65bd3adbSJohn Baldwin 
1551*65bd3adbSJohn Baldwin 	free(outbuf);
1552*65bd3adbSJohn Baldwin 	free(plaintext);
1553*65bd3adbSJohn Baldwin 
1554*65bd3adbSJohn Baldwin 	close_sockets(sockets);
1555*65bd3adbSJohn Baldwin }
1556*65bd3adbSJohn Baldwin 
1557*65bd3adbSJohn Baldwin static void
1558*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(const atf_tc_t *tc, struct tls_enable *en,
1559*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1560*65bd3adbSJohn Baldwin {
1561*65bd3adbSJohn Baldwin 	ATF_REQUIRE(tls_header_len(en) > sizeof(struct tls_record_layer));
1562*65bd3adbSJohn Baldwin 
1563*65bd3adbSJohn Baldwin 	/* Corrupt the first byte of the explicit IV after the header. */
1564*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len,
1565*65bd3adbSJohn Baldwin 	    sizeof(struct tls_record_layer));
1566*65bd3adbSJohn Baldwin }
1567*65bd3adbSJohn Baldwin 
1568*65bd3adbSJohn Baldwin static void
1569*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(const atf_tc_t *tc, struct tls_enable *en,
1570*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1571*65bd3adbSJohn Baldwin {
1572*65bd3adbSJohn Baldwin 	ATF_REQUIRE(len > 0);
1573*65bd3adbSJohn Baldwin 
1574*65bd3adbSJohn Baldwin 	/* Corrupt the first ciphertext byte after the header. */
1575*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len,
1576*65bd3adbSJohn Baldwin 	    tls_header_len(en));
1577*65bd3adbSJohn Baldwin }
1578*65bd3adbSJohn Baldwin 
1579*65bd3adbSJohn Baldwin static void
1580*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(const atf_tc_t *tc, struct tls_enable *en,
1581*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1582*65bd3adbSJohn Baldwin {
1583*65bd3adbSJohn Baldwin 	size_t offset;
1584*65bd3adbSJohn Baldwin 
1585*65bd3adbSJohn Baldwin 	/* Corrupt the first byte of the MAC. */
1586*65bd3adbSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
1587*65bd3adbSJohn Baldwin 		offset = tls_header_len(en) + len;
1588*65bd3adbSJohn Baldwin 	else
1589*65bd3adbSJohn Baldwin 		offset = -tls_mac_len(en);
1590*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len, offset);
1591*65bd3adbSJohn Baldwin }
1592*65bd3adbSJohn Baldwin 
1593*65bd3adbSJohn Baldwin static void
1594*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(const atf_tc_t *tc, struct tls_enable *en,
1595*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1596*65bd3adbSJohn Baldwin {
1597*65bd3adbSJohn Baldwin 	ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC);
1598*65bd3adbSJohn Baldwin 
1599*65bd3adbSJohn Baldwin 	/* Corrupt the last byte of the padding. */
1600*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_record(tc, en, seqno, len, -1);
1601*65bd3adbSJohn Baldwin }
1602*65bd3adbSJohn Baldwin 
1603*65bd3adbSJohn Baldwin static void
1604*65bd3adbSJohn Baldwin test_ktls_receive_truncated_record(const atf_tc_t *tc, struct tls_enable *en,
1605*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1606*65bd3adbSJohn Baldwin {
1607*65bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
1608*65bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
1609*65bd3adbSJohn Baldwin 	ssize_t rv;
1610*65bd3adbSJohn Baldwin 	int sockets[2];
1611*65bd3adbSJohn Baldwin 
1612*65bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1613*65bd3adbSJohn Baldwin 
1614*65bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
1615*65bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1616*65bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1617*65bd3adbSJohn Baldwin 
1618*65bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1619*65bd3adbSJohn Baldwin 
1620*65bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1621*65bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
1622*65bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
1623*65bd3adbSJohn Baldwin 
1624*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
1625*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
1626*65bd3adbSJohn Baldwin 
1627*65bd3adbSJohn Baldwin 	outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno,
1628*65bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
1629*65bd3adbSJohn Baldwin 
1630*65bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len / 2);
1631*65bd3adbSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)(outbuf_len / 2));
1632*65bd3adbSJohn Baldwin 
1633*65bd3adbSJohn Baldwin 	ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0);
1634*65bd3adbSJohn Baldwin 
1635*65bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EMSGSIZE);
1636*65bd3adbSJohn Baldwin 
1637*65bd3adbSJohn Baldwin 	free(outbuf);
1638*65bd3adbSJohn Baldwin 	free(plaintext);
1639*65bd3adbSJohn Baldwin 
1640*65bd3adbSJohn Baldwin 	close_sockets(sockets);
1641*65bd3adbSJohn Baldwin }
1642*65bd3adbSJohn Baldwin 
1643*65bd3adbSJohn Baldwin static void
1644*65bd3adbSJohn Baldwin test_ktls_receive_bad_major(const atf_tc_t *tc, struct tls_enable *en,
1645*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1646*65bd3adbSJohn Baldwin {
1647*65bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
1648*65bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
1649*65bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
1650*65bd3adbSJohn Baldwin 	ssize_t rv;
1651*65bd3adbSJohn Baldwin 	int sockets[2];
1652*65bd3adbSJohn Baldwin 
1653*65bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1654*65bd3adbSJohn Baldwin 
1655*65bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
1656*65bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1657*65bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1658*65bd3adbSJohn Baldwin 
1659*65bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1660*65bd3adbSJohn Baldwin 
1661*65bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1662*65bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
1663*65bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
1664*65bd3adbSJohn Baldwin 
1665*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
1666*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
1667*65bd3adbSJohn Baldwin 
1668*65bd3adbSJohn Baldwin 	outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno,
1669*65bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
1670*65bd3adbSJohn Baldwin 
1671*65bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
1672*65bd3adbSJohn Baldwin 	hdr->tls_vmajor++;
1673*65bd3adbSJohn Baldwin 
1674*65bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1675*65bd3adbSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)outbuf_len);
1676*65bd3adbSJohn Baldwin 
1677*65bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EINVAL);
1678*65bd3adbSJohn Baldwin 
1679*65bd3adbSJohn Baldwin 	free(outbuf);
1680*65bd3adbSJohn Baldwin 	free(plaintext);
1681*65bd3adbSJohn Baldwin 
1682*65bd3adbSJohn Baldwin 	close_sockets(sockets);
1683*65bd3adbSJohn Baldwin }
1684*65bd3adbSJohn Baldwin 
1685*65bd3adbSJohn Baldwin static void
1686*65bd3adbSJohn Baldwin test_ktls_receive_bad_minor(const atf_tc_t *tc, struct tls_enable *en,
1687*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1688*65bd3adbSJohn Baldwin {
1689*65bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
1690*65bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
1691*65bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
1692*65bd3adbSJohn Baldwin 	ssize_t rv;
1693*65bd3adbSJohn Baldwin 	int sockets[2];
1694*65bd3adbSJohn Baldwin 
1695*65bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1696*65bd3adbSJohn Baldwin 
1697*65bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
1698*65bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1699*65bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1700*65bd3adbSJohn Baldwin 
1701*65bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1702*65bd3adbSJohn Baldwin 
1703*65bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1704*65bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
1705*65bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
1706*65bd3adbSJohn Baldwin 
1707*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
1708*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
1709*65bd3adbSJohn Baldwin 
1710*65bd3adbSJohn Baldwin 	outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno,
1711*65bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
1712*65bd3adbSJohn Baldwin 
1713*65bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
1714*65bd3adbSJohn Baldwin 	hdr->tls_vminor++;
1715*65bd3adbSJohn Baldwin 
1716*65bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1717*65bd3adbSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)outbuf_len);
1718*65bd3adbSJohn Baldwin 
1719*65bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EINVAL);
1720*65bd3adbSJohn Baldwin 
1721*65bd3adbSJohn Baldwin 	free(outbuf);
1722*65bd3adbSJohn Baldwin 	free(plaintext);
1723*65bd3adbSJohn Baldwin 
1724*65bd3adbSJohn Baldwin 	close_sockets(sockets);
1725*65bd3adbSJohn Baldwin }
1726*65bd3adbSJohn Baldwin 
1727*65bd3adbSJohn Baldwin static void
1728*65bd3adbSJohn Baldwin test_ktls_receive_bad_type(const atf_tc_t *tc, struct tls_enable *en,
1729*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1730*65bd3adbSJohn Baldwin {
1731*65bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
1732*65bd3adbSJohn Baldwin 	char *plaintext, *outbuf;
1733*65bd3adbSJohn Baldwin 	size_t outbuf_cap, outbuf_len;
1734*65bd3adbSJohn Baldwin 	ssize_t rv;
1735*65bd3adbSJohn Baldwin 	int sockets[2];
1736*65bd3adbSJohn Baldwin 
1737*65bd3adbSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1738*65bd3adbSJohn Baldwin 	ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_THREE);
1739*65bd3adbSJohn Baldwin 
1740*65bd3adbSJohn Baldwin 	plaintext = alloc_buffer(len);
1741*65bd3adbSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1742*65bd3adbSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1743*65bd3adbSJohn Baldwin 
1744*65bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1745*65bd3adbSJohn Baldwin 
1746*65bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1747*65bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
1748*65bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
1749*65bd3adbSJohn Baldwin 
1750*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
1751*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
1752*65bd3adbSJohn Baldwin 
1753*65bd3adbSJohn Baldwin 	outbuf_len = encrypt_tls_record(en, 0x21 /* Alert */, seqno,
1754*65bd3adbSJohn Baldwin 	    plaintext, len, outbuf, outbuf_cap, 0);
1755*65bd3adbSJohn Baldwin 
1756*65bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
1757*65bd3adbSJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP + 1;
1758*65bd3adbSJohn Baldwin 
1759*65bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1760*65bd3adbSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)outbuf_len);
1761*65bd3adbSJohn Baldwin 
1762*65bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EINVAL);
1763*65bd3adbSJohn Baldwin 
1764*65bd3adbSJohn Baldwin 	free(outbuf);
1765*65bd3adbSJohn Baldwin 	free(plaintext);
1766*65bd3adbSJohn Baldwin 
1767*65bd3adbSJohn Baldwin 	close_sockets(sockets);
1768*65bd3adbSJohn Baldwin }
1769*65bd3adbSJohn Baldwin 
1770*65bd3adbSJohn Baldwin static void
1771*65bd3adbSJohn Baldwin test_ktls_receive_bad_size(const atf_tc_t *tc, struct tls_enable *en,
1772*65bd3adbSJohn Baldwin     uint64_t seqno, size_t len)
1773*65bd3adbSJohn Baldwin {
1774*65bd3adbSJohn Baldwin 	struct tls_record_layer *hdr;
1775*65bd3adbSJohn Baldwin 	char *outbuf;
1776*65bd3adbSJohn Baldwin 	size_t outbuf_len;
1777*65bd3adbSJohn Baldwin 	ssize_t rv;
1778*65bd3adbSJohn Baldwin 	int sockets[2];
1779*65bd3adbSJohn Baldwin 
1780*65bd3adbSJohn Baldwin 	outbuf_len = sizeof(*hdr) + len;
1781*65bd3adbSJohn Baldwin 	outbuf = calloc(1, outbuf_len);
1782*65bd3adbSJohn Baldwin 
1783*65bd3adbSJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1784*65bd3adbSJohn Baldwin 
1785*65bd3adbSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1786*65bd3adbSJohn Baldwin 	    sizeof(*en)) == 0);
1787*65bd3adbSJohn Baldwin 	check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
1788*65bd3adbSJohn Baldwin 
1789*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[0]);
1790*65bd3adbSJohn Baldwin 	fd_set_blocking(sockets[1]);
1791*65bd3adbSJohn Baldwin 
1792*65bd3adbSJohn Baldwin 	hdr = (void *)outbuf;
1793*65bd3adbSJohn Baldwin 	hdr->tls_vmajor = en->tls_vmajor;
1794*65bd3adbSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
1795*65bd3adbSJohn Baldwin 		hdr->tls_vminor = TLS_MINOR_VER_TWO;
1796*65bd3adbSJohn Baldwin 	else
1797*65bd3adbSJohn Baldwin 		hdr->tls_vminor = en->tls_vminor;
1798*65bd3adbSJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP;
1799*65bd3adbSJohn Baldwin 	hdr->tls_length = htons(len);
1800*65bd3adbSJohn Baldwin 
1801*65bd3adbSJohn Baldwin 	rv = write(sockets[1], outbuf, outbuf_len);
1802*65bd3adbSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)outbuf_len);
1803*65bd3adbSJohn Baldwin 
1804*65bd3adbSJohn Baldwin 	ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0);
1805*65bd3adbSJohn Baldwin 
1806*65bd3adbSJohn Baldwin 	ktls_receive_tls_error(sockets[0], EMSGSIZE);
1807*65bd3adbSJohn Baldwin 
1808*65bd3adbSJohn Baldwin 	free(outbuf);
1809*65bd3adbSJohn Baldwin 
1810*65bd3adbSJohn Baldwin 	close_sockets(sockets);
1811*65bd3adbSJohn Baldwin }
1812*65bd3adbSJohn Baldwin 
18130ff2a12aSJohn Baldwin #define	TLS_10_TESTS(M)							\
18140ff2a12aSJohn Baldwin 	M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8,			\
181564811651SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)			\
18160ff2a12aSJohn Baldwin 	M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8,			\
181764811651SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)
18180ff2a12aSJohn Baldwin 
181983a54b58SJohn Baldwin #define	TLS_13_TESTS(M)							\
182083a54b58SJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
182183a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
182283a54b58SJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
182383a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
182483a54b58SJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
182583a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)
182683a54b58SJohn Baldwin 
182764811651SJohn Baldwin #define	AES_CBC_NONZERO_TESTS(M)					\
1828a10482eaSJohn Baldwin 	M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1829a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1830a10482eaSJohn Baldwin 	M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1831a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1832a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1833a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1834a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1835a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1836a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1837a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1838a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8,		\
1839a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1840a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1841a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1842a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8,		\
1843a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1844a10482eaSJohn Baldwin 
184564811651SJohn Baldwin #define	AES_CBC_TESTS(M)						\
184664811651SJohn Baldwin 	TLS_10_TESTS(M)							\
184764811651SJohn Baldwin 	AES_CBC_NONZERO_TESTS(M)
184864811651SJohn Baldwin 
1849*65bd3adbSJohn Baldwin #define AES_GCM_12_TESTS(M)						\
1850a10482eaSJohn Baldwin 	M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1851a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1852a10482eaSJohn Baldwin 	M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1853*65bd3adbSJohn Baldwin 	    TLS_MINOR_VER_TWO)
1854*65bd3adbSJohn Baldwin 
1855*65bd3adbSJohn Baldwin #define AES_GCM_TESTS(M)						\
1856*65bd3adbSJohn Baldwin 	AES_GCM_12_TESTS(M)						\
1857a10482eaSJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1858a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
1859a10482eaSJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1860a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1861a10482eaSJohn Baldwin 
1862a10482eaSJohn Baldwin #define CHACHA20_TESTS(M)						\
1863a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1864a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1865a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1866a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1867a10482eaSJohn Baldwin 
1868a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1869a10482eaSJohn Baldwin 	    auth_alg, minor, name, len)					\
1870a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
1871a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1872a10482eaSJohn Baldwin {									\
1873a10482eaSJohn Baldwin 	struct tls_enable en;						\
1874a10482eaSJohn Baldwin 	uint64_t seqno;							\
1875a10482eaSJohn Baldwin 									\
1876a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1877a10482eaSJohn Baldwin 	seqno = random();						\
1878a10482eaSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
1879a10482eaSJohn Baldwin 	    &en);							\
18802400a7b1SJohn Baldwin 	test_ktls_transmit_app_data(tc, &en, seqno, len);		\
1881a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1882a10482eaSJohn Baldwin }
1883a10482eaSJohn Baldwin 
1884a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1885a10482eaSJohn Baldwin 	    auth_alg, minor, name)					\
1886a10482eaSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1887a10482eaSJohn Baldwin 
1888a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
188944265dc3SJohn Baldwin 	    auth_alg, minor, name, type, len)				\
189044265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
189144265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1892a10482eaSJohn Baldwin {									\
1893a10482eaSJohn Baldwin 	struct tls_enable en;						\
1894a10482eaSJohn Baldwin 	uint64_t seqno;							\
1895a10482eaSJohn Baldwin 									\
1896a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1897a10482eaSJohn Baldwin 	seqno = random();						\
1898a10482eaSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1899a10482eaSJohn Baldwin 	    &en);							\
19002400a7b1SJohn Baldwin 	test_ktls_transmit_control(tc, &en, seqno, type, len);		\
1901a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1902a10482eaSJohn Baldwin }
1903a10482eaSJohn Baldwin 
1904a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
190544265dc3SJohn Baldwin 	    auth_alg, minor, name)					\
190644265dc3SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1907a10482eaSJohn Baldwin 
19080ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
19095de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
19100ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment);	\
19110ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc)		\
19120ff2a12aSJohn Baldwin {									\
19130ff2a12aSJohn Baldwin 	struct tls_enable en;						\
19140ff2a12aSJohn Baldwin 	uint64_t seqno;							\
19150ff2a12aSJohn Baldwin 									\
19160ff2a12aSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
19170ff2a12aSJohn Baldwin 	seqno = random();						\
19185de79eedSMark Johnston 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
19195de79eedSMark Johnston 	    &en);							\
19202400a7b1SJohn Baldwin 	test_ktls_transmit_empty_fragment(tc, &en, seqno);		\
19210ff2a12aSJohn Baldwin 	free_tls_enable(&en);						\
19220ff2a12aSJohn Baldwin }
19230ff2a12aSJohn Baldwin 
19240ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
19255de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
19260ff2a12aSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment);
19270ff2a12aSJohn Baldwin 
1928a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
1929a10482eaSJohn Baldwin 	    minor)							\
1930a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1931a10482eaSJohn Baldwin 	    auth_alg, minor, short, 64)					\
1932a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1933a10482eaSJohn Baldwin 	    auth_alg, minor, long, 64 * 1024)				\
1934a10482eaSJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
193544265dc3SJohn Baldwin 	    auth_alg, minor, control, 0x21 /* Alert */, 32)
1936a10482eaSJohn Baldwin 
1937a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
1938a10482eaSJohn Baldwin 	    minor)							\
1939a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1940a10482eaSJohn Baldwin 	    auth_alg, minor, short)					\
1941a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1942a10482eaSJohn Baldwin 	    auth_alg, minor, long)					\
1943a10482eaSJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
194444265dc3SJohn Baldwin 	    auth_alg, minor, control)
1945a10482eaSJohn Baldwin 
1946a10482eaSJohn Baldwin /*
1947a10482eaSJohn Baldwin  * For each supported cipher suite, run three transmit tests:
1948a10482eaSJohn Baldwin  *
1949a10482eaSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
1950a10482eaSJohn Baldwin  *   a single TLS record)
1951a10482eaSJohn Baldwin  *
1952a10482eaSJohn Baldwin  * - a long test which sends 64KB of application data (split across
1953a10482eaSJohn Baldwin  *   multiple TLS records)
1954a10482eaSJohn Baldwin  *
1955a10482eaSJohn Baldwin  * - a control test which sends a single record with a specific
1956a10482eaSJohn Baldwin  *   content type via sendmsg()
1957a10482eaSJohn Baldwin  */
1958a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS);
1959a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS);
1960a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS);
1961a10482eaSJohn Baldwin 
196244265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
196344265dc3SJohn Baldwin 	    auth_alg, minor)						\
196444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
196544265dc3SJohn Baldwin 	    auth_alg, minor, padding_1, 0x21 /* Alert */, 1)		\
196644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
196744265dc3SJohn Baldwin 	    auth_alg, minor, padding_2, 0x21 /* Alert */, 2)		\
196844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
196944265dc3SJohn Baldwin 	    auth_alg, minor, padding_3, 0x21 /* Alert */, 3)		\
197044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
197144265dc3SJohn Baldwin 	    auth_alg, minor, padding_4, 0x21 /* Alert */, 4)		\
197244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
197344265dc3SJohn Baldwin 	    auth_alg, minor, padding_5, 0x21 /* Alert */, 5)		\
197444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
197544265dc3SJohn Baldwin 	    auth_alg, minor, padding_6, 0x21 /* Alert */, 6)		\
197644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
197744265dc3SJohn Baldwin 	    auth_alg, minor, padding_7, 0x21 /* Alert */, 7)		\
197844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
197944265dc3SJohn Baldwin 	    auth_alg, minor, padding_8, 0x21 /* Alert */, 8)		\
198044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
198144265dc3SJohn Baldwin 	    auth_alg, minor, padding_9, 0x21 /* Alert */, 9)		\
198244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
198344265dc3SJohn Baldwin 	    auth_alg, minor, padding_10, 0x21 /* Alert */, 10)		\
198444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
198544265dc3SJohn Baldwin 	    auth_alg, minor, padding_11, 0x21 /* Alert */, 11)		\
198644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
198744265dc3SJohn Baldwin 	    auth_alg, minor, padding_12, 0x21 /* Alert */, 12)		\
198844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
198944265dc3SJohn Baldwin 	    auth_alg, minor, padding_13, 0x21 /* Alert */, 13)		\
199044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
199144265dc3SJohn Baldwin 	    auth_alg, minor, padding_14, 0x21 /* Alert */, 14)		\
199244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
199344265dc3SJohn Baldwin 	    auth_alg, minor, padding_15, 0x21 /* Alert */, 15)		\
199444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
199544265dc3SJohn Baldwin 	    auth_alg, minor, padding_16, 0x21 /* Alert */, 16)
199644265dc3SJohn Baldwin 
199744265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
199844265dc3SJohn Baldwin 	    auth_alg, minor)						\
199944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
200044265dc3SJohn Baldwin 	    auth_alg, minor, padding_1)					\
200144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
200244265dc3SJohn Baldwin 	    auth_alg, minor, padding_2)					\
200344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
200444265dc3SJohn Baldwin 	    auth_alg, minor, padding_3)					\
200544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
200644265dc3SJohn Baldwin 	    auth_alg, minor, padding_4)					\
200744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
200844265dc3SJohn Baldwin 	    auth_alg, minor, padding_5)					\
200944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
201044265dc3SJohn Baldwin 	    auth_alg, minor, padding_6)					\
201144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
201244265dc3SJohn Baldwin 	    auth_alg, minor, padding_7)					\
201344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
201444265dc3SJohn Baldwin 	    auth_alg, minor, padding_8)					\
201544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
201644265dc3SJohn Baldwin 	    auth_alg, minor, padding_9)					\
201744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
201844265dc3SJohn Baldwin 	    auth_alg, minor, padding_10)				\
201944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
202044265dc3SJohn Baldwin 	    auth_alg, minor, padding_11)				\
202144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
202244265dc3SJohn Baldwin 	    auth_alg, minor, padding_12)				\
202344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
202444265dc3SJohn Baldwin 	    auth_alg, minor, padding_13)				\
202544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
202644265dc3SJohn Baldwin 	    auth_alg, minor, padding_14)				\
202744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
202844265dc3SJohn Baldwin 	    auth_alg, minor, padding_15)				\
202944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
203044265dc3SJohn Baldwin 	    auth_alg, minor, padding_16)
203144265dc3SJohn Baldwin 
203244265dc3SJohn Baldwin /*
203344265dc3SJohn Baldwin  * For AES-CBC MTE cipher suites using padding, add tests of messages
203444265dc3SJohn Baldwin  * with each possible padding size.  Note that the padding_<N> tests
203544265dc3SJohn Baldwin  * do not necessarily test <N> bytes of padding as the padding is a
203644265dc3SJohn Baldwin  * function of the cipher suite's MAC length.  However, cycling
203744265dc3SJohn Baldwin  * through all of the payload sizes from 1 to 16 should exercise all
203844265dc3SJohn Baldwin  * of the possible padding lengths for each suite.
203944265dc3SJohn Baldwin  */
204044265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS);
204144265dc3SJohn Baldwin 
20420ff2a12aSJohn Baldwin /*
20430ff2a12aSJohn Baldwin  * Test "empty fragments" which are TLS records with no payload that
20440ff2a12aSJohn Baldwin  * OpenSSL can send for TLS 1.0 connections.
20450ff2a12aSJohn Baldwin  */
20465de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
20475de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
20485de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
20490ff2a12aSJohn Baldwin 
2050d1c369f9SJohn Baldwin static void
20512400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc,
20522400a7b1SJohn Baldwin     struct tls_enable *en)
2053d1c369f9SJohn Baldwin {
2054d1c369f9SJohn Baldwin 	int sockets[2];
2055d1c369f9SJohn Baldwin 
20562400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
2057d1c369f9SJohn Baldwin 
2058d1c369f9SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
2059d1c369f9SJohn Baldwin 	    sizeof(*en)) == -1);
2060d1c369f9SJohn Baldwin 	ATF_REQUIRE(errno == EINVAL);
2061d1c369f9SJohn Baldwin 
20622c105205SJohn Baldwin 	close_sockets(sockets);
2063d1c369f9SJohn Baldwin }
2064d1c369f9SJohn Baldwin 
2065d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg,	\
2066d1c369f9SJohn Baldwin 	    minor)							\
2067d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name);			\
2068d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc)				\
2069d1c369f9SJohn Baldwin {									\
2070d1c369f9SJohn Baldwin 	struct tls_enable en;						\
2071d1c369f9SJohn Baldwin 	uint64_t seqno;							\
2072d1c369f9SJohn Baldwin 									\
2073d1c369f9SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2074d1c369f9SJohn Baldwin 	seqno = random();						\
2075d1c369f9SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
2076d1c369f9SJohn Baldwin 	    &en);							\
20772400a7b1SJohn Baldwin 	test_ktls_invalid_transmit_cipher_suite(tc, &en);		\
2078d1c369f9SJohn Baldwin 	free_tls_enable(&en);						\
2079d1c369f9SJohn Baldwin }
2080d1c369f9SJohn Baldwin 
2081d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \
2082d1c369f9SJohn Baldwin 	    minor)							\
2083d1c369f9SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name);
2084d1c369f9SJohn Baldwin 
2085d1c369f9SJohn Baldwin #define	INVALID_CIPHER_SUITES(M)					\
2086d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8,		\
2087d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO)			\
2088d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8,		\
2089d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO)			\
2090d1c369f9SJohn Baldwin 	M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
2091d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
2092d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
2093d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
2094d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8,		\
2095d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE)			\
2096d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8,		\
2097d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE)			\
2098d1c369f9SJohn Baldwin 	M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
2099d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
2100d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
2101d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
2102d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8,			\
2103d1c369f9SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE)			\
2104d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8,		\
2105d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE)			\
2106d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8,		\
2107d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE)
2108d1c369f9SJohn Baldwin 
2109d1c369f9SJohn Baldwin /*
2110d1c369f9SJohn Baldwin  * Ensure that invalid cipher suites are rejected for transmit.
2111d1c369f9SJohn Baldwin  */
2112d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST);
2113d1c369f9SJohn Baldwin 
21143e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
211505a1d0f5SJohn Baldwin 	    auth_alg, minor, name, len, padding)			\
21163e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name);		\
21173e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc)			\
21183e7f8a8dSJohn Baldwin {									\
21193e7f8a8dSJohn Baldwin 	struct tls_enable en;						\
21203e7f8a8dSJohn Baldwin 	uint64_t seqno;							\
21213e7f8a8dSJohn Baldwin 									\
21223e7f8a8dSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
21233e7f8a8dSJohn Baldwin 	seqno = random();						\
21243e7f8a8dSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
21253e7f8a8dSJohn Baldwin 	    &en);							\
21262400a7b1SJohn Baldwin 	test_ktls_receive_app_data(tc, &en, seqno, len, padding);	\
21273e7f8a8dSJohn Baldwin 	free_tls_enable(&en);						\
21283e7f8a8dSJohn Baldwin }
21293e7f8a8dSJohn Baldwin 
21303e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
21313e7f8a8dSJohn Baldwin 	    auth_alg, minor, name)					\
21323e7f8a8dSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
21333e7f8a8dSJohn Baldwin 
2134*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2135*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2136*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_data);		\
2137*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc)			\
2138*65bd3adbSJohn Baldwin {									\
2139*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2140*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2141*65bd3adbSJohn Baldwin 									\
2142*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2143*65bd3adbSJohn Baldwin 	seqno = random();						\
2144*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2145*65bd3adbSJohn Baldwin 	    &en);							\
2146*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_data(tc, &en, seqno, len);		\
2147*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2148*65bd3adbSJohn Baldwin }
2149*65bd3adbSJohn Baldwin 
2150*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2151*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2152*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_data);
2153*65bd3adbSJohn Baldwin 
2154*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
2155*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2156*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_mac);		\
2157*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc)			\
2158*65bd3adbSJohn Baldwin {									\
2159*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2160*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2161*65bd3adbSJohn Baldwin 									\
2162*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2163*65bd3adbSJohn Baldwin 	seqno = random();						\
2164*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2165*65bd3adbSJohn Baldwin 	    &en);							\
2166*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_mac(tc, &en, seqno, len);		\
2167*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2168*65bd3adbSJohn Baldwin }
2169*65bd3adbSJohn Baldwin 
2170*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
2171*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2172*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_mac);
2173*65bd3adbSJohn Baldwin 
2174*65bd3adbSJohn Baldwin #define GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
2175*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2176*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_truncated_record);	\
2177*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc)		\
2178*65bd3adbSJohn Baldwin {									\
2179*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2180*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2181*65bd3adbSJohn Baldwin 									\
2182*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2183*65bd3adbSJohn Baldwin 	seqno = random();						\
2184*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2185*65bd3adbSJohn Baldwin 	    &en);							\
2186*65bd3adbSJohn Baldwin 	test_ktls_receive_truncated_record(tc, &en, seqno, len);	\
2187*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2188*65bd3adbSJohn Baldwin }
2189*65bd3adbSJohn Baldwin 
2190*65bd3adbSJohn Baldwin #define ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
2191*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2192*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_truncated_record);
2193*65bd3adbSJohn Baldwin 
2194*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
2195*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2196*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_major);		\
2197*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc)			\
2198*65bd3adbSJohn Baldwin {									\
2199*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2200*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2201*65bd3adbSJohn Baldwin 									\
2202*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2203*65bd3adbSJohn Baldwin 	seqno = random();						\
2204*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2205*65bd3adbSJohn Baldwin 	    &en);							\
2206*65bd3adbSJohn Baldwin 	test_ktls_receive_bad_major(tc, &en, seqno, len);		\
2207*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2208*65bd3adbSJohn Baldwin }
2209*65bd3adbSJohn Baldwin 
2210*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
2211*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2212*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_major);
2213*65bd3adbSJohn Baldwin 
2214*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
2215*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2216*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_minor);		\
2217*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc)			\
2218*65bd3adbSJohn Baldwin {									\
2219*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2220*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2221*65bd3adbSJohn Baldwin 									\
2222*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2223*65bd3adbSJohn Baldwin 	seqno = random();						\
2224*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2225*65bd3adbSJohn Baldwin 	    &en);							\
2226*65bd3adbSJohn Baldwin 	test_ktls_receive_bad_minor(tc, &en, seqno, len);		\
2227*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2228*65bd3adbSJohn Baldwin }
2229*65bd3adbSJohn Baldwin 
2230*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
2231*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2232*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_minor);
2233*65bd3adbSJohn Baldwin 
2234*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2235*65bd3adbSJohn Baldwin 	    auth_alg, minor, name, len)					\
2236*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name);		\
2237*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc)			\
2238*65bd3adbSJohn Baldwin {									\
2239*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2240*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2241*65bd3adbSJohn Baldwin 									\
2242*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2243*65bd3adbSJohn Baldwin 	seqno = random();						\
2244*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2245*65bd3adbSJohn Baldwin 	    &en);							\
2246*65bd3adbSJohn Baldwin 	test_ktls_receive_bad_size(tc, &en, seqno, (len));		\
2247*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2248*65bd3adbSJohn Baldwin }
2249*65bd3adbSJohn Baldwin 
2250*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2251*65bd3adbSJohn Baldwin 	    auth_alg, minor, name)					\
2252*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
2253*65bd3adbSJohn Baldwin 
22543e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
22553e7f8a8dSJohn Baldwin 	    minor)							\
22563e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
225705a1d0f5SJohn Baldwin 	    auth_alg, minor, short, 64, 0)				\
22583e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2259*65bd3adbSJohn Baldwin 	    auth_alg, minor, long, 64 * 1024, 0)			\
2260*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2261*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
2262*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
2263*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
2264*65bd3adbSJohn Baldwin 	GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
2265*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
2266*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
2267*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
2268*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
2269*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
2270*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2271*65bd3adbSJohn Baldwin 	    auth_alg, minor, small_record,				\
2272*65bd3adbSJohn Baldwin 	    tls_minimum_record_payload(&en) - 1)			\
2273*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2274*65bd3adbSJohn Baldwin 	    auth_alg, minor, oversized_record,				\
2275*65bd3adbSJohn Baldwin 	    TLS_MAX_MSG_SIZE_V10_2 * 2)
22763e7f8a8dSJohn Baldwin 
22773e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
22783e7f8a8dSJohn Baldwin 	    minor)							\
22793e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
22803e7f8a8dSJohn Baldwin 	    auth_alg, minor, short)					\
22813e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2282*65bd3adbSJohn Baldwin 	    auth_alg, minor, long)					\
2283*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2284*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2285*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size,	\
2286*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2287*65bd3adbSJohn Baldwin 	ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size,	\
2288*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2289*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size,	\
2290*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2291*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size,	\
2292*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2293*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2294*65bd3adbSJohn Baldwin 	    auth_alg, minor, small_record)				\
2295*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2296*65bd3adbSJohn Baldwin 	    auth_alg, minor, oversized_record)
22973e7f8a8dSJohn Baldwin 
22983e7f8a8dSJohn Baldwin /*
2299*65bd3adbSJohn Baldwin  * For each supported cipher suite, run several receive tests:
23003e7f8a8dSJohn Baldwin  *
23013e7f8a8dSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
23023e7f8a8dSJohn Baldwin  *   a single TLS record)
23033e7f8a8dSJohn Baldwin  *
23043e7f8a8dSJohn Baldwin  * - a long test which sends 64KB of application data (split across
23053e7f8a8dSJohn Baldwin  *   multiple TLS records)
2306*65bd3adbSJohn Baldwin  *
2307*65bd3adbSJohn Baldwin  * - a test with corrupted payload data in a single TLS record
2308*65bd3adbSJohn Baldwin  *
2309*65bd3adbSJohn Baldwin  * - a test with a corrupted MAC in a single TLS record
2310*65bd3adbSJohn Baldwin  *
2311*65bd3adbSJohn Baldwin  * - a test with a truncated TLS record
2312*65bd3adbSJohn Baldwin  *
2313*65bd3adbSJohn Baldwin  * - tests with invalid TLS major and minor versions
2314*65bd3adbSJohn Baldwin  *
2315*65bd3adbSJohn Baldwin  * - a tests with a record whose is one less than the smallest valid
2316*65bd3adbSJohn Baldwin  *   size
2317*65bd3adbSJohn Baldwin  *
2318*65bd3adbSJohn Baldwin  * - a test with an oversized TLS record
23193e7f8a8dSJohn Baldwin  */
232064811651SJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_TESTS);
232105a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS);
232205a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS);
232305a1d0f5SJohn Baldwin 
232464811651SJohn Baldwin #define	GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
232564811651SJohn Baldwin 	    key_size, auth_alg, minor)					\
232664811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
232764811651SJohn Baldwin 	    auth_alg, minor, padding_1, 1, 0)				\
232864811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
232964811651SJohn Baldwin 	    auth_alg, minor, padding_2, 2, 0)				\
233064811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
233164811651SJohn Baldwin 	    auth_alg, minor, padding_3, 3, 0)				\
233264811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
233364811651SJohn Baldwin 	    auth_alg, minor, padding_4, 4, 0)				\
233464811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
233564811651SJohn Baldwin 	    auth_alg, minor, padding_5, 5, 0)				\
233664811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
233764811651SJohn Baldwin 	    auth_alg, minor, padding_6, 6, 0)				\
233864811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
233964811651SJohn Baldwin 	    auth_alg, minor, padding_7, 7, 0)				\
234064811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
234164811651SJohn Baldwin 	    auth_alg, minor, padding_8, 8, 0)				\
234264811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
234364811651SJohn Baldwin 	    auth_alg, minor, padding_9, 9, 0)				\
234464811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
234564811651SJohn Baldwin 	    auth_alg, minor, padding_10, 10, 0)				\
234664811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
234764811651SJohn Baldwin 	    auth_alg, minor, padding_11, 11, 0)				\
234864811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
234964811651SJohn Baldwin 	    auth_alg, minor, padding_12, 12, 0)				\
235064811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235164811651SJohn Baldwin 	    auth_alg, minor, padding_13, 13, 0)				\
235264811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235364811651SJohn Baldwin 	    auth_alg, minor, padding_14, 14, 0)				\
235464811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235564811651SJohn Baldwin 	    auth_alg, minor, padding_15, 15, 0)				\
235664811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235764811651SJohn Baldwin 	    auth_alg, minor, padding_16, 16, 0)				\
235864811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
235964811651SJohn Baldwin 	    auth_alg, minor, padding_16_extra, 16, 16)			\
236064811651SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
236164811651SJohn Baldwin 	    auth_alg, minor, padding_32_extra, 16, 32)
236264811651SJohn Baldwin 
236364811651SJohn Baldwin #define ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
236464811651SJohn Baldwin 	    key_size, auth_alg, minor)					\
236564811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
236664811651SJohn Baldwin 	    auth_alg, minor, padding_1)					\
236764811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
236864811651SJohn Baldwin 	    auth_alg, minor, padding_2)					\
236964811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237064811651SJohn Baldwin 	    auth_alg, minor, padding_3)					\
237164811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237264811651SJohn Baldwin 	    auth_alg, minor, padding_4)					\
237364811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237464811651SJohn Baldwin 	    auth_alg, minor, padding_5)					\
237564811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237664811651SJohn Baldwin 	    auth_alg, minor, padding_6)					\
237764811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
237864811651SJohn Baldwin 	    auth_alg, minor, padding_7)					\
237964811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
238064811651SJohn Baldwin 	    auth_alg, minor, padding_8)					\
238164811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
238264811651SJohn Baldwin 	    auth_alg, minor, padding_9)					\
238364811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
238464811651SJohn Baldwin 	    auth_alg, minor, padding_10)				\
238564811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
238664811651SJohn Baldwin 	    auth_alg, minor, padding_11)				\
238764811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
238864811651SJohn Baldwin 	    auth_alg, minor, padding_12)				\
238964811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
239064811651SJohn Baldwin 	    auth_alg, minor, padding_13)				\
239164811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
239264811651SJohn Baldwin 	    auth_alg, minor, padding_14)				\
239364811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
239464811651SJohn Baldwin 	    auth_alg, minor, padding_15)				\
239564811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
239664811651SJohn Baldwin 	    auth_alg, minor, padding_16)				\
239764811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
239864811651SJohn Baldwin 	    auth_alg, minor, padding_16_extra)				\
239964811651SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
240064811651SJohn Baldwin 	    auth_alg, minor, padding_32_extra)
240164811651SJohn Baldwin 
2402*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
2403*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2404*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_padding);		\
2405*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc)		\
2406*65bd3adbSJohn Baldwin {									\
2407*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2408*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2409*65bd3adbSJohn Baldwin 									\
2410*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2411*65bd3adbSJohn Baldwin 	seqno = random();						\
2412*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2413*65bd3adbSJohn Baldwin 	    &en);							\
2414*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_padding(tc, &en, seqno, len);	\
2415*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2416*65bd3adbSJohn Baldwin }
2417*65bd3adbSJohn Baldwin 
2418*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
2419*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2420*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_padding);
2421*65bd3adbSJohn Baldwin 
2422*65bd3adbSJohn Baldwin #define	GEN_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size,	\
2423*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2424*65bd3adbSJohn Baldwin 	GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
2425*65bd3adbSJohn Baldwin 	    key_size, auth_alg, minor)					\
2426*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
2427*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)					\
2428*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2429*65bd3adbSJohn Baldwin 	    auth_alg, minor, non_block_size,				\
2430*65bd3adbSJohn Baldwin 	    tls_minimum_record_payload(&en) + 1)
2431*65bd3adbSJohn Baldwin 
2432*65bd3adbSJohn Baldwin #define	ADD_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size,	\
2433*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2434*65bd3adbSJohn Baldwin 	ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg,		\
2435*65bd3adbSJohn Baldwin 	    key_size, auth_alg, minor)					\
2436*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size,	\
2437*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2438*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2439*65bd3adbSJohn Baldwin 	    auth_alg, minor, non_block_size)
2440*65bd3adbSJohn Baldwin 
244164811651SJohn Baldwin /*
244264811651SJohn Baldwin  * For AES-CBC MTE cipher suites using padding, add tests of messages
244364811651SJohn Baldwin  * with each possible padding size.  Note that the padding_<N> tests
244464811651SJohn Baldwin  * do not necessarily test <N> bytes of padding as the padding is a
244564811651SJohn Baldwin  * function of the cipher suite's MAC length.  However, cycling
244664811651SJohn Baldwin  * through all of the payload sizes from 1 to 16 should exercise all
244764811651SJohn Baldwin  * of the possible padding lengths for each suite.
244864811651SJohn Baldwin  *
244964811651SJohn Baldwin  * Two additional tests check for additional padding with an extra
245064811651SJohn Baldwin  * 16 or 32 bytes beyond the normal padding.
2451*65bd3adbSJohn Baldwin  *
2452*65bd3adbSJohn Baldwin  * Another test checks for corrupted padding.
2453*65bd3adbSJohn Baldwin  *
2454*65bd3adbSJohn Baldwin  * Another test checks for a record whose payload is not a multiple of
2455*65bd3adbSJohn Baldwin  * the AES block size.
245664811651SJohn Baldwin  */
2457*65bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_MTE_TESTS);
245864811651SJohn Baldwin 
2459*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
2460*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2461*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_iv);		\
2462*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc)			\
2463*65bd3adbSJohn Baldwin {									\
2464*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2465*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2466*65bd3adbSJohn Baldwin 									\
2467*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2468*65bd3adbSJohn Baldwin 	seqno = random();						\
2469*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2470*65bd3adbSJohn Baldwin 	    &en);							\
2471*65bd3adbSJohn Baldwin 	test_ktls_receive_corrupted_iv(tc, &en, seqno, 64);		\
2472*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2473*65bd3adbSJohn Baldwin }
2474*65bd3adbSJohn Baldwin 
2475*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
2476*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2477*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_iv);
2478*65bd3adbSJohn Baldwin 
2479*65bd3adbSJohn Baldwin #define	GEN_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg,		\
248064811651SJohn Baldwin 	    key_size, auth_alg, minor)					\
2481*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
2482*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2483*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2484*65bd3adbSJohn Baldwin 	    auth_alg, minor, short_header,				\
2485*65bd3adbSJohn Baldwin 	    sizeof(struct tls_record_layer) + 1)
2486*65bd3adbSJohn Baldwin 
2487*65bd3adbSJohn Baldwin #define	ADD_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg,		\
2488*65bd3adbSJohn Baldwin 	    key_size, auth_alg, minor)					\
2489*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size,	\
2490*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2491*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size,	\
2492*65bd3adbSJohn Baldwin 	    auth_alg, minor, short_header)
2493*65bd3adbSJohn Baldwin 
2494*65bd3adbSJohn Baldwin /*
2495*65bd3adbSJohn Baldwin  * For cipher suites with an explicit IV, run a receive test where the
2496*65bd3adbSJohn Baldwin  * explicit IV has been corrupted.  Also run a receive test that sends
2497*65bd3adbSJohn Baldwin  * a short record without a complete IV.
2498*65bd3adbSJohn Baldwin  */
2499*65bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS);
2500*65bd3adbSJohn Baldwin AES_GCM_12_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS);
2501*65bd3adbSJohn Baldwin 
2502*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
2503*65bd3adbSJohn Baldwin 	    auth_alg, minor, len)					\
2504*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_type);		\
2505*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc)			\
2506*65bd3adbSJohn Baldwin {									\
2507*65bd3adbSJohn Baldwin 	struct tls_enable en;						\
2508*65bd3adbSJohn Baldwin 	uint64_t seqno;							\
2509*65bd3adbSJohn Baldwin 									\
2510*65bd3adbSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2511*65bd3adbSJohn Baldwin 	seqno = random();						\
2512*65bd3adbSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
2513*65bd3adbSJohn Baldwin 	    &en);							\
2514*65bd3adbSJohn Baldwin 	test_ktls_receive_bad_type(tc, &en, seqno, len);		\
2515*65bd3adbSJohn Baldwin 	free_tls_enable(&en);						\
2516*65bd3adbSJohn Baldwin }
2517*65bd3adbSJohn Baldwin 
2518*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
2519*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
2520*65bd3adbSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_type);
2521*65bd3adbSJohn Baldwin 
2522*65bd3adbSJohn Baldwin #define GEN_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size,	\
2523*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
252405a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
252505a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded, 64, 16)			\
252605a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2527*65bd3adbSJohn Baldwin 	    auth_alg, minor, long_padded, 64 * 1024, 15)		\
2528*65bd3adbSJohn Baldwin 	GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
2529*65bd3adbSJohn Baldwin 	    auth_alg, minor, 64)
253005a1d0f5SJohn Baldwin 
2531*65bd3adbSJohn Baldwin #define ADD_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size,	\
2532*65bd3adbSJohn Baldwin 	    auth_alg, minor)						\
253305a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
253405a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded)				\
253505a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
2536*65bd3adbSJohn Baldwin 	    auth_alg, minor, long_padded)				\
2537*65bd3adbSJohn Baldwin 	ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size,	\
2538*65bd3adbSJohn Baldwin 	    auth_alg, minor)
253905a1d0f5SJohn Baldwin 
254005a1d0f5SJohn Baldwin /*
254105a1d0f5SJohn Baldwin  * For TLS 1.3 cipher suites, run two additional receive tests which
2542*65bd3adbSJohn Baldwin  * use add padding to each record.  Also run a test that uses an
2543*65bd3adbSJohn Baldwin  * invalid "outer" record type.
254405a1d0f5SJohn Baldwin  */
2545*65bd3adbSJohn Baldwin TLS_13_TESTS(GEN_RECEIVE_TLS13_TESTS);
25463e7f8a8dSJohn Baldwin 
2547233ce578SJohn Baldwin static void
25482400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc,
25492400a7b1SJohn Baldwin     struct tls_enable *en)
2550233ce578SJohn Baldwin {
2551233ce578SJohn Baldwin 	int sockets[2];
2552233ce578SJohn Baldwin 
25532400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
2554233ce578SJohn Baldwin 
2555233ce578SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
2556233ce578SJohn Baldwin 	    sizeof(*en)) == -1);
255705a1d0f5SJohn Baldwin 	ATF_REQUIRE(errno == EINVAL);
2558233ce578SJohn Baldwin 
25592c105205SJohn Baldwin 	close_sockets(sockets);
2560233ce578SJohn Baldwin }
2561233ce578SJohn Baldwin 
2562233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
2563233ce578SJohn Baldwin 	    minor)							\
2564233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name);			\
2565233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc)				\
2566233ce578SJohn Baldwin {									\
2567233ce578SJohn Baldwin 	struct tls_enable en;						\
2568233ce578SJohn Baldwin 	uint64_t seqno;							\
2569233ce578SJohn Baldwin 									\
2570233ce578SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
2571233ce578SJohn Baldwin 	seqno = random();						\
2572233ce578SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
2573233ce578SJohn Baldwin 	    &en);							\
25742400a7b1SJohn Baldwin 	test_ktls_invalid_receive_cipher_suite(tc, &en);		\
2575233ce578SJohn Baldwin 	free_tls_enable(&en);						\
2576233ce578SJohn Baldwin }
2577233ce578SJohn Baldwin 
2578233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
2579233ce578SJohn Baldwin 	    minor)							\
2580233ce578SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name);
2581233ce578SJohn Baldwin 
2582233ce578SJohn Baldwin /*
2583233ce578SJohn Baldwin  * Ensure that invalid cipher suites are rejected for receive.
2584233ce578SJohn Baldwin  */
2585233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST);
2586233ce578SJohn Baldwin 
258783a54b58SJohn Baldwin static void
25882400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc,
25892400a7b1SJohn Baldwin     struct tls_enable *en)
259083a54b58SJohn Baldwin {
259183a54b58SJohn Baldwin 	int sockets[2];
259283a54b58SJohn Baldwin 
25932400a7b1SJohn Baldwin 	ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
259483a54b58SJohn Baldwin 
259583a54b58SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
259683a54b58SJohn Baldwin 	    sizeof(*en)) == -1);
259705a1d0f5SJohn Baldwin 	ATF_REQUIRE(errno == EPROTONOSUPPORT);
259883a54b58SJohn Baldwin 
25992c105205SJohn Baldwin 	close_sockets(sockets);
260083a54b58SJohn Baldwin }
260183a54b58SJohn Baldwin 
260283a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
260383a54b58SJohn Baldwin 	    auth_alg, minor)						\
260483a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name);			\
260583a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc)			\
260683a54b58SJohn Baldwin {									\
260783a54b58SJohn Baldwin 	struct tls_enable en;						\
260883a54b58SJohn Baldwin 	uint64_t seqno;							\
260983a54b58SJohn Baldwin 									\
261083a54b58SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
261183a54b58SJohn Baldwin 	seqno = random();						\
261283a54b58SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
261383a54b58SJohn Baldwin 	    &en);							\
26142400a7b1SJohn Baldwin 	test_ktls_unsupported_receive_cipher_suite(tc, &en);		\
261583a54b58SJohn Baldwin 	free_tls_enable(&en);						\
261683a54b58SJohn Baldwin }
261783a54b58SJohn Baldwin 
261883a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
261983a54b58SJohn Baldwin 	    auth_alg, minor)						\
262083a54b58SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name);
262183a54b58SJohn Baldwin 
262283a54b58SJohn Baldwin /*
262383a54b58SJohn Baldwin  * Ensure that valid cipher suites not supported for receive are
262483a54b58SJohn Baldwin  * rejected.
262583a54b58SJohn Baldwin  */
262664811651SJohn Baldwin TLS_10_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST);
262783a54b58SJohn Baldwin 
2628ee5686c6SMark Johnston /*
2629ee5686c6SMark Johnston  * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise
2630ee5686c6SMark Johnston  * KTLS error handling in the socket layer.
2631ee5686c6SMark Johnston  */
2632ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst);
2633ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc)
2634ee5686c6SMark Johnston {
2635ee5686c6SMark Johnston 	char buf[32];
2636ee5686c6SMark Johnston 	struct sockaddr_in dst;
2637ee5686c6SMark Johnston 	struct tls_enable en;
2638ee5686c6SMark Johnston 	ssize_t n;
2639ee5686c6SMark Johnston 	int s;
2640ee5686c6SMark Johnston 
2641ee5686c6SMark Johnston 	ATF_REQUIRE_KTLS();
2642ee5686c6SMark Johnston 
2643ee5686c6SMark Johnston 	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2644ee5686c6SMark Johnston 	ATF_REQUIRE(s >= 0);
2645ee5686c6SMark Johnston 
2646ee5686c6SMark Johnston 	build_tls_enable(CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
2647ee5686c6SMark Johnston 	    TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
2648ee5686c6SMark Johnston 
2649ee5686c6SMark Johnston 	ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en,
2650ee5686c6SMark Johnston 	    sizeof(en)) == 0);
2651ee5686c6SMark Johnston 
2652ee5686c6SMark Johnston 	memset(&dst, 0, sizeof(dst));
2653ee5686c6SMark Johnston 	dst.sin_family = AF_INET;
2654ee5686c6SMark Johnston 	dst.sin_len = sizeof(dst);
2655ee5686c6SMark Johnston 	dst.sin_addr.s_addr = htonl(INADDR_BROADCAST);
2656ee5686c6SMark Johnston 	dst.sin_port = htons(12345);
2657ee5686c6SMark Johnston 
2658ee5686c6SMark Johnston 	memset(buf, 0, sizeof(buf));
2659ee5686c6SMark Johnston 	n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst,
2660ee5686c6SMark Johnston 	    sizeof(dst));
2661ee5686c6SMark Johnston 
2662ee5686c6SMark Johnston 	/* Can't transmit to the broadcast address over TCP. */
2663ee5686c6SMark Johnston 	ATF_REQUIRE_ERRNO(EACCES, n == -1);
2664ee5686c6SMark Johnston 	ATF_REQUIRE(close(s) == 0);
2665ee5686c6SMark Johnston }
2666ee5686c6SMark Johnston 
2667a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp)
2668a10482eaSJohn Baldwin {
26693e7f8a8dSJohn Baldwin 	/* Transmit tests */
2670a10482eaSJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_TESTS);
2671a10482eaSJohn Baldwin 	AES_GCM_TESTS(ADD_TRANSMIT_TESTS);
2672a10482eaSJohn Baldwin 	CHACHA20_TESTS(ADD_TRANSMIT_TESTS);
267344265dc3SJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS);
26745de79eedSMark Johnston 	AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
26755de79eedSMark Johnston 	AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
26765de79eedSMark Johnston 	CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
2677d1c369f9SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST);
2678a10482eaSJohn Baldwin 
26793e7f8a8dSJohn Baldwin 	/* Receive tests */
268064811651SJohn Baldwin 	TLS_10_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST);
268164811651SJohn Baldwin 	AES_CBC_NONZERO_TESTS(ADD_RECEIVE_TESTS);
268205a1d0f5SJohn Baldwin 	AES_GCM_TESTS(ADD_RECEIVE_TESTS);
268305a1d0f5SJohn Baldwin 	CHACHA20_TESTS(ADD_RECEIVE_TESTS);
2684*65bd3adbSJohn Baldwin 	AES_CBC_NONZERO_TESTS(ADD_RECEIVE_MTE_TESTS);
2685*65bd3adbSJohn Baldwin 	AES_CBC_NONZERO_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS);
2686*65bd3adbSJohn Baldwin 	AES_GCM_12_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS);
2687*65bd3adbSJohn Baldwin 	TLS_13_TESTS(ADD_RECEIVE_TLS13_TESTS);
2688233ce578SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST);
2689233ce578SJohn Baldwin 
2690ee5686c6SMark Johnston 	/* Miscellaneous */
2691ee5686c6SMark Johnston 	ATF_TP_ADD_TC(tp, ktls_sendto_baddst);
2692ee5686c6SMark Johnston 
2693a10482eaSJohn Baldwin 	return (atf_no_error());
2694a10482eaSJohn Baldwin }
2695