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 29a10482eaSJohn Baldwin #include <sys/types.h> 30a10482eaSJohn Baldwin #include <sys/endian.h> 31a10482eaSJohn Baldwin #include <sys/event.h> 32a10482eaSJohn Baldwin #include <sys/ktls.h> 33a10482eaSJohn Baldwin #include <sys/socket.h> 34a10482eaSJohn Baldwin #include <sys/sysctl.h> 35a10482eaSJohn Baldwin #include <netinet/in.h> 36a10482eaSJohn Baldwin #include <netinet/tcp.h> 37a10482eaSJohn Baldwin #include <crypto/cryptodev.h> 38a10482eaSJohn Baldwin #include <assert.h> 39a10482eaSJohn Baldwin #include <err.h> 40a10482eaSJohn Baldwin #include <fcntl.h> 41*2400a7b1SJohn 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 70a10482eaSJohn Baldwin static char 71a10482eaSJohn Baldwin rdigit(void) 72a10482eaSJohn Baldwin { 73a10482eaSJohn Baldwin /* ASCII printable values between 0x20 and 0x7e */ 74a10482eaSJohn Baldwin return (0x20 + random() % (0x7f - 0x20)); 75a10482eaSJohn Baldwin } 76a10482eaSJohn Baldwin 77a10482eaSJohn Baldwin static char * 78a10482eaSJohn Baldwin alloc_buffer(size_t len) 79a10482eaSJohn Baldwin { 80a10482eaSJohn Baldwin char *buf; 81a10482eaSJohn Baldwin size_t i; 82a10482eaSJohn Baldwin 83a10482eaSJohn Baldwin if (len == 0) 84a10482eaSJohn Baldwin return (NULL); 85a10482eaSJohn Baldwin buf = malloc(len); 86a10482eaSJohn Baldwin for (i = 0; i < len; i++) 87a10482eaSJohn Baldwin buf[i] = rdigit(); 88a10482eaSJohn Baldwin return (buf); 89a10482eaSJohn Baldwin } 90a10482eaSJohn Baldwin 91a10482eaSJohn Baldwin static bool 922c105205SJohn Baldwin socketpair_tcp(int sv[2]) 93a10482eaSJohn Baldwin { 94a10482eaSJohn Baldwin struct pollfd pfd; 95a10482eaSJohn Baldwin struct sockaddr_in sin; 96a10482eaSJohn Baldwin socklen_t len; 97a10482eaSJohn Baldwin int as, cs, ls; 98a10482eaSJohn Baldwin 99a10482eaSJohn Baldwin ls = socket(PF_INET, SOCK_STREAM, 0); 100a10482eaSJohn Baldwin if (ls == -1) { 101a10482eaSJohn Baldwin warn("socket() for listen"); 102a10482eaSJohn Baldwin return (false); 103a10482eaSJohn Baldwin } 104a10482eaSJohn Baldwin 105a10482eaSJohn Baldwin memset(&sin, 0, sizeof(sin)); 106a10482eaSJohn Baldwin sin.sin_len = sizeof(sin); 107a10482eaSJohn Baldwin sin.sin_family = AF_INET; 108a10482eaSJohn Baldwin sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 109a10482eaSJohn Baldwin if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 110a10482eaSJohn Baldwin warn("bind"); 111a10482eaSJohn Baldwin close(ls); 112a10482eaSJohn Baldwin return (false); 113a10482eaSJohn Baldwin } 114a10482eaSJohn Baldwin 115a10482eaSJohn Baldwin if (listen(ls, 1) == -1) { 116a10482eaSJohn Baldwin warn("listen"); 117a10482eaSJohn Baldwin close(ls); 118a10482eaSJohn Baldwin return (false); 119a10482eaSJohn Baldwin } 120a10482eaSJohn Baldwin 121a10482eaSJohn Baldwin len = sizeof(sin); 122a10482eaSJohn Baldwin if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) { 123a10482eaSJohn Baldwin warn("getsockname"); 124a10482eaSJohn Baldwin close(ls); 125a10482eaSJohn Baldwin return (false); 126a10482eaSJohn Baldwin } 127a10482eaSJohn Baldwin 128a10482eaSJohn Baldwin cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); 129a10482eaSJohn Baldwin if (cs == -1) { 130a10482eaSJohn Baldwin warn("socket() for connect"); 131a10482eaSJohn Baldwin close(ls); 132a10482eaSJohn Baldwin return (false); 133a10482eaSJohn Baldwin } 134a10482eaSJohn Baldwin 135a10482eaSJohn Baldwin if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 136a10482eaSJohn Baldwin if (errno != EINPROGRESS) { 137a10482eaSJohn Baldwin warn("connect"); 138a10482eaSJohn Baldwin close(ls); 139a10482eaSJohn Baldwin close(cs); 140a10482eaSJohn Baldwin return (false); 141a10482eaSJohn Baldwin } 142a10482eaSJohn Baldwin } 143a10482eaSJohn Baldwin 144a10482eaSJohn Baldwin as = accept4(ls, NULL, NULL, SOCK_NONBLOCK); 145a10482eaSJohn Baldwin if (as == -1) { 146a10482eaSJohn Baldwin warn("accept4"); 147a10482eaSJohn Baldwin close(ls); 148a10482eaSJohn Baldwin close(cs); 149a10482eaSJohn Baldwin return (false); 150a10482eaSJohn Baldwin } 151a10482eaSJohn Baldwin 152a10482eaSJohn Baldwin close(ls); 153a10482eaSJohn Baldwin 154a10482eaSJohn Baldwin pfd.fd = cs; 155a10482eaSJohn Baldwin pfd.events = POLLOUT; 156a10482eaSJohn Baldwin pfd.revents = 0; 157a10482eaSJohn Baldwin ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1); 158a10482eaSJohn Baldwin ATF_REQUIRE(pfd.revents == POLLOUT); 159a10482eaSJohn Baldwin 160a10482eaSJohn Baldwin sv[0] = cs; 161a10482eaSJohn Baldwin sv[1] = as; 162a10482eaSJohn Baldwin return (true); 163a10482eaSJohn Baldwin } 164a10482eaSJohn Baldwin 165*2400a7b1SJohn Baldwin static bool 166*2400a7b1SJohn Baldwin echo_socket(const atf_tc_t *tc, int sv[2]) 167*2400a7b1SJohn Baldwin { 168*2400a7b1SJohn Baldwin const char *cause, *host, *port; 169*2400a7b1SJohn Baldwin struct addrinfo hints, *ai, *tofree; 170*2400a7b1SJohn Baldwin int error, flags, s; 171*2400a7b1SJohn Baldwin 172*2400a7b1SJohn Baldwin host = atf_tc_get_config_var(tc, "ktls.host"); 173*2400a7b1SJohn Baldwin port = atf_tc_get_config_var_wd(tc, "ktls.port", "echo"); 174*2400a7b1SJohn Baldwin memset(&hints, 0, sizeof(hints)); 175*2400a7b1SJohn Baldwin hints.ai_family = AF_UNSPEC; 176*2400a7b1SJohn Baldwin hints.ai_socktype = SOCK_STREAM; 177*2400a7b1SJohn Baldwin hints.ai_protocol = IPPROTO_TCP; 178*2400a7b1SJohn Baldwin error = getaddrinfo(host, port, &hints, &tofree); 179*2400a7b1SJohn Baldwin if (error != 0) { 180*2400a7b1SJohn Baldwin warnx("getaddrinfo(%s:%s) failed: %s", host, port, 181*2400a7b1SJohn Baldwin gai_strerror(error)); 182*2400a7b1SJohn Baldwin return (false); 183*2400a7b1SJohn Baldwin } 184*2400a7b1SJohn Baldwin 185*2400a7b1SJohn Baldwin cause = NULL; 186*2400a7b1SJohn Baldwin for (ai = tofree; ai != NULL; ai = ai->ai_next) { 187*2400a7b1SJohn Baldwin s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); 188*2400a7b1SJohn Baldwin if (s == -1) { 189*2400a7b1SJohn Baldwin cause = "socket"; 190*2400a7b1SJohn Baldwin error = errno; 191*2400a7b1SJohn Baldwin continue; 192*2400a7b1SJohn Baldwin } 193*2400a7b1SJohn Baldwin 194*2400a7b1SJohn Baldwin if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) { 195*2400a7b1SJohn Baldwin cause = "connect"; 196*2400a7b1SJohn Baldwin error = errno; 197*2400a7b1SJohn Baldwin close(s); 198*2400a7b1SJohn Baldwin continue; 199*2400a7b1SJohn Baldwin } 200*2400a7b1SJohn Baldwin 201*2400a7b1SJohn Baldwin freeaddrinfo(tofree); 202*2400a7b1SJohn Baldwin 203*2400a7b1SJohn Baldwin ATF_REQUIRE((flags = fcntl(s, F_GETFL)) != -1); 204*2400a7b1SJohn Baldwin flags |= O_NONBLOCK; 205*2400a7b1SJohn Baldwin ATF_REQUIRE(fcntl(s, F_SETFL, flags) != -1); 206*2400a7b1SJohn Baldwin 207*2400a7b1SJohn Baldwin sv[0] = s; 208*2400a7b1SJohn Baldwin sv[1] = s; 209*2400a7b1SJohn Baldwin return (true); 210*2400a7b1SJohn Baldwin } 211*2400a7b1SJohn Baldwin 212*2400a7b1SJohn Baldwin warnc(error, "%s", cause); 213*2400a7b1SJohn Baldwin freeaddrinfo(tofree); 214*2400a7b1SJohn Baldwin return (false); 215*2400a7b1SJohn Baldwin } 216*2400a7b1SJohn Baldwin 217*2400a7b1SJohn Baldwin static bool 218*2400a7b1SJohn Baldwin open_sockets(const atf_tc_t *tc, int sv[2]) 219*2400a7b1SJohn Baldwin { 220*2400a7b1SJohn Baldwin if (atf_tc_has_config_var(tc, "ktls.host")) 221*2400a7b1SJohn Baldwin return (echo_socket(tc, sv)); 222*2400a7b1SJohn Baldwin else 223*2400a7b1SJohn Baldwin return (socketpair_tcp(sv)); 224*2400a7b1SJohn Baldwin } 225*2400a7b1SJohn Baldwin 226a10482eaSJohn Baldwin static void 2272c105205SJohn Baldwin close_sockets(int sv[2]) 2282c105205SJohn Baldwin { 229*2400a7b1SJohn Baldwin if (sv[0] != sv[1]) 2302c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0); 2312c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0); 2322c105205SJohn Baldwin } 2332c105205SJohn Baldwin 2342c105205SJohn Baldwin static void 235a10482eaSJohn Baldwin fd_set_blocking(int fd) 236a10482eaSJohn Baldwin { 237a10482eaSJohn Baldwin int flags; 238a10482eaSJohn Baldwin 239a10482eaSJohn Baldwin ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1); 240a10482eaSJohn Baldwin flags &= ~O_NONBLOCK; 241a10482eaSJohn Baldwin ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1); 242a10482eaSJohn Baldwin } 243a10482eaSJohn Baldwin 244a10482eaSJohn Baldwin static bool 245a10482eaSJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 246a10482eaSJohn Baldwin const char *input, char *output, size_t size) 247a10482eaSJohn Baldwin { 248a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 249a10482eaSJohn Baldwin int outl, total; 250a10482eaSJohn Baldwin 251a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 252a10482eaSJohn Baldwin if (ctx == NULL) { 253a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 254a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 255a10482eaSJohn Baldwin return (false); 256a10482eaSJohn Baldwin } 257a10482eaSJohn Baldwin if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key, 258a10482eaSJohn Baldwin (const u_char *)iv, 0) != 1) { 259a10482eaSJohn Baldwin warnx("EVP_CipherInit_ex failed: %s", 260a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 261a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 262a10482eaSJohn Baldwin return (false); 263a10482eaSJohn Baldwin } 264a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 265a10482eaSJohn Baldwin if (EVP_CipherUpdate(ctx, (u_char *)output, &outl, 266a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 267a10482eaSJohn Baldwin warnx("EVP_CipherUpdate failed: %s", 268a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 269a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 270a10482eaSJohn Baldwin return (false); 271a10482eaSJohn Baldwin } 272a10482eaSJohn Baldwin total = outl; 273a10482eaSJohn Baldwin if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 274a10482eaSJohn Baldwin warnx("EVP_CipherFinal_ex failed: %s", 275a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 276a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 277a10482eaSJohn Baldwin return (false); 278a10482eaSJohn Baldwin } 279a10482eaSJohn Baldwin total += outl; 280a10482eaSJohn Baldwin if ((size_t)total != size) { 281a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 282a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 283a10482eaSJohn Baldwin return (false); 284a10482eaSJohn Baldwin } 285a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 286a10482eaSJohn Baldwin return (true); 287a10482eaSJohn Baldwin } 288a10482eaSJohn Baldwin 289a10482eaSJohn Baldwin static bool 290a10482eaSJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 291a10482eaSJohn Baldwin size_t aad_len, const void *buffer, size_t len, const void *digest) 292a10482eaSJohn Baldwin { 293a10482eaSJohn Baldwin HMAC_CTX *ctx; 294a10482eaSJohn Baldwin unsigned char digest2[EVP_MAX_MD_SIZE]; 295a10482eaSJohn Baldwin u_int digest_len; 296a10482eaSJohn Baldwin 297a10482eaSJohn Baldwin ctx = HMAC_CTX_new(); 298a10482eaSJohn Baldwin if (ctx == NULL) { 299a10482eaSJohn Baldwin warnx("HMAC_CTX_new failed: %s", 300a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 301a10482eaSJohn Baldwin return (false); 302a10482eaSJohn Baldwin } 303a10482eaSJohn Baldwin if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) { 304a10482eaSJohn Baldwin warnx("HMAC_Init_ex failed: %s", 305a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 306a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 307a10482eaSJohn Baldwin return (false); 308a10482eaSJohn Baldwin } 309a10482eaSJohn Baldwin if (HMAC_Update(ctx, aad, aad_len) != 1) { 310a10482eaSJohn Baldwin warnx("HMAC_Update (aad) failed: %s", 311a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 312a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 313a10482eaSJohn Baldwin return (false); 314a10482eaSJohn Baldwin } 315a10482eaSJohn Baldwin if (HMAC_Update(ctx, buffer, len) != 1) { 316a10482eaSJohn Baldwin warnx("HMAC_Update (payload) failed: %s", 317a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 318a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 319a10482eaSJohn Baldwin return (false); 320a10482eaSJohn Baldwin } 321a10482eaSJohn Baldwin if (HMAC_Final(ctx, digest2, &digest_len) != 1) { 322a10482eaSJohn Baldwin warnx("HMAC_Final failed: %s", 323a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 324a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 325a10482eaSJohn Baldwin return (false); 326a10482eaSJohn Baldwin } 327a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 328a10482eaSJohn Baldwin if (memcmp(digest, digest2, digest_len) != 0) { 329a10482eaSJohn Baldwin warnx("HMAC mismatch"); 330a10482eaSJohn Baldwin return (false); 331a10482eaSJohn Baldwin } 332a10482eaSJohn Baldwin return (true); 333a10482eaSJohn Baldwin } 334a10482eaSJohn Baldwin 335a10482eaSJohn Baldwin static bool 3363e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 3373e7f8a8dSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 3383e7f8a8dSJohn Baldwin size_t size, char *tag, size_t tag_len) 3393e7f8a8dSJohn Baldwin { 3403e7f8a8dSJohn Baldwin EVP_CIPHER_CTX *ctx; 3413e7f8a8dSJohn Baldwin int outl, total; 3423e7f8a8dSJohn Baldwin 3433e7f8a8dSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 3443e7f8a8dSJohn Baldwin if (ctx == NULL) { 3453e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 3463e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3473e7f8a8dSJohn Baldwin return (false); 3483e7f8a8dSJohn Baldwin } 3493e7f8a8dSJohn Baldwin if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 3503e7f8a8dSJohn Baldwin (const u_char *)nonce) != 1) { 3513e7f8a8dSJohn Baldwin warnx("EVP_EncryptInit_ex failed: %s", 3523e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3533e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3543e7f8a8dSJohn Baldwin return (false); 3553e7f8a8dSJohn Baldwin } 3563e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 3573e7f8a8dSJohn Baldwin if (aad != NULL) { 3583e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 3593e7f8a8dSJohn Baldwin aad_len) != 1) { 3603e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate for AAD failed: %s", 3613e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3623e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3633e7f8a8dSJohn Baldwin return (false); 3643e7f8a8dSJohn Baldwin } 3653e7f8a8dSJohn Baldwin } 3663e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl, 3673e7f8a8dSJohn Baldwin (const u_char *)input, size) != 1) { 3683e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate failed: %s", 3693e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3703e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3713e7f8a8dSJohn Baldwin return (false); 3723e7f8a8dSJohn Baldwin } 3733e7f8a8dSJohn Baldwin total = outl; 3743e7f8a8dSJohn Baldwin if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 3753e7f8a8dSJohn Baldwin warnx("EVP_EncryptFinal_ex failed: %s", 3763e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3773e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3783e7f8a8dSJohn Baldwin return (false); 3793e7f8a8dSJohn Baldwin } 3803e7f8a8dSJohn Baldwin total += outl; 3813e7f8a8dSJohn Baldwin if ((size_t)total != size) { 3823e7f8a8dSJohn Baldwin warnx("encrypt size mismatch: %zu vs %d", size, total); 3833e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3843e7f8a8dSJohn Baldwin return (false); 3853e7f8a8dSJohn Baldwin } 3863e7f8a8dSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) != 3873e7f8a8dSJohn Baldwin 1) { 3883e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s", 3893e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3903e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3913e7f8a8dSJohn Baldwin return (false); 3923e7f8a8dSJohn Baldwin } 3933e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3943e7f8a8dSJohn Baldwin return (true); 3953e7f8a8dSJohn Baldwin } 3963e7f8a8dSJohn Baldwin 3973e7f8a8dSJohn Baldwin static bool 398a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 399a10482eaSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 400a10482eaSJohn Baldwin size_t size, const char *tag, size_t tag_len) 401a10482eaSJohn Baldwin { 402a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 403a10482eaSJohn Baldwin int outl, total; 404a10482eaSJohn Baldwin bool valid; 405a10482eaSJohn Baldwin 406a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 407a10482eaSJohn Baldwin if (ctx == NULL) { 408a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 409a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 410a10482eaSJohn Baldwin return (false); 411a10482eaSJohn Baldwin } 412a10482eaSJohn Baldwin if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 413a10482eaSJohn Baldwin (const u_char *)nonce) != 1) { 414a10482eaSJohn Baldwin warnx("EVP_DecryptInit_ex failed: %s", 415a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 416a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 417a10482eaSJohn Baldwin return (false); 418a10482eaSJohn Baldwin } 419a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 420a10482eaSJohn Baldwin if (aad != NULL) { 421a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 422a10482eaSJohn Baldwin aad_len) != 1) { 423a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate for AAD failed: %s", 424a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 425a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 426a10482eaSJohn Baldwin return (false); 427a10482eaSJohn Baldwin } 428a10482eaSJohn Baldwin } 429a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl, 430a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 431a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate failed: %s", 432a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 433a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 434a10482eaSJohn Baldwin return (false); 435a10482eaSJohn Baldwin } 436a10482eaSJohn Baldwin total = outl; 437a10482eaSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, 438a10482eaSJohn Baldwin __DECONST(char *, tag)) != 1) { 439a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s", 440a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 441a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 442a10482eaSJohn Baldwin return (false); 443a10482eaSJohn Baldwin } 444a10482eaSJohn Baldwin valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1); 445a10482eaSJohn Baldwin total += outl; 446a10482eaSJohn Baldwin if ((size_t)total != size) { 447a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 448a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 449a10482eaSJohn Baldwin return (false); 450a10482eaSJohn Baldwin } 451a10482eaSJohn Baldwin if (!valid) 452a10482eaSJohn Baldwin warnx("tag mismatch"); 453a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 454a10482eaSJohn Baldwin return (valid); 455a10482eaSJohn Baldwin } 456a10482eaSJohn Baldwin 457a10482eaSJohn Baldwin static void 458a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg, 459a10482eaSJohn Baldwin int minor, uint64_t seqno, struct tls_enable *en) 460a10482eaSJohn Baldwin { 461a10482eaSJohn Baldwin u_int auth_key_len, iv_len; 462a10482eaSJohn Baldwin 463a10482eaSJohn Baldwin memset(en, 0, sizeof(*en)); 464a10482eaSJohn Baldwin 465a10482eaSJohn Baldwin switch (cipher_alg) { 466a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 467a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_ZERO) 468a10482eaSJohn Baldwin iv_len = AES_BLOCK_LEN; 469a10482eaSJohn Baldwin else 470a10482eaSJohn Baldwin iv_len = 0; 471a10482eaSJohn Baldwin break; 472a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 473a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_TWO) 474a10482eaSJohn Baldwin iv_len = TLS_AEAD_GCM_LEN; 475a10482eaSJohn Baldwin else 476a10482eaSJohn Baldwin iv_len = TLS_1_3_GCM_IV_LEN; 477a10482eaSJohn Baldwin break; 478a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 479a10482eaSJohn Baldwin iv_len = TLS_CHACHA20_IV_LEN; 480a10482eaSJohn Baldwin break; 481a10482eaSJohn Baldwin default: 482a10482eaSJohn Baldwin iv_len = 0; 483a10482eaSJohn Baldwin break; 484a10482eaSJohn Baldwin } 485a10482eaSJohn Baldwin switch (auth_alg) { 486a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 487a10482eaSJohn Baldwin auth_key_len = SHA1_HASH_LEN; 488a10482eaSJohn Baldwin break; 489a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 490a10482eaSJohn Baldwin auth_key_len = SHA2_256_HASH_LEN; 491a10482eaSJohn Baldwin break; 492a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 493a10482eaSJohn Baldwin auth_key_len = SHA2_384_HASH_LEN; 494a10482eaSJohn Baldwin break; 495a10482eaSJohn Baldwin default: 496a10482eaSJohn Baldwin auth_key_len = 0; 497a10482eaSJohn Baldwin break; 498a10482eaSJohn Baldwin } 499a10482eaSJohn Baldwin en->cipher_key = alloc_buffer(cipher_key_len); 500a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len); 501a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len); 502a10482eaSJohn Baldwin en->cipher_algorithm = cipher_alg; 503a10482eaSJohn Baldwin en->cipher_key_len = cipher_key_len; 504a10482eaSJohn Baldwin en->iv_len = iv_len; 505a10482eaSJohn Baldwin en->auth_algorithm = auth_alg; 506a10482eaSJohn Baldwin en->auth_key_len = auth_key_len; 507a10482eaSJohn Baldwin en->tls_vmajor = TLS_MAJOR_VER_ONE; 508a10482eaSJohn Baldwin en->tls_vminor = minor; 509a10482eaSJohn Baldwin be64enc(en->rec_seq, seqno); 510a10482eaSJohn Baldwin } 511a10482eaSJohn Baldwin 512a10482eaSJohn Baldwin static void 513a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en) 514a10482eaSJohn Baldwin { 515a10482eaSJohn Baldwin free(__DECONST(void *, en->cipher_key)); 516a10482eaSJohn Baldwin free(__DECONST(void *, en->iv)); 517a10482eaSJohn Baldwin free(__DECONST(void *, en->auth_key)); 518a10482eaSJohn Baldwin } 519a10482eaSJohn Baldwin 520a10482eaSJohn Baldwin static const EVP_CIPHER * 521a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en) 522a10482eaSJohn Baldwin { 523a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 524a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 525a10482eaSJohn Baldwin switch (en->cipher_key_len) { 526a10482eaSJohn Baldwin case 128 / 8: 527a10482eaSJohn Baldwin return (EVP_aes_128_cbc()); 528a10482eaSJohn Baldwin case 256 / 8: 529a10482eaSJohn Baldwin return (EVP_aes_256_cbc()); 530a10482eaSJohn Baldwin default: 531a10482eaSJohn Baldwin return (NULL); 532a10482eaSJohn Baldwin } 533a10482eaSJohn Baldwin break; 534a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 535a10482eaSJohn Baldwin switch (en->cipher_key_len) { 536a10482eaSJohn Baldwin case 128 / 8: 537a10482eaSJohn Baldwin return (EVP_aes_128_gcm()); 538a10482eaSJohn Baldwin case 256 / 8: 539a10482eaSJohn Baldwin return (EVP_aes_256_gcm()); 540a10482eaSJohn Baldwin default: 541a10482eaSJohn Baldwin return (NULL); 542a10482eaSJohn Baldwin } 543a10482eaSJohn Baldwin break; 544a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 545a10482eaSJohn Baldwin return (EVP_chacha20_poly1305()); 546a10482eaSJohn Baldwin default: 547a10482eaSJohn Baldwin return (NULL); 548a10482eaSJohn Baldwin } 549a10482eaSJohn Baldwin } 550a10482eaSJohn Baldwin 551a10482eaSJohn Baldwin static const EVP_MD * 552a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en) 553a10482eaSJohn Baldwin { 554a10482eaSJohn Baldwin switch (en->auth_algorithm) { 555a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 556a10482eaSJohn Baldwin return (EVP_sha1()); 557a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 558a10482eaSJohn Baldwin return (EVP_sha256()); 559a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 560a10482eaSJohn Baldwin return (EVP_sha384()); 561a10482eaSJohn Baldwin default: 562a10482eaSJohn Baldwin return (NULL); 563a10482eaSJohn Baldwin } 564a10482eaSJohn Baldwin } 565a10482eaSJohn Baldwin 566a10482eaSJohn Baldwin static size_t 567a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en) 568a10482eaSJohn Baldwin { 569a10482eaSJohn Baldwin size_t len; 570a10482eaSJohn Baldwin 571a10482eaSJohn Baldwin len = sizeof(struct tls_record_layer); 572a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 573a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 574a10482eaSJohn Baldwin if (en->tls_vminor != TLS_MINOR_VER_ZERO) 575a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 576a10482eaSJohn Baldwin return (len); 577a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 578a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) 579a10482eaSJohn Baldwin len += sizeof(uint64_t); 580a10482eaSJohn Baldwin return (len); 581a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 582a10482eaSJohn Baldwin return (len); 583a10482eaSJohn Baldwin default: 584a10482eaSJohn Baldwin return (0); 585a10482eaSJohn Baldwin } 586a10482eaSJohn Baldwin } 587a10482eaSJohn Baldwin 588a10482eaSJohn Baldwin static size_t 589a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en) 590a10482eaSJohn Baldwin { 591a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 592a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 593a10482eaSJohn Baldwin switch (en->auth_algorithm) { 594a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 595a10482eaSJohn Baldwin return (SHA1_HASH_LEN); 596a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 597a10482eaSJohn Baldwin return (SHA2_256_HASH_LEN); 598a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 599a10482eaSJohn Baldwin return (SHA2_384_HASH_LEN); 600a10482eaSJohn Baldwin default: 601a10482eaSJohn Baldwin return (0); 602a10482eaSJohn Baldwin } 603a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 604a10482eaSJohn Baldwin return (AES_GMAC_HASH_LEN); 605a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 606a10482eaSJohn Baldwin return (POLY1305_HASH_LEN); 607a10482eaSJohn Baldwin default: 608a10482eaSJohn Baldwin return (0); 609a10482eaSJohn Baldwin } 610a10482eaSJohn Baldwin } 611a10482eaSJohn Baldwin 612a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */ 613a10482eaSJohn Baldwin static size_t 614a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en) 615a10482eaSJohn Baldwin { 616a10482eaSJohn Baldwin size_t len; 617a10482eaSJohn Baldwin 618a10482eaSJohn Baldwin len = tls_mac_len(en); 619a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 620a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 621a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 622a10482eaSJohn Baldwin len++; 623a10482eaSJohn Baldwin return (len); 624a10482eaSJohn Baldwin } 625a10482eaSJohn Baldwin 626a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */ 627a10482eaSJohn Baldwin static void 628a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len, 629a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad) 630a10482eaSJohn Baldwin { 631a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 632a10482eaSJohn Baldwin ad->type = hdr->tls_type; 633a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 634a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 635a10482eaSJohn Baldwin ad->tls_length = htons(len); 636a10482eaSJohn Baldwin } 637a10482eaSJohn Baldwin 638a10482eaSJohn Baldwin static void 639a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len, 640a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, 641a10482eaSJohn Baldwin struct tls_aead_data *ad) 642a10482eaSJohn Baldwin { 643a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 644a10482eaSJohn Baldwin ad->type = hdr->tls_type; 645a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 646a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 647a10482eaSJohn Baldwin ad->tls_length = htons(len); 648a10482eaSJohn Baldwin } 649a10482eaSJohn Baldwin 650a10482eaSJohn Baldwin static void 651a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr, 652a10482eaSJohn Baldwin uint64_t seqno, struct tls_aead_data_13 *ad) 653a10482eaSJohn Baldwin { 654a10482eaSJohn Baldwin ad->type = hdr->tls_type; 655a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 656a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 657a10482eaSJohn Baldwin ad->tls_length = hdr->tls_length; 658a10482eaSJohn Baldwin } 659a10482eaSJohn Baldwin 660a10482eaSJohn Baldwin static void 661a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr, 662a10482eaSJohn Baldwin char *nonce) 663a10482eaSJohn Baldwin { 664a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN); 665a10482eaSJohn Baldwin memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t)); 666a10482eaSJohn Baldwin } 667a10482eaSJohn Baldwin 668a10482eaSJohn Baldwin static void 669a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce) 670a10482eaSJohn Baldwin { 671a10482eaSJohn Baldwin static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN, 672a10482eaSJohn Baldwin "TLS 1.3 nonce length mismatch"); 673a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN); 674a10482eaSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(seqno); 675a10482eaSJohn Baldwin } 676a10482eaSJohn Baldwin 677a10482eaSJohn Baldwin /* 678a10482eaSJohn Baldwin * Decrypt a TLS record 'len' bytes long at 'src' and store the result at 679a10482eaSJohn Baldwin * 'dst'. If the TLS record header length doesn't match or 'dst' doesn't 680a10482eaSJohn Baldwin * have sufficient room ('avail'), fail the test. 681a10482eaSJohn Baldwin */ 682a10482eaSJohn Baldwin static size_t 683a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src, 684a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 685a10482eaSJohn Baldwin { 686a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 687a10482eaSJohn Baldwin struct tls_mac_data aad; 688a10482eaSJohn Baldwin const char *iv; 689a10482eaSJohn Baldwin char *buf; 690a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 691a10482eaSJohn Baldwin int padding; 692a10482eaSJohn Baldwin 693a10482eaSJohn Baldwin hdr = src; 694a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 695a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 696a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 697a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor); 698a10482eaSJohn Baldwin 699a10482eaSJohn Baldwin /* First, decrypt the outer payload into a temporary buffer. */ 700a10482eaSJohn Baldwin payload_len = len - hdr_len; 701a10482eaSJohn Baldwin buf = malloc(payload_len); 702a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 703a10482eaSJohn Baldwin iv = en->iv; 704a10482eaSJohn Baldwin else 705a10482eaSJohn Baldwin iv = (void *)(hdr + 1); 706a10482eaSJohn Baldwin ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 707a10482eaSJohn Baldwin (const u_char *)src + hdr_len, buf, payload_len)); 708a10482eaSJohn Baldwin 709a10482eaSJohn Baldwin /* 710a10482eaSJohn Baldwin * Copy the last encrypted block to use as the IV for the next 711a10482eaSJohn Baldwin * record for TLS 1.0. 712a10482eaSJohn Baldwin */ 713a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 714a10482eaSJohn Baldwin memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src + 715a10482eaSJohn Baldwin (len - AES_BLOCK_LEN), AES_BLOCK_LEN); 716a10482eaSJohn Baldwin 717a10482eaSJohn Baldwin /* 718a10482eaSJohn Baldwin * Verify trailing padding and strip. 719a10482eaSJohn Baldwin * 720a10482eaSJohn Baldwin * The kernel always generates the smallest amount of padding. 721a10482eaSJohn Baldwin */ 722a10482eaSJohn Baldwin padding = buf[payload_len - 1] + 1; 723a10482eaSJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN); 724a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= mac_len + padding); 725a10482eaSJohn Baldwin payload_len -= padding; 726a10482eaSJohn Baldwin 727a10482eaSJohn Baldwin /* Verify HMAC. */ 728a10482eaSJohn Baldwin payload_len -= mac_len; 729a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad); 730a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 731a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len)); 732a10482eaSJohn Baldwin 733a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 734a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 735a10482eaSJohn Baldwin *record_type = hdr->tls_type; 736a10482eaSJohn Baldwin return (payload_len); 737a10482eaSJohn Baldwin } 738a10482eaSJohn Baldwin 739a10482eaSJohn Baldwin static size_t 740a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src, 741a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 742a10482eaSJohn Baldwin { 743a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 744a10482eaSJohn Baldwin struct tls_aead_data aad; 745a10482eaSJohn Baldwin char nonce[12]; 746a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 747a10482eaSJohn Baldwin 748a10482eaSJohn Baldwin hdr = src; 749a10482eaSJohn Baldwin 750a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 751a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 752a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 753a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 754a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 755a10482eaSJohn Baldwin 756a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad); 757a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 758a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 759a10482eaSJohn Baldwin else 760a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 761a10482eaSJohn Baldwin 762a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 763a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len, 764a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 765a10482eaSJohn Baldwin 766a10482eaSJohn Baldwin *record_type = hdr->tls_type; 767a10482eaSJohn Baldwin return (payload_len); 768a10482eaSJohn Baldwin } 769a10482eaSJohn Baldwin 770a10482eaSJohn Baldwin static size_t 771a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src, 772a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 773a10482eaSJohn Baldwin { 774a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 775a10482eaSJohn Baldwin struct tls_aead_data_13 aad; 776a10482eaSJohn Baldwin char nonce[12]; 777a10482eaSJohn Baldwin char *buf; 778a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 779a10482eaSJohn Baldwin 780a10482eaSJohn Baldwin hdr = src; 781a10482eaSJohn Baldwin 782a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 783a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 784a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 785a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= 1); 786a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP); 787a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 788a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 789a10482eaSJohn Baldwin 790a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 791a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 792a10482eaSJohn Baldwin 793a10482eaSJohn Baldwin /* 794a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the 795a10482eaSJohn Baldwin * record type as the last byte of the trailer. 796a10482eaSJohn Baldwin */ 797a10482eaSJohn Baldwin buf = malloc(payload_len); 798a10482eaSJohn Baldwin 799a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 800a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len, 801a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 802a10482eaSJohn Baldwin 803a10482eaSJohn Baldwin /* Trim record type. */ 804a10482eaSJohn Baldwin *record_type = buf[payload_len - 1]; 805a10482eaSJohn Baldwin payload_len--; 806a10482eaSJohn Baldwin 807a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 808a10482eaSJohn Baldwin free(buf); 809a10482eaSJohn Baldwin 810a10482eaSJohn Baldwin return (payload_len); 811a10482eaSJohn Baldwin } 812a10482eaSJohn Baldwin 813a10482eaSJohn Baldwin static size_t 814a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src, 815a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 816a10482eaSJohn Baldwin { 817a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 818a10482eaSJohn Baldwin size_t payload_len; 819a10482eaSJohn Baldwin 820a10482eaSJohn Baldwin hdr = src; 821a10482eaSJohn Baldwin ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len); 822a10482eaSJohn Baldwin 823a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en)); 824a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 825a10482eaSJohn Baldwin 826a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 827a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst, 828a10482eaSJohn Baldwin record_type) == payload_len); 829a10482eaSJohn Baldwin } else { 830a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst, 831a10482eaSJohn Baldwin record_type) == payload_len); 832a10482eaSJohn Baldwin } 833a10482eaSJohn Baldwin 834a10482eaSJohn Baldwin return (payload_len); 835a10482eaSJohn Baldwin } 836a10482eaSJohn Baldwin 837a10482eaSJohn Baldwin static size_t 838a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src, 839a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 840a10482eaSJohn Baldwin { 841a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 842a10482eaSJohn Baldwin return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail, 843a10482eaSJohn Baldwin record_type)); 844a10482eaSJohn Baldwin else 845a10482eaSJohn Baldwin return (decrypt_tls_aead(en, seqno, src, len, dst, avail, 846a10482eaSJohn Baldwin record_type)); 847a10482eaSJohn Baldwin } 848a10482eaSJohn Baldwin 8493e7f8a8dSJohn Baldwin /* 8503e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes 8513e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have 8523e7f8a8dSJohn Baldwin * sufficient room ('avail'), fail the test. 8533e7f8a8dSJohn Baldwin */ 8543e7f8a8dSJohn Baldwin static size_t 8553e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 8563e7f8a8dSJohn Baldwin const void *src, size_t len, void *dst) 8573e7f8a8dSJohn Baldwin { 8583e7f8a8dSJohn Baldwin struct tls_record_layer *hdr; 8593e7f8a8dSJohn Baldwin struct tls_aead_data aad; 8603e7f8a8dSJohn Baldwin char nonce[12]; 8613e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len; 8623e7f8a8dSJohn Baldwin 8633e7f8a8dSJohn Baldwin hdr = dst; 8643e7f8a8dSJohn Baldwin 8653e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en); 8663e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en); 8673e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len; 8683e7f8a8dSJohn Baldwin 8693e7f8a8dSJohn Baldwin hdr->tls_type = record_type; 8703e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 8713e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 8723e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 8733e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 8743e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno)); 8753e7f8a8dSJohn Baldwin 8763e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad); 8773e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 8783e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 8793e7f8a8dSJohn Baldwin else 8803e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce); 8813e7f8a8dSJohn Baldwin 8823e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 8833e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len, 8843e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len)); 8853e7f8a8dSJohn Baldwin 8863e7f8a8dSJohn Baldwin return (record_len); 8873e7f8a8dSJohn Baldwin } 8883e7f8a8dSJohn Baldwin 8893e7f8a8dSJohn Baldwin static size_t 89005a1d0f5SJohn Baldwin encrypt_tls_13_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 89105a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t padding) 89205a1d0f5SJohn Baldwin { 89305a1d0f5SJohn Baldwin struct tls_record_layer *hdr; 89405a1d0f5SJohn Baldwin struct tls_aead_data_13 aad; 89505a1d0f5SJohn Baldwin char nonce[12]; 89605a1d0f5SJohn Baldwin char *buf; 89705a1d0f5SJohn Baldwin size_t hdr_len, mac_len, record_len; 89805a1d0f5SJohn Baldwin 89905a1d0f5SJohn Baldwin hdr = dst; 90005a1d0f5SJohn Baldwin 90105a1d0f5SJohn Baldwin hdr_len = tls_header_len(en); 90205a1d0f5SJohn Baldwin mac_len = tls_mac_len(en); 90305a1d0f5SJohn Baldwin record_len = hdr_len + len + 1 + padding + mac_len; 90405a1d0f5SJohn Baldwin 90505a1d0f5SJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 90605a1d0f5SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 90705a1d0f5SJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 90805a1d0f5SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 90905a1d0f5SJohn Baldwin 91005a1d0f5SJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 91105a1d0f5SJohn Baldwin tls_13_nonce(en, seqno, nonce); 91205a1d0f5SJohn Baldwin 91305a1d0f5SJohn Baldwin /* 91405a1d0f5SJohn Baldwin * Have to use a temporary buffer for the input so that the record 91505a1d0f5SJohn Baldwin * type can be appended. 91605a1d0f5SJohn Baldwin */ 91705a1d0f5SJohn Baldwin buf = malloc(len + 1 + padding); 91805a1d0f5SJohn Baldwin memcpy(buf, src, len); 91905a1d0f5SJohn Baldwin buf[len] = record_type; 92005a1d0f5SJohn Baldwin memset(buf + len + 1, 0, padding); 92105a1d0f5SJohn Baldwin 92205a1d0f5SJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 92305a1d0f5SJohn Baldwin &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding, 92405a1d0f5SJohn Baldwin (char *)dst + hdr_len + len + 1 + padding, mac_len)); 92505a1d0f5SJohn Baldwin 92605a1d0f5SJohn Baldwin free(buf); 92705a1d0f5SJohn Baldwin 92805a1d0f5SJohn Baldwin return (record_len); 92905a1d0f5SJohn Baldwin } 93005a1d0f5SJohn Baldwin 93105a1d0f5SJohn Baldwin static size_t 9323e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 93305a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, size_t padding) 9343e7f8a8dSJohn Baldwin { 9353e7f8a8dSJohn Baldwin size_t record_len; 9363e7f8a8dSJohn Baldwin 93705a1d0f5SJohn Baldwin record_len = tls_header_len(en) + len + padding + tls_trailer_len(en); 9383e7f8a8dSJohn Baldwin ATF_REQUIRE(record_len <= avail); 9393e7f8a8dSJohn Baldwin 94005a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 94105a1d0f5SJohn Baldwin ATF_REQUIRE(padding == 0); 94205a1d0f5SJohn Baldwin ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src, 94305a1d0f5SJohn Baldwin len, dst) == record_len); 94405a1d0f5SJohn Baldwin } else 94505a1d0f5SJohn Baldwin ATF_REQUIRE(encrypt_tls_13_aead(en, record_type, seqno, src, 94605a1d0f5SJohn Baldwin len, dst, padding) == record_len); 9473e7f8a8dSJohn Baldwin 9483e7f8a8dSJohn Baldwin return (record_len); 9493e7f8a8dSJohn Baldwin } 9503e7f8a8dSJohn Baldwin 9513e7f8a8dSJohn Baldwin static size_t 9523e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 95305a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, size_t padding) 9543e7f8a8dSJohn Baldwin { 95505a1d0f5SJohn Baldwin return (encrypt_tls_aead(en, record_type, seqno, src, len, dst, avail, 95605a1d0f5SJohn Baldwin padding)); 9573e7f8a8dSJohn Baldwin } 9583e7f8a8dSJohn Baldwin 959a10482eaSJohn Baldwin static void 960*2400a7b1SJohn Baldwin test_ktls_transmit_app_data(const atf_tc_t *tc, struct tls_enable *en, 961*2400a7b1SJohn Baldwin uint64_t seqno, size_t len) 962a10482eaSJohn Baldwin { 963a10482eaSJohn Baldwin struct kevent ev; 964a10482eaSJohn Baldwin struct tls_record_layer *hdr; 965a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 966a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written; 967a10482eaSJohn Baldwin ssize_t rv; 968a10482eaSJohn Baldwin int kq, sockets[2]; 969a10482eaSJohn Baldwin uint8_t record_type; 970a10482eaSJohn Baldwin 971a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 972a10482eaSJohn Baldwin decrypted = malloc(len); 973a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 974a10482eaSJohn Baldwin tls_trailer_len(en); 975a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 976a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 977a10482eaSJohn Baldwin 978a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 979a10482eaSJohn Baldwin 980*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 981a10482eaSJohn Baldwin 982a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 983a10482eaSJohn Baldwin sizeof(*en)) == 0); 984a10482eaSJohn Baldwin 985a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 986a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 987a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 988a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 989a10482eaSJohn Baldwin 990a10482eaSJohn Baldwin decrypted_len = 0; 991a10482eaSJohn Baldwin outbuf_len = 0; 992a10482eaSJohn Baldwin written = 0; 993a10482eaSJohn Baldwin 994a10482eaSJohn Baldwin while (decrypted_len != len) { 995a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 996a10482eaSJohn Baldwin 997a10482eaSJohn Baldwin switch (ev.filter) { 998a10482eaSJohn Baldwin case EVFILT_WRITE: 999a10482eaSJohn Baldwin /* Try to write any remaining data. */ 1000a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written, 1001a10482eaSJohn Baldwin len - written); 1002a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1003a10482eaSJohn Baldwin "failed to write to socket"); 1004a10482eaSJohn Baldwin written += rv; 1005a10482eaSJohn Baldwin if (written == len) { 1006a10482eaSJohn Baldwin ev.flags = EV_DISABLE; 1007a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 1008a10482eaSJohn Baldwin NULL) == 0); 1009a10482eaSJohn Baldwin } 1010a10482eaSJohn Baldwin break; 1011a10482eaSJohn Baldwin 1012a10482eaSJohn Baldwin case EVFILT_READ: 1013a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 1014a10482eaSJohn Baldwin 1015a10482eaSJohn Baldwin /* 1016a10482eaSJohn Baldwin * Try to read data for the next TLS record 1017a10482eaSJohn Baldwin * into outbuf. Start by reading the header 1018a10482eaSJohn Baldwin * to determine how much additional data to 1019a10482eaSJohn Baldwin * read. 1020a10482eaSJohn Baldwin */ 1021a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) { 1022a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1023a10482eaSJohn Baldwin sizeof(struct tls_record_layer) - 1024a10482eaSJohn Baldwin outbuf_len); 1025a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1026a10482eaSJohn Baldwin "failed to read from socket"); 1027a10482eaSJohn Baldwin outbuf_len += rv; 1028a10482eaSJohn Baldwin } 1029a10482eaSJohn Baldwin 1030a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) 1031a10482eaSJohn Baldwin break; 1032a10482eaSJohn Baldwin 1033a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) + 1034a10482eaSJohn Baldwin ntohs(hdr->tls_length); 1035d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1036d71830cdSJohn Baldwin ATF_REQUIRE(record_len > outbuf_len); 1037a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 1038a10482eaSJohn Baldwin record_len - outbuf_len); 1039a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN) 1040a10482eaSJohn Baldwin break; 1041a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, "failed to read from socket"); 1042a10482eaSJohn Baldwin 1043a10482eaSJohn Baldwin outbuf_len += rv; 1044a10482eaSJohn Baldwin if (outbuf_len == record_len) { 1045a10482eaSJohn Baldwin decrypted_len += decrypt_tls_record(en, seqno, 1046a10482eaSJohn Baldwin outbuf, outbuf_len, 1047a10482eaSJohn Baldwin decrypted + decrypted_len, 1048a10482eaSJohn Baldwin len - decrypted_len, &record_type); 1049a10482eaSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 1050a10482eaSJohn Baldwin 1051a10482eaSJohn Baldwin seqno++; 1052a10482eaSJohn Baldwin outbuf_len = 0; 1053a10482eaSJohn Baldwin } 1054a10482eaSJohn Baldwin break; 1055a10482eaSJohn Baldwin } 1056a10482eaSJohn Baldwin } 1057a10482eaSJohn Baldwin 1058a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len, 1059a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written); 1060a10482eaSJohn Baldwin 1061a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1062a10482eaSJohn Baldwin 1063a10482eaSJohn Baldwin free(outbuf); 1064a10482eaSJohn Baldwin free(decrypted); 1065a10482eaSJohn Baldwin free(plaintext); 1066a10482eaSJohn Baldwin 10672c105205SJohn Baldwin close_sockets(sockets); 1068694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 1069a10482eaSJohn Baldwin } 1070a10482eaSJohn Baldwin 1071a10482eaSJohn Baldwin static void 1072a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len) 1073a10482eaSJohn Baldwin { 1074a10482eaSJohn Baldwin struct msghdr msg; 1075a10482eaSJohn Baldwin struct cmsghdr *cmsg; 1076a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))]; 1077a10482eaSJohn Baldwin struct iovec iov; 1078a10482eaSJohn Baldwin 1079a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1080a10482eaSJohn Baldwin 1081a10482eaSJohn Baldwin msg.msg_control = cbuf; 1082a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1083a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 1084a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 1085a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 1086a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type)); 1087a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type; 1088a10482eaSJohn Baldwin 1089a10482eaSJohn Baldwin iov.iov_base = data; 1090a10482eaSJohn Baldwin iov.iov_len = len; 1091a10482eaSJohn Baldwin msg.msg_iov = &iov; 1092a10482eaSJohn Baldwin msg.msg_iovlen = 1; 1093a10482eaSJohn Baldwin 1094a10482eaSJohn Baldwin ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len); 1095a10482eaSJohn Baldwin } 1096a10482eaSJohn Baldwin 1097a10482eaSJohn Baldwin static void 1098*2400a7b1SJohn Baldwin test_ktls_transmit_control(const atf_tc_t *tc, struct tls_enable *en, 1099*2400a7b1SJohn Baldwin uint64_t seqno, uint8_t type, size_t len) 1100a10482eaSJohn Baldwin { 1101a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1102a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1103a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 1104a10482eaSJohn Baldwin ssize_t rv; 1105a10482eaSJohn Baldwin int sockets[2]; 1106a10482eaSJohn Baldwin uint8_t record_type; 1107a10482eaSJohn Baldwin 1108a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1109a10482eaSJohn Baldwin 1110a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1111a10482eaSJohn Baldwin decrypted = malloc(len); 1112a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1113a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1114a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1115a10482eaSJohn Baldwin 1116*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1117a10482eaSJohn Baldwin 1118a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1119a10482eaSJohn Baldwin sizeof(*en)) == 0); 1120a10482eaSJohn Baldwin 1121a10482eaSJohn Baldwin fd_set_blocking(sockets[0]); 1122a10482eaSJohn Baldwin fd_set_blocking(sockets[1]); 1123a10482eaSJohn Baldwin 1124a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len); 1125a10482eaSJohn Baldwin 1126a10482eaSJohn Baldwin /* 1127a10482eaSJohn Baldwin * First read the header to determine how much additional data 1128a10482eaSJohn Baldwin * to read. 1129a10482eaSJohn Baldwin */ 1130a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1131a10482eaSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 1132a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length); 1133a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1134d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1135a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 1136a10482eaSJohn Baldwin payload_len); 1137a10482eaSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 1138a10482eaSJohn Baldwin 1139a10482eaSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len, 1140a10482eaSJohn Baldwin &record_type); 1141a10482eaSJohn Baldwin 1142a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv, 1143a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len); 1144a10482eaSJohn Baldwin ATF_REQUIRE(record_type == type); 1145a10482eaSJohn Baldwin 1146a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1147a10482eaSJohn Baldwin 1148a10482eaSJohn Baldwin free(outbuf); 1149a10482eaSJohn Baldwin free(decrypted); 1150a10482eaSJohn Baldwin free(plaintext); 1151a10482eaSJohn Baldwin 11522c105205SJohn Baldwin close_sockets(sockets); 1153a10482eaSJohn Baldwin } 1154a10482eaSJohn Baldwin 11550ff2a12aSJohn Baldwin static void 1156*2400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(const atf_tc_t *tc, struct tls_enable *en, 1157*2400a7b1SJohn Baldwin uint64_t seqno) 11580ff2a12aSJohn Baldwin { 11590ff2a12aSJohn Baldwin struct tls_record_layer *hdr; 11600ff2a12aSJohn Baldwin char *outbuf; 11610ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 11620ff2a12aSJohn Baldwin ssize_t rv; 11630ff2a12aSJohn Baldwin int sockets[2]; 11640ff2a12aSJohn Baldwin uint8_t record_type; 11650ff2a12aSJohn Baldwin 11660ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en); 11670ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap); 11680ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 11690ff2a12aSJohn Baldwin 1170*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 11710ff2a12aSJohn Baldwin 11720ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 11730ff2a12aSJohn Baldwin sizeof(*en)) == 0); 11740ff2a12aSJohn Baldwin 11750ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]); 11760ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]); 11770ff2a12aSJohn Baldwin 11785de79eedSMark Johnston /* 11795de79eedSMark Johnston * A write of zero bytes should send an empty fragment only for 11805de79eedSMark Johnston * TLS 1.0, otherwise an error should be raised. 11815de79eedSMark Johnston */ 11820ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0); 11835de79eedSMark Johnston if (rv == 0) { 11845de79eedSMark Johnston ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC); 11855de79eedSMark Johnston ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO); 11865de79eedSMark Johnston } else { 11875de79eedSMark Johnston ATF_REQUIRE(rv == -1); 11885de79eedSMark Johnston ATF_REQUIRE(errno == EINVAL); 11895de79eedSMark Johnston goto out; 11905de79eedSMark Johnston } 11910ff2a12aSJohn Baldwin 11920ff2a12aSJohn Baldwin /* 11930ff2a12aSJohn Baldwin * First read the header to determine how much additional data 11940ff2a12aSJohn Baldwin * to read. 11950ff2a12aSJohn Baldwin */ 11960ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 11970ff2a12aSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 11980ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length); 11990ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 12000ff2a12aSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 12010ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 12020ff2a12aSJohn Baldwin payload_len); 12030ff2a12aSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 12040ff2a12aSJohn Baldwin 12050ff2a12aSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0, 12060ff2a12aSJohn Baldwin &record_type); 12070ff2a12aSJohn Baldwin 12080ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0, 12090ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv); 12100ff2a12aSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 12110ff2a12aSJohn Baldwin 12125de79eedSMark Johnston out: 12130ff2a12aSJohn Baldwin free(outbuf); 12140ff2a12aSJohn Baldwin 12152c105205SJohn Baldwin close_sockets(sockets); 12160ff2a12aSJohn Baldwin } 12170ff2a12aSJohn Baldwin 12183e7f8a8dSJohn Baldwin static size_t 12193e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type, 12203e7f8a8dSJohn Baldwin void *data, size_t len) 12213e7f8a8dSJohn Baldwin { 12223e7f8a8dSJohn Baldwin struct msghdr msg; 12233e7f8a8dSJohn Baldwin struct cmsghdr *cmsg; 12243e7f8a8dSJohn Baldwin struct tls_get_record *tgr; 12253e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 12263e7f8a8dSJohn Baldwin struct iovec iov; 12273e7f8a8dSJohn Baldwin ssize_t rv; 12283e7f8a8dSJohn Baldwin 12293e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg)); 12303e7f8a8dSJohn Baldwin 12313e7f8a8dSJohn Baldwin msg.msg_control = cbuf; 12323e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 12333e7f8a8dSJohn Baldwin 12343e7f8a8dSJohn Baldwin iov.iov_base = data; 12353e7f8a8dSJohn Baldwin iov.iov_len = len; 12363e7f8a8dSJohn Baldwin msg.msg_iov = &iov; 12373e7f8a8dSJohn Baldwin msg.msg_iovlen = 1; 12383e7f8a8dSJohn Baldwin 12393e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0); 12403e7f8a8dSJohn Baldwin 12413e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR); 12423e7f8a8dSJohn Baldwin 12433e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 12443e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL); 12453e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP); 12463e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD); 12473e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr))); 12483e7f8a8dSJohn Baldwin 12493e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 12503e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_type == record_type); 12513e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor); 125205a1d0f5SJohn Baldwin /* XXX: Not sure if this is what OpenSSL expects? */ 125305a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 125405a1d0f5SJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO); 125505a1d0f5SJohn Baldwin else 12563e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor); 12573e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_length == htons(rv)); 12583e7f8a8dSJohn Baldwin 12593e7f8a8dSJohn Baldwin return (rv); 12603e7f8a8dSJohn Baldwin } 12613e7f8a8dSJohn Baldwin 12623e7f8a8dSJohn Baldwin static void 1263*2400a7b1SJohn Baldwin test_ktls_receive_app_data(const atf_tc_t *tc, struct tls_enable *en, 1264*2400a7b1SJohn Baldwin uint64_t seqno, size_t len, size_t padding) 12653e7f8a8dSJohn Baldwin { 12663e7f8a8dSJohn Baldwin struct kevent ev; 12673e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf; 12683e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written; 12693e7f8a8dSJohn Baldwin ssize_t rv; 12703e7f8a8dSJohn Baldwin int kq, sockets[2]; 12713e7f8a8dSJohn Baldwin 12723e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len); 12733e7f8a8dSJohn Baldwin received = malloc(len); 12743e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 12753e7f8a8dSJohn Baldwin tls_trailer_len(en); 12763e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap); 12773e7f8a8dSJohn Baldwin 12783e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 12793e7f8a8dSJohn Baldwin 1280*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 12813e7f8a8dSJohn Baldwin 12823e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 12833e7f8a8dSJohn Baldwin sizeof(*en)) == 0); 12843e7f8a8dSJohn Baldwin 12853e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 12863e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 12873e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 12883e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 12893e7f8a8dSJohn Baldwin 12903e7f8a8dSJohn Baldwin received_len = 0; 12913e7f8a8dSJohn Baldwin outbuf_len = 0; 12923e7f8a8dSJohn Baldwin written = 0; 12933e7f8a8dSJohn Baldwin 12943e7f8a8dSJohn Baldwin while (received_len != len) { 12953e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 12963e7f8a8dSJohn Baldwin 12973e7f8a8dSJohn Baldwin switch (ev.filter) { 12983e7f8a8dSJohn Baldwin case EVFILT_WRITE: 12993e7f8a8dSJohn Baldwin /* 13003e7f8a8dSJohn Baldwin * Compose the next TLS record to send. 13013e7f8a8dSJohn Baldwin */ 13023e7f8a8dSJohn Baldwin if (outbuf_len == 0) { 13033e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len); 13043e7f8a8dSJohn Baldwin todo = len - written; 130505a1d0f5SJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding) 130605a1d0f5SJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2 - padding; 13073e7f8a8dSJohn Baldwin outbuf_len = encrypt_tls_record(en, 13083e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written, 130905a1d0f5SJohn Baldwin todo, outbuf, outbuf_cap, padding); 13103e7f8a8dSJohn Baldwin outbuf_sent = 0; 13113e7f8a8dSJohn Baldwin written += todo; 13123e7f8a8dSJohn Baldwin seqno++; 13133e7f8a8dSJohn Baldwin } 13143e7f8a8dSJohn Baldwin 13153e7f8a8dSJohn Baldwin /* 13163e7f8a8dSJohn Baldwin * Try to write the remainder of the current 13173e7f8a8dSJohn Baldwin * TLS record. 13183e7f8a8dSJohn Baldwin */ 13193e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent, 13203e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent); 13213e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 13223e7f8a8dSJohn Baldwin "failed to write to socket"); 13233e7f8a8dSJohn Baldwin outbuf_sent += rv; 13243e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) { 13253e7f8a8dSJohn Baldwin outbuf_len = 0; 13263e7f8a8dSJohn Baldwin if (written == len) { 13273e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE; 13283e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 13293e7f8a8dSJohn Baldwin NULL) == 0); 13303e7f8a8dSJohn Baldwin } 13313e7f8a8dSJohn Baldwin } 13323e7f8a8dSJohn Baldwin break; 13333e7f8a8dSJohn Baldwin 13343e7f8a8dSJohn Baldwin case EVFILT_READ: 13353e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 13363e7f8a8dSJohn Baldwin 13373e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident, 13383e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len, 13393e7f8a8dSJohn Baldwin len - received_len); 13403e7f8a8dSJohn Baldwin received_len += rv; 13413e7f8a8dSJohn Baldwin break; 13423e7f8a8dSJohn Baldwin } 13433e7f8a8dSJohn Baldwin } 13443e7f8a8dSJohn Baldwin 13453e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len, 13463e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written); 13473e7f8a8dSJohn Baldwin 13483e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0); 13493e7f8a8dSJohn Baldwin 13503e7f8a8dSJohn Baldwin free(outbuf); 13513e7f8a8dSJohn Baldwin free(received); 13523e7f8a8dSJohn Baldwin free(plaintext); 13533e7f8a8dSJohn Baldwin 13542c105205SJohn Baldwin close_sockets(sockets); 1355694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 13563e7f8a8dSJohn Baldwin } 13573e7f8a8dSJohn Baldwin 13580ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \ 13590ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 13600ff2a12aSJohn Baldwin CRYPTO_SHA1_HMAC) \ 13610ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 13620ff2a12aSJohn Baldwin CRYPTO_SHA1_HMAC) 13630ff2a12aSJohn Baldwin 136483a54b58SJohn Baldwin #define TLS_13_TESTS(M) \ 136583a54b58SJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 136683a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 136783a54b58SJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 136883a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 136983a54b58SJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 137083a54b58SJohn Baldwin TLS_MINOR_VER_THREE) 137183a54b58SJohn Baldwin 1372a10482eaSJohn Baldwin #define AES_CBC_TESTS(M) \ 1373a10482eaSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1374a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 1375a10482eaSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1376a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 1377a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1378a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1379a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1380a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1381a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1382a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1383a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1384a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1385a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1386a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1387a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \ 1388a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1389a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1390a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1391a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \ 1392a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1393a10482eaSJohn Baldwin 1394a10482eaSJohn Baldwin #define AES_GCM_TESTS(M) \ 1395a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1396a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1397a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1398a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1399a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1400a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \ 1401a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1402a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1403a10482eaSJohn Baldwin 1404a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \ 1405a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1406a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1407a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1408a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1409a10482eaSJohn Baldwin 1410a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1411a10482eaSJohn Baldwin auth_alg, minor, name, len) \ 1412a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 1413a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1414a10482eaSJohn Baldwin { \ 1415a10482eaSJohn Baldwin struct tls_enable en; \ 1416a10482eaSJohn Baldwin uint64_t seqno; \ 1417a10482eaSJohn Baldwin \ 1418a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1419a10482eaSJohn Baldwin seqno = random(); \ 1420a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1421a10482eaSJohn Baldwin &en); \ 1422*2400a7b1SJohn Baldwin test_ktls_transmit_app_data(tc, &en, seqno, len); \ 1423a10482eaSJohn Baldwin free_tls_enable(&en); \ 1424a10482eaSJohn Baldwin } 1425a10482eaSJohn Baldwin 1426a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1427a10482eaSJohn Baldwin auth_alg, minor, name) \ 1428a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1429a10482eaSJohn Baldwin 1430a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 143144265dc3SJohn Baldwin auth_alg, minor, name, type, len) \ 143244265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 143344265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1434a10482eaSJohn Baldwin { \ 1435a10482eaSJohn Baldwin struct tls_enable en; \ 1436a10482eaSJohn Baldwin uint64_t seqno; \ 1437a10482eaSJohn Baldwin \ 1438a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1439a10482eaSJohn Baldwin seqno = random(); \ 1440a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1441a10482eaSJohn Baldwin &en); \ 1442*2400a7b1SJohn Baldwin test_ktls_transmit_control(tc, &en, seqno, type, len); \ 1443a10482eaSJohn Baldwin free_tls_enable(&en); \ 1444a10482eaSJohn Baldwin } 1445a10482eaSJohn Baldwin 1446a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 144744265dc3SJohn Baldwin auth_alg, minor, name) \ 144844265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1449a10482eaSJohn Baldwin 14500ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 14515de79eedSMark Johnston key_size, auth_alg, minor) \ 14520ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \ 14530ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \ 14540ff2a12aSJohn Baldwin { \ 14550ff2a12aSJohn Baldwin struct tls_enable en; \ 14560ff2a12aSJohn Baldwin uint64_t seqno; \ 14570ff2a12aSJohn Baldwin \ 14580ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \ 14590ff2a12aSJohn Baldwin seqno = random(); \ 14605de79eedSMark Johnston build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 14615de79eedSMark Johnston &en); \ 1462*2400a7b1SJohn Baldwin test_ktls_transmit_empty_fragment(tc, &en, seqno); \ 14630ff2a12aSJohn Baldwin free_tls_enable(&en); \ 14640ff2a12aSJohn Baldwin } 14650ff2a12aSJohn Baldwin 14660ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 14675de79eedSMark Johnston key_size, auth_alg, minor) \ 14680ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment); 14690ff2a12aSJohn Baldwin 1470a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1471a10482eaSJohn Baldwin minor) \ 1472a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1473a10482eaSJohn Baldwin auth_alg, minor, short, 64) \ 1474a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1475a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \ 1476a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 147744265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32) 1478a10482eaSJohn Baldwin 1479a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1480a10482eaSJohn Baldwin minor) \ 1481a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1482a10482eaSJohn Baldwin auth_alg, minor, short) \ 1483a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1484a10482eaSJohn Baldwin auth_alg, minor, long) \ 1485a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 148644265dc3SJohn Baldwin auth_alg, minor, control) 1487a10482eaSJohn Baldwin 1488a10482eaSJohn Baldwin /* 1489a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests: 1490a10482eaSJohn Baldwin * 1491a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 1492a10482eaSJohn Baldwin * a single TLS record) 1493a10482eaSJohn Baldwin * 1494a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across 1495a10482eaSJohn Baldwin * multiple TLS records) 1496a10482eaSJohn Baldwin * 1497a10482eaSJohn Baldwin * - a control test which sends a single record with a specific 1498a10482eaSJohn Baldwin * content type via sendmsg() 1499a10482eaSJohn Baldwin */ 1500a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS); 1501a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS); 1502a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS); 1503a10482eaSJohn Baldwin 150444265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 150544265dc3SJohn Baldwin auth_alg, minor) \ 150644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 150744265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \ 150844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 150944265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \ 151044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 151144265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \ 151244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 151344265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \ 151444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 151544265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \ 151644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 151744265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \ 151844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 151944265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \ 152044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 152144265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \ 152244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 152344265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \ 152444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 152544265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \ 152644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 152744265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \ 152844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 152944265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \ 153044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 153144265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \ 153244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 153344265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \ 153444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 153544265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \ 153644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 153744265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16) 153844265dc3SJohn Baldwin 153944265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 154044265dc3SJohn Baldwin auth_alg, minor) \ 154144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 154244265dc3SJohn Baldwin auth_alg, minor, padding_1) \ 154344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 154444265dc3SJohn Baldwin auth_alg, minor, padding_2) \ 154544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 154644265dc3SJohn Baldwin auth_alg, minor, padding_3) \ 154744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 154844265dc3SJohn Baldwin auth_alg, minor, padding_4) \ 154944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 155044265dc3SJohn Baldwin auth_alg, minor, padding_5) \ 155144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 155244265dc3SJohn Baldwin auth_alg, minor, padding_6) \ 155344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 155444265dc3SJohn Baldwin auth_alg, minor, padding_7) \ 155544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 155644265dc3SJohn Baldwin auth_alg, minor, padding_8) \ 155744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 155844265dc3SJohn Baldwin auth_alg, minor, padding_9) \ 155944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 156044265dc3SJohn Baldwin auth_alg, minor, padding_10) \ 156144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 156244265dc3SJohn Baldwin auth_alg, minor, padding_11) \ 156344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 156444265dc3SJohn Baldwin auth_alg, minor, padding_12) \ 156544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 156644265dc3SJohn Baldwin auth_alg, minor, padding_13) \ 156744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 156844265dc3SJohn Baldwin auth_alg, minor, padding_14) \ 156944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 157044265dc3SJohn Baldwin auth_alg, minor, padding_15) \ 157144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 157244265dc3SJohn Baldwin auth_alg, minor, padding_16) 157344265dc3SJohn Baldwin 157444265dc3SJohn Baldwin /* 157544265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 157644265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 157744265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 157844265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 157944265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 158044265dc3SJohn Baldwin * of the possible padding lengths for each suite. 158144265dc3SJohn Baldwin */ 158244265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS); 158344265dc3SJohn Baldwin 15840ff2a12aSJohn Baldwin /* 15850ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that 15860ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections. 15870ff2a12aSJohn Baldwin */ 15885de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 15895de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 15905de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 15910ff2a12aSJohn Baldwin 1592d1c369f9SJohn Baldwin static void 1593*2400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(const atf_tc_t *tc, 1594*2400a7b1SJohn Baldwin struct tls_enable *en) 1595d1c369f9SJohn Baldwin { 1596d1c369f9SJohn Baldwin int sockets[2]; 1597d1c369f9SJohn Baldwin 1598*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1599d1c369f9SJohn Baldwin 1600d1c369f9SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1601d1c369f9SJohn Baldwin sizeof(*en)) == -1); 1602d1c369f9SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 1603d1c369f9SJohn Baldwin 16042c105205SJohn Baldwin close_sockets(sockets); 1605d1c369f9SJohn Baldwin } 1606d1c369f9SJohn Baldwin 1607d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 1608d1c369f9SJohn Baldwin minor) \ 1609d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \ 1610d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \ 1611d1c369f9SJohn Baldwin { \ 1612d1c369f9SJohn Baldwin struct tls_enable en; \ 1613d1c369f9SJohn Baldwin uint64_t seqno; \ 1614d1c369f9SJohn Baldwin \ 1615d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \ 1616d1c369f9SJohn Baldwin seqno = random(); \ 1617d1c369f9SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1618d1c369f9SJohn Baldwin &en); \ 1619*2400a7b1SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(tc, &en); \ 1620d1c369f9SJohn Baldwin free_tls_enable(&en); \ 1621d1c369f9SJohn Baldwin } 1622d1c369f9SJohn Baldwin 1623d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 1624d1c369f9SJohn Baldwin minor) \ 1625d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name); 1626d1c369f9SJohn Baldwin 1627d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \ 1628d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1629d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \ 1630d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1631d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \ 1632d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1633d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 1634d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1635d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 1636d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1637d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \ 1638d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1639d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \ 1640d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1641d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 1642d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1643d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 1644d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1645d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \ 1646d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1647d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \ 1648d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1649d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE) 1650d1c369f9SJohn Baldwin 1651d1c369f9SJohn Baldwin /* 1652d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit. 1653d1c369f9SJohn Baldwin */ 1654d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST); 1655d1c369f9SJohn Baldwin 16563e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 165705a1d0f5SJohn Baldwin auth_alg, minor, name, len, padding) \ 16583e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 16593e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 16603e7f8a8dSJohn Baldwin { \ 16613e7f8a8dSJohn Baldwin struct tls_enable en; \ 16623e7f8a8dSJohn Baldwin uint64_t seqno; \ 16633e7f8a8dSJohn Baldwin \ 16643e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \ 16653e7f8a8dSJohn Baldwin seqno = random(); \ 16663e7f8a8dSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 16673e7f8a8dSJohn Baldwin &en); \ 1668*2400a7b1SJohn Baldwin test_ktls_receive_app_data(tc, &en, seqno, len, padding); \ 16693e7f8a8dSJohn Baldwin free_tls_enable(&en); \ 16703e7f8a8dSJohn Baldwin } 16713e7f8a8dSJohn Baldwin 16723e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 16733e7f8a8dSJohn Baldwin auth_alg, minor, name) \ 16743e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 16753e7f8a8dSJohn Baldwin 16763e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 16773e7f8a8dSJohn Baldwin minor) \ 16783e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 167905a1d0f5SJohn Baldwin auth_alg, minor, short, 64, 0) \ 16803e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 168105a1d0f5SJohn Baldwin auth_alg, minor, long, 64 * 1024, 0) 16823e7f8a8dSJohn Baldwin 16833e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 16843e7f8a8dSJohn Baldwin minor) \ 16853e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 16863e7f8a8dSJohn Baldwin auth_alg, minor, short) \ 16873e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 16883e7f8a8dSJohn Baldwin auth_alg, minor, long) 16893e7f8a8dSJohn Baldwin 16903e7f8a8dSJohn Baldwin /* 16913e7f8a8dSJohn Baldwin * For each supported cipher suite, run two receive tests: 16923e7f8a8dSJohn Baldwin * 16933e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 16943e7f8a8dSJohn Baldwin * a single TLS record) 16953e7f8a8dSJohn Baldwin * 16963e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across 16973e7f8a8dSJohn Baldwin * multiple TLS records) 16983e7f8a8dSJohn Baldwin * 16993e7f8a8dSJohn Baldwin * Note that receive is currently only supported for TLS 1.2 AEAD 17003e7f8a8dSJohn Baldwin * cipher suites. 17013e7f8a8dSJohn Baldwin */ 170205a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS); 170305a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS); 170405a1d0f5SJohn Baldwin 170505a1d0f5SJohn Baldwin #define GEN_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, \ 170605a1d0f5SJohn Baldwin auth_alg, minor) \ 170705a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 170805a1d0f5SJohn Baldwin auth_alg, minor, short_padded, 64, 16) \ 170905a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 171005a1d0f5SJohn Baldwin auth_alg, minor, long_padded, 64 * 1024, 15) 171105a1d0f5SJohn Baldwin 171205a1d0f5SJohn Baldwin #define ADD_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, \ 171305a1d0f5SJohn Baldwin auth_alg, minor) \ 171405a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 171505a1d0f5SJohn Baldwin auth_alg, minor, short_padded) \ 171605a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 171705a1d0f5SJohn Baldwin auth_alg, minor, long_padded) 171805a1d0f5SJohn Baldwin 171905a1d0f5SJohn Baldwin /* 172005a1d0f5SJohn Baldwin * For TLS 1.3 cipher suites, run two additional receive tests which 172105a1d0f5SJohn Baldwin * use add padding to each record. 172205a1d0f5SJohn Baldwin */ 172305a1d0f5SJohn Baldwin TLS_13_TESTS(GEN_PADDING_RECEIVE_TESTS); 17243e7f8a8dSJohn Baldwin 1725233ce578SJohn Baldwin static void 1726*2400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(const atf_tc_t *tc, 1727*2400a7b1SJohn Baldwin struct tls_enable *en) 1728233ce578SJohn Baldwin { 1729233ce578SJohn Baldwin int sockets[2]; 1730233ce578SJohn Baldwin 1731*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 1732233ce578SJohn Baldwin 1733233ce578SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1734233ce578SJohn Baldwin sizeof(*en)) == -1); 173505a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 1736233ce578SJohn Baldwin 17372c105205SJohn Baldwin close_sockets(sockets); 1738233ce578SJohn Baldwin } 1739233ce578SJohn Baldwin 1740233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 1741233ce578SJohn Baldwin minor) \ 1742233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name); \ 1743233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc) \ 1744233ce578SJohn Baldwin { \ 1745233ce578SJohn Baldwin struct tls_enable en; \ 1746233ce578SJohn Baldwin uint64_t seqno; \ 1747233ce578SJohn Baldwin \ 1748233ce578SJohn Baldwin ATF_REQUIRE_KTLS(); \ 1749233ce578SJohn Baldwin seqno = random(); \ 1750233ce578SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1751233ce578SJohn Baldwin &en); \ 1752*2400a7b1SJohn Baldwin test_ktls_invalid_receive_cipher_suite(tc, &en); \ 1753233ce578SJohn Baldwin free_tls_enable(&en); \ 1754233ce578SJohn Baldwin } 1755233ce578SJohn Baldwin 1756233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 1757233ce578SJohn Baldwin minor) \ 1758233ce578SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name); 1759233ce578SJohn Baldwin 1760233ce578SJohn Baldwin /* 1761233ce578SJohn Baldwin * Ensure that invalid cipher suites are rejected for receive. 1762233ce578SJohn Baldwin */ 1763233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST); 1764233ce578SJohn Baldwin 176583a54b58SJohn Baldwin static void 1766*2400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(const atf_tc_t *tc, 1767*2400a7b1SJohn Baldwin struct tls_enable *en) 176883a54b58SJohn Baldwin { 176983a54b58SJohn Baldwin int sockets[2]; 177083a54b58SJohn Baldwin 1771*2400a7b1SJohn Baldwin ATF_REQUIRE_MSG(open_sockets(tc, sockets), "failed to create sockets"); 177283a54b58SJohn Baldwin 177383a54b58SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 177483a54b58SJohn Baldwin sizeof(*en)) == -1); 177505a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EPROTONOSUPPORT); 177683a54b58SJohn Baldwin 17772c105205SJohn Baldwin close_sockets(sockets); 177883a54b58SJohn Baldwin } 177983a54b58SJohn Baldwin 178083a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 178183a54b58SJohn Baldwin auth_alg, minor) \ 178283a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name); \ 178383a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \ 178483a54b58SJohn Baldwin { \ 178583a54b58SJohn Baldwin struct tls_enable en; \ 178683a54b58SJohn Baldwin uint64_t seqno; \ 178783a54b58SJohn Baldwin \ 178883a54b58SJohn Baldwin ATF_REQUIRE_KTLS(); \ 178983a54b58SJohn Baldwin seqno = random(); \ 179083a54b58SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 179183a54b58SJohn Baldwin &en); \ 1792*2400a7b1SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(tc, &en); \ 179383a54b58SJohn Baldwin free_tls_enable(&en); \ 179483a54b58SJohn Baldwin } 179583a54b58SJohn Baldwin 179683a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 179783a54b58SJohn Baldwin auth_alg, minor) \ 179883a54b58SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name); 179983a54b58SJohn Baldwin 180083a54b58SJohn Baldwin /* 180183a54b58SJohn Baldwin * Ensure that valid cipher suites not supported for receive are 180283a54b58SJohn Baldwin * rejected. 180383a54b58SJohn Baldwin */ 180483a54b58SJohn Baldwin AES_CBC_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST); 180583a54b58SJohn Baldwin 1806ee5686c6SMark Johnston /* 1807ee5686c6SMark Johnston * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise 1808ee5686c6SMark Johnston * KTLS error handling in the socket layer. 1809ee5686c6SMark Johnston */ 1810ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst); 1811ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc) 1812ee5686c6SMark Johnston { 1813ee5686c6SMark Johnston char buf[32]; 1814ee5686c6SMark Johnston struct sockaddr_in dst; 1815ee5686c6SMark Johnston struct tls_enable en; 1816ee5686c6SMark Johnston ssize_t n; 1817ee5686c6SMark Johnston int s; 1818ee5686c6SMark Johnston 1819ee5686c6SMark Johnston ATF_REQUIRE_KTLS(); 1820ee5686c6SMark Johnston 1821ee5686c6SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 1822ee5686c6SMark Johnston ATF_REQUIRE(s >= 0); 1823ee5686c6SMark Johnston 1824ee5686c6SMark Johnston build_tls_enable(CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, 1825ee5686c6SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en); 1826ee5686c6SMark Johnston 1827ee5686c6SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, 1828ee5686c6SMark Johnston sizeof(en)) == 0); 1829ee5686c6SMark Johnston 1830ee5686c6SMark Johnston memset(&dst, 0, sizeof(dst)); 1831ee5686c6SMark Johnston dst.sin_family = AF_INET; 1832ee5686c6SMark Johnston dst.sin_len = sizeof(dst); 1833ee5686c6SMark Johnston dst.sin_addr.s_addr = htonl(INADDR_BROADCAST); 1834ee5686c6SMark Johnston dst.sin_port = htons(12345); 1835ee5686c6SMark Johnston 1836ee5686c6SMark Johnston memset(buf, 0, sizeof(buf)); 1837ee5686c6SMark Johnston n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst, 1838ee5686c6SMark Johnston sizeof(dst)); 1839ee5686c6SMark Johnston 1840ee5686c6SMark Johnston /* Can't transmit to the broadcast address over TCP. */ 1841ee5686c6SMark Johnston ATF_REQUIRE_ERRNO(EACCES, n == -1); 1842ee5686c6SMark Johnston ATF_REQUIRE(close(s) == 0); 1843ee5686c6SMark Johnston } 1844ee5686c6SMark Johnston 1845a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp) 1846a10482eaSJohn Baldwin { 18473e7f8a8dSJohn Baldwin /* Transmit tests */ 1848a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS); 1849a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS); 1850a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS); 185144265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS); 18525de79eedSMark Johnston AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 18535de79eedSMark Johnston AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 18545de79eedSMark Johnston CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 1855d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST); 1856a10482eaSJohn Baldwin 18573e7f8a8dSJohn Baldwin /* Receive tests */ 185883a54b58SJohn Baldwin AES_CBC_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST); 185905a1d0f5SJohn Baldwin AES_GCM_TESTS(ADD_RECEIVE_TESTS); 186005a1d0f5SJohn Baldwin CHACHA20_TESTS(ADD_RECEIVE_TESTS); 186105a1d0f5SJohn Baldwin TLS_13_TESTS(ADD_PADDING_RECEIVE_TESTS); 1862233ce578SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST); 1863233ce578SJohn Baldwin 1864ee5686c6SMark Johnston /* Miscellaneous */ 1865ee5686c6SMark Johnston ATF_TP_ADD_TC(tp, ktls_sendto_baddst); 1866ee5686c6SMark Johnston 1867a10482eaSJohn Baldwin return (atf_no_error()); 1868a10482eaSJohn Baldwin } 1869