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> 41*70bb2286SJohn 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 99*70bb2286SJohn Baldwin static void __printflike(2, 3) 100*70bb2286SJohn Baldwin debug(const atf_tc_t *tc, const char *fmt, ...) 101*70bb2286SJohn Baldwin { 102*70bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false)) 103*70bb2286SJohn Baldwin return; 104*70bb2286SJohn Baldwin 105*70bb2286SJohn Baldwin va_list ap; 106*70bb2286SJohn Baldwin va_start(ap, fmt); 107*70bb2286SJohn Baldwin vprintf(fmt, ap); 108*70bb2286SJohn Baldwin va_end(ap); 109*70bb2286SJohn Baldwin } 110*70bb2286SJohn Baldwin 111*70bb2286SJohn Baldwin static void 112*70bb2286SJohn Baldwin debug_hexdump(const atf_tc_t *tc, const void *buf, int length, 113*70bb2286SJohn Baldwin const char *label) 114*70bb2286SJohn Baldwin { 115*70bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false)) 116*70bb2286SJohn Baldwin return; 117*70bb2286SJohn Baldwin 118*70bb2286SJohn Baldwin if (label != NULL) 119*70bb2286SJohn Baldwin printf("%s:\n", label); 120*70bb2286SJohn Baldwin hexdump(buf, length, NULL, 0); 121*70bb2286SJohn Baldwin } 122*70bb2286SJohn 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; 210a10482eaSJohn Baldwin ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1); 211a10482eaSJohn Baldwin ATF_REQUIRE(pfd.revents == POLLOUT); 212a10482eaSJohn Baldwin 213a10482eaSJohn Baldwin sv[0] = cs; 214a10482eaSJohn Baldwin sv[1] = as; 215a10482eaSJohn Baldwin return (true); 216a10482eaSJohn Baldwin } 217a10482eaSJohn Baldwin 2182400a7b1SJohn Baldwin static bool 2192400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2]) 2202400a7b1SJohn Baldwin { 2212400a7b1SJohn Baldwin const char *cause, *host, *port; 2222400a7b1SJohn Baldwin struct addrinfo hints, *ai, *tofree; 2232400a7b1SJohn Baldwin int error, flags, s; 2242400a7b1SJohn Baldwin 2252400a7b1SJohn Baldwin host = atf_tc_get_config_var(tc, "ktls.host"); 2262400a7b1SJohn Baldwin port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo"); 2272400a7b1SJohn Baldwin memset(&hints, 0, sizeof(hints)); 2282400a7b1SJohn Baldwin hints.ai_family = AF_UNSPEC; 2292400a7b1SJohn Baldwin hints.ai_socktype = SOCK_STREAM; 2302400a7b1SJohn Baldwin hints.ai_protocol = IPPROTO_TCP; 2312400a7b1SJohn Baldwin error = getaddrinfo(host, port, &hints, &tofree); 2322400a7b1SJohn Baldwin if (error != 0) { 2332400a7b1SJohn Baldwin warnx("getaddrinfo(%s:%s) failed: %s", host, port, 2342400a7b1SJohn Baldwin gai_strerror(error)); 2352400a7b1SJohn Baldwin return (false); 2362400a7b1SJohn Baldwin } 2372400a7b1SJohn Baldwin 2382400a7b1SJohn Baldwin cause = NULL; 2392400a7b1SJohn Baldwin for (ai = tofree; ai != NULL; ai = ai->ai_next) { 2402400a7b1SJohn Baldwin s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); 2412400a7b1SJohn Baldwin if (s == -1) { 2422400a7b1SJohn Baldwin cause = "socket"; 2432400a7b1SJohn Baldwin error = errno; 2442400a7b1SJohn Baldwin continue; 2452400a7b1SJohn Baldwin } 2462400a7b1SJohn Baldwin 2472400a7b1SJohn Baldwin if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) { 2482400a7b1SJohn Baldwin cause = "connect"; 2492400a7b1SJohn Baldwin error = errno; 2502400a7b1SJohn Baldwin close(s); 2512400a7b1SJohn Baldwin continue; 2522400a7b1SJohn Baldwin } 2532400a7b1SJohn Baldwin 2542400a7b1SJohn Baldwin freeaddrinfo(tofree); 2552400a7b1SJohn Baldwin 2562400a7b1SJohn Baldwin ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1); 2572400a7b1SJohn Baldwin flags |= O_NONBLOCK; 2582400a7b1SJohn Baldwin ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1); 2592400a7b1SJohn Baldwin 2602400a7b1SJohn Baldwin sv[0] = s; 2612400a7b1SJohn Baldwin sv[1] = s; 2622400a7b1SJohn Baldwin return (true); 2632400a7b1SJohn Baldwin } 2642400a7b1SJohn Baldwin 2652400a7b1SJohn Baldwin warnc(error, "%s", cause); 2662400a7b1SJohn Baldwin freeaddrinfo(tofree); 2672400a7b1SJohn Baldwin return (false); 2682400a7b1SJohn Baldwin } 2692400a7b1SJohn Baldwin 2702400a7b1SJohn Baldwin static bool 2712400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2]) 2722400a7b1SJohn Baldwin { 2732400a7b1SJohn Baldwin if (atf_tc_has_config_var(tc, "ktls.host")) 2742400a7b1SJohn Baldwin return (echo_socket(tc, sv)); 2752400a7b1SJohn Baldwin else 2762400a7b1SJohn Baldwin return (socketpair_tcp(sv)); 2772400a7b1SJohn Baldwin } 2782400a7b1SJohn Baldwin 279a10482eaSJohn Baldwin static void 2802c105205SJohn Baldwin close_sockets(int sv[2]) 2812c105205SJohn Baldwin { 2822400a7b1SJohn Baldwin if (sv[0] != sv[1]) 2832c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0); 2842c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0); 2852c105205SJohn Baldwin } 2862c105205SJohn Baldwin 2872c105205SJohn Baldwin static void 288a10482eaSJohn Baldwin fd_set_blocking(int fd) 289a10482eaSJohn Baldwin { 290a10482eaSJohn Baldwin int flags; 291a10482eaSJohn Baldwin 292a10482eaSJohn Baldwin ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1); 293a10482eaSJohn Baldwin flags &= ~O_NONBLOCK; 294a10482eaSJohn Baldwin ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1); 295a10482eaSJohn Baldwin } 296a10482eaSJohn Baldwin 297a10482eaSJohn Baldwin static bool 29864811651SJohn Baldwin cbc_crypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 29964811651SJohn Baldwin const char *input, char *output, size_t size, int enc) 300a10482eaSJohn Baldwin { 301a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 302a10482eaSJohn Baldwin int outl, total; 303a10482eaSJohn Baldwin 304a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 305a10482eaSJohn Baldwin if (ctx == NULL) { 306a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 307a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 308a10482eaSJohn Baldwin return (false); 309a10482eaSJohn Baldwin } 310a10482eaSJohn Baldwin if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key, 31164811651SJohn Baldwin (const u_char *)iv, enc) != 1) { 312a10482eaSJohn Baldwin warnx("EVP_CipherInit_ex failed: %s", 313a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 314a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 315a10482eaSJohn Baldwin return (false); 316a10482eaSJohn Baldwin } 317a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 318a10482eaSJohn Baldwin if (EVP_CipherUpdate(ctx, (u_char *)output, &outl, 319a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 320a10482eaSJohn Baldwin warnx("EVP_CipherUpdate failed: %s", 321a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 322a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 323a10482eaSJohn Baldwin return (false); 324a10482eaSJohn Baldwin } 325a10482eaSJohn Baldwin total = outl; 326a10482eaSJohn Baldwin if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 327a10482eaSJohn Baldwin warnx("EVP_CipherFinal_ex failed: %s", 328a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 329a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 330a10482eaSJohn Baldwin return (false); 331a10482eaSJohn Baldwin } 332a10482eaSJohn Baldwin total += outl; 333a10482eaSJohn Baldwin if ((size_t)total != size) { 334a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 335a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 336a10482eaSJohn Baldwin return (false); 337a10482eaSJohn Baldwin } 338a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 339a10482eaSJohn Baldwin return (true); 340a10482eaSJohn Baldwin } 341a10482eaSJohn Baldwin 342a10482eaSJohn Baldwin static bool 34364811651SJohn Baldwin cbc_encrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 34464811651SJohn Baldwin const char *input, char *output, size_t size) 34564811651SJohn Baldwin { 34664811651SJohn Baldwin return (cbc_crypt(cipher, key, iv, input, output, size, 1)); 34764811651SJohn Baldwin } 34864811651SJohn Baldwin 34964811651SJohn Baldwin static bool 35064811651SJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 35164811651SJohn Baldwin const char *input, char *output, size_t size) 35264811651SJohn Baldwin { 35364811651SJohn Baldwin return (cbc_crypt(cipher, key, iv, input, output, size, 0)); 35464811651SJohn Baldwin } 35564811651SJohn Baldwin 35664811651SJohn Baldwin static bool 35764811651SJohn Baldwin compute_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 35864811651SJohn Baldwin size_t aad_len, const void *buffer, size_t len, void *digest, 35964811651SJohn Baldwin u_int *digest_len) 360a10482eaSJohn Baldwin { 361a10482eaSJohn Baldwin HMAC_CTX *ctx; 362a10482eaSJohn Baldwin 363a10482eaSJohn Baldwin ctx = HMAC_CTX_new(); 364a10482eaSJohn Baldwin if (ctx == NULL) { 365a10482eaSJohn Baldwin warnx("HMAC_CTX_new failed: %s", 366a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 367a10482eaSJohn Baldwin return (false); 368a10482eaSJohn Baldwin } 369a10482eaSJohn Baldwin if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) { 370a10482eaSJohn Baldwin warnx("HMAC_Init_ex failed: %s", 371a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 372a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 373a10482eaSJohn Baldwin return (false); 374a10482eaSJohn Baldwin } 375a10482eaSJohn Baldwin if (HMAC_Update(ctx, aad, aad_len) != 1) { 376a10482eaSJohn Baldwin warnx("HMAC_Update (aad) failed: %s", 377a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 378a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 379a10482eaSJohn Baldwin return (false); 380a10482eaSJohn Baldwin } 381a10482eaSJohn Baldwin if (HMAC_Update(ctx, buffer, len) != 1) { 382a10482eaSJohn Baldwin warnx("HMAC_Update (payload) failed: %s", 383a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 384a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 385a10482eaSJohn Baldwin return (false); 386a10482eaSJohn Baldwin } 38764811651SJohn Baldwin if (HMAC_Final(ctx, digest, digest_len) != 1) { 388a10482eaSJohn Baldwin warnx("HMAC_Final failed: %s", 389a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 390a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 391a10482eaSJohn Baldwin return (false); 392a10482eaSJohn Baldwin } 393a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 39464811651SJohn Baldwin return (true); 39564811651SJohn Baldwin } 39664811651SJohn Baldwin 39764811651SJohn Baldwin static bool 39864811651SJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 39964811651SJohn Baldwin size_t aad_len, const void *buffer, size_t len, const void *digest) 40064811651SJohn Baldwin { 40164811651SJohn Baldwin unsigned char digest2[EVP_MAX_MD_SIZE]; 40264811651SJohn Baldwin u_int digest_len; 40364811651SJohn Baldwin 40464811651SJohn Baldwin if (!compute_hash(md, key, key_len, aad, aad_len, buffer, len, digest2, 40564811651SJohn Baldwin &digest_len)) 40664811651SJohn Baldwin return (false); 407a10482eaSJohn Baldwin if (memcmp(digest, digest2, digest_len) != 0) { 408a10482eaSJohn Baldwin warnx("HMAC mismatch"); 409a10482eaSJohn Baldwin return (false); 410a10482eaSJohn Baldwin } 411a10482eaSJohn Baldwin return (true); 412a10482eaSJohn Baldwin } 413a10482eaSJohn Baldwin 414a10482eaSJohn Baldwin static bool 4153e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 4163e7f8a8dSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 4173e7f8a8dSJohn Baldwin size_t size, char *tag, size_t tag_len) 4183e7f8a8dSJohn Baldwin { 4193e7f8a8dSJohn Baldwin EVP_CIPHER_CTX *ctx; 4203e7f8a8dSJohn Baldwin int outl, total; 4213e7f8a8dSJohn Baldwin 4223e7f8a8dSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 4233e7f8a8dSJohn Baldwin if (ctx == NULL) { 4243e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 4253e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4263e7f8a8dSJohn Baldwin return (false); 4273e7f8a8dSJohn Baldwin } 4283e7f8a8dSJohn Baldwin if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 4293e7f8a8dSJohn Baldwin (const u_char *)nonce) != 1) { 4303e7f8a8dSJohn Baldwin warnx("EVP_EncryptInit_ex failed: %s", 4313e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4323e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4333e7f8a8dSJohn Baldwin return (false); 4343e7f8a8dSJohn Baldwin } 4353e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 4363e7f8a8dSJohn Baldwin if (aad != NULL) { 4373e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 4383e7f8a8dSJohn Baldwin aad_len) != 1) { 4393e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate for AAD failed: %s", 4403e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4413e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4423e7f8a8dSJohn Baldwin return (false); 4433e7f8a8dSJohn Baldwin } 4443e7f8a8dSJohn Baldwin } 4453e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl, 4463e7f8a8dSJohn Baldwin (const u_char *)input, size) != 1) { 4473e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate failed: %s", 4483e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4493e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4503e7f8a8dSJohn Baldwin return (false); 4513e7f8a8dSJohn Baldwin } 4523e7f8a8dSJohn Baldwin total = outl; 4533e7f8a8dSJohn Baldwin if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 4543e7f8a8dSJohn Baldwin warnx("EVP_EncryptFinal_ex failed: %s", 4553e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4563e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4573e7f8a8dSJohn Baldwin return (false); 4583e7f8a8dSJohn Baldwin } 4593e7f8a8dSJohn Baldwin total += outl; 4603e7f8a8dSJohn Baldwin if ((size_t)total != size) { 4613e7f8a8dSJohn Baldwin warnx("encrypt size mismatch: %zu vs %d", size, total); 4623e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4633e7f8a8dSJohn Baldwin return (false); 4643e7f8a8dSJohn Baldwin } 4653e7f8a8dSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) != 4663e7f8a8dSJohn Baldwin 1) { 4673e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s", 4683e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4693e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4703e7f8a8dSJohn Baldwin return (false); 4713e7f8a8dSJohn Baldwin } 4723e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4733e7f8a8dSJohn Baldwin return (true); 4743e7f8a8dSJohn Baldwin } 4753e7f8a8dSJohn Baldwin 4763e7f8a8dSJohn Baldwin static bool 477a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 478a10482eaSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 479a10482eaSJohn Baldwin size_t size, const char *tag, size_t tag_len) 480a10482eaSJohn Baldwin { 481a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 482a10482eaSJohn Baldwin int outl, total; 483a10482eaSJohn Baldwin bool valid; 484a10482eaSJohn Baldwin 485a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 486a10482eaSJohn Baldwin if (ctx == NULL) { 487a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 488a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 489a10482eaSJohn Baldwin return (false); 490a10482eaSJohn Baldwin } 491a10482eaSJohn Baldwin if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 492a10482eaSJohn Baldwin (const u_char *)nonce) != 1) { 493a10482eaSJohn Baldwin warnx("EVP_DecryptInit_ex failed: %s", 494a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 495a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 496a10482eaSJohn Baldwin return (false); 497a10482eaSJohn Baldwin } 498a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 499a10482eaSJohn Baldwin if (aad != NULL) { 500a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 501a10482eaSJohn Baldwin aad_len) != 1) { 502a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate for AAD failed: %s", 503a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 504a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 505a10482eaSJohn Baldwin return (false); 506a10482eaSJohn Baldwin } 507a10482eaSJohn Baldwin } 508a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl, 509a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 510a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate failed: %s", 511a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 512a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 513a10482eaSJohn Baldwin return (false); 514a10482eaSJohn Baldwin } 515a10482eaSJohn Baldwin total = outl; 516a10482eaSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, 517a10482eaSJohn Baldwin __DECONST(char *, tag)) != 1) { 518a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s", 519a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 520a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 521a10482eaSJohn Baldwin return (false); 522a10482eaSJohn Baldwin } 523a10482eaSJohn Baldwin valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1); 524a10482eaSJohn Baldwin total += outl; 525a10482eaSJohn Baldwin if ((size_t)total != size) { 526a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 527a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 528a10482eaSJohn Baldwin return (false); 529a10482eaSJohn Baldwin } 530a10482eaSJohn Baldwin if (!valid) 531a10482eaSJohn Baldwin warnx("tag mismatch"); 532a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 533a10482eaSJohn Baldwin return (valid); 534a10482eaSJohn Baldwin } 535a10482eaSJohn Baldwin 536a10482eaSJohn Baldwin static void 537*70bb2286SJohn Baldwin build_tls_enable(const atf_tc_t *tc, int cipher_alg, size_t cipher_key_len, 538*70bb2286SJohn Baldwin int auth_alg, int minor, uint64_t seqno, struct tls_enable *en) 539a10482eaSJohn Baldwin { 540a10482eaSJohn Baldwin u_int auth_key_len, iv_len; 541a10482eaSJohn Baldwin 542a10482eaSJohn Baldwin memset(en, 0, sizeof(*en)); 543a10482eaSJohn Baldwin 544a10482eaSJohn Baldwin switch (cipher_alg) { 545a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 546a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_ZERO) 547a10482eaSJohn Baldwin iv_len = AES_BLOCK_LEN; 548a10482eaSJohn Baldwin else 549a10482eaSJohn Baldwin iv_len = 0; 550a10482eaSJohn Baldwin break; 551a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 552a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_TWO) 553a10482eaSJohn Baldwin iv_len = TLS_AEAD_GCM_LEN; 554a10482eaSJohn Baldwin else 555a10482eaSJohn Baldwin iv_len = TLS_1_3_GCM_IV_LEN; 556a10482eaSJohn Baldwin break; 557a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 558a10482eaSJohn Baldwin iv_len = TLS_CHACHA20_IV_LEN; 559a10482eaSJohn Baldwin break; 560a10482eaSJohn Baldwin default: 561a10482eaSJohn Baldwin iv_len = 0; 562a10482eaSJohn Baldwin break; 563a10482eaSJohn Baldwin } 564a10482eaSJohn Baldwin switch (auth_alg) { 565a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 566a10482eaSJohn Baldwin auth_key_len = SHA1_HASH_LEN; 567a10482eaSJohn Baldwin break; 568a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 569a10482eaSJohn Baldwin auth_key_len = SHA2_256_HASH_LEN; 570a10482eaSJohn Baldwin break; 571a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 572a10482eaSJohn Baldwin auth_key_len = SHA2_384_HASH_LEN; 573a10482eaSJohn Baldwin break; 574a10482eaSJohn Baldwin default: 575a10482eaSJohn Baldwin auth_key_len = 0; 576a10482eaSJohn Baldwin break; 577a10482eaSJohn Baldwin } 578a10482eaSJohn Baldwin en->cipher_key = alloc_buffer(cipher_key_len); 579*70bb2286SJohn Baldwin debug_hexdump(tc, en->cipher_key, cipher_key_len, "cipher key"); 580a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len); 581*70bb2286SJohn Baldwin if (iv_len != 0) 582*70bb2286SJohn Baldwin debug_hexdump(tc, en->iv, iv_len, "iv"); 583a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len); 584*70bb2286SJohn Baldwin if (auth_key_len != 0) 585*70bb2286SJohn Baldwin debug_hexdump(tc, en->auth_key, auth_key_len, "auth key"); 586a10482eaSJohn Baldwin en->cipher_algorithm = cipher_alg; 587a10482eaSJohn Baldwin en->cipher_key_len = cipher_key_len; 588a10482eaSJohn Baldwin en->iv_len = iv_len; 589a10482eaSJohn Baldwin en->auth_algorithm = auth_alg; 590a10482eaSJohn Baldwin en->auth_key_len = auth_key_len; 591a10482eaSJohn Baldwin en->tls_vmajor = TLS_MAJOR_VER_ONE; 592a10482eaSJohn Baldwin en->tls_vminor = minor; 593a10482eaSJohn Baldwin be64enc(en->rec_seq, seqno); 594*70bb2286SJohn Baldwin debug(tc, "seqno: %ju\n", (uintmax_t)seqno); 595a10482eaSJohn Baldwin } 596a10482eaSJohn Baldwin 597a10482eaSJohn Baldwin static void 598a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en) 599a10482eaSJohn Baldwin { 600a10482eaSJohn Baldwin free(__DECONST(void *, en->cipher_key)); 601a10482eaSJohn Baldwin free(__DECONST(void *, en->iv)); 602a10482eaSJohn Baldwin free(__DECONST(void *, en->auth_key)); 603a10482eaSJohn Baldwin } 604a10482eaSJohn Baldwin 605a10482eaSJohn Baldwin static const EVP_CIPHER * 606a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en) 607a10482eaSJohn Baldwin { 608a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 609a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 610a10482eaSJohn Baldwin switch (en->cipher_key_len) { 611a10482eaSJohn Baldwin case 128 / 8: 612a10482eaSJohn Baldwin return (EVP_aes_128_cbc()); 613a10482eaSJohn Baldwin case 256 / 8: 614a10482eaSJohn Baldwin return (EVP_aes_256_cbc()); 615a10482eaSJohn Baldwin default: 616a10482eaSJohn Baldwin return (NULL); 617a10482eaSJohn Baldwin } 618a10482eaSJohn Baldwin break; 619a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 620a10482eaSJohn Baldwin switch (en->cipher_key_len) { 621a10482eaSJohn Baldwin case 128 / 8: 622a10482eaSJohn Baldwin return (EVP_aes_128_gcm()); 623a10482eaSJohn Baldwin case 256 / 8: 624a10482eaSJohn Baldwin return (EVP_aes_256_gcm()); 625a10482eaSJohn Baldwin default: 626a10482eaSJohn Baldwin return (NULL); 627a10482eaSJohn Baldwin } 628a10482eaSJohn Baldwin break; 629a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 630a10482eaSJohn Baldwin return (EVP_chacha20_poly1305()); 631a10482eaSJohn Baldwin default: 632a10482eaSJohn Baldwin return (NULL); 633a10482eaSJohn Baldwin } 634a10482eaSJohn Baldwin } 635a10482eaSJohn Baldwin 636a10482eaSJohn Baldwin static const EVP_MD * 637a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en) 638a10482eaSJohn Baldwin { 639a10482eaSJohn Baldwin switch (en->auth_algorithm) { 640a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 641a10482eaSJohn Baldwin return (EVP_sha1()); 642a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 643a10482eaSJohn Baldwin return (EVP_sha256()); 644a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 645a10482eaSJohn Baldwin return (EVP_sha384()); 646a10482eaSJohn Baldwin default: 647a10482eaSJohn Baldwin return (NULL); 648a10482eaSJohn Baldwin } 649a10482eaSJohn Baldwin } 650a10482eaSJohn Baldwin 651a10482eaSJohn Baldwin static size_t 652a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en) 653a10482eaSJohn Baldwin { 654a10482eaSJohn Baldwin size_t len; 655a10482eaSJohn Baldwin 656a10482eaSJohn Baldwin len = sizeof(struct tls_record_layer); 657a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 658a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 659a10482eaSJohn Baldwin if (en->tls_vminor != TLS_MINOR_VER_ZERO) 660a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 661a10482eaSJohn Baldwin return (len); 662a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 663a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) 664a10482eaSJohn Baldwin len += sizeof(uint64_t); 665a10482eaSJohn Baldwin return (len); 666a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 667a10482eaSJohn Baldwin return (len); 668a10482eaSJohn Baldwin default: 669a10482eaSJohn Baldwin return (0); 670a10482eaSJohn Baldwin } 671a10482eaSJohn Baldwin } 672a10482eaSJohn Baldwin 673a10482eaSJohn Baldwin static size_t 674a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en) 675a10482eaSJohn Baldwin { 676a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 677a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 678a10482eaSJohn Baldwin switch (en->auth_algorithm) { 679a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 680a10482eaSJohn Baldwin return (SHA1_HASH_LEN); 681a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 682a10482eaSJohn Baldwin return (SHA2_256_HASH_LEN); 683a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 684a10482eaSJohn Baldwin return (SHA2_384_HASH_LEN); 685a10482eaSJohn Baldwin default: 686a10482eaSJohn Baldwin return (0); 687a10482eaSJohn Baldwin } 688a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 689a10482eaSJohn Baldwin return (AES_GMAC_HASH_LEN); 690a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 691a10482eaSJohn Baldwin return (POLY1305_HASH_LEN); 692a10482eaSJohn Baldwin default: 693a10482eaSJohn Baldwin return (0); 694a10482eaSJohn Baldwin } 695a10482eaSJohn Baldwin } 696a10482eaSJohn Baldwin 697a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */ 698a10482eaSJohn Baldwin static size_t 699a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en) 700a10482eaSJohn Baldwin { 701a10482eaSJohn Baldwin size_t len; 702a10482eaSJohn Baldwin 703a10482eaSJohn Baldwin len = tls_mac_len(en); 704a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 705a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 706a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 707a10482eaSJohn Baldwin len++; 708a10482eaSJohn Baldwin return (len); 709a10482eaSJohn Baldwin } 710a10482eaSJohn Baldwin 71165bd3adbSJohn Baldwin /* Minimum valid record payload size for a given cipher suite. */ 71265bd3adbSJohn Baldwin static size_t 71365bd3adbSJohn Baldwin tls_minimum_record_payload(struct tls_enable *en) 71465bd3adbSJohn Baldwin { 71565bd3adbSJohn Baldwin size_t len; 71665bd3adbSJohn Baldwin 71765bd3adbSJohn Baldwin len = tls_header_len(en); 71865bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 71965bd3adbSJohn Baldwin len += roundup2(tls_mac_len(en) + 1, AES_BLOCK_LEN); 72065bd3adbSJohn Baldwin else 72165bd3adbSJohn Baldwin len += tls_mac_len(en); 72265bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 72365bd3adbSJohn Baldwin len++; 72465bd3adbSJohn Baldwin return (len - sizeof(struct tls_record_layer)); 72565bd3adbSJohn Baldwin } 72665bd3adbSJohn Baldwin 727a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */ 728a10482eaSJohn Baldwin static void 729a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len, 730a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad) 731a10482eaSJohn Baldwin { 732a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 733a10482eaSJohn Baldwin ad->type = hdr->tls_type; 734a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 735a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 736a10482eaSJohn Baldwin ad->tls_length = htons(len); 737a10482eaSJohn Baldwin } 738a10482eaSJohn Baldwin 739a10482eaSJohn Baldwin static void 740a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len, 741a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, 742a10482eaSJohn Baldwin struct tls_aead_data *ad) 743a10482eaSJohn Baldwin { 744a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 745a10482eaSJohn Baldwin ad->type = hdr->tls_type; 746a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 747a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 748a10482eaSJohn Baldwin ad->tls_length = htons(len); 749a10482eaSJohn Baldwin } 750a10482eaSJohn Baldwin 751a10482eaSJohn Baldwin static void 752a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr, 753a10482eaSJohn Baldwin uint64_t seqno, struct tls_aead_data_13 *ad) 754a10482eaSJohn Baldwin { 755a10482eaSJohn Baldwin ad->type = hdr->tls_type; 756a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 757a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 758a10482eaSJohn Baldwin ad->tls_length = hdr->tls_length; 759a10482eaSJohn Baldwin } 760a10482eaSJohn Baldwin 761a10482eaSJohn Baldwin static void 762a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr, 763a10482eaSJohn Baldwin char *nonce) 764a10482eaSJohn Baldwin { 765a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN); 766a10482eaSJohn Baldwin memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t)); 767a10482eaSJohn Baldwin } 768a10482eaSJohn Baldwin 769a10482eaSJohn Baldwin static void 770a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce) 771a10482eaSJohn Baldwin { 772a10482eaSJohn Baldwin static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN, 773a10482eaSJohn Baldwin "TLS 1.3 nonce length mismatch"); 774a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN); 775a10482eaSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(seqno); 776a10482eaSJohn Baldwin } 777a10482eaSJohn Baldwin 778a10482eaSJohn Baldwin /* 779a10482eaSJohn Baldwin * Decrypt a TLS record 'len' bytes long at 'src' and store the result at 780a10482eaSJohn Baldwin * 'dst'. If the TLS record header length doesn't match or 'dst' doesn't 781a10482eaSJohn Baldwin * have sufficient room ('avail'), fail the test. 782a10482eaSJohn Baldwin */ 783a10482eaSJohn Baldwin static size_t 784*70bb2286SJohn Baldwin decrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en, 785*70bb2286SJohn Baldwin uint64_t seqno, const void *src, size_t len, void *dst, size_t avail, 786*70bb2286SJohn Baldwin uint8_t *record_type) 787a10482eaSJohn Baldwin { 788a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 789a10482eaSJohn Baldwin struct tls_mac_data aad; 790a10482eaSJohn Baldwin const char *iv; 791a10482eaSJohn Baldwin char *buf; 792a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 793a10482eaSJohn Baldwin int padding; 794a10482eaSJohn Baldwin 795a10482eaSJohn Baldwin hdr = src; 796a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 797a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 798a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 799a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor); 800*70bb2286SJohn Baldwin debug(tc, "decrypting MTE record seqno %ju:\n", (uintmax_t)seqno); 801*70bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL); 802a10482eaSJohn Baldwin 803a10482eaSJohn Baldwin /* First, decrypt the outer payload into a temporary buffer. */ 804a10482eaSJohn Baldwin payload_len = len - hdr_len; 805a10482eaSJohn Baldwin buf = malloc(payload_len); 806a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 807a10482eaSJohn Baldwin iv = en->iv; 808a10482eaSJohn Baldwin else 809a10482eaSJohn Baldwin iv = (void *)(hdr + 1); 810*70bb2286SJohn Baldwin debug_hexdump(tc, iv, AES_BLOCK_LEN, "iv"); 811a10482eaSJohn Baldwin ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 812a10482eaSJohn Baldwin (const u_char *)src + hdr_len, buf, payload_len)); 813*70bb2286SJohn Baldwin debug_hexdump(tc, buf, payload_len, "decrypted buffer"); 814a10482eaSJohn Baldwin 815a10482eaSJohn Baldwin /* 816a10482eaSJohn Baldwin * Copy the last encrypted block to use as the IV for the next 817a10482eaSJohn Baldwin * record for TLS 1.0. 818a10482eaSJohn Baldwin */ 819a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 820a10482eaSJohn Baldwin memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src + 821a10482eaSJohn Baldwin (len - AES_BLOCK_LEN), AES_BLOCK_LEN); 822a10482eaSJohn Baldwin 823a10482eaSJohn Baldwin /* 824a10482eaSJohn Baldwin * Verify trailing padding and strip. 825a10482eaSJohn Baldwin * 826a10482eaSJohn Baldwin * The kernel always generates the smallest amount of padding. 827a10482eaSJohn Baldwin */ 828a10482eaSJohn Baldwin padding = buf[payload_len - 1] + 1; 829a10482eaSJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN); 830a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= mac_len + padding); 831a10482eaSJohn Baldwin payload_len -= padding; 832a10482eaSJohn Baldwin 833a10482eaSJohn Baldwin /* Verify HMAC. */ 834a10482eaSJohn Baldwin payload_len -= mac_len; 835a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad); 836*70bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 837a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 838a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len)); 839a10482eaSJohn Baldwin 840a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 841a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 842a10482eaSJohn Baldwin *record_type = hdr->tls_type; 843a10482eaSJohn Baldwin return (payload_len); 844a10482eaSJohn Baldwin } 845a10482eaSJohn Baldwin 846a10482eaSJohn Baldwin static size_t 847*70bb2286SJohn Baldwin decrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 848*70bb2286SJohn Baldwin const void *src, size_t len, void *dst, uint8_t *record_type) 849a10482eaSJohn Baldwin { 850a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 851a10482eaSJohn Baldwin struct tls_aead_data aad; 852a10482eaSJohn Baldwin char nonce[12]; 853a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 854a10482eaSJohn Baldwin 855a10482eaSJohn Baldwin hdr = src; 856a10482eaSJohn Baldwin 857a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 858a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 859a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 860a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 861a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 862*70bb2286SJohn Baldwin debug(tc, "decrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno); 863*70bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL); 864a10482eaSJohn Baldwin 865a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad); 866*70bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 867a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 868a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 869a10482eaSJohn Baldwin else 870a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 871*70bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 872a10482eaSJohn Baldwin 873a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 874a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len, 875a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 876a10482eaSJohn Baldwin 877a10482eaSJohn Baldwin *record_type = hdr->tls_type; 878a10482eaSJohn Baldwin return (payload_len); 879a10482eaSJohn Baldwin } 880a10482eaSJohn Baldwin 881a10482eaSJohn Baldwin static size_t 882*70bb2286SJohn Baldwin decrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 883*70bb2286SJohn Baldwin const void *src, size_t len, void *dst, uint8_t *record_type) 884a10482eaSJohn Baldwin { 885a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 886a10482eaSJohn Baldwin struct tls_aead_data_13 aad; 887a10482eaSJohn Baldwin char nonce[12]; 888a10482eaSJohn Baldwin char *buf; 889a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 890a10482eaSJohn Baldwin 891a10482eaSJohn Baldwin hdr = src; 892a10482eaSJohn Baldwin 893a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 894a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 895a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 896a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= 1); 897a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP); 898a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 899a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 900*70bb2286SJohn Baldwin debug(tc, "decrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno); 901*70bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL); 902a10482eaSJohn Baldwin 903a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 904*70bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 905a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 906*70bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 907a10482eaSJohn Baldwin 908a10482eaSJohn Baldwin /* 909a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the 910a10482eaSJohn Baldwin * record type as the last byte of the trailer. 911a10482eaSJohn Baldwin */ 912a10482eaSJohn Baldwin buf = malloc(payload_len); 913a10482eaSJohn Baldwin 914a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 915a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len, 916a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 917*70bb2286SJohn Baldwin debug_hexdump(tc, buf, payload_len, "decrypted buffer"); 918a10482eaSJohn Baldwin 919a10482eaSJohn Baldwin /* Trim record type. */ 920a10482eaSJohn Baldwin *record_type = buf[payload_len - 1]; 921a10482eaSJohn Baldwin payload_len--; 922a10482eaSJohn Baldwin 923a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 924a10482eaSJohn Baldwin free(buf); 925a10482eaSJohn Baldwin 926a10482eaSJohn Baldwin return (payload_len); 927a10482eaSJohn Baldwin } 928a10482eaSJohn Baldwin 929a10482eaSJohn Baldwin static size_t 930*70bb2286SJohn Baldwin decrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 931*70bb2286SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type) 932a10482eaSJohn Baldwin { 933a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 934a10482eaSJohn Baldwin size_t payload_len; 935a10482eaSJohn Baldwin 936a10482eaSJohn Baldwin hdr = src; 937a10482eaSJohn Baldwin ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len); 938a10482eaSJohn Baldwin 939a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en)); 940a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 941a10482eaSJohn Baldwin 942a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 943*70bb2286SJohn Baldwin ATF_REQUIRE(decrypt_tls_12_aead(tc, en, seqno, src, len, dst, 944a10482eaSJohn Baldwin record_type) == payload_len); 945a10482eaSJohn Baldwin } else { 946*70bb2286SJohn Baldwin ATF_REQUIRE(decrypt_tls_13_aead(tc, en, seqno, src, len, dst, 947a10482eaSJohn Baldwin record_type) == payload_len); 948a10482eaSJohn Baldwin } 949a10482eaSJohn Baldwin 950a10482eaSJohn Baldwin return (payload_len); 951a10482eaSJohn Baldwin } 952a10482eaSJohn Baldwin 953a10482eaSJohn Baldwin static size_t 954*70bb2286SJohn Baldwin decrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 955*70bb2286SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type) 956a10482eaSJohn Baldwin { 957a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 958*70bb2286SJohn Baldwin return (decrypt_tls_aes_cbc_mte(tc, en, seqno, src, len, dst, 959*70bb2286SJohn Baldwin avail, record_type)); 960a10482eaSJohn Baldwin else 961*70bb2286SJohn Baldwin return (decrypt_tls_aead(tc, en, seqno, src, len, dst, avail, 962a10482eaSJohn Baldwin record_type)); 963a10482eaSJohn Baldwin } 964a10482eaSJohn Baldwin 9653e7f8a8dSJohn Baldwin /* 9663e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes 9673e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have 96864811651SJohn Baldwin * sufficient room ('avail'), fail the test. 'padding' is the amount 96964811651SJohn Baldwin * of additional padding to include beyond any amount mandated by the 97064811651SJohn Baldwin * cipher suite. 9713e7f8a8dSJohn Baldwin */ 9723e7f8a8dSJohn Baldwin static size_t 973*70bb2286SJohn Baldwin encrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en, 974*70bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 975*70bb2286SJohn Baldwin size_t avail, size_t padding) 97664811651SJohn Baldwin { 97764811651SJohn Baldwin struct tls_record_layer *hdr; 97864811651SJohn Baldwin struct tls_mac_data aad; 97964811651SJohn Baldwin char *buf, *iv; 98064811651SJohn Baldwin size_t hdr_len, mac_len, record_len; 98164811651SJohn Baldwin u_int digest_len, i; 98264811651SJohn Baldwin 98364811651SJohn Baldwin ATF_REQUIRE(padding % 16 == 0); 98464811651SJohn Baldwin 98564811651SJohn Baldwin hdr = dst; 98664811651SJohn Baldwin buf = dst; 98764811651SJohn Baldwin 988*70bb2286SJohn Baldwin debug(tc, "encrypting MTE record seqno %ju:\n", (uintmax_t)seqno); 98964811651SJohn Baldwin hdr_len = tls_header_len(en); 99064811651SJohn Baldwin mac_len = tls_mac_len(en); 99164811651SJohn Baldwin padding += (AES_BLOCK_LEN - (len + mac_len) % AES_BLOCK_LEN); 99264811651SJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= 255); 99364811651SJohn Baldwin 99464811651SJohn Baldwin record_len = hdr_len + len + mac_len + padding; 99564811651SJohn Baldwin ATF_REQUIRE(record_len <= avail); 99664811651SJohn Baldwin 99764811651SJohn Baldwin hdr->tls_type = record_type; 99864811651SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 99964811651SJohn Baldwin hdr->tls_vminor = en->tls_vminor; 100064811651SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 100164811651SJohn Baldwin iv = (char *)(hdr + 1); 100264811651SJohn Baldwin for (i = 0; i < AES_BLOCK_LEN; i++) 100364811651SJohn Baldwin iv[i] = rdigit(); 1004*70bb2286SJohn Baldwin debug_hexdump(tc, iv, AES_BLOCK_LEN, "explicit IV"); 100564811651SJohn Baldwin 100664811651SJohn Baldwin /* Copy plaintext to ciphertext region. */ 100764811651SJohn Baldwin memcpy(buf + hdr_len, src, len); 100864811651SJohn Baldwin 100964811651SJohn Baldwin /* Compute HMAC. */ 101064811651SJohn Baldwin tls_mte_aad(en, len, hdr, seqno, &aad); 1011*70bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 1012*70bb2286SJohn Baldwin debug_hexdump(tc, src, len, "plaintext"); 101364811651SJohn Baldwin ATF_REQUIRE(compute_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 101464811651SJohn Baldwin &aad, sizeof(aad), src, len, buf + hdr_len + len, &digest_len)); 101564811651SJohn Baldwin ATF_REQUIRE(digest_len == mac_len); 101664811651SJohn Baldwin 101764811651SJohn Baldwin /* Store padding. */ 101864811651SJohn Baldwin for (i = 0; i < padding; i++) 101964811651SJohn Baldwin buf[hdr_len + len + mac_len + i] = padding - 1; 1020*70bb2286SJohn Baldwin debug_hexdump(tc, buf + hdr_len + len, mac_len + padding, "MAC and padding"); 102164811651SJohn Baldwin 102264811651SJohn Baldwin /* Encrypt the record. */ 102364811651SJohn Baldwin ATF_REQUIRE(cbc_encrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 102464811651SJohn Baldwin buf + hdr_len, buf + hdr_len, len + mac_len + padding)); 1025*70bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record"); 102664811651SJohn Baldwin 102764811651SJohn Baldwin return (record_len); 102864811651SJohn Baldwin } 102964811651SJohn Baldwin 103064811651SJohn Baldwin static size_t 1031*70bb2286SJohn Baldwin encrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en, 1032*70bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst) 10333e7f8a8dSJohn Baldwin { 10343e7f8a8dSJohn Baldwin struct tls_record_layer *hdr; 10353e7f8a8dSJohn Baldwin struct tls_aead_data aad; 10363e7f8a8dSJohn Baldwin char nonce[12]; 10373e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len; 10383e7f8a8dSJohn Baldwin 10393e7f8a8dSJohn Baldwin hdr = dst; 10403e7f8a8dSJohn Baldwin 1041*70bb2286SJohn Baldwin debug(tc, "encrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno); 10423e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en); 10433e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en); 10443e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len; 10453e7f8a8dSJohn Baldwin 10463e7f8a8dSJohn Baldwin hdr->tls_type = record_type; 10473e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 10483e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 10493e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 10503e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 10513e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno)); 10523e7f8a8dSJohn Baldwin 10533e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad); 1054*70bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 10553e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 10563e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 10573e7f8a8dSJohn Baldwin else 10583e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce); 1059*70bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 10603e7f8a8dSJohn Baldwin 1061*70bb2286SJohn Baldwin debug_hexdump(tc, src, len, "plaintext"); 10623e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 10633e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len, 10643e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len)); 1065*70bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record"); 10663e7f8a8dSJohn Baldwin 10673e7f8a8dSJohn Baldwin return (record_len); 10683e7f8a8dSJohn Baldwin } 10693e7f8a8dSJohn Baldwin 10703e7f8a8dSJohn Baldwin static size_t 1071*70bb2286SJohn Baldwin encrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en, 1072*70bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 1073*70bb2286SJohn Baldwin size_t padding) 107405a1d0f5SJohn Baldwin { 107505a1d0f5SJohn Baldwin struct tls_record_layer *hdr; 107605a1d0f5SJohn Baldwin struct tls_aead_data_13 aad; 107705a1d0f5SJohn Baldwin char nonce[12]; 107805a1d0f5SJohn Baldwin char *buf; 107905a1d0f5SJohn Baldwin size_t hdr_len, mac_len, record_len; 108005a1d0f5SJohn Baldwin 108105a1d0f5SJohn Baldwin hdr = dst; 108205a1d0f5SJohn Baldwin 1083*70bb2286SJohn Baldwin debug(tc, "encrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno); 108405a1d0f5SJohn Baldwin hdr_len = tls_header_len(en); 108505a1d0f5SJohn Baldwin mac_len = tls_mac_len(en); 108605a1d0f5SJohn Baldwin record_len = hdr_len + len + 1 + padding + mac_len; 108705a1d0f5SJohn Baldwin 108805a1d0f5SJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 108905a1d0f5SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 109005a1d0f5SJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 109105a1d0f5SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 109205a1d0f5SJohn Baldwin 109305a1d0f5SJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 1094*70bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 109505a1d0f5SJohn Baldwin tls_13_nonce(en, seqno, nonce); 1096*70bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 109705a1d0f5SJohn Baldwin 109805a1d0f5SJohn Baldwin /* 109905a1d0f5SJohn Baldwin * Have to use a temporary buffer for the input so that the record 110005a1d0f5SJohn Baldwin * type can be appended. 110105a1d0f5SJohn Baldwin */ 110205a1d0f5SJohn Baldwin buf = malloc(len + 1 + padding); 110305a1d0f5SJohn Baldwin memcpy(buf, src, len); 110405a1d0f5SJohn Baldwin buf[len] = record_type; 110505a1d0f5SJohn Baldwin memset(buf + len + 1, 0, padding); 1106*70bb2286SJohn Baldwin debug_hexdump(tc, buf, len + 1 + padding, "plaintext + type + padding"); 110705a1d0f5SJohn Baldwin 110805a1d0f5SJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 110905a1d0f5SJohn Baldwin &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding, 111005a1d0f5SJohn Baldwin (char *)dst + hdr_len + len + 1 + padding, mac_len)); 1111*70bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record"); 111205a1d0f5SJohn Baldwin 111305a1d0f5SJohn Baldwin free(buf); 111405a1d0f5SJohn Baldwin 111505a1d0f5SJohn Baldwin return (record_len); 111605a1d0f5SJohn Baldwin } 111705a1d0f5SJohn Baldwin 111805a1d0f5SJohn Baldwin static size_t 1119*70bb2286SJohn Baldwin encrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en, 1120*70bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 1121*70bb2286SJohn Baldwin size_t avail, size_t padding) 11223e7f8a8dSJohn Baldwin { 11233e7f8a8dSJohn Baldwin size_t record_len; 11243e7f8a8dSJohn Baldwin 112505a1d0f5SJohn Baldwin record_len = tls_header_len(en) + len + padding + tls_trailer_len(en); 11263e7f8a8dSJohn Baldwin ATF_REQUIRE(record_len <= avail); 11273e7f8a8dSJohn Baldwin 112805a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 112905a1d0f5SJohn Baldwin ATF_REQUIRE(padding == 0); 1130*70bb2286SJohn Baldwin ATF_REQUIRE(encrypt_tls_12_aead(tc, en, record_type, seqno, src, 113105a1d0f5SJohn Baldwin len, dst) == record_len); 113205a1d0f5SJohn Baldwin } else 1133*70bb2286SJohn Baldwin ATF_REQUIRE(encrypt_tls_13_aead(tc, en, record_type, seqno, src, 113405a1d0f5SJohn Baldwin len, dst, padding) == record_len); 11353e7f8a8dSJohn Baldwin 11363e7f8a8dSJohn Baldwin return (record_len); 11373e7f8a8dSJohn Baldwin } 11383e7f8a8dSJohn Baldwin 11393e7f8a8dSJohn Baldwin static size_t 1140*70bb2286SJohn Baldwin encrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en, 1141*70bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 1142*70bb2286SJohn Baldwin size_t avail, size_t padding) 11433e7f8a8dSJohn Baldwin { 114464811651SJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 1145*70bb2286SJohn Baldwin return (encrypt_tls_aes_cbc_mte(tc, en, record_type, seqno, src, 114664811651SJohn Baldwin len, dst, avail, padding)); 114764811651SJohn Baldwin else 1148*70bb2286SJohn Baldwin return (encrypt_tls_aead(tc, en, record_type, seqno, src, len, 114964811651SJohn Baldwin dst, avail, padding)); 11503e7f8a8dSJohn Baldwin } 11513e7f8a8dSJohn Baldwin 1152a10482eaSJohn Baldwin static void 11532400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en, 11542400a7b1SJohn Baldwin uint64_t seqno, size_t len) 1155a10482eaSJohn Baldwin { 1156a10482eaSJohn Baldwin struct kevent ev; 1157a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1158a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1159a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written; 1160a10482eaSJohn Baldwin ssize_t rv; 1161a10482eaSJohn Baldwin int kq, sockets[2]; 1162a10482eaSJohn Baldwin uint8_t record_type; 1163a10482eaSJohn Baldwin 1164a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1165*70bb2286SJohn Baldwin debug_hexdump(tc, plaintext, len, "plaintext"); 1166a10482eaSJohn Baldwin decrypted = malloc(len); 1167a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 1168a10482eaSJohn Baldwin tls_trailer_len(en); 1169a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1170a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1171a10482eaSJohn Baldwin 1172a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 1173a10482eaSJohn Baldwin 11742400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1175a10482eaSJohn Baldwin 1176a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1177a10482eaSJohn Baldwin sizeof(*en)) == 0); 1178ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 1179a10482eaSJohn Baldwin 1180a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 1181a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1182a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 1183a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1184a10482eaSJohn Baldwin 1185a10482eaSJohn Baldwin decrypted_len = 0; 1186a10482eaSJohn Baldwin outbuf_len = 0; 1187a10482eaSJohn Baldwin written = 0; 1188a10482eaSJohn Baldwin 1189a10482eaSJohn Baldwin while (decrypted_len != len) { 1190a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 1191a10482eaSJohn Baldwin 1192a10482eaSJohn Baldwin switch (ev.filter) { 1193a10482eaSJohn Baldwin case EVFILT_WRITE: 1194a10482eaSJohn Baldwin /* Try to write any remaining data. */ 1195a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written, 1196a10482eaSJohn Baldwin len - written); 1197a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1198a10482eaSJohn Baldwin "failed to write to socket"); 1199a10482eaSJohn Baldwin written += rv; 1200a10482eaSJohn Baldwin if (written == len) { 1201a10482eaSJohn Baldwin ev.flags = EV_DISABLE; 1202a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 1203a10482eaSJohn Baldwin NULL) == 0); 1204a10482eaSJohn Baldwin } 1205a10482eaSJohn Baldwin break; 1206a10482eaSJohn Baldwin 1207a10482eaSJohn Baldwin case EVFILT_READ: 1208a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 1209a10482eaSJohn Baldwin 1210a10482eaSJohn Baldwin /* 1211a10482eaSJohn Baldwin * Try to read data for the next TLS record 1212a10482eaSJohn Baldwin * into outbuf. Start by reading the header 1213a10482eaSJohn Baldwin * to determine how much additional data to 1214a10482eaSJohn Baldwin * read. 1215a10482eaSJohn Baldwin */ 1216a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) { 1217a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1218a10482eaSJohn Baldwin sizeof(struct tls_record_layer) - 1219a10482eaSJohn Baldwin outbuf_len); 1220a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1221a10482eaSJohn Baldwin "failed to read from socket"); 1222a10482eaSJohn Baldwin outbuf_len += rv; 1223*70bb2286SJohn Baldwin 1224*70bb2286SJohn Baldwin if (outbuf_len == 1225*70bb2286SJohn Baldwin sizeof(struct tls_record_layer)) { 1226*70bb2286SJohn Baldwin debug(tc, "TLS header for seqno %ju:\n", 1227*70bb2286SJohn Baldwin (uintmax_t)seqno); 1228*70bb2286SJohn Baldwin debug_hexdump(tc, outbuf, outbuf_len, 1229*70bb2286SJohn Baldwin NULL); 1230*70bb2286SJohn Baldwin } 1231a10482eaSJohn Baldwin } 1232a10482eaSJohn Baldwin 1233a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) 1234a10482eaSJohn Baldwin break; 1235a10482eaSJohn Baldwin 1236a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) + 1237a10482eaSJohn Baldwin ntohs(hdr->tls_length); 1238*70bb2286SJohn Baldwin debug(tc, "record_len %zu outbuf_cap %zu\n", 1239*70bb2286SJohn Baldwin record_len, outbuf_cap); 1240d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1241d71830cdSJohn Baldwin ATF_REQUIRE(record_len > outbuf_len); 1242a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1243a10482eaSJohn Baldwin record_len - outbuf_len); 1244a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN) 1245a10482eaSJohn Baldwin break; 1246a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, "failed to read from socket"); 1247a10482eaSJohn Baldwin 1248a10482eaSJohn Baldwin outbuf_len += rv; 1249a10482eaSJohn Baldwin if (outbuf_len == record_len) { 1250*70bb2286SJohn Baldwin decrypted_len += decrypt_tls_record(tc, en, 1251*70bb2286SJohn Baldwin seqno, outbuf, outbuf_len, 1252a10482eaSJohn Baldwin decrypted + decrypted_len, 1253a10482eaSJohn Baldwin len - decrypted_len, &record_type); 1254a10482eaSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 1255a10482eaSJohn Baldwin 1256a10482eaSJohn Baldwin seqno++; 1257a10482eaSJohn Baldwin outbuf_len = 0; 1258a10482eaSJohn Baldwin } 1259a10482eaSJohn Baldwin break; 1260a10482eaSJohn Baldwin } 1261a10482eaSJohn Baldwin } 1262a10482eaSJohn Baldwin 1263a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len, 1264a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written); 1265a10482eaSJohn Baldwin 1266a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1267a10482eaSJohn Baldwin 1268a10482eaSJohn Baldwin free(outbuf); 1269a10482eaSJohn Baldwin free(decrypted); 1270a10482eaSJohn Baldwin free(plaintext); 1271a10482eaSJohn Baldwin 12722c105205SJohn Baldwin close_sockets(sockets); 1273694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 1274a10482eaSJohn Baldwin } 1275a10482eaSJohn Baldwin 1276a10482eaSJohn Baldwin static void 1277a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len) 1278a10482eaSJohn Baldwin { 1279a10482eaSJohn Baldwin struct msghdr msg; 1280a10482eaSJohn Baldwin struct cmsghdr *cmsg; 1281a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))]; 1282a10482eaSJohn Baldwin struct iovec iov; 1283a10482eaSJohn Baldwin 1284a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1285a10482eaSJohn Baldwin 1286a10482eaSJohn Baldwin msg.msg_control = cbuf; 1287a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1288a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 1289a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 1290a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 1291a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type)); 1292a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type; 1293a10482eaSJohn Baldwin 1294a10482eaSJohn Baldwin iov.iov_base = data; 1295a10482eaSJohn Baldwin iov.iov_len = len; 1296a10482eaSJohn Baldwin msg.msg_iov = &iov; 1297a10482eaSJohn Baldwin msg.msg_iovlen = 1; 1298a10482eaSJohn Baldwin 1299a10482eaSJohn Baldwin ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len); 1300a10482eaSJohn Baldwin } 1301a10482eaSJohn Baldwin 1302a10482eaSJohn Baldwin static void 13032400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en, 13042400a7b1SJohn Baldwin uint64_t seqno, uint8_t type, size_t len) 1305a10482eaSJohn Baldwin { 1306a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1307a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1308a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 1309a10482eaSJohn Baldwin ssize_t rv; 1310a10482eaSJohn Baldwin int sockets[2]; 1311a10482eaSJohn Baldwin uint8_t record_type; 1312a10482eaSJohn Baldwin 1313a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1314a10482eaSJohn Baldwin 1315a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1316a10482eaSJohn Baldwin decrypted = malloc(len); 1317a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1318a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1319a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1320a10482eaSJohn Baldwin 13212400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1322a10482eaSJohn Baldwin 1323a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1324a10482eaSJohn Baldwin sizeof(*en)) == 0); 1325ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 1326a10482eaSJohn Baldwin 1327a10482eaSJohn Baldwin fd_set_blocking(sockets[0]); 1328a10482eaSJohn Baldwin fd_set_blocking(sockets[1]); 1329a10482eaSJohn Baldwin 1330a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len); 1331a10482eaSJohn Baldwin 1332a10482eaSJohn Baldwin /* 1333a10482eaSJohn Baldwin * First read the header to determine how much additional data 1334a10482eaSJohn Baldwin * to read. 1335a10482eaSJohn Baldwin */ 1336a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1337a10482eaSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 1338a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length); 1339a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1340d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1341a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 1342a10482eaSJohn Baldwin payload_len); 1343a10482eaSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 1344a10482eaSJohn Baldwin 1345*70bb2286SJohn Baldwin rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, decrypted, 1346*70bb2286SJohn Baldwin len, &record_type); 1347a10482eaSJohn Baldwin 1348a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv, 1349a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len); 1350a10482eaSJohn Baldwin ATF_REQUIRE(record_type == type); 1351a10482eaSJohn Baldwin 1352a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1353a10482eaSJohn Baldwin 1354a10482eaSJohn Baldwin free(outbuf); 1355a10482eaSJohn Baldwin free(decrypted); 1356a10482eaSJohn Baldwin free(plaintext); 1357a10482eaSJohn Baldwin 13582c105205SJohn Baldwin close_sockets(sockets); 1359a10482eaSJohn Baldwin } 1360a10482eaSJohn Baldwin 13610ff2a12aSJohn Baldwin static void 13622400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en, 13632400a7b1SJohn Baldwin uint64_t seqno) 13640ff2a12aSJohn Baldwin { 13650ff2a12aSJohn Baldwin struct tls_record_layer *hdr; 13660ff2a12aSJohn Baldwin char *outbuf; 13670ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 13680ff2a12aSJohn Baldwin ssize_t rv; 13690ff2a12aSJohn Baldwin int sockets[2]; 13700ff2a12aSJohn Baldwin uint8_t record_type; 13710ff2a12aSJohn Baldwin 13720ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en); 13730ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap); 13740ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 13750ff2a12aSJohn Baldwin 13762400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 13770ff2a12aSJohn Baldwin 13780ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 13790ff2a12aSJohn Baldwin sizeof(*en)) == 0); 1380ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 13810ff2a12aSJohn Baldwin 13820ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]); 13830ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]); 13840ff2a12aSJohn Baldwin 13855de79eedSMark Johnston /* 13865de79eedSMark Johnston * A write of zero bytes should send an empty fragment only for 13875de79eedSMark Johnston * TLS 1.0, otherwise an error should be raised. 13885de79eedSMark Johnston */ 13890ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0); 13905de79eedSMark Johnston if (rv == 0) { 13915de79eedSMark Johnston ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC); 13925de79eedSMark Johnston ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO); 13935de79eedSMark Johnston } else { 13945de79eedSMark Johnston ATF_REQUIRE(rv == -1); 13955de79eedSMark Johnston ATF_REQUIRE(errno == EINVAL); 13965de79eedSMark Johnston goto out; 13975de79eedSMark Johnston } 13980ff2a12aSJohn Baldwin 13990ff2a12aSJohn Baldwin /* 14000ff2a12aSJohn Baldwin * First read the header to determine how much additional data 14010ff2a12aSJohn Baldwin * to read. 14020ff2a12aSJohn Baldwin */ 14030ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 14040ff2a12aSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 14050ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length); 14060ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 14070ff2a12aSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 14080ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 14090ff2a12aSJohn Baldwin payload_len); 14100ff2a12aSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 14110ff2a12aSJohn Baldwin 1412*70bb2286SJohn Baldwin rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, NULL, 0, 14130ff2a12aSJohn Baldwin &record_type); 14140ff2a12aSJohn Baldwin 14150ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0, 14160ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv); 14170ff2a12aSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 14180ff2a12aSJohn Baldwin 14195de79eedSMark Johnston out: 14200ff2a12aSJohn Baldwin free(outbuf); 14210ff2a12aSJohn Baldwin 14222c105205SJohn Baldwin close_sockets(sockets); 14230ff2a12aSJohn Baldwin } 14240ff2a12aSJohn Baldwin 14253e7f8a8dSJohn Baldwin static size_t 14263e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type, 14273e7f8a8dSJohn Baldwin void *data, size_t len) 14283e7f8a8dSJohn Baldwin { 14293e7f8a8dSJohn Baldwin struct msghdr msg; 14303e7f8a8dSJohn Baldwin struct cmsghdr *cmsg; 14313e7f8a8dSJohn Baldwin struct tls_get_record *tgr; 14323e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 14333e7f8a8dSJohn Baldwin struct iovec iov; 14343e7f8a8dSJohn Baldwin ssize_t rv; 14353e7f8a8dSJohn Baldwin 14363e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg)); 14373e7f8a8dSJohn Baldwin 14383e7f8a8dSJohn Baldwin msg.msg_control = cbuf; 14393e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 14403e7f8a8dSJohn Baldwin 14413e7f8a8dSJohn Baldwin iov.iov_base = data; 14423e7f8a8dSJohn Baldwin iov.iov_len = len; 14433e7f8a8dSJohn Baldwin msg.msg_iov = &iov; 14443e7f8a8dSJohn Baldwin msg.msg_iovlen = 1; 14453e7f8a8dSJohn Baldwin 14463e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0); 14473e7f8a8dSJohn Baldwin 14483e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR); 14493e7f8a8dSJohn Baldwin 14503e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 14513e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL); 14523e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP); 14533e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD); 14543e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr))); 14553e7f8a8dSJohn Baldwin 14563e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 14573e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_type == record_type); 14583e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor); 145905a1d0f5SJohn Baldwin /* XXX: Not sure if this is what OpenSSL expects? */ 146005a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 146105a1d0f5SJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO); 146205a1d0f5SJohn Baldwin else 14633e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor); 14643e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_length == htons(rv)); 14653e7f8a8dSJohn Baldwin 14663e7f8a8dSJohn Baldwin return (rv); 14673e7f8a8dSJohn Baldwin } 14683e7f8a8dSJohn Baldwin 14693e7f8a8dSJohn Baldwin static void 14702400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en, 14712400a7b1SJohn Baldwin uint64_t seqno, size_t len, size_t padding) 14723e7f8a8dSJohn Baldwin { 14733e7f8a8dSJohn Baldwin struct kevent ev; 14743e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf; 14753e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written; 14763e7f8a8dSJohn Baldwin ssize_t rv; 14773e7f8a8dSJohn Baldwin int kq, sockets[2]; 14783e7f8a8dSJohn Baldwin 14793e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len); 14803e7f8a8dSJohn Baldwin received = malloc(len); 14813e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 14823e7f8a8dSJohn Baldwin tls_trailer_len(en); 14833e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap); 14843e7f8a8dSJohn Baldwin 14853e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 14863e7f8a8dSJohn Baldwin 14872400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 14883e7f8a8dSJohn Baldwin 14893e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 14903e7f8a8dSJohn Baldwin sizeof(*en)) == 0); 1491ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 14923e7f8a8dSJohn Baldwin 14933e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 14943e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 14953e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 14963e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 14973e7f8a8dSJohn Baldwin 14983e7f8a8dSJohn Baldwin received_len = 0; 14993e7f8a8dSJohn Baldwin outbuf_len = 0; 15003e7f8a8dSJohn Baldwin written = 0; 15013e7f8a8dSJohn Baldwin 15023e7f8a8dSJohn Baldwin while (received_len != len) { 15033e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 15043e7f8a8dSJohn Baldwin 15053e7f8a8dSJohn Baldwin switch (ev.filter) { 15063e7f8a8dSJohn Baldwin case EVFILT_WRITE: 15073e7f8a8dSJohn Baldwin /* 15083e7f8a8dSJohn Baldwin * Compose the next TLS record to send. 15093e7f8a8dSJohn Baldwin */ 15103e7f8a8dSJohn Baldwin if (outbuf_len == 0) { 15113e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len); 15123e7f8a8dSJohn Baldwin todo = len - written; 151305a1d0f5SJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding) 151405a1d0f5SJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2 - padding; 1515*70bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, 15163e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written, 151705a1d0f5SJohn Baldwin todo, outbuf, outbuf_cap, padding); 15183e7f8a8dSJohn Baldwin outbuf_sent = 0; 15193e7f8a8dSJohn Baldwin written += todo; 15203e7f8a8dSJohn Baldwin seqno++; 15213e7f8a8dSJohn Baldwin } 15223e7f8a8dSJohn Baldwin 15233e7f8a8dSJohn Baldwin /* 15243e7f8a8dSJohn Baldwin * Try to write the remainder of the current 15253e7f8a8dSJohn Baldwin * TLS record. 15263e7f8a8dSJohn Baldwin */ 15273e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent, 15283e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent); 15293e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 15303e7f8a8dSJohn Baldwin "failed to write to socket"); 15313e7f8a8dSJohn Baldwin outbuf_sent += rv; 15323e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) { 15333e7f8a8dSJohn Baldwin outbuf_len = 0; 15343e7f8a8dSJohn Baldwin if (written == len) { 15353e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE; 15363e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 15373e7f8a8dSJohn Baldwin NULL) == 0); 15383e7f8a8dSJohn Baldwin } 15393e7f8a8dSJohn Baldwin } 15403e7f8a8dSJohn Baldwin break; 15413e7f8a8dSJohn Baldwin 15423e7f8a8dSJohn Baldwin case EVFILT_READ: 15433e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 15443e7f8a8dSJohn Baldwin 15453e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident, 15463e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len, 15473e7f8a8dSJohn Baldwin len - received_len); 15483e7f8a8dSJohn Baldwin received_len += rv; 15493e7f8a8dSJohn Baldwin break; 15503e7f8a8dSJohn Baldwin } 15513e7f8a8dSJohn Baldwin } 15523e7f8a8dSJohn Baldwin 15533e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len, 15543e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written); 15553e7f8a8dSJohn Baldwin 15563e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0); 15573e7f8a8dSJohn Baldwin 15583e7f8a8dSJohn Baldwin free(outbuf); 15593e7f8a8dSJohn Baldwin free(received); 15603e7f8a8dSJohn Baldwin free(plaintext); 15613e7f8a8dSJohn Baldwin 15622c105205SJohn Baldwin close_sockets(sockets); 1563694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 15643e7f8a8dSJohn Baldwin } 15653e7f8a8dSJohn Baldwin 156665bd3adbSJohn Baldwin static void 156765bd3adbSJohn Baldwin ktls_receive_tls_error(int fd, int expected_error) 156865bd3adbSJohn Baldwin { 156965bd3adbSJohn Baldwin struct msghdr msg; 157065bd3adbSJohn Baldwin struct tls_get_record *tgr; 157165bd3adbSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 157265bd3adbSJohn Baldwin char buf[64]; 157365bd3adbSJohn Baldwin struct iovec iov; 157465bd3adbSJohn Baldwin 157565bd3adbSJohn Baldwin memset(&msg, 0, sizeof(msg)); 157665bd3adbSJohn Baldwin 157765bd3adbSJohn Baldwin msg.msg_control = cbuf; 157865bd3adbSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 157965bd3adbSJohn Baldwin 158065bd3adbSJohn Baldwin iov.iov_base = buf; 158165bd3adbSJohn Baldwin iov.iov_len = sizeof(buf); 158265bd3adbSJohn Baldwin msg.msg_iov = &iov; 158365bd3adbSJohn Baldwin msg.msg_iovlen = 1; 158465bd3adbSJohn Baldwin 158565bd3adbSJohn Baldwin ATF_REQUIRE(recvmsg(fd, &msg, 0) == -1); 158665bd3adbSJohn Baldwin if (expected_error != 0) 158765bd3adbSJohn Baldwin ATF_REQUIRE(errno == expected_error); 158865bd3adbSJohn Baldwin } 158965bd3adbSJohn Baldwin 159065bd3adbSJohn Baldwin static void 159165bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(const atf_tc_t *tc, struct tls_enable *en, 159265bd3adbSJohn Baldwin uint64_t seqno, size_t len, ssize_t offset) 159365bd3adbSJohn Baldwin { 159465bd3adbSJohn Baldwin char *plaintext, *outbuf; 159565bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 159665bd3adbSJohn Baldwin ssize_t rv; 159765bd3adbSJohn Baldwin int sockets[2]; 159865bd3adbSJohn Baldwin 159965bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 160065bd3adbSJohn Baldwin 160165bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 160265bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 160365bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 160465bd3adbSJohn Baldwin 160565bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 160665bd3adbSJohn Baldwin 160765bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 160865bd3adbSJohn Baldwin sizeof(*en)) == 0); 160965bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 161065bd3adbSJohn Baldwin 161165bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 161265bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 161365bd3adbSJohn Baldwin 1614*70bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 161565bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 161665bd3adbSJohn Baldwin 161765bd3adbSJohn Baldwin /* A negative offset is an offset from the end. */ 161865bd3adbSJohn Baldwin if (offset < 0) 161965bd3adbSJohn Baldwin offset += outbuf_len; 162065bd3adbSJohn Baldwin outbuf[offset] ^= 0x01; 162165bd3adbSJohn Baldwin 162265bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 162365bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 162465bd3adbSJohn Baldwin 162565bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EBADMSG); 162665bd3adbSJohn Baldwin 162765bd3adbSJohn Baldwin free(outbuf); 162865bd3adbSJohn Baldwin free(plaintext); 162965bd3adbSJohn Baldwin 163065bd3adbSJohn Baldwin close_sockets(sockets); 163165bd3adbSJohn Baldwin } 163265bd3adbSJohn Baldwin 163365bd3adbSJohn Baldwin static void 163465bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(const atf_tc_t *tc, struct tls_enable *en, 163565bd3adbSJohn Baldwin uint64_t seqno, size_t len) 163665bd3adbSJohn Baldwin { 163765bd3adbSJohn Baldwin ATF_REQUIRE(tls_header_len(en) > sizeof(struct tls_record_layer)); 163865bd3adbSJohn Baldwin 163965bd3adbSJohn Baldwin /* Corrupt the first byte of the explicit IV after the header. */ 164065bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, 164165bd3adbSJohn Baldwin sizeof(struct tls_record_layer)); 164265bd3adbSJohn Baldwin } 164365bd3adbSJohn Baldwin 164465bd3adbSJohn Baldwin static void 164565bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(const atf_tc_t *tc, struct tls_enable *en, 164665bd3adbSJohn Baldwin uint64_t seqno, size_t len) 164765bd3adbSJohn Baldwin { 164865bd3adbSJohn Baldwin ATF_REQUIRE(len > 0); 164965bd3adbSJohn Baldwin 165065bd3adbSJohn Baldwin /* Corrupt the first ciphertext byte after the header. */ 165165bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, 165265bd3adbSJohn Baldwin tls_header_len(en)); 165365bd3adbSJohn Baldwin } 165465bd3adbSJohn Baldwin 165565bd3adbSJohn Baldwin static void 165665bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(const atf_tc_t *tc, struct tls_enable *en, 165765bd3adbSJohn Baldwin uint64_t seqno, size_t len) 165865bd3adbSJohn Baldwin { 165965bd3adbSJohn Baldwin size_t offset; 166065bd3adbSJohn Baldwin 166165bd3adbSJohn Baldwin /* Corrupt the first byte of the MAC. */ 166265bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 166365bd3adbSJohn Baldwin offset = tls_header_len(en) + len; 166465bd3adbSJohn Baldwin else 166565bd3adbSJohn Baldwin offset = -tls_mac_len(en); 166665bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, offset); 166765bd3adbSJohn Baldwin } 166865bd3adbSJohn Baldwin 166965bd3adbSJohn Baldwin static void 167065bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(const atf_tc_t *tc, struct tls_enable *en, 167165bd3adbSJohn Baldwin uint64_t seqno, size_t len) 167265bd3adbSJohn Baldwin { 167365bd3adbSJohn Baldwin ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC); 167465bd3adbSJohn Baldwin 167565bd3adbSJohn Baldwin /* Corrupt the last byte of the padding. */ 167665bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, -1); 167765bd3adbSJohn Baldwin } 167865bd3adbSJohn Baldwin 167965bd3adbSJohn Baldwin static void 168065bd3adbSJohn Baldwin test_ktls_receive_truncated_record(const atf_tc_t *tc, struct tls_enable *en, 168165bd3adbSJohn Baldwin uint64_t seqno, size_t len) 168265bd3adbSJohn Baldwin { 168365bd3adbSJohn Baldwin char *plaintext, *outbuf; 168465bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 168565bd3adbSJohn Baldwin ssize_t rv; 168665bd3adbSJohn Baldwin int sockets[2]; 168765bd3adbSJohn Baldwin 168865bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 168965bd3adbSJohn Baldwin 169065bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 169165bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 169265bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 169365bd3adbSJohn Baldwin 169465bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 169565bd3adbSJohn Baldwin 169665bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 169765bd3adbSJohn Baldwin sizeof(*en)) == 0); 169865bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 169965bd3adbSJohn Baldwin 170065bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 170165bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 170265bd3adbSJohn Baldwin 1703*70bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 170465bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 170565bd3adbSJohn Baldwin 170665bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len / 2); 170765bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)(outbuf_len / 2)); 170865bd3adbSJohn Baldwin 170965bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0); 171065bd3adbSJohn Baldwin 171165bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE); 171265bd3adbSJohn Baldwin 171365bd3adbSJohn Baldwin free(outbuf); 171465bd3adbSJohn Baldwin free(plaintext); 171565bd3adbSJohn Baldwin 171665bd3adbSJohn Baldwin close_sockets(sockets); 171765bd3adbSJohn Baldwin } 171865bd3adbSJohn Baldwin 171965bd3adbSJohn Baldwin static void 172065bd3adbSJohn Baldwin test_ktls_receive_bad_major(const atf_tc_t *tc, struct tls_enable *en, 172165bd3adbSJohn Baldwin uint64_t seqno, size_t len) 172265bd3adbSJohn Baldwin { 172365bd3adbSJohn Baldwin struct tls_record_layer *hdr; 172465bd3adbSJohn Baldwin char *plaintext, *outbuf; 172565bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 172665bd3adbSJohn Baldwin ssize_t rv; 172765bd3adbSJohn Baldwin int sockets[2]; 172865bd3adbSJohn Baldwin 172965bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 173065bd3adbSJohn Baldwin 173165bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 173265bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 173365bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 173465bd3adbSJohn Baldwin 173565bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 173665bd3adbSJohn Baldwin 173765bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 173865bd3adbSJohn Baldwin sizeof(*en)) == 0); 173965bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 174065bd3adbSJohn Baldwin 174165bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 174265bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 174365bd3adbSJohn Baldwin 1744*70bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 174565bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 174665bd3adbSJohn Baldwin 174765bd3adbSJohn Baldwin hdr = (void *)outbuf; 174865bd3adbSJohn Baldwin hdr->tls_vmajor++; 174965bd3adbSJohn Baldwin 175065bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 175165bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 175265bd3adbSJohn Baldwin 175365bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 175465bd3adbSJohn Baldwin 175565bd3adbSJohn Baldwin free(outbuf); 175665bd3adbSJohn Baldwin free(plaintext); 175765bd3adbSJohn Baldwin 175865bd3adbSJohn Baldwin close_sockets(sockets); 175965bd3adbSJohn Baldwin } 176065bd3adbSJohn Baldwin 176165bd3adbSJohn Baldwin static void 176265bd3adbSJohn Baldwin test_ktls_receive_bad_minor(const atf_tc_t *tc, struct tls_enable *en, 176365bd3adbSJohn Baldwin uint64_t seqno, size_t len) 176465bd3adbSJohn Baldwin { 176565bd3adbSJohn Baldwin struct tls_record_layer *hdr; 176665bd3adbSJohn Baldwin char *plaintext, *outbuf; 176765bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 176865bd3adbSJohn Baldwin ssize_t rv; 176965bd3adbSJohn Baldwin int sockets[2]; 177065bd3adbSJohn Baldwin 177165bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 177265bd3adbSJohn Baldwin 177365bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 177465bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 177565bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 177665bd3adbSJohn Baldwin 177765bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 177865bd3adbSJohn Baldwin 177965bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 178065bd3adbSJohn Baldwin sizeof(*en)) == 0); 178165bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 178265bd3adbSJohn Baldwin 178365bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 178465bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 178565bd3adbSJohn Baldwin 1786*70bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 178765bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 178865bd3adbSJohn Baldwin 178965bd3adbSJohn Baldwin hdr = (void *)outbuf; 179065bd3adbSJohn Baldwin hdr->tls_vminor++; 179165bd3adbSJohn Baldwin 179265bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 179365bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 179465bd3adbSJohn Baldwin 179565bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 179665bd3adbSJohn Baldwin 179765bd3adbSJohn Baldwin free(outbuf); 179865bd3adbSJohn Baldwin free(plaintext); 179965bd3adbSJohn Baldwin 180065bd3adbSJohn Baldwin close_sockets(sockets); 180165bd3adbSJohn Baldwin } 180265bd3adbSJohn Baldwin 180365bd3adbSJohn Baldwin static void 180465bd3adbSJohn Baldwin test_ktls_receive_bad_type(const atf_tc_t *tc, struct tls_enable *en, 180565bd3adbSJohn Baldwin uint64_t seqno, size_t len) 180665bd3adbSJohn Baldwin { 180765bd3adbSJohn Baldwin struct tls_record_layer *hdr; 180865bd3adbSJohn Baldwin char *plaintext, *outbuf; 180965bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 181065bd3adbSJohn Baldwin ssize_t rv; 181165bd3adbSJohn Baldwin int sockets[2]; 181265bd3adbSJohn Baldwin 181365bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 181465bd3adbSJohn Baldwin ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_THREE); 181565bd3adbSJohn Baldwin 181665bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 181765bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 181865bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 181965bd3adbSJohn Baldwin 182065bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 182165bd3adbSJohn Baldwin 182265bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 182365bd3adbSJohn Baldwin sizeof(*en)) == 0); 182465bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 182565bd3adbSJohn Baldwin 182665bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 182765bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 182865bd3adbSJohn Baldwin 1829*70bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, 0x21 /* Alert */, seqno, 183065bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 183165bd3adbSJohn Baldwin 183265bd3adbSJohn Baldwin hdr = (void *)outbuf; 183365bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP + 1; 183465bd3adbSJohn Baldwin 183565bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 183665bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 183765bd3adbSJohn Baldwin 183865bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 183965bd3adbSJohn Baldwin 184065bd3adbSJohn Baldwin free(outbuf); 184165bd3adbSJohn Baldwin free(plaintext); 184265bd3adbSJohn Baldwin 184365bd3adbSJohn Baldwin close_sockets(sockets); 184465bd3adbSJohn Baldwin } 184565bd3adbSJohn Baldwin 184665bd3adbSJohn Baldwin static void 184765bd3adbSJohn Baldwin test_ktls_receive_bad_size(const atf_tc_t *tc, struct tls_enable *en, 184865bd3adbSJohn Baldwin uint64_t seqno, size_t len) 184965bd3adbSJohn Baldwin { 185065bd3adbSJohn Baldwin struct tls_record_layer *hdr; 185165bd3adbSJohn Baldwin char *outbuf; 185265bd3adbSJohn Baldwin size_t outbuf_len; 185365bd3adbSJohn Baldwin ssize_t rv; 185465bd3adbSJohn Baldwin int sockets[2]; 185565bd3adbSJohn Baldwin 185665bd3adbSJohn Baldwin outbuf_len = sizeof(*hdr) + len; 185765bd3adbSJohn Baldwin outbuf = calloc(1, outbuf_len); 185865bd3adbSJohn Baldwin 185965bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 186065bd3adbSJohn Baldwin 186165bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 186265bd3adbSJohn Baldwin sizeof(*en)) == 0); 186365bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 186465bd3adbSJohn Baldwin 186565bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 186665bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 186765bd3adbSJohn Baldwin 186865bd3adbSJohn Baldwin hdr = (void *)outbuf; 186965bd3adbSJohn Baldwin hdr->tls_vmajor = en->tls_vmajor; 187065bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 187165bd3adbSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 187265bd3adbSJohn Baldwin else 187365bd3adbSJohn Baldwin hdr->tls_vminor = en->tls_vminor; 187465bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 187565bd3adbSJohn Baldwin hdr->tls_length = htons(len); 187665bd3adbSJohn Baldwin 187765bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 187865bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 187965bd3adbSJohn Baldwin 188065bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0); 188165bd3adbSJohn Baldwin 188265bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE); 188365bd3adbSJohn Baldwin 188465bd3adbSJohn Baldwin free(outbuf); 188565bd3adbSJohn Baldwin 188665bd3adbSJohn Baldwin close_sockets(sockets); 188765bd3adbSJohn Baldwin } 188865bd3adbSJohn Baldwin 18890ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \ 18900ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 189164811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 18920ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 189364811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) 18940ff2a12aSJohn Baldwin 189583a54b58SJohn Baldwin #define TLS_13_TESTS(M) \ 189683a54b58SJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 189783a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 189883a54b58SJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 189983a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 190083a54b58SJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 190183a54b58SJohn Baldwin TLS_MINOR_VER_THREE) 190283a54b58SJohn Baldwin 190364811651SJohn Baldwin #define AES_CBC_NONZERO_TESTS(M) \ 1904a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1905a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1906a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1907a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1908a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1909a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1910a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1911a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1912a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1913a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1914a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \ 1915a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1916a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1917a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1918a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \ 1919a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1920a10482eaSJohn Baldwin 192164811651SJohn Baldwin #define AES_CBC_TESTS(M) \ 192264811651SJohn Baldwin TLS_10_TESTS(M) \ 192364811651SJohn Baldwin AES_CBC_NONZERO_TESTS(M) 192464811651SJohn Baldwin 192565bd3adbSJohn Baldwin #define AES_GCM_12_TESTS(M) \ 1926a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1927a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1928a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 192965bd3adbSJohn Baldwin TLS_MINOR_VER_TWO) 193065bd3adbSJohn Baldwin 193165bd3adbSJohn Baldwin #define AES_GCM_TESTS(M) \ 193265bd3adbSJohn Baldwin AES_GCM_12_TESTS(M) \ 1933a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1934a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \ 1935a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1936a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1937a10482eaSJohn Baldwin 1938a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \ 1939a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1940a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1941a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1942a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1943a10482eaSJohn Baldwin 1944a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1945a10482eaSJohn Baldwin auth_alg, minor, name, len) \ 1946a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 1947a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1948a10482eaSJohn Baldwin { \ 1949a10482eaSJohn Baldwin struct tls_enable en; \ 1950a10482eaSJohn Baldwin uint64_t seqno; \ 1951a10482eaSJohn Baldwin \ 1952a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1953a10482eaSJohn Baldwin seqno = random(); \ 1954*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 1955*70bb2286SJohn Baldwin seqno, &en); \ 19562400a7b1SJohn Baldwin test_ktls_transmit_app_data(tc, &en, seqno, len); \ 1957a10482eaSJohn Baldwin free_tls_enable(&en); \ 1958a10482eaSJohn Baldwin } 1959a10482eaSJohn Baldwin 1960a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1961a10482eaSJohn Baldwin auth_alg, minor, name) \ 1962a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1963a10482eaSJohn Baldwin 1964a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 196544265dc3SJohn Baldwin auth_alg, minor, name, type, len) \ 196644265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 196744265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1968a10482eaSJohn Baldwin { \ 1969a10482eaSJohn Baldwin struct tls_enable en; \ 1970a10482eaSJohn Baldwin uint64_t seqno; \ 1971a10482eaSJohn Baldwin \ 1972a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1973a10482eaSJohn Baldwin seqno = random(); \ 1974*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 1975*70bb2286SJohn Baldwin seqno, &en); \ 19762400a7b1SJohn Baldwin test_ktls_transmit_control(tc, &en, seqno, type, len); \ 1977a10482eaSJohn Baldwin free_tls_enable(&en); \ 1978a10482eaSJohn Baldwin } 1979a10482eaSJohn Baldwin 1980a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198144265dc3SJohn Baldwin auth_alg, minor, name) \ 198244265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1983a10482eaSJohn Baldwin 19840ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 19855de79eedSMark Johnston key_size, auth_alg, minor) \ 19860ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \ 19870ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \ 19880ff2a12aSJohn Baldwin { \ 19890ff2a12aSJohn Baldwin struct tls_enable en; \ 19900ff2a12aSJohn Baldwin uint64_t seqno; \ 19910ff2a12aSJohn Baldwin \ 19920ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \ 19930ff2a12aSJohn Baldwin seqno = random(); \ 1994*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 1995*70bb2286SJohn Baldwin seqno, &en); \ 19962400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(tc, &en, seqno); \ 19970ff2a12aSJohn Baldwin free_tls_enable(&en); \ 19980ff2a12aSJohn Baldwin } 19990ff2a12aSJohn Baldwin 20000ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 20015de79eedSMark Johnston key_size, auth_alg, minor) \ 20020ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment); 20030ff2a12aSJohn Baldwin 2004a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 2005a10482eaSJohn Baldwin minor) \ 2006a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2007a10482eaSJohn Baldwin auth_alg, minor, short, 64) \ 2008a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2009a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \ 2010a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 201144265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32) 2012a10482eaSJohn Baldwin 2013a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 2014a10482eaSJohn Baldwin minor) \ 2015a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2016a10482eaSJohn Baldwin auth_alg, minor, short) \ 2017a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2018a10482eaSJohn Baldwin auth_alg, minor, long) \ 2019a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202044265dc3SJohn Baldwin auth_alg, minor, control) 2021a10482eaSJohn Baldwin 2022a10482eaSJohn Baldwin /* 2023a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests: 2024a10482eaSJohn Baldwin * 2025a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 2026a10482eaSJohn Baldwin * a single TLS record) 2027a10482eaSJohn Baldwin * 2028a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across 2029a10482eaSJohn Baldwin * multiple TLS records) 2030a10482eaSJohn Baldwin * 2031a10482eaSJohn Baldwin * - a control test which sends a single record with a specific 2032a10482eaSJohn Baldwin * content type via sendmsg() 2033a10482eaSJohn Baldwin */ 2034a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS); 2035a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS); 2036a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS); 2037a10482eaSJohn Baldwin 203844265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 203944265dc3SJohn Baldwin auth_alg, minor) \ 204044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 204144265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \ 204244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 204344265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \ 204444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 204544265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \ 204644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 204744265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \ 204844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 204944265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \ 205044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205144265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \ 205244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205344265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \ 205444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205544265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \ 205644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205744265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \ 205844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205944265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \ 206044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206144265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \ 206244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206344265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \ 206444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206544265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \ 206644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206744265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \ 206844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206944265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \ 207044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207144265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16) 207244265dc3SJohn Baldwin 207344265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 207444265dc3SJohn Baldwin auth_alg, minor) \ 207544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207644265dc3SJohn Baldwin auth_alg, minor, padding_1) \ 207744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207844265dc3SJohn Baldwin auth_alg, minor, padding_2) \ 207944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208044265dc3SJohn Baldwin auth_alg, minor, padding_3) \ 208144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208244265dc3SJohn Baldwin auth_alg, minor, padding_4) \ 208344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208444265dc3SJohn Baldwin auth_alg, minor, padding_5) \ 208544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208644265dc3SJohn Baldwin auth_alg, minor, padding_6) \ 208744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208844265dc3SJohn Baldwin auth_alg, minor, padding_7) \ 208944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209044265dc3SJohn Baldwin auth_alg, minor, padding_8) \ 209144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209244265dc3SJohn Baldwin auth_alg, minor, padding_9) \ 209344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209444265dc3SJohn Baldwin auth_alg, minor, padding_10) \ 209544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209644265dc3SJohn Baldwin auth_alg, minor, padding_11) \ 209744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209844265dc3SJohn Baldwin auth_alg, minor, padding_12) \ 209944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210044265dc3SJohn Baldwin auth_alg, minor, padding_13) \ 210144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210244265dc3SJohn Baldwin auth_alg, minor, padding_14) \ 210344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210444265dc3SJohn Baldwin auth_alg, minor, padding_15) \ 210544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210644265dc3SJohn Baldwin auth_alg, minor, padding_16) 210744265dc3SJohn Baldwin 210844265dc3SJohn Baldwin /* 210944265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 211044265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 211144265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 211244265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 211344265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 211444265dc3SJohn Baldwin * of the possible padding lengths for each suite. 211544265dc3SJohn Baldwin */ 211644265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS); 211744265dc3SJohn Baldwin 21180ff2a12aSJohn Baldwin /* 21190ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that 21200ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections. 21210ff2a12aSJohn Baldwin */ 21225de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 21235de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 21245de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 21250ff2a12aSJohn Baldwin 2126d1c369f9SJohn Baldwin static void 21272400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc, 21282400a7b1SJohn Baldwin struct tls_enable *en) 2129d1c369f9SJohn Baldwin { 2130d1c369f9SJohn Baldwin int sockets[2]; 2131d1c369f9SJohn Baldwin 21322400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 2133d1c369f9SJohn Baldwin 2134d1c369f9SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 2135d1c369f9SJohn Baldwin sizeof(*en)) == -1); 2136d1c369f9SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 2137d1c369f9SJohn Baldwin 21382c105205SJohn Baldwin close_sockets(sockets); 2139d1c369f9SJohn Baldwin } 2140d1c369f9SJohn Baldwin 2141d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 2142d1c369f9SJohn Baldwin minor) \ 2143d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \ 2144d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \ 2145d1c369f9SJohn Baldwin { \ 2146d1c369f9SJohn Baldwin struct tls_enable en; \ 2147d1c369f9SJohn Baldwin uint64_t seqno; \ 2148d1c369f9SJohn Baldwin \ 2149d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \ 2150d1c369f9SJohn Baldwin seqno = random(); \ 2151*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2152*70bb2286SJohn Baldwin seqno, &en); \ 21532400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(tc, &en); \ 2154d1c369f9SJohn Baldwin free_tls_enable(&en); \ 2155d1c369f9SJohn Baldwin } 2156d1c369f9SJohn Baldwin 2157d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 2158d1c369f9SJohn Baldwin minor) \ 2159d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name); 2160d1c369f9SJohn Baldwin 2161d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \ 2162d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2163d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \ 2164d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2165d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \ 2166d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 2167d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 2168d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 2169d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 2170d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2171d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \ 2172d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2173d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \ 2174d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 2175d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 2176d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 2177d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 2178d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \ 2179d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \ 2180d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2181d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \ 2182d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2183d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE) 2184d1c369f9SJohn Baldwin 2185d1c369f9SJohn Baldwin /* 2186d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit. 2187d1c369f9SJohn Baldwin */ 2188d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST); 2189d1c369f9SJohn Baldwin 21903e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 219105a1d0f5SJohn Baldwin auth_alg, minor, name, len, padding) \ 21923e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 21933e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 21943e7f8a8dSJohn Baldwin { \ 21953e7f8a8dSJohn Baldwin struct tls_enable en; \ 21963e7f8a8dSJohn Baldwin uint64_t seqno; \ 21973e7f8a8dSJohn Baldwin \ 21983e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \ 21993e7f8a8dSJohn Baldwin seqno = random(); \ 2200*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2201*70bb2286SJohn Baldwin seqno, &en); \ 22022400a7b1SJohn Baldwin test_ktls_receive_app_data(tc, &en, seqno, len, padding); \ 22033e7f8a8dSJohn Baldwin free_tls_enable(&en); \ 22043e7f8a8dSJohn Baldwin } 22053e7f8a8dSJohn Baldwin 22063e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 22073e7f8a8dSJohn Baldwin auth_alg, minor, name) \ 22083e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 22093e7f8a8dSJohn Baldwin 221065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 221165bd3adbSJohn Baldwin auth_alg, minor, len) \ 221265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_data); \ 221365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc) \ 221465bd3adbSJohn Baldwin { \ 221565bd3adbSJohn Baldwin struct tls_enable en; \ 221665bd3adbSJohn Baldwin uint64_t seqno; \ 221765bd3adbSJohn Baldwin \ 221865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 221965bd3adbSJohn Baldwin seqno = random(); \ 2220*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2221*70bb2286SJohn Baldwin seqno, &en); \ 222265bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(tc, &en, seqno, len); \ 222365bd3adbSJohn Baldwin free_tls_enable(&en); \ 222465bd3adbSJohn Baldwin } 222565bd3adbSJohn Baldwin 222665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 222765bd3adbSJohn Baldwin auth_alg, minor) \ 222865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_data); 222965bd3adbSJohn Baldwin 223065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 223165bd3adbSJohn Baldwin auth_alg, minor, len) \ 223265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_mac); \ 223365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc) \ 223465bd3adbSJohn Baldwin { \ 223565bd3adbSJohn Baldwin struct tls_enable en; \ 223665bd3adbSJohn Baldwin uint64_t seqno; \ 223765bd3adbSJohn Baldwin \ 223865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 223965bd3adbSJohn Baldwin seqno = random(); \ 2240*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2241*70bb2286SJohn Baldwin seqno, &en); \ 224265bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(tc, &en, seqno, len); \ 224365bd3adbSJohn Baldwin free_tls_enable(&en); \ 224465bd3adbSJohn Baldwin } 224565bd3adbSJohn Baldwin 224665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 224765bd3adbSJohn Baldwin auth_alg, minor) \ 224865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_mac); 224965bd3adbSJohn Baldwin 225065bd3adbSJohn Baldwin #define GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 225165bd3adbSJohn Baldwin auth_alg, minor, len) \ 225265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_truncated_record); \ 225365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc) \ 225465bd3adbSJohn Baldwin { \ 225565bd3adbSJohn Baldwin struct tls_enable en; \ 225665bd3adbSJohn Baldwin uint64_t seqno; \ 225765bd3adbSJohn Baldwin \ 225865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 225965bd3adbSJohn Baldwin seqno = random(); \ 2260*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2261*70bb2286SJohn Baldwin seqno, &en); \ 226265bd3adbSJohn Baldwin test_ktls_receive_truncated_record(tc, &en, seqno, len); \ 226365bd3adbSJohn Baldwin free_tls_enable(&en); \ 226465bd3adbSJohn Baldwin } 226565bd3adbSJohn Baldwin 226665bd3adbSJohn Baldwin #define ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 226765bd3adbSJohn Baldwin auth_alg, minor) \ 226865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_truncated_record); 226965bd3adbSJohn Baldwin 227065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 227165bd3adbSJohn Baldwin auth_alg, minor, len) \ 227265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_major); \ 227365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc) \ 227465bd3adbSJohn Baldwin { \ 227565bd3adbSJohn Baldwin struct tls_enable en; \ 227665bd3adbSJohn Baldwin uint64_t seqno; \ 227765bd3adbSJohn Baldwin \ 227865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 227965bd3adbSJohn Baldwin seqno = random(); \ 2280*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2281*70bb2286SJohn Baldwin seqno, &en); \ 228265bd3adbSJohn Baldwin test_ktls_receive_bad_major(tc, &en, seqno, len); \ 228365bd3adbSJohn Baldwin free_tls_enable(&en); \ 228465bd3adbSJohn Baldwin } 228565bd3adbSJohn Baldwin 228665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 228765bd3adbSJohn Baldwin auth_alg, minor) \ 228865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_major); 228965bd3adbSJohn Baldwin 229065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 229165bd3adbSJohn Baldwin auth_alg, minor, len) \ 229265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_minor); \ 229365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc) \ 229465bd3adbSJohn Baldwin { \ 229565bd3adbSJohn Baldwin struct tls_enable en; \ 229665bd3adbSJohn Baldwin uint64_t seqno; \ 229765bd3adbSJohn Baldwin \ 229865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 229965bd3adbSJohn Baldwin seqno = random(); \ 2300*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2301*70bb2286SJohn Baldwin seqno, &en); \ 230265bd3adbSJohn Baldwin test_ktls_receive_bad_minor(tc, &en, seqno, len); \ 230365bd3adbSJohn Baldwin free_tls_enable(&en); \ 230465bd3adbSJohn Baldwin } 230565bd3adbSJohn Baldwin 230665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 230765bd3adbSJohn Baldwin auth_alg, minor) \ 230865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_minor); 230965bd3adbSJohn Baldwin 231065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 231165bd3adbSJohn Baldwin auth_alg, minor, name, len) \ 231265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 231365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 231465bd3adbSJohn Baldwin { \ 231565bd3adbSJohn Baldwin struct tls_enable en; \ 231665bd3adbSJohn Baldwin uint64_t seqno; \ 231765bd3adbSJohn Baldwin \ 231865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 231965bd3adbSJohn Baldwin seqno = random(); \ 2320*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2321*70bb2286SJohn Baldwin seqno, &en); \ 232265bd3adbSJohn Baldwin test_ktls_receive_bad_size(tc, &en, seqno, (len)); \ 232365bd3adbSJohn Baldwin free_tls_enable(&en); \ 232465bd3adbSJohn Baldwin } 232565bd3adbSJohn Baldwin 232665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 232765bd3adbSJohn Baldwin auth_alg, minor, name) \ 232865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 232965bd3adbSJohn Baldwin 23303e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 23313e7f8a8dSJohn Baldwin minor) \ 23323e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233305a1d0f5SJohn Baldwin auth_alg, minor, short, 64, 0) \ 23343e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233565bd3adbSJohn Baldwin auth_alg, minor, long, 64 * 1024, 0) \ 233665bd3adbSJohn Baldwin GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233765bd3adbSJohn Baldwin auth_alg, minor, 64) \ 233865bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 233965bd3adbSJohn Baldwin auth_alg, minor, 64) \ 234065bd3adbSJohn Baldwin GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 234165bd3adbSJohn Baldwin auth_alg, minor, 64) \ 234265bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 234365bd3adbSJohn Baldwin auth_alg, minor, 64) \ 234465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 234565bd3adbSJohn Baldwin auth_alg, minor, 64) \ 234665bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 234765bd3adbSJohn Baldwin auth_alg, minor, small_record, \ 234865bd3adbSJohn Baldwin tls_minimum_record_payload(&en) - 1) \ 234965bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 235065bd3adbSJohn Baldwin auth_alg, minor, oversized_record, \ 235165bd3adbSJohn Baldwin TLS_MAX_MSG_SIZE_V10_2 * 2) 23523e7f8a8dSJohn Baldwin 23533e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 23543e7f8a8dSJohn Baldwin minor) \ 23553e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 23563e7f8a8dSJohn Baldwin auth_alg, minor, short) \ 23573e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235865bd3adbSJohn Baldwin auth_alg, minor, long) \ 235965bd3adbSJohn Baldwin ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 236065bd3adbSJohn Baldwin auth_alg, minor) \ 236165bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 236265bd3adbSJohn Baldwin auth_alg, minor) \ 236365bd3adbSJohn Baldwin ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 236465bd3adbSJohn Baldwin auth_alg, minor) \ 236565bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 236665bd3adbSJohn Baldwin auth_alg, minor) \ 236765bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 236865bd3adbSJohn Baldwin auth_alg, minor) \ 236965bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 237065bd3adbSJohn Baldwin auth_alg, minor, small_record) \ 237165bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 237265bd3adbSJohn Baldwin auth_alg, minor, oversized_record) 23733e7f8a8dSJohn Baldwin 23743e7f8a8dSJohn Baldwin /* 237565bd3adbSJohn Baldwin * For each supported cipher suite, run several receive tests: 23763e7f8a8dSJohn Baldwin * 23773e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 23783e7f8a8dSJohn Baldwin * a single TLS record) 23793e7f8a8dSJohn Baldwin * 23803e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across 23813e7f8a8dSJohn Baldwin * multiple TLS records) 238265bd3adbSJohn Baldwin * 238365bd3adbSJohn Baldwin * - a test with corrupted payload data in a single TLS record 238465bd3adbSJohn Baldwin * 238565bd3adbSJohn Baldwin * - a test with a corrupted MAC in a single TLS record 238665bd3adbSJohn Baldwin * 238765bd3adbSJohn Baldwin * - a test with a truncated TLS record 238865bd3adbSJohn Baldwin * 238965bd3adbSJohn Baldwin * - tests with invalid TLS major and minor versions 239065bd3adbSJohn Baldwin * 239165bd3adbSJohn Baldwin * - a tests with a record whose is one less than the smallest valid 239265bd3adbSJohn Baldwin * size 239365bd3adbSJohn Baldwin * 239465bd3adbSJohn Baldwin * - a test with an oversized TLS record 23953e7f8a8dSJohn Baldwin */ 239664811651SJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_TESTS); 239705a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS); 239805a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS); 239905a1d0f5SJohn Baldwin 240064811651SJohn Baldwin #define GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 240164811651SJohn Baldwin key_size, auth_alg, minor) \ 240264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 240364811651SJohn Baldwin auth_alg, minor, padding_1, 1, 0) \ 240464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 240564811651SJohn Baldwin auth_alg, minor, padding_2, 2, 0) \ 240664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 240764811651SJohn Baldwin auth_alg, minor, padding_3, 3, 0) \ 240864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 240964811651SJohn Baldwin auth_alg, minor, padding_4, 4, 0) \ 241064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 241164811651SJohn Baldwin auth_alg, minor, padding_5, 5, 0) \ 241264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 241364811651SJohn Baldwin auth_alg, minor, padding_6, 6, 0) \ 241464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 241564811651SJohn Baldwin auth_alg, minor, padding_7, 7, 0) \ 241664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 241764811651SJohn Baldwin auth_alg, minor, padding_8, 8, 0) \ 241864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 241964811651SJohn Baldwin auth_alg, minor, padding_9, 9, 0) \ 242064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242164811651SJohn Baldwin auth_alg, minor, padding_10, 10, 0) \ 242264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242364811651SJohn Baldwin auth_alg, minor, padding_11, 11, 0) \ 242464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242564811651SJohn Baldwin auth_alg, minor, padding_12, 12, 0) \ 242664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242764811651SJohn Baldwin auth_alg, minor, padding_13, 13, 0) \ 242864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242964811651SJohn Baldwin auth_alg, minor, padding_14, 14, 0) \ 243064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243164811651SJohn Baldwin auth_alg, minor, padding_15, 15, 0) \ 243264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243364811651SJohn Baldwin auth_alg, minor, padding_16, 16, 0) \ 243464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243564811651SJohn Baldwin auth_alg, minor, padding_16_extra, 16, 16) \ 243664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243764811651SJohn Baldwin auth_alg, minor, padding_32_extra, 16, 32) 243864811651SJohn Baldwin 243964811651SJohn Baldwin #define ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 244064811651SJohn Baldwin key_size, auth_alg, minor) \ 244164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244264811651SJohn Baldwin auth_alg, minor, padding_1) \ 244364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244464811651SJohn Baldwin auth_alg, minor, padding_2) \ 244564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244664811651SJohn Baldwin auth_alg, minor, padding_3) \ 244764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244864811651SJohn Baldwin auth_alg, minor, padding_4) \ 244964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245064811651SJohn Baldwin auth_alg, minor, padding_5) \ 245164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245264811651SJohn Baldwin auth_alg, minor, padding_6) \ 245364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245464811651SJohn Baldwin auth_alg, minor, padding_7) \ 245564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245664811651SJohn Baldwin auth_alg, minor, padding_8) \ 245764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245864811651SJohn Baldwin auth_alg, minor, padding_9) \ 245964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246064811651SJohn Baldwin auth_alg, minor, padding_10) \ 246164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246264811651SJohn Baldwin auth_alg, minor, padding_11) \ 246364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246464811651SJohn Baldwin auth_alg, minor, padding_12) \ 246564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246664811651SJohn Baldwin auth_alg, minor, padding_13) \ 246764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246864811651SJohn Baldwin auth_alg, minor, padding_14) \ 246964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247064811651SJohn Baldwin auth_alg, minor, padding_15) \ 247164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247264811651SJohn Baldwin auth_alg, minor, padding_16) \ 247364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247464811651SJohn Baldwin auth_alg, minor, padding_16_extra) \ 247564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247664811651SJohn Baldwin auth_alg, minor, padding_32_extra) 247764811651SJohn Baldwin 247865bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 247965bd3adbSJohn Baldwin auth_alg, minor, len) \ 248065bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_padding); \ 248165bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc) \ 248265bd3adbSJohn Baldwin { \ 248365bd3adbSJohn Baldwin struct tls_enable en; \ 248465bd3adbSJohn Baldwin uint64_t seqno; \ 248565bd3adbSJohn Baldwin \ 248665bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 248765bd3adbSJohn Baldwin seqno = random(); \ 2488*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2489*70bb2286SJohn Baldwin seqno, &en); \ 249065bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(tc, &en, seqno, len); \ 249165bd3adbSJohn Baldwin free_tls_enable(&en); \ 249265bd3adbSJohn Baldwin } 249365bd3adbSJohn Baldwin 249465bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 249565bd3adbSJohn Baldwin auth_alg, minor) \ 249665bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_padding); 249765bd3adbSJohn Baldwin 249865bd3adbSJohn Baldwin #define GEN_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \ 249965bd3adbSJohn Baldwin auth_alg, minor) \ 250065bd3adbSJohn Baldwin GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 250165bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 250265bd3adbSJohn Baldwin GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 250365bd3adbSJohn Baldwin auth_alg, minor, 64) \ 250465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 250565bd3adbSJohn Baldwin auth_alg, minor, non_block_size, \ 250665bd3adbSJohn Baldwin tls_minimum_record_payload(&en) + 1) 250765bd3adbSJohn Baldwin 250865bd3adbSJohn Baldwin #define ADD_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \ 250965bd3adbSJohn Baldwin auth_alg, minor) \ 251065bd3adbSJohn Baldwin ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 251165bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 251265bd3adbSJohn Baldwin ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 251365bd3adbSJohn Baldwin auth_alg, minor) \ 251465bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 251565bd3adbSJohn Baldwin auth_alg, minor, non_block_size) 251665bd3adbSJohn Baldwin 251764811651SJohn Baldwin /* 251864811651SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 251964811651SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 252064811651SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 252164811651SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 252264811651SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 252364811651SJohn Baldwin * of the possible padding lengths for each suite. 252464811651SJohn Baldwin * 252564811651SJohn Baldwin * Two additional tests check for additional padding with an extra 252664811651SJohn Baldwin * 16 or 32 bytes beyond the normal padding. 252765bd3adbSJohn Baldwin * 252865bd3adbSJohn Baldwin * Another test checks for corrupted padding. 252965bd3adbSJohn Baldwin * 253065bd3adbSJohn Baldwin * Another test checks for a record whose payload is not a multiple of 253165bd3adbSJohn Baldwin * the AES block size. 253264811651SJohn Baldwin */ 253365bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_MTE_TESTS); 253464811651SJohn Baldwin 253565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 253665bd3adbSJohn Baldwin auth_alg, minor) \ 253765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_iv); \ 253865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc) \ 253965bd3adbSJohn Baldwin { \ 254065bd3adbSJohn Baldwin struct tls_enable en; \ 254165bd3adbSJohn Baldwin uint64_t seqno; \ 254265bd3adbSJohn Baldwin \ 254365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 254465bd3adbSJohn Baldwin seqno = random(); \ 2545*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2546*70bb2286SJohn Baldwin seqno, &en); \ 254765bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(tc, &en, seqno, 64); \ 254865bd3adbSJohn Baldwin free_tls_enable(&en); \ 254965bd3adbSJohn Baldwin } 255065bd3adbSJohn Baldwin 255165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 255265bd3adbSJohn Baldwin auth_alg, minor) \ 255365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_iv); 255465bd3adbSJohn Baldwin 255565bd3adbSJohn Baldwin #define GEN_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \ 255664811651SJohn Baldwin key_size, auth_alg, minor) \ 255765bd3adbSJohn Baldwin GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 255865bd3adbSJohn Baldwin auth_alg, minor) \ 255965bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 256065bd3adbSJohn Baldwin auth_alg, minor, short_header, \ 256165bd3adbSJohn Baldwin sizeof(struct tls_record_layer) + 1) 256265bd3adbSJohn Baldwin 256365bd3adbSJohn Baldwin #define ADD_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \ 256465bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 256565bd3adbSJohn Baldwin ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 256665bd3adbSJohn Baldwin auth_alg, minor) \ 256765bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 256865bd3adbSJohn Baldwin auth_alg, minor, short_header) 256965bd3adbSJohn Baldwin 257065bd3adbSJohn Baldwin /* 257165bd3adbSJohn Baldwin * For cipher suites with an explicit IV, run a receive test where the 257265bd3adbSJohn Baldwin * explicit IV has been corrupted. Also run a receive test that sends 257365bd3adbSJohn Baldwin * a short record without a complete IV. 257465bd3adbSJohn Baldwin */ 257565bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS); 257665bd3adbSJohn Baldwin AES_GCM_12_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS); 257765bd3adbSJohn Baldwin 257865bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 257965bd3adbSJohn Baldwin auth_alg, minor, len) \ 258065bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_type); \ 258165bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc) \ 258265bd3adbSJohn Baldwin { \ 258365bd3adbSJohn Baldwin struct tls_enable en; \ 258465bd3adbSJohn Baldwin uint64_t seqno; \ 258565bd3adbSJohn Baldwin \ 258665bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 258765bd3adbSJohn Baldwin seqno = random(); \ 2588*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2589*70bb2286SJohn Baldwin seqno, &en); \ 259065bd3adbSJohn Baldwin test_ktls_receive_bad_type(tc, &en, seqno, len); \ 259165bd3adbSJohn Baldwin free_tls_enable(&en); \ 259265bd3adbSJohn Baldwin } 259365bd3adbSJohn Baldwin 259465bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 259565bd3adbSJohn Baldwin auth_alg, minor) \ 259665bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_type); 259765bd3adbSJohn Baldwin 259865bd3adbSJohn Baldwin #define GEN_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \ 259965bd3adbSJohn Baldwin auth_alg, minor) \ 260005a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 260105a1d0f5SJohn Baldwin auth_alg, minor, short_padded, 64, 16) \ 260205a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 260365bd3adbSJohn Baldwin auth_alg, minor, long_padded, 64 * 1024, 15) \ 260465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 260565bd3adbSJohn Baldwin auth_alg, minor, 64) 260605a1d0f5SJohn Baldwin 260765bd3adbSJohn Baldwin #define ADD_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \ 260865bd3adbSJohn Baldwin auth_alg, minor) \ 260905a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 261005a1d0f5SJohn Baldwin auth_alg, minor, short_padded) \ 261105a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 261265bd3adbSJohn Baldwin auth_alg, minor, long_padded) \ 261365bd3adbSJohn Baldwin ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 261465bd3adbSJohn Baldwin auth_alg, minor) 261505a1d0f5SJohn Baldwin 261605a1d0f5SJohn Baldwin /* 261705a1d0f5SJohn Baldwin * For TLS 1.3 cipher suites, run two additional receive tests which 261865bd3adbSJohn Baldwin * use add padding to each record. Also run a test that uses an 261965bd3adbSJohn Baldwin * invalid "outer" record type. 262005a1d0f5SJohn Baldwin */ 262165bd3adbSJohn Baldwin TLS_13_TESTS(GEN_RECEIVE_TLS13_TESTS); 26223e7f8a8dSJohn Baldwin 2623233ce578SJohn Baldwin static void 26242400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc, 26252400a7b1SJohn Baldwin struct tls_enable *en) 2626233ce578SJohn Baldwin { 2627233ce578SJohn Baldwin int sockets[2]; 2628233ce578SJohn Baldwin 26292400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 2630233ce578SJohn Baldwin 2631233ce578SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 2632233ce578SJohn Baldwin sizeof(*en)) == -1); 263305a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 2634233ce578SJohn Baldwin 26352c105205SJohn Baldwin close_sockets(sockets); 2636233ce578SJohn Baldwin } 2637233ce578SJohn Baldwin 2638233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 2639233ce578SJohn Baldwin minor) \ 2640233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name); \ 2641233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc) \ 2642233ce578SJohn Baldwin { \ 2643233ce578SJohn Baldwin struct tls_enable en; \ 2644233ce578SJohn Baldwin uint64_t seqno; \ 2645233ce578SJohn Baldwin \ 2646233ce578SJohn Baldwin ATF_REQUIRE_KTLS(); \ 2647233ce578SJohn Baldwin seqno = random(); \ 2648*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2649*70bb2286SJohn Baldwin seqno, &en); \ 26502400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(tc, &en); \ 2651233ce578SJohn Baldwin free_tls_enable(&en); \ 2652233ce578SJohn Baldwin } 2653233ce578SJohn Baldwin 2654233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 2655233ce578SJohn Baldwin minor) \ 2656233ce578SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name); 2657233ce578SJohn Baldwin 2658233ce578SJohn Baldwin /* 2659233ce578SJohn Baldwin * Ensure that invalid cipher suites are rejected for receive. 2660233ce578SJohn Baldwin */ 2661233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST); 2662233ce578SJohn Baldwin 266383a54b58SJohn Baldwin static void 26642400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc, 26652400a7b1SJohn Baldwin struct tls_enable *en) 266683a54b58SJohn Baldwin { 266783a54b58SJohn Baldwin int sockets[2]; 266883a54b58SJohn Baldwin 26692400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 267083a54b58SJohn Baldwin 267183a54b58SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 267283a54b58SJohn Baldwin sizeof(*en)) == -1); 267305a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EPROTONOSUPPORT); 267483a54b58SJohn Baldwin 26752c105205SJohn Baldwin close_sockets(sockets); 267683a54b58SJohn Baldwin } 267783a54b58SJohn Baldwin 267883a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 267983a54b58SJohn Baldwin auth_alg, minor) \ 268083a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name); \ 268183a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \ 268283a54b58SJohn Baldwin { \ 268383a54b58SJohn Baldwin struct tls_enable en; \ 268483a54b58SJohn Baldwin uint64_t seqno; \ 268583a54b58SJohn Baldwin \ 268683a54b58SJohn Baldwin ATF_REQUIRE_KTLS(); \ 268783a54b58SJohn Baldwin seqno = random(); \ 2688*70bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 2689*70bb2286SJohn Baldwin seqno, &en); \ 26902400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(tc, &en); \ 269183a54b58SJohn Baldwin free_tls_enable(&en); \ 269283a54b58SJohn Baldwin } 269383a54b58SJohn Baldwin 269483a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 269583a54b58SJohn Baldwin auth_alg, minor) \ 269683a54b58SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name); 269783a54b58SJohn Baldwin 269883a54b58SJohn Baldwin /* 269983a54b58SJohn Baldwin * Ensure that valid cipher suites not supported for receive are 270083a54b58SJohn Baldwin * rejected. 270183a54b58SJohn Baldwin */ 270264811651SJohn Baldwin TLS_10_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST); 270383a54b58SJohn Baldwin 2704ee5686c6SMark Johnston /* 2705ee5686c6SMark Johnston * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise 2706ee5686c6SMark Johnston * KTLS error handling in the socket layer. 2707ee5686c6SMark Johnston */ 2708ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst); 2709ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc) 2710ee5686c6SMark Johnston { 2711ee5686c6SMark Johnston char buf[32]; 2712ee5686c6SMark Johnston struct sockaddr_in dst; 2713ee5686c6SMark Johnston struct tls_enable en; 2714ee5686c6SMark Johnston ssize_t n; 2715ee5686c6SMark Johnston int s; 2716ee5686c6SMark Johnston 2717ee5686c6SMark Johnston ATF_REQUIRE_KTLS(); 2718ee5686c6SMark Johnston 2719ee5686c6SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 2720ee5686c6SMark Johnston ATF_REQUIRE(s >= 0); 2721ee5686c6SMark Johnston 2722*70bb2286SJohn Baldwin build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, 2723ee5686c6SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en); 2724ee5686c6SMark Johnston 2725ee5686c6SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, 2726ee5686c6SMark Johnston sizeof(en)) == 0); 2727ee5686c6SMark Johnston 2728ee5686c6SMark Johnston memset(&dst, 0, sizeof(dst)); 2729ee5686c6SMark Johnston dst.sin_family = AF_INET; 2730ee5686c6SMark Johnston dst.sin_len = sizeof(dst); 2731ee5686c6SMark Johnston dst.sin_addr.s_addr = htonl(INADDR_BROADCAST); 2732ee5686c6SMark Johnston dst.sin_port = htons(12345); 2733ee5686c6SMark Johnston 2734ee5686c6SMark Johnston memset(buf, 0, sizeof(buf)); 2735ee5686c6SMark Johnston n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst, 2736ee5686c6SMark Johnston sizeof(dst)); 2737ee5686c6SMark Johnston 2738ee5686c6SMark Johnston /* Can't transmit to the broadcast address over TCP. */ 2739ee5686c6SMark Johnston ATF_REQUIRE_ERRNO(EACCES, n == -1); 2740ee5686c6SMark Johnston ATF_REQUIRE(close(s) == 0); 2741ee5686c6SMark Johnston } 2742ee5686c6SMark Johnston 2743a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp) 2744a10482eaSJohn Baldwin { 27453e7f8a8dSJohn Baldwin /* Transmit tests */ 2746a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS); 2747a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS); 2748a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS); 274944265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS); 27505de79eedSMark Johnston AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 27515de79eedSMark Johnston AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 27525de79eedSMark Johnston CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 2753d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST); 2754a10482eaSJohn Baldwin 27553e7f8a8dSJohn Baldwin /* Receive tests */ 275664811651SJohn Baldwin TLS_10_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST); 275764811651SJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_TESTS); 275805a1d0f5SJohn Baldwin AES_GCM_TESTS(ADD_RECEIVE_TESTS); 275905a1d0f5SJohn Baldwin CHACHA20_TESTS(ADD_RECEIVE_TESTS); 276065bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_MTE_TESTS); 276165bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS); 276265bd3adbSJohn Baldwin AES_GCM_12_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS); 276365bd3adbSJohn Baldwin TLS_13_TESTS(ADD_RECEIVE_TLS13_TESTS); 2764233ce578SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST); 2765233ce578SJohn Baldwin 2766ee5686c6SMark Johnston /* Miscellaneous */ 2767ee5686c6SMark Johnston ATF_TP_ADD_TC(tp, ktls_sendto_baddst); 2768ee5686c6SMark Johnston 2769a10482eaSJohn Baldwin return (atf_no_error()); 2770a10482eaSJohn Baldwin } 2771