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> 41a10482eaSJohn Baldwin #include <poll.h> 42a10482eaSJohn Baldwin #include <stdbool.h> 43a10482eaSJohn Baldwin #include <stdlib.h> 44a10482eaSJohn Baldwin #include <atf-c.h> 45a10482eaSJohn Baldwin 46a10482eaSJohn Baldwin #include <openssl/err.h> 47a10482eaSJohn Baldwin #include <openssl/evp.h> 48a10482eaSJohn Baldwin #include <openssl/hmac.h> 49a10482eaSJohn Baldwin 50a10482eaSJohn Baldwin static void 51a10482eaSJohn Baldwin require_ktls(void) 52a10482eaSJohn Baldwin { 53a10482eaSJohn Baldwin size_t len; 54a10482eaSJohn Baldwin bool enable; 55a10482eaSJohn Baldwin 56a10482eaSJohn Baldwin len = sizeof(enable); 57a10482eaSJohn Baldwin if (sysctlbyname("kern.ipc.tls.enable", &enable, &len, NULL, 0) == -1) { 58a10482eaSJohn Baldwin if (errno == ENOENT) 59a10482eaSJohn Baldwin atf_tc_skip("kernel does not support TLS offload"); 60a10482eaSJohn Baldwin atf_libc_error(errno, "Failed to read kern.ipc.tls.enable"); 61a10482eaSJohn Baldwin } 62a10482eaSJohn Baldwin 63a10482eaSJohn Baldwin if (!enable) 64a10482eaSJohn Baldwin atf_tc_skip("Kernel TLS is disabled"); 65a10482eaSJohn Baldwin } 66a10482eaSJohn Baldwin 67a10482eaSJohn Baldwin #define ATF_REQUIRE_KTLS() require_ktls() 68a10482eaSJohn Baldwin 69a10482eaSJohn Baldwin static char 70a10482eaSJohn Baldwin rdigit(void) 71a10482eaSJohn Baldwin { 72a10482eaSJohn Baldwin /* ASCII printable values between 0x20 and 0x7e */ 73a10482eaSJohn Baldwin return (0x20 + random() % (0x7f - 0x20)); 74a10482eaSJohn Baldwin } 75a10482eaSJohn Baldwin 76a10482eaSJohn Baldwin static char * 77a10482eaSJohn Baldwin alloc_buffer(size_t len) 78a10482eaSJohn Baldwin { 79a10482eaSJohn Baldwin char *buf; 80a10482eaSJohn Baldwin size_t i; 81a10482eaSJohn Baldwin 82a10482eaSJohn Baldwin if (len == 0) 83a10482eaSJohn Baldwin return (NULL); 84a10482eaSJohn Baldwin buf = malloc(len); 85a10482eaSJohn Baldwin for (i = 0; i < len; i++) 86a10482eaSJohn Baldwin buf[i] = rdigit(); 87a10482eaSJohn Baldwin return (buf); 88a10482eaSJohn Baldwin } 89a10482eaSJohn Baldwin 90a10482eaSJohn Baldwin static bool 91*2c105205SJohn Baldwin socketpair_tcp(int sv[2]) 92a10482eaSJohn Baldwin { 93a10482eaSJohn Baldwin struct pollfd pfd; 94a10482eaSJohn Baldwin struct sockaddr_in sin; 95a10482eaSJohn Baldwin socklen_t len; 96a10482eaSJohn Baldwin int as, cs, ls; 97a10482eaSJohn Baldwin 98a10482eaSJohn Baldwin ls = socket(PF_INET, SOCK_STREAM, 0); 99a10482eaSJohn Baldwin if (ls == -1) { 100a10482eaSJohn Baldwin warn("socket() for listen"); 101a10482eaSJohn Baldwin return (false); 102a10482eaSJohn Baldwin } 103a10482eaSJohn Baldwin 104a10482eaSJohn Baldwin memset(&sin, 0, sizeof(sin)); 105a10482eaSJohn Baldwin sin.sin_len = sizeof(sin); 106a10482eaSJohn Baldwin sin.sin_family = AF_INET; 107a10482eaSJohn Baldwin sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 108a10482eaSJohn Baldwin if (bind(ls, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 109a10482eaSJohn Baldwin warn("bind"); 110a10482eaSJohn Baldwin close(ls); 111a10482eaSJohn Baldwin return (false); 112a10482eaSJohn Baldwin } 113a10482eaSJohn Baldwin 114a10482eaSJohn Baldwin if (listen(ls, 1) == -1) { 115a10482eaSJohn Baldwin warn("listen"); 116a10482eaSJohn Baldwin close(ls); 117a10482eaSJohn Baldwin return (false); 118a10482eaSJohn Baldwin } 119a10482eaSJohn Baldwin 120a10482eaSJohn Baldwin len = sizeof(sin); 121a10482eaSJohn Baldwin if (getsockname(ls, (struct sockaddr *)&sin, &len) == -1) { 122a10482eaSJohn Baldwin warn("getsockname"); 123a10482eaSJohn Baldwin close(ls); 124a10482eaSJohn Baldwin return (false); 125a10482eaSJohn Baldwin } 126a10482eaSJohn Baldwin 127a10482eaSJohn Baldwin cs = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); 128a10482eaSJohn Baldwin if (cs == -1) { 129a10482eaSJohn Baldwin warn("socket() for connect"); 130a10482eaSJohn Baldwin close(ls); 131a10482eaSJohn Baldwin return (false); 132a10482eaSJohn Baldwin } 133a10482eaSJohn Baldwin 134a10482eaSJohn Baldwin if (connect(cs, (struct sockaddr *)&sin, sizeof(sin)) == -1) { 135a10482eaSJohn Baldwin if (errno != EINPROGRESS) { 136a10482eaSJohn Baldwin warn("connect"); 137a10482eaSJohn Baldwin close(ls); 138a10482eaSJohn Baldwin close(cs); 139a10482eaSJohn Baldwin return (false); 140a10482eaSJohn Baldwin } 141a10482eaSJohn Baldwin } 142a10482eaSJohn Baldwin 143a10482eaSJohn Baldwin as = accept4(ls, NULL, NULL, SOCK_NONBLOCK); 144a10482eaSJohn Baldwin if (as == -1) { 145a10482eaSJohn Baldwin warn("accept4"); 146a10482eaSJohn Baldwin close(ls); 147a10482eaSJohn Baldwin close(cs); 148a10482eaSJohn Baldwin return (false); 149a10482eaSJohn Baldwin } 150a10482eaSJohn Baldwin 151a10482eaSJohn Baldwin close(ls); 152a10482eaSJohn Baldwin 153a10482eaSJohn Baldwin pfd.fd = cs; 154a10482eaSJohn Baldwin pfd.events = POLLOUT; 155a10482eaSJohn Baldwin pfd.revents = 0; 156a10482eaSJohn Baldwin ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1); 157a10482eaSJohn Baldwin ATF_REQUIRE(pfd.revents == POLLOUT); 158a10482eaSJohn Baldwin 159a10482eaSJohn Baldwin sv[0] = cs; 160a10482eaSJohn Baldwin sv[1] = as; 161a10482eaSJohn Baldwin return (true); 162a10482eaSJohn Baldwin } 163a10482eaSJohn Baldwin 164a10482eaSJohn Baldwin static void 165*2c105205SJohn Baldwin close_sockets(int sv[2]) 166*2c105205SJohn Baldwin { 167*2c105205SJohn Baldwin ATF_REQUIRE(close(sv[1]) == 0); 168*2c105205SJohn Baldwin ATF_REQUIRE(close(sv[0]) == 0); 169*2c105205SJohn Baldwin } 170*2c105205SJohn Baldwin 171*2c105205SJohn Baldwin static void 172a10482eaSJohn Baldwin fd_set_blocking(int fd) 173a10482eaSJohn Baldwin { 174a10482eaSJohn Baldwin int flags; 175a10482eaSJohn Baldwin 176a10482eaSJohn Baldwin ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1); 177a10482eaSJohn Baldwin flags &= ~O_NONBLOCK; 178a10482eaSJohn Baldwin ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1); 179a10482eaSJohn Baldwin } 180a10482eaSJohn Baldwin 181a10482eaSJohn Baldwin static bool 182a10482eaSJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 183a10482eaSJohn Baldwin const char *input, char *output, size_t size) 184a10482eaSJohn Baldwin { 185a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 186a10482eaSJohn Baldwin int outl, total; 187a10482eaSJohn Baldwin 188a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 189a10482eaSJohn Baldwin if (ctx == NULL) { 190a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 191a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 192a10482eaSJohn Baldwin return (false); 193a10482eaSJohn Baldwin } 194a10482eaSJohn Baldwin if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key, 195a10482eaSJohn Baldwin (const u_char *)iv, 0) != 1) { 196a10482eaSJohn Baldwin warnx("EVP_CipherInit_ex failed: %s", 197a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 198a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 199a10482eaSJohn Baldwin return (false); 200a10482eaSJohn Baldwin } 201a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 202a10482eaSJohn Baldwin if (EVP_CipherUpdate(ctx, (u_char *)output, &outl, 203a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 204a10482eaSJohn Baldwin warnx("EVP_CipherUpdate failed: %s", 205a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 206a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 207a10482eaSJohn Baldwin return (false); 208a10482eaSJohn Baldwin } 209a10482eaSJohn Baldwin total = outl; 210a10482eaSJohn Baldwin if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 211a10482eaSJohn Baldwin warnx("EVP_CipherFinal_ex failed: %s", 212a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 213a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 214a10482eaSJohn Baldwin return (false); 215a10482eaSJohn Baldwin } 216a10482eaSJohn Baldwin total += outl; 217a10482eaSJohn Baldwin if ((size_t)total != size) { 218a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 219a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 220a10482eaSJohn Baldwin return (false); 221a10482eaSJohn Baldwin } 222a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 223a10482eaSJohn Baldwin return (true); 224a10482eaSJohn Baldwin } 225a10482eaSJohn Baldwin 226a10482eaSJohn Baldwin static bool 227a10482eaSJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 228a10482eaSJohn Baldwin size_t aad_len, const void *buffer, size_t len, const void *digest) 229a10482eaSJohn Baldwin { 230a10482eaSJohn Baldwin HMAC_CTX *ctx; 231a10482eaSJohn Baldwin unsigned char digest2[EVP_MAX_MD_SIZE]; 232a10482eaSJohn Baldwin u_int digest_len; 233a10482eaSJohn Baldwin 234a10482eaSJohn Baldwin ctx = HMAC_CTX_new(); 235a10482eaSJohn Baldwin if (ctx == NULL) { 236a10482eaSJohn Baldwin warnx("HMAC_CTX_new failed: %s", 237a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 238a10482eaSJohn Baldwin return (false); 239a10482eaSJohn Baldwin } 240a10482eaSJohn Baldwin if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) { 241a10482eaSJohn Baldwin warnx("HMAC_Init_ex failed: %s", 242a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 243a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 244a10482eaSJohn Baldwin return (false); 245a10482eaSJohn Baldwin } 246a10482eaSJohn Baldwin if (HMAC_Update(ctx, aad, aad_len) != 1) { 247a10482eaSJohn Baldwin warnx("HMAC_Update (aad) failed: %s", 248a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 249a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 250a10482eaSJohn Baldwin return (false); 251a10482eaSJohn Baldwin } 252a10482eaSJohn Baldwin if (HMAC_Update(ctx, buffer, len) != 1) { 253a10482eaSJohn Baldwin warnx("HMAC_Update (payload) failed: %s", 254a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 255a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 256a10482eaSJohn Baldwin return (false); 257a10482eaSJohn Baldwin } 258a10482eaSJohn Baldwin if (HMAC_Final(ctx, digest2, &digest_len) != 1) { 259a10482eaSJohn Baldwin warnx("HMAC_Final failed: %s", 260a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 261a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 262a10482eaSJohn Baldwin return (false); 263a10482eaSJohn Baldwin } 264a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 265a10482eaSJohn Baldwin if (memcmp(digest, digest2, digest_len) != 0) { 266a10482eaSJohn Baldwin warnx("HMAC mismatch"); 267a10482eaSJohn Baldwin return (false); 268a10482eaSJohn Baldwin } 269a10482eaSJohn Baldwin return (true); 270a10482eaSJohn Baldwin } 271a10482eaSJohn Baldwin 272a10482eaSJohn Baldwin static bool 2733e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 2743e7f8a8dSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 2753e7f8a8dSJohn Baldwin size_t size, char *tag, size_t tag_len) 2763e7f8a8dSJohn Baldwin { 2773e7f8a8dSJohn Baldwin EVP_CIPHER_CTX *ctx; 2783e7f8a8dSJohn Baldwin int outl, total; 2793e7f8a8dSJohn Baldwin 2803e7f8a8dSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 2813e7f8a8dSJohn Baldwin if (ctx == NULL) { 2823e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 2833e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 2843e7f8a8dSJohn Baldwin return (false); 2853e7f8a8dSJohn Baldwin } 2863e7f8a8dSJohn Baldwin if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 2873e7f8a8dSJohn Baldwin (const u_char *)nonce) != 1) { 2883e7f8a8dSJohn Baldwin warnx("EVP_EncryptInit_ex failed: %s", 2893e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 2903e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 2913e7f8a8dSJohn Baldwin return (false); 2923e7f8a8dSJohn Baldwin } 2933e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 2943e7f8a8dSJohn Baldwin if (aad != NULL) { 2953e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 2963e7f8a8dSJohn Baldwin aad_len) != 1) { 2973e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate for AAD failed: %s", 2983e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 2993e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3003e7f8a8dSJohn Baldwin return (false); 3013e7f8a8dSJohn Baldwin } 3023e7f8a8dSJohn Baldwin } 3033e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl, 3043e7f8a8dSJohn Baldwin (const u_char *)input, size) != 1) { 3053e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate failed: %s", 3063e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3073e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3083e7f8a8dSJohn Baldwin return (false); 3093e7f8a8dSJohn Baldwin } 3103e7f8a8dSJohn Baldwin total = outl; 3113e7f8a8dSJohn Baldwin if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 3123e7f8a8dSJohn Baldwin warnx("EVP_EncryptFinal_ex failed: %s", 3133e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3143e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3153e7f8a8dSJohn Baldwin return (false); 3163e7f8a8dSJohn Baldwin } 3173e7f8a8dSJohn Baldwin total += outl; 3183e7f8a8dSJohn Baldwin if ((size_t)total != size) { 3193e7f8a8dSJohn Baldwin warnx("encrypt size mismatch: %zu vs %d", size, total); 3203e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3213e7f8a8dSJohn Baldwin return (false); 3223e7f8a8dSJohn Baldwin } 3233e7f8a8dSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) != 3243e7f8a8dSJohn Baldwin 1) { 3253e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s", 3263e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 3273e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3283e7f8a8dSJohn Baldwin return (false); 3293e7f8a8dSJohn Baldwin } 3303e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 3313e7f8a8dSJohn Baldwin return (true); 3323e7f8a8dSJohn Baldwin } 3333e7f8a8dSJohn Baldwin 3343e7f8a8dSJohn Baldwin static bool 335a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 336a10482eaSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 337a10482eaSJohn Baldwin size_t size, const char *tag, size_t tag_len) 338a10482eaSJohn Baldwin { 339a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 340a10482eaSJohn Baldwin int outl, total; 341a10482eaSJohn Baldwin bool valid; 342a10482eaSJohn Baldwin 343a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 344a10482eaSJohn Baldwin if (ctx == NULL) { 345a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 346a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 347a10482eaSJohn Baldwin return (false); 348a10482eaSJohn Baldwin } 349a10482eaSJohn Baldwin if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 350a10482eaSJohn Baldwin (const u_char *)nonce) != 1) { 351a10482eaSJohn Baldwin warnx("EVP_DecryptInit_ex failed: %s", 352a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 353a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 354a10482eaSJohn Baldwin return (false); 355a10482eaSJohn Baldwin } 356a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 357a10482eaSJohn Baldwin if (aad != NULL) { 358a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 359a10482eaSJohn Baldwin aad_len) != 1) { 360a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate for AAD failed: %s", 361a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 362a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 363a10482eaSJohn Baldwin return (false); 364a10482eaSJohn Baldwin } 365a10482eaSJohn Baldwin } 366a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl, 367a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 368a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate failed: %s", 369a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 370a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 371a10482eaSJohn Baldwin return (false); 372a10482eaSJohn Baldwin } 373a10482eaSJohn Baldwin total = outl; 374a10482eaSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, 375a10482eaSJohn Baldwin __DECONST(char *, tag)) != 1) { 376a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s", 377a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 378a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 379a10482eaSJohn Baldwin return (false); 380a10482eaSJohn Baldwin } 381a10482eaSJohn Baldwin valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1); 382a10482eaSJohn Baldwin total += outl; 383a10482eaSJohn Baldwin if ((size_t)total != size) { 384a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 385a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 386a10482eaSJohn Baldwin return (false); 387a10482eaSJohn Baldwin } 388a10482eaSJohn Baldwin if (!valid) 389a10482eaSJohn Baldwin warnx("tag mismatch"); 390a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 391a10482eaSJohn Baldwin return (valid); 392a10482eaSJohn Baldwin } 393a10482eaSJohn Baldwin 394a10482eaSJohn Baldwin static void 395a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg, 396a10482eaSJohn Baldwin int minor, uint64_t seqno, struct tls_enable *en) 397a10482eaSJohn Baldwin { 398a10482eaSJohn Baldwin u_int auth_key_len, iv_len; 399a10482eaSJohn Baldwin 400a10482eaSJohn Baldwin memset(en, 0, sizeof(*en)); 401a10482eaSJohn Baldwin 402a10482eaSJohn Baldwin switch (cipher_alg) { 403a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 404a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_ZERO) 405a10482eaSJohn Baldwin iv_len = AES_BLOCK_LEN; 406a10482eaSJohn Baldwin else 407a10482eaSJohn Baldwin iv_len = 0; 408a10482eaSJohn Baldwin break; 409a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 410a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_TWO) 411a10482eaSJohn Baldwin iv_len = TLS_AEAD_GCM_LEN; 412a10482eaSJohn Baldwin else 413a10482eaSJohn Baldwin iv_len = TLS_1_3_GCM_IV_LEN; 414a10482eaSJohn Baldwin break; 415a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 416a10482eaSJohn Baldwin iv_len = TLS_CHACHA20_IV_LEN; 417a10482eaSJohn Baldwin break; 418a10482eaSJohn Baldwin default: 419a10482eaSJohn Baldwin iv_len = 0; 420a10482eaSJohn Baldwin break; 421a10482eaSJohn Baldwin } 422a10482eaSJohn Baldwin switch (auth_alg) { 423a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 424a10482eaSJohn Baldwin auth_key_len = SHA1_HASH_LEN; 425a10482eaSJohn Baldwin break; 426a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 427a10482eaSJohn Baldwin auth_key_len = SHA2_256_HASH_LEN; 428a10482eaSJohn Baldwin break; 429a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 430a10482eaSJohn Baldwin auth_key_len = SHA2_384_HASH_LEN; 431a10482eaSJohn Baldwin break; 432a10482eaSJohn Baldwin default: 433a10482eaSJohn Baldwin auth_key_len = 0; 434a10482eaSJohn Baldwin break; 435a10482eaSJohn Baldwin } 436a10482eaSJohn Baldwin en->cipher_key = alloc_buffer(cipher_key_len); 437a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len); 438a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len); 439a10482eaSJohn Baldwin en->cipher_algorithm = cipher_alg; 440a10482eaSJohn Baldwin en->cipher_key_len = cipher_key_len; 441a10482eaSJohn Baldwin en->iv_len = iv_len; 442a10482eaSJohn Baldwin en->auth_algorithm = auth_alg; 443a10482eaSJohn Baldwin en->auth_key_len = auth_key_len; 444a10482eaSJohn Baldwin en->tls_vmajor = TLS_MAJOR_VER_ONE; 445a10482eaSJohn Baldwin en->tls_vminor = minor; 446a10482eaSJohn Baldwin be64enc(en->rec_seq, seqno); 447a10482eaSJohn Baldwin } 448a10482eaSJohn Baldwin 449a10482eaSJohn Baldwin static void 450a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en) 451a10482eaSJohn Baldwin { 452a10482eaSJohn Baldwin free(__DECONST(void *, en->cipher_key)); 453a10482eaSJohn Baldwin free(__DECONST(void *, en->iv)); 454a10482eaSJohn Baldwin free(__DECONST(void *, en->auth_key)); 455a10482eaSJohn Baldwin } 456a10482eaSJohn Baldwin 457a10482eaSJohn Baldwin static const EVP_CIPHER * 458a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en) 459a10482eaSJohn Baldwin { 460a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 461a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 462a10482eaSJohn Baldwin switch (en->cipher_key_len) { 463a10482eaSJohn Baldwin case 128 / 8: 464a10482eaSJohn Baldwin return (EVP_aes_128_cbc()); 465a10482eaSJohn Baldwin case 256 / 8: 466a10482eaSJohn Baldwin return (EVP_aes_256_cbc()); 467a10482eaSJohn Baldwin default: 468a10482eaSJohn Baldwin return (NULL); 469a10482eaSJohn Baldwin } 470a10482eaSJohn Baldwin break; 471a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 472a10482eaSJohn Baldwin switch (en->cipher_key_len) { 473a10482eaSJohn Baldwin case 128 / 8: 474a10482eaSJohn Baldwin return (EVP_aes_128_gcm()); 475a10482eaSJohn Baldwin case 256 / 8: 476a10482eaSJohn Baldwin return (EVP_aes_256_gcm()); 477a10482eaSJohn Baldwin default: 478a10482eaSJohn Baldwin return (NULL); 479a10482eaSJohn Baldwin } 480a10482eaSJohn Baldwin break; 481a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 482a10482eaSJohn Baldwin return (EVP_chacha20_poly1305()); 483a10482eaSJohn Baldwin default: 484a10482eaSJohn Baldwin return (NULL); 485a10482eaSJohn Baldwin } 486a10482eaSJohn Baldwin } 487a10482eaSJohn Baldwin 488a10482eaSJohn Baldwin static const EVP_MD * 489a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en) 490a10482eaSJohn Baldwin { 491a10482eaSJohn Baldwin switch (en->auth_algorithm) { 492a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 493a10482eaSJohn Baldwin return (EVP_sha1()); 494a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 495a10482eaSJohn Baldwin return (EVP_sha256()); 496a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 497a10482eaSJohn Baldwin return (EVP_sha384()); 498a10482eaSJohn Baldwin default: 499a10482eaSJohn Baldwin return (NULL); 500a10482eaSJohn Baldwin } 501a10482eaSJohn Baldwin } 502a10482eaSJohn Baldwin 503a10482eaSJohn Baldwin static size_t 504a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en) 505a10482eaSJohn Baldwin { 506a10482eaSJohn Baldwin size_t len; 507a10482eaSJohn Baldwin 508a10482eaSJohn Baldwin len = sizeof(struct tls_record_layer); 509a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 510a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 511a10482eaSJohn Baldwin if (en->tls_vminor != TLS_MINOR_VER_ZERO) 512a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 513a10482eaSJohn Baldwin return (len); 514a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 515a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) 516a10482eaSJohn Baldwin len += sizeof(uint64_t); 517a10482eaSJohn Baldwin return (len); 518a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 519a10482eaSJohn Baldwin return (len); 520a10482eaSJohn Baldwin default: 521a10482eaSJohn Baldwin return (0); 522a10482eaSJohn Baldwin } 523a10482eaSJohn Baldwin } 524a10482eaSJohn Baldwin 525a10482eaSJohn Baldwin static size_t 526a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en) 527a10482eaSJohn Baldwin { 528a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 529a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 530a10482eaSJohn Baldwin switch (en->auth_algorithm) { 531a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 532a10482eaSJohn Baldwin return (SHA1_HASH_LEN); 533a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 534a10482eaSJohn Baldwin return (SHA2_256_HASH_LEN); 535a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 536a10482eaSJohn Baldwin return (SHA2_384_HASH_LEN); 537a10482eaSJohn Baldwin default: 538a10482eaSJohn Baldwin return (0); 539a10482eaSJohn Baldwin } 540a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 541a10482eaSJohn Baldwin return (AES_GMAC_HASH_LEN); 542a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 543a10482eaSJohn Baldwin return (POLY1305_HASH_LEN); 544a10482eaSJohn Baldwin default: 545a10482eaSJohn Baldwin return (0); 546a10482eaSJohn Baldwin } 547a10482eaSJohn Baldwin } 548a10482eaSJohn Baldwin 549a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */ 550a10482eaSJohn Baldwin static size_t 551a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en) 552a10482eaSJohn Baldwin { 553a10482eaSJohn Baldwin size_t len; 554a10482eaSJohn Baldwin 555a10482eaSJohn Baldwin len = tls_mac_len(en); 556a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 557a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 558a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 559a10482eaSJohn Baldwin len++; 560a10482eaSJohn Baldwin return (len); 561a10482eaSJohn Baldwin } 562a10482eaSJohn Baldwin 563a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */ 564a10482eaSJohn Baldwin static void 565a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len, 566a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad) 567a10482eaSJohn Baldwin { 568a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 569a10482eaSJohn Baldwin ad->type = hdr->tls_type; 570a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 571a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 572a10482eaSJohn Baldwin ad->tls_length = htons(len); 573a10482eaSJohn Baldwin } 574a10482eaSJohn Baldwin 575a10482eaSJohn Baldwin static void 576a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len, 577a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, 578a10482eaSJohn Baldwin struct tls_aead_data *ad) 579a10482eaSJohn Baldwin { 580a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 581a10482eaSJohn Baldwin ad->type = hdr->tls_type; 582a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 583a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 584a10482eaSJohn Baldwin ad->tls_length = htons(len); 585a10482eaSJohn Baldwin } 586a10482eaSJohn Baldwin 587a10482eaSJohn Baldwin static void 588a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr, 589a10482eaSJohn Baldwin uint64_t seqno, struct tls_aead_data_13 *ad) 590a10482eaSJohn Baldwin { 591a10482eaSJohn Baldwin ad->type = hdr->tls_type; 592a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 593a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 594a10482eaSJohn Baldwin ad->tls_length = hdr->tls_length; 595a10482eaSJohn Baldwin } 596a10482eaSJohn Baldwin 597a10482eaSJohn Baldwin static void 598a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr, 599a10482eaSJohn Baldwin char *nonce) 600a10482eaSJohn Baldwin { 601a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN); 602a10482eaSJohn Baldwin memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t)); 603a10482eaSJohn Baldwin } 604a10482eaSJohn Baldwin 605a10482eaSJohn Baldwin static void 606a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce) 607a10482eaSJohn Baldwin { 608a10482eaSJohn Baldwin static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN, 609a10482eaSJohn Baldwin "TLS 1.3 nonce length mismatch"); 610a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN); 611a10482eaSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(seqno); 612a10482eaSJohn Baldwin } 613a10482eaSJohn Baldwin 614a10482eaSJohn Baldwin /* 615a10482eaSJohn Baldwin * Decrypt a TLS record 'len' bytes long at 'src' and store the result at 616a10482eaSJohn Baldwin * 'dst'. If the TLS record header length doesn't match or 'dst' doesn't 617a10482eaSJohn Baldwin * have sufficient room ('avail'), fail the test. 618a10482eaSJohn Baldwin */ 619a10482eaSJohn Baldwin static size_t 620a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src, 621a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 622a10482eaSJohn Baldwin { 623a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 624a10482eaSJohn Baldwin struct tls_mac_data aad; 625a10482eaSJohn Baldwin const char *iv; 626a10482eaSJohn Baldwin char *buf; 627a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 628a10482eaSJohn Baldwin int padding; 629a10482eaSJohn Baldwin 630a10482eaSJohn Baldwin hdr = src; 631a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 632a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 633a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 634a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor); 635a10482eaSJohn Baldwin 636a10482eaSJohn Baldwin /* First, decrypt the outer payload into a temporary buffer. */ 637a10482eaSJohn Baldwin payload_len = len - hdr_len; 638a10482eaSJohn Baldwin buf = malloc(payload_len); 639a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 640a10482eaSJohn Baldwin iv = en->iv; 641a10482eaSJohn Baldwin else 642a10482eaSJohn Baldwin iv = (void *)(hdr + 1); 643a10482eaSJohn Baldwin ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 644a10482eaSJohn Baldwin (const u_char *)src + hdr_len, buf, payload_len)); 645a10482eaSJohn Baldwin 646a10482eaSJohn Baldwin /* 647a10482eaSJohn Baldwin * Copy the last encrypted block to use as the IV for the next 648a10482eaSJohn Baldwin * record for TLS 1.0. 649a10482eaSJohn Baldwin */ 650a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 651a10482eaSJohn Baldwin memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src + 652a10482eaSJohn Baldwin (len - AES_BLOCK_LEN), AES_BLOCK_LEN); 653a10482eaSJohn Baldwin 654a10482eaSJohn Baldwin /* 655a10482eaSJohn Baldwin * Verify trailing padding and strip. 656a10482eaSJohn Baldwin * 657a10482eaSJohn Baldwin * The kernel always generates the smallest amount of padding. 658a10482eaSJohn Baldwin */ 659a10482eaSJohn Baldwin padding = buf[payload_len - 1] + 1; 660a10482eaSJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN); 661a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= mac_len + padding); 662a10482eaSJohn Baldwin payload_len -= padding; 663a10482eaSJohn Baldwin 664a10482eaSJohn Baldwin /* Verify HMAC. */ 665a10482eaSJohn Baldwin payload_len -= mac_len; 666a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad); 667a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 668a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len)); 669a10482eaSJohn Baldwin 670a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 671a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 672a10482eaSJohn Baldwin *record_type = hdr->tls_type; 673a10482eaSJohn Baldwin return (payload_len); 674a10482eaSJohn Baldwin } 675a10482eaSJohn Baldwin 676a10482eaSJohn Baldwin static size_t 677a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src, 678a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 679a10482eaSJohn Baldwin { 680a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 681a10482eaSJohn Baldwin struct tls_aead_data aad; 682a10482eaSJohn Baldwin char nonce[12]; 683a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 684a10482eaSJohn Baldwin 685a10482eaSJohn Baldwin hdr = src; 686a10482eaSJohn Baldwin 687a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 688a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 689a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 690a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 691a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 692a10482eaSJohn Baldwin 693a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad); 694a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 695a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 696a10482eaSJohn Baldwin else 697a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 698a10482eaSJohn Baldwin 699a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 700a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len, 701a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 702a10482eaSJohn Baldwin 703a10482eaSJohn Baldwin *record_type = hdr->tls_type; 704a10482eaSJohn Baldwin return (payload_len); 705a10482eaSJohn Baldwin } 706a10482eaSJohn Baldwin 707a10482eaSJohn Baldwin static size_t 708a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src, 709a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 710a10482eaSJohn Baldwin { 711a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 712a10482eaSJohn Baldwin struct tls_aead_data_13 aad; 713a10482eaSJohn Baldwin char nonce[12]; 714a10482eaSJohn Baldwin char *buf; 715a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 716a10482eaSJohn Baldwin 717a10482eaSJohn Baldwin hdr = src; 718a10482eaSJohn Baldwin 719a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 720a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 721a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 722a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= 1); 723a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP); 724a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 725a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 726a10482eaSJohn Baldwin 727a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 728a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 729a10482eaSJohn Baldwin 730a10482eaSJohn Baldwin /* 731a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the 732a10482eaSJohn Baldwin * record type as the last byte of the trailer. 733a10482eaSJohn Baldwin */ 734a10482eaSJohn Baldwin buf = malloc(payload_len); 735a10482eaSJohn Baldwin 736a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 737a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len, 738a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 739a10482eaSJohn Baldwin 740a10482eaSJohn Baldwin /* Trim record type. */ 741a10482eaSJohn Baldwin *record_type = buf[payload_len - 1]; 742a10482eaSJohn Baldwin payload_len--; 743a10482eaSJohn Baldwin 744a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 745a10482eaSJohn Baldwin free(buf); 746a10482eaSJohn Baldwin 747a10482eaSJohn Baldwin return (payload_len); 748a10482eaSJohn Baldwin } 749a10482eaSJohn Baldwin 750a10482eaSJohn Baldwin static size_t 751a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src, 752a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 753a10482eaSJohn Baldwin { 754a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 755a10482eaSJohn Baldwin size_t payload_len; 756a10482eaSJohn Baldwin 757a10482eaSJohn Baldwin hdr = src; 758a10482eaSJohn Baldwin ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len); 759a10482eaSJohn Baldwin 760a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en)); 761a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 762a10482eaSJohn Baldwin 763a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 764a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst, 765a10482eaSJohn Baldwin record_type) == payload_len); 766a10482eaSJohn Baldwin } else { 767a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst, 768a10482eaSJohn Baldwin record_type) == payload_len); 769a10482eaSJohn Baldwin } 770a10482eaSJohn Baldwin 771a10482eaSJohn Baldwin return (payload_len); 772a10482eaSJohn Baldwin } 773a10482eaSJohn Baldwin 774a10482eaSJohn Baldwin static size_t 775a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src, 776a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 777a10482eaSJohn Baldwin { 778a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 779a10482eaSJohn Baldwin return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail, 780a10482eaSJohn Baldwin record_type)); 781a10482eaSJohn Baldwin else 782a10482eaSJohn Baldwin return (decrypt_tls_aead(en, seqno, src, len, dst, avail, 783a10482eaSJohn Baldwin record_type)); 784a10482eaSJohn Baldwin } 785a10482eaSJohn Baldwin 7863e7f8a8dSJohn Baldwin /* 7873e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes 7883e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have 7893e7f8a8dSJohn Baldwin * sufficient room ('avail'), fail the test. 7903e7f8a8dSJohn Baldwin */ 7913e7f8a8dSJohn Baldwin static size_t 7923e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 7933e7f8a8dSJohn Baldwin const void *src, size_t len, void *dst) 7943e7f8a8dSJohn Baldwin { 7953e7f8a8dSJohn Baldwin struct tls_record_layer *hdr; 7963e7f8a8dSJohn Baldwin struct tls_aead_data aad; 7973e7f8a8dSJohn Baldwin char nonce[12]; 7983e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len; 7993e7f8a8dSJohn Baldwin 8003e7f8a8dSJohn Baldwin hdr = dst; 8013e7f8a8dSJohn Baldwin 8023e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en); 8033e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en); 8043e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len; 8053e7f8a8dSJohn Baldwin 8063e7f8a8dSJohn Baldwin hdr->tls_type = record_type; 8073e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 8083e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 8093e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 8103e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 8113e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno)); 8123e7f8a8dSJohn Baldwin 8133e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad); 8143e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 8153e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 8163e7f8a8dSJohn Baldwin else 8173e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce); 8183e7f8a8dSJohn Baldwin 8193e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 8203e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len, 8213e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len)); 8223e7f8a8dSJohn Baldwin 8233e7f8a8dSJohn Baldwin return (record_len); 8243e7f8a8dSJohn Baldwin } 8253e7f8a8dSJohn Baldwin 8263e7f8a8dSJohn Baldwin static size_t 82705a1d0f5SJohn Baldwin encrypt_tls_13_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 82805a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t padding) 82905a1d0f5SJohn Baldwin { 83005a1d0f5SJohn Baldwin struct tls_record_layer *hdr; 83105a1d0f5SJohn Baldwin struct tls_aead_data_13 aad; 83205a1d0f5SJohn Baldwin char nonce[12]; 83305a1d0f5SJohn Baldwin char *buf; 83405a1d0f5SJohn Baldwin size_t hdr_len, mac_len, record_len; 83505a1d0f5SJohn Baldwin 83605a1d0f5SJohn Baldwin hdr = dst; 83705a1d0f5SJohn Baldwin 83805a1d0f5SJohn Baldwin hdr_len = tls_header_len(en); 83905a1d0f5SJohn Baldwin mac_len = tls_mac_len(en); 84005a1d0f5SJohn Baldwin record_len = hdr_len + len + 1 + padding + mac_len; 84105a1d0f5SJohn Baldwin 84205a1d0f5SJohn Baldwin hdr->tls_type = TLS_RLTYPE_APP; 84305a1d0f5SJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 84405a1d0f5SJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 84505a1d0f5SJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 84605a1d0f5SJohn Baldwin 84705a1d0f5SJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 84805a1d0f5SJohn Baldwin tls_13_nonce(en, seqno, nonce); 84905a1d0f5SJohn Baldwin 85005a1d0f5SJohn Baldwin /* 85105a1d0f5SJohn Baldwin * Have to use a temporary buffer for the input so that the record 85205a1d0f5SJohn Baldwin * type can be appended. 85305a1d0f5SJohn Baldwin */ 85405a1d0f5SJohn Baldwin buf = malloc(len + 1 + padding); 85505a1d0f5SJohn Baldwin memcpy(buf, src, len); 85605a1d0f5SJohn Baldwin buf[len] = record_type; 85705a1d0f5SJohn Baldwin memset(buf + len + 1, 0, padding); 85805a1d0f5SJohn Baldwin 85905a1d0f5SJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 86005a1d0f5SJohn Baldwin &aad, sizeof(aad), buf, (char *)dst + hdr_len, len + 1 + padding, 86105a1d0f5SJohn Baldwin (char *)dst + hdr_len + len + 1 + padding, mac_len)); 86205a1d0f5SJohn Baldwin 86305a1d0f5SJohn Baldwin free(buf); 86405a1d0f5SJohn Baldwin 86505a1d0f5SJohn Baldwin return (record_len); 86605a1d0f5SJohn Baldwin } 86705a1d0f5SJohn Baldwin 86805a1d0f5SJohn Baldwin static size_t 8693e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 87005a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, size_t padding) 8713e7f8a8dSJohn Baldwin { 8723e7f8a8dSJohn Baldwin size_t record_len; 8733e7f8a8dSJohn Baldwin 87405a1d0f5SJohn Baldwin record_len = tls_header_len(en) + len + padding + tls_trailer_len(en); 8753e7f8a8dSJohn Baldwin ATF_REQUIRE(record_len <= avail); 8763e7f8a8dSJohn Baldwin 87705a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 87805a1d0f5SJohn Baldwin ATF_REQUIRE(padding == 0); 87905a1d0f5SJohn Baldwin ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src, 88005a1d0f5SJohn Baldwin len, dst) == record_len); 88105a1d0f5SJohn Baldwin } else 88205a1d0f5SJohn Baldwin ATF_REQUIRE(encrypt_tls_13_aead(en, record_type, seqno, src, 88305a1d0f5SJohn Baldwin len, dst, padding) == record_len); 8843e7f8a8dSJohn Baldwin 8853e7f8a8dSJohn Baldwin return (record_len); 8863e7f8a8dSJohn Baldwin } 8873e7f8a8dSJohn Baldwin 8883e7f8a8dSJohn Baldwin static size_t 8893e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 89005a1d0f5SJohn Baldwin const void *src, size_t len, void *dst, size_t avail, size_t padding) 8913e7f8a8dSJohn Baldwin { 89205a1d0f5SJohn Baldwin return (encrypt_tls_aead(en, record_type, seqno, src, len, dst, avail, 89305a1d0f5SJohn Baldwin padding)); 8943e7f8a8dSJohn Baldwin } 8953e7f8a8dSJohn Baldwin 896a10482eaSJohn Baldwin static void 897a10482eaSJohn Baldwin test_ktls_transmit_app_data(struct tls_enable *en, uint64_t seqno, size_t len) 898a10482eaSJohn Baldwin { 899a10482eaSJohn Baldwin struct kevent ev; 900a10482eaSJohn Baldwin struct tls_record_layer *hdr; 901a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 902a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written; 903a10482eaSJohn Baldwin ssize_t rv; 904a10482eaSJohn Baldwin int kq, sockets[2]; 905a10482eaSJohn Baldwin uint8_t record_type; 906a10482eaSJohn Baldwin 907a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 908a10482eaSJohn Baldwin decrypted = malloc(len); 909a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 910a10482eaSJohn Baldwin tls_trailer_len(en); 911a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 912a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 913a10482eaSJohn Baldwin 914a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 915a10482eaSJohn Baldwin 916a10482eaSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 917a10482eaSJohn Baldwin 918a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 919a10482eaSJohn Baldwin sizeof(*en)) == 0); 920a10482eaSJohn Baldwin 921a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 922a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 923a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 924a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 925a10482eaSJohn Baldwin 926a10482eaSJohn Baldwin decrypted_len = 0; 927a10482eaSJohn Baldwin outbuf_len = 0; 928a10482eaSJohn Baldwin written = 0; 929a10482eaSJohn Baldwin 930a10482eaSJohn Baldwin while (decrypted_len != len) { 931a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 932a10482eaSJohn Baldwin 933a10482eaSJohn Baldwin switch (ev.filter) { 934a10482eaSJohn Baldwin case EVFILT_WRITE: 935a10482eaSJohn Baldwin /* Try to write any remaining data. */ 936a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written, 937a10482eaSJohn Baldwin len - written); 938a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 939a10482eaSJohn Baldwin "failed to write to socket"); 940a10482eaSJohn Baldwin written += rv; 941a10482eaSJohn Baldwin if (written == len) { 942a10482eaSJohn Baldwin ev.flags = EV_DISABLE; 943a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 944a10482eaSJohn Baldwin NULL) == 0); 945a10482eaSJohn Baldwin } 946a10482eaSJohn Baldwin break; 947a10482eaSJohn Baldwin 948a10482eaSJohn Baldwin case EVFILT_READ: 949a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 950a10482eaSJohn Baldwin 951a10482eaSJohn Baldwin /* 952a10482eaSJohn Baldwin * Try to read data for the next TLS record 953a10482eaSJohn Baldwin * into outbuf. Start by reading the header 954a10482eaSJohn Baldwin * to determine how much additional data to 955a10482eaSJohn Baldwin * read. 956a10482eaSJohn Baldwin */ 957a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) { 958a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 959a10482eaSJohn Baldwin sizeof(struct tls_record_layer) - 960a10482eaSJohn Baldwin outbuf_len); 961a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 962a10482eaSJohn Baldwin "failed to read from socket"); 963a10482eaSJohn Baldwin outbuf_len += rv; 964a10482eaSJohn Baldwin } 965a10482eaSJohn Baldwin 966a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) 967a10482eaSJohn Baldwin break; 968a10482eaSJohn Baldwin 969a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) + 970a10482eaSJohn Baldwin ntohs(hdr->tls_length); 971d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 972d71830cdSJohn Baldwin ATF_REQUIRE(record_len > outbuf_len); 973a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 974a10482eaSJohn Baldwin record_len - outbuf_len); 975a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN) 976a10482eaSJohn Baldwin break; 977a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, "failed to read from socket"); 978a10482eaSJohn Baldwin 979a10482eaSJohn Baldwin outbuf_len += rv; 980a10482eaSJohn Baldwin if (outbuf_len == record_len) { 981a10482eaSJohn Baldwin decrypted_len += decrypt_tls_record(en, seqno, 982a10482eaSJohn Baldwin outbuf, outbuf_len, 983a10482eaSJohn Baldwin decrypted + decrypted_len, 984a10482eaSJohn Baldwin len - decrypted_len, &record_type); 985a10482eaSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 986a10482eaSJohn Baldwin 987a10482eaSJohn Baldwin seqno++; 988a10482eaSJohn Baldwin outbuf_len = 0; 989a10482eaSJohn Baldwin } 990a10482eaSJohn Baldwin break; 991a10482eaSJohn Baldwin } 992a10482eaSJohn Baldwin } 993a10482eaSJohn Baldwin 994a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len, 995a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written); 996a10482eaSJohn Baldwin 997a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 998a10482eaSJohn Baldwin 999a10482eaSJohn Baldwin free(outbuf); 1000a10482eaSJohn Baldwin free(decrypted); 1001a10482eaSJohn Baldwin free(plaintext); 1002a10482eaSJohn Baldwin 1003*2c105205SJohn Baldwin close_sockets(sockets); 1004694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 1005a10482eaSJohn Baldwin } 1006a10482eaSJohn Baldwin 1007a10482eaSJohn Baldwin static void 1008a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len) 1009a10482eaSJohn Baldwin { 1010a10482eaSJohn Baldwin struct msghdr msg; 1011a10482eaSJohn Baldwin struct cmsghdr *cmsg; 1012a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))]; 1013a10482eaSJohn Baldwin struct iovec iov; 1014a10482eaSJohn Baldwin 1015a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1016a10482eaSJohn Baldwin 1017a10482eaSJohn Baldwin msg.msg_control = cbuf; 1018a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1019a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 1020a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 1021a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 1022a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type)); 1023a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type; 1024a10482eaSJohn Baldwin 1025a10482eaSJohn Baldwin iov.iov_base = data; 1026a10482eaSJohn Baldwin iov.iov_len = len; 1027a10482eaSJohn Baldwin msg.msg_iov = &iov; 1028a10482eaSJohn Baldwin msg.msg_iovlen = 1; 1029a10482eaSJohn Baldwin 1030a10482eaSJohn Baldwin ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len); 1031a10482eaSJohn Baldwin } 1032a10482eaSJohn Baldwin 1033a10482eaSJohn Baldwin static void 1034a10482eaSJohn Baldwin test_ktls_transmit_control(struct tls_enable *en, uint64_t seqno, uint8_t type, 1035a10482eaSJohn Baldwin size_t len) 1036a10482eaSJohn Baldwin { 1037a10482eaSJohn Baldwin struct tls_record_layer *hdr; 1038a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 1039a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 1040a10482eaSJohn Baldwin ssize_t rv; 1041a10482eaSJohn Baldwin int sockets[2]; 1042a10482eaSJohn Baldwin uint8_t record_type; 1043a10482eaSJohn Baldwin 1044a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 1045a10482eaSJohn Baldwin 1046a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 1047a10482eaSJohn Baldwin decrypted = malloc(len); 1048a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 1049a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 1050a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 1051a10482eaSJohn Baldwin 1052a10482eaSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 1053a10482eaSJohn Baldwin 1054a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1055a10482eaSJohn Baldwin sizeof(*en)) == 0); 1056a10482eaSJohn Baldwin 1057a10482eaSJohn Baldwin fd_set_blocking(sockets[0]); 1058a10482eaSJohn Baldwin fd_set_blocking(sockets[1]); 1059a10482eaSJohn Baldwin 1060a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len); 1061a10482eaSJohn Baldwin 1062a10482eaSJohn Baldwin /* 1063a10482eaSJohn Baldwin * First read the header to determine how much additional data 1064a10482eaSJohn Baldwin * to read. 1065a10482eaSJohn Baldwin */ 1066a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1067a10482eaSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 1068a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length); 1069a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1070d71830cdSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 1071a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 1072a10482eaSJohn Baldwin payload_len); 1073a10482eaSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 1074a10482eaSJohn Baldwin 1075a10482eaSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len, 1076a10482eaSJohn Baldwin &record_type); 1077a10482eaSJohn Baldwin 1078a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv, 1079a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len); 1080a10482eaSJohn Baldwin ATF_REQUIRE(record_type == type); 1081a10482eaSJohn Baldwin 1082a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1083a10482eaSJohn Baldwin 1084a10482eaSJohn Baldwin free(outbuf); 1085a10482eaSJohn Baldwin free(decrypted); 1086a10482eaSJohn Baldwin free(plaintext); 1087a10482eaSJohn Baldwin 1088*2c105205SJohn Baldwin close_sockets(sockets); 1089a10482eaSJohn Baldwin } 1090a10482eaSJohn Baldwin 10910ff2a12aSJohn Baldwin static void 10920ff2a12aSJohn Baldwin test_ktls_transmit_empty_fragment(struct tls_enable *en, uint64_t seqno) 10930ff2a12aSJohn Baldwin { 10940ff2a12aSJohn Baldwin struct tls_record_layer *hdr; 10950ff2a12aSJohn Baldwin char *outbuf; 10960ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 10970ff2a12aSJohn Baldwin ssize_t rv; 10980ff2a12aSJohn Baldwin int sockets[2]; 10990ff2a12aSJohn Baldwin uint8_t record_type; 11000ff2a12aSJohn Baldwin 11010ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en); 11020ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap); 11030ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 11040ff2a12aSJohn Baldwin 11050ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 11060ff2a12aSJohn Baldwin 11070ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 11080ff2a12aSJohn Baldwin sizeof(*en)) == 0); 11090ff2a12aSJohn Baldwin 11100ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]); 11110ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]); 11120ff2a12aSJohn Baldwin 11135de79eedSMark Johnston /* 11145de79eedSMark Johnston * A write of zero bytes should send an empty fragment only for 11155de79eedSMark Johnston * TLS 1.0, otherwise an error should be raised. 11165de79eedSMark Johnston */ 11170ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0); 11185de79eedSMark Johnston if (rv == 0) { 11195de79eedSMark Johnston ATF_REQUIRE(en->cipher_algorithm == CRYPTO_AES_CBC); 11205de79eedSMark Johnston ATF_REQUIRE(en->tls_vminor == TLS_MINOR_VER_ZERO); 11215de79eedSMark Johnston } else { 11225de79eedSMark Johnston ATF_REQUIRE(rv == -1); 11235de79eedSMark Johnston ATF_REQUIRE(errno == EINVAL); 11245de79eedSMark Johnston goto out; 11255de79eedSMark Johnston } 11260ff2a12aSJohn Baldwin 11270ff2a12aSJohn Baldwin /* 11280ff2a12aSJohn Baldwin * First read the header to determine how much additional data 11290ff2a12aSJohn Baldwin * to read. 11300ff2a12aSJohn Baldwin */ 11310ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 11320ff2a12aSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 11330ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length); 11340ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 11350ff2a12aSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 11360ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 11370ff2a12aSJohn Baldwin payload_len); 11380ff2a12aSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 11390ff2a12aSJohn Baldwin 11400ff2a12aSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0, 11410ff2a12aSJohn Baldwin &record_type); 11420ff2a12aSJohn Baldwin 11430ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0, 11440ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv); 11450ff2a12aSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 11460ff2a12aSJohn Baldwin 11475de79eedSMark Johnston out: 11480ff2a12aSJohn Baldwin free(outbuf); 11490ff2a12aSJohn Baldwin 1150*2c105205SJohn Baldwin close_sockets(sockets); 11510ff2a12aSJohn Baldwin } 11520ff2a12aSJohn Baldwin 11533e7f8a8dSJohn Baldwin static size_t 11543e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type, 11553e7f8a8dSJohn Baldwin void *data, size_t len) 11563e7f8a8dSJohn Baldwin { 11573e7f8a8dSJohn Baldwin struct msghdr msg; 11583e7f8a8dSJohn Baldwin struct cmsghdr *cmsg; 11593e7f8a8dSJohn Baldwin struct tls_get_record *tgr; 11603e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 11613e7f8a8dSJohn Baldwin struct iovec iov; 11623e7f8a8dSJohn Baldwin ssize_t rv; 11633e7f8a8dSJohn Baldwin 11643e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg)); 11653e7f8a8dSJohn Baldwin 11663e7f8a8dSJohn Baldwin msg.msg_control = cbuf; 11673e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 11683e7f8a8dSJohn Baldwin 11693e7f8a8dSJohn Baldwin iov.iov_base = data; 11703e7f8a8dSJohn Baldwin iov.iov_len = len; 11713e7f8a8dSJohn Baldwin msg.msg_iov = &iov; 11723e7f8a8dSJohn Baldwin msg.msg_iovlen = 1; 11733e7f8a8dSJohn Baldwin 11743e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0); 11753e7f8a8dSJohn Baldwin 11763e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR); 11773e7f8a8dSJohn Baldwin 11783e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 11793e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL); 11803e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP); 11813e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD); 11823e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr))); 11833e7f8a8dSJohn Baldwin 11843e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 11853e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_type == record_type); 11863e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor); 118705a1d0f5SJohn Baldwin /* XXX: Not sure if this is what OpenSSL expects? */ 118805a1d0f5SJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 118905a1d0f5SJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == TLS_MINOR_VER_TWO); 119005a1d0f5SJohn Baldwin else 11913e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor); 11923e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_length == htons(rv)); 11933e7f8a8dSJohn Baldwin 11943e7f8a8dSJohn Baldwin return (rv); 11953e7f8a8dSJohn Baldwin } 11963e7f8a8dSJohn Baldwin 11973e7f8a8dSJohn Baldwin static void 119805a1d0f5SJohn Baldwin test_ktls_receive_app_data(struct tls_enable *en, uint64_t seqno, size_t len, 119905a1d0f5SJohn Baldwin size_t padding) 12003e7f8a8dSJohn Baldwin { 12013e7f8a8dSJohn Baldwin struct kevent ev; 12023e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf; 12033e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written; 12043e7f8a8dSJohn Baldwin ssize_t rv; 12053e7f8a8dSJohn Baldwin int kq, sockets[2]; 12063e7f8a8dSJohn Baldwin 12073e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len); 12083e7f8a8dSJohn Baldwin received = malloc(len); 12093e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 12103e7f8a8dSJohn Baldwin tls_trailer_len(en); 12113e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap); 12123e7f8a8dSJohn Baldwin 12133e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 12143e7f8a8dSJohn Baldwin 12153e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 12163e7f8a8dSJohn Baldwin 12173e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 12183e7f8a8dSJohn Baldwin sizeof(*en)) == 0); 12193e7f8a8dSJohn Baldwin 12203e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 12213e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 12223e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 12233e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 12243e7f8a8dSJohn Baldwin 12253e7f8a8dSJohn Baldwin received_len = 0; 12263e7f8a8dSJohn Baldwin outbuf_len = 0; 12273e7f8a8dSJohn Baldwin written = 0; 12283e7f8a8dSJohn Baldwin 12293e7f8a8dSJohn Baldwin while (received_len != len) { 12303e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 12313e7f8a8dSJohn Baldwin 12323e7f8a8dSJohn Baldwin switch (ev.filter) { 12333e7f8a8dSJohn Baldwin case EVFILT_WRITE: 12343e7f8a8dSJohn Baldwin /* 12353e7f8a8dSJohn Baldwin * Compose the next TLS record to send. 12363e7f8a8dSJohn Baldwin */ 12373e7f8a8dSJohn Baldwin if (outbuf_len == 0) { 12383e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len); 12393e7f8a8dSJohn Baldwin todo = len - written; 124005a1d0f5SJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2 - padding) 124105a1d0f5SJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2 - padding; 12423e7f8a8dSJohn Baldwin outbuf_len = encrypt_tls_record(en, 12433e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written, 124405a1d0f5SJohn Baldwin todo, outbuf, outbuf_cap, padding); 12453e7f8a8dSJohn Baldwin outbuf_sent = 0; 12463e7f8a8dSJohn Baldwin written += todo; 12473e7f8a8dSJohn Baldwin seqno++; 12483e7f8a8dSJohn Baldwin } 12493e7f8a8dSJohn Baldwin 12503e7f8a8dSJohn Baldwin /* 12513e7f8a8dSJohn Baldwin * Try to write the remainder of the current 12523e7f8a8dSJohn Baldwin * TLS record. 12533e7f8a8dSJohn Baldwin */ 12543e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent, 12553e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent); 12563e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 12573e7f8a8dSJohn Baldwin "failed to write to socket"); 12583e7f8a8dSJohn Baldwin outbuf_sent += rv; 12593e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) { 12603e7f8a8dSJohn Baldwin outbuf_len = 0; 12613e7f8a8dSJohn Baldwin if (written == len) { 12623e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE; 12633e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 12643e7f8a8dSJohn Baldwin NULL) == 0); 12653e7f8a8dSJohn Baldwin } 12663e7f8a8dSJohn Baldwin } 12673e7f8a8dSJohn Baldwin break; 12683e7f8a8dSJohn Baldwin 12693e7f8a8dSJohn Baldwin case EVFILT_READ: 12703e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 12713e7f8a8dSJohn Baldwin 12723e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident, 12733e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len, 12743e7f8a8dSJohn Baldwin len - received_len); 12753e7f8a8dSJohn Baldwin received_len += rv; 12763e7f8a8dSJohn Baldwin break; 12773e7f8a8dSJohn Baldwin } 12783e7f8a8dSJohn Baldwin } 12793e7f8a8dSJohn Baldwin 12803e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len, 12813e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written); 12823e7f8a8dSJohn Baldwin 12833e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0); 12843e7f8a8dSJohn Baldwin 12853e7f8a8dSJohn Baldwin free(outbuf); 12863e7f8a8dSJohn Baldwin free(received); 12873e7f8a8dSJohn Baldwin free(plaintext); 12883e7f8a8dSJohn Baldwin 1289*2c105205SJohn Baldwin close_sockets(sockets); 1290694c708dSJohn Baldwin ATF_REQUIRE(close(kq) == 0); 12913e7f8a8dSJohn Baldwin } 12923e7f8a8dSJohn Baldwin 12930ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \ 12940ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 12950ff2a12aSJohn Baldwin CRYPTO_SHA1_HMAC) \ 12960ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 12970ff2a12aSJohn Baldwin CRYPTO_SHA1_HMAC) 12980ff2a12aSJohn Baldwin 129983a54b58SJohn Baldwin #define TLS_13_TESTS(M) \ 130083a54b58SJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 130183a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 130283a54b58SJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 130383a54b58SJohn Baldwin TLS_MINOR_VER_THREE) \ 130483a54b58SJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 130583a54b58SJohn Baldwin TLS_MINOR_VER_THREE) 130683a54b58SJohn Baldwin 1307a10482eaSJohn Baldwin #define AES_CBC_TESTS(M) \ 1308a10482eaSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1309a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 1310a10482eaSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1311a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 1312a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1313a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1314a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1315a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1316a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1317a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1318a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1319a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1320a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1321a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1322a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \ 1323a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1324a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1325a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1326a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \ 1327a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1328a10482eaSJohn Baldwin 1329a10482eaSJohn Baldwin #define AES_GCM_TESTS(M) \ 1330a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1331a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1332a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1333a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1334a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1335a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \ 1336a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1337a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1338a10482eaSJohn Baldwin 1339a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \ 1340a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1341a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1342a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1343a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1344a10482eaSJohn Baldwin 1345a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1346a10482eaSJohn Baldwin auth_alg, minor, name, len) \ 1347a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 1348a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1349a10482eaSJohn Baldwin { \ 1350a10482eaSJohn Baldwin struct tls_enable en; \ 1351a10482eaSJohn Baldwin uint64_t seqno; \ 1352a10482eaSJohn Baldwin \ 1353a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1354a10482eaSJohn Baldwin seqno = random(); \ 1355a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1356a10482eaSJohn Baldwin &en); \ 1357a10482eaSJohn Baldwin test_ktls_transmit_app_data(&en, seqno, len); \ 1358a10482eaSJohn Baldwin free_tls_enable(&en); \ 1359a10482eaSJohn Baldwin } 1360a10482eaSJohn Baldwin 1361a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1362a10482eaSJohn Baldwin auth_alg, minor, name) \ 1363a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1364a10482eaSJohn Baldwin 1365a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 136644265dc3SJohn Baldwin auth_alg, minor, name, type, len) \ 136744265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 136844265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1369a10482eaSJohn Baldwin { \ 1370a10482eaSJohn Baldwin struct tls_enable en; \ 1371a10482eaSJohn Baldwin uint64_t seqno; \ 1372a10482eaSJohn Baldwin \ 1373a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1374a10482eaSJohn Baldwin seqno = random(); \ 1375a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1376a10482eaSJohn Baldwin &en); \ 1377a10482eaSJohn Baldwin test_ktls_transmit_control(&en, seqno, type, len); \ 1378a10482eaSJohn Baldwin free_tls_enable(&en); \ 1379a10482eaSJohn Baldwin } 1380a10482eaSJohn Baldwin 1381a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 138244265dc3SJohn Baldwin auth_alg, minor, name) \ 138344265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1384a10482eaSJohn Baldwin 13850ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 13865de79eedSMark Johnston key_size, auth_alg, minor) \ 13870ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \ 13880ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \ 13890ff2a12aSJohn Baldwin { \ 13900ff2a12aSJohn Baldwin struct tls_enable en; \ 13910ff2a12aSJohn Baldwin uint64_t seqno; \ 13920ff2a12aSJohn Baldwin \ 13930ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \ 13940ff2a12aSJohn Baldwin seqno = random(); \ 13955de79eedSMark Johnston build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 13965de79eedSMark Johnston &en); \ 13970ff2a12aSJohn Baldwin test_ktls_transmit_empty_fragment(&en, seqno); \ 13980ff2a12aSJohn Baldwin free_tls_enable(&en); \ 13990ff2a12aSJohn Baldwin } 14000ff2a12aSJohn Baldwin 14010ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 14025de79eedSMark Johnston key_size, auth_alg, minor) \ 14030ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment); 14040ff2a12aSJohn Baldwin 1405a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1406a10482eaSJohn Baldwin minor) \ 1407a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1408a10482eaSJohn Baldwin auth_alg, minor, short, 64) \ 1409a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1410a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \ 1411a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 141244265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32) 1413a10482eaSJohn Baldwin 1414a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1415a10482eaSJohn Baldwin minor) \ 1416a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1417a10482eaSJohn Baldwin auth_alg, minor, short) \ 1418a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1419a10482eaSJohn Baldwin auth_alg, minor, long) \ 1420a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 142144265dc3SJohn Baldwin auth_alg, minor, control) 1422a10482eaSJohn Baldwin 1423a10482eaSJohn Baldwin /* 1424a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests: 1425a10482eaSJohn Baldwin * 1426a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 1427a10482eaSJohn Baldwin * a single TLS record) 1428a10482eaSJohn Baldwin * 1429a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across 1430a10482eaSJohn Baldwin * multiple TLS records) 1431a10482eaSJohn Baldwin * 1432a10482eaSJohn Baldwin * - a control test which sends a single record with a specific 1433a10482eaSJohn Baldwin * content type via sendmsg() 1434a10482eaSJohn Baldwin */ 1435a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS); 1436a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS); 1437a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS); 1438a10482eaSJohn Baldwin 143944265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 144044265dc3SJohn Baldwin auth_alg, minor) \ 144144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 144244265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \ 144344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 144444265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \ 144544265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 144644265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \ 144744265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 144844265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \ 144944265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 145044265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \ 145144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 145244265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \ 145344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 145444265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \ 145544265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 145644265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \ 145744265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 145844265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \ 145944265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 146044265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \ 146144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 146244265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \ 146344265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 146444265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \ 146544265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 146644265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \ 146744265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 146844265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \ 146944265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 147044265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \ 147144265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 147244265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16) 147344265dc3SJohn Baldwin 147444265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 147544265dc3SJohn Baldwin auth_alg, minor) \ 147644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 147744265dc3SJohn Baldwin auth_alg, minor, padding_1) \ 147844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 147944265dc3SJohn Baldwin auth_alg, minor, padding_2) \ 148044265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 148144265dc3SJohn Baldwin auth_alg, minor, padding_3) \ 148244265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 148344265dc3SJohn Baldwin auth_alg, minor, padding_4) \ 148444265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 148544265dc3SJohn Baldwin auth_alg, minor, padding_5) \ 148644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 148744265dc3SJohn Baldwin auth_alg, minor, padding_6) \ 148844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 148944265dc3SJohn Baldwin auth_alg, minor, padding_7) \ 149044265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 149144265dc3SJohn Baldwin auth_alg, minor, padding_8) \ 149244265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 149344265dc3SJohn Baldwin auth_alg, minor, padding_9) \ 149444265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 149544265dc3SJohn Baldwin auth_alg, minor, padding_10) \ 149644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 149744265dc3SJohn Baldwin auth_alg, minor, padding_11) \ 149844265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 149944265dc3SJohn Baldwin auth_alg, minor, padding_12) \ 150044265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 150144265dc3SJohn Baldwin auth_alg, minor, padding_13) \ 150244265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 150344265dc3SJohn Baldwin auth_alg, minor, padding_14) \ 150444265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 150544265dc3SJohn Baldwin auth_alg, minor, padding_15) \ 150644265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 150744265dc3SJohn Baldwin auth_alg, minor, padding_16) 150844265dc3SJohn Baldwin 150944265dc3SJohn Baldwin /* 151044265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 151144265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 151244265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 151344265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 151444265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 151544265dc3SJohn Baldwin * of the possible padding lengths for each suite. 151644265dc3SJohn Baldwin */ 151744265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS); 151844265dc3SJohn Baldwin 15190ff2a12aSJohn Baldwin /* 15200ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that 15210ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections. 15220ff2a12aSJohn Baldwin */ 15235de79eedSMark Johnston AES_CBC_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 15245de79eedSMark Johnston AES_GCM_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 15255de79eedSMark Johnston CHACHA20_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 15260ff2a12aSJohn Baldwin 1527d1c369f9SJohn Baldwin static void 1528d1c369f9SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(struct tls_enable *en) 1529d1c369f9SJohn Baldwin { 1530d1c369f9SJohn Baldwin int sockets[2]; 1531d1c369f9SJohn Baldwin 1532d1c369f9SJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 1533d1c369f9SJohn Baldwin 1534d1c369f9SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1535d1c369f9SJohn Baldwin sizeof(*en)) == -1); 1536d1c369f9SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 1537d1c369f9SJohn Baldwin 1538*2c105205SJohn Baldwin close_sockets(sockets); 1539d1c369f9SJohn Baldwin } 1540d1c369f9SJohn Baldwin 1541d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 1542d1c369f9SJohn Baldwin minor) \ 1543d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \ 1544d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \ 1545d1c369f9SJohn Baldwin { \ 1546d1c369f9SJohn Baldwin struct tls_enable en; \ 1547d1c369f9SJohn Baldwin uint64_t seqno; \ 1548d1c369f9SJohn Baldwin \ 1549d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \ 1550d1c369f9SJohn Baldwin seqno = random(); \ 1551d1c369f9SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1552d1c369f9SJohn Baldwin &en); \ 1553d1c369f9SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(&en); \ 1554d1c369f9SJohn Baldwin free_tls_enable(&en); \ 1555d1c369f9SJohn Baldwin } 1556d1c369f9SJohn Baldwin 1557d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 1558d1c369f9SJohn Baldwin minor) \ 1559d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name); 1560d1c369f9SJohn Baldwin 1561d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \ 1562d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1563d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \ 1564d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1565d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \ 1566d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1567d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 1568d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1569d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 1570d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1571d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \ 1572d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1573d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \ 1574d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1575d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 1576d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1577d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 1578d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1579d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \ 1580d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1581d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \ 1582d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1583d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE) 1584d1c369f9SJohn Baldwin 1585d1c369f9SJohn Baldwin /* 1586d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit. 1587d1c369f9SJohn Baldwin */ 1588d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST); 1589d1c369f9SJohn Baldwin 15903e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 159105a1d0f5SJohn Baldwin auth_alg, minor, name, len, padding) \ 15923e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 15933e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 15943e7f8a8dSJohn Baldwin { \ 15953e7f8a8dSJohn Baldwin struct tls_enable en; \ 15963e7f8a8dSJohn Baldwin uint64_t seqno; \ 15973e7f8a8dSJohn Baldwin \ 15983e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \ 15993e7f8a8dSJohn Baldwin seqno = random(); \ 16003e7f8a8dSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 16013e7f8a8dSJohn Baldwin &en); \ 160205a1d0f5SJohn Baldwin test_ktls_receive_app_data(&en, seqno, len, padding); \ 16033e7f8a8dSJohn Baldwin free_tls_enable(&en); \ 16043e7f8a8dSJohn Baldwin } 16053e7f8a8dSJohn Baldwin 16063e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 16073e7f8a8dSJohn Baldwin auth_alg, minor, name) \ 16083e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 16093e7f8a8dSJohn Baldwin 16103e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 16113e7f8a8dSJohn Baldwin minor) \ 16123e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 161305a1d0f5SJohn Baldwin auth_alg, minor, short, 64, 0) \ 16143e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 161505a1d0f5SJohn Baldwin auth_alg, minor, long, 64 * 1024, 0) 16163e7f8a8dSJohn Baldwin 16173e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 16183e7f8a8dSJohn Baldwin minor) \ 16193e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 16203e7f8a8dSJohn Baldwin auth_alg, minor, short) \ 16213e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 16223e7f8a8dSJohn Baldwin auth_alg, minor, long) 16233e7f8a8dSJohn Baldwin 16243e7f8a8dSJohn Baldwin /* 16253e7f8a8dSJohn Baldwin * For each supported cipher suite, run two receive tests: 16263e7f8a8dSJohn Baldwin * 16273e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 16283e7f8a8dSJohn Baldwin * a single TLS record) 16293e7f8a8dSJohn Baldwin * 16303e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across 16313e7f8a8dSJohn Baldwin * multiple TLS records) 16323e7f8a8dSJohn Baldwin * 16333e7f8a8dSJohn Baldwin * Note that receive is currently only supported for TLS 1.2 AEAD 16343e7f8a8dSJohn Baldwin * cipher suites. 16353e7f8a8dSJohn Baldwin */ 163605a1d0f5SJohn Baldwin AES_GCM_TESTS(GEN_RECEIVE_TESTS); 163705a1d0f5SJohn Baldwin CHACHA20_TESTS(GEN_RECEIVE_TESTS); 163805a1d0f5SJohn Baldwin 163905a1d0f5SJohn Baldwin #define GEN_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, \ 164005a1d0f5SJohn Baldwin auth_alg, minor) \ 164105a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 164205a1d0f5SJohn Baldwin auth_alg, minor, short_padded, 64, 16) \ 164305a1d0f5SJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 164405a1d0f5SJohn Baldwin auth_alg, minor, long_padded, 64 * 1024, 15) 164505a1d0f5SJohn Baldwin 164605a1d0f5SJohn Baldwin #define ADD_PADDING_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, \ 164705a1d0f5SJohn Baldwin auth_alg, minor) \ 164805a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 164905a1d0f5SJohn Baldwin auth_alg, minor, short_padded) \ 165005a1d0f5SJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 165105a1d0f5SJohn Baldwin auth_alg, minor, long_padded) 165205a1d0f5SJohn Baldwin 165305a1d0f5SJohn Baldwin /* 165405a1d0f5SJohn Baldwin * For TLS 1.3 cipher suites, run two additional receive tests which 165505a1d0f5SJohn Baldwin * use add padding to each record. 165605a1d0f5SJohn Baldwin */ 165705a1d0f5SJohn Baldwin TLS_13_TESTS(GEN_PADDING_RECEIVE_TESTS); 16583e7f8a8dSJohn Baldwin 1659233ce578SJohn Baldwin static void 1660233ce578SJohn Baldwin test_ktls_invalid_receive_cipher_suite(struct tls_enable *en) 1661233ce578SJohn Baldwin { 1662233ce578SJohn Baldwin int sockets[2]; 1663233ce578SJohn Baldwin 1664233ce578SJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 1665233ce578SJohn Baldwin 1666233ce578SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1667233ce578SJohn Baldwin sizeof(*en)) == -1); 166805a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 1669233ce578SJohn Baldwin 1670*2c105205SJohn Baldwin close_sockets(sockets); 1671233ce578SJohn Baldwin } 1672233ce578SJohn Baldwin 1673233ce578SJohn Baldwin #define GEN_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 1674233ce578SJohn Baldwin minor) \ 1675233ce578SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_invalid_##name); \ 1676233ce578SJohn Baldwin ATF_TC_BODY(ktls_receive_invalid_##name, tc) \ 1677233ce578SJohn Baldwin { \ 1678233ce578SJohn Baldwin struct tls_enable en; \ 1679233ce578SJohn Baldwin uint64_t seqno; \ 1680233ce578SJohn Baldwin \ 1681233ce578SJohn Baldwin ATF_REQUIRE_KTLS(); \ 1682233ce578SJohn Baldwin seqno = random(); \ 1683233ce578SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1684233ce578SJohn Baldwin &en); \ 1685233ce578SJohn Baldwin test_ktls_invalid_receive_cipher_suite(&en); \ 1686233ce578SJohn Baldwin free_tls_enable(&en); \ 1687233ce578SJohn Baldwin } 1688233ce578SJohn Baldwin 1689233ce578SJohn Baldwin #define ADD_INVALID_RECEIVE_TEST(name, cipher_alg, key_size, auth_alg, \ 1690233ce578SJohn Baldwin minor) \ 1691233ce578SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_invalid_##name); 1692233ce578SJohn Baldwin 1693233ce578SJohn Baldwin /* 1694233ce578SJohn Baldwin * Ensure that invalid cipher suites are rejected for receive. 1695233ce578SJohn Baldwin */ 1696233ce578SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_RECEIVE_TEST); 1697233ce578SJohn Baldwin 169883a54b58SJohn Baldwin static void 169983a54b58SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(struct tls_enable *en) 170083a54b58SJohn Baldwin { 170183a54b58SJohn Baldwin int sockets[2]; 170283a54b58SJohn Baldwin 170383a54b58SJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 170483a54b58SJohn Baldwin 170583a54b58SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 170683a54b58SJohn Baldwin sizeof(*en)) == -1); 170705a1d0f5SJohn Baldwin ATF_REQUIRE(errno == EPROTONOSUPPORT); 170883a54b58SJohn Baldwin 1709*2c105205SJohn Baldwin close_sockets(sockets); 171083a54b58SJohn Baldwin } 171183a54b58SJohn Baldwin 171283a54b58SJohn Baldwin #define GEN_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 171383a54b58SJohn Baldwin auth_alg, minor) \ 171483a54b58SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_unsupported_##name); \ 171583a54b58SJohn Baldwin ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \ 171683a54b58SJohn Baldwin { \ 171783a54b58SJohn Baldwin struct tls_enable en; \ 171883a54b58SJohn Baldwin uint64_t seqno; \ 171983a54b58SJohn Baldwin \ 172083a54b58SJohn Baldwin ATF_REQUIRE_KTLS(); \ 172183a54b58SJohn Baldwin seqno = random(); \ 172283a54b58SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 172383a54b58SJohn Baldwin &en); \ 172483a54b58SJohn Baldwin test_ktls_unsupported_receive_cipher_suite(&en); \ 172583a54b58SJohn Baldwin free_tls_enable(&en); \ 172683a54b58SJohn Baldwin } 172783a54b58SJohn Baldwin 172883a54b58SJohn Baldwin #define ADD_UNSUPPORTED_RECEIVE_TEST(name, cipher_alg, key_size, \ 172983a54b58SJohn Baldwin auth_alg, minor) \ 173083a54b58SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_unsupported_##name); 173183a54b58SJohn Baldwin 173283a54b58SJohn Baldwin /* 173383a54b58SJohn Baldwin * Ensure that valid cipher suites not supported for receive are 173483a54b58SJohn Baldwin * rejected. 173583a54b58SJohn Baldwin */ 173683a54b58SJohn Baldwin AES_CBC_TESTS(GEN_UNSUPPORTED_RECEIVE_TEST); 173783a54b58SJohn Baldwin 1738ee5686c6SMark Johnston /* 1739ee5686c6SMark Johnston * Try to perform an invalid sendto(2) on a TXTLS-enabled socket, to exercise 1740ee5686c6SMark Johnston * KTLS error handling in the socket layer. 1741ee5686c6SMark Johnston */ 1742ee5686c6SMark Johnston ATF_TC_WITHOUT_HEAD(ktls_sendto_baddst); 1743ee5686c6SMark Johnston ATF_TC_BODY(ktls_sendto_baddst, tc) 1744ee5686c6SMark Johnston { 1745ee5686c6SMark Johnston char buf[32]; 1746ee5686c6SMark Johnston struct sockaddr_in dst; 1747ee5686c6SMark Johnston struct tls_enable en; 1748ee5686c6SMark Johnston ssize_t n; 1749ee5686c6SMark Johnston int s; 1750ee5686c6SMark Johnston 1751ee5686c6SMark Johnston ATF_REQUIRE_KTLS(); 1752ee5686c6SMark Johnston 1753ee5686c6SMark Johnston s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 1754ee5686c6SMark Johnston ATF_REQUIRE(s >= 0); 1755ee5686c6SMark Johnston 1756ee5686c6SMark Johnston build_tls_enable(CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, 1757ee5686c6SMark Johnston TLS_MINOR_VER_THREE, (uint64_t)random(), &en); 1758ee5686c6SMark Johnston 1759ee5686c6SMark Johnston ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, 1760ee5686c6SMark Johnston sizeof(en)) == 0); 1761ee5686c6SMark Johnston 1762ee5686c6SMark Johnston memset(&dst, 0, sizeof(dst)); 1763ee5686c6SMark Johnston dst.sin_family = AF_INET; 1764ee5686c6SMark Johnston dst.sin_len = sizeof(dst); 1765ee5686c6SMark Johnston dst.sin_addr.s_addr = htonl(INADDR_BROADCAST); 1766ee5686c6SMark Johnston dst.sin_port = htons(12345); 1767ee5686c6SMark Johnston 1768ee5686c6SMark Johnston memset(buf, 0, sizeof(buf)); 1769ee5686c6SMark Johnston n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&dst, 1770ee5686c6SMark Johnston sizeof(dst)); 1771ee5686c6SMark Johnston 1772ee5686c6SMark Johnston /* Can't transmit to the broadcast address over TCP. */ 1773ee5686c6SMark Johnston ATF_REQUIRE_ERRNO(EACCES, n == -1); 1774ee5686c6SMark Johnston ATF_REQUIRE(close(s) == 0); 1775ee5686c6SMark Johnston } 1776ee5686c6SMark Johnston 1777a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp) 1778a10482eaSJohn Baldwin { 17793e7f8a8dSJohn Baldwin /* Transmit tests */ 1780a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS); 1781a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS); 1782a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS); 178344265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS); 17845de79eedSMark Johnston AES_CBC_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 17855de79eedSMark Johnston AES_GCM_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 17865de79eedSMark Johnston CHACHA20_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 1787d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST); 1788a10482eaSJohn Baldwin 17893e7f8a8dSJohn Baldwin /* Receive tests */ 179083a54b58SJohn Baldwin AES_CBC_TESTS(ADD_UNSUPPORTED_RECEIVE_TEST); 179105a1d0f5SJohn Baldwin AES_GCM_TESTS(ADD_RECEIVE_TESTS); 179205a1d0f5SJohn Baldwin CHACHA20_TESTS(ADD_RECEIVE_TESTS); 179305a1d0f5SJohn Baldwin TLS_13_TESTS(ADD_PADDING_RECEIVE_TESTS); 1794233ce578SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_RECEIVE_TEST); 1795233ce578SJohn Baldwin 1796ee5686c6SMark Johnston /* Miscellaneous */ 1797ee5686c6SMark Johnston ATF_TP_ADD_TC(tp, ktls_sendto_baddst); 1798ee5686c6SMark Johnston 1799a10482eaSJohn Baldwin return (atf_no_error()); 1800a10482eaSJohn Baldwin } 1801