1a10482eaSJohn Baldwin /*- 2a10482eaSJohn Baldwin * SPDX-License-Identifier: BSD-2-Clause 3a10482eaSJohn Baldwin * 4a10482eaSJohn Baldwin * Copyright (c) 2021 Netflix Inc. 5a10482eaSJohn Baldwin * Written by: John Baldwin <jhb@FreeBSD.org> 6a10482eaSJohn Baldwin * 7a10482eaSJohn Baldwin * Redistribution and use in source and binary forms, with or without 8a10482eaSJohn Baldwin * modification, are permitted provided that the following conditions 9a10482eaSJohn Baldwin * are met: 10a10482eaSJohn Baldwin * 1. Redistributions of source code must retain the above copyright 11a10482eaSJohn Baldwin * notice, this list of conditions and the following disclaimer. 12a10482eaSJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 13a10482eaSJohn Baldwin * notice, this list of conditions and the following disclaimer in the 14a10482eaSJohn Baldwin * documentation and/or other materials provided with the distribution. 15a10482eaSJohn Baldwin * 16a10482eaSJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17a10482eaSJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18a10482eaSJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19a10482eaSJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20a10482eaSJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21a10482eaSJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22a10482eaSJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23a10482eaSJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24a10482eaSJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25a10482eaSJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26a10482eaSJohn Baldwin * SUCH DAMAGE. 27a10482eaSJohn Baldwin */ 28a10482eaSJohn Baldwin 2965bd3adbSJohn Baldwin #include <sys/param.h> 30a10482eaSJohn Baldwin #include <sys/endian.h> 31a10482eaSJohn Baldwin #include <sys/event.h> 32a10482eaSJohn Baldwin #include <sys/ktls.h> 33a10482eaSJohn Baldwin #include <sys/socket.h> 34a10482eaSJohn Baldwin #include <sys/sysctl.h> 35a10482eaSJohn Baldwin #include <netinet/in.h> 36a10482eaSJohn Baldwin #include <netinet/tcp.h> 37a10482eaSJohn Baldwin #include <crypto/cryptodev.h> 38a10482eaSJohn Baldwin #include <assert.h> 39a10482eaSJohn Baldwin #include <err.h> 40a10482eaSJohn Baldwin #include <fcntl.h> 4170bb2286SJohn Baldwin #include <libutil.h> 422400a7b1SJohn Baldwin #include <netdb.h> 43a10482eaSJohn Baldwin #include <poll.h> 44a10482eaSJohn Baldwin #include <stdbool.h> 45a10482eaSJohn Baldwin #include <stdlib.h> 46a10482eaSJohn Baldwin #include <atf-c.h> 47a10482eaSJohn Baldwin 48a10482eaSJohn Baldwin #include <openssl/err.h> 49a10482eaSJohn Baldwin #include <openssl/evp.h> 50a10482eaSJohn Baldwin #include <openssl/hmac.h> 51a10482eaSJohn Baldwin 52a10482eaSJohn Baldwin static void 53a10482eaSJohn Baldwin require_ktls(void) 54a10482eaSJohn Baldwin { 55a10482eaSJohn Baldwin size_t len; 56a10482eaSJohn Baldwin bool enable; 57a10482eaSJohn Baldwin 58a10482eaSJohn Baldwin len = sizeof(enable); 59a10482eaSJohn Baldwin if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) { 60a10482eaSJohn Baldwin if (errno == ENOENT) 61a10482eaSJohn Baldwin atf_tc_skip("kernel does not support TLS offload"); 62a10482eaSJohn Baldwin atf_libc_error(errno, "Failed to read kern.ipc.tls.enable"); 63a10482eaSJohn Baldwin } 64a10482eaSJohn Baldwin 65a10482eaSJohn Baldwin if (!enable) 66a10482eaSJohn Baldwin atf_tc_skip("Kernel TLS is disabled"); 67a10482eaSJohn Baldwin } 68a10482eaSJohn Baldwin 69a10482eaSJohn Baldwin #define ATF_REQUIRE_KTLS() require_ktls() 70a10482eaSJohn Baldwin 71ea4ebdcbSJohn Baldwin static void 72ea4ebdcbSJohn Baldwin check_tls_mode(const atf_tc_t *tc, int s, int sockopt) 73ea4ebdcbSJohn Baldwin { 74ea4ebdcbSJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_ifnet", false)) { 75ea4ebdcbSJohn Baldwin socklen_t len; 76ea4ebdcbSJohn Baldwin int mode; 77ea4ebdcbSJohn Baldwin 78ea4ebdcbSJohn Baldwin len = sizeof(mode); 79ea4ebdcbSJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1) 80ea4ebdcbSJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode"); 81ea4ebdcbSJohn Baldwin 82ea4ebdcbSJohn Baldwin if (mode != TCP_TLS_MODE_IFNET) 83ea4ebdcbSJohn Baldwin atf_tc_skip("connection did not use ifnet TLS"); 84ea4ebdcbSJohn Baldwin } 85cc13c983SJohn Baldwin 86cc13c983SJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_toe", false)) { 87cc13c983SJohn Baldwin socklen_t len; 88cc13c983SJohn Baldwin int mode; 89cc13c983SJohn Baldwin 90cc13c983SJohn Baldwin len = sizeof(mode); 91cc13c983SJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1) 92cc13c983SJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode"); 93cc13c983SJohn Baldwin 94cc13c983SJohn Baldwin if (mode != TCP_TLS_MODE_TOE) 95cc13c983SJohn Baldwin atf_tc_skip("connection did not use TOE TLS"); 96cc13c983SJohn Baldwin } 97ea4ebdcbSJohn Baldwin } 98ea4ebdcbSJohn Baldwin 9970bb2286SJohn Baldwin static void __printflike(2, 3) 10070bb2286SJohn Baldwin debug(const atf_tc_t *tc, const char *fmt, ...) 10170bb2286SJohn Baldwin { 10270bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false)) 10370bb2286SJohn Baldwin return; 10470bb2286SJohn Baldwin 10570bb2286SJohn Baldwin va_list ap; 10670bb2286SJohn Baldwin va_start(ap, fmt); 10770bb2286SJohn Baldwin vprintf(fmt, ap); 10870bb2286SJohn Baldwin va_end(ap); 10970bb2286SJohn Baldwin } 11070bb2286SJohn Baldwin 11170bb2286SJohn Baldwin static void 11270bb2286SJohn Baldwin debug_hexdump(const atf_tc_t *tc, const void *buf, int length, 11370bb2286SJohn Baldwin const char *label) 11470bb2286SJohn Baldwin { 11570bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false)) 11670bb2286SJohn Baldwin return; 11770bb2286SJohn Baldwin 11870bb2286SJohn Baldwin if (label != NULL) 11970bb2286SJohn Baldwin printf("%s:\n", label); 12070bb2286SJohn Baldwin hexdump(buf, length, NULL, 0); 12170bb2286SJohn Baldwin } 12270bb2286SJohn Baldwin 123a10482eaSJohn Baldwin static char 124a10482eaSJohn Baldwin rdigit(void) 125a10482eaSJohn Baldwin { 126a10482eaSJohn Baldwin /* ASCII printable values between 0x20 and 0x7e */ 127a10482eaSJohn Baldwin return (0x20 + random() % (0x7f - 0x20)); 128a10482eaSJohn Baldwin } 129a10482eaSJohn Baldwin 130a10482eaSJohn Baldwin static char * 131a10482eaSJohn Baldwin alloc_buffer(size_t len) 132a10482eaSJohn Baldwin { 133a10482eaSJohn Baldwin char *buf; 134a10482eaSJohn Baldwin size_t i; 135a10482eaSJohn Baldwin 136a10482eaSJohn Baldwin if (len == 0) 137a10482eaSJohn Baldwin return (NULL); 138a10482eaSJohn Baldwin buf = malloc(len); 139a10482eaSJohn Baldwin for (i = 0; i < len; i++) 140a10482eaSJohn Baldwin buf[i] = rdigit(); 141a10482eaSJohn Baldwin return (buf); 142a10482eaSJohn Baldwin } 143a10482eaSJohn Baldwin 144a10482eaSJohn Baldwin static bool 1452c105205SJohn Baldwin socketpair_tcp(int sv[2]) 146a10482eaSJohn Baldwin { 147a10482eaSJohn Baldwin struct pollfd pfd; 148a10482eaSJohn Baldwin struct sockaddr_in sin; 149a10482eaSJohn Baldwin socklen_t len; 150a10482eaSJohn Baldwin int as, cs, ls; 151a10482eaSJohn Baldwin 152a10482eaSJohn Baldwin ls = socket(PF_INET, SOCK_STREAM, 0); 153a10482eaSJohn Baldwin if (ls == -1) { 154a10482eaSJohn Baldwin warn("socket() for listen"); 155a10482eaSJohn Baldwin return (false); 156a10482eaSJohn Baldwin } 157a10482eaSJohn Baldwin 158a10482eaSJohn Baldwin memset(&sin, 0, sizeof(sin)); 159a10482eaSJohn Baldwin sin.sin_len = sizeof(sin); 160a10482eaSJohn Baldwin sin.sin_family = AF_INET; 161a10482eaSJohn Baldwin sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 162a10482eaSJohn Baldwin if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 163a10482eaSJohn Baldwin warn("bind"); 164a10482eaSJohn Baldwin close(ls); 165a10482eaSJohn Baldwin return (false); 166a10482eaSJohn Baldwin } 167a10482eaSJohn Baldwin 168a10482eaSJohn Baldwin if (listen(ls, 1) == -1) { 169a10482eaSJohn Baldwin warn("listen"); 170a10482eaSJohn Baldwin close(ls); 171a10482eaSJohn Baldwin return (false); 172a10482eaSJohn Baldwin } 173a10482eaSJohn Baldwin 174a10482eaSJohn Baldwin len = sizeof(sin); 175a10482eaSJohn Baldwin if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) { 176a10482eaSJohn Baldwin warn("getsockname"); 177a10482eaSJohn Baldwin close(ls); 178a10482eaSJohn Baldwin return (false); 179a10482eaSJohn Baldwin } 180a10482eaSJohn Baldwin 181a10482eaSJohn Baldwin cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); 182a10482eaSJohn Baldwin if (cs == -1) { 183a10482eaSJohn Baldwin warn("socket() for connect"); 184a10482eaSJohn Baldwin close(ls); 185a10482eaSJohn Baldwin return (false); 186a10482eaSJohn Baldwin } 187a10482eaSJohn Baldwin 188a10482eaSJohn Baldwin if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 189a10482eaSJohn Baldwin if (errno != EINPROGRESS) { 190a10482eaSJohn Baldwin warn("connect"); 191a10482eaSJohn Baldwin close(ls); 192a10482eaSJohn Baldwin close(cs); 193a10482eaSJohn Baldwin return (false); 194a10482eaSJohn Baldwin } 195a10482eaSJohn Baldwin } 196a10482eaSJohn Baldwin 197a10482eaSJohn Baldwin as = accept4(ls, NULL, NULL, SOCK_NONBLOCK); 198a10482eaSJohn Baldwin if (as == -1) { 199a10482eaSJohn Baldwin warn("accept4"); 200a10482eaSJohn Baldwin close(ls); 201a10482eaSJohn Baldwin close(cs); 202a10482eaSJohn Baldwin return (false); 203a10482eaSJohn Baldwin } 204a10482eaSJohn Baldwin 205a10482eaSJohn Baldwin close(ls); 206a10482eaSJohn Baldwin 207a10482eaSJohn Baldwin pfd.fd = cs; 208a10482eaSJohn Baldwin pfd.events = POLLOUT; 209a10482eaSJohn Baldwin pfd.revents = 0; 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 2192400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2]) 2202400a7b1SJohn Baldwin { 2212400a7b1SJohn Baldwin const char *cause, *host, *port; 2222400a7b1SJohn Baldwin struct addrinfo hints, *ai, *tofree; 2232400a7b1SJohn Baldwin int error, flags, s; 2242400a7b1SJohn Baldwin 2252400a7b1SJohn Baldwin host = atf_tc_get_config_var(tc, "ktls.host"); 2262400a7b1SJohn Baldwin port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo"); 2272400a7b1SJohn Baldwin memset(&hints, 0, sizeof(hints)); 2282400a7b1SJohn Baldwin hints.ai_family = AF_UNSPEC; 2292400a7b1SJohn Baldwin hints.ai_socktype = SOCK_STREAM; 2302400a7b1SJohn Baldwin hints.ai_protocol = IPPROTO_TCP; 2312400a7b1SJohn Baldwin error = getaddrinfo(host, port, &hints, &tofree); 2322400a7b1SJohn Baldwin if (error != 0) { 2332400a7b1SJohn Baldwin warnx("getaddrinfo(%s:%s) failed: %s", host, port, 2342400a7b1SJohn Baldwin gai_strerror(error)); 2352400a7b1SJohn Baldwin return (false); 2362400a7b1SJohn Baldwin } 2372400a7b1SJohn Baldwin 2382400a7b1SJohn Baldwin cause = NULL; 2392400a7b1SJohn Baldwin for (ai = tofree; ai != NULL; ai = ai->ai_next) { 2402400a7b1SJohn Baldwin s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); 2412400a7b1SJohn Baldwin if (s == -1) { 2422400a7b1SJohn Baldwin cause = "socket"; 2432400a7b1SJohn Baldwin error = errno; 2442400a7b1SJohn Baldwin continue; 2452400a7b1SJohn Baldwin } 2462400a7b1SJohn Baldwin 2472400a7b1SJohn Baldwin if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) { 2482400a7b1SJohn Baldwin cause = "connect"; 2492400a7b1SJohn Baldwin error = errno; 2502400a7b1SJohn Baldwin close(s); 2512400a7b1SJohn Baldwin continue; 2522400a7b1SJohn Baldwin } 2532400a7b1SJohn Baldwin 2542400a7b1SJohn Baldwin freeaddrinfo(tofree); 2552400a7b1SJohn Baldwin 2562400a7b1SJohn Baldwin ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1); 2572400a7b1SJohn Baldwin flags |= O_NONBLOCK; 2582400a7b1SJohn Baldwin ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1); 2592400a7b1SJohn Baldwin 2602400a7b1SJohn Baldwin sv[0] = s; 2612400a7b1SJohn Baldwin sv[1] = s; 2622400a7b1SJohn Baldwin return (true); 2632400a7b1SJohn Baldwin } 2642400a7b1SJohn Baldwin 2652400a7b1SJohn Baldwin warnc(error, "%s", cause); 2662400a7b1SJohn Baldwin freeaddrinfo(tofree); 2672400a7b1SJohn Baldwin return (false); 2682400a7b1SJohn Baldwin } 2692400a7b1SJohn Baldwin 2702400a7b1SJohn Baldwin static bool 2712400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2]) 2722400a7b1SJohn Baldwin { 2732400a7b1SJohn Baldwin if (atf_tc_has_config_var(tc, "ktls.host")) 2742400a7b1SJohn Baldwin return (echo_socket(tc, sv)); 2752400a7b1SJohn Baldwin else 2762400a7b1SJohn Baldwin return (socketpair_tcp(sv)); 2772400a7b1SJohn Baldwin } 2782400a7b1SJohn Baldwin 279a10482eaSJohn Baldwin static void 2802c105205SJohn Baldwin close_sockets(int sv[2]) 2812c105205SJohn Baldwin { 2822400a7b1SJohn Baldwin if (sv[0] != sv[1]) 2832c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0); 2842c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0); 2852c105205SJohn Baldwin } 2862c105205SJohn Baldwin 2872c105205SJohn Baldwin static void 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 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 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 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 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 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 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 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 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 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 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 * 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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); 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); 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 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