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 29*65bd3adbSJohn 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> 412400a7b1SJohn Baldwin #include <netdb.h> 42a10482eaSJohn Baldwin #include <poll.h> 43a10482eaSJohn Baldwin #include <stdbool.h> 44a10482eaSJohn Baldwin #include <stdlib.h> 45a10482eaSJohn Baldwin #include <atf-c.h> 46a10482eaSJohn Baldwin 47a10482eaSJohn Baldwin #include <openssl/err.h> 48a10482eaSJohn Baldwin #include <openssl/evp.h> 49a10482eaSJohn Baldwin #include <openssl/hmac.h> 50a10482eaSJohn Baldwin 51a10482eaSJohn Baldwin static void 52a10482eaSJohn Baldwin require_ktls(void) 53a10482eaSJohn Baldwin { 54a10482eaSJohn Baldwin size_t len; 55a10482eaSJohn Baldwin bool enable; 56a10482eaSJohn Baldwin 57a10482eaSJohn Baldwin len = sizeof(enable); 58a10482eaSJohn Baldwin if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) { 59a10482eaSJohn Baldwin if (errno == ENOENT) 60a10482eaSJohn Baldwin atf_tc_skip("kernel does not support TLS offload"); 61a10482eaSJohn Baldwin atf_libc_error(errno, "Failed to read kern.ipc.tls.enable"); 62a10482eaSJohn Baldwin } 63a10482eaSJohn Baldwin 64a10482eaSJohn Baldwin if (!enable) 65a10482eaSJohn Baldwin atf_tc_skip("Kernel TLS is disabled"); 66a10482eaSJohn Baldwin } 67a10482eaSJohn Baldwin 68a10482eaSJohn Baldwin #define ATF_REQUIRE_KTLS() require_ktls() 69a10482eaSJohn Baldwin 70ea4ebdcbSJohn Baldwin static void 71ea4ebdcbSJohn Baldwin check_tls_mode(const atf_tc_t *tc, int s, int sockopt) 72ea4ebdcbSJohn Baldwin { 73ea4ebdcbSJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_ifnet", false)) { 74ea4ebdcbSJohn Baldwin socklen_t len; 75ea4ebdcbSJohn Baldwin int mode; 76ea4ebdcbSJohn Baldwin 77ea4ebdcbSJohn Baldwin len = sizeof(mode); 78ea4ebdcbSJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1) 79ea4ebdcbSJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode"); 80ea4ebdcbSJohn Baldwin 81ea4ebdcbSJohn Baldwin if (mode != TCP_TLS_MODE_IFNET) 82ea4ebdcbSJohn Baldwin atf_tc_skip("connection did not use ifnet TLS"); 83ea4ebdcbSJohn Baldwin } 84cc13c983SJohn Baldwin 85cc13c983SJohn Baldwin if (atf_tc_get_config_var_as_bool_wd(tc, "ktls.require_toe", false)) { 86cc13c983SJohn Baldwin socklen_t len; 87cc13c983SJohn Baldwin int mode; 88cc13c983SJohn Baldwin 89cc13c983SJohn Baldwin len = sizeof(mode); 90cc13c983SJohn Baldwin if (getsockopt(s, IPPROTO_TCP, sockopt, &mode, &len) == -1) 91cc13c983SJohn Baldwin atf_libc_error(errno, "Failed to fetch TLS mode"); 92cc13c983SJohn Baldwin 93cc13c983SJohn Baldwin if (mode != TCP_TLS_MODE_TOE) 94cc13c983SJohn Baldwin atf_tc_skip("connection did not use TOE TLS"); 95cc13c983SJohn Baldwin } 96ea4ebdcbSJohn Baldwin } 97ea4ebdcbSJohn Baldwin 98a10482eaSJohn Baldwin static char 99a10482eaSJohn Baldwin rdigit(void) 100a10482eaSJohn Baldwin { 101a10482eaSJohn Baldwin /* ASCII printable values between 0x20 and 0x7e */ 102a10482eaSJohn Baldwin return (0x20 + random() % (0x7f - 0x20)); 103a10482eaSJohn Baldwin } 104a10482eaSJohn Baldwin 105a10482eaSJohn Baldwin static char * 106a10482eaSJohn Baldwin alloc_buffer(size_t len) 107a10482eaSJohn Baldwin { 108a10482eaSJohn Baldwin char *buf; 109a10482eaSJohn Baldwin size_t i; 110a10482eaSJohn Baldwin 111a10482eaSJohn Baldwin if (len == 0) 112a10482eaSJohn Baldwin return (NULL); 113a10482eaSJohn Baldwin buf = malloc(len); 114a10482eaSJohn Baldwin for (i = 0; i < len; i++) 115a10482eaSJohn Baldwin buf[i] = rdigit(); 116a10482eaSJohn Baldwin return (buf); 117a10482eaSJohn Baldwin } 118a10482eaSJohn Baldwin 119a10482eaSJohn Baldwin static bool 1202c105205SJohn Baldwin socketpair_tcp(int sv[2]) 121a10482eaSJohn Baldwin { 122a10482eaSJohn Baldwin struct pollfd pfd; 123a10482eaSJohn Baldwin struct sockaddr_in sin; 124a10482eaSJohn Baldwin socklen_t len; 125a10482eaSJohn Baldwin int as, cs, ls; 126a10482eaSJohn Baldwin 127a10482eaSJohn Baldwin ls = socket(PF_INET, SOCK_STREAM, 0); 128a10482eaSJohn Baldwin if (ls == -1) { 129a10482eaSJohn Baldwin warn("socket() for listen"); 130a10482eaSJohn Baldwin return (false); 131a10482eaSJohn Baldwin } 132a10482eaSJohn Baldwin 133a10482eaSJohn Baldwin memset(&sin, 0, sizeof(sin)); 134a10482eaSJohn Baldwin sin.sin_len = sizeof(sin); 135a10482eaSJohn Baldwin sin.sin_family = AF_INET; 136a10482eaSJohn Baldwin sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 137a10482eaSJohn Baldwin if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 138a10482eaSJohn Baldwin warn("bind"); 139a10482eaSJohn Baldwin close(ls); 140a10482eaSJohn Baldwin return (false); 141a10482eaSJohn Baldwin } 142a10482eaSJohn Baldwin 143a10482eaSJohn Baldwin if (listen(ls, 1) == -1) { 144a10482eaSJohn Baldwin warn("listen"); 145a10482eaSJohn Baldwin close(ls); 146a10482eaSJohn Baldwin return (false); 147a10482eaSJohn Baldwin } 148a10482eaSJohn Baldwin 149a10482eaSJohn Baldwin len = sizeof(sin); 150a10482eaSJohn Baldwin if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) { 151a10482eaSJohn Baldwin warn("getsockname"); 152a10482eaSJohn Baldwin close(ls); 153a10482eaSJohn Baldwin return (false); 154a10482eaSJohn Baldwin } 155a10482eaSJohn Baldwin 156a10482eaSJohn Baldwin cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); 157a10482eaSJohn Baldwin if (cs == -1) { 158a10482eaSJohn Baldwin warn("socket() for connect"); 159a10482eaSJohn Baldwin close(ls); 160a10482eaSJohn Baldwin return (false); 161a10482eaSJohn Baldwin } 162a10482eaSJohn Baldwin 163a10482eaSJohn Baldwin if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 164a10482eaSJohn Baldwin if (errno != EINPROGRESS) { 165a10482eaSJohn Baldwin warn("connect"); 166a10482eaSJohn Baldwin close(ls); 167a10482eaSJohn Baldwin close(cs); 168a10482eaSJohn Baldwin return (false); 169a10482eaSJohn Baldwin } 170a10482eaSJohn Baldwin } 171a10482eaSJohn Baldwin 172a10482eaSJohn Baldwin as = accept4(ls, NULL, NULL, SOCK_NONBLOCK); 173a10482eaSJohn Baldwin if (as == -1) { 174a10482eaSJohn Baldwin warn("accept4"); 175a10482eaSJohn Baldwin close(ls); 176a10482eaSJohn Baldwin close(cs); 177a10482eaSJohn Baldwin return (false); 178a10482eaSJohn Baldwin } 179a10482eaSJohn Baldwin 180a10482eaSJohn Baldwin close(ls); 181a10482eaSJohn Baldwin 182a10482eaSJohn Baldwin pfd.fd = cs; 183a10482eaSJohn Baldwin pfd.events = POLLOUT; 184a10482eaSJohn Baldwin pfd.revents = 0; 185a10482eaSJohn Baldwin ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1); 186a10482eaSJohn Baldwin ATF_REQUIRE(pfd.revents == POLLOUT); 187a10482eaSJohn Baldwin 188a10482eaSJohn Baldwin sv[0] = cs; 189a10482eaSJohn Baldwin sv[1] = as; 190a10482eaSJohn Baldwin return (true); 191a10482eaSJohn Baldwin } 192a10482eaSJohn Baldwin 1932400a7b1SJohn Baldwin static bool 1942400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2]) 1952400a7b1SJohn Baldwin { 1962400a7b1SJohn Baldwin const char *cause, *host, *port; 1972400a7b1SJohn Baldwin struct addrinfo hints, *ai, *tofree; 1982400a7b1SJohn Baldwin int error, flags, s; 1992400a7b1SJohn Baldwin 2002400a7b1SJohn Baldwin host = atf_tc_get_config_var(tc, "ktls.host"); 2012400a7b1SJohn Baldwin port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo"); 2022400a7b1SJohn Baldwin memset(&hints, 0, sizeof(hints)); 2032400a7b1SJohn Baldwin hints.ai_family = AF_UNSPEC; 2042400a7b1SJohn Baldwin hints.ai_socktype = SOCK_STREAM; 2052400a7b1SJohn Baldwin hints.ai_protocol = IPPROTO_TCP; 2062400a7b1SJohn Baldwin error = getaddrinfo(host, port, &hints, &tofree); 2072400a7b1SJohn Baldwin if (error != 0) { 2082400a7b1SJohn Baldwin warnx("getaddrinfo(%s:%s) failed: %s", host, port, 2092400a7b1SJohn Baldwin gai_strerror(error)); 2102400a7b1SJohn Baldwin return (false); 2112400a7b1SJohn Baldwin } 2122400a7b1SJohn Baldwin 2132400a7b1SJohn Baldwin cause = NULL; 2142400a7b1SJohn Baldwin for (ai = tofree; ai != NULL; ai = ai->ai_next) { 2152400a7b1SJohn Baldwin s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); 2162400a7b1SJohn Baldwin if (s == -1) { 2172400a7b1SJohn Baldwin cause = "socket"; 2182400a7b1SJohn Baldwin error = errno; 2192400a7b1SJohn Baldwin continue; 2202400a7b1SJohn Baldwin } 2212400a7b1SJohn Baldwin 2222400a7b1SJohn Baldwin if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) { 2232400a7b1SJohn Baldwin cause = "connect"; 2242400a7b1SJohn Baldwin error = errno; 2252400a7b1SJohn Baldwin close(s); 2262400a7b1SJohn Baldwin continue; 2272400a7b1SJohn Baldwin } 2282400a7b1SJohn Baldwin 2292400a7b1SJohn Baldwin freeaddrinfo(tofree); 2302400a7b1SJohn Baldwin 2312400a7b1SJohn Baldwin ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1); 2322400a7b1SJohn Baldwin flags |= O_NONBLOCK; 2332400a7b1SJohn Baldwin ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1); 2342400a7b1SJohn Baldwin 2352400a7b1SJohn Baldwin sv[0] = s; 2362400a7b1SJohn Baldwin sv[1] = s; 2372400a7b1SJohn Baldwin return (true); 2382400a7b1SJohn Baldwin } 2392400a7b1SJohn Baldwin 2402400a7b1SJohn Baldwin warnc(error, "%s", cause); 2412400a7b1SJohn Baldwin freeaddrinfo(tofree); 2422400a7b1SJohn Baldwin return (false); 2432400a7b1SJohn Baldwin } 2442400a7b1SJohn Baldwin 2452400a7b1SJohn Baldwin static bool 2462400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2]) 2472400a7b1SJohn Baldwin { 2482400a7b1SJohn Baldwin if (atf_tc_has_config_var(tc, "ktls.host")) 2492400a7b1SJohn Baldwin return (echo_socket(tc, sv)); 2502400a7b1SJohn Baldwin else 2512400a7b1SJohn Baldwin return (socketpair_tcp(sv)); 2522400a7b1SJohn Baldwin } 2532400a7b1SJohn Baldwin 254a10482eaSJohn Baldwin static void 2552c105205SJohn Baldwin close_sockets(int sv[2]) 2562c105205SJohn Baldwin { 2572400a7b1SJohn Baldwin if (sv[0] != sv[1]) 2582c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0); 2592c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0); 2602c105205SJohn Baldwin } 2612c105205SJohn Baldwin 2622c105205SJohn Baldwin static void 263a10482eaSJohn Baldwin fd_set_blocking(int fd) 264a10482eaSJohn Baldwin { 265a10482eaSJohn Baldwin int flags; 266a10482eaSJohn Baldwin 267a10482eaSJohn Baldwin ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1); 268a10482eaSJohn Baldwin flags &= ~O_NONBLOCK; 269a10482eaSJohn Baldwin ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1); 270a10482eaSJohn Baldwin } 271a10482eaSJohn Baldwin 272a10482eaSJohn Baldwin static bool 27364811651SJohn Baldwin cbc_crypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 27464811651SJohn Baldwin const char *input, char *output, size_t size, int enc) 275a10482eaSJohn Baldwin { 276a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 277a10482eaSJohn Baldwin int outl, total; 278a10482eaSJohn Baldwin 279a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 280a10482eaSJohn Baldwin if (ctx == NULL) { 281a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 282a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 283a10482eaSJohn Baldwin return (false); 284a10482eaSJohn Baldwin } 285a10482eaSJohn Baldwin if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key, 28664811651SJohn Baldwin (const u_char *)iv, enc) != 1) { 287a10482eaSJohn Baldwin warnx("EVP_CipherInit_ex failed: %s", 288a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 289a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 290a10482eaSJohn Baldwin return (false); 291a10482eaSJohn Baldwin } 292a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 293a10482eaSJohn Baldwin if (EVP_CipherUpdate(ctx, (u_char *)output, &outl, 294a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 295a10482eaSJohn Baldwin warnx("EVP_CipherUpdate failed: %s", 296a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 297a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 298a10482eaSJohn Baldwin return (false); 299a10482eaSJohn Baldwin } 300a10482eaSJohn Baldwin total = outl; 301a10482eaSJohn Baldwin if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 302a10482eaSJohn Baldwin warnx("EVP_CipherFinal_ex failed: %s", 303a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 304a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 305a10482eaSJohn Baldwin return (false); 306a10482eaSJohn Baldwin } 307a10482eaSJohn Baldwin total += outl; 308a10482eaSJohn Baldwin if ((size_t)total != size) { 309a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 310a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 311a10482eaSJohn Baldwin return (false); 312a10482eaSJohn Baldwin } 313a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 314a10482eaSJohn Baldwin return (true); 315a10482eaSJohn Baldwin } 316a10482eaSJohn Baldwin 317a10482eaSJohn Baldwin static bool 31864811651SJohn Baldwin cbc_encrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 31964811651SJohn Baldwin const char *input, char *output, size_t size) 32064811651SJohn Baldwin { 32164811651SJohn Baldwin return (cbc_crypt(cipher, key, iv, input, output, size, 1)); 32264811651SJohn Baldwin } 32364811651SJohn Baldwin 32464811651SJohn Baldwin static bool 32564811651SJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 32664811651SJohn Baldwin const char *input, char *output, size_t size) 32764811651SJohn Baldwin { 32864811651SJohn Baldwin return (cbc_crypt(cipher, key, iv, input, output, size, 0)); 32964811651SJohn Baldwin } 33064811651SJohn Baldwin 33164811651SJohn Baldwin static bool 33264811651SJohn Baldwin compute_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 33364811651SJohn Baldwin size_t aad_len, const void *buffer, size_t len, void *digest, 33464811651SJohn Baldwin u_int *digest_len) 335a10482eaSJohn Baldwin { 336a10482eaSJohn Baldwin HMAC_CTX *ctx; 337a10482eaSJohn Baldwin 338a10482eaSJohn Baldwin ctx = HMAC_CTX_new(); 339a10482eaSJohn Baldwin if (ctx == NULL) { 340a10482eaSJohn Baldwin warnx("HMAC_CTX_new failed: %s", 341a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 342a10482eaSJohn Baldwin return (false); 343a10482eaSJohn Baldwin } 344a10482eaSJohn Baldwin if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) { 345a10482eaSJohn Baldwin warnx("HMAC_Init_ex failed: %s", 346a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 347a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 348a10482eaSJohn Baldwin return (false); 349a10482eaSJohn Baldwin } 350a10482eaSJohn Baldwin if (HMAC_Update(ctx, aad, aad_len) != 1) { 351a10482eaSJohn Baldwin warnx("HMAC_Update (aad) failed: %s", 352a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 353a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 354a10482eaSJohn Baldwin return (false); 355a10482eaSJohn Baldwin } 356a10482eaSJohn Baldwin if (HMAC_Update(ctx, buffer, len) != 1) { 357a10482eaSJohn Baldwin warnx("HMAC_Update (payload) failed: %s", 358a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 359a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 360a10482eaSJohn Baldwin return (false); 361a10482eaSJohn Baldwin } 36264811651SJohn Baldwin if (HMAC_Final(ctx, digest, digest_len) != 1) { 363a10482eaSJohn Baldwin warnx("HMAC_Final failed: %s", 364a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 365a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 366a10482eaSJohn Baldwin return (false); 367a10482eaSJohn Baldwin } 368a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 36964811651SJohn Baldwin return (true); 37064811651SJohn Baldwin } 37164811651SJohn Baldwin 37264811651SJohn Baldwin static bool 37364811651SJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 37464811651SJohn Baldwin size_t aad_len, const void *buffer, size_t len, const void *digest) 37564811651SJohn Baldwin { 37664811651SJohn Baldwin unsigned char digest2[EVP_MAX_MD_SIZE]; 37764811651SJohn Baldwin u_int digest_len; 37864811651SJohn Baldwin 37964811651SJohn Baldwin if (!compute_hash(md, key, key_len, aad, aad_len, buffer, len, digest2, 38064811651SJohn Baldwin &digest_len)) 38164811651SJohn Baldwin return (false); 382a10482eaSJohn Baldwin if (memcmp(digest, digest2, digest_len) != 0) { 383a10482eaSJohn Baldwin warnx("HMAC mismatch"); 384a10482eaSJohn Baldwin return (false); 385a10482eaSJohn Baldwin } 386a10482eaSJohn Baldwin return (true); 387a10482eaSJohn Baldwin } 388a10482eaSJohn Baldwin 389a10482eaSJohn Baldwin static bool 3903e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 3913e7f8a8dSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 3923e7f8a8dSJohn Baldwin size_t size, char *tag, size_t tag_len) 3933e7f8a8dSJohn Baldwin { 3943e7f8a8dSJohn Baldwin EVP_CIPHER_CTX *ctx; 3953e7f8a8dSJohn Baldwin int outl, total; 3963e7f8a8dSJohn Baldwin 3973e7f8a8dSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 3983e7f8a8dSJohn Baldwin if (ctx == NULL) { 3993e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 4003e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4013e7f8a8dSJohn Baldwin return (false); 4023e7f8a8dSJohn Baldwin } 4033e7f8a8dSJohn Baldwin if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 4043e7f8a8dSJohn Baldwin (const u_char *)nonce) != 1) { 4053e7f8a8dSJohn Baldwin warnx("EVP_EncryptInit_ex failed: %s", 4063e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4073e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4083e7f8a8dSJohn Baldwin return (false); 4093e7f8a8dSJohn Baldwin } 4103e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 4113e7f8a8dSJohn Baldwin if (aad != NULL) { 4123e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 4133e7f8a8dSJohn Baldwin aad_len) != 1) { 4143e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate for AAD failed: %s", 4153e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4163e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4173e7f8a8dSJohn Baldwin return (false); 4183e7f8a8dSJohn Baldwin } 4193e7f8a8dSJohn Baldwin } 4203e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl, 4213e7f8a8dSJohn Baldwin (const u_char *)input, size) != 1) { 4223e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate failed: %s", 4233e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4243e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4253e7f8a8dSJohn Baldwin return (false); 4263e7f8a8dSJohn Baldwin } 4273e7f8a8dSJohn Baldwin total = outl; 4283e7f8a8dSJohn Baldwin if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 4293e7f8a8dSJohn Baldwin warnx("EVP_EncryptFinal_ex failed: %s", 4303e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4313e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4323e7f8a8dSJohn Baldwin return (false); 4333e7f8a8dSJohn Baldwin } 4343e7f8a8dSJohn Baldwin total += outl; 4353e7f8a8dSJohn Baldwin if ((size_t)total != size) { 4363e7f8a8dSJohn Baldwin warnx("encrypt size mismatch: %zu vs %d", size, total); 4373e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4383e7f8a8dSJohn Baldwin return (false); 4393e7f8a8dSJohn Baldwin } 4403e7f8a8dSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) != 4413e7f8a8dSJohn Baldwin 1) { 4423e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s", 4433e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 4443e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4453e7f8a8dSJohn Baldwin return (false); 4463e7f8a8dSJohn Baldwin } 4473e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 4483e7f8a8dSJohn Baldwin return (true); 4493e7f8a8dSJohn Baldwin } 4503e7f8a8dSJohn Baldwin 4513e7f8a8dSJohn Baldwin static bool 452a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 453a10482eaSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 454a10482eaSJohn Baldwin size_t size, const char *tag, size_t tag_len) 455a10482eaSJohn Baldwin { 456a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 457a10482eaSJohn Baldwin int outl, total; 458a10482eaSJohn Baldwin bool valid; 459a10482eaSJohn Baldwin 460a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 461a10482eaSJohn Baldwin if (ctx == NULL) { 462a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 463a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 464a10482eaSJohn Baldwin return (false); 465a10482eaSJohn Baldwin } 466a10482eaSJohn Baldwin if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 467a10482eaSJohn Baldwin (const u_char *)nonce) != 1) { 468a10482eaSJohn Baldwin warnx("EVP_DecryptInit_ex failed: %s", 469a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 470a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 471a10482eaSJohn Baldwin return (false); 472a10482eaSJohn Baldwin } 473a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 474a10482eaSJohn Baldwin if (aad != NULL) { 475a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 476a10482eaSJohn Baldwin aad_len) != 1) { 477a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate for AAD failed: %s", 478a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 479a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 480a10482eaSJohn Baldwin return (false); 481a10482eaSJohn Baldwin } 482a10482eaSJohn Baldwin } 483a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl, 484a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 485a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate failed: %s", 486a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 487a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 488a10482eaSJohn Baldwin return (false); 489a10482eaSJohn Baldwin } 490a10482eaSJohn Baldwin total = outl; 491a10482eaSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, 492a10482eaSJohn Baldwin __DECONST(char *, tag)) != 1) { 493a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) 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 valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1); 499a10482eaSJohn Baldwin total += outl; 500a10482eaSJohn Baldwin if ((size_t)total != size) { 501a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 502a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 503a10482eaSJohn Baldwin return (false); 504a10482eaSJohn Baldwin } 505a10482eaSJohn Baldwin if (!valid) 506a10482eaSJohn Baldwin warnx("tag mismatch"); 507a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 508a10482eaSJohn Baldwin return (valid); 509a10482eaSJohn Baldwin } 510a10482eaSJohn Baldwin 511a10482eaSJohn Baldwin static void 512a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg, 513a10482eaSJohn Baldwin int minor, uint64_t seqno, struct tls_enable *en) 514a10482eaSJohn Baldwin { 515a10482eaSJohn Baldwin u_int auth_key_len, iv_len; 516a10482eaSJohn Baldwin 517a10482eaSJohn Baldwin memset(en, 0, sizeof(*en)); 518a10482eaSJohn Baldwin 519a10482eaSJohn Baldwin switch (cipher_alg) { 520a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 521a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_ZERO) 522a10482eaSJohn Baldwin iv_len = AES_BLOCK_LEN; 523a10482eaSJohn Baldwin else 524a10482eaSJohn Baldwin iv_len = 0; 525a10482eaSJohn Baldwin break; 526a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 527a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_TWO) 528a10482eaSJohn Baldwin iv_len = TLS_AEAD_GCM_LEN; 529a10482eaSJohn Baldwin else 530a10482eaSJohn Baldwin iv_len = TLS_1_3_GCM_IV_LEN; 531a10482eaSJohn Baldwin break; 532a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 533a10482eaSJohn Baldwin iv_len = TLS_CHACHA20_IV_LEN; 534a10482eaSJohn Baldwin break; 535a10482eaSJohn Baldwin default: 536a10482eaSJohn Baldwin iv_len = 0; 537a10482eaSJohn Baldwin break; 538a10482eaSJohn Baldwin } 539a10482eaSJohn Baldwin switch (auth_alg) { 540a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 541a10482eaSJohn Baldwin auth_key_len = SHA1_HASH_LEN; 542a10482eaSJohn Baldwin break; 543a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 544a10482eaSJohn Baldwin auth_key_len = SHA2_256_HASH_LEN; 545a10482eaSJohn Baldwin break; 546a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 547a10482eaSJohn Baldwin auth_key_len = SHA2_384_HASH_LEN; 548a10482eaSJohn Baldwin break; 549a10482eaSJohn Baldwin default: 550a10482eaSJohn Baldwin auth_key_len = 0; 551a10482eaSJohn Baldwin break; 552a10482eaSJohn Baldwin } 553a10482eaSJohn Baldwin en->cipher_key = alloc_buffer(cipher_key_len); 554a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len); 555a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len); 556a10482eaSJohn Baldwin en->cipher_algorithm = cipher_alg; 557a10482eaSJohn Baldwin en->cipher_key_len = cipher_key_len; 558a10482eaSJohn Baldwin en->iv_len = iv_len; 559a10482eaSJohn Baldwin en->auth_algorithm = auth_alg; 560a10482eaSJohn Baldwin en->auth_key_len = auth_key_len; 561a10482eaSJohn Baldwin en->tls_vmajor = TLS_MAJOR_VER_ONE; 562a10482eaSJohn Baldwin en->tls_vminor = minor; 563a10482eaSJohn Baldwin be64enc(en->rec_seq, seqno); 564a10482eaSJohn Baldwin } 565a10482eaSJohn Baldwin 566a10482eaSJohn Baldwin static void 567a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en) 568a10482eaSJohn Baldwin { 569a10482eaSJohn Baldwin free(__DECONST(void *, en->cipher_key)); 570a10482eaSJohn Baldwin free(__DECONST(void *, en->iv)); 571a10482eaSJohn Baldwin free(__DECONST(void *, en->auth_key)); 572a10482eaSJohn Baldwin } 573a10482eaSJohn Baldwin 574a10482eaSJohn Baldwin static const EVP_CIPHER * 575a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en) 576a10482eaSJohn Baldwin { 577a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 578a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 579a10482eaSJohn Baldwin switch (en->cipher_key_len) { 580a10482eaSJohn Baldwin case 128 / 8: 581a10482eaSJohn Baldwin return (EVP_aes_128_cbc()); 582a10482eaSJohn Baldwin case 256 / 8: 583a10482eaSJohn Baldwin return (EVP_aes_256_cbc()); 584a10482eaSJohn Baldwin default: 585a10482eaSJohn Baldwin return (NULL); 586a10482eaSJohn Baldwin } 587a10482eaSJohn Baldwin break; 588a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 589a10482eaSJohn Baldwin switch (en->cipher_key_len) { 590a10482eaSJohn Baldwin case 128 / 8: 591a10482eaSJohn Baldwin return (EVP_aes_128_gcm()); 592a10482eaSJohn Baldwin case 256 / 8: 593a10482eaSJohn Baldwin return (EVP_aes_256_gcm()); 594a10482eaSJohn Baldwin default: 595a10482eaSJohn Baldwin return (NULL); 596a10482eaSJohn Baldwin } 597a10482eaSJohn Baldwin break; 598a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 599a10482eaSJohn Baldwin return (EVP_chacha20_poly1305()); 600a10482eaSJohn Baldwin default: 601a10482eaSJohn Baldwin return (NULL); 602a10482eaSJohn Baldwin } 603a10482eaSJohn Baldwin } 604a10482eaSJohn Baldwin 605a10482eaSJohn Baldwin static const EVP_MD * 606a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en) 607a10482eaSJohn Baldwin { 608a10482eaSJohn Baldwin switch (en->auth_algorithm) { 609a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 610a10482eaSJohn Baldwin return (EVP_sha1()); 611a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 612a10482eaSJohn Baldwin return (EVP_sha256()); 613a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 614a10482eaSJohn Baldwin return (EVP_sha384()); 615a10482eaSJohn Baldwin default: 616a10482eaSJohn Baldwin return (NULL); 617a10482eaSJohn Baldwin } 618a10482eaSJohn Baldwin } 619a10482eaSJohn Baldwin 620a10482eaSJohn Baldwin static size_t 621a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en) 622a10482eaSJohn Baldwin { 623a10482eaSJohn Baldwin size_t len; 624a10482eaSJohn Baldwin 625a10482eaSJohn Baldwin len = sizeof(struct tls_record_layer); 626a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 627a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 628a10482eaSJohn Baldwin if (en->tls_vminor != TLS_MINOR_VER_ZERO) 629a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 630a10482eaSJohn Baldwin return (len); 631a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 632a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) 633a10482eaSJohn Baldwin len += sizeof(uint64_t); 634a10482eaSJohn Baldwin return (len); 635a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 636a10482eaSJohn Baldwin return (len); 637a10482eaSJohn Baldwin default: 638a10482eaSJohn Baldwin return (0); 639a10482eaSJohn Baldwin } 640a10482eaSJohn Baldwin } 641a10482eaSJohn Baldwin 642a10482eaSJohn Baldwin static size_t 643a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en) 644a10482eaSJohn Baldwin { 645a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 646a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 647a10482eaSJohn Baldwin switch (en->auth_algorithm) { 648a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 649a10482eaSJohn Baldwin return (SHA1_HASH_LEN); 650a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 651a10482eaSJohn Baldwin return (SHA2_256_HASH_LEN); 652a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 653a10482eaSJohn Baldwin return (SHA2_384_HASH_LEN); 654a10482eaSJohn Baldwin default: 655a10482eaSJohn Baldwin return (0); 656a10482eaSJohn Baldwin } 657a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 658a10482eaSJohn Baldwin return (AES_GMAC_HASH_LEN); 659a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 660a10482eaSJohn Baldwin return (POLY1305_HASH_LEN); 661a10482eaSJohn Baldwin default: 662a10482eaSJohn Baldwin return (0); 663a10482eaSJohn Baldwin } 664a10482eaSJohn Baldwin } 665a10482eaSJohn Baldwin 666a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */ 667a10482eaSJohn Baldwin static size_t 668a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en) 669a10482eaSJohn Baldwin { 670a10482eaSJohn Baldwin size_t len; 671a10482eaSJohn Baldwin 672a10482eaSJohn Baldwin len = tls_mac_len(en); 673a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 674a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 675a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 676a10482eaSJohn Baldwin len++; 677a10482eaSJohn Baldwin return (len); 678a10482eaSJohn Baldwin } 679a10482eaSJohn Baldwin 680*65bd3adbSJohn Baldwin /* Minimum valid record payload size for a given cipher suite. */ 681*65bd3adbSJohn Baldwin static size_t 682*65bd3adbSJohn Baldwin tls_minimum_record_payload(struct tls_enable *en) 683*65bd3adbSJohn Baldwin { 684*65bd3adbSJohn Baldwin size_t len; 685*65bd3adbSJohn Baldwin 686*65bd3adbSJohn Baldwin len = tls_header_len(en); 687*65bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 688*65bd3adbSJohn Baldwin len += roundup2(tls_mac_len(en) + 1, AES_BLOCK_LEN); 689*65bd3adbSJohn Baldwin else 690*65bd3adbSJohn Baldwin len += tls_mac_len(en); 691*65bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 692*65bd3adbSJohn Baldwin len++; 693*65bd3adbSJohn Baldwin return (len - sizeof(struct tls_record_layer)); 694*65bd3adbSJohn Baldwin } 695*65bd3adbSJohn Baldwin 696a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */ 697a10482eaSJohn Baldwin static void 698a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len, 699a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad) 700a10482eaSJohn Baldwin { 701a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 702a10482eaSJohn Baldwin ad->type = hdr->tls_type; 703a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 704a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 705a10482eaSJohn Baldwin ad->tls_length = htons(len); 706a10482eaSJohn Baldwin } 707a10482eaSJohn Baldwin 708a10482eaSJohn Baldwin static void 709a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len, 710a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, 711a10482eaSJohn Baldwin struct tls_aead_data *ad) 712a10482eaSJohn Baldwin { 713a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 714a10482eaSJohn Baldwin ad->type = hdr->tls_type; 715a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 716a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 717a10482eaSJohn Baldwin ad->tls_length = htons(len); 718a10482eaSJohn Baldwin } 719a10482eaSJohn Baldwin 720a10482eaSJohn Baldwin static void 721a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr, 722a10482eaSJohn Baldwin uint64_t seqno, struct tls_aead_data_13 *ad) 723a10482eaSJohn Baldwin { 724a10482eaSJohn Baldwin ad->type = hdr->tls_type; 725a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 726a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 727a10482eaSJohn Baldwin ad->tls_length = hdr->tls_length; 728a10482eaSJohn Baldwin } 729a10482eaSJohn Baldwin 730a10482eaSJohn Baldwin static void 731a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr, 732a10482eaSJohn Baldwin char *nonce) 733a10482eaSJohn Baldwin { 734a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN); 735a10482eaSJohn Baldwin memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t)); 736a10482eaSJohn Baldwin } 737a10482eaSJohn Baldwin 738a10482eaSJohn Baldwin static void 739a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce) 740a10482eaSJohn Baldwin { 741a10482eaSJohn Baldwin static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN, 742a10482eaSJohn Baldwin "TLS 1.3 nonce length mismatch"); 743a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN); 744a10482eaSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(seqno); 745a10482eaSJohn Baldwin } 746a10482eaSJohn Baldwin 747a10482eaSJohn Baldwin /* 748a10482eaSJohn Baldwin * Decrypt a TLS record 'len' bytes long at 'src' and store the result at 749a10482eaSJohn Baldwin * 'dst'. If the TLS record header length doesn't match or 'dst' doesn't 750a10482eaSJohn Baldwin * have sufficient room ('avail'), fail the test. 751a10482eaSJohn Baldwin */ 752a10482eaSJohn Baldwin static size_t 753a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src, 754a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 755a10482eaSJohn Baldwin { 756a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 757a10482eaSJohn Baldwin struct tls_mac_data aad; 758a10482eaSJohn Baldwin const char *iv; 759a10482eaSJohn Baldwin char *buf; 760a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 761a10482eaSJohn Baldwin int padding; 762a10482eaSJohn Baldwin 763a10482eaSJohn Baldwin hdr = src; 764a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 765a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 766a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 767a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor); 768a10482eaSJohn Baldwin 769a10482eaSJohn Baldwin /* First, decrypt the outer payload into a temporary buffer. */ 770a10482eaSJohn Baldwin payload_len = len - hdr_len; 771a10482eaSJohn Baldwin buf = malloc(payload_len); 772a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 773a10482eaSJohn Baldwin iv = en->iv; 774a10482eaSJohn Baldwin else 775a10482eaSJohn Baldwin iv = (void *)(hdr + 1); 776a10482eaSJohn Baldwin ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 777a10482eaSJohn Baldwin (const u_char *)src + hdr_len, buf, payload_len)); 778a10482eaSJohn Baldwin 779a10482eaSJohn Baldwin /* 780a10482eaSJohn Baldwin * Copy the last encrypted block to use as the IV for the next 781a10482eaSJohn Baldwin * record for TLS 1.0. 782a10482eaSJohn Baldwin */ 783a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 784a10482eaSJohn Baldwin memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src + 785a10482eaSJohn Baldwin (len - AES_BLOCK_LEN), AES_BLOCK_LEN); 786a10482eaSJohn Baldwin 787a10482eaSJohn Baldwin /* 788a10482eaSJohn Baldwin * Verify trailing padding and strip. 789a10482eaSJohn Baldwin * 790a10482eaSJohn Baldwin * The kernel always generates the smallest amount of padding. 791a10482eaSJohn Baldwin */ 792a10482eaSJohn Baldwin padding = buf[payload_len - 1] + 1; 793a10482eaSJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN); 794a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= mac_len + padding); 795a10482eaSJohn Baldwin payload_len -= padding; 796a10482eaSJohn Baldwin 797a10482eaSJohn Baldwin /* Verify HMAC. */ 798a10482eaSJohn Baldwin payload_len -= mac_len; 799a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad); 800a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 801a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len)); 802a10482eaSJohn Baldwin 803a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 804a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 805a10482eaSJohn Baldwin *record_type = hdr->tls_type; 806a10482eaSJohn Baldwin return (payload_len); 807a10482eaSJohn Baldwin } 808a10482eaSJohn Baldwin 809a10482eaSJohn Baldwin static size_t 810a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src, 811a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 812a10482eaSJohn Baldwin { 813a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 814a10482eaSJohn Baldwin struct tls_aead_data aad; 815a10482eaSJohn Baldwin char nonce[12]; 816a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 817a10482eaSJohn Baldwin 818a10482eaSJohn Baldwin hdr = src; 819a10482eaSJohn Baldwin 820a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 821a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 822a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 823a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 824a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 825a10482eaSJohn Baldwin 826a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad); 827a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 828a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 829a10482eaSJohn Baldwin else 830a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 831a10482eaSJohn Baldwin 832a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 833a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len, 834a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 835a10482eaSJohn Baldwin 836a10482eaSJohn Baldwin *record_type = hdr->tls_type; 837a10482eaSJohn Baldwin return (payload_len); 838a10482eaSJohn Baldwin } 839a10482eaSJohn Baldwin 840a10482eaSJohn Baldwin static size_t 841a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src, 842a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 843a10482eaSJohn Baldwin { 844a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 845a10482eaSJohn Baldwin struct tls_aead_data_13 aad; 846a10482eaSJohn Baldwin char nonce[12]; 847a10482eaSJohn Baldwin char *buf; 848a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 849a10482eaSJohn Baldwin 850a10482eaSJohn Baldwin hdr = src; 851a10482eaSJohn Baldwin 852a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 853a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 854a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 855a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= 1); 856a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP); 857a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 858a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 859a10482eaSJohn Baldwin 860a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 861a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 862a10482eaSJohn Baldwin 863a10482eaSJohn Baldwin /* 864a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the 865a10482eaSJohn Baldwin * record type as the last byte of the trailer. 866a10482eaSJohn Baldwin */ 867a10482eaSJohn Baldwin buf = malloc(payload_len); 868a10482eaSJohn Baldwin 869a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 870a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len, 871a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 872a10482eaSJohn Baldwin 873a10482eaSJohn Baldwin /* Trim record type. */ 874a10482eaSJohn Baldwin *record_type = buf[payload_len - 1]; 875a10482eaSJohn Baldwin payload_len--; 876a10482eaSJohn Baldwin 877a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 878a10482eaSJohn Baldwin free(buf); 879a10482eaSJohn Baldwin 880a10482eaSJohn Baldwin return (payload_len); 881a10482eaSJohn Baldwin } 882a10482eaSJohn Baldwin 883a10482eaSJohn Baldwin static size_t 884a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src, 885a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 886a10482eaSJohn Baldwin { 887a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 888a10482eaSJohn Baldwin size_t payload_len; 889a10482eaSJohn Baldwin 890a10482eaSJohn Baldwin hdr = src; 891a10482eaSJohn Baldwin ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len); 892a10482eaSJohn Baldwin 893a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en)); 894a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 895a10482eaSJohn Baldwin 896a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 897a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst, 898a10482eaSJohn Baldwin record_type) == payload_len); 899a10482eaSJohn Baldwin } else { 900a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst, 901a10482eaSJohn Baldwin record_type) == payload_len); 902a10482eaSJohn Baldwin } 903a10482eaSJohn Baldwin 904a10482eaSJohn Baldwin return (payload_len); 905a10482eaSJohn Baldwin } 906a10482eaSJohn Baldwin 907a10482eaSJohn Baldwin static size_t 908a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src, 909a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 910a10482eaSJohn Baldwin { 911a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 912a10482eaSJohn Baldwin return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail, 913a10482eaSJohn Baldwin record_type)); 914a10482eaSJohn Baldwin else 915a10482eaSJohn Baldwin return (decrypt_tls_aead(en, seqno, src, len, dst, avail, 916a10482eaSJohn Baldwin record_type)); 917a10482eaSJohn Baldwin } 918a10482eaSJohn Baldwin 9193e7f8a8dSJohn Baldwin /* 9203e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes 9213e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have 92264811651SJohn Baldwin * sufficient room ('avail'), fail the test. 'padding' is the amount 92364811651SJohn Baldwin * of additional padding to include beyond any amount mandated by the 92464811651SJohn Baldwin * cipher suite. 9253e7f8a8dSJohn Baldwin */ 9263e7f8a8dSJohn Baldwin static size_t 92764811651SJohn Baldwin encrypt_tls_aes_cbc_mte(struct tls_enable *en, uint8_t record_type, 92864811651SJohn Baldwin uint64_t seqno, const void *src, size_t len, void *dst, size_t avail, 92964811651SJohn Baldwin size_t padding) 93064811651SJohn Baldwin { 93164811651SJohn Baldwin struct tls_record_layer *hdr; 93264811651SJohn Baldwin struct tls_mac_data aad; 93364811651SJohn Baldwin char *buf, *iv; 93464811651SJohn Baldwin size_t hdr_len, mac_len, record_len; 93564811651SJohn Baldwin u_int digest_len, i; 93664811651SJohn Baldwin 93764811651SJohn Baldwin ATF_REQUIRE(padding % 16 == 0); 93864811651SJohn Baldwin 93964811651SJohn Baldwin hdr = dst; 94064811651SJohn Baldwin buf = dst; 94164811651SJohn Baldwin 94264811651SJohn Baldwin hdr_len = tls_header_len(en); 94364811651SJohn Baldwin mac_len = tls_mac_len(en); 94464811651SJohn Baldwin padding += (AES_BLOCK_LEN - (len + mac_len) % AES_BLOCK_LEN); 94564811651SJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= 255); 94664811651SJohn Baldwin 94764811651SJohn Baldwin record_len = hdr_len + len + mac_len + padding; 94864811651SJohn Baldwin ATF_REQUIRE(record_len <= avail); 94964811651SJohn Baldwin 95064811651SJohn Baldwin hdr->tls_type = record_type; 95164811651SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 95264811651SJohn Baldwin hdr->tls_vminor = en->tls_vminor; 95364811651SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 95464811651SJohn Baldwin iv = (char *)(hdr + 1); 95564811651SJohn Baldwin for (i = 0; i < AES_BLOCK_LEN; i++) 95664811651SJohn Baldwin iv[i] = rdigit(); 95764811651SJohn Baldwin 95864811651SJohn Baldwin /* Copy plaintext to ciphertext region. */ 95964811651SJohn Baldwin memcpy(buf + hdr_len, src, len); 96064811651SJohn Baldwin 96164811651SJohn Baldwin /* Compute HMAC. */ 96264811651SJohn Baldwin tls_mte_aad(en, len, hdr, seqno, &aad); 96364811651SJohn Baldwin ATF_REQUIRE(compute_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 96464811651SJohn Baldwin &aad, sizeof(aad), src, len, buf + hdr_len + len, &digest_len)); 96564811651SJohn Baldwin ATF_REQUIRE(digest_len == mac_len); 96664811651SJohn Baldwin 96764811651SJohn Baldwin /* Store padding. */ 96864811651SJohn Baldwin for (i = 0; i < padding; i++) 96964811651SJohn Baldwin buf[hdr_len + len + mac_len + i] = padding - 1; 97064811651SJohn Baldwin 97164811651SJohn Baldwin /* Encrypt the record. */ 97264811651SJohn Baldwin ATF_REQUIRE(cbc_encrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 97364811651SJohn Baldwin buf + hdr_len, buf + hdr_len, len + mac_len + padding)); 97464811651SJohn Baldwin 97564811651SJohn Baldwin return (record_len); 97664811651SJohn Baldwin } 97764811651SJohn Baldwin 97864811651SJohn Baldwin static size_t 9793e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 9803e7f8a8dSJohn Baldwin const void *src, size_t len, void *dst) 9813e7f8a8dSJohn Baldwin { 9823e7f8a8dSJohn Baldwin struct tls_record_layer *hdr; 9833e7f8a8dSJohn Baldwin struct tls_aead_data aad; 9843e7f8a8dSJohn Baldwin char nonce[12]; 9853e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len; 9863e7f8a8dSJohn Baldwin 9873e7f8a8dSJohn Baldwin hdr = dst; 9883e7f8a8dSJohn Baldwin 9893e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en); 9903e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en); 9913e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len; 9923e7f8a8dSJohn Baldwin 9933e7f8a8dSJohn Baldwin hdr->tls_type = record_type; 9943e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 9953e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 9963e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 9973e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 9983e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno)); 9993e7f8a8dSJohn Baldwin 10003e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad); 10013e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 10023e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 10033e7f8a8dSJohn Baldwin else 10043e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce); 10053e7f8a8dSJohn Baldwin 10063e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 10073e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len, 10083e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len)); 10093e7f8a8dSJohn Baldwin 10103e7f8a8dSJohn Baldwin return (record_len); 10113e7f8a8dSJohn Baldwin } 10123e7f8a8dSJohn Baldwin 10133e7f8a8dSJohn Baldwin static size_t 101405a1d0f5SJohn Baldwin encrypt_tls_13_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 101505a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t padding) 101605a1d0f5SJohn Baldwin { 101705a1d0f5SJohn Baldwin struct tls_record_layer *hdr; 101805a1d0f5SJohn Baldwin struct tls_aead_data_13 aad; 101905a1d0f5SJohn Baldwin char nonce[12]; 102005a1d0f5SJohn Baldwin char *buf; 102105a1d0f5SJohn Baldwin size_t hdr_len, mac_len, record_len; 102205a1d0f5SJohn Baldwin 102305a1d0f5SJohn Baldwin hdr = dst; 102405a1d0f5SJohn Baldwin 102505a1d0f5SJohn Baldwin hdr_len = tls_header_len(en); 102605a1d0f5SJohn Baldwin mac_len = tls_mac_len(en); 102705a1d0f5SJohn Baldwin record_len = hdr_len + len + 1 + padding + mac_len; 102805a1d0f5SJohn Baldwin 102905a1d0f5SJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 103005a1d0f5SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 103105a1d0f5SJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 103205a1d0f5SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 103305a1d0f5SJohn Baldwin 103405a1d0f5SJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 103505a1d0f5SJohn Baldwin tls_13_nonce(en, seqno, nonce); 103605a1d0f5SJohn Baldwin 103705a1d0f5SJohn Baldwin /* 103805a1d0f5SJohn Baldwin * Have to use a temporary buffer for the input so that the record 103905a1d0f5SJohn Baldwin * type can be appended. 104005a1d0f5SJohn Baldwin */ 104105a1d0f5SJohn Baldwin buf = malloc(len + 1 + padding); 104205a1d0f5SJohn Baldwin memcpy(buf, src, len); 104305a1d0f5SJohn Baldwin buf[len] = record_type; 104405a1d0f5SJohn Baldwin memset(buf + len + 1, 0, padding); 104505a1d0f5SJohn Baldwin 104605a1d0f5SJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 104705a1d0f5SJohn Baldwin &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding, 104805a1d0f5SJohn Baldwin (char *)dst + hdr_len + len + 1 + padding, mac_len)); 104905a1d0f5SJohn Baldwin 105005a1d0f5SJohn Baldwin free(buf); 105105a1d0f5SJohn Baldwin 105205a1d0f5SJohn Baldwin return (record_len); 105305a1d0f5SJohn Baldwin } 105405a1d0f5SJohn Baldwin 105505a1d0f5SJohn Baldwin static size_t 10563e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 105705a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, size_t padding) 10583e7f8a8dSJohn Baldwin { 10593e7f8a8dSJohn Baldwin size_t record_len; 10603e7f8a8dSJohn Baldwin 106105a1d0f5SJohn Baldwin record_len = tls_header_len(en) + len + padding + tls_trailer_len(en); 10623e7f8a8dSJohn Baldwin ATF_REQUIRE(record_len <= avail); 10633e7f8a8dSJohn Baldwin 106405a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 106505a1d0f5SJohn Baldwin ATF_REQUIRE(padding == 0); 106605a1d0f5SJohn Baldwin ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src, 106705a1d0f5SJohn Baldwin len, dst) == record_len); 106805a1d0f5SJohn Baldwin } else 106905a1d0f5SJohn Baldwin ATF_REQUIRE(encrypt_tls_13_aead(en, record_type, seqno, src, 107005a1d0f5SJohn Baldwin len, dst, padding) == record_len); 10713e7f8a8dSJohn Baldwin 10723e7f8a8dSJohn Baldwin return (record_len); 10733e7f8a8dSJohn Baldwin } 10743e7f8a8dSJohn Baldwin 10753e7f8a8dSJohn Baldwin static size_t 10763e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 107705a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, size_t padding) 10783e7f8a8dSJohn Baldwin { 107964811651SJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 108064811651SJohn Baldwin return (encrypt_tls_aes_cbc_mte(en, record_type, seqno, src, 108164811651SJohn Baldwin len, dst, avail, padding)); 108264811651SJohn Baldwin else 108364811651SJohn Baldwin return (encrypt_tls_aead(en, record_type, seqno, src, len, 108464811651SJohn Baldwin dst, avail, padding)); 10853e7f8a8dSJohn Baldwin } 10863e7f8a8dSJohn Baldwin 1087a10482eaSJohn Baldwin static void 10882400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en, 10892400a7b1SJohn Baldwin uint64_t seqno, size_t len) 1090a10482eaSJohn Baldwin { 1091a10482eaSJohn Baldwin struct kevent ev; 1092a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1093a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1094a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written; 1095a10482eaSJohn Baldwin ssize_t rv; 1096a10482eaSJohn Baldwin int kq, sockets[2]; 1097a10482eaSJohn Baldwin uint8_t record_type; 1098a10482eaSJohn Baldwin 1099a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1100a10482eaSJohn Baldwin decrypted = malloc(len); 1101a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 1102a10482eaSJohn Baldwin tls_trailer_len(en); 1103a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1104a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1105a10482eaSJohn Baldwin 1106a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 1107a10482eaSJohn Baldwin 11082400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1109a10482eaSJohn Baldwin 1110a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1111a10482eaSJohn Baldwin sizeof(*en)) == 0); 1112ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 1113a10482eaSJohn Baldwin 1114a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 1115a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1116a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 1117a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1118a10482eaSJohn Baldwin 1119a10482eaSJohn Baldwin decrypted_len = 0; 1120a10482eaSJohn Baldwin outbuf_len = 0; 1121a10482eaSJohn Baldwin written = 0; 1122a10482eaSJohn Baldwin 1123a10482eaSJohn Baldwin while (decrypted_len != len) { 1124a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 1125a10482eaSJohn Baldwin 1126a10482eaSJohn Baldwin switch (ev.filter) { 1127a10482eaSJohn Baldwin case EVFILT_WRITE: 1128a10482eaSJohn Baldwin /* Try to write any remaining data. */ 1129a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written, 1130a10482eaSJohn Baldwin len - written); 1131a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1132a10482eaSJohn Baldwin "failed to write to socket"); 1133a10482eaSJohn Baldwin written += rv; 1134a10482eaSJohn Baldwin if (written == len) { 1135a10482eaSJohn Baldwin ev.flags = EV_DISABLE; 1136a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 1137a10482eaSJohn Baldwin NULL) == 0); 1138a10482eaSJohn Baldwin } 1139a10482eaSJohn Baldwin break; 1140a10482eaSJohn Baldwin 1141a10482eaSJohn Baldwin case EVFILT_READ: 1142a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 1143a10482eaSJohn Baldwin 1144a10482eaSJohn Baldwin /* 1145a10482eaSJohn Baldwin * Try to read data for the next TLS record 1146a10482eaSJohn Baldwin * into outbuf. Start by reading the header 1147a10482eaSJohn Baldwin * to determine how much additional data to 1148a10482eaSJohn Baldwin * read. 1149a10482eaSJohn Baldwin */ 1150a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) { 1151a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1152a10482eaSJohn Baldwin sizeof(struct tls_record_layer) - 1153a10482eaSJohn Baldwin outbuf_len); 1154a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1155a10482eaSJohn Baldwin "failed to read from socket"); 1156a10482eaSJohn Baldwin outbuf_len += rv; 1157a10482eaSJohn Baldwin } 1158a10482eaSJohn Baldwin 1159a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) 1160a10482eaSJohn Baldwin break; 1161a10482eaSJohn Baldwin 1162a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) + 1163a10482eaSJohn Baldwin ntohs(hdr->tls_length); 1164d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1165d71830cdSJohn Baldwin ATF_REQUIRE(record_len > outbuf_len); 1166a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1167a10482eaSJohn Baldwin record_len - outbuf_len); 1168a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN) 1169a10482eaSJohn Baldwin break; 1170a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, "failed to read from socket"); 1171a10482eaSJohn Baldwin 1172a10482eaSJohn Baldwin outbuf_len += rv; 1173a10482eaSJohn Baldwin if (outbuf_len == record_len) { 1174a10482eaSJohn Baldwin decrypted_len += decrypt_tls_record(en, seqno, 1175a10482eaSJohn Baldwin outbuf, outbuf_len, 1176a10482eaSJohn Baldwin decrypted + decrypted_len, 1177a10482eaSJohn Baldwin len - decrypted_len, &record_type); 1178a10482eaSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 1179a10482eaSJohn Baldwin 1180a10482eaSJohn Baldwin seqno++; 1181a10482eaSJohn Baldwin outbuf_len = 0; 1182a10482eaSJohn Baldwin } 1183a10482eaSJohn Baldwin break; 1184a10482eaSJohn Baldwin } 1185a10482eaSJohn Baldwin } 1186a10482eaSJohn Baldwin 1187a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len, 1188a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written); 1189a10482eaSJohn Baldwin 1190a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1191a10482eaSJohn Baldwin 1192a10482eaSJohn Baldwin free(outbuf); 1193a10482eaSJohn Baldwin free(decrypted); 1194a10482eaSJohn Baldwin free(plaintext); 1195a10482eaSJohn Baldwin 11962c105205SJohn Baldwin close_sockets(sockets); 1197694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 1198a10482eaSJohn Baldwin } 1199a10482eaSJohn Baldwin 1200a10482eaSJohn Baldwin static void 1201a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len) 1202a10482eaSJohn Baldwin { 1203a10482eaSJohn Baldwin struct msghdr msg; 1204a10482eaSJohn Baldwin struct cmsghdr *cmsg; 1205a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))]; 1206a10482eaSJohn Baldwin struct iovec iov; 1207a10482eaSJohn Baldwin 1208a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1209a10482eaSJohn Baldwin 1210a10482eaSJohn Baldwin msg.msg_control = cbuf; 1211a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1212a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 1213a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 1214a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 1215a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type)); 1216a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type; 1217a10482eaSJohn Baldwin 1218a10482eaSJohn Baldwin iov.iov_base = data; 1219a10482eaSJohn Baldwin iov.iov_len = len; 1220a10482eaSJohn Baldwin msg.msg_iov = &iov; 1221a10482eaSJohn Baldwin msg.msg_iovlen = 1; 1222a10482eaSJohn Baldwin 1223a10482eaSJohn Baldwin ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len); 1224a10482eaSJohn Baldwin } 1225a10482eaSJohn Baldwin 1226a10482eaSJohn Baldwin static void 12272400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en, 12282400a7b1SJohn Baldwin uint64_t seqno, uint8_t type, size_t len) 1229a10482eaSJohn Baldwin { 1230a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1231a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1232a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 1233a10482eaSJohn Baldwin ssize_t rv; 1234a10482eaSJohn Baldwin int sockets[2]; 1235a10482eaSJohn Baldwin uint8_t record_type; 1236a10482eaSJohn Baldwin 1237a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1238a10482eaSJohn Baldwin 1239a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1240a10482eaSJohn Baldwin decrypted = malloc(len); 1241a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1242a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1243a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1244a10482eaSJohn Baldwin 12452400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1246a10482eaSJohn Baldwin 1247a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1248a10482eaSJohn Baldwin sizeof(*en)) == 0); 1249ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 1250a10482eaSJohn Baldwin 1251a10482eaSJohn Baldwin fd_set_blocking(sockets[0]); 1252a10482eaSJohn Baldwin fd_set_blocking(sockets[1]); 1253a10482eaSJohn Baldwin 1254a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len); 1255a10482eaSJohn Baldwin 1256a10482eaSJohn Baldwin /* 1257a10482eaSJohn Baldwin * First read the header to determine how much additional data 1258a10482eaSJohn Baldwin * to read. 1259a10482eaSJohn Baldwin */ 1260a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1261a10482eaSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 1262a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length); 1263a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1264d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1265a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 1266a10482eaSJohn Baldwin payload_len); 1267a10482eaSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 1268a10482eaSJohn Baldwin 1269a10482eaSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len, 1270a10482eaSJohn Baldwin &record_type); 1271a10482eaSJohn Baldwin 1272a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv, 1273a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len); 1274a10482eaSJohn Baldwin ATF_REQUIRE(record_type == type); 1275a10482eaSJohn Baldwin 1276a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1277a10482eaSJohn Baldwin 1278a10482eaSJohn Baldwin free(outbuf); 1279a10482eaSJohn Baldwin free(decrypted); 1280a10482eaSJohn Baldwin free(plaintext); 1281a10482eaSJohn Baldwin 12822c105205SJohn Baldwin close_sockets(sockets); 1283a10482eaSJohn Baldwin } 1284a10482eaSJohn Baldwin 12850ff2a12aSJohn Baldwin static void 12862400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en, 12872400a7b1SJohn Baldwin uint64_t seqno) 12880ff2a12aSJohn Baldwin { 12890ff2a12aSJohn Baldwin struct tls_record_layer *hdr; 12900ff2a12aSJohn Baldwin char *outbuf; 12910ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 12920ff2a12aSJohn Baldwin ssize_t rv; 12930ff2a12aSJohn Baldwin int sockets[2]; 12940ff2a12aSJohn Baldwin uint8_t record_type; 12950ff2a12aSJohn Baldwin 12960ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en); 12970ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap); 12980ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 12990ff2a12aSJohn Baldwin 13002400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 13010ff2a12aSJohn Baldwin 13020ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 13030ff2a12aSJohn Baldwin sizeof(*en)) == 0); 1304ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[1], TCP_TXTLS_MODE); 13050ff2a12aSJohn Baldwin 13060ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]); 13070ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]); 13080ff2a12aSJohn Baldwin 13095de79eedSMark Johnston /* 13105de79eedSMark Johnston * A write of zero bytes should send an empty fragment only for 13115de79eedSMark Johnston * TLS 1.0, otherwise an error should be raised. 13125de79eedSMark Johnston */ 13130ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0); 13145de79eedSMark Johnston if (rv == 0) { 13155de79eedSMark Johnston ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC); 13165de79eedSMark Johnston ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO); 13175de79eedSMark Johnston } else { 13185de79eedSMark Johnston ATF_REQUIRE(rv == -1); 13195de79eedSMark Johnston ATF_REQUIRE(errno == EINVAL); 13205de79eedSMark Johnston goto out; 13215de79eedSMark Johnston } 13220ff2a12aSJohn Baldwin 13230ff2a12aSJohn Baldwin /* 13240ff2a12aSJohn Baldwin * First read the header to determine how much additional data 13250ff2a12aSJohn Baldwin * to read. 13260ff2a12aSJohn Baldwin */ 13270ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 13280ff2a12aSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 13290ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length); 13300ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 13310ff2a12aSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 13320ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 13330ff2a12aSJohn Baldwin payload_len); 13340ff2a12aSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 13350ff2a12aSJohn Baldwin 13360ff2a12aSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0, 13370ff2a12aSJohn Baldwin &record_type); 13380ff2a12aSJohn Baldwin 13390ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0, 13400ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv); 13410ff2a12aSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 13420ff2a12aSJohn Baldwin 13435de79eedSMark Johnston out: 13440ff2a12aSJohn Baldwin free(outbuf); 13450ff2a12aSJohn Baldwin 13462c105205SJohn Baldwin close_sockets(sockets); 13470ff2a12aSJohn Baldwin } 13480ff2a12aSJohn Baldwin 13493e7f8a8dSJohn Baldwin static size_t 13503e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type, 13513e7f8a8dSJohn Baldwin void *data, size_t len) 13523e7f8a8dSJohn Baldwin { 13533e7f8a8dSJohn Baldwin struct msghdr msg; 13543e7f8a8dSJohn Baldwin struct cmsghdr *cmsg; 13553e7f8a8dSJohn Baldwin struct tls_get_record *tgr; 13563e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 13573e7f8a8dSJohn Baldwin struct iovec iov; 13583e7f8a8dSJohn Baldwin ssize_t rv; 13593e7f8a8dSJohn Baldwin 13603e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg)); 13613e7f8a8dSJohn Baldwin 13623e7f8a8dSJohn Baldwin msg.msg_control = cbuf; 13633e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 13643e7f8a8dSJohn Baldwin 13653e7f8a8dSJohn Baldwin iov.iov_base = data; 13663e7f8a8dSJohn Baldwin iov.iov_len = len; 13673e7f8a8dSJohn Baldwin msg.msg_iov = &iov; 13683e7f8a8dSJohn Baldwin msg.msg_iovlen = 1; 13693e7f8a8dSJohn Baldwin 13703e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0); 13713e7f8a8dSJohn Baldwin 13723e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR); 13733e7f8a8dSJohn Baldwin 13743e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 13753e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL); 13763e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP); 13773e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD); 13783e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr))); 13793e7f8a8dSJohn Baldwin 13803e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 13813e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_type == record_type); 13823e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor); 138305a1d0f5SJohn Baldwin /* XXX: Not sure if this is what OpenSSL expects? */ 138405a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 138505a1d0f5SJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO); 138605a1d0f5SJohn Baldwin else 13873e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor); 13883e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_length == htons(rv)); 13893e7f8a8dSJohn Baldwin 13903e7f8a8dSJohn Baldwin return (rv); 13913e7f8a8dSJohn Baldwin } 13923e7f8a8dSJohn Baldwin 13933e7f8a8dSJohn Baldwin static void 13942400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en, 13952400a7b1SJohn Baldwin uint64_t seqno, size_t len, size_t padding) 13963e7f8a8dSJohn Baldwin { 13973e7f8a8dSJohn Baldwin struct kevent ev; 13983e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf; 13993e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written; 14003e7f8a8dSJohn Baldwin ssize_t rv; 14013e7f8a8dSJohn Baldwin int kq, sockets[2]; 14023e7f8a8dSJohn Baldwin 14033e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len); 14043e7f8a8dSJohn Baldwin received = malloc(len); 14053e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 14063e7f8a8dSJohn Baldwin tls_trailer_len(en); 14073e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap); 14083e7f8a8dSJohn Baldwin 14093e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 14103e7f8a8dSJohn Baldwin 14112400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 14123e7f8a8dSJohn Baldwin 14133e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 14143e7f8a8dSJohn Baldwin sizeof(*en)) == 0); 1415ea4ebdcbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 14163e7f8a8dSJohn Baldwin 14173e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 14183e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 14193e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 14203e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 14213e7f8a8dSJohn Baldwin 14223e7f8a8dSJohn Baldwin received_len = 0; 14233e7f8a8dSJohn Baldwin outbuf_len = 0; 14243e7f8a8dSJohn Baldwin written = 0; 14253e7f8a8dSJohn Baldwin 14263e7f8a8dSJohn Baldwin while (received_len != len) { 14273e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 14283e7f8a8dSJohn Baldwin 14293e7f8a8dSJohn Baldwin switch (ev.filter) { 14303e7f8a8dSJohn Baldwin case EVFILT_WRITE: 14313e7f8a8dSJohn Baldwin /* 14323e7f8a8dSJohn Baldwin * Compose the next TLS record to send. 14333e7f8a8dSJohn Baldwin */ 14343e7f8a8dSJohn Baldwin if (outbuf_len == 0) { 14353e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len); 14363e7f8a8dSJohn Baldwin todo = len - written; 143705a1d0f5SJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding) 143805a1d0f5SJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2 - padding; 14393e7f8a8dSJohn Baldwin outbuf_len = encrypt_tls_record(en, 14403e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written, 144105a1d0f5SJohn Baldwin todo, outbuf, outbuf_cap, padding); 14423e7f8a8dSJohn Baldwin outbuf_sent = 0; 14433e7f8a8dSJohn Baldwin written += todo; 14443e7f8a8dSJohn Baldwin seqno++; 14453e7f8a8dSJohn Baldwin } 14463e7f8a8dSJohn Baldwin 14473e7f8a8dSJohn Baldwin /* 14483e7f8a8dSJohn Baldwin * Try to write the remainder of the current 14493e7f8a8dSJohn Baldwin * TLS record. 14503e7f8a8dSJohn Baldwin */ 14513e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent, 14523e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent); 14533e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 14543e7f8a8dSJohn Baldwin "failed to write to socket"); 14553e7f8a8dSJohn Baldwin outbuf_sent += rv; 14563e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) { 14573e7f8a8dSJohn Baldwin outbuf_len = 0; 14583e7f8a8dSJohn Baldwin if (written == len) { 14593e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE; 14603e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 14613e7f8a8dSJohn Baldwin NULL) == 0); 14623e7f8a8dSJohn Baldwin } 14633e7f8a8dSJohn Baldwin } 14643e7f8a8dSJohn Baldwin break; 14653e7f8a8dSJohn Baldwin 14663e7f8a8dSJohn Baldwin case EVFILT_READ: 14673e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 14683e7f8a8dSJohn Baldwin 14693e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident, 14703e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len, 14713e7f8a8dSJohn Baldwin len - received_len); 14723e7f8a8dSJohn Baldwin received_len += rv; 14733e7f8a8dSJohn Baldwin break; 14743e7f8a8dSJohn Baldwin } 14753e7f8a8dSJohn Baldwin } 14763e7f8a8dSJohn Baldwin 14773e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len, 14783e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written); 14793e7f8a8dSJohn Baldwin 14803e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0); 14813e7f8a8dSJohn Baldwin 14823e7f8a8dSJohn Baldwin free(outbuf); 14833e7f8a8dSJohn Baldwin free(received); 14843e7f8a8dSJohn Baldwin free(plaintext); 14853e7f8a8dSJohn Baldwin 14862c105205SJohn Baldwin close_sockets(sockets); 1487694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 14883e7f8a8dSJohn Baldwin } 14893e7f8a8dSJohn Baldwin 1490*65bd3adbSJohn Baldwin static void 1491*65bd3adbSJohn Baldwin ktls_receive_tls_error(int fd, int expected_error) 1492*65bd3adbSJohn Baldwin { 1493*65bd3adbSJohn Baldwin struct msghdr msg; 1494*65bd3adbSJohn Baldwin struct tls_get_record *tgr; 1495*65bd3adbSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 1496*65bd3adbSJohn Baldwin char buf[64]; 1497*65bd3adbSJohn Baldwin struct iovec iov; 1498*65bd3adbSJohn Baldwin 1499*65bd3adbSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1500*65bd3adbSJohn Baldwin 1501*65bd3adbSJohn Baldwin msg.msg_control = cbuf; 1502*65bd3adbSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1503*65bd3adbSJohn Baldwin 1504*65bd3adbSJohn Baldwin iov.iov_base = buf; 1505*65bd3adbSJohn Baldwin iov.iov_len = sizeof(buf); 1506*65bd3adbSJohn Baldwin msg.msg_iov = &iov; 1507*65bd3adbSJohn Baldwin msg.msg_iovlen = 1; 1508*65bd3adbSJohn Baldwin 1509*65bd3adbSJohn Baldwin ATF_REQUIRE(recvmsg(fd, &msg, 0) == -1); 1510*65bd3adbSJohn Baldwin if (expected_error != 0) 1511*65bd3adbSJohn Baldwin ATF_REQUIRE(errno == expected_error); 1512*65bd3adbSJohn Baldwin } 1513*65bd3adbSJohn Baldwin 1514*65bd3adbSJohn Baldwin static void 1515*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(const atf_tc_t *tc, struct tls_enable *en, 1516*65bd3adbSJohn Baldwin uint64_t seqno, size_t len, ssize_t offset) 1517*65bd3adbSJohn Baldwin { 1518*65bd3adbSJohn Baldwin char *plaintext, *outbuf; 1519*65bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 1520*65bd3adbSJohn Baldwin ssize_t rv; 1521*65bd3adbSJohn Baldwin int sockets[2]; 1522*65bd3adbSJohn Baldwin 1523*65bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1524*65bd3adbSJohn Baldwin 1525*65bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 1526*65bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1527*65bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 1528*65bd3adbSJohn Baldwin 1529*65bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1530*65bd3adbSJohn Baldwin 1531*65bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1532*65bd3adbSJohn Baldwin sizeof(*en)) == 0); 1533*65bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 1534*65bd3adbSJohn Baldwin 1535*65bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 1536*65bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 1537*65bd3adbSJohn Baldwin 1538*65bd3adbSJohn Baldwin outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno, 1539*65bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 1540*65bd3adbSJohn Baldwin 1541*65bd3adbSJohn Baldwin /* A negative offset is an offset from the end. */ 1542*65bd3adbSJohn Baldwin if (offset < 0) 1543*65bd3adbSJohn Baldwin offset += outbuf_len; 1544*65bd3adbSJohn Baldwin outbuf[offset] ^= 0x01; 1545*65bd3adbSJohn Baldwin 1546*65bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1547*65bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 1548*65bd3adbSJohn Baldwin 1549*65bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EBADMSG); 1550*65bd3adbSJohn Baldwin 1551*65bd3adbSJohn Baldwin free(outbuf); 1552*65bd3adbSJohn Baldwin free(plaintext); 1553*65bd3adbSJohn Baldwin 1554*65bd3adbSJohn Baldwin close_sockets(sockets); 1555*65bd3adbSJohn Baldwin } 1556*65bd3adbSJohn Baldwin 1557*65bd3adbSJohn Baldwin static void 1558*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(const atf_tc_t *tc, struct tls_enable *en, 1559*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1560*65bd3adbSJohn Baldwin { 1561*65bd3adbSJohn Baldwin ATF_REQUIRE(tls_header_len(en) > sizeof(struct tls_record_layer)); 1562*65bd3adbSJohn Baldwin 1563*65bd3adbSJohn Baldwin /* Corrupt the first byte of the explicit IV after the header. */ 1564*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, 1565*65bd3adbSJohn Baldwin sizeof(struct tls_record_layer)); 1566*65bd3adbSJohn Baldwin } 1567*65bd3adbSJohn Baldwin 1568*65bd3adbSJohn Baldwin static void 1569*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(const atf_tc_t *tc, struct tls_enable *en, 1570*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1571*65bd3adbSJohn Baldwin { 1572*65bd3adbSJohn Baldwin ATF_REQUIRE(len > 0); 1573*65bd3adbSJohn Baldwin 1574*65bd3adbSJohn Baldwin /* Corrupt the first ciphertext byte after the header. */ 1575*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, 1576*65bd3adbSJohn Baldwin tls_header_len(en)); 1577*65bd3adbSJohn Baldwin } 1578*65bd3adbSJohn Baldwin 1579*65bd3adbSJohn Baldwin static void 1580*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(const atf_tc_t *tc, struct tls_enable *en, 1581*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1582*65bd3adbSJohn Baldwin { 1583*65bd3adbSJohn Baldwin size_t offset; 1584*65bd3adbSJohn Baldwin 1585*65bd3adbSJohn Baldwin /* Corrupt the first byte of the MAC. */ 1586*65bd3adbSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 1587*65bd3adbSJohn Baldwin offset = tls_header_len(en) + len; 1588*65bd3adbSJohn Baldwin else 1589*65bd3adbSJohn Baldwin offset = -tls_mac_len(en); 1590*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, offset); 1591*65bd3adbSJohn Baldwin } 1592*65bd3adbSJohn Baldwin 1593*65bd3adbSJohn Baldwin static void 1594*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(const atf_tc_t *tc, struct tls_enable *en, 1595*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1596*65bd3adbSJohn Baldwin { 1597*65bd3adbSJohn Baldwin ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC); 1598*65bd3adbSJohn Baldwin 1599*65bd3adbSJohn Baldwin /* Corrupt the last byte of the padding. */ 1600*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_record(tc, en, seqno, len, -1); 1601*65bd3adbSJohn Baldwin } 1602*65bd3adbSJohn Baldwin 1603*65bd3adbSJohn Baldwin static void 1604*65bd3adbSJohn Baldwin test_ktls_receive_truncated_record(const atf_tc_t *tc, struct tls_enable *en, 1605*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1606*65bd3adbSJohn Baldwin { 1607*65bd3adbSJohn Baldwin char *plaintext, *outbuf; 1608*65bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 1609*65bd3adbSJohn Baldwin ssize_t rv; 1610*65bd3adbSJohn Baldwin int sockets[2]; 1611*65bd3adbSJohn Baldwin 1612*65bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1613*65bd3adbSJohn Baldwin 1614*65bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 1615*65bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1616*65bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 1617*65bd3adbSJohn Baldwin 1618*65bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1619*65bd3adbSJohn Baldwin 1620*65bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1621*65bd3adbSJohn Baldwin sizeof(*en)) == 0); 1622*65bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 1623*65bd3adbSJohn Baldwin 1624*65bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 1625*65bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 1626*65bd3adbSJohn Baldwin 1627*65bd3adbSJohn Baldwin outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno, 1628*65bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 1629*65bd3adbSJohn Baldwin 1630*65bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len / 2); 1631*65bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)(outbuf_len / 2)); 1632*65bd3adbSJohn Baldwin 1633*65bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0); 1634*65bd3adbSJohn Baldwin 1635*65bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE); 1636*65bd3adbSJohn Baldwin 1637*65bd3adbSJohn Baldwin free(outbuf); 1638*65bd3adbSJohn Baldwin free(plaintext); 1639*65bd3adbSJohn Baldwin 1640*65bd3adbSJohn Baldwin close_sockets(sockets); 1641*65bd3adbSJohn Baldwin } 1642*65bd3adbSJohn Baldwin 1643*65bd3adbSJohn Baldwin static void 1644*65bd3adbSJohn Baldwin test_ktls_receive_bad_major(const atf_tc_t *tc, struct tls_enable *en, 1645*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1646*65bd3adbSJohn Baldwin { 1647*65bd3adbSJohn Baldwin struct tls_record_layer *hdr; 1648*65bd3adbSJohn Baldwin char *plaintext, *outbuf; 1649*65bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 1650*65bd3adbSJohn Baldwin ssize_t rv; 1651*65bd3adbSJohn Baldwin int sockets[2]; 1652*65bd3adbSJohn Baldwin 1653*65bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1654*65bd3adbSJohn Baldwin 1655*65bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 1656*65bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1657*65bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 1658*65bd3adbSJohn Baldwin 1659*65bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1660*65bd3adbSJohn Baldwin 1661*65bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1662*65bd3adbSJohn Baldwin sizeof(*en)) == 0); 1663*65bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 1664*65bd3adbSJohn Baldwin 1665*65bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 1666*65bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 1667*65bd3adbSJohn Baldwin 1668*65bd3adbSJohn Baldwin outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno, 1669*65bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 1670*65bd3adbSJohn Baldwin 1671*65bd3adbSJohn Baldwin hdr = (void *)outbuf; 1672*65bd3adbSJohn Baldwin hdr->tls_vmajor++; 1673*65bd3adbSJohn Baldwin 1674*65bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1675*65bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 1676*65bd3adbSJohn Baldwin 1677*65bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 1678*65bd3adbSJohn Baldwin 1679*65bd3adbSJohn Baldwin free(outbuf); 1680*65bd3adbSJohn Baldwin free(plaintext); 1681*65bd3adbSJohn Baldwin 1682*65bd3adbSJohn Baldwin close_sockets(sockets); 1683*65bd3adbSJohn Baldwin } 1684*65bd3adbSJohn Baldwin 1685*65bd3adbSJohn Baldwin static void 1686*65bd3adbSJohn Baldwin test_ktls_receive_bad_minor(const atf_tc_t *tc, struct tls_enable *en, 1687*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1688*65bd3adbSJohn Baldwin { 1689*65bd3adbSJohn Baldwin struct tls_record_layer *hdr; 1690*65bd3adbSJohn Baldwin char *plaintext, *outbuf; 1691*65bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 1692*65bd3adbSJohn Baldwin ssize_t rv; 1693*65bd3adbSJohn Baldwin int sockets[2]; 1694*65bd3adbSJohn Baldwin 1695*65bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1696*65bd3adbSJohn Baldwin 1697*65bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 1698*65bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1699*65bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 1700*65bd3adbSJohn Baldwin 1701*65bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1702*65bd3adbSJohn Baldwin 1703*65bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1704*65bd3adbSJohn Baldwin sizeof(*en)) == 0); 1705*65bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 1706*65bd3adbSJohn Baldwin 1707*65bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 1708*65bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 1709*65bd3adbSJohn Baldwin 1710*65bd3adbSJohn Baldwin outbuf_len = encrypt_tls_record(en, TLS_RLTYPE_APP, seqno, 1711*65bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 1712*65bd3adbSJohn Baldwin 1713*65bd3adbSJohn Baldwin hdr = (void *)outbuf; 1714*65bd3adbSJohn Baldwin hdr->tls_vminor++; 1715*65bd3adbSJohn Baldwin 1716*65bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1717*65bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 1718*65bd3adbSJohn Baldwin 1719*65bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 1720*65bd3adbSJohn Baldwin 1721*65bd3adbSJohn Baldwin free(outbuf); 1722*65bd3adbSJohn Baldwin free(plaintext); 1723*65bd3adbSJohn Baldwin 1724*65bd3adbSJohn Baldwin close_sockets(sockets); 1725*65bd3adbSJohn Baldwin } 1726*65bd3adbSJohn Baldwin 1727*65bd3adbSJohn Baldwin static void 1728*65bd3adbSJohn Baldwin test_ktls_receive_bad_type(const atf_tc_t *tc, struct tls_enable *en, 1729*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1730*65bd3adbSJohn Baldwin { 1731*65bd3adbSJohn Baldwin struct tls_record_layer *hdr; 1732*65bd3adbSJohn Baldwin char *plaintext, *outbuf; 1733*65bd3adbSJohn Baldwin size_t outbuf_cap, outbuf_len; 1734*65bd3adbSJohn Baldwin ssize_t rv; 1735*65bd3adbSJohn Baldwin int sockets[2]; 1736*65bd3adbSJohn Baldwin 1737*65bd3adbSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1738*65bd3adbSJohn Baldwin ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_THREE); 1739*65bd3adbSJohn Baldwin 1740*65bd3adbSJohn Baldwin plaintext = alloc_buffer(len); 1741*65bd3adbSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1742*65bd3adbSJohn Baldwin outbuf = malloc(outbuf_cap); 1743*65bd3adbSJohn Baldwin 1744*65bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1745*65bd3adbSJohn Baldwin 1746*65bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1747*65bd3adbSJohn Baldwin sizeof(*en)) == 0); 1748*65bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 1749*65bd3adbSJohn Baldwin 1750*65bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 1751*65bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 1752*65bd3adbSJohn Baldwin 1753*65bd3adbSJohn Baldwin outbuf_len = encrypt_tls_record(en, 0x21 /* Alert */, seqno, 1754*65bd3adbSJohn Baldwin plaintext, len, outbuf, outbuf_cap, 0); 1755*65bd3adbSJohn Baldwin 1756*65bd3adbSJohn Baldwin hdr = (void *)outbuf; 1757*65bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP + 1; 1758*65bd3adbSJohn Baldwin 1759*65bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1760*65bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 1761*65bd3adbSJohn Baldwin 1762*65bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EINVAL); 1763*65bd3adbSJohn Baldwin 1764*65bd3adbSJohn Baldwin free(outbuf); 1765*65bd3adbSJohn Baldwin free(plaintext); 1766*65bd3adbSJohn Baldwin 1767*65bd3adbSJohn Baldwin close_sockets(sockets); 1768*65bd3adbSJohn Baldwin } 1769*65bd3adbSJohn Baldwin 1770*65bd3adbSJohn Baldwin static void 1771*65bd3adbSJohn Baldwin test_ktls_receive_bad_size(const atf_tc_t *tc, struct tls_enable *en, 1772*65bd3adbSJohn Baldwin uint64_t seqno, size_t len) 1773*65bd3adbSJohn Baldwin { 1774*65bd3adbSJohn Baldwin struct tls_record_layer *hdr; 1775*65bd3adbSJohn Baldwin char *outbuf; 1776*65bd3adbSJohn Baldwin size_t outbuf_len; 1777*65bd3adbSJohn Baldwin ssize_t rv; 1778*65bd3adbSJohn Baldwin int sockets[2]; 1779*65bd3adbSJohn Baldwin 1780*65bd3adbSJohn Baldwin outbuf_len = sizeof(*hdr) + len; 1781*65bd3adbSJohn Baldwin outbuf = calloc(1, outbuf_len); 1782*65bd3adbSJohn Baldwin 1783*65bd3adbSJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1784*65bd3adbSJohn Baldwin 1785*65bd3adbSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1786*65bd3adbSJohn Baldwin sizeof(*en)) == 0); 1787*65bd3adbSJohn Baldwin check_tls_mode(tc, sockets[0], TCP_RXTLS_MODE); 1788*65bd3adbSJohn Baldwin 1789*65bd3adbSJohn Baldwin fd_set_blocking(sockets[0]); 1790*65bd3adbSJohn Baldwin fd_set_blocking(sockets[1]); 1791*65bd3adbSJohn Baldwin 1792*65bd3adbSJohn Baldwin hdr = (void *)outbuf; 1793*65bd3adbSJohn Baldwin hdr->tls_vmajor = en->tls_vmajor; 1794*65bd3adbSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 1795*65bd3adbSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 1796*65bd3adbSJohn Baldwin else 1797*65bd3adbSJohn Baldwin hdr->tls_vminor = en->tls_vminor; 1798*65bd3adbSJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 1799*65bd3adbSJohn Baldwin hdr->tls_length = htons(len); 1800*65bd3adbSJohn Baldwin 1801*65bd3adbSJohn Baldwin rv = write(sockets[1], outbuf, outbuf_len); 1802*65bd3adbSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)outbuf_len); 1803*65bd3adbSJohn Baldwin 1804*65bd3adbSJohn Baldwin ATF_REQUIRE(shutdown(sockets[1], SHUT_WR) == 0); 1805*65bd3adbSJohn Baldwin 1806*65bd3adbSJohn Baldwin ktls_receive_tls_error(sockets[0], EMSGSIZE); 1807*65bd3adbSJohn Baldwin 1808*65bd3adbSJohn Baldwin free(outbuf); 1809*65bd3adbSJohn Baldwin 1810*65bd3adbSJohn Baldwin close_sockets(sockets); 1811*65bd3adbSJohn Baldwin } 1812*65bd3adbSJohn Baldwin 18130ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \ 18140ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 181564811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 18160ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 181764811651SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) 18180ff2a12aSJohn Baldwin 181983a54b58SJohn Baldwin #define TLS_13_TESTS(M) \ 182083a54b58SJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 182183a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 182283a54b58SJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 182383a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 182483a54b58SJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 182583a54b58SJohn Baldwin TLS_MINOR_VER_THREE) 182683a54b58SJohn Baldwin 182764811651SJohn Baldwin #define AES_CBC_NONZERO_TESTS(M) \ 1828a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1829a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1830a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1831a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1832a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1833a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1834a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1835a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1836a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1837a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1838a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \ 1839a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1840a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1841a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1842a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \ 1843a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1844a10482eaSJohn Baldwin 184564811651SJohn Baldwin #define AES_CBC_TESTS(M) \ 184664811651SJohn Baldwin TLS_10_TESTS(M) \ 184764811651SJohn Baldwin AES_CBC_NONZERO_TESTS(M) 184864811651SJohn Baldwin 1849*65bd3adbSJohn Baldwin #define AES_GCM_12_TESTS(M) \ 1850a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1851a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1852a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1853*65bd3adbSJohn Baldwin TLS_MINOR_VER_TWO) 1854*65bd3adbSJohn Baldwin 1855*65bd3adbSJohn Baldwin #define AES_GCM_TESTS(M) \ 1856*65bd3adbSJohn Baldwin AES_GCM_12_TESTS(M) \ 1857a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1858a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \ 1859a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1860a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1861a10482eaSJohn Baldwin 1862a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \ 1863a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1864a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1865a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1866a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1867a10482eaSJohn Baldwin 1868a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1869a10482eaSJohn Baldwin auth_alg, minor, name, len) \ 1870a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 1871a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1872a10482eaSJohn Baldwin { \ 1873a10482eaSJohn Baldwin struct tls_enable en; \ 1874a10482eaSJohn Baldwin uint64_t seqno; \ 1875a10482eaSJohn Baldwin \ 1876a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1877a10482eaSJohn Baldwin seqno = random(); \ 1878a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1879a10482eaSJohn Baldwin &en); \ 18802400a7b1SJohn Baldwin test_ktls_transmit_app_data(tc, &en, seqno, len); \ 1881a10482eaSJohn Baldwin free_tls_enable(&en); \ 1882a10482eaSJohn Baldwin } 1883a10482eaSJohn Baldwin 1884a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1885a10482eaSJohn Baldwin auth_alg, minor, name) \ 1886a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1887a10482eaSJohn Baldwin 1888a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 188944265dc3SJohn Baldwin auth_alg, minor, name, type, len) \ 189044265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 189144265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1892a10482eaSJohn Baldwin { \ 1893a10482eaSJohn Baldwin struct tls_enable en; \ 1894a10482eaSJohn Baldwin uint64_t seqno; \ 1895a10482eaSJohn Baldwin \ 1896a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1897a10482eaSJohn Baldwin seqno = random(); \ 1898a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1899a10482eaSJohn Baldwin &en); \ 19002400a7b1SJohn Baldwin test_ktls_transmit_control(tc, &en, seqno, type, len); \ 1901a10482eaSJohn Baldwin free_tls_enable(&en); \ 1902a10482eaSJohn Baldwin } 1903a10482eaSJohn Baldwin 1904a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 190544265dc3SJohn Baldwin auth_alg, minor, name) \ 190644265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1907a10482eaSJohn Baldwin 19080ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 19095de79eedSMark Johnston key_size, auth_alg, minor) \ 19100ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \ 19110ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \ 19120ff2a12aSJohn Baldwin { \ 19130ff2a12aSJohn Baldwin struct tls_enable en; \ 19140ff2a12aSJohn Baldwin uint64_t seqno; \ 19150ff2a12aSJohn Baldwin \ 19160ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \ 19170ff2a12aSJohn Baldwin seqno = random(); \ 19185de79eedSMark Johnston build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 19195de79eedSMark Johnston &en); \ 19202400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(tc, &en, seqno); \ 19210ff2a12aSJohn Baldwin free_tls_enable(&en); \ 19220ff2a12aSJohn Baldwin } 19230ff2a12aSJohn Baldwin 19240ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 19255de79eedSMark Johnston key_size, auth_alg, minor) \ 19260ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment); 19270ff2a12aSJohn Baldwin 1928a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1929a10482eaSJohn Baldwin minor) \ 1930a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1931a10482eaSJohn Baldwin auth_alg, minor, short, 64) \ 1932a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1933a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \ 1934a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 193544265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32) 1936a10482eaSJohn Baldwin 1937a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1938a10482eaSJohn Baldwin minor) \ 1939a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1940a10482eaSJohn Baldwin auth_alg, minor, short) \ 1941a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1942a10482eaSJohn Baldwin auth_alg, minor, long) \ 1943a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 194444265dc3SJohn Baldwin auth_alg, minor, control) 1945a10482eaSJohn Baldwin 1946a10482eaSJohn Baldwin /* 1947a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests: 1948a10482eaSJohn Baldwin * 1949a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 1950a10482eaSJohn Baldwin * a single TLS record) 1951a10482eaSJohn Baldwin * 1952a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across 1953a10482eaSJohn Baldwin * multiple TLS records) 1954a10482eaSJohn Baldwin * 1955a10482eaSJohn Baldwin * - a control test which sends a single record with a specific 1956a10482eaSJohn Baldwin * content type via sendmsg() 1957a10482eaSJohn Baldwin */ 1958a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS); 1959a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS); 1960a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS); 1961a10482eaSJohn Baldwin 196244265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 196344265dc3SJohn Baldwin auth_alg, minor) \ 196444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 196544265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \ 196644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 196744265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \ 196844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 196944265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \ 197044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 197144265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \ 197244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 197344265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \ 197444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 197544265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \ 197644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 197744265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \ 197844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 197944265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \ 198044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198144265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \ 198244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198344265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \ 198444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198544265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \ 198644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198744265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \ 198844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 198944265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \ 199044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 199144265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \ 199244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 199344265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \ 199444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 199544265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16) 199644265dc3SJohn Baldwin 199744265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 199844265dc3SJohn Baldwin auth_alg, minor) \ 199944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 200044265dc3SJohn Baldwin auth_alg, minor, padding_1) \ 200144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 200244265dc3SJohn Baldwin auth_alg, minor, padding_2) \ 200344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 200444265dc3SJohn Baldwin auth_alg, minor, padding_3) \ 200544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 200644265dc3SJohn Baldwin auth_alg, minor, padding_4) \ 200744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 200844265dc3SJohn Baldwin auth_alg, minor, padding_5) \ 200944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 201044265dc3SJohn Baldwin auth_alg, minor, padding_6) \ 201144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 201244265dc3SJohn Baldwin auth_alg, minor, padding_7) \ 201344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 201444265dc3SJohn Baldwin auth_alg, minor, padding_8) \ 201544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 201644265dc3SJohn Baldwin auth_alg, minor, padding_9) \ 201744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 201844265dc3SJohn Baldwin auth_alg, minor, padding_10) \ 201944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202044265dc3SJohn Baldwin auth_alg, minor, padding_11) \ 202144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202244265dc3SJohn Baldwin auth_alg, minor, padding_12) \ 202344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202444265dc3SJohn Baldwin auth_alg, minor, padding_13) \ 202544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202644265dc3SJohn Baldwin auth_alg, minor, padding_14) \ 202744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 202844265dc3SJohn Baldwin auth_alg, minor, padding_15) \ 202944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 203044265dc3SJohn Baldwin auth_alg, minor, padding_16) 203144265dc3SJohn Baldwin 203244265dc3SJohn Baldwin /* 203344265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 203444265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 203544265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 203644265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 203744265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 203844265dc3SJohn Baldwin * of the possible padding lengths for each suite. 203944265dc3SJohn Baldwin */ 204044265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS); 204144265dc3SJohn Baldwin 20420ff2a12aSJohn Baldwin /* 20430ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that 20440ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections. 20450ff2a12aSJohn Baldwin */ 20465de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 20475de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 20485de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 20490ff2a12aSJohn Baldwin 2050d1c369f9SJohn Baldwin static void 20512400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc, 20522400a7b1SJohn Baldwin struct tls_enable *en) 2053d1c369f9SJohn Baldwin { 2054d1c369f9SJohn Baldwin int sockets[2]; 2055d1c369f9SJohn Baldwin 20562400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 2057d1c369f9SJohn Baldwin 2058d1c369f9SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 2059d1c369f9SJohn Baldwin sizeof(*en)) == -1); 2060d1c369f9SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 2061d1c369f9SJohn Baldwin 20622c105205SJohn Baldwin close_sockets(sockets); 2063d1c369f9SJohn Baldwin } 2064d1c369f9SJohn Baldwin 2065d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 2066d1c369f9SJohn Baldwin minor) \ 2067d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \ 2068d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \ 2069d1c369f9SJohn Baldwin { \ 2070d1c369f9SJohn Baldwin struct tls_enable en; \ 2071d1c369f9SJohn Baldwin uint64_t seqno; \ 2072d1c369f9SJohn Baldwin \ 2073d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \ 2074d1c369f9SJohn Baldwin seqno = random(); \ 2075d1c369f9SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2076d1c369f9SJohn Baldwin &en); \ 20772400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(tc, &en); \ 2078d1c369f9SJohn Baldwin free_tls_enable(&en); \ 2079d1c369f9SJohn Baldwin } 2080d1c369f9SJohn Baldwin 2081d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 2082d1c369f9SJohn Baldwin minor) \ 2083d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name); 2084d1c369f9SJohn Baldwin 2085d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \ 2086d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2087d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \ 2088d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2089d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \ 2090d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 2091d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 2092d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 2093d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 2094d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2095d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \ 2096d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2097d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \ 2098d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 2099d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 2100d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 2101d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 2102d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \ 2103d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \ 2104d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \ 2105d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \ 2106d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \ 2107d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE) 2108d1c369f9SJohn Baldwin 2109d1c369f9SJohn Baldwin /* 2110d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit. 2111d1c369f9SJohn Baldwin */ 2112d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST); 2113d1c369f9SJohn Baldwin 21143e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 211505a1d0f5SJohn Baldwin auth_alg, minor, name, len, padding) \ 21163e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 21173e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 21183e7f8a8dSJohn Baldwin { \ 21193e7f8a8dSJohn Baldwin struct tls_enable en; \ 21203e7f8a8dSJohn Baldwin uint64_t seqno; \ 21213e7f8a8dSJohn Baldwin \ 21223e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \ 21233e7f8a8dSJohn Baldwin seqno = random(); \ 21243e7f8a8dSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 21253e7f8a8dSJohn Baldwin &en); \ 21262400a7b1SJohn Baldwin test_ktls_receive_app_data(tc, &en, seqno, len, padding); \ 21273e7f8a8dSJohn Baldwin free_tls_enable(&en); \ 21283e7f8a8dSJohn Baldwin } 21293e7f8a8dSJohn Baldwin 21303e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 21313e7f8a8dSJohn Baldwin auth_alg, minor, name) \ 21323e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 21333e7f8a8dSJohn Baldwin 2134*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2135*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2136*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_data); \ 2137*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc) \ 2138*65bd3adbSJohn Baldwin { \ 2139*65bd3adbSJohn Baldwin struct tls_enable en; \ 2140*65bd3adbSJohn Baldwin uint64_t seqno; \ 2141*65bd3adbSJohn Baldwin \ 2142*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2143*65bd3adbSJohn Baldwin seqno = random(); \ 2144*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2145*65bd3adbSJohn Baldwin &en); \ 2146*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_data(tc, &en, seqno, len); \ 2147*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2148*65bd3adbSJohn Baldwin } 2149*65bd3adbSJohn Baldwin 2150*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2151*65bd3adbSJohn Baldwin auth_alg, minor) \ 2152*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_data); 2153*65bd3adbSJohn Baldwin 2154*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 2155*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2156*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_mac); \ 2157*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc) \ 2158*65bd3adbSJohn Baldwin { \ 2159*65bd3adbSJohn Baldwin struct tls_enable en; \ 2160*65bd3adbSJohn Baldwin uint64_t seqno; \ 2161*65bd3adbSJohn Baldwin \ 2162*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2163*65bd3adbSJohn Baldwin seqno = random(); \ 2164*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2165*65bd3adbSJohn Baldwin &en); \ 2166*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_mac(tc, &en, seqno, len); \ 2167*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2168*65bd3adbSJohn Baldwin } 2169*65bd3adbSJohn Baldwin 2170*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 2171*65bd3adbSJohn Baldwin auth_alg, minor) \ 2172*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_mac); 2173*65bd3adbSJohn Baldwin 2174*65bd3adbSJohn Baldwin #define GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 2175*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2176*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_truncated_record); \ 2177*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc) \ 2178*65bd3adbSJohn Baldwin { \ 2179*65bd3adbSJohn Baldwin struct tls_enable en; \ 2180*65bd3adbSJohn Baldwin uint64_t seqno; \ 2181*65bd3adbSJohn Baldwin \ 2182*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2183*65bd3adbSJohn Baldwin seqno = random(); \ 2184*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2185*65bd3adbSJohn Baldwin &en); \ 2186*65bd3adbSJohn Baldwin test_ktls_receive_truncated_record(tc, &en, seqno, len); \ 2187*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2188*65bd3adbSJohn Baldwin } 2189*65bd3adbSJohn Baldwin 2190*65bd3adbSJohn Baldwin #define ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 2191*65bd3adbSJohn Baldwin auth_alg, minor) \ 2192*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_truncated_record); 2193*65bd3adbSJohn Baldwin 2194*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 2195*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2196*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_major); \ 2197*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc) \ 2198*65bd3adbSJohn Baldwin { \ 2199*65bd3adbSJohn Baldwin struct tls_enable en; \ 2200*65bd3adbSJohn Baldwin uint64_t seqno; \ 2201*65bd3adbSJohn Baldwin \ 2202*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2203*65bd3adbSJohn Baldwin seqno = random(); \ 2204*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2205*65bd3adbSJohn Baldwin &en); \ 2206*65bd3adbSJohn Baldwin test_ktls_receive_bad_major(tc, &en, seqno, len); \ 2207*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2208*65bd3adbSJohn Baldwin } 2209*65bd3adbSJohn Baldwin 2210*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 2211*65bd3adbSJohn Baldwin auth_alg, minor) \ 2212*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_major); 2213*65bd3adbSJohn Baldwin 2214*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 2215*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2216*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_minor); \ 2217*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc) \ 2218*65bd3adbSJohn Baldwin { \ 2219*65bd3adbSJohn Baldwin struct tls_enable en; \ 2220*65bd3adbSJohn Baldwin uint64_t seqno; \ 2221*65bd3adbSJohn Baldwin \ 2222*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2223*65bd3adbSJohn Baldwin seqno = random(); \ 2224*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2225*65bd3adbSJohn Baldwin &en); \ 2226*65bd3adbSJohn Baldwin test_ktls_receive_bad_minor(tc, &en, seqno, len); \ 2227*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2228*65bd3adbSJohn Baldwin } 2229*65bd3adbSJohn Baldwin 2230*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 2231*65bd3adbSJohn Baldwin auth_alg, minor) \ 2232*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_minor); 2233*65bd3adbSJohn Baldwin 2234*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2235*65bd3adbSJohn Baldwin auth_alg, minor, name, len) \ 2236*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 2237*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 2238*65bd3adbSJohn Baldwin { \ 2239*65bd3adbSJohn Baldwin struct tls_enable en; \ 2240*65bd3adbSJohn Baldwin uint64_t seqno; \ 2241*65bd3adbSJohn Baldwin \ 2242*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2243*65bd3adbSJohn Baldwin seqno = random(); \ 2244*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2245*65bd3adbSJohn Baldwin &en); \ 2246*65bd3adbSJohn Baldwin test_ktls_receive_bad_size(tc, &en, seqno, (len)); \ 2247*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2248*65bd3adbSJohn Baldwin } 2249*65bd3adbSJohn Baldwin 2250*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2251*65bd3adbSJohn Baldwin auth_alg, minor, name) \ 2252*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 2253*65bd3adbSJohn Baldwin 22543e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 22553e7f8a8dSJohn Baldwin minor) \ 22563e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 225705a1d0f5SJohn Baldwin auth_alg, minor, short, 64, 0) \ 22583e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2259*65bd3adbSJohn Baldwin auth_alg, minor, long, 64 * 1024, 0) \ 2260*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2261*65bd3adbSJohn Baldwin auth_alg, minor, 64) \ 2262*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 2263*65bd3adbSJohn Baldwin auth_alg, minor, 64) \ 2264*65bd3adbSJohn Baldwin GEN_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 2265*65bd3adbSJohn Baldwin auth_alg, minor, 64) \ 2266*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 2267*65bd3adbSJohn Baldwin auth_alg, minor, 64) \ 2268*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 2269*65bd3adbSJohn Baldwin auth_alg, minor, 64) \ 2270*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2271*65bd3adbSJohn Baldwin auth_alg, minor, small_record, \ 2272*65bd3adbSJohn Baldwin tls_minimum_record_payload(&en) - 1) \ 2273*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2274*65bd3adbSJohn Baldwin auth_alg, minor, oversized_record, \ 2275*65bd3adbSJohn Baldwin TLS_MAX_MSG_SIZE_V10_2 * 2) 22763e7f8a8dSJohn Baldwin 22773e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 22783e7f8a8dSJohn Baldwin minor) \ 22793e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 22803e7f8a8dSJohn Baldwin auth_alg, minor, short) \ 22813e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2282*65bd3adbSJohn Baldwin auth_alg, minor, long) \ 2283*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2284*65bd3adbSJohn Baldwin auth_alg, minor) \ 2285*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAC_TEST(cipher_name, cipher_alg, key_size, \ 2286*65bd3adbSJohn Baldwin auth_alg, minor) \ 2287*65bd3adbSJohn Baldwin ADD_RECEIVE_TRUNCATED_TEST(cipher_name, cipher_alg, key_size, \ 2288*65bd3adbSJohn Baldwin auth_alg, minor) \ 2289*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MAJOR_TEST(cipher_name, cipher_alg, key_size, \ 2290*65bd3adbSJohn Baldwin auth_alg, minor) \ 2291*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_MINOR_TEST(cipher_name, cipher_alg, key_size, \ 2292*65bd3adbSJohn Baldwin auth_alg, minor) \ 2293*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2294*65bd3adbSJohn Baldwin auth_alg, minor, small_record) \ 2295*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2296*65bd3adbSJohn Baldwin auth_alg, minor, oversized_record) 22973e7f8a8dSJohn Baldwin 22983e7f8a8dSJohn Baldwin /* 2299*65bd3adbSJohn Baldwin * For each supported cipher suite, run several receive tests: 23003e7f8a8dSJohn Baldwin * 23013e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 23023e7f8a8dSJohn Baldwin * a single TLS record) 23033e7f8a8dSJohn Baldwin * 23043e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across 23053e7f8a8dSJohn Baldwin * multiple TLS records) 2306*65bd3adbSJohn Baldwin * 2307*65bd3adbSJohn Baldwin * - a test with corrupted payload data in a single TLS record 2308*65bd3adbSJohn Baldwin * 2309*65bd3adbSJohn Baldwin * - a test with a corrupted MAC in a single TLS record 2310*65bd3adbSJohn Baldwin * 2311*65bd3adbSJohn Baldwin * - a test with a truncated TLS record 2312*65bd3adbSJohn Baldwin * 2313*65bd3adbSJohn Baldwin * - tests with invalid TLS major and minor versions 2314*65bd3adbSJohn Baldwin * 2315*65bd3adbSJohn Baldwin * - a tests with a record whose is one less than the smallest valid 2316*65bd3adbSJohn Baldwin * size 2317*65bd3adbSJohn Baldwin * 2318*65bd3adbSJohn Baldwin * - a test with an oversized TLS record 23193e7f8a8dSJohn Baldwin */ 232064811651SJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_TESTS); 232105a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS); 232205a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS); 232305a1d0f5SJohn Baldwin 232464811651SJohn Baldwin #define GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 232564811651SJohn Baldwin key_size, auth_alg, minor) \ 232664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 232764811651SJohn Baldwin auth_alg, minor, padding_1, 1, 0) \ 232864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 232964811651SJohn Baldwin auth_alg, minor, padding_2, 2, 0) \ 233064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233164811651SJohn Baldwin auth_alg, minor, padding_3, 3, 0) \ 233264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233364811651SJohn Baldwin auth_alg, minor, padding_4, 4, 0) \ 233464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233564811651SJohn Baldwin auth_alg, minor, padding_5, 5, 0) \ 233664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233764811651SJohn Baldwin auth_alg, minor, padding_6, 6, 0) \ 233864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 233964811651SJohn Baldwin auth_alg, minor, padding_7, 7, 0) \ 234064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 234164811651SJohn Baldwin auth_alg, minor, padding_8, 8, 0) \ 234264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 234364811651SJohn Baldwin auth_alg, minor, padding_9, 9, 0) \ 234464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 234564811651SJohn Baldwin auth_alg, minor, padding_10, 10, 0) \ 234664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 234764811651SJohn Baldwin auth_alg, minor, padding_11, 11, 0) \ 234864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 234964811651SJohn Baldwin auth_alg, minor, padding_12, 12, 0) \ 235064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235164811651SJohn Baldwin auth_alg, minor, padding_13, 13, 0) \ 235264811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235364811651SJohn Baldwin auth_alg, minor, padding_14, 14, 0) \ 235464811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235564811651SJohn Baldwin auth_alg, minor, padding_15, 15, 0) \ 235664811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235764811651SJohn Baldwin auth_alg, minor, padding_16, 16, 0) \ 235864811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 235964811651SJohn Baldwin auth_alg, minor, padding_16_extra, 16, 16) \ 236064811651SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 236164811651SJohn Baldwin auth_alg, minor, padding_32_extra, 16, 32) 236264811651SJohn Baldwin 236364811651SJohn Baldwin #define ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 236464811651SJohn Baldwin key_size, auth_alg, minor) \ 236564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 236664811651SJohn Baldwin auth_alg, minor, padding_1) \ 236764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 236864811651SJohn Baldwin auth_alg, minor, padding_2) \ 236964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237064811651SJohn Baldwin auth_alg, minor, padding_3) \ 237164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237264811651SJohn Baldwin auth_alg, minor, padding_4) \ 237364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237464811651SJohn Baldwin auth_alg, minor, padding_5) \ 237564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237664811651SJohn Baldwin auth_alg, minor, padding_6) \ 237764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 237864811651SJohn Baldwin auth_alg, minor, padding_7) \ 237964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 238064811651SJohn Baldwin auth_alg, minor, padding_8) \ 238164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 238264811651SJohn Baldwin auth_alg, minor, padding_9) \ 238364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 238464811651SJohn Baldwin auth_alg, minor, padding_10) \ 238564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 238664811651SJohn Baldwin auth_alg, minor, padding_11) \ 238764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 238864811651SJohn Baldwin auth_alg, minor, padding_12) \ 238964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 239064811651SJohn Baldwin auth_alg, minor, padding_13) \ 239164811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 239264811651SJohn Baldwin auth_alg, minor, padding_14) \ 239364811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 239464811651SJohn Baldwin auth_alg, minor, padding_15) \ 239564811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 239664811651SJohn Baldwin auth_alg, minor, padding_16) \ 239764811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 239864811651SJohn Baldwin auth_alg, minor, padding_16_extra) \ 239964811651SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 240064811651SJohn Baldwin auth_alg, minor, padding_32_extra) 240164811651SJohn Baldwin 2402*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 2403*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2404*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_padding); \ 2405*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc) \ 2406*65bd3adbSJohn Baldwin { \ 2407*65bd3adbSJohn Baldwin struct tls_enable en; \ 2408*65bd3adbSJohn Baldwin uint64_t seqno; \ 2409*65bd3adbSJohn Baldwin \ 2410*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2411*65bd3adbSJohn Baldwin seqno = random(); \ 2412*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2413*65bd3adbSJohn Baldwin &en); \ 2414*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_padding(tc, &en, seqno, len); \ 2415*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2416*65bd3adbSJohn Baldwin } 2417*65bd3adbSJohn Baldwin 2418*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 2419*65bd3adbSJohn Baldwin auth_alg, minor) \ 2420*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_padding); 2421*65bd3adbSJohn Baldwin 2422*65bd3adbSJohn Baldwin #define GEN_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \ 2423*65bd3adbSJohn Baldwin auth_alg, minor) \ 2424*65bd3adbSJohn Baldwin GEN_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 2425*65bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 2426*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 2427*65bd3adbSJohn Baldwin auth_alg, minor, 64) \ 2428*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2429*65bd3adbSJohn Baldwin auth_alg, minor, non_block_size, \ 2430*65bd3adbSJohn Baldwin tls_minimum_record_payload(&en) + 1) 2431*65bd3adbSJohn Baldwin 2432*65bd3adbSJohn Baldwin #define ADD_RECEIVE_MTE_TESTS(cipher_name, cipher_alg, key_size, \ 2433*65bd3adbSJohn Baldwin auth_alg, minor) \ 2434*65bd3adbSJohn Baldwin ADD_RECEIVE_MTE_PADDING_TESTS(cipher_name, cipher_alg, \ 2435*65bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 2436*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_PADDING_TEST(cipher_name, cipher_alg, key_size, \ 2437*65bd3adbSJohn Baldwin auth_alg, minor) \ 2438*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2439*65bd3adbSJohn Baldwin auth_alg, minor, non_block_size) 2440*65bd3adbSJohn Baldwin 244164811651SJohn Baldwin /* 244264811651SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 244364811651SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 244464811651SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 244564811651SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 244664811651SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 244764811651SJohn Baldwin * of the possible padding lengths for each suite. 244864811651SJohn Baldwin * 244964811651SJohn Baldwin * Two additional tests check for additional padding with an extra 245064811651SJohn Baldwin * 16 or 32 bytes beyond the normal padding. 2451*65bd3adbSJohn Baldwin * 2452*65bd3adbSJohn Baldwin * Another test checks for corrupted padding. 2453*65bd3adbSJohn Baldwin * 2454*65bd3adbSJohn Baldwin * Another test checks for a record whose payload is not a multiple of 2455*65bd3adbSJohn Baldwin * the AES block size. 245664811651SJohn Baldwin */ 2457*65bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_MTE_TESTS); 245864811651SJohn Baldwin 2459*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 2460*65bd3adbSJohn Baldwin auth_alg, minor) \ 2461*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_iv); \ 2462*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc) \ 2463*65bd3adbSJohn Baldwin { \ 2464*65bd3adbSJohn Baldwin struct tls_enable en; \ 2465*65bd3adbSJohn Baldwin uint64_t seqno; \ 2466*65bd3adbSJohn Baldwin \ 2467*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2468*65bd3adbSJohn Baldwin seqno = random(); \ 2469*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2470*65bd3adbSJohn Baldwin &en); \ 2471*65bd3adbSJohn Baldwin test_ktls_receive_corrupted_iv(tc, &en, seqno, 64); \ 2472*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2473*65bd3adbSJohn Baldwin } 2474*65bd3adbSJohn Baldwin 2475*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 2476*65bd3adbSJohn Baldwin auth_alg, minor) \ 2477*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_iv); 2478*65bd3adbSJohn Baldwin 2479*65bd3adbSJohn Baldwin #define GEN_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \ 248064811651SJohn Baldwin key_size, auth_alg, minor) \ 2481*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 2482*65bd3adbSJohn Baldwin auth_alg, minor) \ 2483*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2484*65bd3adbSJohn Baldwin auth_alg, minor, short_header, \ 2485*65bd3adbSJohn Baldwin sizeof(struct tls_record_layer) + 1) 2486*65bd3adbSJohn Baldwin 2487*65bd3adbSJohn Baldwin #define ADD_RECEIVE_EXPLICIT_IV_TESTS(cipher_name, cipher_alg, \ 2488*65bd3adbSJohn Baldwin key_size, auth_alg, minor) \ 2489*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_IV_TEST(cipher_name, cipher_alg, key_size, \ 2490*65bd3adbSJohn Baldwin auth_alg, minor) \ 2491*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_SIZE_TEST(cipher_name, cipher_alg, key_size, \ 2492*65bd3adbSJohn Baldwin auth_alg, minor, short_header) 2493*65bd3adbSJohn Baldwin 2494*65bd3adbSJohn Baldwin /* 2495*65bd3adbSJohn Baldwin * For cipher suites with an explicit IV, run a receive test where the 2496*65bd3adbSJohn Baldwin * explicit IV has been corrupted. Also run a receive test that sends 2497*65bd3adbSJohn Baldwin * a short record without a complete IV. 2498*65bd3adbSJohn Baldwin */ 2499*65bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS); 2500*65bd3adbSJohn Baldwin AES_GCM_12_TESTS(GEN_RECEIVE_EXPLICIT_IV_TESTS); 2501*65bd3adbSJohn Baldwin 2502*65bd3adbSJohn Baldwin #define GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 2503*65bd3adbSJohn Baldwin auth_alg, minor, len) \ 2504*65bd3adbSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_bad_type); \ 2505*65bd3adbSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc) \ 2506*65bd3adbSJohn Baldwin { \ 2507*65bd3adbSJohn Baldwin struct tls_enable en; \ 2508*65bd3adbSJohn Baldwin uint64_t seqno; \ 2509*65bd3adbSJohn Baldwin \ 2510*65bd3adbSJohn Baldwin ATF_REQUIRE_KTLS(); \ 2511*65bd3adbSJohn Baldwin seqno = random(); \ 2512*65bd3adbSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2513*65bd3adbSJohn Baldwin &en); \ 2514*65bd3adbSJohn Baldwin test_ktls_receive_bad_type(tc, &en, seqno, len); \ 2515*65bd3adbSJohn Baldwin free_tls_enable(&en); \ 2516*65bd3adbSJohn Baldwin } 2517*65bd3adbSJohn Baldwin 2518*65bd3adbSJohn Baldwin #define ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 2519*65bd3adbSJohn Baldwin auth_alg, minor) \ 2520*65bd3adbSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_bad_type); 2521*65bd3adbSJohn Baldwin 2522*65bd3adbSJohn Baldwin #define GEN_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \ 2523*65bd3adbSJohn Baldwin auth_alg, minor) \ 252405a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 252505a1d0f5SJohn Baldwin auth_alg, minor, short_padded, 64, 16) \ 252605a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2527*65bd3adbSJohn Baldwin auth_alg, minor, long_padded, 64 * 1024, 15) \ 2528*65bd3adbSJohn Baldwin GEN_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 2529*65bd3adbSJohn Baldwin auth_alg, minor, 64) 253005a1d0f5SJohn Baldwin 2531*65bd3adbSJohn Baldwin #define ADD_RECEIVE_TLS13_TESTS(cipher_name, cipher_alg, key_size, \ 2532*65bd3adbSJohn Baldwin auth_alg, minor) \ 253305a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 253405a1d0f5SJohn Baldwin auth_alg, minor, short_padded) \ 253505a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 2536*65bd3adbSJohn Baldwin auth_alg, minor, long_padded) \ 2537*65bd3adbSJohn Baldwin ADD_RECEIVE_BAD_TYPE_TEST(cipher_name, cipher_alg, key_size, \ 2538*65bd3adbSJohn Baldwin auth_alg, minor) 253905a1d0f5SJohn Baldwin 254005a1d0f5SJohn Baldwin /* 254105a1d0f5SJohn Baldwin * For TLS 1.3 cipher suites, run two additional receive tests which 2542*65bd3adbSJohn Baldwin * use add padding to each record. Also run a test that uses an 2543*65bd3adbSJohn Baldwin * invalid "outer" record type. 254405a1d0f5SJohn Baldwin */ 2545*65bd3adbSJohn Baldwin TLS_13_TESTS(GEN_RECEIVE_TLS13_TESTS); 25463e7f8a8dSJohn Baldwin 2547233ce578SJohn Baldwin static void 25482400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc, 25492400a7b1SJohn Baldwin struct tls_enable *en) 2550233ce578SJohn Baldwin { 2551233ce578SJohn Baldwin int sockets[2]; 2552233ce578SJohn Baldwin 25532400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 2554233ce578SJohn Baldwin 2555233ce578SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 2556233ce578SJohn Baldwin sizeof(*en)) == -1); 255705a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 2558233ce578SJohn Baldwin 25592c105205SJohn Baldwin close_sockets(sockets); 2560233ce578SJohn Baldwin } 2561233ce578SJohn Baldwin 2562233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 2563233ce578SJohn Baldwin minor) \ 2564233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name); \ 2565233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc) \ 2566233ce578SJohn Baldwin { \ 2567233ce578SJohn Baldwin struct tls_enable en; \ 2568233ce578SJohn Baldwin uint64_t seqno; \ 2569233ce578SJohn Baldwin \ 2570233ce578SJohn Baldwin ATF_REQUIRE_KTLS(); \ 2571233ce578SJohn Baldwin seqno = random(); \ 2572233ce578SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 2573233ce578SJohn Baldwin &en); \ 25742400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(tc, &en); \ 2575233ce578SJohn Baldwin free_tls_enable(&en); \ 2576233ce578SJohn Baldwin } 2577233ce578SJohn Baldwin 2578233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 2579233ce578SJohn Baldwin minor) \ 2580233ce578SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name); 2581233ce578SJohn Baldwin 2582233ce578SJohn Baldwin /* 2583233ce578SJohn Baldwin * Ensure that invalid cipher suites are rejected for receive. 2584233ce578SJohn Baldwin */ 2585233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST); 2586233ce578SJohn Baldwin 258783a54b58SJohn Baldwin static void 25882400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc, 25892400a7b1SJohn Baldwin struct tls_enable *en) 259083a54b58SJohn Baldwin { 259183a54b58SJohn Baldwin int sockets[2]; 259283a54b58SJohn Baldwin 25932400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 259483a54b58SJohn Baldwin 259583a54b58SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 259683a54b58SJohn Baldwin sizeof(*en)) == -1); 259705a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EPROTONOSUPPORT); 259883a54b58SJohn Baldwin 25992c105205SJohn Baldwin close_sockets(sockets); 260083a54b58SJohn Baldwin } 260183a54b58SJohn Baldwin 260283a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 260383a54b58SJohn Baldwin auth_alg, minor) \ 260483a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name); \ 260583a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \ 260683a54b58SJohn Baldwin { \ 260783a54b58SJohn Baldwin struct tls_enable en; \ 260883a54b58SJohn Baldwin uint64_t seqno; \ 260983a54b58SJohn Baldwin \ 261083a54b58SJohn Baldwin ATF_REQUIRE_KTLS(); \ 261183a54b58SJohn Baldwin seqno = random(); \ 261283a54b58SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 261383a54b58SJohn Baldwin &en); \ 26142400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(tc, &en); \ 261583a54b58SJohn Baldwin free_tls_enable(&en); \ 261683a54b58SJohn Baldwin } 261783a54b58SJohn Baldwin 261883a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 261983a54b58SJohn Baldwin auth_alg, minor) \ 262083a54b58SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name); 262183a54b58SJohn Baldwin 262283a54b58SJohn Baldwin /* 262383a54b58SJohn Baldwin * Ensure that valid cipher suites not supported for receive are 262483a54b58SJohn Baldwin * rejected. 262583a54b58SJohn Baldwin */ 262664811651SJohn Baldwin TLS_10_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST); 262783a54b58SJohn Baldwin 2628ee5686c6SMark Johnston /* 2629ee5686c6SMark Johnston * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise 2630ee5686c6SMark Johnston * KTLS error handling in the socket layer. 2631ee5686c6SMark Johnston */ 2632ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst); 2633ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc) 2634ee5686c6SMark Johnston { 2635ee5686c6SMark Johnston char buf[32]; 2636ee5686c6SMark Johnston struct sockaddr_in dst; 2637ee5686c6SMark Johnston struct tls_enable en; 2638ee5686c6SMark Johnston ssize_t n; 2639ee5686c6SMark Johnston int s; 2640ee5686c6SMark Johnston 2641ee5686c6SMark Johnston ATF_REQUIRE_KTLS(); 2642ee5686c6SMark Johnston 2643ee5686c6SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 2644ee5686c6SMark Johnston ATF_REQUIRE(s >= 0); 2645ee5686c6SMark Johnston 2646ee5686c6SMark Johnston build_tls_enable(CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, 2647ee5686c6SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en); 2648ee5686c6SMark Johnston 2649ee5686c6SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, 2650ee5686c6SMark Johnston sizeof(en)) == 0); 2651ee5686c6SMark Johnston 2652ee5686c6SMark Johnston memset(&dst, 0, sizeof(dst)); 2653ee5686c6SMark Johnston dst.sin_family = AF_INET; 2654ee5686c6SMark Johnston dst.sin_len = sizeof(dst); 2655ee5686c6SMark Johnston dst.sin_addr.s_addr = htonl(INADDR_BROADCAST); 2656ee5686c6SMark Johnston dst.sin_port = htons(12345); 2657ee5686c6SMark Johnston 2658ee5686c6SMark Johnston memset(buf, 0, sizeof(buf)); 2659ee5686c6SMark Johnston n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst, 2660ee5686c6SMark Johnston sizeof(dst)); 2661ee5686c6SMark Johnston 2662ee5686c6SMark Johnston /* Can't transmit to the broadcast address over TCP. */ 2663ee5686c6SMark Johnston ATF_REQUIRE_ERRNO(EACCES, n == -1); 2664ee5686c6SMark Johnston ATF_REQUIRE(close(s) == 0); 2665ee5686c6SMark Johnston } 2666ee5686c6SMark Johnston 2667a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp) 2668a10482eaSJohn Baldwin { 26693e7f8a8dSJohn Baldwin /* Transmit tests */ 2670a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS); 2671a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS); 2672a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS); 267344265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS); 26745de79eedSMark Johnston AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 26755de79eedSMark Johnston AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 26765de79eedSMark Johnston CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 2677d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST); 2678a10482eaSJohn Baldwin 26793e7f8a8dSJohn Baldwin /* Receive tests */ 268064811651SJohn Baldwin TLS_10_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST); 268164811651SJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_TESTS); 268205a1d0f5SJohn Baldwin AES_GCM_TESTS(ADD_RECEIVE_TESTS); 268305a1d0f5SJohn Baldwin CHACHA20_TESTS(ADD_RECEIVE_TESTS); 2684*65bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_MTE_TESTS); 2685*65bd3adbSJohn Baldwin AES_CBC_NONZERO_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS); 2686*65bd3adbSJohn Baldwin AES_GCM_12_TESTS(ADD_RECEIVE_EXPLICIT_IV_TESTS); 2687*65bd3adbSJohn Baldwin TLS_13_TESTS(ADD_RECEIVE_TLS13_TESTS); 2688233ce578SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST); 2689233ce578SJohn Baldwin 2690ee5686c6SMark Johnston /* Miscellaneous */ 2691ee5686c6SMark Johnston ATF_TP_ADD_TC(tp, ktls_sendto_baddst); 2692ee5686c6SMark Johnston 2693a10482eaSJohn Baldwin return (atf_no_error()); 2694a10482eaSJohn Baldwin } 2695