1a10482eaSJohn Baldwin /*- 2a10482eaSJohn Baldwin * SPDX-License-Identifier: BSD-2-Clause 3a10482eaSJohn Baldwin * 4a10482eaSJohn Baldwin * Copyright (c) 2021 Netflix Inc. 5a10482eaSJohn Baldwin * Written by: John Baldwin <jhb@FreeBSD.org> 6a10482eaSJohn Baldwin * 7a10482eaSJohn Baldwin * Redistribution and use in source and binary forms, with or without 8a10482eaSJohn Baldwin * modification, are permitted provided that the following conditions 9a10482eaSJohn Baldwin * are met: 10a10482eaSJohn Baldwin * 1. Redistributions of source code must retain the above copyright 11a10482eaSJohn Baldwin * notice, this list of conditions and the following disclaimer. 12a10482eaSJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 13a10482eaSJohn Baldwin * notice, this list of conditions and the following disclaimer in the 14a10482eaSJohn Baldwin * documentation and/or other materials provided with the distribution. 15a10482eaSJohn Baldwin * 16a10482eaSJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17a10482eaSJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18a10482eaSJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19a10482eaSJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20a10482eaSJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21a10482eaSJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22a10482eaSJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23a10482eaSJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24a10482eaSJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25a10482eaSJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26a10482eaSJohn Baldwin * SUCH DAMAGE. 27a10482eaSJohn Baldwin */ 28a10482eaSJohn Baldwin 2965bd3adbSJohn Baldwin #include <sys/param.h> 30a10482eaSJohn Baldwin #include <sys/endian.h> 31a10482eaSJohn Baldwin #include <sys/event.h> 32a10482eaSJohn Baldwin #include <sys/ktls.h> 33a10482eaSJohn Baldwin #include <sys/socket.h> 34a10482eaSJohn Baldwin #include <sys/sysctl.h> 35a10482eaSJohn Baldwin #include <netinet/in.h> 36a10482eaSJohn Baldwin #include <netinet/tcp.h> 37a10482eaSJohn Baldwin #include <crypto/cryptodev.h> 38a10482eaSJohn Baldwin #include <assert.h> 39a10482eaSJohn Baldwin #include <err.h> 40a10482eaSJohn Baldwin #include <fcntl.h> 4170bb2286SJohn Baldwin #include <libutil.h> 422400a7b1SJohn Baldwin #include <netdb.h> 43a10482eaSJohn Baldwin #include <poll.h> 44a10482eaSJohn Baldwin #include <stdbool.h> 45a10482eaSJohn Baldwin #include <stdlib.h> 46a10482eaSJohn Baldwin #include <atf-c.h> 47a10482eaSJohn Baldwin 48a10482eaSJohn Baldwin #include <openssl/err.h> 49a10482eaSJohn Baldwin #include <openssl/evp.h> 50a10482eaSJohn Baldwin #include <openssl/hmac.h> 51a10482eaSJohn Baldwin 52a10482eaSJohn Baldwin static void 53a10482eaSJohn Baldwin require_ktls(void) 54a10482eaSJohn Baldwin { 55a10482eaSJohn Baldwin size_t len; 56a10482eaSJohn Baldwin bool enable; 57a10482eaSJohn Baldwin 58a10482eaSJohn Baldwin len = sizeof(enable); 59a10482eaSJohn Baldwin if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) { 60a10482eaSJohn Baldwin if (errno == ENOENT) 61a10482eaSJohn Baldwin atf_tc_skip("kernel does not support TLS offload"); 62a10482eaSJohn Baldwin atf_libc_error(errno, "Failed to read kern.ipc.tls.enable"); 63a10482eaSJohn Baldwin } 64a10482eaSJohn Baldwin 65a10482eaSJohn Baldwin if (!enable) 66a10482eaSJohn Baldwin atf_tc_skip("Kernel TLS is disabled"); 67a10482eaSJohn Baldwin } 68a10482eaSJohn Baldwin 69a10482eaSJohn Baldwin #define ATF_REQUIRE_KTLS() require_ktls() 70a10482eaSJohn Baldwin 71ea4ebdcbSJohn Baldwin static void 72ea4ebdcbSJohn Baldwin check_tls_mode(const atf_tc_t *tc, int s, int sockopt) 73ea4ebdcbSJohn Baldwin { 74ea4ebdcbSJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_ifnet", false)) { 75ea4ebdcbSJohn Baldwin socklen_t len; 76ea4ebdcbSJohn Baldwin int mode; 77ea4ebdcbSJohn Baldwin 78ea4ebdcbSJohn Baldwin len = sizeof(mode); 79ea4ebdcbSJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1) 80ea4ebdcbSJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode"); 81ea4ebdcbSJohn Baldwin 82ea4ebdcbSJohn Baldwin if (mode != TCP_TLS_MODE_IFNET) 83ea4ebdcbSJohn Baldwin atf_tc_skip("connection did not use ifnet TLS"); 84ea4ebdcbSJohn Baldwin } 85cc13c983SJohn Baldwin 86cc13c983SJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_toe", false)) { 87cc13c983SJohn Baldwin socklen_t len; 88cc13c983SJohn Baldwin int mode; 89cc13c983SJohn Baldwin 90cc13c983SJohn Baldwin len = sizeof(mode); 91cc13c983SJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1) 92cc13c983SJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode"); 93cc13c983SJohn Baldwin 94cc13c983SJohn Baldwin if (mode != TCP_TLS_MODE_TOE) 95cc13c983SJohn Baldwin atf_tc_skip("connection did not use TOE TLS"); 96cc13c983SJohn Baldwin } 97ea4ebdcbSJohn Baldwin } 98ea4ebdcbSJohn Baldwin 9970bb2286SJohn Baldwin static void __printflike(2, 3) 10070bb2286SJohn Baldwin debug(const atf_tc_t *tc, const char *fmt, ...) 10170bb2286SJohn Baldwin { 10270bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false)) 10370bb2286SJohn Baldwin return; 10470bb2286SJohn Baldwin 10570bb2286SJohn Baldwin va_list ap; 10670bb2286SJohn Baldwin va_start(ap, fmt); 10770bb2286SJohn Baldwin vprintf(fmt, ap); 10870bb2286SJohn Baldwin va_end(ap); 10970bb2286SJohn Baldwin } 11070bb2286SJohn Baldwin 11170bb2286SJohn Baldwin static void 11270bb2286SJohn Baldwin debug_hexdump(const atf_tc_t *tc, const void *buf, int length, 11370bb2286SJohn Baldwin const char *label) 11470bb2286SJohn Baldwin { 11570bb2286SJohn Baldwin if (!atf_tc_get_config_var_as_bool_wd(tc, "ktls.debug", false)) 11670bb2286SJohn Baldwin return; 11770bb2286SJohn Baldwin 11870bb2286SJohn Baldwin if (label != NULL) 11970bb2286SJohn Baldwin printf("%s:\n", label); 12070bb2286SJohn Baldwin hexdump(buf, length, NULL, 0); 12170bb2286SJohn Baldwin } 12270bb2286SJohn Baldwin 123a10482eaSJohn Baldwin static char 124a10482eaSJohn Baldwin rdigit(void) 125a10482eaSJohn Baldwin { 126a10482eaSJohn Baldwin /* ASCII printable values between 0x20 and 0x7e */ 127a10482eaSJohn Baldwin return (0x20 + random() % (0x7f - 0x20)); 128a10482eaSJohn Baldwin } 129a10482eaSJohn Baldwin 130a10482eaSJohn Baldwin static char * 131a10482eaSJohn Baldwin alloc_buffer(size_t len) 132a10482eaSJohn Baldwin { 133a10482eaSJohn Baldwin char *buf; 134a10482eaSJohn Baldwin size_t i; 135a10482eaSJohn Baldwin 136a10482eaSJohn Baldwin if (len == 0) 137a10482eaSJohn Baldwin return (NULL); 138a10482eaSJohn Baldwin buf = malloc(len); 139a10482eaSJohn Baldwin for (i = 0; i < len; i++) 140a10482eaSJohn Baldwin buf[i] = rdigit(); 141a10482eaSJohn Baldwin return (buf); 142a10482eaSJohn Baldwin } 143a10482eaSJohn Baldwin 144a10482eaSJohn Baldwin static bool 1452c105205SJohn Baldwin socketpair_tcp(int sv[2]) 146a10482eaSJohn Baldwin { 147a10482eaSJohn Baldwin struct pollfd pfd; 148a10482eaSJohn Baldwin struct sockaddr_in sin; 149a10482eaSJohn Baldwin socklen_t len; 150a10482eaSJohn Baldwin int as, cs, ls; 151a10482eaSJohn Baldwin 152a10482eaSJohn Baldwin ls = socket(PF_INET, SOCK_STREAM, 0); 153a10482eaSJohn Baldwin if (ls == -1) { 154a10482eaSJohn Baldwin warn("socket() for listen"); 155a10482eaSJohn Baldwin return (false); 156a10482eaSJohn Baldwin } 157a10482eaSJohn Baldwin 158a10482eaSJohn Baldwin memset(&sin, 0, sizeof(sin)); 159a10482eaSJohn Baldwin sin.sin_len = sizeof(sin); 160a10482eaSJohn Baldwin sin.sin_family = AF_INET; 161a10482eaSJohn Baldwin sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 162a10482eaSJohn Baldwin if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 163a10482eaSJohn Baldwin warn("bind"); 164a10482eaSJohn Baldwin close(ls); 165a10482eaSJohn Baldwin return (false); 166a10482eaSJohn Baldwin } 167a10482eaSJohn Baldwin 168a10482eaSJohn Baldwin if (listen(ls, 1) == -1) { 169a10482eaSJohn Baldwin warn("listen"); 170a10482eaSJohn Baldwin close(ls); 171a10482eaSJohn Baldwin return (false); 172a10482eaSJohn Baldwin } 173a10482eaSJohn Baldwin 174a10482eaSJohn Baldwin len = sizeof(sin); 175a10482eaSJohn Baldwin if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) { 176a10482eaSJohn Baldwin warn("getsockname"); 177a10482eaSJohn Baldwin close(ls); 178a10482eaSJohn Baldwin return (false); 179a10482eaSJohn Baldwin } 180a10482eaSJohn Baldwin 181a10482eaSJohn Baldwin cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); 182a10482eaSJohn Baldwin if (cs == -1) { 183a10482eaSJohn Baldwin warn("socket() for connect"); 184a10482eaSJohn Baldwin close(ls); 185a10482eaSJohn Baldwin return (false); 186a10482eaSJohn Baldwin } 187a10482eaSJohn Baldwin 188a10482eaSJohn Baldwin if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 189a10482eaSJohn Baldwin if (errno != EINPROGRESS) { 190a10482eaSJohn Baldwin warn("connect"); 191a10482eaSJohn Baldwin close(ls); 192a10482eaSJohn Baldwin close(cs); 193a10482eaSJohn Baldwin return (false); 194a10482eaSJohn Baldwin } 195a10482eaSJohn Baldwin } 196a10482eaSJohn Baldwin 197a10482eaSJohn Baldwin as = accept4(ls, NULL, NULL, SOCK_NONBLOCK); 198a10482eaSJohn Baldwin if (as == -1) { 199a10482eaSJohn Baldwin warn("accept4"); 200a10482eaSJohn Baldwin close(ls); 201a10482eaSJohn Baldwin close(cs); 202a10482eaSJohn Baldwin return (false); 203a10482eaSJohn Baldwin } 204a10482eaSJohn Baldwin 205a10482eaSJohn Baldwin close(ls); 206a10482eaSJohn Baldwin 207a10482eaSJohn Baldwin pfd.fd = cs; 208a10482eaSJohn Baldwin pfd.events = POLLOUT; 209a10482eaSJohn Baldwin pfd.revents = 0; 210*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(1, poll(&pfd, 1, INFTIM)); 211*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(POLLOUT, pfd.revents); 212a10482eaSJohn Baldwin 213a10482eaSJohn Baldwin sv[0] = cs; 214a10482eaSJohn Baldwin sv[1] = as; 215a10482eaSJohn Baldwin return (true); 216a10482eaSJohn Baldwin } 217a10482eaSJohn Baldwin 2182400a7b1SJohn Baldwin static bool 2192400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2]) 2202400a7b1SJohn Baldwin { 2212400a7b1SJohn Baldwin const char *cause, *host, *port; 2222400a7b1SJohn Baldwin struct addrinfo hints, *ai, *tofree; 2232400a7b1SJohn Baldwin int error, flags, s; 2242400a7b1SJohn Baldwin 2252400a7b1SJohn Baldwin host = atf_tc_get_config_var(tc, "ktls.host"); 2262400a7b1SJohn Baldwin port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo"); 2272400a7b1SJohn Baldwin memset(&hints, 0, sizeof(hints)); 2282400a7b1SJohn Baldwin hints.ai_family = AF_UNSPEC; 2292400a7b1SJohn Baldwin hints.ai_socktype = SOCK_STREAM; 2302400a7b1SJohn Baldwin hints.ai_protocol = IPPROTO_TCP; 2312400a7b1SJohn Baldwin error = getaddrinfo(host, port, &hints, &tofree); 2322400a7b1SJohn Baldwin if (error != 0) { 2332400a7b1SJohn Baldwin warnx("getaddrinfo(%s:%s) failed: %s", host, port, 2342400a7b1SJohn Baldwin gai_strerror(error)); 2352400a7b1SJohn Baldwin return (false); 2362400a7b1SJohn Baldwin } 2372400a7b1SJohn Baldwin 2382400a7b1SJohn Baldwin cause = NULL; 2392400a7b1SJohn Baldwin for (ai = tofree; ai != NULL; ai = ai->ai_next) { 2402400a7b1SJohn Baldwin s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); 2412400a7b1SJohn Baldwin if (s == -1) { 2422400a7b1SJohn Baldwin cause = "socket"; 2432400a7b1SJohn Baldwin error = errno; 2442400a7b1SJohn Baldwin continue; 2452400a7b1SJohn Baldwin } 2462400a7b1SJohn Baldwin 2472400a7b1SJohn Baldwin if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) { 2482400a7b1SJohn Baldwin cause = "connect"; 2492400a7b1SJohn Baldwin error = errno; 2502400a7b1SJohn Baldwin close(s); 2512400a7b1SJohn Baldwin continue; 2522400a7b1SJohn Baldwin } 2532400a7b1SJohn Baldwin 2542400a7b1SJohn Baldwin freeaddrinfo(tofree); 2552400a7b1SJohn Baldwin 2562400a7b1SJohn Baldwin ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1); 2572400a7b1SJohn Baldwin flags |= O_NONBLOCK; 2582400a7b1SJohn Baldwin ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1); 2592400a7b1SJohn Baldwin 2602400a7b1SJohn Baldwin sv[0] = s; 2612400a7b1SJohn Baldwin sv[1] = s; 2622400a7b1SJohn Baldwin return (true); 2632400a7b1SJohn Baldwin } 2642400a7b1SJohn Baldwin 2652400a7b1SJohn Baldwin warnc(error, "%s", cause); 2662400a7b1SJohn Baldwin freeaddrinfo(tofree); 2672400a7b1SJohn Baldwin return (false); 2682400a7b1SJohn Baldwin } 2692400a7b1SJohn Baldwin 2702400a7b1SJohn Baldwin static bool 2712400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2]) 2722400a7b1SJohn Baldwin { 2732400a7b1SJohn Baldwin if (atf_tc_has_config_var(tc, "ktls.host")) 2742400a7b1SJohn Baldwin return (echo_socket(tc, sv)); 2752400a7b1SJohn Baldwin else 2762400a7b1SJohn Baldwin return (socketpair_tcp(sv)); 2772400a7b1SJohn Baldwin } 2782400a7b1SJohn Baldwin 279a10482eaSJohn Baldwin static void 2802c105205SJohn Baldwin close_sockets(int sv[2]) 2812c105205SJohn Baldwin { 2822400a7b1SJohn Baldwin if (sv[0] != sv[1]) 2832c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0); 2842c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0); 2852c105205SJohn Baldwin } 2862c105205SJohn Baldwin 2872c105205SJohn Baldwin static void 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 53770bb2286SJohn Baldwin build_tls_enable(const atf_tc_t *tc, int cipher_alg, size_t cipher_key_len, 53870bb2286SJohn 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); 57970bb2286SJohn Baldwin debug_hexdump(tc, en->cipher_key, cipher_key_len, "cipher key"); 580a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len); 58170bb2286SJohn Baldwin if (iv_len != 0) 58270bb2286SJohn Baldwin debug_hexdump(tc, en->iv, iv_len, "iv"); 583a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len); 58470bb2286SJohn Baldwin if (auth_key_len != 0) 58570bb2286SJohn 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); 59470bb2286SJohn 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 78470bb2286SJohn Baldwin decrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en, 78570bb2286SJohn Baldwin uint64_t seqno, const void *src, size_t len, void *dst, size_t avail, 78670bb2286SJohn 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); 798*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor); 799*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(en->tls_vminor, hdr->tls_vminor); 80070bb2286SJohn Baldwin debug(tc, "decrypting MTE record seqno %ju:\n", (uintmax_t)seqno); 80170bb2286SJohn 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); 81070bb2286SJohn 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)); 81370bb2286SJohn 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; 829*883d1742SJohn Baldwin ATF_REQUIRE_MSG(padding > 0 && padding <= AES_BLOCK_LEN, 830*883d1742SJohn Baldwin "invalid padding %d", padding); 831*883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len >= mac_len + padding, 832*883d1742SJohn Baldwin "payload_len (%zu) < mac_len (%zu) + padding (%d)", payload_len, 833*883d1742SJohn Baldwin mac_len, padding); 834a10482eaSJohn Baldwin payload_len -= padding; 835a10482eaSJohn Baldwin 836a10482eaSJohn Baldwin /* Verify HMAC. */ 837a10482eaSJohn Baldwin payload_len -= mac_len; 838a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad); 83970bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 840a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 841a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len)); 842a10482eaSJohn Baldwin 843*883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len <= avail, "payload_len (%zu) < avail (%zu)", 844*883d1742SJohn Baldwin payload_len, avail); 845a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 846a10482eaSJohn Baldwin *record_type = hdr->tls_type; 847a10482eaSJohn Baldwin return (payload_len); 848a10482eaSJohn Baldwin } 849a10482eaSJohn Baldwin 850a10482eaSJohn Baldwin static size_t 85170bb2286SJohn Baldwin decrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 85270bb2286SJohn Baldwin const void *src, size_t len, void *dst, uint8_t *record_type) 853a10482eaSJohn Baldwin { 854a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 855a10482eaSJohn Baldwin struct tls_aead_data aad; 856a10482eaSJohn Baldwin char nonce[12]; 857a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 858a10482eaSJohn Baldwin 859a10482eaSJohn Baldwin hdr = src; 860a10482eaSJohn Baldwin 861a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 862a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 863a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 864*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor); 865*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, hdr->tls_vminor); 86670bb2286SJohn Baldwin debug(tc, "decrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno); 86770bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL); 868a10482eaSJohn Baldwin 869a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad); 87070bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 871a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 872a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 873a10482eaSJohn Baldwin else 874a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 87570bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 876a10482eaSJohn Baldwin 877a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 878a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len, 879a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 880a10482eaSJohn Baldwin 881a10482eaSJohn Baldwin *record_type = hdr->tls_type; 882a10482eaSJohn Baldwin return (payload_len); 883a10482eaSJohn Baldwin } 884a10482eaSJohn Baldwin 885a10482eaSJohn Baldwin static size_t 88670bb2286SJohn Baldwin decrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 88770bb2286SJohn Baldwin const void *src, size_t len, void *dst, uint8_t *record_type) 888a10482eaSJohn Baldwin { 889a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 890a10482eaSJohn Baldwin struct tls_aead_data_13 aad; 891a10482eaSJohn Baldwin char nonce[12]; 892a10482eaSJohn Baldwin char *buf; 893a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 894a10482eaSJohn Baldwin 895a10482eaSJohn Baldwin hdr = src; 896a10482eaSJohn Baldwin 897a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 898a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 899a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 900*883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len >= 1, 901*883d1742SJohn Baldwin "payload_len (%zu) too short: len %zu hdr_len %zu mac_len %zu", 902*883d1742SJohn Baldwin payload_len, len, hdr_len, mac_len); 903*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, hdr->tls_type); 904*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MAJOR_VER_ONE, hdr->tls_vmajor); 905*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, hdr->tls_vminor); 90670bb2286SJohn Baldwin debug(tc, "decrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno); 90770bb2286SJohn Baldwin debug_hexdump(tc, src, len, NULL); 908a10482eaSJohn Baldwin 909a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 91070bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 911a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 91270bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 913a10482eaSJohn Baldwin 914a10482eaSJohn Baldwin /* 915a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the 916a10482eaSJohn Baldwin * record type as the last byte of the trailer. 917a10482eaSJohn Baldwin */ 918a10482eaSJohn Baldwin buf = malloc(payload_len); 919a10482eaSJohn Baldwin 920a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 921a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len, 922a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 92370bb2286SJohn Baldwin debug_hexdump(tc, buf, payload_len, "decrypted buffer"); 924a10482eaSJohn Baldwin 925a10482eaSJohn Baldwin /* Trim record type. */ 926a10482eaSJohn Baldwin *record_type = buf[payload_len - 1]; 927a10482eaSJohn Baldwin payload_len--; 928a10482eaSJohn Baldwin 929a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 930a10482eaSJohn Baldwin free(buf); 931a10482eaSJohn Baldwin 932a10482eaSJohn Baldwin return (payload_len); 933a10482eaSJohn Baldwin } 934a10482eaSJohn Baldwin 935a10482eaSJohn Baldwin static size_t 93670bb2286SJohn Baldwin decrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 93770bb2286SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type) 938a10482eaSJohn Baldwin { 939a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 940a10482eaSJohn Baldwin size_t payload_len; 941a10482eaSJohn Baldwin 942a10482eaSJohn Baldwin hdr = src; 943*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(len, ntohs(hdr->tls_length) + sizeof(*hdr)); 944a10482eaSJohn Baldwin 945a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en)); 946*883d1742SJohn Baldwin ATF_REQUIRE_MSG(payload_len <= avail, "payload_len (%zu) > avail (%zu)", 947*883d1742SJohn Baldwin payload_len, avail); 948a10482eaSJohn Baldwin 949a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 950*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(payload_len, decrypt_tls_12_aead(tc, en, 951*883d1742SJohn Baldwin seqno, src, len, dst, record_type)); 952a10482eaSJohn Baldwin } else { 953*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(payload_len, decrypt_tls_13_aead(tc, en, 954*883d1742SJohn Baldwin seqno, src, len, dst, record_type)); 955a10482eaSJohn Baldwin } 956a10482eaSJohn Baldwin 957a10482eaSJohn Baldwin return (payload_len); 958a10482eaSJohn Baldwin } 959a10482eaSJohn Baldwin 960a10482eaSJohn Baldwin static size_t 96170bb2286SJohn Baldwin decrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en, uint64_t seqno, 96270bb2286SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, uint8_t *record_type) 963a10482eaSJohn Baldwin { 964a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 96570bb2286SJohn Baldwin return (decrypt_tls_aes_cbc_mte(tc, en, seqno, src, len, dst, 96670bb2286SJohn Baldwin avail, record_type)); 967a10482eaSJohn Baldwin else 96870bb2286SJohn Baldwin return (decrypt_tls_aead(tc, en, seqno, src, len, dst, avail, 969a10482eaSJohn Baldwin record_type)); 970a10482eaSJohn Baldwin } 971a10482eaSJohn Baldwin 9723e7f8a8dSJohn Baldwin /* 9733e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes 9743e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have 97564811651SJohn Baldwin * sufficient room ('avail'), fail the test. 'padding' is the amount 97664811651SJohn Baldwin * of additional padding to include beyond any amount mandated by the 97764811651SJohn Baldwin * cipher suite. 9783e7f8a8dSJohn Baldwin */ 9793e7f8a8dSJohn Baldwin static size_t 98070bb2286SJohn Baldwin encrypt_tls_aes_cbc_mte(const atf_tc_t *tc, struct tls_enable *en, 98170bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 98270bb2286SJohn Baldwin size_t avail, size_t padding) 98364811651SJohn Baldwin { 98464811651SJohn Baldwin struct tls_record_layer *hdr; 98564811651SJohn Baldwin struct tls_mac_data aad; 98664811651SJohn Baldwin char *buf, *iv; 98764811651SJohn Baldwin size_t hdr_len, mac_len, record_len; 98864811651SJohn Baldwin u_int digest_len, i; 98964811651SJohn Baldwin 990*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(0, padding % 16); 99164811651SJohn Baldwin 99264811651SJohn Baldwin hdr = dst; 99364811651SJohn Baldwin buf = dst; 99464811651SJohn Baldwin 99570bb2286SJohn Baldwin debug(tc, "encrypting MTE record seqno %ju:\n", (uintmax_t)seqno); 99664811651SJohn Baldwin hdr_len = tls_header_len(en); 99764811651SJohn Baldwin mac_len = tls_mac_len(en); 99864811651SJohn Baldwin padding += (AES_BLOCK_LEN - (len + mac_len) % AES_BLOCK_LEN); 999*883d1742SJohn Baldwin ATF_REQUIRE_MSG(padding > 0 && padding <= 255, "invalid padding (%zu)", 1000*883d1742SJohn Baldwin padding); 100164811651SJohn Baldwin 100264811651SJohn Baldwin record_len = hdr_len + len + mac_len + padding; 1003*883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= avail, "record_len (%zu) > avail (%zu): " 1004*883d1742SJohn Baldwin "hdr_len %zu, len %zu, mac_len %zu, padding %zu", record_len, 1005*883d1742SJohn Baldwin avail, hdr_len, len, mac_len, padding); 100664811651SJohn Baldwin 100764811651SJohn Baldwin hdr->tls_type = record_type; 100864811651SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 100964811651SJohn Baldwin hdr->tls_vminor = en->tls_vminor; 101064811651SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 101164811651SJohn Baldwin iv = (char *)(hdr + 1); 101264811651SJohn Baldwin for (i = 0; i < AES_BLOCK_LEN; i++) 101364811651SJohn Baldwin iv[i] = rdigit(); 101470bb2286SJohn Baldwin debug_hexdump(tc, iv, AES_BLOCK_LEN, "explicit IV"); 101564811651SJohn Baldwin 101664811651SJohn Baldwin /* Copy plaintext to ciphertext region. */ 101764811651SJohn Baldwin memcpy(buf + hdr_len, src, len); 101864811651SJohn Baldwin 101964811651SJohn Baldwin /* Compute HMAC. */ 102064811651SJohn Baldwin tls_mte_aad(en, len, hdr, seqno, &aad); 102170bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 102270bb2286SJohn Baldwin debug_hexdump(tc, src, len, "plaintext"); 102364811651SJohn Baldwin ATF_REQUIRE(compute_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 102464811651SJohn Baldwin &aad, sizeof(aad), src, len, buf + hdr_len + len, &digest_len)); 1025*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(mac_len, digest_len); 102664811651SJohn Baldwin 102764811651SJohn Baldwin /* Store padding. */ 102864811651SJohn Baldwin for (i = 0; i < padding; i++) 102964811651SJohn Baldwin buf[hdr_len + len + mac_len + i] = padding - 1; 1030*883d1742SJohn Baldwin debug_hexdump(tc, buf + hdr_len + len, mac_len + padding, 1031*883d1742SJohn Baldwin "MAC and padding"); 103264811651SJohn Baldwin 103364811651SJohn Baldwin /* Encrypt the record. */ 103464811651SJohn Baldwin ATF_REQUIRE(cbc_encrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 103564811651SJohn Baldwin buf + hdr_len, buf + hdr_len, len + mac_len + padding)); 103670bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record"); 103764811651SJohn Baldwin 103864811651SJohn Baldwin return (record_len); 103964811651SJohn Baldwin } 104064811651SJohn Baldwin 104164811651SJohn Baldwin static size_t 104270bb2286SJohn Baldwin encrypt_tls_12_aead(const atf_tc_t *tc, struct tls_enable *en, 104370bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst) 10443e7f8a8dSJohn Baldwin { 10453e7f8a8dSJohn Baldwin struct tls_record_layer *hdr; 10463e7f8a8dSJohn Baldwin struct tls_aead_data aad; 10473e7f8a8dSJohn Baldwin char nonce[12]; 10483e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len; 10493e7f8a8dSJohn Baldwin 10503e7f8a8dSJohn Baldwin hdr = dst; 10513e7f8a8dSJohn Baldwin 105270bb2286SJohn Baldwin debug(tc, "encrypting TLS 1.2 record seqno %ju:\n", (uintmax_t)seqno); 10533e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en); 10543e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en); 10553e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len; 10563e7f8a8dSJohn Baldwin 10573e7f8a8dSJohn Baldwin hdr->tls_type = record_type; 10583e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 10593e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 10603e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 10613e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 10623e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno)); 10633e7f8a8dSJohn Baldwin 10643e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad); 106570bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 10663e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 10673e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 10683e7f8a8dSJohn Baldwin else 10693e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce); 107070bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 10713e7f8a8dSJohn Baldwin 107270bb2286SJohn Baldwin debug_hexdump(tc, src, len, "plaintext"); 10733e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 10743e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len, 10753e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len)); 107670bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record"); 10773e7f8a8dSJohn Baldwin 10783e7f8a8dSJohn Baldwin return (record_len); 10793e7f8a8dSJohn Baldwin } 10803e7f8a8dSJohn Baldwin 10813e7f8a8dSJohn Baldwin static size_t 108270bb2286SJohn Baldwin encrypt_tls_13_aead(const atf_tc_t *tc, struct tls_enable *en, 108370bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 108470bb2286SJohn Baldwin size_t padding) 108505a1d0f5SJohn Baldwin { 108605a1d0f5SJohn Baldwin struct tls_record_layer *hdr; 108705a1d0f5SJohn Baldwin struct tls_aead_data_13 aad; 108805a1d0f5SJohn Baldwin char nonce[12]; 108905a1d0f5SJohn Baldwin char *buf; 109005a1d0f5SJohn Baldwin size_t hdr_len, mac_len, record_len; 109105a1d0f5SJohn Baldwin 109205a1d0f5SJohn Baldwin hdr = dst; 109305a1d0f5SJohn Baldwin 109470bb2286SJohn Baldwin debug(tc, "encrypting TLS 1.3 record seqno %ju:\n", (uintmax_t)seqno); 109505a1d0f5SJohn Baldwin hdr_len = tls_header_len(en); 109605a1d0f5SJohn Baldwin mac_len = tls_mac_len(en); 109705a1d0f5SJohn Baldwin record_len = hdr_len + len + 1 + padding + mac_len; 109805a1d0f5SJohn Baldwin 109905a1d0f5SJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 110005a1d0f5SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 110105a1d0f5SJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 110205a1d0f5SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 110305a1d0f5SJohn Baldwin 110405a1d0f5SJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 110570bb2286SJohn Baldwin debug_hexdump(tc, &aad, sizeof(aad), "aad"); 110605a1d0f5SJohn Baldwin tls_13_nonce(en, seqno, nonce); 110770bb2286SJohn Baldwin debug_hexdump(tc, nonce, sizeof(nonce), "nonce"); 110805a1d0f5SJohn Baldwin 110905a1d0f5SJohn Baldwin /* 111005a1d0f5SJohn Baldwin * Have to use a temporary buffer for the input so that the record 111105a1d0f5SJohn Baldwin * type can be appended. 111205a1d0f5SJohn Baldwin */ 111305a1d0f5SJohn Baldwin buf = malloc(len + 1 + padding); 111405a1d0f5SJohn Baldwin memcpy(buf, src, len); 111505a1d0f5SJohn Baldwin buf[len] = record_type; 111605a1d0f5SJohn Baldwin memset(buf + len + 1, 0, padding); 111770bb2286SJohn Baldwin debug_hexdump(tc, buf, len + 1 + padding, "plaintext + type + padding"); 111805a1d0f5SJohn Baldwin 111905a1d0f5SJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 112005a1d0f5SJohn Baldwin &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding, 112105a1d0f5SJohn Baldwin (char *)dst + hdr_len + len + 1 + padding, mac_len)); 112270bb2286SJohn Baldwin debug_hexdump(tc, dst, record_len, "encrypted record"); 112305a1d0f5SJohn Baldwin 112405a1d0f5SJohn Baldwin free(buf); 112505a1d0f5SJohn Baldwin 112605a1d0f5SJohn Baldwin return (record_len); 112705a1d0f5SJohn Baldwin } 112805a1d0f5SJohn Baldwin 112905a1d0f5SJohn Baldwin static size_t 113070bb2286SJohn Baldwin encrypt_tls_aead(const atf_tc_t *tc, struct tls_enable *en, 113170bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 113270bb2286SJohn Baldwin size_t avail, size_t padding) 11333e7f8a8dSJohn Baldwin { 11343e7f8a8dSJohn Baldwin size_t record_len; 11353e7f8a8dSJohn Baldwin 113605a1d0f5SJohn Baldwin record_len = tls_header_len(en) + len + padding + tls_trailer_len(en); 1137*883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= avail, "record_len (%zu) > avail (%zu): " 1138*883d1742SJohn Baldwin "header %zu len %zu padding %zu trailer %zu", record_len, avail, 1139*883d1742SJohn Baldwin tls_header_len(en), len, padding, tls_trailer_len(en)); 11403e7f8a8dSJohn Baldwin 114105a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 1142*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(0, padding); 1143*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(record_len, encrypt_tls_12_aead(tc, en, 1144*883d1742SJohn Baldwin record_type, seqno, src, len, dst)); 114505a1d0f5SJohn Baldwin } else 1146*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(record_len, encrypt_tls_13_aead(tc, en, 1147*883d1742SJohn Baldwin record_type, seqno, src, len, dst, padding)); 11483e7f8a8dSJohn Baldwin 11493e7f8a8dSJohn Baldwin return (record_len); 11503e7f8a8dSJohn Baldwin } 11513e7f8a8dSJohn Baldwin 11523e7f8a8dSJohn Baldwin static size_t 115370bb2286SJohn Baldwin encrypt_tls_record(const atf_tc_t *tc, struct tls_enable *en, 115470bb2286SJohn Baldwin uint8_t record_type, uint64_t seqno, const void *src, size_t len, void *dst, 115570bb2286SJohn Baldwin size_t avail, size_t padding) 11563e7f8a8dSJohn Baldwin { 115764811651SJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 115870bb2286SJohn Baldwin return (encrypt_tls_aes_cbc_mte(tc, en, record_type, seqno, src, 115964811651SJohn Baldwin len, dst, avail, padding)); 116064811651SJohn Baldwin else 116170bb2286SJohn Baldwin return (encrypt_tls_aead(tc, en, record_type, seqno, src, len, 116264811651SJohn Baldwin dst, avail, padding)); 11633e7f8a8dSJohn Baldwin } 11643e7f8a8dSJohn Baldwin 1165a10482eaSJohn Baldwin static void 11662400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en, 11672400a7b1SJohn Baldwin uint64_t seqno, size_t len) 1168a10482eaSJohn Baldwin { 1169a10482eaSJohn Baldwin struct kevent ev; 1170a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1171a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1172a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written; 1173a10482eaSJohn Baldwin ssize_t rv; 1174a10482eaSJohn Baldwin int kq, sockets[2]; 1175a10482eaSJohn Baldwin uint8_t record_type; 1176a10482eaSJohn Baldwin 1177a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 117870bb2286SJohn Baldwin debug_hexdump(tc, plaintext, len, "plaintext"); 1179a10482eaSJohn Baldwin decrypted = malloc(len); 1180a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 1181a10482eaSJohn Baldwin tls_trailer_len(en); 1182a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1183a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1184a10482eaSJohn Baldwin 1185a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 1186a10482eaSJohn Baldwin 11872400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1188a10482eaSJohn Baldwin 1189a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1190a10482eaSJohn Baldwin sizeof(*en)) == 0); 1191ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 1192a10482eaSJohn Baldwin 1193a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 1194a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1195a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 1196a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1197a10482eaSJohn Baldwin 1198a10482eaSJohn Baldwin decrypted_len = 0; 1199a10482eaSJohn Baldwin outbuf_len = 0; 1200a10482eaSJohn Baldwin written = 0; 1201a10482eaSJohn Baldwin 1202a10482eaSJohn Baldwin while (decrypted_len != len) { 1203a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 1204a10482eaSJohn Baldwin 1205a10482eaSJohn Baldwin switch (ev.filter) { 1206a10482eaSJohn Baldwin case EVFILT_WRITE: 1207a10482eaSJohn Baldwin /* Try to write any remaining data. */ 1208a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written, 1209a10482eaSJohn Baldwin len - written); 1210a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1211a10482eaSJohn Baldwin "failed to write to socket"); 1212a10482eaSJohn Baldwin written += rv; 1213a10482eaSJohn Baldwin if (written == len) { 1214a10482eaSJohn Baldwin ev.flags = EV_DISABLE; 1215a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 1216a10482eaSJohn Baldwin NULL) == 0); 1217a10482eaSJohn Baldwin } 1218a10482eaSJohn Baldwin break; 1219a10482eaSJohn Baldwin 1220a10482eaSJohn Baldwin case EVFILT_READ: 1221a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 1222a10482eaSJohn Baldwin 1223a10482eaSJohn Baldwin /* 1224a10482eaSJohn Baldwin * Try to read data for the next TLS record 1225a10482eaSJohn Baldwin * into outbuf. Start by reading the header 1226a10482eaSJohn Baldwin * to determine how much additional data to 1227a10482eaSJohn Baldwin * read. 1228a10482eaSJohn Baldwin */ 1229a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) { 1230a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1231a10482eaSJohn Baldwin sizeof(struct tls_record_layer) - 1232a10482eaSJohn Baldwin outbuf_len); 1233a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1234a10482eaSJohn Baldwin "failed to read from socket"); 1235a10482eaSJohn Baldwin outbuf_len += rv; 123670bb2286SJohn Baldwin 123770bb2286SJohn Baldwin if (outbuf_len == 123870bb2286SJohn Baldwin sizeof(struct tls_record_layer)) { 123970bb2286SJohn Baldwin debug(tc, "TLS header for seqno %ju:\n", 124070bb2286SJohn Baldwin (uintmax_t)seqno); 124170bb2286SJohn Baldwin debug_hexdump(tc, outbuf, outbuf_len, 124270bb2286SJohn Baldwin NULL); 124370bb2286SJohn Baldwin } 1244a10482eaSJohn Baldwin } 1245a10482eaSJohn Baldwin 1246a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) 1247a10482eaSJohn Baldwin break; 1248a10482eaSJohn Baldwin 1249a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) + 1250a10482eaSJohn Baldwin ntohs(hdr->tls_length); 125170bb2286SJohn Baldwin debug(tc, "record_len %zu outbuf_cap %zu\n", 125270bb2286SJohn Baldwin record_len, outbuf_cap); 1253d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1254d71830cdSJohn Baldwin ATF_REQUIRE(record_len > outbuf_len); 1255a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1256a10482eaSJohn Baldwin record_len - outbuf_len); 1257a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN) 1258a10482eaSJohn Baldwin break; 1259*883d1742SJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1260*883d1742SJohn Baldwin "failed to read from socket: %s", strerror(errno)); 1261a10482eaSJohn Baldwin 1262a10482eaSJohn Baldwin outbuf_len += rv; 1263a10482eaSJohn Baldwin if (outbuf_len == record_len) { 126470bb2286SJohn Baldwin decrypted_len += decrypt_tls_record(tc, en, 126570bb2286SJohn Baldwin seqno, outbuf, outbuf_len, 1266a10482eaSJohn Baldwin decrypted + decrypted_len, 1267a10482eaSJohn Baldwin len - decrypted_len, &record_type); 1268*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, record_type); 1269a10482eaSJohn Baldwin 1270a10482eaSJohn Baldwin seqno++; 1271a10482eaSJohn Baldwin outbuf_len = 0; 1272a10482eaSJohn Baldwin } 1273a10482eaSJohn Baldwin break; 1274a10482eaSJohn Baldwin } 1275a10482eaSJohn Baldwin } 1276a10482eaSJohn Baldwin 1277a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len, 1278a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written); 1279a10482eaSJohn Baldwin 1280a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1281a10482eaSJohn Baldwin 1282a10482eaSJohn Baldwin free(outbuf); 1283a10482eaSJohn Baldwin free(decrypted); 1284a10482eaSJohn Baldwin free(plaintext); 1285a10482eaSJohn Baldwin 12862c105205SJohn Baldwin close_sockets(sockets); 1287694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 1288a10482eaSJohn Baldwin } 1289a10482eaSJohn Baldwin 1290a10482eaSJohn Baldwin static void 1291a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len) 1292a10482eaSJohn Baldwin { 1293a10482eaSJohn Baldwin struct msghdr msg; 1294a10482eaSJohn Baldwin struct cmsghdr *cmsg; 1295a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))]; 1296a10482eaSJohn Baldwin struct iovec iov; 1297a10482eaSJohn Baldwin 1298a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1299a10482eaSJohn Baldwin 1300a10482eaSJohn Baldwin msg.msg_control = cbuf; 1301a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1302a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 1303a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 1304a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 1305a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type)); 1306a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type; 1307a10482eaSJohn Baldwin 1308a10482eaSJohn Baldwin iov.iov_base = data; 1309a10482eaSJohn Baldwin iov.iov_len = len; 1310a10482eaSJohn Baldwin msg.msg_iov = &iov; 1311a10482eaSJohn Baldwin msg.msg_iovlen = 1; 1312a10482eaSJohn Baldwin 1313*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)len, sendmsg(fd, &msg, 0)); 1314a10482eaSJohn Baldwin } 1315a10482eaSJohn Baldwin 1316a10482eaSJohn Baldwin static void 13172400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en, 13182400a7b1SJohn Baldwin uint64_t seqno, uint8_t type, size_t len) 1319a10482eaSJohn Baldwin { 1320a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1321a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1322a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 1323a10482eaSJohn Baldwin ssize_t rv; 1324a10482eaSJohn Baldwin int sockets[2]; 1325a10482eaSJohn Baldwin uint8_t record_type; 1326a10482eaSJohn Baldwin 1327a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1328a10482eaSJohn Baldwin 1329a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1330a10482eaSJohn Baldwin decrypted = malloc(len); 1331a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1332a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1333a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1334a10482eaSJohn Baldwin 13352400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1336a10482eaSJohn Baldwin 1337a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1338a10482eaSJohn Baldwin sizeof(*en)) == 0); 1339ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 1340a10482eaSJohn Baldwin 1341a10482eaSJohn Baldwin fd_set_blocking(sockets[0]); 1342a10482eaSJohn Baldwin fd_set_blocking(sockets[1]); 1343a10482eaSJohn Baldwin 1344a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len); 1345a10482eaSJohn Baldwin 1346a10482eaSJohn Baldwin /* 1347a10482eaSJohn Baldwin * First read the header to determine how much additional data 1348a10482eaSJohn Baldwin * to read. 1349a10482eaSJohn Baldwin */ 1350a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1351*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(sizeof(struct tls_record_layer), rv); 1352a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length); 1353a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1354*883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= outbuf_cap, 1355*883d1742SJohn Baldwin "record_len (%zu) > outbuf_cap (%zu)", record_len, outbuf_cap); 1356a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 1357a10482eaSJohn Baldwin payload_len); 1358*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)payload_len, rv); 1359a10482eaSJohn Baldwin 136070bb2286SJohn Baldwin rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, decrypted, 136170bb2286SJohn Baldwin len, &record_type); 1362a10482eaSJohn Baldwin 1363a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv, 1364a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len); 1365*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(type, record_type); 1366a10482eaSJohn Baldwin 1367a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1368a10482eaSJohn Baldwin 1369a10482eaSJohn Baldwin free(outbuf); 1370a10482eaSJohn Baldwin free(decrypted); 1371a10482eaSJohn Baldwin free(plaintext); 1372a10482eaSJohn Baldwin 13732c105205SJohn Baldwin close_sockets(sockets); 1374a10482eaSJohn Baldwin } 1375a10482eaSJohn Baldwin 13760ff2a12aSJohn Baldwin static void 13772400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en, 13782400a7b1SJohn Baldwin uint64_t seqno) 13790ff2a12aSJohn Baldwin { 13800ff2a12aSJohn Baldwin struct tls_record_layer *hdr; 13810ff2a12aSJohn Baldwin char *outbuf; 13820ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 13830ff2a12aSJohn Baldwin ssize_t rv; 13840ff2a12aSJohn Baldwin int sockets[2]; 13850ff2a12aSJohn Baldwin uint8_t record_type; 13860ff2a12aSJohn Baldwin 13870ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en); 13880ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap); 13890ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 13900ff2a12aSJohn Baldwin 13912400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 13920ff2a12aSJohn Baldwin 13930ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 13940ff2a12aSJohn Baldwin sizeof(*en)) == 0); 1395ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 13960ff2a12aSJohn Baldwin 13970ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]); 13980ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]); 13990ff2a12aSJohn Baldwin 14005de79eedSMark Johnston /* 14015de79eedSMark Johnston * A write of zero bytes should send an empty fragment only for 14025de79eedSMark Johnston * TLS 1.0, otherwise an error should be raised. 14035de79eedSMark Johnston */ 14040ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0); 14055de79eedSMark Johnston if (rv == 0) { 1406*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(CRYPTO_AES_CBC, en->cipher_algorithm); 1407*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_ZERO, en->tls_vminor); 14085de79eedSMark Johnston } else { 1409*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(-1, rv); 1410*883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EINVAL, true); 14115de79eedSMark Johnston goto out; 14125de79eedSMark Johnston } 14130ff2a12aSJohn Baldwin 14140ff2a12aSJohn Baldwin /* 14150ff2a12aSJohn Baldwin * First read the header to determine how much additional data 14160ff2a12aSJohn Baldwin * to read. 14170ff2a12aSJohn Baldwin */ 14180ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1419*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(sizeof(struct tls_record_layer), rv); 14200ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length); 14210ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1422*883d1742SJohn Baldwin ATF_REQUIRE_MSG(record_len <= outbuf_cap, 1423*883d1742SJohn Baldwin "record_len (%zu) > outbuf_cap (%zu)", record_len, outbuf_cap); 14240ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 14250ff2a12aSJohn Baldwin payload_len); 1426*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)payload_len, rv); 14270ff2a12aSJohn Baldwin 142870bb2286SJohn Baldwin rv = decrypt_tls_record(tc, en, seqno, outbuf, record_len, NULL, 0, 14290ff2a12aSJohn Baldwin &record_type); 14300ff2a12aSJohn Baldwin 14310ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0, 14320ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv); 1433*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_RLTYPE_APP, record_type); 14340ff2a12aSJohn Baldwin 14355de79eedSMark Johnston out: 14360ff2a12aSJohn Baldwin free(outbuf); 14370ff2a12aSJohn Baldwin 14382c105205SJohn Baldwin close_sockets(sockets); 14390ff2a12aSJohn Baldwin } 14400ff2a12aSJohn Baldwin 14413e7f8a8dSJohn Baldwin static size_t 14423e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type, 14433e7f8a8dSJohn Baldwin void *data, size_t len) 14443e7f8a8dSJohn Baldwin { 14453e7f8a8dSJohn Baldwin struct msghdr msg; 14463e7f8a8dSJohn Baldwin struct cmsghdr *cmsg; 14473e7f8a8dSJohn Baldwin struct tls_get_record *tgr; 14483e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 14493e7f8a8dSJohn Baldwin struct iovec iov; 14503e7f8a8dSJohn Baldwin ssize_t rv; 14513e7f8a8dSJohn Baldwin 14523e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg)); 14533e7f8a8dSJohn Baldwin 14543e7f8a8dSJohn Baldwin msg.msg_control = cbuf; 14553e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 14563e7f8a8dSJohn Baldwin 14573e7f8a8dSJohn Baldwin iov.iov_base = data; 14583e7f8a8dSJohn Baldwin iov.iov_len = len; 14593e7f8a8dSJohn Baldwin msg.msg_iov = &iov; 14603e7f8a8dSJohn Baldwin msg.msg_iovlen = 1; 14613e7f8a8dSJohn Baldwin 14623e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0); 14633e7f8a8dSJohn Baldwin 14643e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR); 14653e7f8a8dSJohn Baldwin 14663e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 14673e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL); 1468*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(IPPROTO_TCP, cmsg->cmsg_level); 1469*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_GET_RECORD, cmsg->cmsg_type); 1470*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(CMSG_LEN(sizeof(*tgr)), cmsg->cmsg_len); 14713e7f8a8dSJohn Baldwin 14723e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 1473*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(record_type, tgr->tls_type); 1474*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(en->tls_vmajor, tgr->tls_vmajor); 147505a1d0f5SJohn Baldwin /* XXX: Not sure if this is what OpenSSL expects? */ 147605a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 1477*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_TWO, tgr->tls_vminor); 147805a1d0f5SJohn Baldwin else 1479*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(en->tls_vminor, tgr->tls_vminor); 1480*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(htons(rv), tgr->tls_length); 14813e7f8a8dSJohn Baldwin 14823e7f8a8dSJohn Baldwin return (rv); 14833e7f8a8dSJohn Baldwin } 14843e7f8a8dSJohn Baldwin 14853e7f8a8dSJohn Baldwin static void 14862400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en, 14872400a7b1SJohn Baldwin uint64_t seqno, size_t len, size_t padding) 14883e7f8a8dSJohn Baldwin { 14893e7f8a8dSJohn Baldwin struct kevent ev; 14903e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf; 14913e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written; 14923e7f8a8dSJohn Baldwin ssize_t rv; 14933e7f8a8dSJohn Baldwin int kq, sockets[2]; 14943e7f8a8dSJohn Baldwin 14953e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len); 14963e7f8a8dSJohn Baldwin received = malloc(len); 14973e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 14983e7f8a8dSJohn Baldwin tls_trailer_len(en); 14993e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap); 15003e7f8a8dSJohn Baldwin 15013e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 15023e7f8a8dSJohn Baldwin 15032400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 15043e7f8a8dSJohn Baldwin 15053e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 15063e7f8a8dSJohn Baldwin sizeof(*en)) == 0); 1507ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 15083e7f8a8dSJohn Baldwin 15093e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 15103e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 15113e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 15123e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 15133e7f8a8dSJohn Baldwin 15143e7f8a8dSJohn Baldwin received_len = 0; 15153e7f8a8dSJohn Baldwin outbuf_len = 0; 15163e7f8a8dSJohn Baldwin written = 0; 15173e7f8a8dSJohn Baldwin 15183e7f8a8dSJohn Baldwin while (received_len != len) { 15193e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 15203e7f8a8dSJohn Baldwin 15213e7f8a8dSJohn Baldwin switch (ev.filter) { 15223e7f8a8dSJohn Baldwin case EVFILT_WRITE: 15233e7f8a8dSJohn Baldwin /* 15243e7f8a8dSJohn Baldwin * Compose the next TLS record to send. 15253e7f8a8dSJohn Baldwin */ 15263e7f8a8dSJohn Baldwin if (outbuf_len == 0) { 15273e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len); 15283e7f8a8dSJohn Baldwin todo = len - written; 152905a1d0f5SJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding) 153005a1d0f5SJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2 - padding; 153170bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, 15323e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written, 153305a1d0f5SJohn Baldwin todo, outbuf, outbuf_cap, padding); 15343e7f8a8dSJohn Baldwin outbuf_sent = 0; 15353e7f8a8dSJohn Baldwin written += todo; 15363e7f8a8dSJohn Baldwin seqno++; 15373e7f8a8dSJohn Baldwin } 15383e7f8a8dSJohn Baldwin 15393e7f8a8dSJohn Baldwin /* 15403e7f8a8dSJohn Baldwin * Try to write the remainder of the current 15413e7f8a8dSJohn Baldwin * TLS record. 15423e7f8a8dSJohn Baldwin */ 15433e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent, 15443e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent); 15453e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1546*883d1742SJohn Baldwin "failed to write to socket: %s", strerror(errno)); 15473e7f8a8dSJohn Baldwin outbuf_sent += rv; 15483e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) { 15493e7f8a8dSJohn Baldwin outbuf_len = 0; 15503e7f8a8dSJohn Baldwin if (written == len) { 15513e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE; 15523e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 15533e7f8a8dSJohn Baldwin NULL) == 0); 15543e7f8a8dSJohn Baldwin } 15553e7f8a8dSJohn Baldwin } 15563e7f8a8dSJohn Baldwin break; 15573e7f8a8dSJohn Baldwin 15583e7f8a8dSJohn Baldwin case EVFILT_READ: 15593e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 15603e7f8a8dSJohn Baldwin 15613e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident, 15623e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len, 15633e7f8a8dSJohn Baldwin len - received_len); 15643e7f8a8dSJohn Baldwin received_len += rv; 15653e7f8a8dSJohn Baldwin break; 15663e7f8a8dSJohn Baldwin } 15673e7f8a8dSJohn Baldwin } 15683e7f8a8dSJohn Baldwin 15693e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len, 15703e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written); 15713e7f8a8dSJohn Baldwin 15723e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0); 15733e7f8a8dSJohn Baldwin 15743e7f8a8dSJohn Baldwin free(outbuf); 15753e7f8a8dSJohn Baldwin free(received); 15763e7f8a8dSJohn Baldwin free(plaintext); 15773e7f8a8dSJohn Baldwin 15782c105205SJohn Baldwin close_sockets(sockets); 1579694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 15803e7f8a8dSJohn Baldwin } 15813e7f8a8dSJohn Baldwin 158265bd3adbSJohn Baldwin static void 158365bd3adbSJohn Baldwin ktls_receive_tls_error(int fd, int expected_error) 158465bd3adbSJohn Baldwin { 158565bd3adbSJohn Baldwin struct msghdr msg; 158665bd3adbSJohn Baldwin struct tls_get_record *tgr; 158765bd3adbSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 158865bd3adbSJohn Baldwin char buf[64]; 158965bd3adbSJohn Baldwin struct iovec iov; 159065bd3adbSJohn Baldwin 159165bd3adbSJohn Baldwin memset(&msg, 0, sizeof(msg)); 159265bd3adbSJohn Baldwin 159365bd3adbSJohn Baldwin msg.msg_control = cbuf; 159465bd3adbSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 159565bd3adbSJohn Baldwin 159665bd3adbSJohn Baldwin iov.iov_base = buf; 159765bd3adbSJohn Baldwin iov.iov_len = sizeof(buf); 159865bd3adbSJohn Baldwin msg.msg_iov = &iov; 159965bd3adbSJohn Baldwin msg.msg_iovlen = 1; 160065bd3adbSJohn Baldwin 160165bd3adbSJohn Baldwin ATF_REQUIRE(recvmsg(fd, &msg, 0) == -1); 160265bd3adbSJohn Baldwin if (expected_error != 0) 1603*883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(expected_error, true); 160465bd3adbSJohn Baldwin } 160565bd3adbSJohn Baldwin 160665bd3adbSJohn Baldwin static void 160765bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(const atf_tc_t *tc, struct tls_enable *en, 160865bd3adbSJohn Baldwin uint64_t seqno, size_t len, ssize_t offset) 160965bd3adbSJohn Baldwin { 161065bd3adbSJohn Baldwin char *plaintext, *outbuf; 161165bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 161265bd3adbSJohn Baldwin ssize_t rv; 161365bd3adbSJohn Baldwin int sockets[2]; 161465bd3adbSJohn Baldwin 161565bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 161665bd3adbSJohn Baldwin 161765bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 161865bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 161965bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 162065bd3adbSJohn Baldwin 162165bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 162265bd3adbSJohn Baldwin 162365bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 162465bd3adbSJohn Baldwin sizeof(*en)) == 0); 162565bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 162665bd3adbSJohn Baldwin 162765bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 162865bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 162965bd3adbSJohn Baldwin 163070bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 163165bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 163265bd3adbSJohn Baldwin 163365bd3adbSJohn Baldwin /* A negative offset is an offset from the end. */ 163465bd3adbSJohn Baldwin if (offset < 0) 163565bd3adbSJohn Baldwin offset += outbuf_len; 163665bd3adbSJohn Baldwin outbuf[offset] ^= 0x01; 163765bd3adbSJohn Baldwin 163865bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1639*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv); 164065bd3adbSJohn Baldwin 164165bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EBADMSG); 164265bd3adbSJohn Baldwin 164365bd3adbSJohn Baldwin free(outbuf); 164465bd3adbSJohn Baldwin free(plaintext); 164565bd3adbSJohn Baldwin 164665bd3adbSJohn Baldwin close_sockets(sockets); 164765bd3adbSJohn Baldwin } 164865bd3adbSJohn Baldwin 164965bd3adbSJohn Baldwin static void 165065bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(const atf_tc_t *tc, struct tls_enable *en, 165165bd3adbSJohn Baldwin uint64_t seqno, size_t len) 165265bd3adbSJohn Baldwin { 165365bd3adbSJohn Baldwin ATF_REQUIRE(tls_header_len(en) > sizeof(struct tls_record_layer)); 165465bd3adbSJohn Baldwin 165565bd3adbSJohn Baldwin /* Corrupt the first byte of the explicit IV after the header. */ 165665bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, 165765bd3adbSJohn Baldwin sizeof(struct tls_record_layer)); 165865bd3adbSJohn Baldwin } 165965bd3adbSJohn Baldwin 166065bd3adbSJohn Baldwin static void 166165bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(const atf_tc_t *tc, struct tls_enable *en, 166265bd3adbSJohn Baldwin uint64_t seqno, size_t len) 166365bd3adbSJohn Baldwin { 166465bd3adbSJohn Baldwin ATF_REQUIRE(len > 0); 166565bd3adbSJohn Baldwin 166665bd3adbSJohn Baldwin /* Corrupt the first ciphertext byte after the header. */ 166765bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, 166865bd3adbSJohn Baldwin tls_header_len(en)); 166965bd3adbSJohn Baldwin } 167065bd3adbSJohn Baldwin 167165bd3adbSJohn Baldwin static void 167265bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(const atf_tc_t *tc, struct tls_enable *en, 167365bd3adbSJohn Baldwin uint64_t seqno, size_t len) 167465bd3adbSJohn Baldwin { 167565bd3adbSJohn Baldwin size_t offset; 167665bd3adbSJohn Baldwin 167765bd3adbSJohn Baldwin /* Corrupt the first byte of the MAC. */ 167865bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 167965bd3adbSJohn Baldwin offset = tls_header_len(en) + len; 168065bd3adbSJohn Baldwin else 168165bd3adbSJohn Baldwin offset = -tls_mac_len(en); 168265bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, offset); 168365bd3adbSJohn Baldwin } 168465bd3adbSJohn Baldwin 168565bd3adbSJohn Baldwin static void 168665bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(const atf_tc_t *tc, struct tls_enable *en, 168765bd3adbSJohn Baldwin uint64_t seqno, size_t len) 168865bd3adbSJohn Baldwin { 1689*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(CRYPTO_AES_CBC, en->cipher_algorithm); 169065bd3adbSJohn Baldwin 169165bd3adbSJohn Baldwin /* Corrupt the last byte of the padding. */ 169265bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, -1); 169365bd3adbSJohn Baldwin } 169465bd3adbSJohn Baldwin 169565bd3adbSJohn Baldwin static void 169665bd3adbSJohn Baldwin test_ktls_receive_truncated_record(const atf_tc_t *tc, struct tls_enable *en, 169765bd3adbSJohn Baldwin uint64_t seqno, size_t len) 169865bd3adbSJohn Baldwin { 169965bd3adbSJohn Baldwin char *plaintext, *outbuf; 170065bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 170165bd3adbSJohn Baldwin ssize_t rv; 170265bd3adbSJohn Baldwin int sockets[2]; 170365bd3adbSJohn Baldwin 170465bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 170565bd3adbSJohn Baldwin 170665bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 170765bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 170865bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 170965bd3adbSJohn Baldwin 171065bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 171165bd3adbSJohn Baldwin 171265bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 171365bd3adbSJohn Baldwin sizeof(*en)) == 0); 171465bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 171565bd3adbSJohn Baldwin 171665bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 171765bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 171865bd3adbSJohn Baldwin 171970bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 172065bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 172165bd3adbSJohn Baldwin 172265bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len / 2); 1723*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)(outbuf_len / 2), rv); 172465bd3adbSJohn Baldwin 172565bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0); 172665bd3adbSJohn Baldwin 172765bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE); 172865bd3adbSJohn Baldwin 172965bd3adbSJohn Baldwin free(outbuf); 173065bd3adbSJohn Baldwin free(plaintext); 173165bd3adbSJohn Baldwin 173265bd3adbSJohn Baldwin close_sockets(sockets); 173365bd3adbSJohn Baldwin } 173465bd3adbSJohn Baldwin 173565bd3adbSJohn Baldwin static void 173665bd3adbSJohn Baldwin test_ktls_receive_bad_major(const atf_tc_t *tc, struct tls_enable *en, 173765bd3adbSJohn Baldwin uint64_t seqno, size_t len) 173865bd3adbSJohn Baldwin { 173965bd3adbSJohn Baldwin struct tls_record_layer *hdr; 174065bd3adbSJohn Baldwin char *plaintext, *outbuf; 174165bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 174265bd3adbSJohn Baldwin ssize_t rv; 174365bd3adbSJohn Baldwin int sockets[2]; 174465bd3adbSJohn Baldwin 174565bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 174665bd3adbSJohn Baldwin 174765bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 174865bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 174965bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 175065bd3adbSJohn Baldwin 175165bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 175265bd3adbSJohn Baldwin 175365bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 175465bd3adbSJohn Baldwin sizeof(*en)) == 0); 175565bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 175665bd3adbSJohn Baldwin 175765bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 175865bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 175965bd3adbSJohn Baldwin 176070bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 176165bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 176265bd3adbSJohn Baldwin 176365bd3adbSJohn Baldwin hdr = (void *)outbuf; 176465bd3adbSJohn Baldwin hdr->tls_vmajor++; 176565bd3adbSJohn Baldwin 176665bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1767*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv); 176865bd3adbSJohn Baldwin 176965bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 177065bd3adbSJohn Baldwin 177165bd3adbSJohn Baldwin free(outbuf); 177265bd3adbSJohn Baldwin free(plaintext); 177365bd3adbSJohn Baldwin 177465bd3adbSJohn Baldwin close_sockets(sockets); 177565bd3adbSJohn Baldwin } 177665bd3adbSJohn Baldwin 177765bd3adbSJohn Baldwin static void 177865bd3adbSJohn Baldwin test_ktls_receive_bad_minor(const atf_tc_t *tc, struct tls_enable *en, 177965bd3adbSJohn Baldwin uint64_t seqno, size_t len) 178065bd3adbSJohn Baldwin { 178165bd3adbSJohn Baldwin struct tls_record_layer *hdr; 178265bd3adbSJohn Baldwin char *plaintext, *outbuf; 178365bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 178465bd3adbSJohn Baldwin ssize_t rv; 178565bd3adbSJohn Baldwin int sockets[2]; 178665bd3adbSJohn Baldwin 178765bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 178865bd3adbSJohn Baldwin 178965bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 179065bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 179165bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 179265bd3adbSJohn Baldwin 179365bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 179465bd3adbSJohn Baldwin 179565bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 179665bd3adbSJohn Baldwin sizeof(*en)) == 0); 179765bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 179865bd3adbSJohn Baldwin 179965bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 180065bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 180165bd3adbSJohn Baldwin 180270bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, TLS_RLTYPE_APP, seqno, 180365bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 180465bd3adbSJohn Baldwin 180565bd3adbSJohn Baldwin hdr = (void *)outbuf; 180665bd3adbSJohn Baldwin hdr->tls_vminor++; 180765bd3adbSJohn Baldwin 180865bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1809*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv); 181065bd3adbSJohn Baldwin 181165bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 181265bd3adbSJohn Baldwin 181365bd3adbSJohn Baldwin free(outbuf); 181465bd3adbSJohn Baldwin free(plaintext); 181565bd3adbSJohn Baldwin 181665bd3adbSJohn Baldwin close_sockets(sockets); 181765bd3adbSJohn Baldwin } 181865bd3adbSJohn Baldwin 181965bd3adbSJohn Baldwin static void 182065bd3adbSJohn Baldwin test_ktls_receive_bad_type(const atf_tc_t *tc, struct tls_enable *en, 182165bd3adbSJohn Baldwin uint64_t seqno, size_t len) 182265bd3adbSJohn Baldwin { 182365bd3adbSJohn Baldwin struct tls_record_layer *hdr; 182465bd3adbSJohn Baldwin char *plaintext, *outbuf; 182565bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 182665bd3adbSJohn Baldwin ssize_t rv; 182765bd3adbSJohn Baldwin int sockets[2]; 182865bd3adbSJohn Baldwin 182965bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1830*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ(TLS_MINOR_VER_THREE, en->tls_vminor); 183165bd3adbSJohn Baldwin 183265bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 183365bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 183465bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 183565bd3adbSJohn Baldwin 183665bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 183765bd3adbSJohn Baldwin 183865bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 183965bd3adbSJohn Baldwin sizeof(*en)) == 0); 184065bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 184165bd3adbSJohn Baldwin 184265bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 184365bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 184465bd3adbSJohn Baldwin 184570bb2286SJohn Baldwin outbuf_len = encrypt_tls_record(tc, en, 0x21 /* Alert */, seqno, 184665bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 184765bd3adbSJohn Baldwin 184865bd3adbSJohn Baldwin hdr = (void *)outbuf; 184965bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP + 1; 185065bd3adbSJohn Baldwin 185165bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1852*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv); 185365bd3adbSJohn Baldwin 185465bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 185565bd3adbSJohn Baldwin 185665bd3adbSJohn Baldwin free(outbuf); 185765bd3adbSJohn Baldwin free(plaintext); 185865bd3adbSJohn Baldwin 185965bd3adbSJohn Baldwin close_sockets(sockets); 186065bd3adbSJohn Baldwin } 186165bd3adbSJohn Baldwin 186265bd3adbSJohn Baldwin static void 186365bd3adbSJohn Baldwin test_ktls_receive_bad_size(const atf_tc_t *tc, struct tls_enable *en, 186465bd3adbSJohn Baldwin uint64_t seqno, size_t len) 186565bd3adbSJohn Baldwin { 186665bd3adbSJohn Baldwin struct tls_record_layer *hdr; 186765bd3adbSJohn Baldwin char *outbuf; 186865bd3adbSJohn Baldwin size_t outbuf_len; 186965bd3adbSJohn Baldwin ssize_t rv; 187065bd3adbSJohn Baldwin int sockets[2]; 187165bd3adbSJohn Baldwin 187265bd3adbSJohn Baldwin outbuf_len = sizeof(*hdr) + len; 187365bd3adbSJohn Baldwin outbuf = calloc(1, outbuf_len); 187465bd3adbSJohn Baldwin 187565bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 187665bd3adbSJohn Baldwin 187765bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 187865bd3adbSJohn Baldwin sizeof(*en)) == 0); 187965bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 188065bd3adbSJohn Baldwin 188165bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 188265bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 188365bd3adbSJohn Baldwin 188465bd3adbSJohn Baldwin hdr = (void *)outbuf; 188565bd3adbSJohn Baldwin hdr->tls_vmajor = en->tls_vmajor; 188665bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 188765bd3adbSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 188865bd3adbSJohn Baldwin else 188965bd3adbSJohn Baldwin hdr->tls_vminor = en->tls_vminor; 189065bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 189165bd3adbSJohn Baldwin hdr->tls_length = htons(len); 189265bd3adbSJohn Baldwin 189365bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1894*883d1742SJohn Baldwin ATF_REQUIRE_INTEQ((ssize_t)outbuf_len, rv); 189565bd3adbSJohn Baldwin 189665bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0); 189765bd3adbSJohn Baldwin 189865bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE); 189965bd3adbSJohn Baldwin 190065bd3adbSJohn Baldwin free(outbuf); 190165bd3adbSJohn Baldwin 190265bd3adbSJohn Baldwin close_sockets(sockets); 190365bd3adbSJohn Baldwin } 190465bd3adbSJohn Baldwin 19050ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \ 19060ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 190764811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 19080ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 190964811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) 19100ff2a12aSJohn Baldwin 191183a54b58SJohn Baldwin #define TLS_13_TESTS(M) \ 191283a54b58SJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 191383a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 191483a54b58SJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 191583a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 191683a54b58SJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 191783a54b58SJohn Baldwin TLS_MINOR_VER_THREE) 191883a54b58SJohn Baldwin 191964811651SJohn Baldwin #define AES_CBC_NONZERO_TESTS(M) \ 1920a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1921a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1922a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1923a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1924a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1925a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1926a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1927a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1928a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1929a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1930a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \ 1931a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1932a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1933a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1934a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \ 1935a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1936a10482eaSJohn Baldwin 193764811651SJohn Baldwin #define AES_CBC_TESTS(M) \ 193864811651SJohn Baldwin TLS_10_TESTS(M) \ 193964811651SJohn Baldwin AES_CBC_NONZERO_TESTS(M) 194064811651SJohn Baldwin 194165bd3adbSJohn Baldwin #define AES_GCM_12_TESTS(M) \ 1942a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1943a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1944a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 194565bd3adbSJohn Baldwin TLS_MINOR_VER_TWO) 194665bd3adbSJohn Baldwin 194765bd3adbSJohn Baldwin #define AES_GCM_TESTS(M) \ 194865bd3adbSJohn Baldwin AES_GCM_12_TESTS(M) \ 1949a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1950a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \ 1951a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1952a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1953a10482eaSJohn Baldwin 1954a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \ 1955a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1956a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1957a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1958a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1959a10482eaSJohn Baldwin 1960a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1961a10482eaSJohn Baldwin auth_alg, minor, name, len) \ 1962a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 1963a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1964a10482eaSJohn Baldwin { \ 1965a10482eaSJohn Baldwin struct tls_enable en; \ 1966a10482eaSJohn Baldwin uint64_t seqno; \ 1967a10482eaSJohn Baldwin \ 1968a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1969a10482eaSJohn Baldwin seqno = random(); \ 197070bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 197170bb2286SJohn Baldwin seqno, &en); \ 19722400a7b1SJohn Baldwin test_ktls_transmit_app_data(tc, &en, seqno, len); \ 1973a10482eaSJohn Baldwin free_tls_enable(&en); \ 1974a10482eaSJohn Baldwin } 1975a10482eaSJohn Baldwin 1976a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1977a10482eaSJohn Baldwin auth_alg, minor, name) \ 1978a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1979a10482eaSJohn Baldwin 1980a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198144265dc3SJohn Baldwin auth_alg, minor, name, type, len) \ 198244265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 198344265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1984a10482eaSJohn Baldwin { \ 1985a10482eaSJohn Baldwin struct tls_enable en; \ 1986a10482eaSJohn Baldwin uint64_t seqno; \ 1987a10482eaSJohn Baldwin \ 1988a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1989a10482eaSJohn Baldwin seqno = random(); \ 199070bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 199170bb2286SJohn Baldwin seqno, &en); \ 19922400a7b1SJohn Baldwin test_ktls_transmit_control(tc, &en, seqno, type, len); \ 1993a10482eaSJohn Baldwin free_tls_enable(&en); \ 1994a10482eaSJohn Baldwin } 1995a10482eaSJohn Baldwin 1996a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 199744265dc3SJohn Baldwin auth_alg, minor, name) \ 199844265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1999a10482eaSJohn Baldwin 20000ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 20015de79eedSMark Johnston key_size, auth_alg, minor) \ 20020ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \ 20030ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \ 20040ff2a12aSJohn Baldwin { \ 20050ff2a12aSJohn Baldwin struct tls_enable en; \ 20060ff2a12aSJohn Baldwin uint64_t seqno; \ 20070ff2a12aSJohn Baldwin \ 20080ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \ 20090ff2a12aSJohn Baldwin seqno = random(); \ 201070bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 201170bb2286SJohn Baldwin seqno, &en); \ 20122400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(tc, &en, seqno); \ 20130ff2a12aSJohn Baldwin free_tls_enable(&en); \ 20140ff2a12aSJohn Baldwin } 20150ff2a12aSJohn Baldwin 20160ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 20175de79eedSMark Johnston key_size, auth_alg, minor) \ 20180ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment); 20190ff2a12aSJohn Baldwin 2020a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 2021a10482eaSJohn Baldwin minor) \ 2022a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2023a10482eaSJohn Baldwin auth_alg, minor, short, 64) \ 2024a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2025a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \ 2026a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202744265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32) 2028a10482eaSJohn Baldwin 2029a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 2030a10482eaSJohn Baldwin minor) \ 2031a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2032a10482eaSJohn Baldwin auth_alg, minor, short) \ 2033a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2034a10482eaSJohn Baldwin auth_alg, minor, long) \ 2035a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 203644265dc3SJohn Baldwin auth_alg, minor, control) 2037a10482eaSJohn Baldwin 2038a10482eaSJohn Baldwin /* 2039a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests: 2040a10482eaSJohn Baldwin * 2041a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 2042a10482eaSJohn Baldwin * a single TLS record) 2043a10482eaSJohn Baldwin * 2044a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across 2045a10482eaSJohn Baldwin * multiple TLS records) 2046a10482eaSJohn Baldwin * 2047a10482eaSJohn Baldwin * - a control test which sends a single record with a specific 2048a10482eaSJohn Baldwin * content type via sendmsg() 2049a10482eaSJohn Baldwin */ 2050a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS); 2051a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS); 2052a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS); 2053a10482eaSJohn Baldwin 205444265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 205544265dc3SJohn Baldwin auth_alg, minor) \ 205644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205744265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \ 205844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 205944265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \ 206044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206144265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \ 206244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206344265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \ 206444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206544265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \ 206644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206744265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \ 206844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 206944265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \ 207044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207144265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \ 207244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207344265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \ 207444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207544265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \ 207644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207744265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \ 207844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 207944265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \ 208044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208144265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \ 208244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208344265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \ 208444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208544265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \ 208644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 208744265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16) 208844265dc3SJohn Baldwin 208944265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 209044265dc3SJohn Baldwin auth_alg, minor) \ 209144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209244265dc3SJohn Baldwin auth_alg, minor, padding_1) \ 209344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209444265dc3SJohn Baldwin auth_alg, minor, padding_2) \ 209544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209644265dc3SJohn Baldwin auth_alg, minor, padding_3) \ 209744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 209844265dc3SJohn Baldwin auth_alg, minor, padding_4) \ 209944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210044265dc3SJohn Baldwin auth_alg, minor, padding_5) \ 210144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210244265dc3SJohn Baldwin auth_alg, minor, padding_6) \ 210344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210444265dc3SJohn Baldwin auth_alg, minor, padding_7) \ 210544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210644265dc3SJohn Baldwin auth_alg, minor, padding_8) \ 210744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 210844265dc3SJohn Baldwin auth_alg, minor, padding_9) \ 210944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 211044265dc3SJohn Baldwin auth_alg, minor, padding_10) \ 211144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 211244265dc3SJohn Baldwin auth_alg, minor, padding_11) \ 211344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 211444265dc3SJohn Baldwin auth_alg, minor, padding_12) \ 211544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 211644265dc3SJohn Baldwin auth_alg, minor, padding_13) \ 211744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 211844265dc3SJohn Baldwin auth_alg, minor, padding_14) \ 211944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 212044265dc3SJohn Baldwin auth_alg, minor, padding_15) \ 212144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 212244265dc3SJohn Baldwin auth_alg, minor, padding_16) 212344265dc3SJohn Baldwin 212444265dc3SJohn Baldwin /* 212544265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 212644265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 212744265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 212844265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 212944265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 213044265dc3SJohn Baldwin * of the possible padding lengths for each suite. 213144265dc3SJohn Baldwin */ 213244265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS); 213344265dc3SJohn Baldwin 21340ff2a12aSJohn Baldwin /* 21350ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that 21360ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections. 21370ff2a12aSJohn Baldwin */ 21385de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 21395de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 21405de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 21410ff2a12aSJohn Baldwin 2142d1c369f9SJohn Baldwin static void 21432400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc, 21442400a7b1SJohn Baldwin struct tls_enable *en) 2145d1c369f9SJohn Baldwin { 2146d1c369f9SJohn Baldwin int sockets[2]; 2147d1c369f9SJohn Baldwin 21482400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 2149d1c369f9SJohn Baldwin 2150*883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EINVAL, setsockopt(sockets[1], IPPROTO_TCP, 2151*883d1742SJohn Baldwin TCP_TXTLS_ENABLE, en, sizeof(*en)) == -1); 2152d1c369f9SJohn Baldwin 21532c105205SJohn Baldwin close_sockets(sockets); 2154d1c369f9SJohn Baldwin } 2155d1c369f9SJohn Baldwin 2156d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 2157d1c369f9SJohn Baldwin minor) \ 2158d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \ 2159d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \ 2160d1c369f9SJohn Baldwin { \ 2161d1c369f9SJohn Baldwin struct tls_enable en; \ 2162d1c369f9SJohn Baldwin uint64_t seqno; \ 2163d1c369f9SJohn Baldwin \ 2164d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \ 2165d1c369f9SJohn Baldwin seqno = random(); \ 216670bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 216770bb2286SJohn Baldwin seqno, &en); \ 21682400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(tc, &en); \ 2169d1c369f9SJohn Baldwin free_tls_enable(&en); \ 2170d1c369f9SJohn Baldwin } 2171d1c369f9SJohn Baldwin 2172d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 2173d1c369f9SJohn Baldwin minor) \ 2174d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name); 2175d1c369f9SJohn Baldwin 2176d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \ 2177d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2178d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \ 2179d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2180d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \ 2181d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 2182d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 2183d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 2184d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 2185d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2186d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \ 2187d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2188d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \ 2189d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 2190d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 2191d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 2192d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 2193d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \ 2194d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \ 2195d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2196d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \ 2197d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2198d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE) 2199d1c369f9SJohn Baldwin 2200d1c369f9SJohn Baldwin /* 2201d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit. 2202d1c369f9SJohn Baldwin */ 2203d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST); 2204d1c369f9SJohn Baldwin 22053e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 220605a1d0f5SJohn Baldwin auth_alg, minor, name, len, padding) \ 22073e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 22083e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 22093e7f8a8dSJohn Baldwin { \ 22103e7f8a8dSJohn Baldwin struct tls_enable en; \ 22113e7f8a8dSJohn Baldwin uint64_t seqno; \ 22123e7f8a8dSJohn Baldwin \ 22133e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \ 22143e7f8a8dSJohn Baldwin seqno = random(); \ 221570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 221670bb2286SJohn Baldwin seqno, &en); \ 22172400a7b1SJohn Baldwin test_ktls_receive_app_data(tc, &en, seqno, len, padding); \ 22183e7f8a8dSJohn Baldwin free_tls_enable(&en); \ 22193e7f8a8dSJohn Baldwin } 22203e7f8a8dSJohn Baldwin 22213e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 22223e7f8a8dSJohn Baldwin auth_alg, minor, name) \ 22233e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 22243e7f8a8dSJohn Baldwin 222565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 222665bd3adbSJohn Baldwin auth_alg, minor, len) \ 222765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_data); \ 222865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc) \ 222965bd3adbSJohn Baldwin { \ 223065bd3adbSJohn Baldwin struct tls_enable en; \ 223165bd3adbSJohn Baldwin uint64_t seqno; \ 223265bd3adbSJohn Baldwin \ 223365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 223465bd3adbSJohn Baldwin seqno = random(); \ 223570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 223670bb2286SJohn Baldwin seqno, &en); \ 223765bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(tc, &en, seqno, len); \ 223865bd3adbSJohn Baldwin free_tls_enable(&en); \ 223965bd3adbSJohn Baldwin } 224065bd3adbSJohn Baldwin 224165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 224265bd3adbSJohn Baldwin auth_alg, minor) \ 224365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_data); 224465bd3adbSJohn Baldwin 224565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 224665bd3adbSJohn Baldwin auth_alg, minor, len) \ 224765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_mac); \ 224865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc) \ 224965bd3adbSJohn Baldwin { \ 225065bd3adbSJohn Baldwin struct tls_enable en; \ 225165bd3adbSJohn Baldwin uint64_t seqno; \ 225265bd3adbSJohn Baldwin \ 225365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 225465bd3adbSJohn Baldwin seqno = random(); \ 225570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 225670bb2286SJohn Baldwin seqno, &en); \ 225765bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(tc, &en, seqno, len); \ 225865bd3adbSJohn Baldwin free_tls_enable(&en); \ 225965bd3adbSJohn Baldwin } 226065bd3adbSJohn Baldwin 226165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 226265bd3adbSJohn Baldwin auth_alg, minor) \ 226365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_mac); 226465bd3adbSJohn Baldwin 226565bd3adbSJohn Baldwin #define GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 226665bd3adbSJohn Baldwin auth_alg, minor, len) \ 226765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_truncated_record); \ 226865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc) \ 226965bd3adbSJohn Baldwin { \ 227065bd3adbSJohn Baldwin struct tls_enable en; \ 227165bd3adbSJohn Baldwin uint64_t seqno; \ 227265bd3adbSJohn Baldwin \ 227365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 227465bd3adbSJohn Baldwin seqno = random(); \ 227570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 227670bb2286SJohn Baldwin seqno, &en); \ 227765bd3adbSJohn Baldwin test_ktls_receive_truncated_record(tc, &en, seqno, len); \ 227865bd3adbSJohn Baldwin free_tls_enable(&en); \ 227965bd3adbSJohn Baldwin } 228065bd3adbSJohn Baldwin 228165bd3adbSJohn Baldwin #define ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 228265bd3adbSJohn Baldwin auth_alg, minor) \ 228365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_truncated_record); 228465bd3adbSJohn Baldwin 228565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 228665bd3adbSJohn Baldwin auth_alg, minor, len) \ 228765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_major); \ 228865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc) \ 228965bd3adbSJohn Baldwin { \ 229065bd3adbSJohn Baldwin struct tls_enable en; \ 229165bd3adbSJohn Baldwin uint64_t seqno; \ 229265bd3adbSJohn Baldwin \ 229365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 229465bd3adbSJohn Baldwin seqno = random(); \ 229570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 229670bb2286SJohn Baldwin seqno, &en); \ 229765bd3adbSJohn Baldwin test_ktls_receive_bad_major(tc, &en, seqno, len); \ 229865bd3adbSJohn Baldwin free_tls_enable(&en); \ 229965bd3adbSJohn Baldwin } 230065bd3adbSJohn Baldwin 230165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 230265bd3adbSJohn Baldwin auth_alg, minor) \ 230365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_major); 230465bd3adbSJohn Baldwin 230565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 230665bd3adbSJohn Baldwin auth_alg, minor, len) \ 230765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_minor); \ 230865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc) \ 230965bd3adbSJohn Baldwin { \ 231065bd3adbSJohn Baldwin struct tls_enable en; \ 231165bd3adbSJohn Baldwin uint64_t seqno; \ 231265bd3adbSJohn Baldwin \ 231365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 231465bd3adbSJohn Baldwin seqno = random(); \ 231570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 231670bb2286SJohn Baldwin seqno, &en); \ 231765bd3adbSJohn Baldwin test_ktls_receive_bad_minor(tc, &en, seqno, len); \ 231865bd3adbSJohn Baldwin free_tls_enable(&en); \ 231965bd3adbSJohn Baldwin } 232065bd3adbSJohn Baldwin 232165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 232265bd3adbSJohn Baldwin auth_alg, minor) \ 232365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_minor); 232465bd3adbSJohn Baldwin 232565bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 232665bd3adbSJohn Baldwin auth_alg, minor, name, len) \ 232765bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 232865bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 232965bd3adbSJohn Baldwin { \ 233065bd3adbSJohn Baldwin struct tls_enable en; \ 233165bd3adbSJohn Baldwin uint64_t seqno; \ 233265bd3adbSJohn Baldwin \ 233365bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 233465bd3adbSJohn Baldwin seqno = random(); \ 233570bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 233670bb2286SJohn Baldwin seqno, &en); \ 233765bd3adbSJohn Baldwin test_ktls_receive_bad_size(tc, &en, seqno, (len)); \ 233865bd3adbSJohn Baldwin free_tls_enable(&en); \ 233965bd3adbSJohn Baldwin } 234065bd3adbSJohn Baldwin 234165bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 234265bd3adbSJohn Baldwin auth_alg, minor, name) \ 234365bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 234465bd3adbSJohn Baldwin 23453e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 23463e7f8a8dSJohn Baldwin minor) \ 23473e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 234805a1d0f5SJohn Baldwin auth_alg, minor, short, 64, 0) \ 23493e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235065bd3adbSJohn Baldwin auth_alg, minor, long, 64 * 1024, 0) \ 235165bd3adbSJohn Baldwin GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235265bd3adbSJohn Baldwin auth_alg, minor, 64) \ 235365bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 235465bd3adbSJohn Baldwin auth_alg, minor, 64) \ 235565bd3adbSJohn Baldwin GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 235665bd3adbSJohn Baldwin auth_alg, minor, 64) \ 235765bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 235865bd3adbSJohn Baldwin auth_alg, minor, 64) \ 235965bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 236065bd3adbSJohn Baldwin auth_alg, minor, 64) \ 236165bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 236265bd3adbSJohn Baldwin auth_alg, minor, small_record, \ 236365bd3adbSJohn Baldwin tls_minimum_record_payload(&en) - 1) \ 236465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 236565bd3adbSJohn Baldwin auth_alg, minor, oversized_record, \ 236665bd3adbSJohn Baldwin TLS_MAX_MSG_SIZE_V10_2 * 2) 23673e7f8a8dSJohn Baldwin 23683e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 23693e7f8a8dSJohn Baldwin minor) \ 23703e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 23713e7f8a8dSJohn Baldwin auth_alg, minor, short) \ 23723e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237365bd3adbSJohn Baldwin auth_alg, minor, long) \ 237465bd3adbSJohn Baldwin ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237565bd3adbSJohn Baldwin auth_alg, minor) \ 237665bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 237765bd3adbSJohn Baldwin auth_alg, minor) \ 237865bd3adbSJohn Baldwin ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 237965bd3adbSJohn Baldwin auth_alg, minor) \ 238065bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 238165bd3adbSJohn Baldwin auth_alg, minor) \ 238265bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 238365bd3adbSJohn Baldwin auth_alg, minor) \ 238465bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 238565bd3adbSJohn Baldwin auth_alg, minor, small_record) \ 238665bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 238765bd3adbSJohn Baldwin auth_alg, minor, oversized_record) 23883e7f8a8dSJohn Baldwin 23893e7f8a8dSJohn Baldwin /* 239065bd3adbSJohn Baldwin * For each supported cipher suite, run several receive tests: 23913e7f8a8dSJohn Baldwin * 23923e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 23933e7f8a8dSJohn Baldwin * a single TLS record) 23943e7f8a8dSJohn Baldwin * 23953e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across 23963e7f8a8dSJohn Baldwin * multiple TLS records) 239765bd3adbSJohn Baldwin * 239865bd3adbSJohn Baldwin * - a test with corrupted payload data in a single TLS record 239965bd3adbSJohn Baldwin * 240065bd3adbSJohn Baldwin * - a test with a corrupted MAC in a single TLS record 240165bd3adbSJohn Baldwin * 240265bd3adbSJohn Baldwin * - a test with a truncated TLS record 240365bd3adbSJohn Baldwin * 240465bd3adbSJohn Baldwin * - tests with invalid TLS major and minor versions 240565bd3adbSJohn Baldwin * 240665bd3adbSJohn Baldwin * - a tests with a record whose is one less than the smallest valid 240765bd3adbSJohn Baldwin * size 240865bd3adbSJohn Baldwin * 240965bd3adbSJohn Baldwin * - a test with an oversized TLS record 24103e7f8a8dSJohn Baldwin */ 241164811651SJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_TESTS); 241205a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS); 241305a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS); 241405a1d0f5SJohn Baldwin 241564811651SJohn Baldwin #define GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 241664811651SJohn Baldwin key_size, auth_alg, minor) \ 241764811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 241864811651SJohn Baldwin auth_alg, minor, padding_1, 1, 0) \ 241964811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242064811651SJohn Baldwin auth_alg, minor, padding_2, 2, 0) \ 242164811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242264811651SJohn Baldwin auth_alg, minor, padding_3, 3, 0) \ 242364811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242464811651SJohn Baldwin auth_alg, minor, padding_4, 4, 0) \ 242564811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242664811651SJohn Baldwin auth_alg, minor, padding_5, 5, 0) \ 242764811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 242864811651SJohn Baldwin auth_alg, minor, padding_6, 6, 0) \ 242964811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243064811651SJohn Baldwin auth_alg, minor, padding_7, 7, 0) \ 243164811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243264811651SJohn Baldwin auth_alg, minor, padding_8, 8, 0) \ 243364811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243464811651SJohn Baldwin auth_alg, minor, padding_9, 9, 0) \ 243564811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243664811651SJohn Baldwin auth_alg, minor, padding_10, 10, 0) \ 243764811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 243864811651SJohn Baldwin auth_alg, minor, padding_11, 11, 0) \ 243964811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244064811651SJohn Baldwin auth_alg, minor, padding_12, 12, 0) \ 244164811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244264811651SJohn Baldwin auth_alg, minor, padding_13, 13, 0) \ 244364811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244464811651SJohn Baldwin auth_alg, minor, padding_14, 14, 0) \ 244564811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244664811651SJohn Baldwin auth_alg, minor, padding_15, 15, 0) \ 244764811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 244864811651SJohn Baldwin auth_alg, minor, padding_16, 16, 0) \ 244964811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245064811651SJohn Baldwin auth_alg, minor, padding_16_extra, 16, 16) \ 245164811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245264811651SJohn Baldwin auth_alg, minor, padding_32_extra, 16, 32) 245364811651SJohn Baldwin 245464811651SJohn Baldwin #define ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 245564811651SJohn Baldwin key_size, auth_alg, minor) \ 245664811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245764811651SJohn Baldwin auth_alg, minor, padding_1) \ 245864811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 245964811651SJohn Baldwin auth_alg, minor, padding_2) \ 246064811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246164811651SJohn Baldwin auth_alg, minor, padding_3) \ 246264811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246364811651SJohn Baldwin auth_alg, minor, padding_4) \ 246464811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246564811651SJohn Baldwin auth_alg, minor, padding_5) \ 246664811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246764811651SJohn Baldwin auth_alg, minor, padding_6) \ 246864811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 246964811651SJohn Baldwin auth_alg, minor, padding_7) \ 247064811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247164811651SJohn Baldwin auth_alg, minor, padding_8) \ 247264811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247364811651SJohn Baldwin auth_alg, minor, padding_9) \ 247464811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247564811651SJohn Baldwin auth_alg, minor, padding_10) \ 247664811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247764811651SJohn Baldwin auth_alg, minor, padding_11) \ 247864811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 247964811651SJohn Baldwin auth_alg, minor, padding_12) \ 248064811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 248164811651SJohn Baldwin auth_alg, minor, padding_13) \ 248264811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 248364811651SJohn Baldwin auth_alg, minor, padding_14) \ 248464811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 248564811651SJohn Baldwin auth_alg, minor, padding_15) \ 248664811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 248764811651SJohn Baldwin auth_alg, minor, padding_16) \ 248864811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 248964811651SJohn Baldwin auth_alg, minor, padding_16_extra) \ 249064811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 249164811651SJohn Baldwin auth_alg, minor, padding_32_extra) 249264811651SJohn Baldwin 249365bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 249465bd3adbSJohn Baldwin auth_alg, minor, len) \ 249565bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_padding); \ 249665bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc) \ 249765bd3adbSJohn Baldwin { \ 249865bd3adbSJohn Baldwin struct tls_enable en; \ 249965bd3adbSJohn Baldwin uint64_t seqno; \ 250065bd3adbSJohn Baldwin \ 250165bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 250265bd3adbSJohn Baldwin seqno = random(); \ 250370bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 250470bb2286SJohn Baldwin seqno, &en); \ 250565bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(tc, &en, seqno, len); \ 250665bd3adbSJohn Baldwin free_tls_enable(&en); \ 250765bd3adbSJohn Baldwin } 250865bd3adbSJohn Baldwin 250965bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 251065bd3adbSJohn Baldwin auth_alg, minor) \ 251165bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_padding); 251265bd3adbSJohn Baldwin 251365bd3adbSJohn Baldwin #define GEN_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \ 251465bd3adbSJohn Baldwin auth_alg, minor) \ 251565bd3adbSJohn Baldwin GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 251665bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 251765bd3adbSJohn Baldwin GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 251865bd3adbSJohn Baldwin auth_alg, minor, 64) \ 251965bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 252065bd3adbSJohn Baldwin auth_alg, minor, non_block_size, \ 252165bd3adbSJohn Baldwin tls_minimum_record_payload(&en) + 1) 252265bd3adbSJohn Baldwin 252365bd3adbSJohn Baldwin #define ADD_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \ 252465bd3adbSJohn Baldwin auth_alg, minor) \ 252565bd3adbSJohn Baldwin ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 252665bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 252765bd3adbSJohn Baldwin ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 252865bd3adbSJohn Baldwin auth_alg, minor) \ 252965bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 253065bd3adbSJohn Baldwin auth_alg, minor, non_block_size) 253165bd3adbSJohn Baldwin 253264811651SJohn Baldwin /* 253364811651SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 253464811651SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 253564811651SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 253664811651SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 253764811651SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 253864811651SJohn Baldwin * of the possible padding lengths for each suite. 253964811651SJohn Baldwin * 254064811651SJohn Baldwin * Two additional tests check for additional padding with an extra 254164811651SJohn Baldwin * 16 or 32 bytes beyond the normal padding. 254265bd3adbSJohn Baldwin * 254365bd3adbSJohn Baldwin * Another test checks for corrupted padding. 254465bd3adbSJohn Baldwin * 254565bd3adbSJohn Baldwin * Another test checks for a record whose payload is not a multiple of 254665bd3adbSJohn Baldwin * the AES block size. 254764811651SJohn Baldwin */ 254865bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_MTE_TESTS); 254964811651SJohn Baldwin 255065bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 255165bd3adbSJohn Baldwin auth_alg, minor) \ 255265bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_iv); \ 255365bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc) \ 255465bd3adbSJohn Baldwin { \ 255565bd3adbSJohn Baldwin struct tls_enable en; \ 255665bd3adbSJohn Baldwin uint64_t seqno; \ 255765bd3adbSJohn Baldwin \ 255865bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 255965bd3adbSJohn Baldwin seqno = random(); \ 256070bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 256170bb2286SJohn Baldwin seqno, &en); \ 256265bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(tc, &en, seqno, 64); \ 256365bd3adbSJohn Baldwin free_tls_enable(&en); \ 256465bd3adbSJohn Baldwin } 256565bd3adbSJohn Baldwin 256665bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 256765bd3adbSJohn Baldwin auth_alg, minor) \ 256865bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_iv); 256965bd3adbSJohn Baldwin 257065bd3adbSJohn Baldwin #define GEN_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \ 257164811651SJohn Baldwin key_size, auth_alg, minor) \ 257265bd3adbSJohn Baldwin GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 257365bd3adbSJohn Baldwin auth_alg, minor) \ 257465bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 257565bd3adbSJohn Baldwin auth_alg, minor, short_header, \ 257665bd3adbSJohn Baldwin sizeof(struct tls_record_layer) + 1) 257765bd3adbSJohn Baldwin 257865bd3adbSJohn Baldwin #define ADD_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \ 257965bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 258065bd3adbSJohn Baldwin ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 258165bd3adbSJohn Baldwin auth_alg, minor) \ 258265bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 258365bd3adbSJohn Baldwin auth_alg, minor, short_header) 258465bd3adbSJohn Baldwin 258565bd3adbSJohn Baldwin /* 258665bd3adbSJohn Baldwin * For cipher suites with an explicit IV, run a receive test where the 258765bd3adbSJohn Baldwin * explicit IV has been corrupted. Also run a receive test that sends 258865bd3adbSJohn Baldwin * a short record without a complete IV. 258965bd3adbSJohn Baldwin */ 259065bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS); 259165bd3adbSJohn Baldwin AES_GCM_12_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS); 259265bd3adbSJohn Baldwin 259365bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 259465bd3adbSJohn Baldwin auth_alg, minor, len) \ 259565bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_type); \ 259665bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc) \ 259765bd3adbSJohn Baldwin { \ 259865bd3adbSJohn Baldwin struct tls_enable en; \ 259965bd3adbSJohn Baldwin uint64_t seqno; \ 260065bd3adbSJohn Baldwin \ 260165bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 260265bd3adbSJohn Baldwin seqno = random(); \ 260370bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 260470bb2286SJohn Baldwin seqno, &en); \ 260565bd3adbSJohn Baldwin test_ktls_receive_bad_type(tc, &en, seqno, len); \ 260665bd3adbSJohn Baldwin free_tls_enable(&en); \ 260765bd3adbSJohn Baldwin } 260865bd3adbSJohn Baldwin 260965bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 261065bd3adbSJohn Baldwin auth_alg, minor) \ 261165bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_type); 261265bd3adbSJohn Baldwin 261365bd3adbSJohn Baldwin #define GEN_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \ 261465bd3adbSJohn Baldwin auth_alg, minor) \ 261505a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 261605a1d0f5SJohn Baldwin auth_alg, minor, short_padded, 64, 16) \ 261705a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 261865bd3adbSJohn Baldwin auth_alg, minor, long_padded, 64 * 1024, 15) \ 261965bd3adbSJohn Baldwin GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 262065bd3adbSJohn Baldwin auth_alg, minor, 64) 262105a1d0f5SJohn Baldwin 262265bd3adbSJohn Baldwin #define ADD_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \ 262365bd3adbSJohn Baldwin auth_alg, minor) \ 262405a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 262505a1d0f5SJohn Baldwin auth_alg, minor, short_padded) \ 262605a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 262765bd3adbSJohn Baldwin auth_alg, minor, long_padded) \ 262865bd3adbSJohn Baldwin ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 262965bd3adbSJohn Baldwin auth_alg, minor) 263005a1d0f5SJohn Baldwin 263105a1d0f5SJohn Baldwin /* 263205a1d0f5SJohn Baldwin * For TLS 1.3 cipher suites, run two additional receive tests which 263365bd3adbSJohn Baldwin * use add padding to each record. Also run a test that uses an 263465bd3adbSJohn Baldwin * invalid "outer" record type. 263505a1d0f5SJohn Baldwin */ 263665bd3adbSJohn Baldwin TLS_13_TESTS(GEN_RECEIVE_TLS13_TESTS); 26373e7f8a8dSJohn Baldwin 2638233ce578SJohn Baldwin static void 26392400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc, 26402400a7b1SJohn Baldwin struct tls_enable *en) 2641233ce578SJohn Baldwin { 2642233ce578SJohn Baldwin int sockets[2]; 2643233ce578SJohn Baldwin 26442400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 2645233ce578SJohn Baldwin 2646*883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EINVAL, setsockopt(sockets[1], IPPROTO_TCP, 2647*883d1742SJohn Baldwin TCP_RXTLS_ENABLE, en, sizeof(*en)) == -1); 2648233ce578SJohn Baldwin 26492c105205SJohn Baldwin close_sockets(sockets); 2650233ce578SJohn Baldwin } 2651233ce578SJohn Baldwin 2652233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 2653233ce578SJohn Baldwin minor) \ 2654233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name); \ 2655233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc) \ 2656233ce578SJohn Baldwin { \ 2657233ce578SJohn Baldwin struct tls_enable en; \ 2658233ce578SJohn Baldwin uint64_t seqno; \ 2659233ce578SJohn Baldwin \ 2660233ce578SJohn Baldwin ATF_REQUIRE_KTLS(); \ 2661233ce578SJohn Baldwin seqno = random(); \ 266270bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 266370bb2286SJohn Baldwin seqno, &en); \ 26642400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(tc, &en); \ 2665233ce578SJohn Baldwin free_tls_enable(&en); \ 2666233ce578SJohn Baldwin } 2667233ce578SJohn Baldwin 2668233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 2669233ce578SJohn Baldwin minor) \ 2670233ce578SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name); 2671233ce578SJohn Baldwin 2672233ce578SJohn Baldwin /* 2673233ce578SJohn Baldwin * Ensure that invalid cipher suites are rejected for receive. 2674233ce578SJohn Baldwin */ 2675233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST); 2676233ce578SJohn Baldwin 267783a54b58SJohn Baldwin static void 26782400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc, 26792400a7b1SJohn Baldwin struct tls_enable *en) 268083a54b58SJohn Baldwin { 268183a54b58SJohn Baldwin int sockets[2]; 268283a54b58SJohn Baldwin 26832400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 268483a54b58SJohn Baldwin 2685*883d1742SJohn Baldwin ATF_REQUIRE_ERRNO(EPROTONOSUPPORT, setsockopt(sockets[1], IPPROTO_TCP, 2686*883d1742SJohn Baldwin TCP_RXTLS_ENABLE, en, sizeof(*en)) == -1); 268783a54b58SJohn Baldwin 26882c105205SJohn Baldwin close_sockets(sockets); 268983a54b58SJohn Baldwin } 269083a54b58SJohn Baldwin 269183a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 269283a54b58SJohn Baldwin auth_alg, minor) \ 269383a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name); \ 269483a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \ 269583a54b58SJohn Baldwin { \ 269683a54b58SJohn Baldwin struct tls_enable en; \ 269783a54b58SJohn Baldwin uint64_t seqno; \ 269883a54b58SJohn Baldwin \ 269983a54b58SJohn Baldwin ATF_REQUIRE_KTLS(); \ 270083a54b58SJohn Baldwin seqno = random(); \ 270170bb2286SJohn Baldwin build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ 270270bb2286SJohn Baldwin seqno, &en); \ 27032400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(tc, &en); \ 270483a54b58SJohn Baldwin free_tls_enable(&en); \ 270583a54b58SJohn Baldwin } 270683a54b58SJohn Baldwin 270783a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 270883a54b58SJohn Baldwin auth_alg, minor) \ 270983a54b58SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name); 271083a54b58SJohn Baldwin 271183a54b58SJohn Baldwin /* 271283a54b58SJohn Baldwin * Ensure that valid cipher suites not supported for receive are 271383a54b58SJohn Baldwin * rejected. 271483a54b58SJohn Baldwin */ 271564811651SJohn Baldwin TLS_10_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST); 271683a54b58SJohn Baldwin 2717ee5686c6SMark Johnston /* 2718ee5686c6SMark Johnston * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise 2719ee5686c6SMark Johnston * KTLS error handling in the socket layer. 2720ee5686c6SMark Johnston */ 2721ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst); 2722ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc) 2723ee5686c6SMark Johnston { 2724ee5686c6SMark Johnston char buf[32]; 2725ee5686c6SMark Johnston struct sockaddr_in dst; 2726ee5686c6SMark Johnston struct tls_enable en; 2727ee5686c6SMark Johnston ssize_t n; 2728ee5686c6SMark Johnston int s; 2729ee5686c6SMark Johnston 2730ee5686c6SMark Johnston ATF_REQUIRE_KTLS(); 2731ee5686c6SMark Johnston 2732ee5686c6SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 2733ee5686c6SMark Johnston ATF_REQUIRE(s >= 0); 2734ee5686c6SMark Johnston 273570bb2286SJohn Baldwin build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, 2736ee5686c6SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en); 2737ee5686c6SMark Johnston 2738ee5686c6SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, 2739ee5686c6SMark Johnston sizeof(en)) == 0); 2740ee5686c6SMark Johnston 2741ee5686c6SMark Johnston memset(&dst, 0, sizeof(dst)); 2742ee5686c6SMark Johnston dst.sin_family = AF_INET; 2743ee5686c6SMark Johnston dst.sin_len = sizeof(dst); 2744ee5686c6SMark Johnston dst.sin_addr.s_addr = htonl(INADDR_BROADCAST); 2745ee5686c6SMark Johnston dst.sin_port = htons(12345); 2746ee5686c6SMark Johnston 2747ee5686c6SMark Johnston memset(buf, 0, sizeof(buf)); 2748ee5686c6SMark Johnston n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst, 2749ee5686c6SMark Johnston sizeof(dst)); 2750ee5686c6SMark Johnston 2751ee5686c6SMark Johnston /* Can't transmit to the broadcast address over TCP. */ 2752ee5686c6SMark Johnston ATF_REQUIRE_ERRNO(EACCES, n == -1); 2753ee5686c6SMark Johnston ATF_REQUIRE(close(s) == 0); 2754ee5686c6SMark Johnston } 2755ee5686c6SMark Johnston 2756a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp) 2757a10482eaSJohn Baldwin { 27583e7f8a8dSJohn Baldwin /* Transmit tests */ 2759a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS); 2760a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS); 2761a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS); 276244265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS); 27635de79eedSMark Johnston AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 27645de79eedSMark Johnston AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 27655de79eedSMark Johnston CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 2766d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST); 2767a10482eaSJohn Baldwin 27683e7f8a8dSJohn Baldwin /* Receive tests */ 276964811651SJohn Baldwin TLS_10_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST); 277064811651SJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_TESTS); 277105a1d0f5SJohn Baldwin AES_GCM_TESTS(ADD_RECEIVE_TESTS); 277205a1d0f5SJohn Baldwin CHACHA20_TESTS(ADD_RECEIVE_TESTS); 277365bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_MTE_TESTS); 277465bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS); 277565bd3adbSJohn Baldwin AES_GCM_12_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS); 277665bd3adbSJohn Baldwin TLS_13_TESTS(ADD_RECEIVE_TLS13_TESTS); 2777233ce578SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST); 2778233ce578SJohn Baldwin 2779ee5686c6SMark Johnston /* Miscellaneous */ 2780ee5686c6SMark Johnston ATF_TP_ADD_TC(tp, ktls_sendto_baddst); 2781ee5686c6SMark Johnston 2782a10482eaSJohn Baldwin return (atf_no_error()); 2783a10482eaSJohn Baldwin } 2784