1a10482eaSJohn Baldwin /*-
2a10482eaSJohn Baldwin * SPDX-License-Identifier: BSD-2-Clause
3a10482eaSJohn Baldwin *
4a10482eaSJohn Baldwin * Copyright (c) 2021 Netflix Inc.
5a10482eaSJohn Baldwin * Written by: John Baldwin <jhb@FreeBSD.org>
6a10482eaSJohn Baldwin *
7a10482eaSJohn Baldwin * Redistribution and use in source and binary forms, with or without
8a10482eaSJohn Baldwin * modification, are permitted provided that the following conditions
9a10482eaSJohn Baldwin * are met:
10a10482eaSJohn Baldwin * 1. Redistributions of source code must retain the above copyright
11a10482eaSJohn Baldwin * notice, this list of conditions and the following disclaimer.
12a10482eaSJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright
13a10482eaSJohn Baldwin * notice, this list of conditions and the following disclaimer in the
14a10482eaSJohn Baldwin * documentation and/or other materials provided with the distribution.
15a10482eaSJohn Baldwin *
16a10482eaSJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17a10482eaSJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18a10482eaSJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19a10482eaSJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20a10482eaSJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21a10482eaSJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22a10482eaSJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23a10482eaSJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24a10482eaSJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25a10482eaSJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26a10482eaSJohn Baldwin * SUCH DAMAGE.
27a10482eaSJohn Baldwin */
28a10482eaSJohn Baldwin
2965bd3adbSJohn Baldwin #include <sys/param.h>
30a10482eaSJohn Baldwin #include <sys/endian.h>
31a10482eaSJohn Baldwin #include <sys/event.h>
32a10482eaSJohn Baldwin #include <sys/ktls.h>
33a10482eaSJohn Baldwin #include <sys/socket.h>
34a10482eaSJohn Baldwin #include <sys/sysctl.h>
35a10482eaSJohn Baldwin #include <netinet/in.h>
36a10482eaSJohn Baldwin #include <netinet/tcp.h>
37a10482eaSJohn Baldwin #include <crypto/cryptodev.h>
38a10482eaSJohn Baldwin #include <assert.h>
39a10482eaSJohn Baldwin #include <err.h>
40a10482eaSJohn Baldwin #include <fcntl.h>
4170bb2286SJohn Baldwin #include <libutil.h>
422400a7b1SJohn Baldwin #include <netdb.h>
43a10482eaSJohn Baldwin #include <poll.h>
44a10482eaSJohn Baldwin #include <stdbool.h>
45a10482eaSJohn Baldwin #include <stdlib.h>
46a10482eaSJohn Baldwin #include <atf-c.h>
47a10482eaSJohn Baldwin
48a10482eaSJohn Baldwin #include <openssl/err.h>
49a10482eaSJohn Baldwin #include <openssl/evp.h>
50a10482eaSJohn Baldwin #include <openssl/hmac.h>
51a10482eaSJohn Baldwin
52a10482eaSJohn Baldwin static void
require_ktls(void)53a10482eaSJohn Baldwin require_ktls(void)
54a10482eaSJohn Baldwin {
55a10482eaSJohn Baldwin size_t len;
56a10482eaSJohn Baldwin bool enable;
57a10482eaSJohn Baldwin
58a10482eaSJohn Baldwin len = sizeof(enable);
59a10482eaSJohn Baldwin if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) {
60a10482eaSJohn Baldwin if (errno == ENOENT)
61a10482eaSJohn Baldwin atf_tc_skip("kernel does not support TLS offload");
62a10482eaSJohn Baldwin atf_libc_error(errno, "Failed to read kern.ipc.tls.enable");
63a10482eaSJohn Baldwin }
64a10482eaSJohn Baldwin
65a10482eaSJohn Baldwin if (!enable)
66a10482eaSJohn Baldwin atf_tc_skip("Kernel TLS is disabled");
67a10482eaSJohn Baldwin }
68a10482eaSJohn Baldwin
69a10482eaSJohn Baldwin #define ATF_REQUIRE_KTLS() require_ktls()
70a10482eaSJohn Baldwin
71ea4ebdcbSJohn Baldwin static void
check_tls_mode(const atf_tc_t * tc,int s,int sockopt)72ea4ebdcbSJohn Baldwin check_tls_mode(const atf_tc_t *tc, int s, int sockopt)
73ea4ebdcbSJohn Baldwin {
74ea4ebdcbSJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_ifnet", false)) {
75ea4ebdcbSJohn Baldwin socklen_t len;
76ea4ebdcbSJohn Baldwin int mode;
77ea4ebdcbSJohn Baldwin
78ea4ebdcbSJohn Baldwin len = sizeof(mode);
79ea4ebdcbSJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1)
80ea4ebdcbSJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode");
81ea4ebdcbSJohn Baldwin
82ea4ebdcbSJohn Baldwin if (mode != TCP_TLS_MODE_IFNET)
83ea4ebdcbSJohn Baldwin atf_tc_skip("connection did not use ifnet TLS");
84ea4ebdcbSJohn Baldwin }
85cc13c983SJohn Baldwin
86cc13c983SJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_toe", false)) {
87cc13c983SJohn Baldwin socklen_t len;
88cc13c983SJohn Baldwin int mode;
89cc13c983SJohn Baldwin
90cc13c983SJohn Baldwin len = sizeof(mode);
91cc13c983SJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1)
92cc13c983SJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode");
93cc13c983SJohn Baldwin
94cc13c983SJohn Baldwin if (mode != TCP_TLS_MODE_TOE)
95cc13c983SJohn Baldwin atf_tc_skip("connection did not use TOE TLS");
96cc13c983SJohn Baldwin }
97ea4ebdcbSJohn Baldwin }
98ea4ebdcbSJohn Baldwin
9970bb2286SJohn Baldwin static void __printflike(2, 3)
debug(const atf_tc_t * tc,const char * fmt,...)10070bb2286SJohn Baldwin debug(const atf_tc_t *tc, const char *fmt, ...)
10170bb2286SJohn Baldwin {
10270bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false))
10370bb2286SJohn Baldwin return;
10470bb2286SJohn Baldwin
10570bb2286SJohn Baldwin va_list ap;
10670bb2286SJohn Baldwin va_start(ap, fmt);
10770bb2286SJohn Baldwin vprintf(fmt, ap);
10870bb2286SJohn Baldwin va_end(ap);
10970bb2286SJohn Baldwin }
11070bb2286SJohn Baldwin
11170bb2286SJohn Baldwin static void
debug_hexdump(const atf_tc_t * tc,const void * buf,int length,const char * label)11270bb2286SJohn Baldwin debug_hexdump(const atf_tc_t *tc, const void *buf, int length,
11370bb2286SJohn Baldwin const char *label)
11470bb2286SJohn Baldwin {
11570bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false))
11670bb2286SJohn Baldwin return;
11770bb2286SJohn Baldwin
11870bb2286SJohn Baldwin if (label != NULL)
11970bb2286SJohn Baldwin printf("%s:\n", label);
12070bb2286SJohn Baldwin hexdump(buf, length, NULL, 0);
12170bb2286SJohn Baldwin }
12270bb2286SJohn Baldwin
123a10482eaSJohn Baldwin static char
rdigit(void)124a10482eaSJohn Baldwin rdigit(void)
125a10482eaSJohn Baldwin {
126a10482eaSJohn Baldwin /* ASCII printable values between 0x20 and 0x7e */
127a10482eaSJohn Baldwin return (0x20 + random() % (0x7f - 0x20));
128a10482eaSJohn Baldwin }
129a10482eaSJohn Baldwin
130a10482eaSJohn Baldwin static char *
alloc_buffer(size_t len)131a10482eaSJohn Baldwin alloc_buffer(size_t len)
132a10482eaSJohn Baldwin {
133a10482eaSJohn Baldwin char *buf;
134a10482eaSJohn Baldwin size_t i;
135a10482eaSJohn Baldwin
136a10482eaSJohn Baldwin if (len == 0)
137a10482eaSJohn Baldwin return (NULL);
138a10482eaSJohn Baldwin buf = malloc(len);
139a10482eaSJohn Baldwin for (i = 0; i < len; i++)
140a10482eaSJohn Baldwin buf[i] = rdigit();
141a10482eaSJohn Baldwin return (buf);
142a10482eaSJohn Baldwin }
143a10482eaSJohn Baldwin
144a10482eaSJohn Baldwin static bool
socketpair_tcp(int sv[2])1452c105205SJohn Baldwin socketpair_tcp(int sv[2])
146a10482eaSJohn Baldwin {
147a10482eaSJohn Baldwin struct pollfd pfd;
148a10482eaSJohn Baldwin struct sockaddr_in sin;
149a10482eaSJohn Baldwin socklen_t len;
150a10482eaSJohn Baldwin int as, cs, ls;
151a10482eaSJohn Baldwin
152a10482eaSJohn Baldwin ls = socket(PF_INET, SOCK_STREAM, 0);
153a10482eaSJohn Baldwin if (ls == -1) {
154a10482eaSJohn Baldwin warn("socket() for listen");
155a10482eaSJohn Baldwin return (false);
156a10482eaSJohn Baldwin }
157a10482eaSJohn Baldwin
158a10482eaSJohn Baldwin memset(&sin, 0, sizeof(sin));
159a10482eaSJohn Baldwin sin.sin_len = sizeof(sin);
160a10482eaSJohn Baldwin sin.sin_family = AF_INET;
161a10482eaSJohn Baldwin sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
162a10482eaSJohn Baldwin if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
163a10482eaSJohn Baldwin warn("bind");
164a10482eaSJohn Baldwin close(ls);
165a10482eaSJohn Baldwin return (false);
166a10482eaSJohn Baldwin }
167a10482eaSJohn Baldwin
168a10482eaSJohn Baldwin if (listen(ls, 1) == -1) {
169a10482eaSJohn Baldwin warn("listen");
170a10482eaSJohn Baldwin close(ls);
171a10482eaSJohn Baldwin return (false);
172a10482eaSJohn Baldwin }
173a10482eaSJohn Baldwin
174a10482eaSJohn Baldwin len = sizeof(sin);
175a10482eaSJohn Baldwin if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) {
176a10482eaSJohn Baldwin warn("getsockname");
177a10482eaSJohn Baldwin close(ls);
178a10482eaSJohn Baldwin return (false);
179a10482eaSJohn Baldwin }
180a10482eaSJohn Baldwin
181a10482eaSJohn Baldwin cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
182a10482eaSJohn Baldwin if (cs == -1) {
183a10482eaSJohn Baldwin warn("socket() for connect");
184a10482eaSJohn Baldwin close(ls);
185a10482eaSJohn Baldwin return (false);
186a10482eaSJohn Baldwin }
187a10482eaSJohn Baldwin
188a10482eaSJohn Baldwin if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
189a10482eaSJohn Baldwin if (errno != EINPROGRESS) {
190a10482eaSJohn Baldwin warn("connect");
191a10482eaSJohn Baldwin close(ls);
192a10482eaSJohn Baldwin close(cs);
193a10482eaSJohn Baldwin return (false);
194a10482eaSJohn Baldwin }
195a10482eaSJohn Baldwin }
196a10482eaSJohn Baldwin
197a10482eaSJohn Baldwin as = accept4(ls, NULL, NULL, SOCK_NONBLOCK);
198a10482eaSJohn Baldwin if (as == -1) {
199a10482eaSJohn Baldwin warn("accept4");
200a10482eaSJohn Baldwin close(ls);
201a10482eaSJohn Baldwin close(cs);
202a10482eaSJohn Baldwin return (false);
203a10482eaSJohn Baldwin }
204a10482eaSJohn Baldwin
205a10482eaSJohn Baldwin close(ls);
206a10482eaSJohn Baldwin
207a10482eaSJohn Baldwin pfd.fd = cs;
208a10482eaSJohn Baldwin pfd.events = POLLOUT;
209a10482eaSJohn Baldwin pfd.revents = 0;
210883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(1, poll(&pfd, 1, INFTIM));
211883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(POLLOUT, pfd.revents);
212a10482eaSJohn Baldwin
213a10482eaSJohn Baldwin sv[0] = cs;
214a10482eaSJohn Baldwin sv[1] = as;
215a10482eaSJohn Baldwin return (true);
216a10482eaSJohn Baldwin }
217a10482eaSJohn Baldwin
2182400a7b1SJohn Baldwin static bool
echo_socket(const atf_tc_t * tc,int sv[2])2192400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2])
2202400a7b1SJohn Baldwin {
2212400a7b1SJohn Baldwin const char *cause, *host, *port;
2222400a7b1SJohn Baldwin struct addrinfo hints, *ai, *tofree;
2232400a7b1SJohn Baldwin int error, flags, s;
2242400a7b1SJohn Baldwin
2252400a7b1SJohn Baldwin host = atf_tc_get_config_var(tc, "ktls.host");
2262400a7b1SJohn Baldwin port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo");
2272400a7b1SJohn Baldwin memset(&hints, 0, sizeof(hints));
2282400a7b1SJohn Baldwin hints.ai_family = AF_UNSPEC;
2292400a7b1SJohn Baldwin hints.ai_socktype = SOCK_STREAM;
2302400a7b1SJohn Baldwin hints.ai_protocol = IPPROTO_TCP;
2312400a7b1SJohn Baldwin error = getaddrinfo(host, port, &hints, &tofree);
2322400a7b1SJohn Baldwin if (error != 0) {
2332400a7b1SJohn Baldwin warnx("getaddrinfo(%s:%s) failed: %s", host, port,
2342400a7b1SJohn Baldwin gai_strerror(error));
2352400a7b1SJohn Baldwin return (false);
2362400a7b1SJohn Baldwin }
2372400a7b1SJohn Baldwin
2382400a7b1SJohn Baldwin cause = NULL;
2392400a7b1SJohn Baldwin for (ai = tofree; ai != NULL; ai = ai->ai_next) {
2402400a7b1SJohn Baldwin s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
2412400a7b1SJohn Baldwin if (s == -1) {
2422400a7b1SJohn Baldwin cause = "socket";
2432400a7b1SJohn Baldwin error = errno;
2442400a7b1SJohn Baldwin continue;
2452400a7b1SJohn Baldwin }
2462400a7b1SJohn Baldwin
2472400a7b1SJohn Baldwin if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) {
2482400a7b1SJohn Baldwin cause = "connect";
2492400a7b1SJohn Baldwin error = errno;
2502400a7b1SJohn Baldwin close(s);
2512400a7b1SJohn Baldwin continue;
2522400a7b1SJohn Baldwin }
2532400a7b1SJohn Baldwin
2542400a7b1SJohn Baldwin freeaddrinfo(tofree);
2552400a7b1SJohn Baldwin
2562400a7b1SJohn Baldwin ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1);
2572400a7b1SJohn Baldwin flags |= O_NONBLOCK;
2582400a7b1SJohn Baldwin ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1);
2592400a7b1SJohn Baldwin
2602400a7b1SJohn Baldwin sv[0] = s;
2612400a7b1SJohn Baldwin sv[1] = s;
2622400a7b1SJohn Baldwin return (true);
2632400a7b1SJohn Baldwin }
2642400a7b1SJohn Baldwin
2652400a7b1SJohn Baldwin warnc(error, "%s", cause);
2662400a7b1SJohn Baldwin freeaddrinfo(tofree);
2672400a7b1SJohn Baldwin return (false);
2682400a7b1SJohn Baldwin }
2692400a7b1SJohn Baldwin
2702400a7b1SJohn Baldwin static bool
open_sockets(const atf_tc_t * tc,int sv[2])2712400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2])
2722400a7b1SJohn Baldwin {
2732400a7b1SJohn Baldwin if (atf_tc_has_config_var(tc, "ktls.host"))
2742400a7b1SJohn Baldwin return (echo_socket(tc, sv));
2752400a7b1SJohn Baldwin else
2762400a7b1SJohn Baldwin return (socketpair_tcp(sv));
2772400a7b1SJohn Baldwin }
2782400a7b1SJohn Baldwin
279a10482eaSJohn Baldwin static void
close_sockets(int sv[2])2802c105205SJohn Baldwin close_sockets(int sv[2])
2812c105205SJohn Baldwin {
2822400a7b1SJohn Baldwin if (sv[0] != sv[1])
2832c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0);
2842c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0);
2852c105205SJohn Baldwin }
2862c105205SJohn Baldwin
2872c105205SJohn Baldwin static void
close_sockets_ignore_errors(int sv[2])2883845cce7SJohn Baldwin close_sockets_ignore_errors(int sv[2])
2893845cce7SJohn Baldwin {
2903845cce7SJohn Baldwin if (sv[0] != sv[1])
2913845cce7SJohn Baldwin close(sv[1]);
2923845cce7SJohn Baldwin close(sv[0]);
2933845cce7SJohn Baldwin }
2943845cce7SJohn Baldwin
2953845cce7SJohn Baldwin static void
fd_set_blocking(int fd)296a10482eaSJohn Baldwin fd_set_blocking(int fd)
297a10482eaSJohn Baldwin {
298a10482eaSJohn Baldwin int flags;
299a10482eaSJohn Baldwin
300a10482eaSJohn Baldwin ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1);
301a10482eaSJohn Baldwin flags &= ~O_NONBLOCK;
302a10482eaSJohn Baldwin ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1);
303a10482eaSJohn Baldwin }
304a10482eaSJohn Baldwin
305a10482eaSJohn Baldwin static bool
cbc_crypt(const EVP_CIPHER * cipher,const char * key,const char * iv,const char * input,char * output,size_t size,int enc)30664811651SJohn Baldwin cbc_crypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
30764811651SJohn Baldwin const char *input, char *output, size_t size, int enc)
308a10482eaSJohn Baldwin {
309a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx;
310a10482eaSJohn Baldwin int outl, total;
311a10482eaSJohn Baldwin
312a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new();
313a10482eaSJohn Baldwin if (ctx == NULL) {
314a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s",
315a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
316a10482eaSJohn Baldwin return (false);
317a10482eaSJohn Baldwin }
318a10482eaSJohn Baldwin if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key,
31964811651SJohn Baldwin (const u_char *)iv, enc) != 1) {
320a10482eaSJohn Baldwin warnx("EVP_CipherInit_ex failed: %s",
321a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
322a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
323a10482eaSJohn Baldwin return (false);
324a10482eaSJohn Baldwin }
325a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0);
326a10482eaSJohn Baldwin if (EVP_CipherUpdate(ctx, (u_char *)output, &outl,
327a10482eaSJohn Baldwin (const u_char *)input, size) != 1) {
328a10482eaSJohn Baldwin warnx("EVP_CipherUpdate failed: %s",
329a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
330a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
331a10482eaSJohn Baldwin return (false);
332a10482eaSJohn Baldwin }
333a10482eaSJohn Baldwin total = outl;
334a10482eaSJohn Baldwin if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
335a10482eaSJohn Baldwin warnx("EVP_CipherFinal_ex failed: %s",
336a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
337a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
338a10482eaSJohn Baldwin return (false);
339a10482eaSJohn Baldwin }
340a10482eaSJohn Baldwin total += outl;
341a10482eaSJohn Baldwin if ((size_t)total != size) {
342a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total);
343a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
344a10482eaSJohn Baldwin return (false);
345a10482eaSJohn Baldwin }
346a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
347a10482eaSJohn Baldwin return (true);
348a10482eaSJohn Baldwin }
349a10482eaSJohn Baldwin
350a10482eaSJohn Baldwin static bool
cbc_encrypt(const EVP_CIPHER * cipher,const char * key,const char * iv,const char * input,char * output,size_t size)35164811651SJohn Baldwin cbc_encrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
35264811651SJohn Baldwin const char *input, char *output, size_t size)
35364811651SJohn Baldwin {
35464811651SJohn Baldwin return (cbc_crypt(cipher, key, iv, input, output, size, 1));
35564811651SJohn Baldwin }
35664811651SJohn Baldwin
35764811651SJohn Baldwin static bool
cbc_decrypt(const EVP_CIPHER * cipher,const char * key,const char * iv,const char * input,char * output,size_t size)35864811651SJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv,
35964811651SJohn Baldwin const char *input, char *output, size_t size)
36064811651SJohn Baldwin {
36164811651SJohn Baldwin return (cbc_crypt(cipher, key, iv, input, output, size, 0));
36264811651SJohn Baldwin }
36364811651SJohn Baldwin
36464811651SJohn Baldwin static bool
compute_hash(const EVP_MD * md,const void * key,size_t key_len,const void * aad,size_t aad_len,const void * buffer,size_t len,void * digest,u_int * digest_len)36564811651SJohn Baldwin compute_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
36664811651SJohn Baldwin size_t aad_len, const void *buffer, size_t len, void *digest,
36764811651SJohn Baldwin u_int *digest_len)
368a10482eaSJohn Baldwin {
369a10482eaSJohn Baldwin HMAC_CTX *ctx;
370a10482eaSJohn Baldwin
371a10482eaSJohn Baldwin ctx = HMAC_CTX_new();
372a10482eaSJohn Baldwin if (ctx == NULL) {
373a10482eaSJohn Baldwin warnx("HMAC_CTX_new failed: %s",
374a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
375a10482eaSJohn Baldwin return (false);
376a10482eaSJohn Baldwin }
377a10482eaSJohn Baldwin if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) {
378a10482eaSJohn Baldwin warnx("HMAC_Init_ex failed: %s",
379a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
380a10482eaSJohn Baldwin HMAC_CTX_free(ctx);
381a10482eaSJohn Baldwin return (false);
382a10482eaSJohn Baldwin }
383a10482eaSJohn Baldwin if (HMAC_Update(ctx, aad, aad_len) != 1) {
384a10482eaSJohn Baldwin warnx("HMAC_Update (aad) failed: %s",
385a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
386a10482eaSJohn Baldwin HMAC_CTX_free(ctx);
387a10482eaSJohn Baldwin return (false);
388a10482eaSJohn Baldwin }
389a10482eaSJohn Baldwin if (HMAC_Update(ctx, buffer, len) != 1) {
390a10482eaSJohn Baldwin warnx("HMAC_Update (payload) failed: %s",
391a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
392a10482eaSJohn Baldwin HMAC_CTX_free(ctx);
393a10482eaSJohn Baldwin return (false);
394a10482eaSJohn Baldwin }
39564811651SJohn Baldwin if (HMAC_Final(ctx, digest, digest_len) != 1) {
396a10482eaSJohn Baldwin warnx("HMAC_Final failed: %s",
397a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
398a10482eaSJohn Baldwin HMAC_CTX_free(ctx);
399a10482eaSJohn Baldwin return (false);
400a10482eaSJohn Baldwin }
401a10482eaSJohn Baldwin HMAC_CTX_free(ctx);
40264811651SJohn Baldwin return (true);
40364811651SJohn Baldwin }
40464811651SJohn Baldwin
40564811651SJohn Baldwin static bool
verify_hash(const EVP_MD * md,const void * key,size_t key_len,const void * aad,size_t aad_len,const void * buffer,size_t len,const void * digest)40664811651SJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad,
40764811651SJohn Baldwin size_t aad_len, const void *buffer, size_t len, const void *digest)
40864811651SJohn Baldwin {
40964811651SJohn Baldwin unsigned char digest2[EVP_MAX_MD_SIZE];
41064811651SJohn Baldwin u_int digest_len;
41164811651SJohn Baldwin
41264811651SJohn Baldwin if (!compute_hash(md, key, key_len, aad, aad_len, buffer, len, digest2,
41364811651SJohn Baldwin &digest_len))
41464811651SJohn Baldwin return (false);
415a10482eaSJohn Baldwin if (memcmp(digest, digest2, digest_len) != 0) {
416a10482eaSJohn Baldwin warnx("HMAC mismatch");
417a10482eaSJohn Baldwin return (false);
418a10482eaSJohn Baldwin }
419a10482eaSJohn Baldwin return (true);
420a10482eaSJohn Baldwin }
421a10482eaSJohn Baldwin
422a10482eaSJohn Baldwin static bool
aead_encrypt(const EVP_CIPHER * cipher,const char * key,const char * nonce,const void * aad,size_t aad_len,const char * input,char * output,size_t size,char * tag,size_t tag_len)4233e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
4243e7f8a8dSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output,
4253e7f8a8dSJohn Baldwin size_t size, char *tag, size_t tag_len)
4263e7f8a8dSJohn Baldwin {
4273e7f8a8dSJohn Baldwin EVP_CIPHER_CTX *ctx;
4283e7f8a8dSJohn Baldwin int outl, total;
4293e7f8a8dSJohn Baldwin
4303e7f8a8dSJohn Baldwin ctx = EVP_CIPHER_CTX_new();
4313e7f8a8dSJohn Baldwin if (ctx == NULL) {
4323e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s",
4333e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
4343e7f8a8dSJohn Baldwin return (false);
4353e7f8a8dSJohn Baldwin }
4363e7f8a8dSJohn Baldwin if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
4373e7f8a8dSJohn Baldwin (const u_char *)nonce) != 1) {
4383e7f8a8dSJohn Baldwin warnx("EVP_EncryptInit_ex failed: %s",
4393e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
4403e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4413e7f8a8dSJohn Baldwin return (false);
4423e7f8a8dSJohn Baldwin }
4433e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0);
4443e7f8a8dSJohn Baldwin if (aad != NULL) {
4453e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
4463e7f8a8dSJohn Baldwin aad_len) != 1) {
4473e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate for AAD failed: %s",
4483e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
4493e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4503e7f8a8dSJohn Baldwin return (false);
4513e7f8a8dSJohn Baldwin }
4523e7f8a8dSJohn Baldwin }
4533e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl,
4543e7f8a8dSJohn Baldwin (const u_char *)input, size) != 1) {
4553e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate failed: %s",
4563e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
4573e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4583e7f8a8dSJohn Baldwin return (false);
4593e7f8a8dSJohn Baldwin }
4603e7f8a8dSJohn Baldwin total = outl;
4613e7f8a8dSJohn Baldwin if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) {
4623e7f8a8dSJohn Baldwin warnx("EVP_EncryptFinal_ex failed: %s",
4633e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
4643e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4653e7f8a8dSJohn Baldwin return (false);
4663e7f8a8dSJohn Baldwin }
4673e7f8a8dSJohn Baldwin total += outl;
4683e7f8a8dSJohn Baldwin if ((size_t)total != size) {
4693e7f8a8dSJohn Baldwin warnx("encrypt size mismatch: %zu vs %d", size, total);
4703e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4713e7f8a8dSJohn Baldwin return (false);
4723e7f8a8dSJohn Baldwin }
4733e7f8a8dSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) !=
4743e7f8a8dSJohn Baldwin 1) {
4753e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s",
4763e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
4773e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4783e7f8a8dSJohn Baldwin return (false);
4793e7f8a8dSJohn Baldwin }
4803e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
4813e7f8a8dSJohn Baldwin return (true);
4823e7f8a8dSJohn Baldwin }
4833e7f8a8dSJohn Baldwin
4843e7f8a8dSJohn Baldwin static bool
aead_decrypt(const EVP_CIPHER * cipher,const char * key,const char * nonce,const void * aad,size_t aad_len,const char * input,char * output,size_t size,const char * tag,size_t tag_len)485a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce,
486a10482eaSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output,
487a10482eaSJohn Baldwin size_t size, const char *tag, size_t tag_len)
488a10482eaSJohn Baldwin {
489a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx;
490a10482eaSJohn Baldwin int outl, total;
491a10482eaSJohn Baldwin bool valid;
492a10482eaSJohn Baldwin
493a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new();
494a10482eaSJohn Baldwin if (ctx == NULL) {
495a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s",
496a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
497a10482eaSJohn Baldwin return (false);
498a10482eaSJohn Baldwin }
499a10482eaSJohn Baldwin if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key,
500a10482eaSJohn Baldwin (const u_char *)nonce) != 1) {
501a10482eaSJohn Baldwin warnx("EVP_DecryptInit_ex failed: %s",
502a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
503a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
504a10482eaSJohn Baldwin return (false);
505a10482eaSJohn Baldwin }
506a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0);
507a10482eaSJohn Baldwin if (aad != NULL) {
508a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad,
509a10482eaSJohn Baldwin aad_len) != 1) {
510a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate for AAD failed: %s",
511a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
512a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
513a10482eaSJohn Baldwin return (false);
514a10482eaSJohn Baldwin }
515a10482eaSJohn Baldwin }
516a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl,
517a10482eaSJohn Baldwin (const u_char *)input, size) != 1) {
518a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate failed: %s",
519a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
520a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
521a10482eaSJohn Baldwin return (false);
522a10482eaSJohn Baldwin }
523a10482eaSJohn Baldwin total = outl;
524a10482eaSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
525a10482eaSJohn Baldwin __DECONST(char *, tag)) != 1) {
526a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s",
527a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL));
528a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
529a10482eaSJohn Baldwin return (false);
530a10482eaSJohn Baldwin }
531a10482eaSJohn Baldwin valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1);
532a10482eaSJohn Baldwin total += outl;
533a10482eaSJohn Baldwin if ((size_t)total != size) {
534a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total);
535a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
536a10482eaSJohn Baldwin return (false);
537a10482eaSJohn Baldwin }
538a10482eaSJohn Baldwin if (!valid)
539a10482eaSJohn Baldwin warnx("tag mismatch");
540a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx);
541a10482eaSJohn Baldwin return (valid);
542a10482eaSJohn Baldwin }
543a10482eaSJohn Baldwin
544a10482eaSJohn Baldwin static void
build_tls_enable(const atf_tc_t * tc,int cipher_alg,size_t cipher_key_len,int auth_alg,int minor,uint64_t seqno,struct tls_enable * en)54570bb2286SJohn Baldwin build_tls_enable(const atf_tc_t *tc, int cipher_alg, size_t cipher_key_len,
54670bb2286SJohn Baldwin int auth_alg, int minor, uint64_t seqno, struct tls_enable *en)
547a10482eaSJohn Baldwin {
548a10482eaSJohn Baldwin u_int auth_key_len, iv_len;
549a10482eaSJohn Baldwin
550a10482eaSJohn Baldwin memset(en, 0, sizeof(*en));
551a10482eaSJohn Baldwin
552a10482eaSJohn Baldwin switch (cipher_alg) {
553a10482eaSJohn Baldwin case CRYPTO_AES_CBC:
554a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_ZERO)
555a10482eaSJohn Baldwin iv_len = AES_BLOCK_LEN;
556a10482eaSJohn Baldwin else
557a10482eaSJohn Baldwin iv_len = 0;
558a10482eaSJohn Baldwin break;
559a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16:
560a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_TWO)
561a10482eaSJohn Baldwin iv_len = TLS_AEAD_GCM_LEN;
562a10482eaSJohn Baldwin else
563a10482eaSJohn Baldwin iv_len = TLS_1_3_GCM_IV_LEN;
564a10482eaSJohn Baldwin break;
565a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305:
566a10482eaSJohn Baldwin iv_len = TLS_CHACHA20_IV_LEN;
567a10482eaSJohn Baldwin break;
568a10482eaSJohn Baldwin default:
569a10482eaSJohn Baldwin iv_len = 0;
570a10482eaSJohn Baldwin break;
571a10482eaSJohn Baldwin }
572a10482eaSJohn Baldwin switch (auth_alg) {
573a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC:
574a10482eaSJohn Baldwin auth_key_len = SHA1_HASH_LEN;
575a10482eaSJohn Baldwin break;
576a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC:
577a10482eaSJohn Baldwin auth_key_len = SHA2_256_HASH_LEN;
578a10482eaSJohn Baldwin break;
579a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC:
580a10482eaSJohn Baldwin auth_key_len = SHA2_384_HASH_LEN;
581a10482eaSJohn Baldwin break;
582a10482eaSJohn Baldwin default:
583a10482eaSJohn Baldwin auth_key_len = 0;
584a10482eaSJohn Baldwin break;
585a10482eaSJohn Baldwin }
586a10482eaSJohn Baldwin en->cipher_key = alloc_buffer(cipher_key_len);
58770bb2286SJohn Baldwin debug_hexdump(tc, en->cipher_key, cipher_key_len, "cipher key");
588a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len);
58970bb2286SJohn Baldwin if (iv_len != 0)
59070bb2286SJohn Baldwin debug_hexdump(tc, en->iv, iv_len, "iv");
591a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len);
59270bb2286SJohn Baldwin if (auth_key_len != 0)
59370bb2286SJohn Baldwin debug_hexdump(tc, en->auth_key, auth_key_len, "auth key");
594a10482eaSJohn Baldwin en->cipher_algorithm = cipher_alg;
595a10482eaSJohn Baldwin en->cipher_key_len = cipher_key_len;
596a10482eaSJohn Baldwin en->iv_len = iv_len;
597a10482eaSJohn Baldwin en->auth_algorithm = auth_alg;
598a10482eaSJohn Baldwin en->auth_key_len = auth_key_len;
599a10482eaSJohn Baldwin en->tls_vmajor = TLS_MAJOR_VER_ONE;
600a10482eaSJohn Baldwin en->tls_vminor = minor;
601a10482eaSJohn Baldwin be64enc(en->rec_seq, seqno);
60270bb2286SJohn Baldwin debug(tc, "seqno: %ju\n", (uintmax_t)seqno);
603a10482eaSJohn Baldwin }
604a10482eaSJohn Baldwin
605a10482eaSJohn Baldwin static void
free_tls_enable(struct tls_enable * en)606a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en)
607a10482eaSJohn Baldwin {
608a10482eaSJohn Baldwin free(__DECONST(void *, en->cipher_key));
609a10482eaSJohn Baldwin free(__DECONST(void *, en->iv));
610a10482eaSJohn Baldwin free(__DECONST(void *, en->auth_key));
611a10482eaSJohn Baldwin }
612a10482eaSJohn Baldwin
613a10482eaSJohn Baldwin static const EVP_CIPHER *
tls_EVP_CIPHER(const struct tls_enable * en)614a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en)
615a10482eaSJohn Baldwin {
616a10482eaSJohn Baldwin switch (en->cipher_algorithm) {
617a10482eaSJohn Baldwin case CRYPTO_AES_CBC:
618a10482eaSJohn Baldwin switch (en->cipher_key_len) {
619a10482eaSJohn Baldwin case 128 / 8:
620a10482eaSJohn Baldwin return (EVP_aes_128_cbc());
621a10482eaSJohn Baldwin case 256 / 8:
622a10482eaSJohn Baldwin return (EVP_aes_256_cbc());
623a10482eaSJohn Baldwin default:
624a10482eaSJohn Baldwin return (NULL);
625a10482eaSJohn Baldwin }
626a10482eaSJohn Baldwin break;
627a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16:
628a10482eaSJohn Baldwin switch (en->cipher_key_len) {
629a10482eaSJohn Baldwin case 128 / 8:
630a10482eaSJohn Baldwin return (EVP_aes_128_gcm());
631a10482eaSJohn Baldwin case 256 / 8:
632a10482eaSJohn Baldwin return (EVP_aes_256_gcm());
633a10482eaSJohn Baldwin default:
634a10482eaSJohn Baldwin return (NULL);
635a10482eaSJohn Baldwin }
636a10482eaSJohn Baldwin break;
637a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305:
638a10482eaSJohn Baldwin return (EVP_chacha20_poly1305());
639a10482eaSJohn Baldwin default:
640a10482eaSJohn Baldwin return (NULL);
641a10482eaSJohn Baldwin }
642a10482eaSJohn Baldwin }
643a10482eaSJohn Baldwin
644a10482eaSJohn Baldwin static const EVP_MD *
tls_EVP_MD(const struct tls_enable * en)645a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en)
646a10482eaSJohn Baldwin {
647a10482eaSJohn Baldwin switch (en->auth_algorithm) {
648a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC:
649a10482eaSJohn Baldwin return (EVP_sha1());
650a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC:
651a10482eaSJohn Baldwin return (EVP_sha256());
652a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC:
653a10482eaSJohn Baldwin return (EVP_sha384());
654a10482eaSJohn Baldwin default:
655a10482eaSJohn Baldwin return (NULL);
656a10482eaSJohn Baldwin }
657a10482eaSJohn Baldwin }
658a10482eaSJohn Baldwin
659a10482eaSJohn Baldwin static size_t
tls_header_len(struct tls_enable * en)660a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en)
661a10482eaSJohn Baldwin {
662a10482eaSJohn Baldwin size_t len;
663a10482eaSJohn Baldwin
664a10482eaSJohn Baldwin len = sizeof(struct tls_record_layer);
665a10482eaSJohn Baldwin switch (en->cipher_algorithm) {
666a10482eaSJohn Baldwin case CRYPTO_AES_CBC:
667a10482eaSJohn Baldwin if (en->tls_vminor != TLS_MINOR_VER_ZERO)
668a10482eaSJohn Baldwin len += AES_BLOCK_LEN;
669a10482eaSJohn Baldwin return (len);
670a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16:
671a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO)
672a10482eaSJohn Baldwin len += sizeof(uint64_t);
673a10482eaSJohn Baldwin return (len);
674a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305:
675a10482eaSJohn Baldwin return (len);
676a10482eaSJohn Baldwin default:
677a10482eaSJohn Baldwin return (0);
678a10482eaSJohn Baldwin }
679a10482eaSJohn Baldwin }
680a10482eaSJohn Baldwin
681a10482eaSJohn Baldwin static size_t
tls_mac_len(struct tls_enable * en)682a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en)
683a10482eaSJohn Baldwin {
684a10482eaSJohn Baldwin switch (en->cipher_algorithm) {
685a10482eaSJohn Baldwin case CRYPTO_AES_CBC:
686a10482eaSJohn Baldwin switch (en->auth_algorithm) {
687a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC:
688a10482eaSJohn Baldwin return (SHA1_HASH_LEN);
689a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC:
690a10482eaSJohn Baldwin return (SHA2_256_HASH_LEN);
691a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC:
692a10482eaSJohn Baldwin return (SHA2_384_HASH_LEN);
693a10482eaSJohn Baldwin default:
694a10482eaSJohn Baldwin return (0);
695a10482eaSJohn Baldwin }
696a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16:
697a10482eaSJohn Baldwin return (AES_GMAC_HASH_LEN);
698a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305:
699a10482eaSJohn Baldwin return (POLY1305_HASH_LEN);
700a10482eaSJohn Baldwin default:
701a10482eaSJohn Baldwin return (0);
702a10482eaSJohn Baldwin }
703a10482eaSJohn Baldwin }
704a10482eaSJohn Baldwin
705a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */
706a10482eaSJohn Baldwin static size_t
tls_trailer_len(struct tls_enable * en)707a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en)
708a10482eaSJohn Baldwin {
709a10482eaSJohn Baldwin size_t len;
710a10482eaSJohn Baldwin
711a10482eaSJohn Baldwin len = tls_mac_len(en);
712a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC)
713a10482eaSJohn Baldwin len += AES_BLOCK_LEN;
714a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE)
715a10482eaSJohn Baldwin len++;
716a10482eaSJohn Baldwin return (len);
717a10482eaSJohn Baldwin }
718a10482eaSJohn Baldwin
71965bd3adbSJohn Baldwin /* Minimum valid record payload size for a given cipher suite. */
72065bd3adbSJohn Baldwin static size_t
tls_minimum_record_payload(struct tls_enable * en)72165bd3adbSJohn Baldwin tls_minimum_record_payload(struct tls_enable *en)
72265bd3adbSJohn Baldwin {
72365bd3adbSJohn Baldwin size_t len;
72465bd3adbSJohn Baldwin
72565bd3adbSJohn Baldwin len = tls_header_len(en);
72665bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC)
72765bd3adbSJohn Baldwin len += roundup2(tls_mac_len(en) + 1, AES_BLOCK_LEN);
72865bd3adbSJohn Baldwin else
72965bd3adbSJohn Baldwin len += tls_mac_len(en);
73065bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE)
73165bd3adbSJohn Baldwin len++;
73265bd3adbSJohn Baldwin return (len - sizeof(struct tls_record_layer));
73365bd3adbSJohn Baldwin }
73465bd3adbSJohn Baldwin
735a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */
736a10482eaSJohn Baldwin static void
tls_mte_aad(struct tls_enable * en,size_t len,const struct tls_record_layer * hdr,uint64_t seqno,struct tls_mac_data * ad)737a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len,
738a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad)
739a10482eaSJohn Baldwin {
740a10482eaSJohn Baldwin ad->seq = htobe64(seqno);
741a10482eaSJohn Baldwin ad->type = hdr->tls_type;
742a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor;
743a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor;
744a10482eaSJohn Baldwin ad->tls_length = htons(len);
745a10482eaSJohn Baldwin }
746a10482eaSJohn Baldwin
747a10482eaSJohn Baldwin static void
tls_12_aead_aad(struct tls_enable * en,size_t len,const struct tls_record_layer * hdr,uint64_t seqno,struct tls_aead_data * ad)748a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len,
749a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno,
750a10482eaSJohn Baldwin struct tls_aead_data *ad)
751a10482eaSJohn Baldwin {
752a10482eaSJohn Baldwin ad->seq = htobe64(seqno);
753a10482eaSJohn Baldwin ad->type = hdr->tls_type;
754a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor;
755a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor;
756a10482eaSJohn Baldwin ad->tls_length = htons(len);
757a10482eaSJohn Baldwin }
758a10482eaSJohn Baldwin
759a10482eaSJohn Baldwin static void
tls_13_aad(struct tls_enable * en,const struct tls_record_layer * hdr,uint64_t seqno,struct tls_aead_data_13 * ad)760a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr,
761a10482eaSJohn Baldwin uint64_t seqno, struct tls_aead_data_13 *ad)
762a10482eaSJohn Baldwin {
763a10482eaSJohn Baldwin ad->type = hdr->tls_type;
764a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor;
765a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor;
766a10482eaSJohn Baldwin ad->tls_length = hdr->tls_length;
767a10482eaSJohn Baldwin }
768a10482eaSJohn Baldwin
769a10482eaSJohn Baldwin static void
tls_12_gcm_nonce(struct tls_enable * en,const struct tls_record_layer * hdr,char * nonce)770a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr,
771a10482eaSJohn Baldwin char *nonce)
772a10482eaSJohn Baldwin {
773a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN);
774a10482eaSJohn Baldwin memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t));
775a10482eaSJohn Baldwin }
776a10482eaSJohn Baldwin
777a10482eaSJohn Baldwin static void
tls_13_nonce(struct tls_enable * en,uint64_t seqno,char * nonce)778a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce)
779a10482eaSJohn Baldwin {
780a10482eaSJohn Baldwin static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN,
781a10482eaSJohn Baldwin "TLS 1.3 nonce length mismatch");
782a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN);
783a10482eaSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(seqno);
784a10482eaSJohn Baldwin }
785a10482eaSJohn Baldwin
786a10482eaSJohn Baldwin /*
787a10482eaSJohn Baldwin * Decrypt a TLS record 'len' bytes long at 'src' and store the result at
788a10482eaSJohn Baldwin * 'dst'. If the TLS record header length doesn't match or 'dst' doesn't
789a10482eaSJohn Baldwin * have sufficient room ('avail'), fail the test.
790a10482eaSJohn Baldwin */
791a10482eaSJohn Baldwin static size_t
decrypt_tls_aes_cbc_mte(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,const void * src,size_t len,void * dst,size_t avail,uint8_t * record_type)79270bb2286SJohn Baldwin decrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en,
79370bb2286SJohn Baldwin uint64_t seqno, const void *src, size_t len, void *dst, size_t avail,
79470bb2286SJohn Baldwin uint8_t *record_type)
795a10482eaSJohn Baldwin {
796a10482eaSJohn Baldwin const struct tls_record_layer *hdr;
797a10482eaSJohn Baldwin struct tls_mac_data aad;
798a10482eaSJohn Baldwin const char *iv;
799a10482eaSJohn Baldwin char *buf;
800a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len;
801a10482eaSJohn Baldwin int padding;
802a10482eaSJohn Baldwin
803a10482eaSJohn Baldwin hdr = src;
804a10482eaSJohn Baldwin hdr_len = tls_header_len(en);
805a10482eaSJohn Baldwin mac_len = tls_mac_len(en);
806883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor);
807883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(en->tls_vminor, hdr->tls_vminor);
80870bb2286SJohn Baldwin debug(tc, "decrypting MTE record seqno %ju:\n", (uintmax_t)seqno);
80970bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL);
810a10482eaSJohn Baldwin
811a10482eaSJohn Baldwin /* First, decrypt the outer payload into a temporary buffer. */
812a10482eaSJohn Baldwin payload_len = len - hdr_len;
813a10482eaSJohn Baldwin buf = malloc(payload_len);
814a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO)
815a10482eaSJohn Baldwin iv = en->iv;
816a10482eaSJohn Baldwin else
817a10482eaSJohn Baldwin iv = (void *)(hdr + 1);
81870bb2286SJohn Baldwin debug_hexdump(tc, iv, AES_BLOCK_LEN, "iv");
819a10482eaSJohn Baldwin ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
820a10482eaSJohn Baldwin (const u_char *)src + hdr_len, buf, payload_len));
82170bb2286SJohn Baldwin debug_hexdump(tc, buf, payload_len, "decrypted buffer");
822a10482eaSJohn Baldwin
823a10482eaSJohn Baldwin /*
824a10482eaSJohn Baldwin * Copy the last encrypted block to use as the IV for the next
825a10482eaSJohn Baldwin * record for TLS 1.0.
826a10482eaSJohn Baldwin */
827a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO)
828a10482eaSJohn Baldwin memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src +
829a10482eaSJohn Baldwin (len - AES_BLOCK_LEN), AES_BLOCK_LEN);
830a10482eaSJohn Baldwin
831a10482eaSJohn Baldwin /*
832a10482eaSJohn Baldwin * Verify trailing padding and strip.
833a10482eaSJohn Baldwin *
834a10482eaSJohn Baldwin * The kernel always generates the smallest amount of padding.
835a10482eaSJohn Baldwin */
836a10482eaSJohn Baldwin padding = buf[payload_len - 1] + 1;
837883d1742SJohn Baldwin ATF_REQUIRE_MSG(padding > 0 && padding <= AES_BLOCK_LEN,
838883d1742SJohn Baldwin "invalid padding %d", padding);
839883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len >= mac_len + padding,
840883d1742SJohn Baldwin "payload_len (%zu) < mac_len (%zu) + padding (%d)", payload_len,
841883d1742SJohn Baldwin mac_len, padding);
842a10482eaSJohn Baldwin payload_len -= padding;
843a10482eaSJohn Baldwin
844a10482eaSJohn Baldwin /* Verify HMAC. */
845a10482eaSJohn Baldwin payload_len -= mac_len;
846a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad);
84770bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad");
848a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
849a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len));
850a10482eaSJohn Baldwin
851883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len <= avail, "payload_len (%zu) < avail (%zu)",
852883d1742SJohn Baldwin payload_len, avail);
853a10482eaSJohn Baldwin memcpy(dst, buf, payload_len);
854a10482eaSJohn Baldwin *record_type = hdr->tls_type;
855a10482eaSJohn Baldwin return (payload_len);
856a10482eaSJohn Baldwin }
857a10482eaSJohn Baldwin
858a10482eaSJohn Baldwin static size_t
decrypt_tls_12_aead(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,const void * src,size_t len,void * dst,uint8_t * record_type)85970bb2286SJohn Baldwin decrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
86070bb2286SJohn Baldwin const void *src, size_t len, void *dst, uint8_t *record_type)
861a10482eaSJohn Baldwin {
862a10482eaSJohn Baldwin const struct tls_record_layer *hdr;
863a10482eaSJohn Baldwin struct tls_aead_data aad;
864a10482eaSJohn Baldwin char nonce[12];
865a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len;
866a10482eaSJohn Baldwin
867a10482eaSJohn Baldwin hdr = src;
868a10482eaSJohn Baldwin
869a10482eaSJohn Baldwin hdr_len = tls_header_len(en);
870a10482eaSJohn Baldwin mac_len = tls_mac_len(en);
871a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len);
872883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor);
873883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, hdr->tls_vminor);
87470bb2286SJohn Baldwin debug(tc, "decrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno);
87570bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL);
876a10482eaSJohn Baldwin
877a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad);
87870bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad");
879a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
880a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce);
881a10482eaSJohn Baldwin else
882a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce);
88370bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
884a10482eaSJohn Baldwin
885a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
886a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len,
887a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len));
888a10482eaSJohn Baldwin
889a10482eaSJohn Baldwin *record_type = hdr->tls_type;
890a10482eaSJohn Baldwin return (payload_len);
891a10482eaSJohn Baldwin }
892a10482eaSJohn Baldwin
893a10482eaSJohn Baldwin static size_t
decrypt_tls_13_aead(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,const void * src,size_t len,void * dst,uint8_t * record_type)89470bb2286SJohn Baldwin decrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
89570bb2286SJohn Baldwin const void *src, size_t len, void *dst, uint8_t *record_type)
896a10482eaSJohn Baldwin {
897a10482eaSJohn Baldwin const struct tls_record_layer *hdr;
898a10482eaSJohn Baldwin struct tls_aead_data_13 aad;
899a10482eaSJohn Baldwin char nonce[12];
900a10482eaSJohn Baldwin char *buf;
901a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len;
902a10482eaSJohn Baldwin
903a10482eaSJohn Baldwin hdr = src;
904a10482eaSJohn Baldwin
905a10482eaSJohn Baldwin hdr_len = tls_header_len(en);
906a10482eaSJohn Baldwin mac_len = tls_mac_len(en);
907a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len);
908883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len >= 1,
909883d1742SJohn Baldwin "payload_len (%zu) too short: len %zu hdr_len %zu mac_len %zu",
910883d1742SJohn Baldwin payload_len, len, hdr_len, mac_len);
911883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, hdr->tls_type);
912883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor);
913883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, hdr->tls_vminor);
91470bb2286SJohn Baldwin debug(tc, "decrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno);
91570bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL);
916a10482eaSJohn Baldwin
917a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad);
91870bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad");
919a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce);
92070bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
921a10482eaSJohn Baldwin
922a10482eaSJohn Baldwin /*
923a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the
924a10482eaSJohn Baldwin * record type as the last byte of the trailer.
925a10482eaSJohn Baldwin */
926a10482eaSJohn Baldwin buf = malloc(payload_len);
927a10482eaSJohn Baldwin
928a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
929a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len,
930a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len));
93170bb2286SJohn Baldwin debug_hexdump(tc, buf, payload_len, "decrypted buffer");
932a10482eaSJohn Baldwin
933a10482eaSJohn Baldwin /* Trim record type. */
934a10482eaSJohn Baldwin *record_type = buf[payload_len - 1];
935a10482eaSJohn Baldwin payload_len--;
936a10482eaSJohn Baldwin
937a10482eaSJohn Baldwin memcpy(dst, buf, payload_len);
938a10482eaSJohn Baldwin free(buf);
939a10482eaSJohn Baldwin
940a10482eaSJohn Baldwin return (payload_len);
941a10482eaSJohn Baldwin }
942a10482eaSJohn Baldwin
943a10482eaSJohn Baldwin static size_t
decrypt_tls_aead(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,const void * src,size_t len,void * dst,size_t avail,uint8_t * record_type)94470bb2286SJohn Baldwin decrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
94570bb2286SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type)
946a10482eaSJohn Baldwin {
947a10482eaSJohn Baldwin const struct tls_record_layer *hdr;
948a10482eaSJohn Baldwin size_t payload_len;
949a10482eaSJohn Baldwin
950a10482eaSJohn Baldwin hdr = src;
951883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(len, ntohs(hdr->tls_length) + sizeof(*hdr));
952a10482eaSJohn Baldwin
953a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en));
954883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len <= avail, "payload_len (%zu) > avail (%zu)",
955883d1742SJohn Baldwin payload_len, avail);
956a10482eaSJohn Baldwin
957a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) {
958883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(payload_len, decrypt_tls_12_aead(tc, en,
959883d1742SJohn Baldwin seqno, src, len, dst, record_type));
960a10482eaSJohn Baldwin } else {
961883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(payload_len, decrypt_tls_13_aead(tc, en,
962883d1742SJohn Baldwin seqno, src, len, dst, record_type));
963a10482eaSJohn Baldwin }
964a10482eaSJohn Baldwin
965a10482eaSJohn Baldwin return (payload_len);
966a10482eaSJohn Baldwin }
967a10482eaSJohn Baldwin
968a10482eaSJohn Baldwin static size_t
decrypt_tls_record(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,const void * src,size_t len,void * dst,size_t avail,uint8_t * record_type)96970bb2286SJohn Baldwin decrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno,
97070bb2286SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type)
971a10482eaSJohn Baldwin {
972a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC)
97370bb2286SJohn Baldwin return (decrypt_tls_aes_cbc_mte(tc, en, seqno, src, len, dst,
97470bb2286SJohn Baldwin avail, record_type));
975a10482eaSJohn Baldwin else
97670bb2286SJohn Baldwin return (decrypt_tls_aead(tc, en, seqno, src, len, dst, avail,
977a10482eaSJohn Baldwin record_type));
978a10482eaSJohn Baldwin }
979a10482eaSJohn Baldwin
9803e7f8a8dSJohn Baldwin /*
9813e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes
9823e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have
98364811651SJohn Baldwin * sufficient room ('avail'), fail the test. 'padding' is the amount
98464811651SJohn Baldwin * of additional padding to include beyond any amount mandated by the
98564811651SJohn Baldwin * cipher suite.
9863e7f8a8dSJohn Baldwin */
9873e7f8a8dSJohn Baldwin static size_t
encrypt_tls_aes_cbc_mte(const atf_tc_t * tc,struct tls_enable * en,uint8_t record_type,uint64_t seqno,const void * src,size_t len,void * dst,size_t avail,size_t padding)98870bb2286SJohn Baldwin encrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en,
98970bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
99070bb2286SJohn Baldwin size_t avail, size_t padding)
99164811651SJohn Baldwin {
99264811651SJohn Baldwin struct tls_record_layer *hdr;
99364811651SJohn Baldwin struct tls_mac_data aad;
99464811651SJohn Baldwin char *buf, *iv;
99564811651SJohn Baldwin size_t hdr_len, mac_len, record_len;
99664811651SJohn Baldwin u_int digest_len, i;
99764811651SJohn Baldwin
998883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(0, padding % 16);
99964811651SJohn Baldwin
100064811651SJohn Baldwin hdr = dst;
100164811651SJohn Baldwin buf = dst;
100264811651SJohn Baldwin
100370bb2286SJohn Baldwin debug(tc, "encrypting MTE record seqno %ju:\n", (uintmax_t)seqno);
100464811651SJohn Baldwin hdr_len = tls_header_len(en);
100564811651SJohn Baldwin mac_len = tls_mac_len(en);
100664811651SJohn Baldwin padding += (AES_BLOCK_LEN - (len + mac_len) % AES_BLOCK_LEN);
1007883d1742SJohn Baldwin ATF_REQUIRE_MSG(padding > 0 && padding <= 255, "invalid padding (%zu)",
1008883d1742SJohn Baldwin padding);
100964811651SJohn Baldwin
101064811651SJohn Baldwin record_len = hdr_len + len + mac_len + padding;
1011883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= avail, "record_len (%zu) > avail (%zu): "
1012883d1742SJohn Baldwin "hdr_len %zu, len %zu, mac_len %zu, padding %zu", record_len,
1013883d1742SJohn Baldwin avail, hdr_len, len, mac_len, padding);
101464811651SJohn Baldwin
101564811651SJohn Baldwin hdr->tls_type = record_type;
101664811651SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
101764811651SJohn Baldwin hdr->tls_vminor = en->tls_vminor;
101864811651SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr));
101964811651SJohn Baldwin iv = (char *)(hdr + 1);
102064811651SJohn Baldwin for (i = 0; i < AES_BLOCK_LEN; i++)
102164811651SJohn Baldwin iv[i] = rdigit();
102270bb2286SJohn Baldwin debug_hexdump(tc, iv, AES_BLOCK_LEN, "explicit IV");
102364811651SJohn Baldwin
102464811651SJohn Baldwin /* Copy plaintext to ciphertext region. */
102564811651SJohn Baldwin memcpy(buf + hdr_len, src, len);
102664811651SJohn Baldwin
102764811651SJohn Baldwin /* Compute HMAC. */
102864811651SJohn Baldwin tls_mte_aad(en, len, hdr, seqno, &aad);
102970bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad");
103070bb2286SJohn Baldwin debug_hexdump(tc, src, len, "plaintext");
103164811651SJohn Baldwin ATF_REQUIRE(compute_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len,
103264811651SJohn Baldwin &aad, sizeof(aad), src, len, buf + hdr_len + len, &digest_len));
1033883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(mac_len, digest_len);
103464811651SJohn Baldwin
103564811651SJohn Baldwin /* Store padding. */
103664811651SJohn Baldwin for (i = 0; i < padding; i++)
103764811651SJohn Baldwin buf[hdr_len + len + mac_len + i] = padding - 1;
1038883d1742SJohn Baldwin debug_hexdump(tc, buf + hdr_len + len, mac_len + padding,
1039883d1742SJohn Baldwin "MAC and padding");
104064811651SJohn Baldwin
104164811651SJohn Baldwin /* Encrypt the record. */
104264811651SJohn Baldwin ATF_REQUIRE(cbc_encrypt(tls_EVP_CIPHER(en), en->cipher_key, iv,
104364811651SJohn Baldwin buf + hdr_len, buf + hdr_len, len + mac_len + padding));
104470bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record");
104564811651SJohn Baldwin
104664811651SJohn Baldwin return (record_len);
104764811651SJohn Baldwin }
104864811651SJohn Baldwin
104964811651SJohn Baldwin static size_t
encrypt_tls_12_aead(const atf_tc_t * tc,struct tls_enable * en,uint8_t record_type,uint64_t seqno,const void * src,size_t len,void * dst)105070bb2286SJohn Baldwin encrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en,
105170bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst)
10523e7f8a8dSJohn Baldwin {
10533e7f8a8dSJohn Baldwin struct tls_record_layer *hdr;
10543e7f8a8dSJohn Baldwin struct tls_aead_data aad;
10553e7f8a8dSJohn Baldwin char nonce[12];
10563e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len;
10573e7f8a8dSJohn Baldwin
10583e7f8a8dSJohn Baldwin hdr = dst;
10593e7f8a8dSJohn Baldwin
106070bb2286SJohn Baldwin debug(tc, "encrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno);
10613e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en);
10623e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en);
10633e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len;
10643e7f8a8dSJohn Baldwin
10653e7f8a8dSJohn Baldwin hdr->tls_type = record_type;
10663e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
10673e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO;
10683e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr));
10693e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
10703e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno));
10713e7f8a8dSJohn Baldwin
10723e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad);
107370bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad");
10743e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
10753e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce);
10763e7f8a8dSJohn Baldwin else
10773e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce);
107870bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
10793e7f8a8dSJohn Baldwin
108070bb2286SJohn Baldwin debug_hexdump(tc, src, len, "plaintext");
10813e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
10823e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len,
10833e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len));
108470bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record");
10853e7f8a8dSJohn Baldwin
10863e7f8a8dSJohn Baldwin return (record_len);
10873e7f8a8dSJohn Baldwin }
10883e7f8a8dSJohn Baldwin
10893e7f8a8dSJohn Baldwin static size_t
encrypt_tls_13_aead(const atf_tc_t * tc,struct tls_enable * en,uint8_t record_type,uint64_t seqno,const void * src,size_t len,void * dst,size_t padding)109070bb2286SJohn Baldwin encrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en,
109170bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
109270bb2286SJohn Baldwin size_t padding)
109305a1d0f5SJohn Baldwin {
109405a1d0f5SJohn Baldwin struct tls_record_layer *hdr;
109505a1d0f5SJohn Baldwin struct tls_aead_data_13 aad;
109605a1d0f5SJohn Baldwin char nonce[12];
109705a1d0f5SJohn Baldwin char *buf;
109805a1d0f5SJohn Baldwin size_t hdr_len, mac_len, record_len;
109905a1d0f5SJohn Baldwin
110005a1d0f5SJohn Baldwin hdr = dst;
110105a1d0f5SJohn Baldwin
110270bb2286SJohn Baldwin debug(tc, "encrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno);
110305a1d0f5SJohn Baldwin hdr_len = tls_header_len(en);
110405a1d0f5SJohn Baldwin mac_len = tls_mac_len(en);
110505a1d0f5SJohn Baldwin record_len = hdr_len + len + 1 + padding + mac_len;
110605a1d0f5SJohn Baldwin
110705a1d0f5SJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP;
110805a1d0f5SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE;
110905a1d0f5SJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO;
111005a1d0f5SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr));
111105a1d0f5SJohn Baldwin
111205a1d0f5SJohn Baldwin tls_13_aad(en, hdr, seqno, &aad);
111370bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad");
111405a1d0f5SJohn Baldwin tls_13_nonce(en, seqno, nonce);
111570bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce");
111605a1d0f5SJohn Baldwin
111705a1d0f5SJohn Baldwin /*
111805a1d0f5SJohn Baldwin * Have to use a temporary buffer for the input so that the record
111905a1d0f5SJohn Baldwin * type can be appended.
112005a1d0f5SJohn Baldwin */
112105a1d0f5SJohn Baldwin buf = malloc(len + 1 + padding);
112205a1d0f5SJohn Baldwin memcpy(buf, src, len);
112305a1d0f5SJohn Baldwin buf[len] = record_type;
112405a1d0f5SJohn Baldwin memset(buf + len + 1, 0, padding);
112570bb2286SJohn Baldwin debug_hexdump(tc, buf, len + 1 + padding, "plaintext + type + padding");
112605a1d0f5SJohn Baldwin
112705a1d0f5SJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce,
112805a1d0f5SJohn Baldwin &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding,
112905a1d0f5SJohn Baldwin (char *)dst + hdr_len + len + 1 + padding, mac_len));
113070bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record");
113105a1d0f5SJohn Baldwin
113205a1d0f5SJohn Baldwin free(buf);
113305a1d0f5SJohn Baldwin
113405a1d0f5SJohn Baldwin return (record_len);
113505a1d0f5SJohn Baldwin }
113605a1d0f5SJohn Baldwin
113705a1d0f5SJohn Baldwin static size_t
encrypt_tls_aead(const atf_tc_t * tc,struct tls_enable * en,uint8_t record_type,uint64_t seqno,const void * src,size_t len,void * dst,size_t avail,size_t padding)113870bb2286SJohn Baldwin encrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en,
113970bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
114070bb2286SJohn Baldwin size_t avail, size_t padding)
11413e7f8a8dSJohn Baldwin {
11423e7f8a8dSJohn Baldwin size_t record_len;
11433e7f8a8dSJohn Baldwin
114405a1d0f5SJohn Baldwin record_len = tls_header_len(en) + len + padding + tls_trailer_len(en);
1145883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= avail, "record_len (%zu) > avail (%zu): "
1146883d1742SJohn Baldwin "header %zu len %zu padding %zu trailer %zu", record_len, avail,
1147883d1742SJohn Baldwin tls_header_len(en), len, padding, tls_trailer_len(en));
11483e7f8a8dSJohn Baldwin
114905a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) {
1150883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(0, padding);
1151883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(record_len, encrypt_tls_12_aead(tc, en,
1152883d1742SJohn Baldwin record_type, seqno, src, len, dst));
115305a1d0f5SJohn Baldwin } else
1154883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(record_len, encrypt_tls_13_aead(tc, en,
1155883d1742SJohn Baldwin record_type, seqno, src, len, dst, padding));
11563e7f8a8dSJohn Baldwin
11573e7f8a8dSJohn Baldwin return (record_len);
11583e7f8a8dSJohn Baldwin }
11593e7f8a8dSJohn Baldwin
11603e7f8a8dSJohn Baldwin static size_t
encrypt_tls_record(const atf_tc_t * tc,struct tls_enable * en,uint8_t record_type,uint64_t seqno,const void * src,size_t len,void * dst,size_t avail,size_t padding)116170bb2286SJohn Baldwin encrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en,
116270bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst,
116370bb2286SJohn Baldwin size_t avail, size_t padding)
11643e7f8a8dSJohn Baldwin {
116564811651SJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC)
116670bb2286SJohn Baldwin return (encrypt_tls_aes_cbc_mte(tc, en, record_type, seqno, src,
116764811651SJohn Baldwin len, dst, avail, padding));
116864811651SJohn Baldwin else
116970bb2286SJohn Baldwin return (encrypt_tls_aead(tc, en, record_type, seqno, src, len,
117064811651SJohn Baldwin dst, avail, padding));
11713e7f8a8dSJohn Baldwin }
11723e7f8a8dSJohn Baldwin
1173a10482eaSJohn Baldwin static void
test_ktls_transmit_app_data(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)11742400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en,
11752400a7b1SJohn Baldwin uint64_t seqno, size_t len)
1176a10482eaSJohn Baldwin {
1177a10482eaSJohn Baldwin struct kevent ev;
1178a10482eaSJohn Baldwin struct tls_record_layer *hdr;
1179a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf;
1180a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written;
1181a10482eaSJohn Baldwin ssize_t rv;
1182a10482eaSJohn Baldwin int kq, sockets[2];
1183a10482eaSJohn Baldwin uint8_t record_type;
1184a10482eaSJohn Baldwin
1185a10482eaSJohn Baldwin plaintext = alloc_buffer(len);
118670bb2286SJohn Baldwin debug_hexdump(tc, plaintext, len, "plaintext");
1187a10482eaSJohn Baldwin decrypted = malloc(len);
1188a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
1189a10482eaSJohn Baldwin tls_trailer_len(en);
1190a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap);
1191a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf;
1192a10482eaSJohn Baldwin
1193a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1);
1194a10482eaSJohn Baldwin
11952400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1196a10482eaSJohn Baldwin
1197a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1198a10482eaSJohn Baldwin sizeof(*en)) == 0);
1199ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
1200a10482eaSJohn Baldwin
1201a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
1202a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
1203a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
1204a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
1205a10482eaSJohn Baldwin
1206a10482eaSJohn Baldwin decrypted_len = 0;
1207a10482eaSJohn Baldwin outbuf_len = 0;
1208a10482eaSJohn Baldwin written = 0;
1209a10482eaSJohn Baldwin
1210a10482eaSJohn Baldwin while (decrypted_len != len) {
1211a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
1212a10482eaSJohn Baldwin
1213a10482eaSJohn Baldwin switch (ev.filter) {
1214a10482eaSJohn Baldwin case EVFILT_WRITE:
1215a10482eaSJohn Baldwin /* Try to write any remaining data. */
1216a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written,
1217a10482eaSJohn Baldwin len - written);
1218a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0,
1219a10482eaSJohn Baldwin "failed to write to socket");
1220a10482eaSJohn Baldwin written += rv;
1221a10482eaSJohn Baldwin if (written == len) {
1222a10482eaSJohn Baldwin ev.flags = EV_DISABLE;
1223a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
1224a10482eaSJohn Baldwin NULL) == 0);
1225a10482eaSJohn Baldwin }
1226a10482eaSJohn Baldwin break;
1227a10482eaSJohn Baldwin
1228a10482eaSJohn Baldwin case EVFILT_READ:
1229a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0);
1230a10482eaSJohn Baldwin
1231a10482eaSJohn Baldwin /*
1232a10482eaSJohn Baldwin * Try to read data for the next TLS record
1233a10482eaSJohn Baldwin * into outbuf. Start by reading the header
1234a10482eaSJohn Baldwin * to determine how much additional data to
1235a10482eaSJohn Baldwin * read.
1236a10482eaSJohn Baldwin */
1237a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) {
1238a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len,
1239a10482eaSJohn Baldwin sizeof(struct tls_record_layer) -
1240a10482eaSJohn Baldwin outbuf_len);
1241a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0,
1242a10482eaSJohn Baldwin "failed to read from socket");
1243a10482eaSJohn Baldwin outbuf_len += rv;
124470bb2286SJohn Baldwin
124570bb2286SJohn Baldwin if (outbuf_len ==
124670bb2286SJohn Baldwin sizeof(struct tls_record_layer)) {
124770bb2286SJohn Baldwin debug(tc, "TLS header for seqno %ju:\n",
124870bb2286SJohn Baldwin (uintmax_t)seqno);
124970bb2286SJohn Baldwin debug_hexdump(tc, outbuf, outbuf_len,
125070bb2286SJohn Baldwin NULL);
125170bb2286SJohn Baldwin }
1252a10482eaSJohn Baldwin }
1253a10482eaSJohn Baldwin
1254a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer))
1255a10482eaSJohn Baldwin break;
1256a10482eaSJohn Baldwin
1257a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) +
1258a10482eaSJohn Baldwin ntohs(hdr->tls_length);
125970bb2286SJohn Baldwin debug(tc, "record_len %zu outbuf_cap %zu\n",
126070bb2286SJohn Baldwin record_len, outbuf_cap);
1261d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap);
1262d71830cdSJohn Baldwin ATF_REQUIRE(record_len > outbuf_len);
1263a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len,
1264a10482eaSJohn Baldwin record_len - outbuf_len);
1265a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN)
1266a10482eaSJohn Baldwin break;
1267883d1742SJohn Baldwin ATF_REQUIRE_MSG(rv > 0,
1268883d1742SJohn Baldwin "failed to read from socket: %s", strerror(errno));
1269a10482eaSJohn Baldwin
1270a10482eaSJohn Baldwin outbuf_len += rv;
1271a10482eaSJohn Baldwin if (outbuf_len == record_len) {
127270bb2286SJohn Baldwin decrypted_len += decrypt_tls_record(tc, en,
127370bb2286SJohn Baldwin seqno, outbuf, outbuf_len,
1274a10482eaSJohn Baldwin decrypted + decrypted_len,
1275a10482eaSJohn Baldwin len - decrypted_len, &record_type);
1276883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, record_type);
1277a10482eaSJohn Baldwin
1278a10482eaSJohn Baldwin seqno++;
1279a10482eaSJohn Baldwin outbuf_len = 0;
1280a10482eaSJohn Baldwin }
1281a10482eaSJohn Baldwin break;
1282a10482eaSJohn Baldwin }
1283a10482eaSJohn Baldwin }
1284a10482eaSJohn Baldwin
1285a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len,
1286a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written);
1287a10482eaSJohn Baldwin
1288a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1289a10482eaSJohn Baldwin
1290a10482eaSJohn Baldwin free(outbuf);
1291a10482eaSJohn Baldwin free(decrypted);
1292a10482eaSJohn Baldwin free(plaintext);
1293a10482eaSJohn Baldwin
12942c105205SJohn Baldwin close_sockets(sockets);
1295694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0);
1296a10482eaSJohn Baldwin }
1297a10482eaSJohn Baldwin
1298a10482eaSJohn Baldwin static void
ktls_send_control_message(int fd,uint8_t type,void * data,size_t len)1299a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len)
1300a10482eaSJohn Baldwin {
1301a10482eaSJohn Baldwin struct msghdr msg;
1302a10482eaSJohn Baldwin struct cmsghdr *cmsg;
1303a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))];
1304a10482eaSJohn Baldwin struct iovec iov;
1305a10482eaSJohn Baldwin
1306a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg));
1307a10482eaSJohn Baldwin
1308a10482eaSJohn Baldwin msg.msg_control = cbuf;
1309a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf);
1310a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg);
1311a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP;
1312a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
1313a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type));
1314a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type;
1315a10482eaSJohn Baldwin
1316a10482eaSJohn Baldwin iov.iov_base = data;
1317a10482eaSJohn Baldwin iov.iov_len = len;
1318a10482eaSJohn Baldwin msg.msg_iov = &iov;
1319a10482eaSJohn Baldwin msg.msg_iovlen = 1;
1320a10482eaSJohn Baldwin
1321883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)len, sendmsg(fd, &msg, 0));
1322a10482eaSJohn Baldwin }
1323a10482eaSJohn Baldwin
1324a10482eaSJohn Baldwin static void
test_ktls_transmit_control(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,uint8_t type,size_t len)13252400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en,
13262400a7b1SJohn Baldwin uint64_t seqno, uint8_t type, size_t len)
1327a10482eaSJohn Baldwin {
1328a10482eaSJohn Baldwin struct tls_record_layer *hdr;
1329a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf;
1330a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len;
1331a10482eaSJohn Baldwin ssize_t rv;
1332a10482eaSJohn Baldwin int sockets[2];
1333a10482eaSJohn Baldwin uint8_t record_type;
1334a10482eaSJohn Baldwin
1335a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1336a10482eaSJohn Baldwin
1337a10482eaSJohn Baldwin plaintext = alloc_buffer(len);
1338a10482eaSJohn Baldwin decrypted = malloc(len);
1339a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
1340a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap);
1341a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf;
1342a10482eaSJohn Baldwin
13432400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
1344a10482eaSJohn Baldwin
1345a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
1346a10482eaSJohn Baldwin sizeof(*en)) == 0);
1347ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
1348a10482eaSJohn Baldwin
1349a10482eaSJohn Baldwin fd_set_blocking(sockets[0]);
1350a10482eaSJohn Baldwin fd_set_blocking(sockets[1]);
1351a10482eaSJohn Baldwin
1352a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len);
1353a10482eaSJohn Baldwin
1354a10482eaSJohn Baldwin /*
1355a10482eaSJohn Baldwin * First read the header to determine how much additional data
1356a10482eaSJohn Baldwin * to read.
1357a10482eaSJohn Baldwin */
1358a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1359883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(sizeof(struct tls_record_layer), rv);
1360a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length);
1361a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer);
1362883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= outbuf_cap,
1363883d1742SJohn Baldwin "record_len (%zu) > outbuf_cap (%zu)", record_len, outbuf_cap);
1364a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
1365a10482eaSJohn Baldwin payload_len);
1366883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)payload_len, rv);
1367a10482eaSJohn Baldwin
136870bb2286SJohn Baldwin rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, decrypted,
136970bb2286SJohn Baldwin len, &record_type);
1370a10482eaSJohn Baldwin
1371a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv,
1372a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len);
1373883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(type, record_type);
1374a10482eaSJohn Baldwin
1375a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0);
1376a10482eaSJohn Baldwin
1377a10482eaSJohn Baldwin free(outbuf);
1378a10482eaSJohn Baldwin free(decrypted);
1379a10482eaSJohn Baldwin free(plaintext);
1380a10482eaSJohn Baldwin
13812c105205SJohn Baldwin close_sockets(sockets);
1382a10482eaSJohn Baldwin }
1383a10482eaSJohn Baldwin
13840ff2a12aSJohn Baldwin static void
test_ktls_transmit_empty_fragment(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno)13852400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en,
13862400a7b1SJohn Baldwin uint64_t seqno)
13870ff2a12aSJohn Baldwin {
13880ff2a12aSJohn Baldwin struct tls_record_layer *hdr;
13890ff2a12aSJohn Baldwin char *outbuf;
13900ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len;
13910ff2a12aSJohn Baldwin ssize_t rv;
13920ff2a12aSJohn Baldwin int sockets[2];
13930ff2a12aSJohn Baldwin uint8_t record_type;
13940ff2a12aSJohn Baldwin
13950ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en);
13960ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap);
13970ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf;
13980ff2a12aSJohn Baldwin
13992400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
14000ff2a12aSJohn Baldwin
14010ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en,
14020ff2a12aSJohn Baldwin sizeof(*en)) == 0);
1403ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE);
14040ff2a12aSJohn Baldwin
14050ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]);
14060ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]);
14070ff2a12aSJohn Baldwin
14085de79eedSMark Johnston /*
14095de79eedSMark Johnston * A write of zero bytes should send an empty fragment only for
14105de79eedSMark Johnston * TLS 1.0, otherwise an error should be raised.
14115de79eedSMark Johnston */
14120ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0);
14135de79eedSMark Johnston if (rv == 0) {
1414883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(CRYPTO_AES_CBC, en->cipher_algorithm);
1415883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_ZERO, en->tls_vminor);
14165de79eedSMark Johnston } else {
1417883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(-1, rv);
1418883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EINVAL, true);
14195de79eedSMark Johnston goto out;
14205de79eedSMark Johnston }
14210ff2a12aSJohn Baldwin
14220ff2a12aSJohn Baldwin /*
14230ff2a12aSJohn Baldwin * First read the header to determine how much additional data
14240ff2a12aSJohn Baldwin * to read.
14250ff2a12aSJohn Baldwin */
14260ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer));
1427883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(sizeof(struct tls_record_layer), rv);
14280ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length);
14290ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer);
1430883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= outbuf_cap,
1431883d1742SJohn Baldwin "record_len (%zu) > outbuf_cap (%zu)", record_len, outbuf_cap);
14320ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer),
14330ff2a12aSJohn Baldwin payload_len);
1434883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)payload_len, rv);
14350ff2a12aSJohn Baldwin
143670bb2286SJohn Baldwin rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, NULL, 0,
14370ff2a12aSJohn Baldwin &record_type);
14380ff2a12aSJohn Baldwin
14390ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0,
14400ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv);
1441883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, record_type);
14420ff2a12aSJohn Baldwin
14435de79eedSMark Johnston out:
14440ff2a12aSJohn Baldwin free(outbuf);
14450ff2a12aSJohn Baldwin
14462c105205SJohn Baldwin close_sockets(sockets);
14470ff2a12aSJohn Baldwin }
14480ff2a12aSJohn Baldwin
14493e7f8a8dSJohn Baldwin static size_t
ktls_receive_tls_record(struct tls_enable * en,int fd,uint8_t record_type,void * data,size_t len)14503e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type,
14513e7f8a8dSJohn Baldwin void *data, size_t len)
14523e7f8a8dSJohn Baldwin {
14533e7f8a8dSJohn Baldwin struct msghdr msg;
14543e7f8a8dSJohn Baldwin struct cmsghdr *cmsg;
14553e7f8a8dSJohn Baldwin struct tls_get_record *tgr;
14563e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))];
14573e7f8a8dSJohn Baldwin struct iovec iov;
14583e7f8a8dSJohn Baldwin ssize_t rv;
14593e7f8a8dSJohn Baldwin
14603e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg));
14613e7f8a8dSJohn Baldwin
14623e7f8a8dSJohn Baldwin msg.msg_control = cbuf;
14633e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf);
14643e7f8a8dSJohn Baldwin
14653e7f8a8dSJohn Baldwin iov.iov_base = data;
14663e7f8a8dSJohn Baldwin iov.iov_len = len;
14673e7f8a8dSJohn Baldwin msg.msg_iov = &iov;
14683e7f8a8dSJohn Baldwin msg.msg_iovlen = 1;
14693e7f8a8dSJohn Baldwin
14703e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0);
14713e7f8a8dSJohn Baldwin
14723e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR);
14733e7f8a8dSJohn Baldwin
14743e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg);
14753e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL);
1476883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(IPPROTO_TCP, cmsg->cmsg_level);
1477883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_GET_RECORD, cmsg->cmsg_type);
1478883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(CMSG_LEN(sizeof(*tgr)), cmsg->cmsg_len);
14793e7f8a8dSJohn Baldwin
14803e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg);
1481883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(record_type, tgr->tls_type);
1482883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(en->tls_vmajor, tgr->tls_vmajor);
148305a1d0f5SJohn Baldwin /* XXX: Not sure if this is what OpenSSL expects? */
148405a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE)
1485883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, tgr->tls_vminor);
148605a1d0f5SJohn Baldwin else
1487883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(en->tls_vminor, tgr->tls_vminor);
1488883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(htons(rv), tgr->tls_length);
14893e7f8a8dSJohn Baldwin
14903e7f8a8dSJohn Baldwin return (rv);
14913e7f8a8dSJohn Baldwin }
14923e7f8a8dSJohn Baldwin
14933e7f8a8dSJohn Baldwin static void
test_ktls_receive_app_data(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len,size_t padding)14942400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en,
14952400a7b1SJohn Baldwin uint64_t seqno, size_t len, size_t padding)
14963e7f8a8dSJohn Baldwin {
14973e7f8a8dSJohn Baldwin struct kevent ev;
14983e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf;
14993e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written;
15003e7f8a8dSJohn Baldwin ssize_t rv;
15013e7f8a8dSJohn Baldwin int kq, sockets[2];
15023e7f8a8dSJohn Baldwin
15033e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len);
15043e7f8a8dSJohn Baldwin received = malloc(len);
15053e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 +
15063e7f8a8dSJohn Baldwin tls_trailer_len(en);
15073e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap);
15083e7f8a8dSJohn Baldwin
15093e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1);
15103e7f8a8dSJohn Baldwin
15112400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
15123e7f8a8dSJohn Baldwin
15133e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
15143e7f8a8dSJohn Baldwin sizeof(*en)) == 0);
1515ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
15163e7f8a8dSJohn Baldwin
15173e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
15183e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
15193e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
15203e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0);
15213e7f8a8dSJohn Baldwin
15223e7f8a8dSJohn Baldwin received_len = 0;
15233e7f8a8dSJohn Baldwin outbuf_len = 0;
15243e7f8a8dSJohn Baldwin written = 0;
15253e7f8a8dSJohn Baldwin
15263e7f8a8dSJohn Baldwin while (received_len != len) {
15273e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1);
15283e7f8a8dSJohn Baldwin
15293e7f8a8dSJohn Baldwin switch (ev.filter) {
15303e7f8a8dSJohn Baldwin case EVFILT_WRITE:
15313e7f8a8dSJohn Baldwin /*
15323e7f8a8dSJohn Baldwin * Compose the next TLS record to send.
15333e7f8a8dSJohn Baldwin */
15343e7f8a8dSJohn Baldwin if (outbuf_len == 0) {
15353e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len);
15363e7f8a8dSJohn Baldwin todo = len - written;
153705a1d0f5SJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding)
153805a1d0f5SJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2 - padding;
153970bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en,
15403e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written,
154105a1d0f5SJohn Baldwin todo, outbuf, outbuf_cap, padding);
15423e7f8a8dSJohn Baldwin outbuf_sent = 0;
15433e7f8a8dSJohn Baldwin written += todo;
15443e7f8a8dSJohn Baldwin seqno++;
15453e7f8a8dSJohn Baldwin }
15463e7f8a8dSJohn Baldwin
15473e7f8a8dSJohn Baldwin /*
15483e7f8a8dSJohn Baldwin * Try to write the remainder of the current
15493e7f8a8dSJohn Baldwin * TLS record.
15503e7f8a8dSJohn Baldwin */
15513e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent,
15523e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent);
15533e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0,
1554883d1742SJohn Baldwin "failed to write to socket: %s", strerror(errno));
15553e7f8a8dSJohn Baldwin outbuf_sent += rv;
15563e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) {
15573e7f8a8dSJohn Baldwin outbuf_len = 0;
15583e7f8a8dSJohn Baldwin if (written == len) {
15593e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE;
15603e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0,
15613e7f8a8dSJohn Baldwin NULL) == 0);
15623e7f8a8dSJohn Baldwin }
15633e7f8a8dSJohn Baldwin }
15643e7f8a8dSJohn Baldwin break;
15653e7f8a8dSJohn Baldwin
15663e7f8a8dSJohn Baldwin case EVFILT_READ:
15673e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0);
15683e7f8a8dSJohn Baldwin
15693e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident,
15703e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len,
15713e7f8a8dSJohn Baldwin len - received_len);
15723e7f8a8dSJohn Baldwin received_len += rv;
15733e7f8a8dSJohn Baldwin break;
15743e7f8a8dSJohn Baldwin }
15753e7f8a8dSJohn Baldwin }
15763e7f8a8dSJohn Baldwin
15773e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len,
15783e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written);
15793e7f8a8dSJohn Baldwin
15803e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0);
15813e7f8a8dSJohn Baldwin
15823e7f8a8dSJohn Baldwin free(outbuf);
15833e7f8a8dSJohn Baldwin free(received);
15843e7f8a8dSJohn Baldwin free(plaintext);
15853e7f8a8dSJohn Baldwin
15862c105205SJohn Baldwin close_sockets(sockets);
1587694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0);
15883e7f8a8dSJohn Baldwin }
15893e7f8a8dSJohn Baldwin
159065bd3adbSJohn Baldwin static void
ktls_receive_tls_error(int fd,int expected_error)159165bd3adbSJohn Baldwin ktls_receive_tls_error(int fd, int expected_error)
159265bd3adbSJohn Baldwin {
159365bd3adbSJohn Baldwin struct msghdr msg;
159465bd3adbSJohn Baldwin struct tls_get_record *tgr;
159565bd3adbSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))];
159665bd3adbSJohn Baldwin char buf[64];
159765bd3adbSJohn Baldwin struct iovec iov;
159865bd3adbSJohn Baldwin
159965bd3adbSJohn Baldwin memset(&msg, 0, sizeof(msg));
160065bd3adbSJohn Baldwin
160165bd3adbSJohn Baldwin msg.msg_control = cbuf;
160265bd3adbSJohn Baldwin msg.msg_controllen = sizeof(cbuf);
160365bd3adbSJohn Baldwin
160465bd3adbSJohn Baldwin iov.iov_base = buf;
160565bd3adbSJohn Baldwin iov.iov_len = sizeof(buf);
160665bd3adbSJohn Baldwin msg.msg_iov = &iov;
160765bd3adbSJohn Baldwin msg.msg_iovlen = 1;
160865bd3adbSJohn Baldwin
160965bd3adbSJohn Baldwin ATF_REQUIRE(recvmsg(fd, &msg, 0) == -1);
161065bd3adbSJohn Baldwin if (expected_error != 0)
1611883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(expected_error, true);
161265bd3adbSJohn Baldwin }
161365bd3adbSJohn Baldwin
161465bd3adbSJohn Baldwin static void
test_ktls_receive_corrupted_record(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len,ssize_t offset)161565bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(const atf_tc_t *tc, struct tls_enable *en,
161665bd3adbSJohn Baldwin uint64_t seqno, size_t len, ssize_t offset)
161765bd3adbSJohn Baldwin {
161865bd3adbSJohn Baldwin char *plaintext, *outbuf;
161965bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len;
162065bd3adbSJohn Baldwin ssize_t rv;
162165bd3adbSJohn Baldwin int sockets[2];
162265bd3adbSJohn Baldwin
162365bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
162465bd3adbSJohn Baldwin
162565bd3adbSJohn Baldwin plaintext = alloc_buffer(len);
162665bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
162765bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap);
162865bd3adbSJohn Baldwin
162965bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
163065bd3adbSJohn Baldwin
163165bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
163265bd3adbSJohn Baldwin sizeof(*en)) == 0);
163365bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
163465bd3adbSJohn Baldwin
163565bd3adbSJohn Baldwin fd_set_blocking(sockets[0]);
163665bd3adbSJohn Baldwin fd_set_blocking(sockets[1]);
163765bd3adbSJohn Baldwin
163870bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
163965bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0);
164065bd3adbSJohn Baldwin
164165bd3adbSJohn Baldwin /* A negative offset is an offset from the end. */
164265bd3adbSJohn Baldwin if (offset < 0)
164365bd3adbSJohn Baldwin offset += outbuf_len;
164465bd3adbSJohn Baldwin outbuf[offset] ^= 0x01;
164565bd3adbSJohn Baldwin
164665bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len);
1647883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
164865bd3adbSJohn Baldwin
164965bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EBADMSG);
165065bd3adbSJohn Baldwin
165165bd3adbSJohn Baldwin free(outbuf);
165265bd3adbSJohn Baldwin free(plaintext);
165365bd3adbSJohn Baldwin
16543845cce7SJohn Baldwin close_sockets_ignore_errors(sockets);
165565bd3adbSJohn Baldwin }
165665bd3adbSJohn Baldwin
165765bd3adbSJohn Baldwin static void
test_ktls_receive_corrupted_iv(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)165865bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(const atf_tc_t *tc, struct tls_enable *en,
165965bd3adbSJohn Baldwin uint64_t seqno, size_t len)
166065bd3adbSJohn Baldwin {
166165bd3adbSJohn Baldwin ATF_REQUIRE(tls_header_len(en) > sizeof(struct tls_record_layer));
166265bd3adbSJohn Baldwin
166365bd3adbSJohn Baldwin /* Corrupt the first byte of the explicit IV after the header. */
166465bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len,
166565bd3adbSJohn Baldwin sizeof(struct tls_record_layer));
166665bd3adbSJohn Baldwin }
166765bd3adbSJohn Baldwin
166865bd3adbSJohn Baldwin static void
test_ktls_receive_corrupted_data(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)166965bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(const atf_tc_t *tc, struct tls_enable *en,
167065bd3adbSJohn Baldwin uint64_t seqno, size_t len)
167165bd3adbSJohn Baldwin {
167265bd3adbSJohn Baldwin ATF_REQUIRE(len > 0);
167365bd3adbSJohn Baldwin
167465bd3adbSJohn Baldwin /* Corrupt the first ciphertext byte after the header. */
167565bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len,
167665bd3adbSJohn Baldwin tls_header_len(en));
167765bd3adbSJohn Baldwin }
167865bd3adbSJohn Baldwin
167965bd3adbSJohn Baldwin static void
test_ktls_receive_corrupted_mac(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)168065bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(const atf_tc_t *tc, struct tls_enable *en,
168165bd3adbSJohn Baldwin uint64_t seqno, size_t len)
168265bd3adbSJohn Baldwin {
168365bd3adbSJohn Baldwin size_t offset;
168465bd3adbSJohn Baldwin
168565bd3adbSJohn Baldwin /* Corrupt the first byte of the MAC. */
168665bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC)
168765bd3adbSJohn Baldwin offset = tls_header_len(en) + len;
168865bd3adbSJohn Baldwin else
168965bd3adbSJohn Baldwin offset = -tls_mac_len(en);
169065bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, offset);
169165bd3adbSJohn Baldwin }
169265bd3adbSJohn Baldwin
169365bd3adbSJohn Baldwin static void
test_ktls_receive_corrupted_padding(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)169465bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(const atf_tc_t *tc, struct tls_enable *en,
169565bd3adbSJohn Baldwin uint64_t seqno, size_t len)
169665bd3adbSJohn Baldwin {
1697883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(CRYPTO_AES_CBC, en->cipher_algorithm);
169865bd3adbSJohn Baldwin
169965bd3adbSJohn Baldwin /* Corrupt the last byte of the padding. */
170065bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, -1);
170165bd3adbSJohn Baldwin }
170265bd3adbSJohn Baldwin
170365bd3adbSJohn Baldwin static void
test_ktls_receive_truncated_record(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)170465bd3adbSJohn Baldwin test_ktls_receive_truncated_record(const atf_tc_t *tc, struct tls_enable *en,
170565bd3adbSJohn Baldwin uint64_t seqno, size_t len)
170665bd3adbSJohn Baldwin {
170765bd3adbSJohn Baldwin char *plaintext, *outbuf;
170865bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len;
170965bd3adbSJohn Baldwin ssize_t rv;
171065bd3adbSJohn Baldwin int sockets[2];
171165bd3adbSJohn Baldwin
171265bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
171365bd3adbSJohn Baldwin
171465bd3adbSJohn Baldwin plaintext = alloc_buffer(len);
171565bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
171665bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap);
171765bd3adbSJohn Baldwin
171865bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
171965bd3adbSJohn Baldwin
172065bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
172165bd3adbSJohn Baldwin sizeof(*en)) == 0);
172265bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
172365bd3adbSJohn Baldwin
172465bd3adbSJohn Baldwin fd_set_blocking(sockets[0]);
172565bd3adbSJohn Baldwin fd_set_blocking(sockets[1]);
172665bd3adbSJohn Baldwin
172770bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
172865bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0);
172965bd3adbSJohn Baldwin
173065bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len / 2);
1731883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)(outbuf_len / 2), rv);
173265bd3adbSJohn Baldwin
173365bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0);
173465bd3adbSJohn Baldwin
173565bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE);
173665bd3adbSJohn Baldwin
173765bd3adbSJohn Baldwin free(outbuf);
173865bd3adbSJohn Baldwin free(plaintext);
173965bd3adbSJohn Baldwin
17403845cce7SJohn Baldwin close_sockets_ignore_errors(sockets);
174165bd3adbSJohn Baldwin }
174265bd3adbSJohn Baldwin
174365bd3adbSJohn Baldwin static void
test_ktls_receive_bad_major(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)174465bd3adbSJohn Baldwin test_ktls_receive_bad_major(const atf_tc_t *tc, struct tls_enable *en,
174565bd3adbSJohn Baldwin uint64_t seqno, size_t len)
174665bd3adbSJohn Baldwin {
174765bd3adbSJohn Baldwin struct tls_record_layer *hdr;
174865bd3adbSJohn Baldwin char *plaintext, *outbuf;
174965bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len;
175065bd3adbSJohn Baldwin ssize_t rv;
175165bd3adbSJohn Baldwin int sockets[2];
175265bd3adbSJohn Baldwin
175365bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
175465bd3adbSJohn Baldwin
175565bd3adbSJohn Baldwin plaintext = alloc_buffer(len);
175665bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
175765bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap);
175865bd3adbSJohn Baldwin
175965bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
176065bd3adbSJohn Baldwin
176165bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
176265bd3adbSJohn Baldwin sizeof(*en)) == 0);
176365bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
176465bd3adbSJohn Baldwin
176565bd3adbSJohn Baldwin fd_set_blocking(sockets[0]);
176665bd3adbSJohn Baldwin fd_set_blocking(sockets[1]);
176765bd3adbSJohn Baldwin
176870bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
176965bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0);
177065bd3adbSJohn Baldwin
177165bd3adbSJohn Baldwin hdr = (void *)outbuf;
177265bd3adbSJohn Baldwin hdr->tls_vmajor++;
177365bd3adbSJohn Baldwin
177465bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len);
1775883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
177665bd3adbSJohn Baldwin
177765bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL);
177865bd3adbSJohn Baldwin
177965bd3adbSJohn Baldwin free(outbuf);
178065bd3adbSJohn Baldwin free(plaintext);
178165bd3adbSJohn Baldwin
17823845cce7SJohn Baldwin close_sockets_ignore_errors(sockets);
178365bd3adbSJohn Baldwin }
178465bd3adbSJohn Baldwin
178565bd3adbSJohn Baldwin static void
test_ktls_receive_bad_minor(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)178665bd3adbSJohn Baldwin test_ktls_receive_bad_minor(const atf_tc_t *tc, struct tls_enable *en,
178765bd3adbSJohn Baldwin uint64_t seqno, size_t len)
178865bd3adbSJohn Baldwin {
178965bd3adbSJohn Baldwin struct tls_record_layer *hdr;
179065bd3adbSJohn Baldwin char *plaintext, *outbuf;
179165bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len;
179265bd3adbSJohn Baldwin ssize_t rv;
179365bd3adbSJohn Baldwin int sockets[2];
179465bd3adbSJohn Baldwin
179565bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
179665bd3adbSJohn Baldwin
179765bd3adbSJohn Baldwin plaintext = alloc_buffer(len);
179865bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
179965bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap);
180065bd3adbSJohn Baldwin
180165bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
180265bd3adbSJohn Baldwin
180365bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
180465bd3adbSJohn Baldwin sizeof(*en)) == 0);
180565bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
180665bd3adbSJohn Baldwin
180765bd3adbSJohn Baldwin fd_set_blocking(sockets[0]);
180865bd3adbSJohn Baldwin fd_set_blocking(sockets[1]);
180965bd3adbSJohn Baldwin
181070bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno,
181165bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0);
181265bd3adbSJohn Baldwin
181365bd3adbSJohn Baldwin hdr = (void *)outbuf;
181465bd3adbSJohn Baldwin hdr->tls_vminor++;
181565bd3adbSJohn Baldwin
181665bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len);
1817883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
181865bd3adbSJohn Baldwin
181965bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL);
182065bd3adbSJohn Baldwin
182165bd3adbSJohn Baldwin free(outbuf);
182265bd3adbSJohn Baldwin free(plaintext);
182365bd3adbSJohn Baldwin
18243845cce7SJohn Baldwin close_sockets_ignore_errors(sockets);
182565bd3adbSJohn Baldwin }
182665bd3adbSJohn Baldwin
182765bd3adbSJohn Baldwin static void
test_ktls_receive_bad_type(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)182865bd3adbSJohn Baldwin test_ktls_receive_bad_type(const atf_tc_t *tc, struct tls_enable *en,
182965bd3adbSJohn Baldwin uint64_t seqno, size_t len)
183065bd3adbSJohn Baldwin {
183165bd3adbSJohn Baldwin struct tls_record_layer *hdr;
183265bd3adbSJohn Baldwin char *plaintext, *outbuf;
183365bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len;
183465bd3adbSJohn Baldwin ssize_t rv;
183565bd3adbSJohn Baldwin int sockets[2];
183665bd3adbSJohn Baldwin
183765bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2);
1838883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_THREE, en->tls_vminor);
183965bd3adbSJohn Baldwin
184065bd3adbSJohn Baldwin plaintext = alloc_buffer(len);
184165bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en);
184265bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap);
184365bd3adbSJohn Baldwin
184465bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
184565bd3adbSJohn Baldwin
184665bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
184765bd3adbSJohn Baldwin sizeof(*en)) == 0);
184865bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
184965bd3adbSJohn Baldwin
185065bd3adbSJohn Baldwin fd_set_blocking(sockets[0]);
185165bd3adbSJohn Baldwin fd_set_blocking(sockets[1]);
185265bd3adbSJohn Baldwin
185370bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, 0x21 /* Alert */, seqno,
185465bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0);
185565bd3adbSJohn Baldwin
185665bd3adbSJohn Baldwin hdr = (void *)outbuf;
185765bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP + 1;
185865bd3adbSJohn Baldwin
185965bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len);
1860883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
186165bd3adbSJohn Baldwin
186265bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL);
186365bd3adbSJohn Baldwin
186465bd3adbSJohn Baldwin free(outbuf);
186565bd3adbSJohn Baldwin free(plaintext);
186665bd3adbSJohn Baldwin
18673845cce7SJohn Baldwin close_sockets_ignore_errors(sockets);
186865bd3adbSJohn Baldwin }
186965bd3adbSJohn Baldwin
187065bd3adbSJohn Baldwin static void
test_ktls_receive_bad_size(const atf_tc_t * tc,struct tls_enable * en,uint64_t seqno,size_t len)187165bd3adbSJohn Baldwin test_ktls_receive_bad_size(const atf_tc_t *tc, struct tls_enable *en,
187265bd3adbSJohn Baldwin uint64_t seqno, size_t len)
187365bd3adbSJohn Baldwin {
187465bd3adbSJohn Baldwin struct tls_record_layer *hdr;
187565bd3adbSJohn Baldwin char *outbuf;
187665bd3adbSJohn Baldwin size_t outbuf_len;
187765bd3adbSJohn Baldwin ssize_t rv;
187865bd3adbSJohn Baldwin int sockets[2];
187965bd3adbSJohn Baldwin
188065bd3adbSJohn Baldwin outbuf_len = sizeof(*hdr) + len;
188165bd3adbSJohn Baldwin outbuf = calloc(1, outbuf_len);
188265bd3adbSJohn Baldwin
188365bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
188465bd3adbSJohn Baldwin
188565bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en,
188665bd3adbSJohn Baldwin sizeof(*en)) == 0);
188765bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE);
188865bd3adbSJohn Baldwin
188965bd3adbSJohn Baldwin fd_set_blocking(sockets[0]);
189065bd3adbSJohn Baldwin fd_set_blocking(sockets[1]);
189165bd3adbSJohn Baldwin
189265bd3adbSJohn Baldwin hdr = (void *)outbuf;
189365bd3adbSJohn Baldwin hdr->tls_vmajor = en->tls_vmajor;
189465bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE)
189565bd3adbSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO;
189665bd3adbSJohn Baldwin else
189765bd3adbSJohn Baldwin hdr->tls_vminor = en->tls_vminor;
189865bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP;
189965bd3adbSJohn Baldwin hdr->tls_length = htons(len);
190065bd3adbSJohn Baldwin
190165bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len);
1902883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv);
190365bd3adbSJohn Baldwin
1904f0c143b3SJohn Baldwin /*
1905f0c143b3SJohn Baldwin * The other end may notice the error and drop the connection
1906f0c143b3SJohn Baldwin * before this executes resulting in shutdown() failing with
1907b08a9b86SMark Johnston * either ENOTCONN or ECONNRESET. Ignore this error if it
1908b08a9b86SMark Johnston * occurs.
1909f0c143b3SJohn Baldwin */
1910b08a9b86SMark Johnston if (shutdown(sockets[1], SHUT_WR) != 0) {
1911b08a9b86SMark Johnston ATF_REQUIRE_MSG(errno == ENOTCONN || errno == ECONNRESET,
1912b08a9b86SMark Johnston "shutdown() failed: %s", strerror(errno));
1913b08a9b86SMark Johnston }
191465bd3adbSJohn Baldwin
191565bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE);
191665bd3adbSJohn Baldwin
191765bd3adbSJohn Baldwin free(outbuf);
191865bd3adbSJohn Baldwin
19193845cce7SJohn Baldwin close_sockets_ignore_errors(sockets);
192065bd3adbSJohn Baldwin }
192165bd3adbSJohn Baldwin
19220ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \
19230ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \
192464811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \
19250ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \
192664811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO)
19270ff2a12aSJohn Baldwin
192883a54b58SJohn Baldwin #define TLS_13_TESTS(M) \
192983a54b58SJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \
193083a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \
193183a54b58SJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \
193283a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \
193383a54b58SJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \
193483a54b58SJohn Baldwin TLS_MINOR_VER_THREE)
193583a54b58SJohn Baldwin
193664811651SJohn Baldwin #define AES_CBC_NONZERO_TESTS(M) \
1937a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \
1938a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \
1939a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \
1940a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \
1941a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \
1942a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \
1943a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \
1944a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \
1945a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \
1946a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \
1947a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \
1948a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \
1949a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \
1950a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \
1951a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \
1952a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \
1953a10482eaSJohn Baldwin
195464811651SJohn Baldwin #define AES_CBC_TESTS(M) \
195564811651SJohn Baldwin TLS_10_TESTS(M) \
195664811651SJohn Baldwin AES_CBC_NONZERO_TESTS(M)
195764811651SJohn Baldwin
195865bd3adbSJohn Baldwin #define AES_GCM_12_TESTS(M) \
1959a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \
1960a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \
1961a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \
196265bd3adbSJohn Baldwin TLS_MINOR_VER_TWO)
196365bd3adbSJohn Baldwin
196465bd3adbSJohn Baldwin #define AES_GCM_TESTS(M) \
196565bd3adbSJohn Baldwin AES_GCM_12_TESTS(M) \
1966a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \
1967a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \
1968a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \
1969a10482eaSJohn Baldwin TLS_MINOR_VER_THREE)
1970a10482eaSJohn Baldwin
1971a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \
1972a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \
1973a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \
1974a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \
1975a10482eaSJohn Baldwin TLS_MINOR_VER_THREE)
1976a10482eaSJohn Baldwin
1977a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
1978a10482eaSJohn Baldwin auth_alg, minor, name, len) \
1979a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \
1980a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \
1981a10482eaSJohn Baldwin { \
1982a10482eaSJohn Baldwin struct tls_enable en; \
1983a10482eaSJohn Baldwin uint64_t seqno; \
1984a10482eaSJohn Baldwin \
1985a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \
1986a10482eaSJohn Baldwin seqno = random(); \
198770bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
198870bb2286SJohn Baldwin seqno, &en); \
19892400a7b1SJohn Baldwin test_ktls_transmit_app_data(tc, &en, seqno, len); \
1990a10482eaSJohn Baldwin free_tls_enable(&en); \
1991a10482eaSJohn Baldwin }
1992a10482eaSJohn Baldwin
1993a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
1994a10482eaSJohn Baldwin auth_alg, minor, name) \
1995a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
1996a10482eaSJohn Baldwin
1997a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
199844265dc3SJohn Baldwin auth_alg, minor, name, type, len) \
199944265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \
200044265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \
2001a10482eaSJohn Baldwin { \
2002a10482eaSJohn Baldwin struct tls_enable en; \
2003a10482eaSJohn Baldwin uint64_t seqno; \
2004a10482eaSJohn Baldwin \
2005a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \
2006a10482eaSJohn Baldwin seqno = random(); \
200770bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
200870bb2286SJohn Baldwin seqno, &en); \
20092400a7b1SJohn Baldwin test_ktls_transmit_control(tc, &en, seqno, type, len); \
2010a10482eaSJohn Baldwin free_tls_enable(&en); \
2011a10482eaSJohn Baldwin }
2012a10482eaSJohn Baldwin
2013a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
201444265dc3SJohn Baldwin auth_alg, minor, name) \
201544265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name);
2016a10482eaSJohn Baldwin
20170ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \
20185de79eedSMark Johnston key_size, auth_alg, minor) \
20190ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \
20200ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \
20210ff2a12aSJohn Baldwin { \
20220ff2a12aSJohn Baldwin struct tls_enable en; \
20230ff2a12aSJohn Baldwin uint64_t seqno; \
20240ff2a12aSJohn Baldwin \
20250ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \
20260ff2a12aSJohn Baldwin seqno = random(); \
202770bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
202870bb2286SJohn Baldwin seqno, &en); \
20292400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(tc, &en, seqno); \
20300ff2a12aSJohn Baldwin free_tls_enable(&en); \
20310ff2a12aSJohn Baldwin }
20320ff2a12aSJohn Baldwin
20330ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \
20345de79eedSMark Johnston key_size, auth_alg, minor) \
20350ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment);
20360ff2a12aSJohn Baldwin
2037a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \
2038a10482eaSJohn Baldwin minor) \
2039a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
2040a10482eaSJohn Baldwin auth_alg, minor, short, 64) \
2041a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
2042a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \
2043a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
204444265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32)
2045a10482eaSJohn Baldwin
2046a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \
2047a10482eaSJohn Baldwin minor) \
2048a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
2049a10482eaSJohn Baldwin auth_alg, minor, short) \
2050a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
2051a10482eaSJohn Baldwin auth_alg, minor, long) \
2052a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
205344265dc3SJohn Baldwin auth_alg, minor, control)
2054a10482eaSJohn Baldwin
2055a10482eaSJohn Baldwin /*
2056a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests:
2057a10482eaSJohn Baldwin *
2058a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as
2059a10482eaSJohn Baldwin * a single TLS record)
2060a10482eaSJohn Baldwin *
2061a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across
2062a10482eaSJohn Baldwin * multiple TLS records)
2063a10482eaSJohn Baldwin *
2064a10482eaSJohn Baldwin * - a control test which sends a single record with a specific
2065a10482eaSJohn Baldwin * content type via sendmsg()
2066a10482eaSJohn Baldwin */
2067a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS);
2068a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS);
2069a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS);
2070a10482eaSJohn Baldwin
207144265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \
207244265dc3SJohn Baldwin auth_alg, minor) \
207344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
207444265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \
207544265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
207644265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \
207744265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
207844265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \
207944265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
208044265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \
208144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
208244265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \
208344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
208444265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \
208544265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
208644265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \
208744265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
208844265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \
208944265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
209044265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \
209144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
209244265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \
209344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
209444265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \
209544265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
209644265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \
209744265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
209844265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \
209944265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
210044265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \
210144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
210244265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \
210344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
210444265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16)
210544265dc3SJohn Baldwin
210644265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \
210744265dc3SJohn Baldwin auth_alg, minor) \
210844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
210944265dc3SJohn Baldwin auth_alg, minor, padding_1) \
211044265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
211144265dc3SJohn Baldwin auth_alg, minor, padding_2) \
211244265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
211344265dc3SJohn Baldwin auth_alg, minor, padding_3) \
211444265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
211544265dc3SJohn Baldwin auth_alg, minor, padding_4) \
211644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
211744265dc3SJohn Baldwin auth_alg, minor, padding_5) \
211844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
211944265dc3SJohn Baldwin auth_alg, minor, padding_6) \
212044265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
212144265dc3SJohn Baldwin auth_alg, minor, padding_7) \
212244265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
212344265dc3SJohn Baldwin auth_alg, minor, padding_8) \
212444265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
212544265dc3SJohn Baldwin auth_alg, minor, padding_9) \
212644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
212744265dc3SJohn Baldwin auth_alg, minor, padding_10) \
212844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
212944265dc3SJohn Baldwin auth_alg, minor, padding_11) \
213044265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
213144265dc3SJohn Baldwin auth_alg, minor, padding_12) \
213244265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
213344265dc3SJohn Baldwin auth_alg, minor, padding_13) \
213444265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
213544265dc3SJohn Baldwin auth_alg, minor, padding_14) \
213644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
213744265dc3SJohn Baldwin auth_alg, minor, padding_15) \
213844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \
213944265dc3SJohn Baldwin auth_alg, minor, padding_16)
214044265dc3SJohn Baldwin
214144265dc3SJohn Baldwin /*
214244265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages
214344265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests
214444265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a
214544265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling
214644265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all
214744265dc3SJohn Baldwin * of the possible padding lengths for each suite.
214844265dc3SJohn Baldwin */
214944265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS);
215044265dc3SJohn Baldwin
21510ff2a12aSJohn Baldwin /*
21520ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that
21530ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections.
21540ff2a12aSJohn Baldwin */
21555de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
21565de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
21575de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST);
21580ff2a12aSJohn Baldwin
2159d1c369f9SJohn Baldwin static void
test_ktls_invalid_transmit_cipher_suite(const atf_tc_t * tc,struct tls_enable * en)21602400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc,
21612400a7b1SJohn Baldwin struct tls_enable *en)
2162d1c369f9SJohn Baldwin {
2163d1c369f9SJohn Baldwin int sockets[2];
2164d1c369f9SJohn Baldwin
21652400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
2166d1c369f9SJohn Baldwin
2167883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EINVAL, setsockopt(sockets[1], IPPROTO_TCP,
2168883d1742SJohn Baldwin TCP_TXTLS_ENABLE, en, sizeof(*en)) == -1);
2169d1c369f9SJohn Baldwin
21702c105205SJohn Baldwin close_sockets(sockets);
2171d1c369f9SJohn Baldwin }
2172d1c369f9SJohn Baldwin
2173d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \
2174d1c369f9SJohn Baldwin minor) \
2175d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \
2176d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \
2177d1c369f9SJohn Baldwin { \
2178d1c369f9SJohn Baldwin struct tls_enable en; \
2179d1c369f9SJohn Baldwin uint64_t seqno; \
2180d1c369f9SJohn Baldwin \
2181d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \
2182d1c369f9SJohn Baldwin seqno = random(); \
218370bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
218470bb2286SJohn Baldwin seqno, &en); \
21852400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(tc, &en); \
2186d1c369f9SJohn Baldwin free_tls_enable(&en); \
2187d1c369f9SJohn Baldwin }
2188d1c369f9SJohn Baldwin
2189d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \
2190d1c369f9SJohn Baldwin minor) \
2191d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name);
2192d1c369f9SJohn Baldwin
2193d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \
2194d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \
2195d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \
2196d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \
2197d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \
2198d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \
2199d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \
2200d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \
2201d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \
2202d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \
2203d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \
2204d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \
2205d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \
2206d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \
2207d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \
2208d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \
2209d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \
2210d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \
2211d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \
2212d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \
2213d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \
2214d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \
2215d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE)
2216d1c369f9SJohn Baldwin
2217d1c369f9SJohn Baldwin /*
2218d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit.
2219d1c369f9SJohn Baldwin */
2220d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST);
2221d1c369f9SJohn Baldwin
22223e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
222305a1d0f5SJohn Baldwin auth_alg, minor, name, len, padding) \
22243e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \
22253e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \
22263e7f8a8dSJohn Baldwin { \
22273e7f8a8dSJohn Baldwin struct tls_enable en; \
22283e7f8a8dSJohn Baldwin uint64_t seqno; \
22293e7f8a8dSJohn Baldwin \
22303e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \
22313e7f8a8dSJohn Baldwin seqno = random(); \
223270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
223370bb2286SJohn Baldwin seqno, &en); \
22342400a7b1SJohn Baldwin test_ktls_receive_app_data(tc, &en, seqno, len, padding); \
22353e7f8a8dSJohn Baldwin free_tls_enable(&en); \
22363e7f8a8dSJohn Baldwin }
22373e7f8a8dSJohn Baldwin
22383e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
22393e7f8a8dSJohn Baldwin auth_alg, minor, name) \
22403e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
22413e7f8a8dSJohn Baldwin
224265bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \
224365bd3adbSJohn Baldwin auth_alg, minor, len) \
224465bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_data); \
224565bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc) \
224665bd3adbSJohn Baldwin { \
224765bd3adbSJohn Baldwin struct tls_enable en; \
224865bd3adbSJohn Baldwin uint64_t seqno; \
224965bd3adbSJohn Baldwin \
225065bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
225165bd3adbSJohn Baldwin seqno = random(); \
225270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
225370bb2286SJohn Baldwin seqno, &en); \
225465bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(tc, &en, seqno, len); \
225565bd3adbSJohn Baldwin free_tls_enable(&en); \
225665bd3adbSJohn Baldwin }
225765bd3adbSJohn Baldwin
225865bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \
225965bd3adbSJohn Baldwin auth_alg, minor) \
226065bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_data);
226165bd3adbSJohn Baldwin
226265bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \
226365bd3adbSJohn Baldwin auth_alg, minor, len) \
226465bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_mac); \
226565bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc) \
226665bd3adbSJohn Baldwin { \
226765bd3adbSJohn Baldwin struct tls_enable en; \
226865bd3adbSJohn Baldwin uint64_t seqno; \
226965bd3adbSJohn Baldwin \
227065bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
227165bd3adbSJohn Baldwin seqno = random(); \
227270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
227370bb2286SJohn Baldwin seqno, &en); \
227465bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(tc, &en, seqno, len); \
227565bd3adbSJohn Baldwin free_tls_enable(&en); \
227665bd3adbSJohn Baldwin }
227765bd3adbSJohn Baldwin
227865bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \
227965bd3adbSJohn Baldwin auth_alg, minor) \
228065bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_mac);
228165bd3adbSJohn Baldwin
228265bd3adbSJohn Baldwin #define GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \
228365bd3adbSJohn Baldwin auth_alg, minor, len) \
228465bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_truncated_record); \
228565bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc) \
228665bd3adbSJohn Baldwin { \
228765bd3adbSJohn Baldwin struct tls_enable en; \
228865bd3adbSJohn Baldwin uint64_t seqno; \
228965bd3adbSJohn Baldwin \
229065bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
229165bd3adbSJohn Baldwin seqno = random(); \
229270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
229370bb2286SJohn Baldwin seqno, &en); \
229465bd3adbSJohn Baldwin test_ktls_receive_truncated_record(tc, &en, seqno, len); \
229565bd3adbSJohn Baldwin free_tls_enable(&en); \
229665bd3adbSJohn Baldwin }
229765bd3adbSJohn Baldwin
229865bd3adbSJohn Baldwin #define ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \
229965bd3adbSJohn Baldwin auth_alg, minor) \
230065bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_truncated_record);
230165bd3adbSJohn Baldwin
230265bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \
230365bd3adbSJohn Baldwin auth_alg, minor, len) \
230465bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_major); \
230565bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc) \
230665bd3adbSJohn Baldwin { \
230765bd3adbSJohn Baldwin struct tls_enable en; \
230865bd3adbSJohn Baldwin uint64_t seqno; \
230965bd3adbSJohn Baldwin \
231065bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
231165bd3adbSJohn Baldwin seqno = random(); \
231270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
231370bb2286SJohn Baldwin seqno, &en); \
231465bd3adbSJohn Baldwin test_ktls_receive_bad_major(tc, &en, seqno, len); \
231565bd3adbSJohn Baldwin free_tls_enable(&en); \
231665bd3adbSJohn Baldwin }
231765bd3adbSJohn Baldwin
231865bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \
231965bd3adbSJohn Baldwin auth_alg, minor) \
232065bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_major);
232165bd3adbSJohn Baldwin
232265bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \
232365bd3adbSJohn Baldwin auth_alg, minor, len) \
232465bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_minor); \
232565bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc) \
232665bd3adbSJohn Baldwin { \
232765bd3adbSJohn Baldwin struct tls_enable en; \
232865bd3adbSJohn Baldwin uint64_t seqno; \
232965bd3adbSJohn Baldwin \
233065bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
233165bd3adbSJohn Baldwin seqno = random(); \
233270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
233370bb2286SJohn Baldwin seqno, &en); \
233465bd3adbSJohn Baldwin test_ktls_receive_bad_minor(tc, &en, seqno, len); \
233565bd3adbSJohn Baldwin free_tls_enable(&en); \
233665bd3adbSJohn Baldwin }
233765bd3adbSJohn Baldwin
233865bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \
233965bd3adbSJohn Baldwin auth_alg, minor) \
234065bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_minor);
234165bd3adbSJohn Baldwin
234265bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
234365bd3adbSJohn Baldwin auth_alg, minor, name, len) \
234465bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \
234565bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \
234665bd3adbSJohn Baldwin { \
234765bd3adbSJohn Baldwin struct tls_enable en; \
234865bd3adbSJohn Baldwin uint64_t seqno; \
234965bd3adbSJohn Baldwin \
235065bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
235165bd3adbSJohn Baldwin seqno = random(); \
235270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
235370bb2286SJohn Baldwin seqno, &en); \
235465bd3adbSJohn Baldwin test_ktls_receive_bad_size(tc, &en, seqno, (len)); \
235565bd3adbSJohn Baldwin free_tls_enable(&en); \
235665bd3adbSJohn Baldwin }
235765bd3adbSJohn Baldwin
235865bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
235965bd3adbSJohn Baldwin auth_alg, minor, name) \
236065bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name);
236165bd3adbSJohn Baldwin
23623e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \
23633e7f8a8dSJohn Baldwin minor) \
23643e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
236505a1d0f5SJohn Baldwin auth_alg, minor, short, 64, 0) \
23663e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
236765bd3adbSJohn Baldwin auth_alg, minor, long, 64 * 1024, 0) \
236865bd3adbSJohn Baldwin GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \
236965bd3adbSJohn Baldwin auth_alg, minor, 64) \
237065bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \
237165bd3adbSJohn Baldwin auth_alg, minor, 64) \
237265bd3adbSJohn Baldwin GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \
237365bd3adbSJohn Baldwin auth_alg, minor, 64) \
237465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \
237565bd3adbSJohn Baldwin auth_alg, minor, 64) \
237665bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \
237765bd3adbSJohn Baldwin auth_alg, minor, 64) \
237865bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
237965bd3adbSJohn Baldwin auth_alg, minor, small_record, \
238065bd3adbSJohn Baldwin tls_minimum_record_payload(&en) - 1) \
238165bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
238265bd3adbSJohn Baldwin auth_alg, minor, oversized_record, \
238365bd3adbSJohn Baldwin TLS_MAX_MSG_SIZE_V10_2 * 2)
23843e7f8a8dSJohn Baldwin
23853e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \
23863e7f8a8dSJohn Baldwin minor) \
23873e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
23883e7f8a8dSJohn Baldwin auth_alg, minor, short) \
23893e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
239065bd3adbSJohn Baldwin auth_alg, minor, long) \
239165bd3adbSJohn Baldwin ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \
239265bd3adbSJohn Baldwin auth_alg, minor) \
239365bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \
239465bd3adbSJohn Baldwin auth_alg, minor) \
239565bd3adbSJohn Baldwin ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \
239665bd3adbSJohn Baldwin auth_alg, minor) \
239765bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \
239865bd3adbSJohn Baldwin auth_alg, minor) \
239965bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \
240065bd3adbSJohn Baldwin auth_alg, minor) \
240165bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
240265bd3adbSJohn Baldwin auth_alg, minor, small_record) \
240365bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
240465bd3adbSJohn Baldwin auth_alg, minor, oversized_record)
24053e7f8a8dSJohn Baldwin
24063e7f8a8dSJohn Baldwin /*
240765bd3adbSJohn Baldwin * For each supported cipher suite, run several receive tests:
24083e7f8a8dSJohn Baldwin *
24093e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as
24103e7f8a8dSJohn Baldwin * a single TLS record)
24113e7f8a8dSJohn Baldwin *
24123e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across
24133e7f8a8dSJohn Baldwin * multiple TLS records)
241465bd3adbSJohn Baldwin *
241565bd3adbSJohn Baldwin * - a test with corrupted payload data in a single TLS record
241665bd3adbSJohn Baldwin *
241765bd3adbSJohn Baldwin * - a test with a corrupted MAC in a single TLS record
241865bd3adbSJohn Baldwin *
241965bd3adbSJohn Baldwin * - a test with a truncated TLS record
242065bd3adbSJohn Baldwin *
242165bd3adbSJohn Baldwin * - tests with invalid TLS major and minor versions
242265bd3adbSJohn Baldwin *
242365bd3adbSJohn Baldwin * - a tests with a record whose is one less than the smallest valid
242465bd3adbSJohn Baldwin * size
242565bd3adbSJohn Baldwin *
242665bd3adbSJohn Baldwin * - a test with an oversized TLS record
24273e7f8a8dSJohn Baldwin */
242864811651SJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_TESTS);
242905a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS);
243005a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS);
243105a1d0f5SJohn Baldwin
243264811651SJohn Baldwin #define GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \
243364811651SJohn Baldwin key_size, auth_alg, minor) \
243464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
243564811651SJohn Baldwin auth_alg, minor, padding_1, 1, 0) \
243664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
243764811651SJohn Baldwin auth_alg, minor, padding_2, 2, 0) \
243864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
243964811651SJohn Baldwin auth_alg, minor, padding_3, 3, 0) \
244064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
244164811651SJohn Baldwin auth_alg, minor, padding_4, 4, 0) \
244264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
244364811651SJohn Baldwin auth_alg, minor, padding_5, 5, 0) \
244464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
244564811651SJohn Baldwin auth_alg, minor, padding_6, 6, 0) \
244664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
244764811651SJohn Baldwin auth_alg, minor, padding_7, 7, 0) \
244864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
244964811651SJohn Baldwin auth_alg, minor, padding_8, 8, 0) \
245064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
245164811651SJohn Baldwin auth_alg, minor, padding_9, 9, 0) \
245264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
245364811651SJohn Baldwin auth_alg, minor, padding_10, 10, 0) \
245464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
245564811651SJohn Baldwin auth_alg, minor, padding_11, 11, 0) \
245664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
245764811651SJohn Baldwin auth_alg, minor, padding_12, 12, 0) \
245864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
245964811651SJohn Baldwin auth_alg, minor, padding_13, 13, 0) \
246064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
246164811651SJohn Baldwin auth_alg, minor, padding_14, 14, 0) \
246264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
246364811651SJohn Baldwin auth_alg, minor, padding_15, 15, 0) \
246464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
246564811651SJohn Baldwin auth_alg, minor, padding_16, 16, 0) \
246664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
246764811651SJohn Baldwin auth_alg, minor, padding_16_extra, 16, 16) \
246864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
246964811651SJohn Baldwin auth_alg, minor, padding_32_extra, 16, 32)
247064811651SJohn Baldwin
247164811651SJohn Baldwin #define ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \
247264811651SJohn Baldwin key_size, auth_alg, minor) \
247364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
247464811651SJohn Baldwin auth_alg, minor, padding_1) \
247564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
247664811651SJohn Baldwin auth_alg, minor, padding_2) \
247764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
247864811651SJohn Baldwin auth_alg, minor, padding_3) \
247964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
248064811651SJohn Baldwin auth_alg, minor, padding_4) \
248164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
248264811651SJohn Baldwin auth_alg, minor, padding_5) \
248364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
248464811651SJohn Baldwin auth_alg, minor, padding_6) \
248564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
248664811651SJohn Baldwin auth_alg, minor, padding_7) \
248764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
248864811651SJohn Baldwin auth_alg, minor, padding_8) \
248964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
249064811651SJohn Baldwin auth_alg, minor, padding_9) \
249164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
249264811651SJohn Baldwin auth_alg, minor, padding_10) \
249364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
249464811651SJohn Baldwin auth_alg, minor, padding_11) \
249564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
249664811651SJohn Baldwin auth_alg, minor, padding_12) \
249764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
249864811651SJohn Baldwin auth_alg, minor, padding_13) \
249964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
250064811651SJohn Baldwin auth_alg, minor, padding_14) \
250164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
250264811651SJohn Baldwin auth_alg, minor, padding_15) \
250364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
250464811651SJohn Baldwin auth_alg, minor, padding_16) \
250564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
250664811651SJohn Baldwin auth_alg, minor, padding_16_extra) \
250764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
250864811651SJohn Baldwin auth_alg, minor, padding_32_extra)
250964811651SJohn Baldwin
251065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \
251165bd3adbSJohn Baldwin auth_alg, minor, len) \
251265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_padding); \
251365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc) \
251465bd3adbSJohn Baldwin { \
251565bd3adbSJohn Baldwin struct tls_enable en; \
251665bd3adbSJohn Baldwin uint64_t seqno; \
251765bd3adbSJohn Baldwin \
251865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
251965bd3adbSJohn Baldwin seqno = random(); \
252070bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
252170bb2286SJohn Baldwin seqno, &en); \
252265bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(tc, &en, seqno, len); \
252365bd3adbSJohn Baldwin free_tls_enable(&en); \
252465bd3adbSJohn Baldwin }
252565bd3adbSJohn Baldwin
252665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \
252765bd3adbSJohn Baldwin auth_alg, minor) \
252865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_padding);
252965bd3adbSJohn Baldwin
253065bd3adbSJohn Baldwin #define GEN_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \
253165bd3adbSJohn Baldwin auth_alg, minor) \
253265bd3adbSJohn Baldwin GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \
253365bd3adbSJohn Baldwin key_size, auth_alg, minor) \
253465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \
253565bd3adbSJohn Baldwin auth_alg, minor, 64) \
253665bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
253765bd3adbSJohn Baldwin auth_alg, minor, non_block_size, \
253865bd3adbSJohn Baldwin tls_minimum_record_payload(&en) + 1)
253965bd3adbSJohn Baldwin
254065bd3adbSJohn Baldwin #define ADD_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \
254165bd3adbSJohn Baldwin auth_alg, minor) \
254265bd3adbSJohn Baldwin ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \
254365bd3adbSJohn Baldwin key_size, auth_alg, minor) \
254465bd3adbSJohn Baldwin ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \
254565bd3adbSJohn Baldwin auth_alg, minor) \
254665bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
254765bd3adbSJohn Baldwin auth_alg, minor, non_block_size)
254865bd3adbSJohn Baldwin
254964811651SJohn Baldwin /*
255064811651SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages
255164811651SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests
255264811651SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a
255364811651SJohn Baldwin * function of the cipher suite's MAC length. However, cycling
255464811651SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all
255564811651SJohn Baldwin * of the possible padding lengths for each suite.
255664811651SJohn Baldwin *
255764811651SJohn Baldwin * Two additional tests check for additional padding with an extra
255864811651SJohn Baldwin * 16 or 32 bytes beyond the normal padding.
255965bd3adbSJohn Baldwin *
256065bd3adbSJohn Baldwin * Another test checks for corrupted padding.
256165bd3adbSJohn Baldwin *
256265bd3adbSJohn Baldwin * Another test checks for a record whose payload is not a multiple of
256365bd3adbSJohn Baldwin * the AES block size.
256464811651SJohn Baldwin */
256565bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_MTE_TESTS);
256664811651SJohn Baldwin
256765bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \
256865bd3adbSJohn Baldwin auth_alg, minor) \
256965bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_iv); \
257065bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc) \
257165bd3adbSJohn Baldwin { \
257265bd3adbSJohn Baldwin struct tls_enable en; \
257365bd3adbSJohn Baldwin uint64_t seqno; \
257465bd3adbSJohn Baldwin \
257565bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
257665bd3adbSJohn Baldwin seqno = random(); \
257770bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
257870bb2286SJohn Baldwin seqno, &en); \
257965bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(tc, &en, seqno, 64); \
258065bd3adbSJohn Baldwin free_tls_enable(&en); \
258165bd3adbSJohn Baldwin }
258265bd3adbSJohn Baldwin
258365bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \
258465bd3adbSJohn Baldwin auth_alg, minor) \
258565bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_iv);
258665bd3adbSJohn Baldwin
258765bd3adbSJohn Baldwin #define GEN_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \
258864811651SJohn Baldwin key_size, auth_alg, minor) \
258965bd3adbSJohn Baldwin GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \
259065bd3adbSJohn Baldwin auth_alg, minor) \
259165bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
259265bd3adbSJohn Baldwin auth_alg, minor, short_header, \
259365bd3adbSJohn Baldwin sizeof(struct tls_record_layer) + 1)
259465bd3adbSJohn Baldwin
259565bd3adbSJohn Baldwin #define ADD_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \
259665bd3adbSJohn Baldwin key_size, auth_alg, minor) \
259765bd3adbSJohn Baldwin ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \
259865bd3adbSJohn Baldwin auth_alg, minor) \
259965bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \
260065bd3adbSJohn Baldwin auth_alg, minor, short_header)
260165bd3adbSJohn Baldwin
260265bd3adbSJohn Baldwin /*
260365bd3adbSJohn Baldwin * For cipher suites with an explicit IV, run a receive test where the
260465bd3adbSJohn Baldwin * explicit IV has been corrupted. Also run a receive test that sends
260565bd3adbSJohn Baldwin * a short record without a complete IV.
260665bd3adbSJohn Baldwin */
260765bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS);
260865bd3adbSJohn Baldwin AES_GCM_12_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS);
260965bd3adbSJohn Baldwin
261065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \
261165bd3adbSJohn Baldwin auth_alg, minor, len) \
261265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_type); \
261365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc) \
261465bd3adbSJohn Baldwin { \
261565bd3adbSJohn Baldwin struct tls_enable en; \
261665bd3adbSJohn Baldwin uint64_t seqno; \
261765bd3adbSJohn Baldwin \
261865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \
261965bd3adbSJohn Baldwin seqno = random(); \
262070bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
262170bb2286SJohn Baldwin seqno, &en); \
262265bd3adbSJohn Baldwin test_ktls_receive_bad_type(tc, &en, seqno, len); \
262365bd3adbSJohn Baldwin free_tls_enable(&en); \
262465bd3adbSJohn Baldwin }
262565bd3adbSJohn Baldwin
262665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \
262765bd3adbSJohn Baldwin auth_alg, minor) \
262865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_type);
262965bd3adbSJohn Baldwin
263065bd3adbSJohn Baldwin #define GEN_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \
263165bd3adbSJohn Baldwin auth_alg, minor) \
263205a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
263305a1d0f5SJohn Baldwin auth_alg, minor, short_padded, 64, 16) \
263405a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
263565bd3adbSJohn Baldwin auth_alg, minor, long_padded, 64 * 1024, 15) \
263665bd3adbSJohn Baldwin GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \
263765bd3adbSJohn Baldwin auth_alg, minor, 64)
263805a1d0f5SJohn Baldwin
263965bd3adbSJohn Baldwin #define ADD_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \
264065bd3adbSJohn Baldwin auth_alg, minor) \
264105a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
264205a1d0f5SJohn Baldwin auth_alg, minor, short_padded) \
264305a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \
264465bd3adbSJohn Baldwin auth_alg, minor, long_padded) \
264565bd3adbSJohn Baldwin ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \
264665bd3adbSJohn Baldwin auth_alg, minor)
264705a1d0f5SJohn Baldwin
264805a1d0f5SJohn Baldwin /*
264905a1d0f5SJohn Baldwin * For TLS 1.3 cipher suites, run two additional receive tests which
265065bd3adbSJohn Baldwin * use add padding to each record. Also run a test that uses an
265165bd3adbSJohn Baldwin * invalid "outer" record type.
265205a1d0f5SJohn Baldwin */
265365bd3adbSJohn Baldwin TLS_13_TESTS(GEN_RECEIVE_TLS13_TESTS);
26543e7f8a8dSJohn Baldwin
2655233ce578SJohn Baldwin static void
test_ktls_invalid_receive_cipher_suite(const atf_tc_t * tc,struct tls_enable * en)26562400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc,
26572400a7b1SJohn Baldwin struct tls_enable *en)
2658233ce578SJohn Baldwin {
2659233ce578SJohn Baldwin int sockets[2];
2660233ce578SJohn Baldwin
26612400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
2662233ce578SJohn Baldwin
2663883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EINVAL, setsockopt(sockets[1], IPPROTO_TCP,
2664883d1742SJohn Baldwin TCP_RXTLS_ENABLE, en, sizeof(*en)) == -1);
2665233ce578SJohn Baldwin
26662c105205SJohn Baldwin close_sockets(sockets);
2667233ce578SJohn Baldwin }
2668233ce578SJohn Baldwin
2669233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \
2670233ce578SJohn Baldwin minor) \
2671233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name); \
2672233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc) \
2673233ce578SJohn Baldwin { \
2674233ce578SJohn Baldwin struct tls_enable en; \
2675233ce578SJohn Baldwin uint64_t seqno; \
2676233ce578SJohn Baldwin \
2677233ce578SJohn Baldwin ATF_REQUIRE_KTLS(); \
2678233ce578SJohn Baldwin seqno = random(); \
267970bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
268070bb2286SJohn Baldwin seqno, &en); \
26812400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(tc, &en); \
2682233ce578SJohn Baldwin free_tls_enable(&en); \
2683233ce578SJohn Baldwin }
2684233ce578SJohn Baldwin
2685233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \
2686233ce578SJohn Baldwin minor) \
2687233ce578SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name);
2688233ce578SJohn Baldwin
2689233ce578SJohn Baldwin /*
2690233ce578SJohn Baldwin * Ensure that invalid cipher suites are rejected for receive.
2691233ce578SJohn Baldwin */
2692233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST);
2693233ce578SJohn Baldwin
269483a54b58SJohn Baldwin static void
test_ktls_unsupported_receive_cipher_suite(const atf_tc_t * tc,struct tls_enable * en)26952400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc,
26962400a7b1SJohn Baldwin struct tls_enable *en)
269783a54b58SJohn Baldwin {
269883a54b58SJohn Baldwin int sockets[2];
269983a54b58SJohn Baldwin
27002400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets");
270183a54b58SJohn Baldwin
2702883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EPROTONOSUPPORT, setsockopt(sockets[1], IPPROTO_TCP,
2703883d1742SJohn Baldwin TCP_RXTLS_ENABLE, en, sizeof(*en)) == -1);
270483a54b58SJohn Baldwin
27052c105205SJohn Baldwin close_sockets(sockets);
270683a54b58SJohn Baldwin }
270783a54b58SJohn Baldwin
270883a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \
270983a54b58SJohn Baldwin auth_alg, minor) \
271083a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name); \
271183a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \
271283a54b58SJohn Baldwin { \
271383a54b58SJohn Baldwin struct tls_enable en; \
271483a54b58SJohn Baldwin uint64_t seqno; \
271583a54b58SJohn Baldwin \
271683a54b58SJohn Baldwin ATF_REQUIRE_KTLS(); \
271783a54b58SJohn Baldwin seqno = random(); \
271870bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \
271970bb2286SJohn Baldwin seqno, &en); \
27202400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(tc, &en); \
272183a54b58SJohn Baldwin free_tls_enable(&en); \
272283a54b58SJohn Baldwin }
272383a54b58SJohn Baldwin
272483a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \
272583a54b58SJohn Baldwin auth_alg, minor) \
272683a54b58SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name);
272783a54b58SJohn Baldwin
272883a54b58SJohn Baldwin /*
272983a54b58SJohn Baldwin * Ensure that valid cipher suites not supported for receive are
273083a54b58SJohn Baldwin * rejected.
273183a54b58SJohn Baldwin */
273264811651SJohn Baldwin TLS_10_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST);
273383a54b58SJohn Baldwin
2734ee5686c6SMark Johnston /*
2735ee5686c6SMark Johnston * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise
2736ee5686c6SMark Johnston * KTLS error handling in the socket layer.
2737ee5686c6SMark Johnston */
2738ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst);
ATF_TC_BODY(ktls_sendto_baddst,tc)2739ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc)
2740ee5686c6SMark Johnston {
2741ee5686c6SMark Johnston char buf[32];
2742ee5686c6SMark Johnston struct sockaddr_in dst;
2743ee5686c6SMark Johnston struct tls_enable en;
2744ee5686c6SMark Johnston ssize_t n;
2745ee5686c6SMark Johnston int s;
2746ee5686c6SMark Johnston
2747ee5686c6SMark Johnston ATF_REQUIRE_KTLS();
2748ee5686c6SMark Johnston
2749ee5686c6SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2750ee5686c6SMark Johnston ATF_REQUIRE(s >= 0);
2751ee5686c6SMark Johnston
275270bb2286SJohn Baldwin build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
2753ee5686c6SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
2754ee5686c6SMark Johnston
2755ee5686c6SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en,
2756ee5686c6SMark Johnston sizeof(en)) == 0);
2757ee5686c6SMark Johnston
2758ee5686c6SMark Johnston memset(&dst, 0, sizeof(dst));
2759ee5686c6SMark Johnston dst.sin_family = AF_INET;
2760ee5686c6SMark Johnston dst.sin_len = sizeof(dst);
2761ee5686c6SMark Johnston dst.sin_addr.s_addr = htonl(INADDR_BROADCAST);
2762ee5686c6SMark Johnston dst.sin_port = htons(12345);
2763ee5686c6SMark Johnston
2764ee5686c6SMark Johnston memset(buf, 0, sizeof(buf));
2765ee5686c6SMark Johnston n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst,
2766ee5686c6SMark Johnston sizeof(dst));
2767ee5686c6SMark Johnston
2768ee5686c6SMark Johnston /* Can't transmit to the broadcast address over TCP. */
2769ee5686c6SMark Johnston ATF_REQUIRE_ERRNO(EACCES, n == -1);
2770ee5686c6SMark Johnston ATF_REQUIRE(close(s) == 0);
2771ee5686c6SMark Johnston }
2772ee5686c6SMark Johnston
2773b4b33821SMark Johnston /*
2774b4b33821SMark Johnston * Make sure that listen(2) returns an error for KTLS-enabled sockets, and
2775b4b33821SMark Johnston * verify that an attempt to enable KTLS on a listening socket fails.
2776b4b33821SMark Johnston */
2777b4b33821SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_listening_socket);
ATF_TC_BODY(ktls_listening_socket,tc)2778b4b33821SMark Johnston ATF_TC_BODY(ktls_listening_socket, tc)
2779b4b33821SMark Johnston {
2780b4b33821SMark Johnston struct tls_enable en;
2781b4b33821SMark Johnston struct sockaddr_in sin;
2782b4b33821SMark Johnston int s;
2783b4b33821SMark Johnston
2784b4b33821SMark Johnston ATF_REQUIRE_KTLS();
2785b4b33821SMark Johnston
2786b4b33821SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2787b4b33821SMark Johnston ATF_REQUIRE(s >= 0);
2788b4b33821SMark Johnston build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
2789b4b33821SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
2790b4b33821SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en,
2791b4b33821SMark Johnston sizeof(en)) == 0);
2792b4b33821SMark Johnston ATF_REQUIRE_ERRNO(EINVAL, listen(s, 1) == -1);
2793b4b33821SMark Johnston ATF_REQUIRE(close(s) == 0);
2794b4b33821SMark Johnston
2795b4b33821SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2796b4b33821SMark Johnston ATF_REQUIRE(s >= 0);
2797b4b33821SMark Johnston build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
2798b4b33821SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
2799b4b33821SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_RXTLS_ENABLE, &en,
2800b4b33821SMark Johnston sizeof(en)) == 0);
2801b4b33821SMark Johnston ATF_REQUIRE_ERRNO(EINVAL, listen(s, 1) == -1);
2802b4b33821SMark Johnston ATF_REQUIRE(close(s) == 0);
2803b4b33821SMark Johnston
2804b4b33821SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2805b4b33821SMark Johnston ATF_REQUIRE(s >= 0);
2806b4b33821SMark Johnston memset(&sin, 0, sizeof(sin));
28075ea1e35dSMark Johnston sin.sin_family = AF_INET;
28085ea1e35dSMark Johnston sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
2809b4b33821SMark Johnston ATF_REQUIRE(bind(s, (struct sockaddr *)&sin, sizeof(sin)) == 0);
2810b4b33821SMark Johnston ATF_REQUIRE(listen(s, 1) == 0);
2811b4b33821SMark Johnston build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0,
2812b4b33821SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en);
2813b4b33821SMark Johnston ATF_REQUIRE_ERRNO(ENOTCONN,
2814b4b33821SMark Johnston setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, sizeof(en)) != 0);
2815*163cdf6aSMark Johnston ATF_REQUIRE_ERRNO(ENOTCONN,
2816b4b33821SMark Johnston setsockopt(s, IPPROTO_TCP, TCP_RXTLS_ENABLE, &en, sizeof(en)) != 0);
2817b4b33821SMark Johnston ATF_REQUIRE(close(s) == 0);
2818b4b33821SMark Johnston }
2819b4b33821SMark Johnston
ATF_TP_ADD_TCS(tp)2820a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp)
2821a10482eaSJohn Baldwin {
28223e7f8a8dSJohn Baldwin /* Transmit tests */
2823a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS);
2824a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS);
2825a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS);
282644265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS);
28275de79eedSMark Johnston AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
28285de79eedSMark Johnston AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
28295de79eedSMark Johnston CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST);
2830d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST);
2831a10482eaSJohn Baldwin
28323e7f8a8dSJohn Baldwin /* Receive tests */
283364811651SJohn Baldwin TLS_10_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST);
283464811651SJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_TESTS);
283505a1d0f5SJohn Baldwin AES_GCM_TESTS(ADD_RECEIVE_TESTS);
283605a1d0f5SJohn Baldwin CHACHA20_TESTS(ADD_RECEIVE_TESTS);
283765bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_MTE_TESTS);
283865bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS);
283965bd3adbSJohn Baldwin AES_GCM_12_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS);
284065bd3adbSJohn Baldwin TLS_13_TESTS(ADD_RECEIVE_TLS13_TESTS);
2841233ce578SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST);
2842233ce578SJohn Baldwin
2843ee5686c6SMark Johnston /* Miscellaneous */
2844ee5686c6SMark Johnston ATF_TP_ADD_TC(tp, ktls_sendto_baddst);
2845b4b33821SMark Johnston ATF_TP_ADD_TC(tp, ktls_listening_socket);
2846ee5686c6SMark Johnston
2847a10482eaSJohn Baldwin return (atf_no_error());
2848a10482eaSJohn Baldwin }
2849