xref: /freebsd/tests/sys/kern/ktls_test.c (revision 5de79eeddb9de079d108d1312148bcbefce45c27)
1a10482eaSJohn Baldwin /*-
2a10482eaSJohn Baldwin  * SPDX-License-Identifier: BSD-2-Clause
3a10482eaSJohn Baldwin  *
4a10482eaSJohn Baldwin  * Copyright (c) 2021 Netflix Inc.
5a10482eaSJohn Baldwin  * Written by: John Baldwin <jhb@FreeBSD.org>
6a10482eaSJohn Baldwin  *
7a10482eaSJohn Baldwin  * Redistribution and use in source and binary forms, with or without
8a10482eaSJohn Baldwin  * modification, are permitted provided that the following conditions
9a10482eaSJohn Baldwin  * are met:
10a10482eaSJohn Baldwin  * 1. Redistributions of source code must retain the above copyright
11a10482eaSJohn Baldwin  *    notice, this list of conditions and the following disclaimer.
12a10482eaSJohn Baldwin  * 2. Redistributions in binary form must reproduce the above copyright
13a10482eaSJohn Baldwin  *    notice, this list of conditions and the following disclaimer in the
14a10482eaSJohn Baldwin  *    documentation and/or other materials provided with the distribution.
15a10482eaSJohn Baldwin  *
16a10482eaSJohn Baldwin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17a10482eaSJohn Baldwin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18a10482eaSJohn Baldwin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19a10482eaSJohn Baldwin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20a10482eaSJohn Baldwin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21a10482eaSJohn Baldwin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22a10482eaSJohn Baldwin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23a10482eaSJohn Baldwin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24a10482eaSJohn Baldwin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25a10482eaSJohn Baldwin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26a10482eaSJohn Baldwin  * SUCH DAMAGE.
27a10482eaSJohn Baldwin  */
28a10482eaSJohn Baldwin 
29a10482eaSJohn Baldwin #include <sys/types.h>
30a10482eaSJohn Baldwin #include <sys/endian.h>
31a10482eaSJohn Baldwin #include <sys/event.h>
32a10482eaSJohn Baldwin #include <sys/ktls.h>
33a10482eaSJohn Baldwin #include <sys/socket.h>
34a10482eaSJohn Baldwin #include <sys/sysctl.h>
35a10482eaSJohn Baldwin #include <netinet/in.h>
36a10482eaSJohn Baldwin #include <netinet/tcp.h>
37a10482eaSJohn Baldwin #include <crypto/cryptodev.h>
38a10482eaSJohn Baldwin #include <assert.h>
39a10482eaSJohn Baldwin #include <err.h>
40a10482eaSJohn Baldwin #include <fcntl.h>
41a10482eaSJohn Baldwin #include <poll.h>
42a10482eaSJohn Baldwin #include <stdbool.h>
43a10482eaSJohn Baldwin #include <stdlib.h>
44a10482eaSJohn Baldwin #include <atf-c.h>
45a10482eaSJohn Baldwin 
46a10482eaSJohn Baldwin #include <openssl/err.h>
47a10482eaSJohn Baldwin #include <openssl/evp.h>
48a10482eaSJohn Baldwin #include <openssl/hmac.h>
49a10482eaSJohn Baldwin 
50a10482eaSJohn Baldwin static void
51a10482eaSJohn Baldwin require_ktls(void)
52a10482eaSJohn Baldwin {
53a10482eaSJohn Baldwin 	size_t len;
54a10482eaSJohn Baldwin 	bool enable;
55a10482eaSJohn Baldwin 
56a10482eaSJohn Baldwin 	len = sizeof(enable);
57a10482eaSJohn Baldwin 	if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) {
58a10482eaSJohn Baldwin 		if (errno == ENOENT)
59a10482eaSJohn Baldwin 			atf_tc_skip("kernel does not support TLS offload");
60a10482eaSJohn Baldwin 		atf_libc_error(errno, "Failed to read kern.ipc.tls.enable");
61a10482eaSJohn Baldwin 	}
62a10482eaSJohn Baldwin 
63a10482eaSJohn Baldwin 	if (!enable)
64a10482eaSJohn Baldwin 		atf_tc_skip("Kernel TLS is disabled");
65a10482eaSJohn Baldwin }
66a10482eaSJohn Baldwin 
67a10482eaSJohn Baldwin #define	ATF_REQUIRE_KTLS()	require_ktls()
68a10482eaSJohn Baldwin 
69a10482eaSJohn Baldwin static char
70a10482eaSJohn Baldwin rdigit(void)
71a10482eaSJohn Baldwin {
72a10482eaSJohn Baldwin 	/* ASCII printable values between 0x20 and 0x7e */
73a10482eaSJohn Baldwin 	return (0x20 + random() % (0x7f - 0x20));
74a10482eaSJohn Baldwin }
75a10482eaSJohn Baldwin 
76a10482eaSJohn Baldwin static char *
77a10482eaSJohn Baldwin alloc_buffer(size_t len)
78a10482eaSJohn Baldwin {
79a10482eaSJohn Baldwin 	char *buf;
80a10482eaSJohn Baldwin 	size_t i;
81a10482eaSJohn Baldwin 
82a10482eaSJohn Baldwin 	if (len == 0)
83a10482eaSJohn Baldwin 		return (NULL);
84a10482eaSJohn Baldwin 	buf = malloc(len);
85a10482eaSJohn Baldwin 	for (i = 0; i < len; i++)
86a10482eaSJohn Baldwin 		buf[i] = rdigit();
87a10482eaSJohn Baldwin 	return (buf);
88a10482eaSJohn Baldwin }
89a10482eaSJohn Baldwin 
90a10482eaSJohn Baldwin static bool
91a10482eaSJohn Baldwin socketpair_tcp(int *sv)
92a10482eaSJohn Baldwin {
93a10482eaSJohn Baldwin 	struct pollfd pfd;
94a10482eaSJohn Baldwin 	struct sockaddr_in sin;
95a10482eaSJohn Baldwin 	socklen_t len;
96a10482eaSJohn Baldwin 	int as, cs, ls;
97a10482eaSJohn Baldwin 
98a10482eaSJohn Baldwin 	ls = socket(PF_INET, SOCK_STREAM, 0);
99a10482eaSJohn Baldwin 	if (ls == -1) {
100a10482eaSJohn Baldwin 		warn("socket() for listen");
101a10482eaSJohn Baldwin 		return (false);
102a10482eaSJohn Baldwin 	}
103a10482eaSJohn Baldwin 
104a10482eaSJohn Baldwin 	memset(&sin, 0, sizeof(sin));
105a10482eaSJohn Baldwin 	sin.sin_len = sizeof(sin);
106a10482eaSJohn Baldwin 	sin.sin_family = AF_INET;
107a10482eaSJohn Baldwin 	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
108a10482eaSJohn Baldwin 	if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
109a10482eaSJohn Baldwin 		warn("bind");
110a10482eaSJohn Baldwin 		close(ls);
111a10482eaSJohn Baldwin 		return (false);
112a10482eaSJohn Baldwin 	}
113a10482eaSJohn Baldwin 
114a10482eaSJohn Baldwin 	if (listen(ls, 1) == -1) {
115a10482eaSJohn Baldwin 		warn("listen");
116a10482eaSJohn Baldwin 		close(ls);
117a10482eaSJohn Baldwin 		return (false);
118a10482eaSJohn Baldwin 	}
119a10482eaSJohn Baldwin 
120a10482eaSJohn Baldwin 	len = sizeof(sin);
121a10482eaSJohn Baldwin 	if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) {
122a10482eaSJohn Baldwin 		warn("getsockname");
123a10482eaSJohn Baldwin 		close(ls);
124a10482eaSJohn Baldwin 		return (false);
125a10482eaSJohn Baldwin 	}
126a10482eaSJohn Baldwin 
127a10482eaSJohn Baldwin 	cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
128a10482eaSJohn Baldwin 	if (cs == -1) {
129a10482eaSJohn Baldwin 		warn("socket() for connect");
130a10482eaSJohn Baldwin 		close(ls);
131a10482eaSJohn Baldwin 		return (false);
132a10482eaSJohn Baldwin 	}
133a10482eaSJohn Baldwin 
134a10482eaSJohn Baldwin 	if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
135a10482eaSJohn Baldwin 		if (errno != EINPROGRESS) {
136a10482eaSJohn Baldwin 			warn("connect");
137a10482eaSJohn Baldwin 			close(ls);
138a10482eaSJohn Baldwin 			close(cs);
139a10482eaSJohn Baldwin 			return (false);
140a10482eaSJohn Baldwin 		}
141a10482eaSJohn Baldwin 	}
142a10482eaSJohn Baldwin 
143a10482eaSJohn Baldwin 	as = accept4(ls, NULL, NULL, SOCK_NONBLOCK);
144a10482eaSJohn Baldwin 	if (as == -1) {
145a10482eaSJohn Baldwin 		warn("accept4");
146a10482eaSJohn Baldwin 		close(ls);
147a10482eaSJohn Baldwin 		close(cs);
148a10482eaSJohn Baldwin 		return (false);
149a10482eaSJohn Baldwin 	}
150a10482eaSJohn Baldwin 
151a10482eaSJohn Baldwin 	close(ls);
152a10482eaSJohn Baldwin 
153a10482eaSJohn Baldwin 	pfd.fd = cs;
154a10482eaSJohn Baldwin 	pfd.events = POLLOUT;
155a10482eaSJohn Baldwin 	pfd.revents = 0;
156a10482eaSJohn Baldwin 	ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1);
157a10482eaSJohn Baldwin 	ATF_REQUIRE(pfd.revents == POLLOUT);
158a10482eaSJohn Baldwin 
159a10482eaSJohn Baldwin 	sv[0] = cs;
160a10482eaSJohn Baldwin 	sv[1] = as;
161a10482eaSJohn Baldwin 	return (true);
162a10482eaSJohn Baldwin }
163a10482eaSJohn Baldwin 
164a10482eaSJohn Baldwin static void
165a10482eaSJohn Baldwin fd_set_blocking(int fd)
166a10482eaSJohn Baldwin {
167a10482eaSJohn Baldwin 	int flags;
168a10482eaSJohn Baldwin 
169a10482eaSJohn Baldwin 	ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1);
170a10482eaSJohn Baldwin 	flags &= ~O_NONBLOCK;
171a10482eaSJohn Baldwin 	ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1);
172a10482eaSJohn Baldwin }
173a10482eaSJohn Baldwin 
174a10482eaSJohn Baldwin static bool
175a10482eaSJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
176a10482eaSJohn Baldwin     const char *input, char *output, size_t size)
177a10482eaSJohn Baldwin {
178a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
179a10482eaSJohn Baldwin 	int outl, total;
180a10482eaSJohn Baldwin 
181a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
182a10482eaSJohn Baldwin 	if (ctx == NULL) {
183a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
184a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
185a10482eaSJohn Baldwin 		return (false);
186a10482eaSJohn Baldwin 	}
187a10482eaSJohn Baldwin 	if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key,
188a10482eaSJohn Baldwin 	    (const u_char *)iv, 0) != 1) {
189a10482eaSJohn Baldwin 		warnx("EVP_CipherInit_ex failed: %s",
190a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
191a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
192a10482eaSJohn Baldwin 		return (false);
193a10482eaSJohn Baldwin 	}
194a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
195a10482eaSJohn Baldwin 	if (EVP_CipherUpdate(ctx, (u_char *)output, &outl,
196a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
197a10482eaSJohn Baldwin 		warnx("EVP_CipherUpdate failed: %s",
198a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
199a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
200a10482eaSJohn Baldwin 		return (false);
201a10482eaSJohn Baldwin 	}
202a10482eaSJohn Baldwin 	total = outl;
203a10482eaSJohn Baldwin 	if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
204a10482eaSJohn Baldwin 		warnx("EVP_CipherFinal_ex failed: %s",
205a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
206a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
207a10482eaSJohn Baldwin 		return (false);
208a10482eaSJohn Baldwin 	}
209a10482eaSJohn Baldwin 	total += outl;
210a10482eaSJohn Baldwin 	if ((size_t)total != size) {
211a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
212a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
213a10482eaSJohn Baldwin 		return (false);
214a10482eaSJohn Baldwin 	}
215a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
216a10482eaSJohn Baldwin 	return (true);
217a10482eaSJohn Baldwin }
218a10482eaSJohn Baldwin 
219a10482eaSJohn Baldwin static bool
220a10482eaSJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
221a10482eaSJohn Baldwin     size_t aad_len, const void *buffer, size_t len, const void *digest)
222a10482eaSJohn Baldwin {
223a10482eaSJohn Baldwin 	HMAC_CTX *ctx;
224a10482eaSJohn Baldwin 	unsigned char digest2[EVP_MAX_MD_SIZE];
225a10482eaSJohn Baldwin 	u_int digest_len;
226a10482eaSJohn Baldwin 
227a10482eaSJohn Baldwin 	ctx = HMAC_CTX_new();
228a10482eaSJohn Baldwin 	if (ctx == NULL) {
229a10482eaSJohn Baldwin 		warnx("HMAC_CTX_new failed: %s",
230a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
231a10482eaSJohn Baldwin 		return (false);
232a10482eaSJohn Baldwin 	}
233a10482eaSJohn Baldwin 	if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) {
234a10482eaSJohn Baldwin 		warnx("HMAC_Init_ex failed: %s",
235a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
236a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
237a10482eaSJohn Baldwin 		return (false);
238a10482eaSJohn Baldwin 	}
239a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, aad, aad_len) != 1) {
240a10482eaSJohn Baldwin 		warnx("HMAC_Update (aad) failed: %s",
241a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
242a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
243a10482eaSJohn Baldwin 		return (false);
244a10482eaSJohn Baldwin 	}
245a10482eaSJohn Baldwin 	if (HMAC_Update(ctx, buffer, len) != 1) {
246a10482eaSJohn Baldwin 		warnx("HMAC_Update (payload) failed: %s",
247a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
248a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
249a10482eaSJohn Baldwin 		return (false);
250a10482eaSJohn Baldwin 	}
251a10482eaSJohn Baldwin 	if (HMAC_Final(ctx, digest2, &digest_len) != 1) {
252a10482eaSJohn Baldwin 		warnx("HMAC_Final failed: %s",
253a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
254a10482eaSJohn Baldwin 		HMAC_CTX_free(ctx);
255a10482eaSJohn Baldwin 		return (false);
256a10482eaSJohn Baldwin 	}
257a10482eaSJohn Baldwin 	HMAC_CTX_free(ctx);
258a10482eaSJohn Baldwin 	if (memcmp(digest, digest2, digest_len) != 0) {
259a10482eaSJohn Baldwin 		warnx("HMAC mismatch");
260a10482eaSJohn Baldwin 		return (false);
261a10482eaSJohn Baldwin 	}
262a10482eaSJohn Baldwin 	return (true);
263a10482eaSJohn Baldwin }
264a10482eaSJohn Baldwin 
265a10482eaSJohn Baldwin static bool
2663e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
2673e7f8a8dSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
2683e7f8a8dSJohn Baldwin     size_t size, char *tag, size_t tag_len)
2693e7f8a8dSJohn Baldwin {
2703e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
2713e7f8a8dSJohn Baldwin 	int outl, total;
2723e7f8a8dSJohn Baldwin 
2733e7f8a8dSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
2743e7f8a8dSJohn Baldwin 	if (ctx == NULL) {
2753e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
2763e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
2773e7f8a8dSJohn Baldwin 		return (false);
2783e7f8a8dSJohn Baldwin 	}
2793e7f8a8dSJohn Baldwin 	if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
2803e7f8a8dSJohn Baldwin 	    (const u_char *)nonce) != 1) {
2813e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptInit_ex failed: %s",
2823e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
2833e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
2843e7f8a8dSJohn Baldwin 		return (false);
2853e7f8a8dSJohn Baldwin 	}
2863e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
2873e7f8a8dSJohn Baldwin 	if (aad != NULL) {
2883e7f8a8dSJohn Baldwin 		if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
2893e7f8a8dSJohn Baldwin 		    aad_len) != 1) {
2903e7f8a8dSJohn Baldwin 			warnx("EVP_EncryptUpdate for AAD failed: %s",
2913e7f8a8dSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
2923e7f8a8dSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
2933e7f8a8dSJohn Baldwin 			return (false);
2943e7f8a8dSJohn Baldwin 		}
2953e7f8a8dSJohn Baldwin 	}
2963e7f8a8dSJohn Baldwin 	if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl,
2973e7f8a8dSJohn Baldwin 	    (const u_char *)input, size) != 1) {
2983e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptUpdate failed: %s",
2993e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3003e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3013e7f8a8dSJohn Baldwin 		return (false);
3023e7f8a8dSJohn Baldwin 	}
3033e7f8a8dSJohn Baldwin 	total = outl;
3043e7f8a8dSJohn Baldwin 	if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
3053e7f8a8dSJohn Baldwin 		warnx("EVP_EncryptFinal_ex failed: %s",
3063e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3073e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3083e7f8a8dSJohn Baldwin 		return (false);
3093e7f8a8dSJohn Baldwin 	}
3103e7f8a8dSJohn Baldwin 	total += outl;
3113e7f8a8dSJohn Baldwin 	if ((size_t)total != size) {
3123e7f8a8dSJohn Baldwin 		warnx("encrypt size mismatch: %zu vs %d", size, total);
3133e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3143e7f8a8dSJohn Baldwin 		return (false);
3153e7f8a8dSJohn Baldwin 	}
3163e7f8a8dSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) !=
3173e7f8a8dSJohn Baldwin 	    1) {
3183e7f8a8dSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s",
3193e7f8a8dSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
3203e7f8a8dSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
3213e7f8a8dSJohn Baldwin 		return (false);
3223e7f8a8dSJohn Baldwin 	}
3233e7f8a8dSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
3243e7f8a8dSJohn Baldwin 	return (true);
3253e7f8a8dSJohn Baldwin }
3263e7f8a8dSJohn Baldwin 
3273e7f8a8dSJohn Baldwin static bool
328a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
329a10482eaSJohn Baldwin     const void *aad, size_t aad_len, const char *input, char *output,
330a10482eaSJohn Baldwin     size_t size, const char *tag, size_t tag_len)
331a10482eaSJohn Baldwin {
332a10482eaSJohn Baldwin 	EVP_CIPHER_CTX *ctx;
333a10482eaSJohn Baldwin 	int outl, total;
334a10482eaSJohn Baldwin 	bool valid;
335a10482eaSJohn Baldwin 
336a10482eaSJohn Baldwin 	ctx = EVP_CIPHER_CTX_new();
337a10482eaSJohn Baldwin 	if (ctx == NULL) {
338a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_new failed: %s",
339a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
340a10482eaSJohn Baldwin 		return (false);
341a10482eaSJohn Baldwin 	}
342a10482eaSJohn Baldwin 	if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
343a10482eaSJohn Baldwin 	    (const u_char *)nonce) != 1) {
344a10482eaSJohn Baldwin 		warnx("EVP_DecryptInit_ex failed: %s",
345a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
346a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
347a10482eaSJohn Baldwin 		return (false);
348a10482eaSJohn Baldwin 	}
349a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_set_padding(ctx, 0);
350a10482eaSJohn Baldwin 	if (aad != NULL) {
351a10482eaSJohn Baldwin 		if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
352a10482eaSJohn Baldwin 		    aad_len) != 1) {
353a10482eaSJohn Baldwin 			warnx("EVP_DecryptUpdate for AAD failed: %s",
354a10482eaSJohn Baldwin 			    ERR_error_string(ERR_get_error(), NULL));
355a10482eaSJohn Baldwin 			EVP_CIPHER_CTX_free(ctx);
356a10482eaSJohn Baldwin 			return (false);
357a10482eaSJohn Baldwin 		}
358a10482eaSJohn Baldwin 	}
359a10482eaSJohn Baldwin 	if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl,
360a10482eaSJohn Baldwin 	    (const u_char *)input, size) != 1) {
361a10482eaSJohn Baldwin 		warnx("EVP_DecryptUpdate failed: %s",
362a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
363a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
364a10482eaSJohn Baldwin 		return (false);
365a10482eaSJohn Baldwin 	}
366a10482eaSJohn Baldwin 	total = outl;
367a10482eaSJohn Baldwin 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
368a10482eaSJohn Baldwin 	    __DECONST(char *, tag)) != 1) {
369a10482eaSJohn Baldwin 		warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s",
370a10482eaSJohn Baldwin 		    ERR_error_string(ERR_get_error(), NULL));
371a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
372a10482eaSJohn Baldwin 		return (false);
373a10482eaSJohn Baldwin 	}
374a10482eaSJohn Baldwin 	valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1);
375a10482eaSJohn Baldwin 	total += outl;
376a10482eaSJohn Baldwin 	if ((size_t)total != size) {
377a10482eaSJohn Baldwin 		warnx("decrypt size mismatch: %zu vs %d", size, total);
378a10482eaSJohn Baldwin 		EVP_CIPHER_CTX_free(ctx);
379a10482eaSJohn Baldwin 		return (false);
380a10482eaSJohn Baldwin 	}
381a10482eaSJohn Baldwin 	if (!valid)
382a10482eaSJohn Baldwin 		warnx("tag mismatch");
383a10482eaSJohn Baldwin 	EVP_CIPHER_CTX_free(ctx);
384a10482eaSJohn Baldwin 	return (valid);
385a10482eaSJohn Baldwin }
386a10482eaSJohn Baldwin 
387a10482eaSJohn Baldwin static void
388a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg,
389a10482eaSJohn Baldwin     int minor, uint64_t seqno, struct tls_enable *en)
390a10482eaSJohn Baldwin {
391a10482eaSJohn Baldwin 	u_int auth_key_len, iv_len;
392a10482eaSJohn Baldwin 
393a10482eaSJohn Baldwin 	memset(en, 0, sizeof(*en));
394a10482eaSJohn Baldwin 
395a10482eaSJohn Baldwin 	switch (cipher_alg) {
396a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
397a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_ZERO)
398a10482eaSJohn Baldwin 			iv_len = AES_BLOCK_LEN;
399a10482eaSJohn Baldwin 		else
400a10482eaSJohn Baldwin 			iv_len = 0;
401a10482eaSJohn Baldwin 		break;
402a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
403a10482eaSJohn Baldwin 		if (minor == TLS_MINOR_VER_TWO)
404a10482eaSJohn Baldwin 			iv_len = TLS_AEAD_GCM_LEN;
405a10482eaSJohn Baldwin 		else
406a10482eaSJohn Baldwin 			iv_len = TLS_1_3_GCM_IV_LEN;
407a10482eaSJohn Baldwin 		break;
408a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
409a10482eaSJohn Baldwin 		iv_len = TLS_CHACHA20_IV_LEN;
410a10482eaSJohn Baldwin 		break;
411a10482eaSJohn Baldwin 	default:
412a10482eaSJohn Baldwin 		iv_len = 0;
413a10482eaSJohn Baldwin 		break;
414a10482eaSJohn Baldwin 	}
415a10482eaSJohn Baldwin 	switch (auth_alg) {
416a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
417a10482eaSJohn Baldwin 		auth_key_len = SHA1_HASH_LEN;
418a10482eaSJohn Baldwin 		break;
419a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
420a10482eaSJohn Baldwin 		auth_key_len = SHA2_256_HASH_LEN;
421a10482eaSJohn Baldwin 		break;
422a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
423a10482eaSJohn Baldwin 		auth_key_len = SHA2_384_HASH_LEN;
424a10482eaSJohn Baldwin 		break;
425a10482eaSJohn Baldwin 	default:
426a10482eaSJohn Baldwin 		auth_key_len = 0;
427a10482eaSJohn Baldwin 		break;
428a10482eaSJohn Baldwin 	}
429a10482eaSJohn Baldwin 	en->cipher_key = alloc_buffer(cipher_key_len);
430a10482eaSJohn Baldwin 	en->iv = alloc_buffer(iv_len);
431a10482eaSJohn Baldwin 	en->auth_key = alloc_buffer(auth_key_len);
432a10482eaSJohn Baldwin 	en->cipher_algorithm = cipher_alg;
433a10482eaSJohn Baldwin 	en->cipher_key_len = cipher_key_len;
434a10482eaSJohn Baldwin 	en->iv_len = iv_len;
435a10482eaSJohn Baldwin 	en->auth_algorithm = auth_alg;
436a10482eaSJohn Baldwin 	en->auth_key_len = auth_key_len;
437a10482eaSJohn Baldwin 	en->tls_vmajor = TLS_MAJOR_VER_ONE;
438a10482eaSJohn Baldwin 	en->tls_vminor = minor;
439a10482eaSJohn Baldwin 	be64enc(en->rec_seq, seqno);
440a10482eaSJohn Baldwin }
441a10482eaSJohn Baldwin 
442a10482eaSJohn Baldwin static void
443a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en)
444a10482eaSJohn Baldwin {
445a10482eaSJohn Baldwin 	free(__DECONST(void *, en->cipher_key));
446a10482eaSJohn Baldwin 	free(__DECONST(void *, en->iv));
447a10482eaSJohn Baldwin 	free(__DECONST(void *, en->auth_key));
448a10482eaSJohn Baldwin }
449a10482eaSJohn Baldwin 
450a10482eaSJohn Baldwin static const EVP_CIPHER *
451a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en)
452a10482eaSJohn Baldwin {
453a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
454a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
455a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
456a10482eaSJohn Baldwin 		case 128 / 8:
457a10482eaSJohn Baldwin 			return (EVP_aes_128_cbc());
458a10482eaSJohn Baldwin 		case 256 / 8:
459a10482eaSJohn Baldwin 			return (EVP_aes_256_cbc());
460a10482eaSJohn Baldwin 		default:
461a10482eaSJohn Baldwin 			return (NULL);
462a10482eaSJohn Baldwin 		}
463a10482eaSJohn Baldwin 		break;
464a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
465a10482eaSJohn Baldwin 		switch (en->cipher_key_len) {
466a10482eaSJohn Baldwin 		case 128 / 8:
467a10482eaSJohn Baldwin 			return (EVP_aes_128_gcm());
468a10482eaSJohn Baldwin 		case 256 / 8:
469a10482eaSJohn Baldwin 			return (EVP_aes_256_gcm());
470a10482eaSJohn Baldwin 		default:
471a10482eaSJohn Baldwin 			return (NULL);
472a10482eaSJohn Baldwin 		}
473a10482eaSJohn Baldwin 		break;
474a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
475a10482eaSJohn Baldwin 		return (EVP_chacha20_poly1305());
476a10482eaSJohn Baldwin 	default:
477a10482eaSJohn Baldwin 		return (NULL);
478a10482eaSJohn Baldwin 	}
479a10482eaSJohn Baldwin }
480a10482eaSJohn Baldwin 
481a10482eaSJohn Baldwin static const EVP_MD *
482a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en)
483a10482eaSJohn Baldwin {
484a10482eaSJohn Baldwin 	switch (en->auth_algorithm) {
485a10482eaSJohn Baldwin 	case CRYPTO_SHA1_HMAC:
486a10482eaSJohn Baldwin 		return (EVP_sha1());
487a10482eaSJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
488a10482eaSJohn Baldwin 		return (EVP_sha256());
489a10482eaSJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
490a10482eaSJohn Baldwin 		return (EVP_sha384());
491a10482eaSJohn Baldwin 	default:
492a10482eaSJohn Baldwin 		return (NULL);
493a10482eaSJohn Baldwin 	}
494a10482eaSJohn Baldwin }
495a10482eaSJohn Baldwin 
496a10482eaSJohn Baldwin static size_t
497a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en)
498a10482eaSJohn Baldwin {
499a10482eaSJohn Baldwin 	size_t len;
500a10482eaSJohn Baldwin 
501a10482eaSJohn Baldwin 	len = sizeof(struct tls_record_layer);
502a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
503a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
504a10482eaSJohn Baldwin 		if (en->tls_vminor != TLS_MINOR_VER_ZERO)
505a10482eaSJohn Baldwin 			len += AES_BLOCK_LEN;
506a10482eaSJohn Baldwin 		return (len);
507a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
508a10482eaSJohn Baldwin 		if (en->tls_vminor == TLS_MINOR_VER_TWO)
509a10482eaSJohn Baldwin 			len += sizeof(uint64_t);
510a10482eaSJohn Baldwin 		return (len);
511a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
512a10482eaSJohn Baldwin 		return (len);
513a10482eaSJohn Baldwin 	default:
514a10482eaSJohn Baldwin 		return (0);
515a10482eaSJohn Baldwin 	}
516a10482eaSJohn Baldwin }
517a10482eaSJohn Baldwin 
518a10482eaSJohn Baldwin static size_t
519a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en)
520a10482eaSJohn Baldwin {
521a10482eaSJohn Baldwin 	switch (en->cipher_algorithm) {
522a10482eaSJohn Baldwin 	case CRYPTO_AES_CBC:
523a10482eaSJohn Baldwin 		switch (en->auth_algorithm) {
524a10482eaSJohn Baldwin 		case CRYPTO_SHA1_HMAC:
525a10482eaSJohn Baldwin 			return (SHA1_HASH_LEN);
526a10482eaSJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
527a10482eaSJohn Baldwin 			return (SHA2_256_HASH_LEN);
528a10482eaSJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
529a10482eaSJohn Baldwin 			return (SHA2_384_HASH_LEN);
530a10482eaSJohn Baldwin 		default:
531a10482eaSJohn Baldwin 			return (0);
532a10482eaSJohn Baldwin 		}
533a10482eaSJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
534a10482eaSJohn Baldwin 		return (AES_GMAC_HASH_LEN);
535a10482eaSJohn Baldwin 	case CRYPTO_CHACHA20_POLY1305:
536a10482eaSJohn Baldwin 		return (POLY1305_HASH_LEN);
537a10482eaSJohn Baldwin 	default:
538a10482eaSJohn Baldwin 		return (0);
539a10482eaSJohn Baldwin 	}
540a10482eaSJohn Baldwin }
541a10482eaSJohn Baldwin 
542a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */
543a10482eaSJohn Baldwin static size_t
544a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en)
545a10482eaSJohn Baldwin {
546a10482eaSJohn Baldwin 	size_t len;
547a10482eaSJohn Baldwin 
548a10482eaSJohn Baldwin 	len = tls_mac_len(en);
549a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
550a10482eaSJohn Baldwin 		len += AES_BLOCK_LEN;
551a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
552a10482eaSJohn Baldwin 		len++;
553a10482eaSJohn Baldwin 	return (len);
554a10482eaSJohn Baldwin }
555a10482eaSJohn Baldwin 
556a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */
557a10482eaSJohn Baldwin static void
558a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len,
559a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad)
560a10482eaSJohn Baldwin {
561a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
562a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
563a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
564a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
565a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
566a10482eaSJohn Baldwin }
567a10482eaSJohn Baldwin 
568a10482eaSJohn Baldwin static void
569a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len,
570a10482eaSJohn Baldwin     const struct tls_record_layer *hdr, uint64_t seqno,
571a10482eaSJohn Baldwin     struct tls_aead_data *ad)
572a10482eaSJohn Baldwin {
573a10482eaSJohn Baldwin 	ad->seq = htobe64(seqno);
574a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
575a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
576a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
577a10482eaSJohn Baldwin 	ad->tls_length = htons(len);
578a10482eaSJohn Baldwin }
579a10482eaSJohn Baldwin 
580a10482eaSJohn Baldwin static void
581a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr,
582a10482eaSJohn Baldwin     uint64_t seqno, struct tls_aead_data_13 *ad)
583a10482eaSJohn Baldwin {
584a10482eaSJohn Baldwin 	ad->type = hdr->tls_type;
585a10482eaSJohn Baldwin 	ad->tls_vmajor = hdr->tls_vmajor;
586a10482eaSJohn Baldwin 	ad->tls_vminor = hdr->tls_vminor;
587a10482eaSJohn Baldwin 	ad->tls_length = hdr->tls_length;
588a10482eaSJohn Baldwin }
589a10482eaSJohn Baldwin 
590a10482eaSJohn Baldwin static void
591a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr,
592a10482eaSJohn Baldwin     char *nonce)
593a10482eaSJohn Baldwin {
594a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN);
595a10482eaSJohn Baldwin 	memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t));
596a10482eaSJohn Baldwin }
597a10482eaSJohn Baldwin 
598a10482eaSJohn Baldwin static void
599a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce)
600a10482eaSJohn Baldwin {
601a10482eaSJohn Baldwin 	static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN,
602a10482eaSJohn Baldwin 	    "TLS 1.3 nonce length mismatch");
603a10482eaSJohn Baldwin 	memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN);
604a10482eaSJohn Baldwin 	*(uint64_t *)(nonce + 4) ^= htobe64(seqno);
605a10482eaSJohn Baldwin }
606a10482eaSJohn Baldwin 
607a10482eaSJohn Baldwin /*
608a10482eaSJohn Baldwin  * Decrypt a TLS record 'len' bytes long at 'src' and store the result at
609a10482eaSJohn Baldwin  * 'dst'.  If the TLS record header length doesn't match or 'dst' doesn't
610a10482eaSJohn Baldwin  * have sufficient room ('avail'), fail the test.
611a10482eaSJohn Baldwin  */
612a10482eaSJohn Baldwin static size_t
613a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src,
614a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
615a10482eaSJohn Baldwin {
616a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
617a10482eaSJohn Baldwin 	struct tls_mac_data aad;
618a10482eaSJohn Baldwin 	const char *iv;
619a10482eaSJohn Baldwin 	char *buf;
620a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
621a10482eaSJohn Baldwin 	int padding;
622a10482eaSJohn Baldwin 
623a10482eaSJohn Baldwin 	hdr = src;
624a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
625a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
626a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
627a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor);
628a10482eaSJohn Baldwin 
629a10482eaSJohn Baldwin 	/* First, decrypt the outer payload into a temporary buffer. */
630a10482eaSJohn Baldwin 	payload_len = len - hdr_len;
631a10482eaSJohn Baldwin 	buf = malloc(payload_len);
632a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
633a10482eaSJohn Baldwin 		iv = en->iv;
634a10482eaSJohn Baldwin 	else
635a10482eaSJohn Baldwin 		iv = (void *)(hdr + 1);
636a10482eaSJohn Baldwin 	ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
637a10482eaSJohn Baldwin 	    (const u_char *)src + hdr_len, buf, payload_len));
638a10482eaSJohn Baldwin 
639a10482eaSJohn Baldwin 	/*
640a10482eaSJohn Baldwin 	 * Copy the last encrypted block to use as the IV for the next
641a10482eaSJohn Baldwin 	 * record for TLS 1.0.
642a10482eaSJohn Baldwin 	 */
643a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_ZERO)
644a10482eaSJohn Baldwin 		memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src +
645a10482eaSJohn Baldwin 		    (len - AES_BLOCK_LEN), AES_BLOCK_LEN);
646a10482eaSJohn Baldwin 
647a10482eaSJohn Baldwin 	/*
648a10482eaSJohn Baldwin 	 * Verify trailing padding and strip.
649a10482eaSJohn Baldwin 	 *
650a10482eaSJohn Baldwin 	 * The kernel always generates the smallest amount of padding.
651a10482eaSJohn Baldwin 	 */
652a10482eaSJohn Baldwin 	padding = buf[payload_len - 1] + 1;
653a10482eaSJohn Baldwin 	ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN);
654a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len >= mac_len + padding);
655a10482eaSJohn Baldwin 	payload_len -= padding;
656a10482eaSJohn Baldwin 
657a10482eaSJohn Baldwin 	/* Verify HMAC. */
658a10482eaSJohn Baldwin 	payload_len -= mac_len;
659a10482eaSJohn Baldwin 	tls_mte_aad(en, payload_len, hdr, seqno, &aad);
660a10482eaSJohn Baldwin 	ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
661a10482eaSJohn Baldwin 	    &aad, sizeof(aad), buf, payload_len, buf + payload_len));
662a10482eaSJohn Baldwin 
663a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len <= avail);
664a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
665a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
666a10482eaSJohn Baldwin 	return (payload_len);
667a10482eaSJohn Baldwin }
668a10482eaSJohn Baldwin 
669a10482eaSJohn Baldwin static size_t
670a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src,
671a10482eaSJohn Baldwin     size_t len, void *dst, uint8_t *record_type)
672a10482eaSJohn Baldwin {
673a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
674a10482eaSJohn Baldwin 	struct tls_aead_data aad;
675a10482eaSJohn Baldwin 	char nonce[12];
676a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
677a10482eaSJohn Baldwin 
678a10482eaSJohn Baldwin 	hdr = src;
679a10482eaSJohn Baldwin 
680a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
681a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
682a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
683a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
684a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO);
685a10482eaSJohn Baldwin 
686a10482eaSJohn Baldwin 	tls_12_aead_aad(en, payload_len, hdr, seqno, &aad);
687a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
688a10482eaSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
689a10482eaSJohn Baldwin 	else
690a10482eaSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
691a10482eaSJohn Baldwin 
692a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
693a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len,
694a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
695a10482eaSJohn Baldwin 
696a10482eaSJohn Baldwin 	*record_type = hdr->tls_type;
697a10482eaSJohn Baldwin 	return (payload_len);
698a10482eaSJohn Baldwin }
699a10482eaSJohn Baldwin 
700a10482eaSJohn Baldwin static size_t
701a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src,
702a10482eaSJohn Baldwin     size_t len, void *dst, uint8_t *record_type)
703a10482eaSJohn Baldwin {
704a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
705a10482eaSJohn Baldwin 	struct tls_aead_data_13 aad;
706a10482eaSJohn Baldwin 	char nonce[12];
707a10482eaSJohn Baldwin 	char *buf;
708a10482eaSJohn Baldwin 	size_t hdr_len, mac_len, payload_len;
709a10482eaSJohn Baldwin 
710a10482eaSJohn Baldwin 	hdr = src;
711a10482eaSJohn Baldwin 
712a10482eaSJohn Baldwin 	hdr_len = tls_header_len(en);
713a10482eaSJohn Baldwin 	mac_len = tls_mac_len(en);
714a10482eaSJohn Baldwin 	payload_len = len - (hdr_len + mac_len);
715a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len >= 1);
716a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP);
717a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE);
718a10482eaSJohn Baldwin 	ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO);
719a10482eaSJohn Baldwin 
720a10482eaSJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
721a10482eaSJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
722a10482eaSJohn Baldwin 
723a10482eaSJohn Baldwin 	/*
724a10482eaSJohn Baldwin 	 * Have to use a temporary buffer for the output due to the
725a10482eaSJohn Baldwin 	 * record type as the last byte of the trailer.
726a10482eaSJohn Baldwin 	 */
727a10482eaSJohn Baldwin 	buf = malloc(payload_len);
728a10482eaSJohn Baldwin 
729a10482eaSJohn Baldwin 	ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
730a10482eaSJohn Baldwin 	    &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len,
731a10482eaSJohn Baldwin 	    (const char *)src + hdr_len + payload_len, mac_len));
732a10482eaSJohn Baldwin 
733a10482eaSJohn Baldwin 	/* Trim record type. */
734a10482eaSJohn Baldwin 	*record_type = buf[payload_len - 1];
735a10482eaSJohn Baldwin 	payload_len--;
736a10482eaSJohn Baldwin 
737a10482eaSJohn Baldwin 	memcpy(dst, buf, payload_len);
738a10482eaSJohn Baldwin 	free(buf);
739a10482eaSJohn Baldwin 
740a10482eaSJohn Baldwin 	return (payload_len);
741a10482eaSJohn Baldwin }
742a10482eaSJohn Baldwin 
743a10482eaSJohn Baldwin static size_t
744a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src,
745a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
746a10482eaSJohn Baldwin {
747a10482eaSJohn Baldwin 	const struct tls_record_layer *hdr;
748a10482eaSJohn Baldwin 	size_t payload_len;
749a10482eaSJohn Baldwin 
750a10482eaSJohn Baldwin 	hdr = src;
751a10482eaSJohn Baldwin 	ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len);
752a10482eaSJohn Baldwin 
753a10482eaSJohn Baldwin 	payload_len = len - (tls_header_len(en) + tls_trailer_len(en));
754a10482eaSJohn Baldwin 	ATF_REQUIRE(payload_len <= avail);
755a10482eaSJohn Baldwin 
756a10482eaSJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
757a10482eaSJohn Baldwin 		ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst,
758a10482eaSJohn Baldwin 		    record_type) == payload_len);
759a10482eaSJohn Baldwin 	} else {
760a10482eaSJohn Baldwin 		ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst,
761a10482eaSJohn Baldwin 		    record_type) == payload_len);
762a10482eaSJohn Baldwin 	}
763a10482eaSJohn Baldwin 
764a10482eaSJohn Baldwin 	return (payload_len);
765a10482eaSJohn Baldwin }
766a10482eaSJohn Baldwin 
767a10482eaSJohn Baldwin static size_t
768a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src,
769a10482eaSJohn Baldwin     size_t len, void *dst, size_t avail, uint8_t *record_type)
770a10482eaSJohn Baldwin {
771a10482eaSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_CBC)
772a10482eaSJohn Baldwin 		return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail,
773a10482eaSJohn Baldwin 		    record_type));
774a10482eaSJohn Baldwin 	else
775a10482eaSJohn Baldwin 		return (decrypt_tls_aead(en, seqno, src, len, dst, avail,
776a10482eaSJohn Baldwin 		    record_type));
777a10482eaSJohn Baldwin }
778a10482eaSJohn Baldwin 
7793e7f8a8dSJohn Baldwin /*
7803e7f8a8dSJohn Baldwin  * Encrypt a TLS record of type 'record_type' with payload 'len' bytes
7813e7f8a8dSJohn Baldwin  * long at 'src' and store the result at 'dst'.  If 'dst' doesn't have
7823e7f8a8dSJohn Baldwin  * sufficient room ('avail'), fail the test.
7833e7f8a8dSJohn Baldwin  */
7843e7f8a8dSJohn Baldwin static size_t
7853e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
7863e7f8a8dSJohn Baldwin     const void *src, size_t len, void *dst)
7873e7f8a8dSJohn Baldwin {
7883e7f8a8dSJohn Baldwin 	struct tls_record_layer *hdr;
7893e7f8a8dSJohn Baldwin 	struct tls_aead_data aad;
7903e7f8a8dSJohn Baldwin 	char nonce[12];
7913e7f8a8dSJohn Baldwin 	size_t hdr_len, mac_len, record_len;
7923e7f8a8dSJohn Baldwin 
7933e7f8a8dSJohn Baldwin 	hdr = dst;
7943e7f8a8dSJohn Baldwin 
7953e7f8a8dSJohn Baldwin 	hdr_len = tls_header_len(en);
7963e7f8a8dSJohn Baldwin 	mac_len = tls_mac_len(en);
7973e7f8a8dSJohn Baldwin 	record_len = hdr_len + len + mac_len;
7983e7f8a8dSJohn Baldwin 
7993e7f8a8dSJohn Baldwin 	hdr->tls_type = record_type;
8003e7f8a8dSJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
8013e7f8a8dSJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
8023e7f8a8dSJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
8033e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
8043e7f8a8dSJohn Baldwin 		memcpy(hdr + 1, &seqno, sizeof(seqno));
8053e7f8a8dSJohn Baldwin 
8063e7f8a8dSJohn Baldwin 	tls_12_aead_aad(en, len, hdr, seqno, &aad);
8073e7f8a8dSJohn Baldwin 	if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
8083e7f8a8dSJohn Baldwin 		tls_12_gcm_nonce(en, hdr, nonce);
8093e7f8a8dSJohn Baldwin 	else
8103e7f8a8dSJohn Baldwin 		tls_13_nonce(en, seqno, nonce);
8113e7f8a8dSJohn Baldwin 
8123e7f8a8dSJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
8133e7f8a8dSJohn Baldwin 	    &aad, sizeof(aad), src, (char *)dst + hdr_len, len,
8143e7f8a8dSJohn Baldwin 	    (char *)dst + hdr_len + len, mac_len));
8153e7f8a8dSJohn Baldwin 
8163e7f8a8dSJohn Baldwin 	return (record_len);
8173e7f8a8dSJohn Baldwin }
8183e7f8a8dSJohn Baldwin 
8193e7f8a8dSJohn Baldwin static size_t
82005a1d0f5SJohn Baldwin encrypt_tls_13_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
82105a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t padding)
82205a1d0f5SJohn Baldwin {
82305a1d0f5SJohn Baldwin 	struct tls_record_layer *hdr;
82405a1d0f5SJohn Baldwin 	struct tls_aead_data_13 aad;
82505a1d0f5SJohn Baldwin 	char nonce[12];
82605a1d0f5SJohn Baldwin 	char *buf;
82705a1d0f5SJohn Baldwin 	size_t hdr_len, mac_len, record_len;
82805a1d0f5SJohn Baldwin 
82905a1d0f5SJohn Baldwin 	hdr = dst;
83005a1d0f5SJohn Baldwin 
83105a1d0f5SJohn Baldwin 	hdr_len = tls_header_len(en);
83205a1d0f5SJohn Baldwin 	mac_len = tls_mac_len(en);
83305a1d0f5SJohn Baldwin 	record_len = hdr_len + len + 1 + padding + mac_len;
83405a1d0f5SJohn Baldwin 
83505a1d0f5SJohn Baldwin 	hdr->tls_type = TLS_RLTYPE_APP;
83605a1d0f5SJohn Baldwin 	hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
83705a1d0f5SJohn Baldwin 	hdr->tls_vminor = TLS_MINOR_VER_TWO;
83805a1d0f5SJohn Baldwin 	hdr->tls_length = htons(record_len - sizeof(*hdr));
83905a1d0f5SJohn Baldwin 
84005a1d0f5SJohn Baldwin 	tls_13_aad(en, hdr, seqno, &aad);
84105a1d0f5SJohn Baldwin 	tls_13_nonce(en, seqno, nonce);
84205a1d0f5SJohn Baldwin 
84305a1d0f5SJohn Baldwin 	/*
84405a1d0f5SJohn Baldwin 	 * Have to use a temporary buffer for the input so that the record
84505a1d0f5SJohn Baldwin 	 * type can be appended.
84605a1d0f5SJohn Baldwin 	 */
84705a1d0f5SJohn Baldwin 	buf = malloc(len + 1 + padding);
84805a1d0f5SJohn Baldwin 	memcpy(buf, src, len);
84905a1d0f5SJohn Baldwin 	buf[len] = record_type;
85005a1d0f5SJohn Baldwin 	memset(buf + len + 1, 0, padding);
85105a1d0f5SJohn Baldwin 
85205a1d0f5SJohn Baldwin 	ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
85305a1d0f5SJohn Baldwin 	    &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding,
85405a1d0f5SJohn Baldwin 	    (char *)dst + hdr_len + len + 1 + padding, mac_len));
85505a1d0f5SJohn Baldwin 
85605a1d0f5SJohn Baldwin 	free(buf);
85705a1d0f5SJohn Baldwin 
85805a1d0f5SJohn Baldwin 	return (record_len);
85905a1d0f5SJohn Baldwin }
86005a1d0f5SJohn Baldwin 
86105a1d0f5SJohn Baldwin static size_t
8623e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
86305a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, size_t padding)
8643e7f8a8dSJohn Baldwin {
8653e7f8a8dSJohn Baldwin 	size_t record_len;
8663e7f8a8dSJohn Baldwin 
86705a1d0f5SJohn Baldwin 	record_len = tls_header_len(en) + len + padding + tls_trailer_len(en);
8683e7f8a8dSJohn Baldwin 	ATF_REQUIRE(record_len <= avail);
8693e7f8a8dSJohn Baldwin 
87005a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_TWO) {
87105a1d0f5SJohn Baldwin 		ATF_REQUIRE(padding == 0);
87205a1d0f5SJohn Baldwin 		ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src,
87305a1d0f5SJohn Baldwin 		    len, dst) == record_len);
87405a1d0f5SJohn Baldwin 	} else
87505a1d0f5SJohn Baldwin 		ATF_REQUIRE(encrypt_tls_13_aead(en, record_type, seqno, src,
87605a1d0f5SJohn Baldwin 		    len, dst, padding) == record_len);
8773e7f8a8dSJohn Baldwin 
8783e7f8a8dSJohn Baldwin 	return (record_len);
8793e7f8a8dSJohn Baldwin }
8803e7f8a8dSJohn Baldwin 
8813e7f8a8dSJohn Baldwin static size_t
8823e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno,
88305a1d0f5SJohn Baldwin     const void *src, size_t len, void *dst, size_t avail, size_t padding)
8843e7f8a8dSJohn Baldwin {
88505a1d0f5SJohn Baldwin 	return (encrypt_tls_aead(en, record_type, seqno, src, len, dst, avail,
88605a1d0f5SJohn Baldwin 	    padding));
8873e7f8a8dSJohn Baldwin }
8883e7f8a8dSJohn Baldwin 
889a10482eaSJohn Baldwin static void
890a10482eaSJohn Baldwin test_ktls_transmit_app_data(struct tls_enable *en, uint64_t seqno, size_t len)
891a10482eaSJohn Baldwin {
892a10482eaSJohn Baldwin 	struct kevent ev;
893a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
894a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
895a10482eaSJohn Baldwin 	size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written;
896a10482eaSJohn Baldwin 	ssize_t rv;
897a10482eaSJohn Baldwin 	int kq, sockets[2];
898a10482eaSJohn Baldwin 	uint8_t record_type;
899a10482eaSJohn Baldwin 
900a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
901a10482eaSJohn Baldwin 	decrypted = malloc(len);
902a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
903a10482eaSJohn Baldwin 	    tls_trailer_len(en);
904a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
905a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
906a10482eaSJohn Baldwin 
907a10482eaSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
908a10482eaSJohn Baldwin 
909a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
910a10482eaSJohn Baldwin 
911a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
912a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
913a10482eaSJohn Baldwin 
914a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
915a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
916a10482eaSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
917a10482eaSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
918a10482eaSJohn Baldwin 
919a10482eaSJohn Baldwin 	decrypted_len = 0;
920a10482eaSJohn Baldwin 	outbuf_len = 0;
921a10482eaSJohn Baldwin 	written = 0;
922a10482eaSJohn Baldwin 
923a10482eaSJohn Baldwin 	while (decrypted_len != len) {
924a10482eaSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
925a10482eaSJohn Baldwin 
926a10482eaSJohn Baldwin 		switch (ev.filter) {
927a10482eaSJohn Baldwin 		case EVFILT_WRITE:
928a10482eaSJohn Baldwin 			/* Try to write any remaining data. */
929a10482eaSJohn Baldwin 			rv = write(ev.ident, plaintext + written,
930a10482eaSJohn Baldwin 			    len - written);
931a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
932a10482eaSJohn Baldwin 			    "failed to write to socket");
933a10482eaSJohn Baldwin 			written += rv;
934a10482eaSJohn Baldwin 			if (written == len) {
935a10482eaSJohn Baldwin 				ev.flags = EV_DISABLE;
936a10482eaSJohn Baldwin 				ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
937a10482eaSJohn Baldwin 				    NULL) == 0);
938a10482eaSJohn Baldwin 			}
939a10482eaSJohn Baldwin 			break;
940a10482eaSJohn Baldwin 
941a10482eaSJohn Baldwin 		case EVFILT_READ:
942a10482eaSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
943a10482eaSJohn Baldwin 
944a10482eaSJohn Baldwin 			/*
945a10482eaSJohn Baldwin 			 * Try to read data for the next TLS record
946a10482eaSJohn Baldwin 			 * into outbuf.  Start by reading the header
947a10482eaSJohn Baldwin 			 * to determine how much additional data to
948a10482eaSJohn Baldwin 			 * read.
949a10482eaSJohn Baldwin 			 */
950a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer)) {
951a10482eaSJohn Baldwin 				rv = read(ev.ident, outbuf + outbuf_len,
952a10482eaSJohn Baldwin 				    sizeof(struct tls_record_layer) -
953a10482eaSJohn Baldwin 				    outbuf_len);
954a10482eaSJohn Baldwin 				ATF_REQUIRE_MSG(rv > 0,
955a10482eaSJohn Baldwin 				    "failed to read from socket");
956a10482eaSJohn Baldwin 				outbuf_len += rv;
957a10482eaSJohn Baldwin 			}
958a10482eaSJohn Baldwin 
959a10482eaSJohn Baldwin 			if (outbuf_len < sizeof(struct tls_record_layer))
960a10482eaSJohn Baldwin 				break;
961a10482eaSJohn Baldwin 
962a10482eaSJohn Baldwin 			record_len = sizeof(struct tls_record_layer) +
963a10482eaSJohn Baldwin 			    ntohs(hdr->tls_length);
964d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len <= outbuf_cap);
965d71830cdSJohn Baldwin 			ATF_REQUIRE(record_len > outbuf_len);
966a10482eaSJohn Baldwin 			rv = read(ev.ident, outbuf + outbuf_len,
967a10482eaSJohn Baldwin 			    record_len - outbuf_len);
968a10482eaSJohn Baldwin 			if (rv == -1 && errno == EAGAIN)
969a10482eaSJohn Baldwin 				break;
970a10482eaSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0, "failed to read from socket");
971a10482eaSJohn Baldwin 
972a10482eaSJohn Baldwin 			outbuf_len += rv;
973a10482eaSJohn Baldwin 			if (outbuf_len == record_len) {
974a10482eaSJohn Baldwin 				decrypted_len += decrypt_tls_record(en, seqno,
975a10482eaSJohn Baldwin 				    outbuf, outbuf_len,
976a10482eaSJohn Baldwin 				    decrypted + decrypted_len,
977a10482eaSJohn Baldwin 				    len - decrypted_len, &record_type);
978a10482eaSJohn Baldwin 				ATF_REQUIRE(record_type == TLS_RLTYPE_APP);
979a10482eaSJohn Baldwin 
980a10482eaSJohn Baldwin 				seqno++;
981a10482eaSJohn Baldwin 				outbuf_len = 0;
982a10482eaSJohn Baldwin 			}
983a10482eaSJohn Baldwin 			break;
984a10482eaSJohn Baldwin 		}
985a10482eaSJohn Baldwin 	}
986a10482eaSJohn Baldwin 
987a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG(written == decrypted_len,
988a10482eaSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", decrypted_len, written);
989a10482eaSJohn Baldwin 
990a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
991a10482eaSJohn Baldwin 
992a10482eaSJohn Baldwin 	free(outbuf);
993a10482eaSJohn Baldwin 	free(decrypted);
994a10482eaSJohn Baldwin 	free(plaintext);
995a10482eaSJohn Baldwin 
996694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
997694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
998694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
999a10482eaSJohn Baldwin }
1000a10482eaSJohn Baldwin 
1001a10482eaSJohn Baldwin static void
1002a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len)
1003a10482eaSJohn Baldwin {
1004a10482eaSJohn Baldwin 	struct msghdr msg;
1005a10482eaSJohn Baldwin 	struct cmsghdr *cmsg;
1006a10482eaSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(type))];
1007a10482eaSJohn Baldwin 	struct iovec iov;
1008a10482eaSJohn Baldwin 
1009a10482eaSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
1010a10482eaSJohn Baldwin 
1011a10482eaSJohn Baldwin 	msg.msg_control = cbuf;
1012a10482eaSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
1013a10482eaSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
1014a10482eaSJohn Baldwin 	cmsg->cmsg_level = IPPROTO_TCP;
1015a10482eaSJohn Baldwin 	cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
1016a10482eaSJohn Baldwin 	cmsg->cmsg_len = CMSG_LEN(sizeof(type));
1017a10482eaSJohn Baldwin 	*(uint8_t *)CMSG_DATA(cmsg) = type;
1018a10482eaSJohn Baldwin 
1019a10482eaSJohn Baldwin 	iov.iov_base = data;
1020a10482eaSJohn Baldwin 	iov.iov_len = len;
1021a10482eaSJohn Baldwin 	msg.msg_iov = &iov;
1022a10482eaSJohn Baldwin 	msg.msg_iovlen = 1;
1023a10482eaSJohn Baldwin 
1024a10482eaSJohn Baldwin 	ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len);
1025a10482eaSJohn Baldwin }
1026a10482eaSJohn Baldwin 
1027a10482eaSJohn Baldwin static void
1028a10482eaSJohn Baldwin test_ktls_transmit_control(struct tls_enable *en, uint64_t seqno, uint8_t type,
1029a10482eaSJohn Baldwin     size_t len)
1030a10482eaSJohn Baldwin {
1031a10482eaSJohn Baldwin 	struct tls_record_layer *hdr;
1032a10482eaSJohn Baldwin 	char *plaintext, *decrypted, *outbuf;
1033a10482eaSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
1034a10482eaSJohn Baldwin 	ssize_t rv;
1035a10482eaSJohn Baldwin 	int sockets[2];
1036a10482eaSJohn Baldwin 	uint8_t record_type;
1037a10482eaSJohn Baldwin 
1038a10482eaSJohn Baldwin 	ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1039a10482eaSJohn Baldwin 
1040a10482eaSJohn Baldwin 	plaintext = alloc_buffer(len);
1041a10482eaSJohn Baldwin 	decrypted = malloc(len);
1042a10482eaSJohn Baldwin 	outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1043a10482eaSJohn Baldwin 	outbuf = malloc(outbuf_cap);
1044a10482eaSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
1045a10482eaSJohn Baldwin 
1046a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
1047a10482eaSJohn Baldwin 
1048a10482eaSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1049a10482eaSJohn Baldwin 	    sizeof(*en)) == 0);
1050a10482eaSJohn Baldwin 
1051a10482eaSJohn Baldwin 	fd_set_blocking(sockets[0]);
1052a10482eaSJohn Baldwin 	fd_set_blocking(sockets[1]);
1053a10482eaSJohn Baldwin 
1054a10482eaSJohn Baldwin 	ktls_send_control_message(sockets[1], type, plaintext, len);
1055a10482eaSJohn Baldwin 
1056a10482eaSJohn Baldwin 	/*
1057a10482eaSJohn Baldwin 	 * First read the header to determine how much additional data
1058a10482eaSJohn Baldwin 	 * to read.
1059a10482eaSJohn Baldwin 	 */
1060a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1061a10482eaSJohn Baldwin 	ATF_REQUIRE(rv == sizeof(struct tls_record_layer));
1062a10482eaSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
1063a10482eaSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
1064d71830cdSJohn Baldwin 	ATF_REQUIRE(record_len <= outbuf_cap);
1065a10482eaSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
1066a10482eaSJohn Baldwin 	    payload_len);
1067a10482eaSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)payload_len);
1068a10482eaSJohn Baldwin 
1069a10482eaSJohn Baldwin 	rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len,
1070a10482eaSJohn Baldwin 	    &record_type);
1071a10482eaSJohn Baldwin 
1072a10482eaSJohn Baldwin 	ATF_REQUIRE_MSG((ssize_t)len == rv,
1073a10482eaSJohn Baldwin 	    "read %zd decrypted bytes, but wrote %zu", rv, len);
1074a10482eaSJohn Baldwin 	ATF_REQUIRE(record_type == type);
1075a10482eaSJohn Baldwin 
1076a10482eaSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1077a10482eaSJohn Baldwin 
1078a10482eaSJohn Baldwin 	free(outbuf);
1079a10482eaSJohn Baldwin 	free(decrypted);
1080a10482eaSJohn Baldwin 	free(plaintext);
1081a10482eaSJohn Baldwin 
1082694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
1083694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
1084a10482eaSJohn Baldwin }
1085a10482eaSJohn Baldwin 
10860ff2a12aSJohn Baldwin static void
10870ff2a12aSJohn Baldwin test_ktls_transmit_empty_fragment(struct tls_enable *en, uint64_t seqno)
10880ff2a12aSJohn Baldwin {
10890ff2a12aSJohn Baldwin 	struct tls_record_layer *hdr;
10900ff2a12aSJohn Baldwin 	char *outbuf;
10910ff2a12aSJohn Baldwin 	size_t outbuf_cap, payload_len, record_len;
10920ff2a12aSJohn Baldwin 	ssize_t rv;
10930ff2a12aSJohn Baldwin 	int sockets[2];
10940ff2a12aSJohn Baldwin 	uint8_t record_type;
10950ff2a12aSJohn Baldwin 
10960ff2a12aSJohn Baldwin 	outbuf_cap = tls_header_len(en) + tls_trailer_len(en);
10970ff2a12aSJohn Baldwin 	outbuf = malloc(outbuf_cap);
10980ff2a12aSJohn Baldwin 	hdr = (struct tls_record_layer *)outbuf;
10990ff2a12aSJohn Baldwin 
11000ff2a12aSJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
11010ff2a12aSJohn Baldwin 
11020ff2a12aSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
11030ff2a12aSJohn Baldwin 	    sizeof(*en)) == 0);
11040ff2a12aSJohn Baldwin 
11050ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[0]);
11060ff2a12aSJohn Baldwin 	fd_set_blocking(sockets[1]);
11070ff2a12aSJohn Baldwin 
1108*5de79eedSMark Johnston 	/*
1109*5de79eedSMark Johnston 	 * A write of zero bytes should send an empty fragment only for
1110*5de79eedSMark Johnston 	 * TLS 1.0, otherwise an error should be raised.
1111*5de79eedSMark Johnston 	 */
11120ff2a12aSJohn Baldwin 	rv = write(sockets[1], NULL, 0);
1113*5de79eedSMark Johnston 	if (rv == 0) {
1114*5de79eedSMark Johnston 		ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC);
1115*5de79eedSMark Johnston 		ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO);
1116*5de79eedSMark Johnston 	} else {
1117*5de79eedSMark Johnston 		ATF_REQUIRE(rv == -1);
1118*5de79eedSMark Johnston 		ATF_REQUIRE(errno == EINVAL);
1119*5de79eedSMark Johnston 		goto out;
1120*5de79eedSMark Johnston 	}
11210ff2a12aSJohn Baldwin 
11220ff2a12aSJohn Baldwin 	/*
11230ff2a12aSJohn Baldwin 	 * First read the header to determine how much additional data
11240ff2a12aSJohn Baldwin 	 * to read.
11250ff2a12aSJohn Baldwin 	 */
11260ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
11270ff2a12aSJohn Baldwin 	ATF_REQUIRE(rv == sizeof(struct tls_record_layer));
11280ff2a12aSJohn Baldwin 	payload_len = ntohs(hdr->tls_length);
11290ff2a12aSJohn Baldwin 	record_len = payload_len + sizeof(struct tls_record_layer);
11300ff2a12aSJohn Baldwin 	ATF_REQUIRE(record_len <= outbuf_cap);
11310ff2a12aSJohn Baldwin 	rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
11320ff2a12aSJohn Baldwin 	    payload_len);
11330ff2a12aSJohn Baldwin 	ATF_REQUIRE(rv == (ssize_t)payload_len);
11340ff2a12aSJohn Baldwin 
11350ff2a12aSJohn Baldwin 	rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0,
11360ff2a12aSJohn Baldwin 	    &record_type);
11370ff2a12aSJohn Baldwin 
11380ff2a12aSJohn Baldwin 	ATF_REQUIRE_MSG(rv == 0,
11390ff2a12aSJohn Baldwin 	    "read %zd decrypted bytes for an empty fragment", rv);
11400ff2a12aSJohn Baldwin 	ATF_REQUIRE(record_type == TLS_RLTYPE_APP);
11410ff2a12aSJohn Baldwin 
1142*5de79eedSMark Johnston out:
11430ff2a12aSJohn Baldwin 	free(outbuf);
11440ff2a12aSJohn Baldwin 
1145694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
1146694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
11470ff2a12aSJohn Baldwin }
11480ff2a12aSJohn Baldwin 
11493e7f8a8dSJohn Baldwin static size_t
11503e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type,
11513e7f8a8dSJohn Baldwin     void *data, size_t len)
11523e7f8a8dSJohn Baldwin {
11533e7f8a8dSJohn Baldwin 	struct msghdr msg;
11543e7f8a8dSJohn Baldwin 	struct cmsghdr *cmsg;
11553e7f8a8dSJohn Baldwin 	struct tls_get_record *tgr;
11563e7f8a8dSJohn Baldwin 	char cbuf[CMSG_SPACE(sizeof(*tgr))];
11573e7f8a8dSJohn Baldwin 	struct iovec iov;
11583e7f8a8dSJohn Baldwin 	ssize_t rv;
11593e7f8a8dSJohn Baldwin 
11603e7f8a8dSJohn Baldwin 	memset(&msg, 0, sizeof(msg));
11613e7f8a8dSJohn Baldwin 
11623e7f8a8dSJohn Baldwin 	msg.msg_control = cbuf;
11633e7f8a8dSJohn Baldwin 	msg.msg_controllen = sizeof(cbuf);
11643e7f8a8dSJohn Baldwin 
11653e7f8a8dSJohn Baldwin 	iov.iov_base = data;
11663e7f8a8dSJohn Baldwin 	iov.iov_len = len;
11673e7f8a8dSJohn Baldwin 	msg.msg_iov = &iov;
11683e7f8a8dSJohn Baldwin 	msg.msg_iovlen = 1;
11693e7f8a8dSJohn Baldwin 
11703e7f8a8dSJohn Baldwin 	ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0);
11713e7f8a8dSJohn Baldwin 
11723e7f8a8dSJohn Baldwin 	ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR);
11733e7f8a8dSJohn Baldwin 
11743e7f8a8dSJohn Baldwin 	cmsg = CMSG_FIRSTHDR(&msg);
11753e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg != NULL);
11763e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP);
11773e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD);
11783e7f8a8dSJohn Baldwin 	ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr)));
11793e7f8a8dSJohn Baldwin 
11803e7f8a8dSJohn Baldwin 	tgr = (struct tls_get_record *)CMSG_DATA(cmsg);
11813e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_type == record_type);
11823e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor);
118305a1d0f5SJohn Baldwin 	/* XXX: Not sure if this is what OpenSSL expects? */
118405a1d0f5SJohn Baldwin 	if (en->tls_vminor == TLS_MINOR_VER_THREE)
118505a1d0f5SJohn Baldwin 		ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO);
118605a1d0f5SJohn Baldwin 	else
11873e7f8a8dSJohn Baldwin 		ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor);
11883e7f8a8dSJohn Baldwin 	ATF_REQUIRE(tgr->tls_length == htons(rv));
11893e7f8a8dSJohn Baldwin 
11903e7f8a8dSJohn Baldwin 	return (rv);
11913e7f8a8dSJohn Baldwin }
11923e7f8a8dSJohn Baldwin 
11933e7f8a8dSJohn Baldwin static void
119405a1d0f5SJohn Baldwin test_ktls_receive_app_data(struct tls_enable *en, uint64_t seqno, size_t len,
119505a1d0f5SJohn Baldwin     size_t padding)
11963e7f8a8dSJohn Baldwin {
11973e7f8a8dSJohn Baldwin 	struct kevent ev;
11983e7f8a8dSJohn Baldwin 	char *plaintext, *received, *outbuf;
11993e7f8a8dSJohn Baldwin 	size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written;
12003e7f8a8dSJohn Baldwin 	ssize_t rv;
12013e7f8a8dSJohn Baldwin 	int kq, sockets[2];
12023e7f8a8dSJohn Baldwin 
12033e7f8a8dSJohn Baldwin 	plaintext = alloc_buffer(len);
12043e7f8a8dSJohn Baldwin 	received = malloc(len);
12053e7f8a8dSJohn Baldwin 	outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
12063e7f8a8dSJohn Baldwin 	    tls_trailer_len(en);
12073e7f8a8dSJohn Baldwin 	outbuf = malloc(outbuf_cap);
12083e7f8a8dSJohn Baldwin 
12093e7f8a8dSJohn Baldwin 	ATF_REQUIRE((kq = kqueue()) != -1);
12103e7f8a8dSJohn Baldwin 
12113e7f8a8dSJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
12123e7f8a8dSJohn Baldwin 
12133e7f8a8dSJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
12143e7f8a8dSJohn Baldwin 	    sizeof(*en)) == 0);
12153e7f8a8dSJohn Baldwin 
12163e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
12173e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
12183e7f8a8dSJohn Baldwin 	EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
12193e7f8a8dSJohn Baldwin 	ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
12203e7f8a8dSJohn Baldwin 
12213e7f8a8dSJohn Baldwin 	received_len = 0;
12223e7f8a8dSJohn Baldwin 	outbuf_len = 0;
12233e7f8a8dSJohn Baldwin 	written = 0;
12243e7f8a8dSJohn Baldwin 
12253e7f8a8dSJohn Baldwin 	while (received_len != len) {
12263e7f8a8dSJohn Baldwin 		ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
12273e7f8a8dSJohn Baldwin 
12283e7f8a8dSJohn Baldwin 		switch (ev.filter) {
12293e7f8a8dSJohn Baldwin 		case EVFILT_WRITE:
12303e7f8a8dSJohn Baldwin 			/*
12313e7f8a8dSJohn Baldwin 			 * Compose the next TLS record to send.
12323e7f8a8dSJohn Baldwin 			 */
12333e7f8a8dSJohn Baldwin 			if (outbuf_len == 0) {
12343e7f8a8dSJohn Baldwin 				ATF_REQUIRE(written < len);
12353e7f8a8dSJohn Baldwin 				todo = len - written;
123605a1d0f5SJohn Baldwin 				if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding)
123705a1d0f5SJohn Baldwin 					todo = TLS_MAX_MSG_SIZE_V10_2 - padding;
12383e7f8a8dSJohn Baldwin 				outbuf_len = encrypt_tls_record(en,
12393e7f8a8dSJohn Baldwin 				    TLS_RLTYPE_APP, seqno, plaintext + written,
124005a1d0f5SJohn Baldwin 				    todo, outbuf, outbuf_cap, padding);
12413e7f8a8dSJohn Baldwin 				outbuf_sent = 0;
12423e7f8a8dSJohn Baldwin 				written += todo;
12433e7f8a8dSJohn Baldwin 				seqno++;
12443e7f8a8dSJohn Baldwin 			}
12453e7f8a8dSJohn Baldwin 
12463e7f8a8dSJohn Baldwin 			/*
12473e7f8a8dSJohn Baldwin 			 * Try to write the remainder of the current
12483e7f8a8dSJohn Baldwin 			 * TLS record.
12493e7f8a8dSJohn Baldwin 			 */
12503e7f8a8dSJohn Baldwin 			rv = write(ev.ident, outbuf + outbuf_sent,
12513e7f8a8dSJohn Baldwin 			    outbuf_len - outbuf_sent);
12523e7f8a8dSJohn Baldwin 			ATF_REQUIRE_MSG(rv > 0,
12533e7f8a8dSJohn Baldwin 			    "failed to write to socket");
12543e7f8a8dSJohn Baldwin 			outbuf_sent += rv;
12553e7f8a8dSJohn Baldwin 			if (outbuf_sent == outbuf_len) {
12563e7f8a8dSJohn Baldwin 				outbuf_len = 0;
12573e7f8a8dSJohn Baldwin 				if (written == len) {
12583e7f8a8dSJohn Baldwin 					ev.flags = EV_DISABLE;
12593e7f8a8dSJohn Baldwin 					ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
12603e7f8a8dSJohn Baldwin 					    NULL) == 0);
12613e7f8a8dSJohn Baldwin 				}
12623e7f8a8dSJohn Baldwin 			}
12633e7f8a8dSJohn Baldwin 			break;
12643e7f8a8dSJohn Baldwin 
12653e7f8a8dSJohn Baldwin 		case EVFILT_READ:
12663e7f8a8dSJohn Baldwin 			ATF_REQUIRE((ev.flags & EV_EOF) == 0);
12673e7f8a8dSJohn Baldwin 
12683e7f8a8dSJohn Baldwin 			rv = ktls_receive_tls_record(en, ev.ident,
12693e7f8a8dSJohn Baldwin 			    TLS_RLTYPE_APP, received + received_len,
12703e7f8a8dSJohn Baldwin 			    len - received_len);
12713e7f8a8dSJohn Baldwin 			received_len += rv;
12723e7f8a8dSJohn Baldwin 			break;
12733e7f8a8dSJohn Baldwin 		}
12743e7f8a8dSJohn Baldwin 	}
12753e7f8a8dSJohn Baldwin 
12763e7f8a8dSJohn Baldwin 	ATF_REQUIRE_MSG(written == received_len,
12773e7f8a8dSJohn Baldwin 	    "read %zu decrypted bytes, but wrote %zu", received_len, written);
12783e7f8a8dSJohn Baldwin 
12793e7f8a8dSJohn Baldwin 	ATF_REQUIRE(memcmp(plaintext, received, len) == 0);
12803e7f8a8dSJohn Baldwin 
12813e7f8a8dSJohn Baldwin 	free(outbuf);
12823e7f8a8dSJohn Baldwin 	free(received);
12833e7f8a8dSJohn Baldwin 	free(plaintext);
12843e7f8a8dSJohn Baldwin 
1285694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
1286694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
1287694c708dSJohn Baldwin 	ATF_REQUIRE(close(kq) == 0);
12883e7f8a8dSJohn Baldwin }
12893e7f8a8dSJohn Baldwin 
12900ff2a12aSJohn Baldwin #define	TLS_10_TESTS(M)							\
12910ff2a12aSJohn Baldwin 	M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8,			\
12920ff2a12aSJohn Baldwin 	    CRYPTO_SHA1_HMAC)						\
12930ff2a12aSJohn Baldwin 	M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8,			\
12940ff2a12aSJohn Baldwin 	    CRYPTO_SHA1_HMAC)
12950ff2a12aSJohn Baldwin 
129683a54b58SJohn Baldwin #define	TLS_13_TESTS(M)							\
129783a54b58SJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
129883a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
129983a54b58SJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
130083a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
130183a54b58SJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
130283a54b58SJohn Baldwin 	    TLS_MINOR_VER_THREE)
130383a54b58SJohn Baldwin 
1304a10482eaSJohn Baldwin #define	AES_CBC_TESTS(M)						\
1305a10482eaSJohn Baldwin 	M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1306a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)			\
1307a10482eaSJohn Baldwin 	M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1308a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)			\
1309a10482eaSJohn Baldwin 	M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1310a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1311a10482eaSJohn Baldwin 	M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1312a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE)			\
1313a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1314a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1315a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8,			\
1316a10482eaSJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO)			\
1317a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1318a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1319a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8,		\
1320a10482eaSJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO)			\
1321a10482eaSJohn Baldwin 	M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1322a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1323a10482eaSJohn Baldwin 	M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8,		\
1324a10482eaSJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO)			\
1325a10482eaSJohn Baldwin 
1326a10482eaSJohn Baldwin #define AES_GCM_TESTS(M)						\
1327a10482eaSJohn Baldwin 	M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1328a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1329a10482eaSJohn Baldwin 	M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1330a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1331a10482eaSJohn Baldwin 	M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1332a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)					\
1333a10482eaSJohn Baldwin 	M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0,		\
1334a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1335a10482eaSJohn Baldwin 
1336a10482eaSJohn Baldwin #define CHACHA20_TESTS(M)						\
1337a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1338a10482eaSJohn Baldwin 	    TLS_MINOR_VER_TWO)						\
1339a10482eaSJohn Baldwin 	M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1340a10482eaSJohn Baldwin 	    TLS_MINOR_VER_THREE)
1341a10482eaSJohn Baldwin 
1342a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1343a10482eaSJohn Baldwin 	    auth_alg, minor, name, len)					\
1344a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
1345a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1346a10482eaSJohn Baldwin {									\
1347a10482eaSJohn Baldwin 	struct tls_enable en;						\
1348a10482eaSJohn Baldwin 	uint64_t seqno;							\
1349a10482eaSJohn Baldwin 									\
1350a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1351a10482eaSJohn Baldwin 	seqno = random();						\
1352a10482eaSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
1353a10482eaSJohn Baldwin 	    &en);							\
1354a10482eaSJohn Baldwin 	test_ktls_transmit_app_data(&en, seqno, len);			\
1355a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1356a10482eaSJohn Baldwin }
1357a10482eaSJohn Baldwin 
1358a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1359a10482eaSJohn Baldwin 	    auth_alg, minor, name)					\
1360a10482eaSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1361a10482eaSJohn Baldwin 
1362a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
136344265dc3SJohn Baldwin 	    auth_alg, minor, name, type, len)				\
136444265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name);		\
136544265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc)			\
1366a10482eaSJohn Baldwin {									\
1367a10482eaSJohn Baldwin 	struct tls_enable en;						\
1368a10482eaSJohn Baldwin 	uint64_t seqno;							\
1369a10482eaSJohn Baldwin 									\
1370a10482eaSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1371a10482eaSJohn Baldwin 	seqno = random();						\
1372a10482eaSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1373a10482eaSJohn Baldwin 	    &en);							\
1374a10482eaSJohn Baldwin 	test_ktls_transmit_control(&en, seqno, type, len);		\
1375a10482eaSJohn Baldwin 	free_tls_enable(&en);						\
1376a10482eaSJohn Baldwin }
1377a10482eaSJohn Baldwin 
1378a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
137944265dc3SJohn Baldwin 	    auth_alg, minor, name)					\
138044265dc3SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1381a10482eaSJohn Baldwin 
13820ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
1383*5de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
13840ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment);	\
13850ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc)		\
13860ff2a12aSJohn Baldwin {									\
13870ff2a12aSJohn Baldwin 	struct tls_enable en;						\
13880ff2a12aSJohn Baldwin 	uint64_t seqno;							\
13890ff2a12aSJohn Baldwin 									\
13900ff2a12aSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
13910ff2a12aSJohn Baldwin 	seqno = random();						\
1392*5de79eedSMark Johnston 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
1393*5de79eedSMark Johnston 	    &en);							\
13940ff2a12aSJohn Baldwin 	test_ktls_transmit_empty_fragment(&en, seqno);			\
13950ff2a12aSJohn Baldwin 	free_tls_enable(&en);						\
13960ff2a12aSJohn Baldwin }
13970ff2a12aSJohn Baldwin 
13980ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg,	\
1399*5de79eedSMark Johnston 	    key_size, auth_alg, minor)					\
14000ff2a12aSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment);
14010ff2a12aSJohn Baldwin 
1402a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
1403a10482eaSJohn Baldwin 	    minor)							\
1404a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1405a10482eaSJohn Baldwin 	    auth_alg, minor, short, 64)					\
1406a10482eaSJohn Baldwin 	GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1407a10482eaSJohn Baldwin 	    auth_alg, minor, long, 64 * 1024)				\
1408a10482eaSJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
140944265dc3SJohn Baldwin 	    auth_alg, minor, control, 0x21 /* Alert */, 32)
1410a10482eaSJohn Baldwin 
1411a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
1412a10482eaSJohn Baldwin 	    minor)							\
1413a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1414a10482eaSJohn Baldwin 	    auth_alg, minor, short)					\
1415a10482eaSJohn Baldwin 	ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
1416a10482eaSJohn Baldwin 	    auth_alg, minor, long)					\
1417a10482eaSJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
141844265dc3SJohn Baldwin 	    auth_alg, minor, control)
1419a10482eaSJohn Baldwin 
1420a10482eaSJohn Baldwin /*
1421a10482eaSJohn Baldwin  * For each supported cipher suite, run three transmit tests:
1422a10482eaSJohn Baldwin  *
1423a10482eaSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
1424a10482eaSJohn Baldwin  *   a single TLS record)
1425a10482eaSJohn Baldwin  *
1426a10482eaSJohn Baldwin  * - a long test which sends 64KB of application data (split across
1427a10482eaSJohn Baldwin  *   multiple TLS records)
1428a10482eaSJohn Baldwin  *
1429a10482eaSJohn Baldwin  * - a control test which sends a single record with a specific
1430a10482eaSJohn Baldwin  *   content type via sendmsg()
1431a10482eaSJohn Baldwin  */
1432a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS);
1433a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS);
1434a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS);
1435a10482eaSJohn Baldwin 
143644265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
143744265dc3SJohn Baldwin 	    auth_alg, minor)						\
143844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
143944265dc3SJohn Baldwin 	    auth_alg, minor, padding_1, 0x21 /* Alert */, 1)		\
144044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
144144265dc3SJohn Baldwin 	    auth_alg, minor, padding_2, 0x21 /* Alert */, 2)		\
144244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
144344265dc3SJohn Baldwin 	    auth_alg, minor, padding_3, 0x21 /* Alert */, 3)		\
144444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
144544265dc3SJohn Baldwin 	    auth_alg, minor, padding_4, 0x21 /* Alert */, 4)		\
144644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
144744265dc3SJohn Baldwin 	    auth_alg, minor, padding_5, 0x21 /* Alert */, 5)		\
144844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
144944265dc3SJohn Baldwin 	    auth_alg, minor, padding_6, 0x21 /* Alert */, 6)		\
145044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
145144265dc3SJohn Baldwin 	    auth_alg, minor, padding_7, 0x21 /* Alert */, 7)		\
145244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
145344265dc3SJohn Baldwin 	    auth_alg, minor, padding_8, 0x21 /* Alert */, 8)		\
145444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
145544265dc3SJohn Baldwin 	    auth_alg, minor, padding_9, 0x21 /* Alert */, 9)		\
145644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
145744265dc3SJohn Baldwin 	    auth_alg, minor, padding_10, 0x21 /* Alert */, 10)		\
145844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
145944265dc3SJohn Baldwin 	    auth_alg, minor, padding_11, 0x21 /* Alert */, 11)		\
146044265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
146144265dc3SJohn Baldwin 	    auth_alg, minor, padding_12, 0x21 /* Alert */, 12)		\
146244265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
146344265dc3SJohn Baldwin 	    auth_alg, minor, padding_13, 0x21 /* Alert */, 13)		\
146444265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
146544265dc3SJohn Baldwin 	    auth_alg, minor, padding_14, 0x21 /* Alert */, 14)		\
146644265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
146744265dc3SJohn Baldwin 	    auth_alg, minor, padding_15, 0x21 /* Alert */, 15)		\
146844265dc3SJohn Baldwin 	GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
146944265dc3SJohn Baldwin 	    auth_alg, minor, padding_16, 0x21 /* Alert */, 16)
147044265dc3SJohn Baldwin 
147144265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size,	\
147244265dc3SJohn Baldwin 	    auth_alg, minor)						\
147344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
147444265dc3SJohn Baldwin 	    auth_alg, minor, padding_1)					\
147544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
147644265dc3SJohn Baldwin 	    auth_alg, minor, padding_2)					\
147744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
147844265dc3SJohn Baldwin 	    auth_alg, minor, padding_3)					\
147944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
148044265dc3SJohn Baldwin 	    auth_alg, minor, padding_4)					\
148144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
148244265dc3SJohn Baldwin 	    auth_alg, minor, padding_5)					\
148344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
148444265dc3SJohn Baldwin 	    auth_alg, minor, padding_6)					\
148544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
148644265dc3SJohn Baldwin 	    auth_alg, minor, padding_7)					\
148744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
148844265dc3SJohn Baldwin 	    auth_alg, minor, padding_8)					\
148944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
149044265dc3SJohn Baldwin 	    auth_alg, minor, padding_9)					\
149144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
149244265dc3SJohn Baldwin 	    auth_alg, minor, padding_10)				\
149344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
149444265dc3SJohn Baldwin 	    auth_alg, minor, padding_11)				\
149544265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
149644265dc3SJohn Baldwin 	    auth_alg, minor, padding_12)				\
149744265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
149844265dc3SJohn Baldwin 	    auth_alg, minor, padding_13)				\
149944265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
150044265dc3SJohn Baldwin 	    auth_alg, minor, padding_14)				\
150144265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
150244265dc3SJohn Baldwin 	    auth_alg, minor, padding_15)				\
150344265dc3SJohn Baldwin 	ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size,	\
150444265dc3SJohn Baldwin 	    auth_alg, minor, padding_16)
150544265dc3SJohn Baldwin 
150644265dc3SJohn Baldwin /*
150744265dc3SJohn Baldwin  * For AES-CBC MTE cipher suites using padding, add tests of messages
150844265dc3SJohn Baldwin  * with each possible padding size.  Note that the padding_<N> tests
150944265dc3SJohn Baldwin  * do not necessarily test <N> bytes of padding as the padding is a
151044265dc3SJohn Baldwin  * function of the cipher suite's MAC length.  However, cycling
151144265dc3SJohn Baldwin  * through all of the payload sizes from 1 to 16 should exercise all
151244265dc3SJohn Baldwin  * of the possible padding lengths for each suite.
151344265dc3SJohn Baldwin  */
151444265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS);
151544265dc3SJohn Baldwin 
15160ff2a12aSJohn Baldwin /*
15170ff2a12aSJohn Baldwin  * Test "empty fragments" which are TLS records with no payload that
15180ff2a12aSJohn Baldwin  * OpenSSL can send for TLS 1.0 connections.
15190ff2a12aSJohn Baldwin  */
1520*5de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
1521*5de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
1522*5de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
15230ff2a12aSJohn Baldwin 
1524d1c369f9SJohn Baldwin static void
1525d1c369f9SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(struct tls_enable *en)
1526d1c369f9SJohn Baldwin {
1527d1c369f9SJohn Baldwin 	int sockets[2];
1528d1c369f9SJohn Baldwin 
1529d1c369f9SJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
1530d1c369f9SJohn Baldwin 
1531d1c369f9SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1532d1c369f9SJohn Baldwin 	    sizeof(*en)) == -1);
1533d1c369f9SJohn Baldwin 	ATF_REQUIRE(errno == EINVAL);
1534d1c369f9SJohn Baldwin 
1535694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
1536694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
1537d1c369f9SJohn Baldwin }
1538d1c369f9SJohn Baldwin 
1539d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg,	\
1540d1c369f9SJohn Baldwin 	    minor)							\
1541d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name);			\
1542d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc)				\
1543d1c369f9SJohn Baldwin {									\
1544d1c369f9SJohn Baldwin 	struct tls_enable en;						\
1545d1c369f9SJohn Baldwin 	uint64_t seqno;							\
1546d1c369f9SJohn Baldwin 									\
1547d1c369f9SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1548d1c369f9SJohn Baldwin 	seqno = random();						\
1549d1c369f9SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1550d1c369f9SJohn Baldwin 	    &en);							\
1551d1c369f9SJohn Baldwin 	test_ktls_invalid_transmit_cipher_suite(&en);			\
1552d1c369f9SJohn Baldwin 	free_tls_enable(&en);						\
1553d1c369f9SJohn Baldwin }
1554d1c369f9SJohn Baldwin 
1555d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \
1556d1c369f9SJohn Baldwin 	    minor)							\
1557d1c369f9SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name);
1558d1c369f9SJohn Baldwin 
1559d1c369f9SJohn Baldwin #define	INVALID_CIPHER_SUITES(M)					\
1560d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1561d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO)			\
1562d1c369f9SJohn Baldwin 	M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1563d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO)			\
1564d1c369f9SJohn Baldwin 	M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1565d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
1566d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1567d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ZERO)						\
1568d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1569d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE)			\
1570d1c369f9SJohn Baldwin 	M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1571d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE)			\
1572d1c369f9SJohn Baldwin 	M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,		\
1573d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
1574d1c369f9SJohn Baldwin 	M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0,	\
1575d1c369f9SJohn Baldwin 	    TLS_MINOR_VER_ONE)						\
1576d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8,			\
1577d1c369f9SJohn Baldwin 	    CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE)			\
1578d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8,		\
1579d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE)			\
1580d1c369f9SJohn Baldwin 	M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8,		\
1581d1c369f9SJohn Baldwin 	    CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE)
1582d1c369f9SJohn Baldwin 
1583d1c369f9SJohn Baldwin /*
1584d1c369f9SJohn Baldwin  * Ensure that invalid cipher suites are rejected for transmit.
1585d1c369f9SJohn Baldwin  */
1586d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST);
1587d1c369f9SJohn Baldwin 
15883e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
158905a1d0f5SJohn Baldwin 	    auth_alg, minor, name, len, padding)			\
15903e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name);		\
15913e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc)			\
15923e7f8a8dSJohn Baldwin {									\
15933e7f8a8dSJohn Baldwin 	struct tls_enable en;						\
15943e7f8a8dSJohn Baldwin 	uint64_t seqno;							\
15953e7f8a8dSJohn Baldwin 									\
15963e7f8a8dSJohn Baldwin 	ATF_REQUIRE_KTLS();						\
15973e7f8a8dSJohn Baldwin 	seqno = random();						\
15983e7f8a8dSJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno,	\
15993e7f8a8dSJohn Baldwin 	    &en);							\
160005a1d0f5SJohn Baldwin 	test_ktls_receive_app_data(&en, seqno, len, padding);		\
16013e7f8a8dSJohn Baldwin 	free_tls_enable(&en);						\
16023e7f8a8dSJohn Baldwin }
16033e7f8a8dSJohn Baldwin 
16043e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
16053e7f8a8dSJohn Baldwin 	    auth_alg, minor, name)					\
16063e7f8a8dSJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
16073e7f8a8dSJohn Baldwin 
16083e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
16093e7f8a8dSJohn Baldwin 	    minor)							\
16103e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
161105a1d0f5SJohn Baldwin 	    auth_alg, minor, short, 64, 0)				\
16123e7f8a8dSJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
161305a1d0f5SJohn Baldwin 	    auth_alg, minor, long, 64 * 1024, 0)
16143e7f8a8dSJohn Baldwin 
16153e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg,	\
16163e7f8a8dSJohn Baldwin 	    minor)							\
16173e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
16183e7f8a8dSJohn Baldwin 	    auth_alg, minor, short)					\
16193e7f8a8dSJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
16203e7f8a8dSJohn Baldwin 	    auth_alg, minor, long)
16213e7f8a8dSJohn Baldwin 
16223e7f8a8dSJohn Baldwin /*
16233e7f8a8dSJohn Baldwin  * For each supported cipher suite, run two receive tests:
16243e7f8a8dSJohn Baldwin  *
16253e7f8a8dSJohn Baldwin  * - a short test which sends 64 bytes of application data (likely as
16263e7f8a8dSJohn Baldwin  *   a single TLS record)
16273e7f8a8dSJohn Baldwin  *
16283e7f8a8dSJohn Baldwin  * - a long test which sends 64KB of application data (split across
16293e7f8a8dSJohn Baldwin  *   multiple TLS records)
16303e7f8a8dSJohn Baldwin  *
16313e7f8a8dSJohn Baldwin  * Note that receive is currently only supported for TLS 1.2 AEAD
16323e7f8a8dSJohn Baldwin  * cipher suites.
16333e7f8a8dSJohn Baldwin  */
163405a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS);
163505a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS);
163605a1d0f5SJohn Baldwin 
163705a1d0f5SJohn Baldwin #define GEN_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size,	\
163805a1d0f5SJohn Baldwin 	    auth_alg, minor)						\
163905a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
164005a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded, 64, 16)			\
164105a1d0f5SJohn Baldwin 	GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
164205a1d0f5SJohn Baldwin 	    auth_alg, minor, long_padded, 64 * 1024, 15)
164305a1d0f5SJohn Baldwin 
164405a1d0f5SJohn Baldwin #define ADD_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size,	\
164505a1d0f5SJohn Baldwin 	    auth_alg, minor)						\
164605a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
164705a1d0f5SJohn Baldwin 	    auth_alg, minor, short_padded)				\
164805a1d0f5SJohn Baldwin 	ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size,	\
164905a1d0f5SJohn Baldwin 	    auth_alg, minor, long_padded)
165005a1d0f5SJohn Baldwin 
165105a1d0f5SJohn Baldwin /*
165205a1d0f5SJohn Baldwin  * For TLS 1.3 cipher suites, run two additional receive tests which
165305a1d0f5SJohn Baldwin  * use add padding to each record.
165405a1d0f5SJohn Baldwin  */
165505a1d0f5SJohn Baldwin TLS_13_TESTS(GEN_PADDING_RECEIVE_TESTS);
16563e7f8a8dSJohn Baldwin 
1657233ce578SJohn Baldwin static void
1658233ce578SJohn Baldwin test_ktls_invalid_receive_cipher_suite(struct tls_enable *en)
1659233ce578SJohn Baldwin {
1660233ce578SJohn Baldwin 	int sockets[2];
1661233ce578SJohn Baldwin 
1662233ce578SJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
1663233ce578SJohn Baldwin 
1664233ce578SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
1665233ce578SJohn Baldwin 	    sizeof(*en)) == -1);
166605a1d0f5SJohn Baldwin 	ATF_REQUIRE(errno == EINVAL);
1667233ce578SJohn Baldwin 
1668694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
1669694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
1670233ce578SJohn Baldwin }
1671233ce578SJohn Baldwin 
1672233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
1673233ce578SJohn Baldwin 	    minor)							\
1674233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name);			\
1675233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc)				\
1676233ce578SJohn Baldwin {									\
1677233ce578SJohn Baldwin 	struct tls_enable en;						\
1678233ce578SJohn Baldwin 	uint64_t seqno;							\
1679233ce578SJohn Baldwin 									\
1680233ce578SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
1681233ce578SJohn Baldwin 	seqno = random();						\
1682233ce578SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
1683233ce578SJohn Baldwin 	    &en);							\
1684233ce578SJohn Baldwin 	test_ktls_invalid_receive_cipher_suite(&en);			\
1685233ce578SJohn Baldwin 	free_tls_enable(&en);						\
1686233ce578SJohn Baldwin }
1687233ce578SJohn Baldwin 
1688233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg,	\
1689233ce578SJohn Baldwin 	    minor)							\
1690233ce578SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name);
1691233ce578SJohn Baldwin 
1692233ce578SJohn Baldwin /*
1693233ce578SJohn Baldwin  * Ensure that invalid cipher suites are rejected for receive.
1694233ce578SJohn Baldwin  */
1695233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST);
1696233ce578SJohn Baldwin 
169783a54b58SJohn Baldwin static void
169883a54b58SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(struct tls_enable *en)
169983a54b58SJohn Baldwin {
170083a54b58SJohn Baldwin 	int sockets[2];
170183a54b58SJohn Baldwin 
170283a54b58SJohn Baldwin 	ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets");
170383a54b58SJohn Baldwin 
170483a54b58SJohn Baldwin 	ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
170583a54b58SJohn Baldwin 	    sizeof(*en)) == -1);
170605a1d0f5SJohn Baldwin 	ATF_REQUIRE(errno == EPROTONOSUPPORT);
170783a54b58SJohn Baldwin 
1708694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[1]) == 0);
1709694c708dSJohn Baldwin 	ATF_REQUIRE(close(sockets[0]) == 0);
171083a54b58SJohn Baldwin }
171183a54b58SJohn Baldwin 
171283a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
171383a54b58SJohn Baldwin 	    auth_alg, minor)						\
171483a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name);			\
171583a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc)			\
171683a54b58SJohn Baldwin {									\
171783a54b58SJohn Baldwin 	struct tls_enable en;						\
171883a54b58SJohn Baldwin 	uint64_t seqno;							\
171983a54b58SJohn Baldwin 									\
172083a54b58SJohn Baldwin 	ATF_REQUIRE_KTLS();						\
172183a54b58SJohn Baldwin 	seqno = random();						\
172283a54b58SJohn Baldwin 	build_tls_enable(cipher_alg, key_size, auth_alg, minor,	seqno,	\
172383a54b58SJohn Baldwin 	    &en);							\
172483a54b58SJohn Baldwin 	test_ktls_unsupported_receive_cipher_suite(&en);		\
172583a54b58SJohn Baldwin 	free_tls_enable(&en);						\
172683a54b58SJohn Baldwin }
172783a54b58SJohn Baldwin 
172883a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size,	\
172983a54b58SJohn Baldwin 	    auth_alg, minor)						\
173083a54b58SJohn Baldwin 	ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name);
173183a54b58SJohn Baldwin 
173283a54b58SJohn Baldwin /*
173383a54b58SJohn Baldwin  * Ensure that valid cipher suites not supported for receive are
173483a54b58SJohn Baldwin  * rejected.
173583a54b58SJohn Baldwin  */
173683a54b58SJohn Baldwin AES_CBC_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST);
173783a54b58SJohn Baldwin 
1738ee5686c6SMark Johnston /*
1739ee5686c6SMark Johnston  * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise
1740ee5686c6SMark Johnston  * KTLS error handling in the socket layer.
1741ee5686c6SMark Johnston  */
1742ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst);
1743ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc)
1744ee5686c6SMark Johnston {
1745ee5686c6SMark Johnston 	char buf[32];
1746ee5686c6SMark Johnston 	struct sockaddr_in dst;
1747ee5686c6SMark Johnston 	struct tls_enable en;
1748ee5686c6SMark Johnston 	ssize_t n;
1749ee5686c6SMark Johnston 	int s;
1750ee5686c6SMark Johnston 
1751ee5686c6SMark Johnston 	ATF_REQUIRE_KTLS();
1752ee5686c6SMark Johnston 
1753ee5686c6SMark Johnston 	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1754ee5686c6SMark Johnston 	ATF_REQUIRE(s >= 0);
1755ee5686c6SMark Johnston 
1756ee5686c6SMark Johnston 	build_tls_enable(CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
1757ee5686c6SMark Johnston 	    TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
1758ee5686c6SMark Johnston 
1759ee5686c6SMark Johnston 	ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en,
1760ee5686c6SMark Johnston 	    sizeof(en)) == 0);
1761ee5686c6SMark Johnston 
1762ee5686c6SMark Johnston 	memset(&dst, 0, sizeof(dst));
1763ee5686c6SMark Johnston 	dst.sin_family = AF_INET;
1764ee5686c6SMark Johnston 	dst.sin_len = sizeof(dst);
1765ee5686c6SMark Johnston 	dst.sin_addr.s_addr = htonl(INADDR_BROADCAST);
1766ee5686c6SMark Johnston 	dst.sin_port = htons(12345);
1767ee5686c6SMark Johnston 
1768ee5686c6SMark Johnston 	memset(buf, 0, sizeof(buf));
1769ee5686c6SMark Johnston 	n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst,
1770ee5686c6SMark Johnston 	    sizeof(dst));
1771ee5686c6SMark Johnston 
1772ee5686c6SMark Johnston 	/* Can't transmit to the broadcast address over TCP. */
1773ee5686c6SMark Johnston 	ATF_REQUIRE_ERRNO(EACCES, n == -1);
1774ee5686c6SMark Johnston 	ATF_REQUIRE(close(s) == 0);
1775ee5686c6SMark Johnston }
1776ee5686c6SMark Johnston 
1777a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp)
1778a10482eaSJohn Baldwin {
17793e7f8a8dSJohn Baldwin 	/* Transmit tests */
1780a10482eaSJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_TESTS);
1781a10482eaSJohn Baldwin 	AES_GCM_TESTS(ADD_TRANSMIT_TESTS);
1782a10482eaSJohn Baldwin 	CHACHA20_TESTS(ADD_TRANSMIT_TESTS);
178344265dc3SJohn Baldwin 	AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS);
1784*5de79eedSMark Johnston 	AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
1785*5de79eedSMark Johnston 	AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
1786*5de79eedSMark Johnston 	CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
1787d1c369f9SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST);
1788a10482eaSJohn Baldwin 
17893e7f8a8dSJohn Baldwin 	/* Receive tests */
179083a54b58SJohn Baldwin 	AES_CBC_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST);
179105a1d0f5SJohn Baldwin 	AES_GCM_TESTS(ADD_RECEIVE_TESTS);
179205a1d0f5SJohn Baldwin 	CHACHA20_TESTS(ADD_RECEIVE_TESTS);
179305a1d0f5SJohn Baldwin 	TLS_13_TESTS(ADD_PADDING_RECEIVE_TESTS);
1794233ce578SJohn Baldwin 	INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST);
1795233ce578SJohn Baldwin 
1796ee5686c6SMark Johnston 	/* Miscellaneous */
1797ee5686c6SMark Johnston 	ATF_TP_ADD_TC(tp, ktls_sendto_baddst);
1798ee5686c6SMark Johnston 
1799a10482eaSJohn Baldwin 	return (atf_no_error());
1800a10482eaSJohn Baldwin }
1801