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 91a10482eaSJohn Baldwin socketpair_tcp(int *sv) 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 165a10482eaSJohn Baldwin fd_set_blocking(int fd) 166a10482eaSJohn Baldwin { 167a10482eaSJohn Baldwin int flags; 168a10482eaSJohn Baldwin 169a10482eaSJohn Baldwin ATF_REQUIRE((flags = fcntl(fd, F_GETFL)) != -1); 170a10482eaSJohn Baldwin flags &= ~O_NONBLOCK; 171a10482eaSJohn Baldwin ATF_REQUIRE(fcntl(fd, F_SETFL, flags) != -1); 172a10482eaSJohn Baldwin } 173a10482eaSJohn Baldwin 174a10482eaSJohn Baldwin static bool 175a10482eaSJohn Baldwin cbc_decrypt(const EVP_CIPHER *cipher, const char *key, const char *iv, 176a10482eaSJohn Baldwin const char *input, char *output, size_t size) 177a10482eaSJohn Baldwin { 178a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 179a10482eaSJohn Baldwin int outl, total; 180a10482eaSJohn Baldwin 181a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 182a10482eaSJohn Baldwin if (ctx == NULL) { 183a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 184a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 185a10482eaSJohn Baldwin return (false); 186a10482eaSJohn Baldwin } 187a10482eaSJohn Baldwin if (EVP_CipherInit_ex(ctx, cipher, NULL, (const u_char *)key, 188a10482eaSJohn Baldwin (const u_char *)iv, 0) != 1) { 189a10482eaSJohn Baldwin warnx("EVP_CipherInit_ex failed: %s", 190a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 191a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 192a10482eaSJohn Baldwin return (false); 193a10482eaSJohn Baldwin } 194a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 195a10482eaSJohn Baldwin if (EVP_CipherUpdate(ctx, (u_char *)output, &outl, 196a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 197a10482eaSJohn Baldwin warnx("EVP_CipherUpdate failed: %s", 198a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 199a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 200a10482eaSJohn Baldwin return (false); 201a10482eaSJohn Baldwin } 202a10482eaSJohn Baldwin total = outl; 203a10482eaSJohn Baldwin if (EVP_CipherFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 204a10482eaSJohn Baldwin warnx("EVP_CipherFinal_ex 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 ((size_t)total != size) { 211a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 212a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 213a10482eaSJohn Baldwin return (false); 214a10482eaSJohn Baldwin } 215a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 216a10482eaSJohn Baldwin return (true); 217a10482eaSJohn Baldwin } 218a10482eaSJohn Baldwin 219a10482eaSJohn Baldwin static bool 220a10482eaSJohn Baldwin verify_hash(const EVP_MD *md, const void *key, size_t key_len, const void *aad, 221a10482eaSJohn Baldwin size_t aad_len, const void *buffer, size_t len, const void *digest) 222a10482eaSJohn Baldwin { 223a10482eaSJohn Baldwin HMAC_CTX *ctx; 224a10482eaSJohn Baldwin unsigned char digest2[EVP_MAX_MD_SIZE]; 225a10482eaSJohn Baldwin u_int digest_len; 226a10482eaSJohn Baldwin 227a10482eaSJohn Baldwin ctx = HMAC_CTX_new(); 228a10482eaSJohn Baldwin if (ctx == NULL) { 229a10482eaSJohn Baldwin warnx("HMAC_CTX_new failed: %s", 230a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 231a10482eaSJohn Baldwin return (false); 232a10482eaSJohn Baldwin } 233a10482eaSJohn Baldwin if (HMAC_Init_ex(ctx, key, key_len, md, NULL) != 1) { 234a10482eaSJohn Baldwin warnx("HMAC_Init_ex failed: %s", 235a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 236a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 237a10482eaSJohn Baldwin return (false); 238a10482eaSJohn Baldwin } 239a10482eaSJohn Baldwin if (HMAC_Update(ctx, aad, aad_len) != 1) { 240a10482eaSJohn Baldwin warnx("HMAC_Update (aad) failed: %s", 241a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 242a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 243a10482eaSJohn Baldwin return (false); 244a10482eaSJohn Baldwin } 245a10482eaSJohn Baldwin if (HMAC_Update(ctx, buffer, len) != 1) { 246a10482eaSJohn Baldwin warnx("HMAC_Update (payload) failed: %s", 247a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 248a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 249a10482eaSJohn Baldwin return (false); 250a10482eaSJohn Baldwin } 251a10482eaSJohn Baldwin if (HMAC_Final(ctx, digest2, &digest_len) != 1) { 252a10482eaSJohn Baldwin warnx("HMAC_Final failed: %s", 253a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 254a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 255a10482eaSJohn Baldwin return (false); 256a10482eaSJohn Baldwin } 257a10482eaSJohn Baldwin HMAC_CTX_free(ctx); 258a10482eaSJohn Baldwin if (memcmp(digest, digest2, digest_len) != 0) { 259a10482eaSJohn Baldwin warnx("HMAC mismatch"); 260a10482eaSJohn Baldwin return (false); 261a10482eaSJohn Baldwin } 262a10482eaSJohn Baldwin return (true); 263a10482eaSJohn Baldwin } 264a10482eaSJohn Baldwin 265a10482eaSJohn Baldwin static bool 266*3e7f8a8dSJohn Baldwin aead_encrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 267*3e7f8a8dSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 268*3e7f8a8dSJohn Baldwin size_t size, char *tag, size_t tag_len) 269*3e7f8a8dSJohn Baldwin { 270*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX *ctx; 271*3e7f8a8dSJohn Baldwin int outl, total; 272*3e7f8a8dSJohn Baldwin 273*3e7f8a8dSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 274*3e7f8a8dSJohn Baldwin if (ctx == NULL) { 275*3e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 276*3e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 277*3e7f8a8dSJohn Baldwin return (false); 278*3e7f8a8dSJohn Baldwin } 279*3e7f8a8dSJohn Baldwin if (EVP_EncryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 280*3e7f8a8dSJohn Baldwin (const u_char *)nonce) != 1) { 281*3e7f8a8dSJohn Baldwin warnx("EVP_EncryptInit_ex failed: %s", 282*3e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 283*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 284*3e7f8a8dSJohn Baldwin return (false); 285*3e7f8a8dSJohn Baldwin } 286*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 287*3e7f8a8dSJohn Baldwin if (aad != NULL) { 288*3e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 289*3e7f8a8dSJohn Baldwin aad_len) != 1) { 290*3e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate for AAD failed: %s", 291*3e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 292*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 293*3e7f8a8dSJohn Baldwin return (false); 294*3e7f8a8dSJohn Baldwin } 295*3e7f8a8dSJohn Baldwin } 296*3e7f8a8dSJohn Baldwin if (EVP_EncryptUpdate(ctx, (u_char *)output, &outl, 297*3e7f8a8dSJohn Baldwin (const u_char *)input, size) != 1) { 298*3e7f8a8dSJohn Baldwin warnx("EVP_EncryptUpdate failed: %s", 299*3e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 300*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 301*3e7f8a8dSJohn Baldwin return (false); 302*3e7f8a8dSJohn Baldwin } 303*3e7f8a8dSJohn Baldwin total = outl; 304*3e7f8a8dSJohn Baldwin if (EVP_EncryptFinal_ex(ctx, (u_char *)output + outl, &outl) != 1) { 305*3e7f8a8dSJohn Baldwin warnx("EVP_EncryptFinal_ex failed: %s", 306*3e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 307*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 308*3e7f8a8dSJohn Baldwin return (false); 309*3e7f8a8dSJohn Baldwin } 310*3e7f8a8dSJohn Baldwin total += outl; 311*3e7f8a8dSJohn Baldwin if ((size_t)total != size) { 312*3e7f8a8dSJohn Baldwin warnx("encrypt size mismatch: %zu vs %d", size, total); 313*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 314*3e7f8a8dSJohn Baldwin return (false); 315*3e7f8a8dSJohn Baldwin } 316*3e7f8a8dSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag) != 317*3e7f8a8dSJohn Baldwin 1) { 318*3e7f8a8dSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed: %s", 319*3e7f8a8dSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 320*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 321*3e7f8a8dSJohn Baldwin return (false); 322*3e7f8a8dSJohn Baldwin } 323*3e7f8a8dSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 324*3e7f8a8dSJohn Baldwin return (true); 325*3e7f8a8dSJohn Baldwin } 326*3e7f8a8dSJohn Baldwin 327*3e7f8a8dSJohn Baldwin static bool 328a10482eaSJohn Baldwin aead_decrypt(const EVP_CIPHER *cipher, const char *key, const char *nonce, 329a10482eaSJohn Baldwin const void *aad, size_t aad_len, const char *input, char *output, 330a10482eaSJohn Baldwin size_t size, const char *tag, size_t tag_len) 331a10482eaSJohn Baldwin { 332a10482eaSJohn Baldwin EVP_CIPHER_CTX *ctx; 333a10482eaSJohn Baldwin int outl, total; 334a10482eaSJohn Baldwin bool valid; 335a10482eaSJohn Baldwin 336a10482eaSJohn Baldwin ctx = EVP_CIPHER_CTX_new(); 337a10482eaSJohn Baldwin if (ctx == NULL) { 338a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_new failed: %s", 339a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 340a10482eaSJohn Baldwin return (false); 341a10482eaSJohn Baldwin } 342a10482eaSJohn Baldwin if (EVP_DecryptInit_ex(ctx, cipher, NULL, (const u_char *)key, 343a10482eaSJohn Baldwin (const u_char *)nonce) != 1) { 344a10482eaSJohn Baldwin warnx("EVP_DecryptInit_ex failed: %s", 345a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 346a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 347a10482eaSJohn Baldwin return (false); 348a10482eaSJohn Baldwin } 349a10482eaSJohn Baldwin EVP_CIPHER_CTX_set_padding(ctx, 0); 350a10482eaSJohn Baldwin if (aad != NULL) { 351a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, NULL, &outl, (const u_char *)aad, 352a10482eaSJohn Baldwin aad_len) != 1) { 353a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate for AAD failed: %s", 354a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 355a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 356a10482eaSJohn Baldwin return (false); 357a10482eaSJohn Baldwin } 358a10482eaSJohn Baldwin } 359a10482eaSJohn Baldwin if (EVP_DecryptUpdate(ctx, (u_char *)output, &outl, 360a10482eaSJohn Baldwin (const u_char *)input, size) != 1) { 361a10482eaSJohn Baldwin warnx("EVP_DecryptUpdate failed: %s", 362a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 363a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 364a10482eaSJohn Baldwin return (false); 365a10482eaSJohn Baldwin } 366a10482eaSJohn Baldwin total = outl; 367a10482eaSJohn Baldwin if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, 368a10482eaSJohn Baldwin __DECONST(char *, tag)) != 1) { 369a10482eaSJohn Baldwin warnx("EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed: %s", 370a10482eaSJohn Baldwin ERR_error_string(ERR_get_error(), NULL)); 371a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 372a10482eaSJohn Baldwin return (false); 373a10482eaSJohn Baldwin } 374a10482eaSJohn Baldwin valid = (EVP_DecryptFinal_ex(ctx, (u_char *)output + outl, &outl) == 1); 375a10482eaSJohn Baldwin total += outl; 376a10482eaSJohn Baldwin if ((size_t)total != size) { 377a10482eaSJohn Baldwin warnx("decrypt size mismatch: %zu vs %d", size, total); 378a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 379a10482eaSJohn Baldwin return (false); 380a10482eaSJohn Baldwin } 381a10482eaSJohn Baldwin if (!valid) 382a10482eaSJohn Baldwin warnx("tag mismatch"); 383a10482eaSJohn Baldwin EVP_CIPHER_CTX_free(ctx); 384a10482eaSJohn Baldwin return (valid); 385a10482eaSJohn Baldwin } 386a10482eaSJohn Baldwin 387a10482eaSJohn Baldwin static void 388a10482eaSJohn Baldwin build_tls_enable(int cipher_alg, size_t cipher_key_len, int auth_alg, 389a10482eaSJohn Baldwin int minor, uint64_t seqno, struct tls_enable *en) 390a10482eaSJohn Baldwin { 391a10482eaSJohn Baldwin u_int auth_key_len, iv_len; 392a10482eaSJohn Baldwin 393a10482eaSJohn Baldwin memset(en, 0, sizeof(*en)); 394a10482eaSJohn Baldwin 395a10482eaSJohn Baldwin switch (cipher_alg) { 396a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 397a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_ZERO) 398a10482eaSJohn Baldwin iv_len = AES_BLOCK_LEN; 399a10482eaSJohn Baldwin else 400a10482eaSJohn Baldwin iv_len = 0; 401a10482eaSJohn Baldwin break; 402a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 403a10482eaSJohn Baldwin if (minor == TLS_MINOR_VER_TWO) 404a10482eaSJohn Baldwin iv_len = TLS_AEAD_GCM_LEN; 405a10482eaSJohn Baldwin else 406a10482eaSJohn Baldwin iv_len = TLS_1_3_GCM_IV_LEN; 407a10482eaSJohn Baldwin break; 408a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 409a10482eaSJohn Baldwin iv_len = TLS_CHACHA20_IV_LEN; 410a10482eaSJohn Baldwin break; 411a10482eaSJohn Baldwin default: 412a10482eaSJohn Baldwin iv_len = 0; 413a10482eaSJohn Baldwin break; 414a10482eaSJohn Baldwin } 415a10482eaSJohn Baldwin switch (auth_alg) { 416a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 417a10482eaSJohn Baldwin auth_key_len = SHA1_HASH_LEN; 418a10482eaSJohn Baldwin break; 419a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 420a10482eaSJohn Baldwin auth_key_len = SHA2_256_HASH_LEN; 421a10482eaSJohn Baldwin break; 422a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 423a10482eaSJohn Baldwin auth_key_len = SHA2_384_HASH_LEN; 424a10482eaSJohn Baldwin break; 425a10482eaSJohn Baldwin default: 426a10482eaSJohn Baldwin auth_key_len = 0; 427a10482eaSJohn Baldwin break; 428a10482eaSJohn Baldwin } 429a10482eaSJohn Baldwin en->cipher_key = alloc_buffer(cipher_key_len); 430a10482eaSJohn Baldwin en->iv = alloc_buffer(iv_len); 431a10482eaSJohn Baldwin en->auth_key = alloc_buffer(auth_key_len); 432a10482eaSJohn Baldwin en->cipher_algorithm = cipher_alg; 433a10482eaSJohn Baldwin en->cipher_key_len = cipher_key_len; 434a10482eaSJohn Baldwin en->iv_len = iv_len; 435a10482eaSJohn Baldwin en->auth_algorithm = auth_alg; 436a10482eaSJohn Baldwin en->auth_key_len = auth_key_len; 437a10482eaSJohn Baldwin en->tls_vmajor = TLS_MAJOR_VER_ONE; 438a10482eaSJohn Baldwin en->tls_vminor = minor; 439a10482eaSJohn Baldwin be64enc(en->rec_seq, seqno); 440a10482eaSJohn Baldwin } 441a10482eaSJohn Baldwin 442a10482eaSJohn Baldwin static void 443a10482eaSJohn Baldwin free_tls_enable(struct tls_enable *en) 444a10482eaSJohn Baldwin { 445a10482eaSJohn Baldwin free(__DECONST(void *, en->cipher_key)); 446a10482eaSJohn Baldwin free(__DECONST(void *, en->iv)); 447a10482eaSJohn Baldwin free(__DECONST(void *, en->auth_key)); 448a10482eaSJohn Baldwin } 449a10482eaSJohn Baldwin 450a10482eaSJohn Baldwin static const EVP_CIPHER * 451a10482eaSJohn Baldwin tls_EVP_CIPHER(const struct tls_enable *en) 452a10482eaSJohn Baldwin { 453a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 454a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 455a10482eaSJohn Baldwin switch (en->cipher_key_len) { 456a10482eaSJohn Baldwin case 128 / 8: 457a10482eaSJohn Baldwin return (EVP_aes_128_cbc()); 458a10482eaSJohn Baldwin case 256 / 8: 459a10482eaSJohn Baldwin return (EVP_aes_256_cbc()); 460a10482eaSJohn Baldwin default: 461a10482eaSJohn Baldwin return (NULL); 462a10482eaSJohn Baldwin } 463a10482eaSJohn Baldwin break; 464a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 465a10482eaSJohn Baldwin switch (en->cipher_key_len) { 466a10482eaSJohn Baldwin case 128 / 8: 467a10482eaSJohn Baldwin return (EVP_aes_128_gcm()); 468a10482eaSJohn Baldwin case 256 / 8: 469a10482eaSJohn Baldwin return (EVP_aes_256_gcm()); 470a10482eaSJohn Baldwin default: 471a10482eaSJohn Baldwin return (NULL); 472a10482eaSJohn Baldwin } 473a10482eaSJohn Baldwin break; 474a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 475a10482eaSJohn Baldwin return (EVP_chacha20_poly1305()); 476a10482eaSJohn Baldwin default: 477a10482eaSJohn Baldwin return (NULL); 478a10482eaSJohn Baldwin } 479a10482eaSJohn Baldwin } 480a10482eaSJohn Baldwin 481a10482eaSJohn Baldwin static const EVP_MD * 482a10482eaSJohn Baldwin tls_EVP_MD(const struct tls_enable *en) 483a10482eaSJohn Baldwin { 484a10482eaSJohn Baldwin switch (en->auth_algorithm) { 485a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 486a10482eaSJohn Baldwin return (EVP_sha1()); 487a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 488a10482eaSJohn Baldwin return (EVP_sha256()); 489a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 490a10482eaSJohn Baldwin return (EVP_sha384()); 491a10482eaSJohn Baldwin default: 492a10482eaSJohn Baldwin return (NULL); 493a10482eaSJohn Baldwin } 494a10482eaSJohn Baldwin } 495a10482eaSJohn Baldwin 496a10482eaSJohn Baldwin static size_t 497a10482eaSJohn Baldwin tls_header_len(struct tls_enable *en) 498a10482eaSJohn Baldwin { 499a10482eaSJohn Baldwin size_t len; 500a10482eaSJohn Baldwin 501a10482eaSJohn Baldwin len = sizeof(struct tls_record_layer); 502a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 503a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 504a10482eaSJohn Baldwin if (en->tls_vminor != TLS_MINOR_VER_ZERO) 505a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 506a10482eaSJohn Baldwin return (len); 507a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 508a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) 509a10482eaSJohn Baldwin len += sizeof(uint64_t); 510a10482eaSJohn Baldwin return (len); 511a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 512a10482eaSJohn Baldwin return (len); 513a10482eaSJohn Baldwin default: 514a10482eaSJohn Baldwin return (0); 515a10482eaSJohn Baldwin } 516a10482eaSJohn Baldwin } 517a10482eaSJohn Baldwin 518a10482eaSJohn Baldwin static size_t 519a10482eaSJohn Baldwin tls_mac_len(struct tls_enable *en) 520a10482eaSJohn Baldwin { 521a10482eaSJohn Baldwin switch (en->cipher_algorithm) { 522a10482eaSJohn Baldwin case CRYPTO_AES_CBC: 523a10482eaSJohn Baldwin switch (en->auth_algorithm) { 524a10482eaSJohn Baldwin case CRYPTO_SHA1_HMAC: 525a10482eaSJohn Baldwin return (SHA1_HASH_LEN); 526a10482eaSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 527a10482eaSJohn Baldwin return (SHA2_256_HASH_LEN); 528a10482eaSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 529a10482eaSJohn Baldwin return (SHA2_384_HASH_LEN); 530a10482eaSJohn Baldwin default: 531a10482eaSJohn Baldwin return (0); 532a10482eaSJohn Baldwin } 533a10482eaSJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 534a10482eaSJohn Baldwin return (AES_GMAC_HASH_LEN); 535a10482eaSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 536a10482eaSJohn Baldwin return (POLY1305_HASH_LEN); 537a10482eaSJohn Baldwin default: 538a10482eaSJohn Baldwin return (0); 539a10482eaSJohn Baldwin } 540a10482eaSJohn Baldwin } 541a10482eaSJohn Baldwin 542a10482eaSJohn Baldwin /* Includes maximum padding for MTE. */ 543a10482eaSJohn Baldwin static size_t 544a10482eaSJohn Baldwin tls_trailer_len(struct tls_enable *en) 545a10482eaSJohn Baldwin { 546a10482eaSJohn Baldwin size_t len; 547a10482eaSJohn Baldwin 548a10482eaSJohn Baldwin len = tls_mac_len(en); 549a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 550a10482eaSJohn Baldwin len += AES_BLOCK_LEN; 551a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_THREE) 552a10482eaSJohn Baldwin len++; 553a10482eaSJohn Baldwin return (len); 554a10482eaSJohn Baldwin } 555a10482eaSJohn Baldwin 556a10482eaSJohn Baldwin /* 'len' is the length of the payload application data. */ 557a10482eaSJohn Baldwin static void 558a10482eaSJohn Baldwin tls_mte_aad(struct tls_enable *en, size_t len, 559a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, struct tls_mac_data *ad) 560a10482eaSJohn Baldwin { 561a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 562a10482eaSJohn Baldwin ad->type = hdr->tls_type; 563a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 564a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 565a10482eaSJohn Baldwin ad->tls_length = htons(len); 566a10482eaSJohn Baldwin } 567a10482eaSJohn Baldwin 568a10482eaSJohn Baldwin static void 569a10482eaSJohn Baldwin tls_12_aead_aad(struct tls_enable *en, size_t len, 570a10482eaSJohn Baldwin const struct tls_record_layer *hdr, uint64_t seqno, 571a10482eaSJohn Baldwin struct tls_aead_data *ad) 572a10482eaSJohn Baldwin { 573a10482eaSJohn Baldwin ad->seq = htobe64(seqno); 574a10482eaSJohn Baldwin ad->type = hdr->tls_type; 575a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 576a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 577a10482eaSJohn Baldwin ad->tls_length = htons(len); 578a10482eaSJohn Baldwin } 579a10482eaSJohn Baldwin 580a10482eaSJohn Baldwin static void 581a10482eaSJohn Baldwin tls_13_aad(struct tls_enable *en, const struct tls_record_layer *hdr, 582a10482eaSJohn Baldwin uint64_t seqno, struct tls_aead_data_13 *ad) 583a10482eaSJohn Baldwin { 584a10482eaSJohn Baldwin ad->type = hdr->tls_type; 585a10482eaSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 586a10482eaSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 587a10482eaSJohn Baldwin ad->tls_length = hdr->tls_length; 588a10482eaSJohn Baldwin } 589a10482eaSJohn Baldwin 590a10482eaSJohn Baldwin static void 591a10482eaSJohn Baldwin tls_12_gcm_nonce(struct tls_enable *en, const struct tls_record_layer *hdr, 592a10482eaSJohn Baldwin char *nonce) 593a10482eaSJohn Baldwin { 594a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_AEAD_GCM_LEN); 595a10482eaSJohn Baldwin memcpy(nonce + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t)); 596a10482eaSJohn Baldwin } 597a10482eaSJohn Baldwin 598a10482eaSJohn Baldwin static void 599a10482eaSJohn Baldwin tls_13_nonce(struct tls_enable *en, uint64_t seqno, char *nonce) 600a10482eaSJohn Baldwin { 601a10482eaSJohn Baldwin static_assert(TLS_1_3_GCM_IV_LEN == TLS_CHACHA20_IV_LEN, 602a10482eaSJohn Baldwin "TLS 1.3 nonce length mismatch"); 603a10482eaSJohn Baldwin memcpy(nonce, en->iv, TLS_1_3_GCM_IV_LEN); 604a10482eaSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(seqno); 605a10482eaSJohn Baldwin } 606a10482eaSJohn Baldwin 607a10482eaSJohn Baldwin /* 608a10482eaSJohn Baldwin * Decrypt a TLS record 'len' bytes long at 'src' and store the result at 609a10482eaSJohn Baldwin * 'dst'. If the TLS record header length doesn't match or 'dst' doesn't 610a10482eaSJohn Baldwin * have sufficient room ('avail'), fail the test. 611a10482eaSJohn Baldwin */ 612a10482eaSJohn Baldwin static size_t 613a10482eaSJohn Baldwin decrypt_tls_aes_cbc_mte(struct tls_enable *en, uint64_t seqno, const void *src, 614a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 615a10482eaSJohn Baldwin { 616a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 617a10482eaSJohn Baldwin struct tls_mac_data aad; 618a10482eaSJohn Baldwin const char *iv; 619a10482eaSJohn Baldwin char *buf; 620a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 621a10482eaSJohn Baldwin int padding; 622a10482eaSJohn Baldwin 623a10482eaSJohn Baldwin hdr = src; 624a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 625a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 626a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 627a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == en->tls_vminor); 628a10482eaSJohn Baldwin 629a10482eaSJohn Baldwin /* First, decrypt the outer payload into a temporary buffer. */ 630a10482eaSJohn Baldwin payload_len = len - hdr_len; 631a10482eaSJohn Baldwin buf = malloc(payload_len); 632a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 633a10482eaSJohn Baldwin iv = en->iv; 634a10482eaSJohn Baldwin else 635a10482eaSJohn Baldwin iv = (void *)(hdr + 1); 636a10482eaSJohn Baldwin ATF_REQUIRE(cbc_decrypt(tls_EVP_CIPHER(en), en->cipher_key, iv, 637a10482eaSJohn Baldwin (const u_char *)src + hdr_len, buf, payload_len)); 638a10482eaSJohn Baldwin 639a10482eaSJohn Baldwin /* 640a10482eaSJohn Baldwin * Copy the last encrypted block to use as the IV for the next 641a10482eaSJohn Baldwin * record for TLS 1.0. 642a10482eaSJohn Baldwin */ 643a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_ZERO) 644a10482eaSJohn Baldwin memcpy(__DECONST(uint8_t *, en->iv), (const u_char *)src + 645a10482eaSJohn Baldwin (len - AES_BLOCK_LEN), AES_BLOCK_LEN); 646a10482eaSJohn Baldwin 647a10482eaSJohn Baldwin /* 648a10482eaSJohn Baldwin * Verify trailing padding and strip. 649a10482eaSJohn Baldwin * 650a10482eaSJohn Baldwin * The kernel always generates the smallest amount of padding. 651a10482eaSJohn Baldwin */ 652a10482eaSJohn Baldwin padding = buf[payload_len - 1] + 1; 653a10482eaSJohn Baldwin ATF_REQUIRE(padding > 0 && padding <= AES_BLOCK_LEN); 654a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= mac_len + padding); 655a10482eaSJohn Baldwin payload_len -= padding; 656a10482eaSJohn Baldwin 657a10482eaSJohn Baldwin /* Verify HMAC. */ 658a10482eaSJohn Baldwin payload_len -= mac_len; 659a10482eaSJohn Baldwin tls_mte_aad(en, payload_len, hdr, seqno, &aad); 660a10482eaSJohn Baldwin ATF_REQUIRE(verify_hash(tls_EVP_MD(en), en->auth_key, en->auth_key_len, 661a10482eaSJohn Baldwin &aad, sizeof(aad), buf, payload_len, buf + payload_len)); 662a10482eaSJohn Baldwin 663a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 664a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 665a10482eaSJohn Baldwin *record_type = hdr->tls_type; 666a10482eaSJohn Baldwin return (payload_len); 667a10482eaSJohn Baldwin } 668a10482eaSJohn Baldwin 669a10482eaSJohn Baldwin static size_t 670a10482eaSJohn Baldwin decrypt_tls_12_aead(struct tls_enable *en, uint64_t seqno, const void *src, 671a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 672a10482eaSJohn Baldwin { 673a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 674a10482eaSJohn Baldwin struct tls_aead_data aad; 675a10482eaSJohn Baldwin char nonce[12]; 676a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 677a10482eaSJohn Baldwin 678a10482eaSJohn Baldwin hdr = src; 679a10482eaSJohn Baldwin 680a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 681a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 682a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 683a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 684a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 685a10482eaSJohn Baldwin 686a10482eaSJohn Baldwin tls_12_aead_aad(en, payload_len, hdr, seqno, &aad); 687a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 688a10482eaSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 689a10482eaSJohn Baldwin else 690a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 691a10482eaSJohn Baldwin 692a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 693a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, dst, payload_len, 694a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 695a10482eaSJohn Baldwin 696a10482eaSJohn Baldwin *record_type = hdr->tls_type; 697a10482eaSJohn Baldwin return (payload_len); 698a10482eaSJohn Baldwin } 699a10482eaSJohn Baldwin 700a10482eaSJohn Baldwin static size_t 701a10482eaSJohn Baldwin decrypt_tls_13_aead(struct tls_enable *en, uint64_t seqno, const void *src, 702a10482eaSJohn Baldwin size_t len, void *dst, uint8_t *record_type) 703a10482eaSJohn Baldwin { 704a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 705a10482eaSJohn Baldwin struct tls_aead_data_13 aad; 706a10482eaSJohn Baldwin char nonce[12]; 707a10482eaSJohn Baldwin char *buf; 708a10482eaSJohn Baldwin size_t hdr_len, mac_len, payload_len; 709a10482eaSJohn Baldwin 710a10482eaSJohn Baldwin hdr = src; 711a10482eaSJohn Baldwin 712a10482eaSJohn Baldwin hdr_len = tls_header_len(en); 713a10482eaSJohn Baldwin mac_len = tls_mac_len(en); 714a10482eaSJohn Baldwin payload_len = len - (hdr_len + mac_len); 715a10482eaSJohn Baldwin ATF_REQUIRE(payload_len >= 1); 716a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_type == TLS_RLTYPE_APP); 717a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vmajor == TLS_MAJOR_VER_ONE); 718a10482eaSJohn Baldwin ATF_REQUIRE(hdr->tls_vminor == TLS_MINOR_VER_TWO); 719a10482eaSJohn Baldwin 720a10482eaSJohn Baldwin tls_13_aad(en, hdr, seqno, &aad); 721a10482eaSJohn Baldwin tls_13_nonce(en, seqno, nonce); 722a10482eaSJohn Baldwin 723a10482eaSJohn Baldwin /* 724a10482eaSJohn Baldwin * Have to use a temporary buffer for the output due to the 725a10482eaSJohn Baldwin * record type as the last byte of the trailer. 726a10482eaSJohn Baldwin */ 727a10482eaSJohn Baldwin buf = malloc(payload_len); 728a10482eaSJohn Baldwin 729a10482eaSJohn Baldwin ATF_REQUIRE(aead_decrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 730a10482eaSJohn Baldwin &aad, sizeof(aad), (const char *)src + hdr_len, buf, payload_len, 731a10482eaSJohn Baldwin (const char *)src + hdr_len + payload_len, mac_len)); 732a10482eaSJohn Baldwin 733a10482eaSJohn Baldwin /* Trim record type. */ 734a10482eaSJohn Baldwin *record_type = buf[payload_len - 1]; 735a10482eaSJohn Baldwin payload_len--; 736a10482eaSJohn Baldwin 737a10482eaSJohn Baldwin memcpy(dst, buf, payload_len); 738a10482eaSJohn Baldwin free(buf); 739a10482eaSJohn Baldwin 740a10482eaSJohn Baldwin return (payload_len); 741a10482eaSJohn Baldwin } 742a10482eaSJohn Baldwin 743a10482eaSJohn Baldwin static size_t 744a10482eaSJohn Baldwin decrypt_tls_aead(struct tls_enable *en, uint64_t seqno, const void *src, 745a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 746a10482eaSJohn Baldwin { 747a10482eaSJohn Baldwin const struct tls_record_layer *hdr; 748a10482eaSJohn Baldwin size_t payload_len; 749a10482eaSJohn Baldwin 750a10482eaSJohn Baldwin hdr = src; 751a10482eaSJohn Baldwin ATF_REQUIRE(ntohs(hdr->tls_length) + sizeof(*hdr) == len); 752a10482eaSJohn Baldwin 753a10482eaSJohn Baldwin payload_len = len - (tls_header_len(en) + tls_trailer_len(en)); 754a10482eaSJohn Baldwin ATF_REQUIRE(payload_len <= avail); 755a10482eaSJohn Baldwin 756a10482eaSJohn Baldwin if (en->tls_vminor == TLS_MINOR_VER_TWO) { 757a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_12_aead(en, seqno, src, len, dst, 758a10482eaSJohn Baldwin record_type) == payload_len); 759a10482eaSJohn Baldwin } else { 760a10482eaSJohn Baldwin ATF_REQUIRE(decrypt_tls_13_aead(en, seqno, src, len, dst, 761a10482eaSJohn Baldwin record_type) == payload_len); 762a10482eaSJohn Baldwin } 763a10482eaSJohn Baldwin 764a10482eaSJohn Baldwin return (payload_len); 765a10482eaSJohn Baldwin } 766a10482eaSJohn Baldwin 767a10482eaSJohn Baldwin static size_t 768a10482eaSJohn Baldwin decrypt_tls_record(struct tls_enable *en, uint64_t seqno, const void *src, 769a10482eaSJohn Baldwin size_t len, void *dst, size_t avail, uint8_t *record_type) 770a10482eaSJohn Baldwin { 771a10482eaSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_CBC) 772a10482eaSJohn Baldwin return (decrypt_tls_aes_cbc_mte(en, seqno, src, len, dst, avail, 773a10482eaSJohn Baldwin record_type)); 774a10482eaSJohn Baldwin else 775a10482eaSJohn Baldwin return (decrypt_tls_aead(en, seqno, src, len, dst, avail, 776a10482eaSJohn Baldwin record_type)); 777a10482eaSJohn Baldwin } 778a10482eaSJohn Baldwin 779*3e7f8a8dSJohn Baldwin /* 780*3e7f8a8dSJohn Baldwin * Encrypt a TLS record of type 'record_type' with payload 'len' bytes 781*3e7f8a8dSJohn Baldwin * long at 'src' and store the result at 'dst'. If 'dst' doesn't have 782*3e7f8a8dSJohn Baldwin * sufficient room ('avail'), fail the test. 783*3e7f8a8dSJohn Baldwin */ 784*3e7f8a8dSJohn Baldwin static size_t 785*3e7f8a8dSJohn Baldwin encrypt_tls_12_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 786*3e7f8a8dSJohn Baldwin const void *src, size_t len, void *dst) 787*3e7f8a8dSJohn Baldwin { 788*3e7f8a8dSJohn Baldwin struct tls_record_layer *hdr; 789*3e7f8a8dSJohn Baldwin struct tls_aead_data aad; 790*3e7f8a8dSJohn Baldwin char nonce[12]; 791*3e7f8a8dSJohn Baldwin size_t hdr_len, mac_len, record_len; 792*3e7f8a8dSJohn Baldwin 793*3e7f8a8dSJohn Baldwin hdr = dst; 794*3e7f8a8dSJohn Baldwin 795*3e7f8a8dSJohn Baldwin hdr_len = tls_header_len(en); 796*3e7f8a8dSJohn Baldwin mac_len = tls_mac_len(en); 797*3e7f8a8dSJohn Baldwin record_len = hdr_len + len + mac_len; 798*3e7f8a8dSJohn Baldwin 799*3e7f8a8dSJohn Baldwin hdr->tls_type = record_type; 800*3e7f8a8dSJohn Baldwin hdr->tls_vmajor = TLS_MAJOR_VER_ONE; 801*3e7f8a8dSJohn Baldwin hdr->tls_vminor = TLS_MINOR_VER_TWO; 802*3e7f8a8dSJohn Baldwin hdr->tls_length = htons(record_len - sizeof(*hdr)); 803*3e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 804*3e7f8a8dSJohn Baldwin memcpy(hdr + 1, &seqno, sizeof(seqno)); 805*3e7f8a8dSJohn Baldwin 806*3e7f8a8dSJohn Baldwin tls_12_aead_aad(en, len, hdr, seqno, &aad); 807*3e7f8a8dSJohn Baldwin if (en->cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 808*3e7f8a8dSJohn Baldwin tls_12_gcm_nonce(en, hdr, nonce); 809*3e7f8a8dSJohn Baldwin else 810*3e7f8a8dSJohn Baldwin tls_13_nonce(en, seqno, nonce); 811*3e7f8a8dSJohn Baldwin 812*3e7f8a8dSJohn Baldwin ATF_REQUIRE(aead_encrypt(tls_EVP_CIPHER(en), en->cipher_key, nonce, 813*3e7f8a8dSJohn Baldwin &aad, sizeof(aad), src, (char *)dst + hdr_len, len, 814*3e7f8a8dSJohn Baldwin (char *)dst + hdr_len + len, mac_len)); 815*3e7f8a8dSJohn Baldwin 816*3e7f8a8dSJohn Baldwin return (record_len); 817*3e7f8a8dSJohn Baldwin } 818*3e7f8a8dSJohn Baldwin 819*3e7f8a8dSJohn Baldwin static size_t 820*3e7f8a8dSJohn Baldwin encrypt_tls_aead(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 821*3e7f8a8dSJohn Baldwin const void *src, size_t len, void *dst, size_t avail) 822*3e7f8a8dSJohn Baldwin { 823*3e7f8a8dSJohn Baldwin size_t record_len; 824*3e7f8a8dSJohn Baldwin 825*3e7f8a8dSJohn Baldwin record_len = tls_header_len(en) + len + tls_trailer_len(en); 826*3e7f8a8dSJohn Baldwin ATF_REQUIRE(record_len <= avail); 827*3e7f8a8dSJohn Baldwin 828*3e7f8a8dSJohn Baldwin ATF_REQUIRE(encrypt_tls_12_aead(en, record_type, seqno, src, len, 829*3e7f8a8dSJohn Baldwin dst) == record_len); 830*3e7f8a8dSJohn Baldwin 831*3e7f8a8dSJohn Baldwin return (record_len); 832*3e7f8a8dSJohn Baldwin } 833*3e7f8a8dSJohn Baldwin 834*3e7f8a8dSJohn Baldwin static size_t 835*3e7f8a8dSJohn Baldwin encrypt_tls_record(struct tls_enable *en, uint8_t record_type, uint64_t seqno, 836*3e7f8a8dSJohn Baldwin const void *src, size_t len, void *dst, size_t avail) 837*3e7f8a8dSJohn Baldwin { 838*3e7f8a8dSJohn Baldwin return (encrypt_tls_aead(en, record_type, seqno, src, len, dst, avail)); 839*3e7f8a8dSJohn Baldwin } 840*3e7f8a8dSJohn Baldwin 841a10482eaSJohn Baldwin static void 842a10482eaSJohn Baldwin test_ktls_transmit_app_data(struct tls_enable *en, uint64_t seqno, size_t len) 843a10482eaSJohn Baldwin { 844a10482eaSJohn Baldwin struct kevent ev; 845a10482eaSJohn Baldwin struct tls_record_layer *hdr; 846a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 847a10482eaSJohn Baldwin size_t decrypted_len, outbuf_len, outbuf_cap, record_len, written; 848a10482eaSJohn Baldwin ssize_t rv; 849a10482eaSJohn Baldwin int kq, sockets[2]; 850a10482eaSJohn Baldwin uint8_t record_type; 851a10482eaSJohn Baldwin 852a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 853a10482eaSJohn Baldwin decrypted = malloc(len); 854a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 855a10482eaSJohn Baldwin tls_trailer_len(en); 856a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 857a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 858a10482eaSJohn Baldwin 859a10482eaSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 860a10482eaSJohn Baldwin 861a10482eaSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 862a10482eaSJohn Baldwin 863a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 864a10482eaSJohn Baldwin sizeof(*en)) == 0); 865a10482eaSJohn Baldwin 866a10482eaSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 867a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 868a10482eaSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 869a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 870a10482eaSJohn Baldwin 871a10482eaSJohn Baldwin decrypted_len = 0; 872a10482eaSJohn Baldwin outbuf_len = 0; 873a10482eaSJohn Baldwin written = 0; 874a10482eaSJohn Baldwin 875a10482eaSJohn Baldwin while (decrypted_len != len) { 876a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 877a10482eaSJohn Baldwin 878a10482eaSJohn Baldwin switch (ev.filter) { 879a10482eaSJohn Baldwin case EVFILT_WRITE: 880a10482eaSJohn Baldwin /* Try to write any remaining data. */ 881a10482eaSJohn Baldwin rv = write(ev.ident, plaintext + written, 882a10482eaSJohn Baldwin len - written); 883a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 884a10482eaSJohn Baldwin "failed to write to socket"); 885a10482eaSJohn Baldwin written += rv; 886a10482eaSJohn Baldwin if (written == len) { 887a10482eaSJohn Baldwin ev.flags = EV_DISABLE; 888a10482eaSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 889a10482eaSJohn Baldwin NULL) == 0); 890a10482eaSJohn Baldwin } 891a10482eaSJohn Baldwin break; 892a10482eaSJohn Baldwin 893a10482eaSJohn Baldwin case EVFILT_READ: 894a10482eaSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 895a10482eaSJohn Baldwin 896a10482eaSJohn Baldwin /* 897a10482eaSJohn Baldwin * Try to read data for the next TLS record 898a10482eaSJohn Baldwin * into outbuf. Start by reading the header 899a10482eaSJohn Baldwin * to determine how much additional data to 900a10482eaSJohn Baldwin * read. 901a10482eaSJohn Baldwin */ 902a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) { 903a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 904a10482eaSJohn Baldwin sizeof(struct tls_record_layer) - 905a10482eaSJohn Baldwin outbuf_len); 906a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 907a10482eaSJohn Baldwin "failed to read from socket"); 908a10482eaSJohn Baldwin outbuf_len += rv; 909a10482eaSJohn Baldwin } 910a10482eaSJohn Baldwin 911a10482eaSJohn Baldwin if (outbuf_len < sizeof(struct tls_record_layer)) 912a10482eaSJohn Baldwin break; 913a10482eaSJohn Baldwin 914a10482eaSJohn Baldwin record_len = sizeof(struct tls_record_layer) + 915a10482eaSJohn Baldwin ntohs(hdr->tls_length); 916a10482eaSJohn Baldwin assert(record_len <= outbuf_cap); 917a10482eaSJohn Baldwin assert(record_len > outbuf_len); 918a10482eaSJohn Baldwin rv = read(ev.ident, outbuf + outbuf_len, 919a10482eaSJohn Baldwin record_len - outbuf_len); 920a10482eaSJohn Baldwin if (rv == -1 && errno == EAGAIN) 921a10482eaSJohn Baldwin break; 922a10482eaSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, "failed to read from socket"); 923a10482eaSJohn Baldwin 924a10482eaSJohn Baldwin outbuf_len += rv; 925a10482eaSJohn Baldwin if (outbuf_len == record_len) { 926a10482eaSJohn Baldwin decrypted_len += decrypt_tls_record(en, seqno, 927a10482eaSJohn Baldwin outbuf, outbuf_len, 928a10482eaSJohn Baldwin decrypted + decrypted_len, 929a10482eaSJohn Baldwin len - decrypted_len, &record_type); 930a10482eaSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 931a10482eaSJohn Baldwin 932a10482eaSJohn Baldwin seqno++; 933a10482eaSJohn Baldwin outbuf_len = 0; 934a10482eaSJohn Baldwin } 935a10482eaSJohn Baldwin break; 936a10482eaSJohn Baldwin } 937a10482eaSJohn Baldwin } 938a10482eaSJohn Baldwin 939a10482eaSJohn Baldwin ATF_REQUIRE_MSG(written == decrypted_len, 940a10482eaSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", decrypted_len, written); 941a10482eaSJohn Baldwin 942a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 943a10482eaSJohn Baldwin 944a10482eaSJohn Baldwin free(outbuf); 945a10482eaSJohn Baldwin free(decrypted); 946a10482eaSJohn Baldwin free(plaintext); 947a10482eaSJohn Baldwin 948a10482eaSJohn Baldwin close(sockets[1]); 949a10482eaSJohn Baldwin close(sockets[0]); 950a10482eaSJohn Baldwin close(kq); 951a10482eaSJohn Baldwin } 952a10482eaSJohn Baldwin 953a10482eaSJohn Baldwin static void 954a10482eaSJohn Baldwin ktls_send_control_message(int fd, uint8_t type, void *data, size_t len) 955a10482eaSJohn Baldwin { 956a10482eaSJohn Baldwin struct msghdr msg; 957a10482eaSJohn Baldwin struct cmsghdr *cmsg; 958a10482eaSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(type))]; 959a10482eaSJohn Baldwin struct iovec iov; 960a10482eaSJohn Baldwin 961a10482eaSJohn Baldwin memset(&msg, 0, sizeof(msg)); 962a10482eaSJohn Baldwin 963a10482eaSJohn Baldwin msg.msg_control = cbuf; 964a10482eaSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 965a10482eaSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 966a10482eaSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 967a10482eaSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 968a10482eaSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(sizeof(type)); 969a10482eaSJohn Baldwin *(uint8_t *)CMSG_DATA(cmsg) = type; 970a10482eaSJohn Baldwin 971a10482eaSJohn Baldwin iov.iov_base = data; 972a10482eaSJohn Baldwin iov.iov_len = len; 973a10482eaSJohn Baldwin msg.msg_iov = &iov; 974a10482eaSJohn Baldwin msg.msg_iovlen = 1; 975a10482eaSJohn Baldwin 976a10482eaSJohn Baldwin ATF_REQUIRE(sendmsg(fd, &msg, 0) == (ssize_t)len); 977a10482eaSJohn Baldwin } 978a10482eaSJohn Baldwin 979a10482eaSJohn Baldwin static void 980a10482eaSJohn Baldwin test_ktls_transmit_control(struct tls_enable *en, uint64_t seqno, uint8_t type, 981a10482eaSJohn Baldwin size_t len) 982a10482eaSJohn Baldwin { 983a10482eaSJohn Baldwin struct tls_record_layer *hdr; 984a10482eaSJohn Baldwin char *plaintext, *decrypted, *outbuf; 985a10482eaSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 986a10482eaSJohn Baldwin ssize_t rv; 987a10482eaSJohn Baldwin int sockets[2]; 988a10482eaSJohn Baldwin uint8_t record_type; 989a10482eaSJohn Baldwin 990a10482eaSJohn Baldwin ATF_REQUIRE(len <= TLS_MAX_MSG_SIZE_V10_2); 991a10482eaSJohn Baldwin 992a10482eaSJohn Baldwin plaintext = alloc_buffer(len); 993a10482eaSJohn Baldwin decrypted = malloc(len); 994a10482eaSJohn Baldwin outbuf_cap = tls_header_len(en) + len + tls_trailer_len(en); 995a10482eaSJohn Baldwin outbuf = malloc(outbuf_cap); 996a10482eaSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 997a10482eaSJohn Baldwin 998a10482eaSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 999a10482eaSJohn Baldwin 1000a10482eaSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1001a10482eaSJohn Baldwin sizeof(*en)) == 0); 1002a10482eaSJohn Baldwin 1003a10482eaSJohn Baldwin fd_set_blocking(sockets[0]); 1004a10482eaSJohn Baldwin fd_set_blocking(sockets[1]); 1005a10482eaSJohn Baldwin 1006a10482eaSJohn Baldwin ktls_send_control_message(sockets[1], type, plaintext, len); 1007a10482eaSJohn Baldwin 1008a10482eaSJohn Baldwin /* 1009a10482eaSJohn Baldwin * First read the header to determine how much additional data 1010a10482eaSJohn Baldwin * to read. 1011a10482eaSJohn Baldwin */ 1012a10482eaSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 1013a10482eaSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 1014a10482eaSJohn Baldwin payload_len = ntohs(hdr->tls_length); 1015a10482eaSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 1016a10482eaSJohn Baldwin assert(record_len <= outbuf_cap); 1017a10482eaSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 1018a10482eaSJohn Baldwin payload_len); 1019a10482eaSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 1020a10482eaSJohn Baldwin 1021a10482eaSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, decrypted, len, 1022a10482eaSJohn Baldwin &record_type); 1023a10482eaSJohn Baldwin 1024a10482eaSJohn Baldwin ATF_REQUIRE_MSG((ssize_t)len == rv, 1025a10482eaSJohn Baldwin "read %zd decrypted bytes, but wrote %zu", rv, len); 1026a10482eaSJohn Baldwin ATF_REQUIRE(record_type == type); 1027a10482eaSJohn Baldwin 1028a10482eaSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, decrypted, len) == 0); 1029a10482eaSJohn Baldwin 1030a10482eaSJohn Baldwin free(outbuf); 1031a10482eaSJohn Baldwin free(decrypted); 1032a10482eaSJohn Baldwin free(plaintext); 1033a10482eaSJohn Baldwin 1034a10482eaSJohn Baldwin close(sockets[1]); 1035a10482eaSJohn Baldwin close(sockets[0]); 1036a10482eaSJohn Baldwin } 1037a10482eaSJohn Baldwin 10380ff2a12aSJohn Baldwin static void 10390ff2a12aSJohn Baldwin test_ktls_transmit_empty_fragment(struct tls_enable *en, uint64_t seqno) 10400ff2a12aSJohn Baldwin { 10410ff2a12aSJohn Baldwin struct tls_record_layer *hdr; 10420ff2a12aSJohn Baldwin char *outbuf; 10430ff2a12aSJohn Baldwin size_t outbuf_cap, payload_len, record_len; 10440ff2a12aSJohn Baldwin ssize_t rv; 10450ff2a12aSJohn Baldwin int sockets[2]; 10460ff2a12aSJohn Baldwin uint8_t record_type; 10470ff2a12aSJohn Baldwin 10480ff2a12aSJohn Baldwin outbuf_cap = tls_header_len(en) + tls_trailer_len(en); 10490ff2a12aSJohn Baldwin outbuf = malloc(outbuf_cap); 10500ff2a12aSJohn Baldwin hdr = (struct tls_record_layer *)outbuf; 10510ff2a12aSJohn Baldwin 10520ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 10530ff2a12aSJohn Baldwin 10540ff2a12aSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 10550ff2a12aSJohn Baldwin sizeof(*en)) == 0); 10560ff2a12aSJohn Baldwin 10570ff2a12aSJohn Baldwin fd_set_blocking(sockets[0]); 10580ff2a12aSJohn Baldwin fd_set_blocking(sockets[1]); 10590ff2a12aSJohn Baldwin 10600ff2a12aSJohn Baldwin /* A write of zero bytes should send an empty fragment. */ 10610ff2a12aSJohn Baldwin rv = write(sockets[1], NULL, 0); 10620ff2a12aSJohn Baldwin ATF_REQUIRE(rv == 0); 10630ff2a12aSJohn Baldwin 10640ff2a12aSJohn Baldwin /* 10650ff2a12aSJohn Baldwin * First read the header to determine how much additional data 10660ff2a12aSJohn Baldwin * to read. 10670ff2a12aSJohn Baldwin */ 10680ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf, sizeof(struct tls_record_layer)); 10690ff2a12aSJohn Baldwin ATF_REQUIRE(rv == sizeof(struct tls_record_layer)); 10700ff2a12aSJohn Baldwin payload_len = ntohs(hdr->tls_length); 10710ff2a12aSJohn Baldwin record_len = payload_len + sizeof(struct tls_record_layer); 10720ff2a12aSJohn Baldwin ATF_REQUIRE(record_len <= outbuf_cap); 10730ff2a12aSJohn Baldwin rv = read(sockets[0], outbuf + sizeof(struct tls_record_layer), 10740ff2a12aSJohn Baldwin payload_len); 10750ff2a12aSJohn Baldwin ATF_REQUIRE(rv == (ssize_t)payload_len); 10760ff2a12aSJohn Baldwin 10770ff2a12aSJohn Baldwin rv = decrypt_tls_record(en, seqno, outbuf, record_len, NULL, 0, 10780ff2a12aSJohn Baldwin &record_type); 10790ff2a12aSJohn Baldwin 10800ff2a12aSJohn Baldwin ATF_REQUIRE_MSG(rv == 0, 10810ff2a12aSJohn Baldwin "read %zd decrypted bytes for an empty fragment", rv); 10820ff2a12aSJohn Baldwin ATF_REQUIRE(record_type == TLS_RLTYPE_APP); 10830ff2a12aSJohn Baldwin 10840ff2a12aSJohn Baldwin free(outbuf); 10850ff2a12aSJohn Baldwin 10860ff2a12aSJohn Baldwin close(sockets[1]); 10870ff2a12aSJohn Baldwin close(sockets[0]); 10880ff2a12aSJohn Baldwin } 10890ff2a12aSJohn Baldwin 1090*3e7f8a8dSJohn Baldwin static size_t 1091*3e7f8a8dSJohn Baldwin ktls_receive_tls_record(struct tls_enable *en, int fd, uint8_t record_type, 1092*3e7f8a8dSJohn Baldwin void *data, size_t len) 1093*3e7f8a8dSJohn Baldwin { 1094*3e7f8a8dSJohn Baldwin struct msghdr msg; 1095*3e7f8a8dSJohn Baldwin struct cmsghdr *cmsg; 1096*3e7f8a8dSJohn Baldwin struct tls_get_record *tgr; 1097*3e7f8a8dSJohn Baldwin char cbuf[CMSG_SPACE(sizeof(*tgr))]; 1098*3e7f8a8dSJohn Baldwin struct iovec iov; 1099*3e7f8a8dSJohn Baldwin ssize_t rv; 1100*3e7f8a8dSJohn Baldwin 1101*3e7f8a8dSJohn Baldwin memset(&msg, 0, sizeof(msg)); 1102*3e7f8a8dSJohn Baldwin 1103*3e7f8a8dSJohn Baldwin msg.msg_control = cbuf; 1104*3e7f8a8dSJohn Baldwin msg.msg_controllen = sizeof(cbuf); 1105*3e7f8a8dSJohn Baldwin 1106*3e7f8a8dSJohn Baldwin iov.iov_base = data; 1107*3e7f8a8dSJohn Baldwin iov.iov_len = len; 1108*3e7f8a8dSJohn Baldwin msg.msg_iov = &iov; 1109*3e7f8a8dSJohn Baldwin msg.msg_iovlen = 1; 1110*3e7f8a8dSJohn Baldwin 1111*3e7f8a8dSJohn Baldwin ATF_REQUIRE((rv = recvmsg(fd, &msg, 0)) > 0); 1112*3e7f8a8dSJohn Baldwin 1113*3e7f8a8dSJohn Baldwin ATF_REQUIRE((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) == MSG_EOR); 1114*3e7f8a8dSJohn Baldwin 1115*3e7f8a8dSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 1116*3e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg != NULL); 1117*3e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_level == IPPROTO_TCP); 1118*3e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_type == TLS_GET_RECORD); 1119*3e7f8a8dSJohn Baldwin ATF_REQUIRE(cmsg->cmsg_len == CMSG_LEN(sizeof(*tgr))); 1120*3e7f8a8dSJohn Baldwin 1121*3e7f8a8dSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 1122*3e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_type == record_type); 1123*3e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vmajor == en->tls_vmajor); 1124*3e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_vminor == en->tls_vminor); 1125*3e7f8a8dSJohn Baldwin ATF_REQUIRE(tgr->tls_length == htons(rv)); 1126*3e7f8a8dSJohn Baldwin 1127*3e7f8a8dSJohn Baldwin return (rv); 1128*3e7f8a8dSJohn Baldwin } 1129*3e7f8a8dSJohn Baldwin 1130*3e7f8a8dSJohn Baldwin static void 1131*3e7f8a8dSJohn Baldwin test_ktls_receive_app_data(struct tls_enable *en, uint64_t seqno, size_t len) 1132*3e7f8a8dSJohn Baldwin { 1133*3e7f8a8dSJohn Baldwin struct kevent ev; 1134*3e7f8a8dSJohn Baldwin char *plaintext, *received, *outbuf; 1135*3e7f8a8dSJohn Baldwin size_t outbuf_cap, outbuf_len, outbuf_sent, received_len, todo, written; 1136*3e7f8a8dSJohn Baldwin ssize_t rv; 1137*3e7f8a8dSJohn Baldwin int kq, sockets[2]; 1138*3e7f8a8dSJohn Baldwin 1139*3e7f8a8dSJohn Baldwin plaintext = alloc_buffer(len); 1140*3e7f8a8dSJohn Baldwin received = malloc(len); 1141*3e7f8a8dSJohn Baldwin outbuf_cap = tls_header_len(en) + TLS_MAX_MSG_SIZE_V10_2 + 1142*3e7f8a8dSJohn Baldwin tls_trailer_len(en); 1143*3e7f8a8dSJohn Baldwin outbuf = malloc(outbuf_cap); 1144*3e7f8a8dSJohn Baldwin 1145*3e7f8a8dSJohn Baldwin ATF_REQUIRE((kq = kqueue()) != -1); 1146*3e7f8a8dSJohn Baldwin 1147*3e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 1148*3e7f8a8dSJohn Baldwin 1149*3e7f8a8dSJohn Baldwin ATF_REQUIRE(setsockopt(sockets[0], IPPROTO_TCP, TCP_RXTLS_ENABLE, en, 1150*3e7f8a8dSJohn Baldwin sizeof(*en)) == 0); 1151*3e7f8a8dSJohn Baldwin 1152*3e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[0], EVFILT_READ, EV_ADD, 0, 0, NULL); 1153*3e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1154*3e7f8a8dSJohn Baldwin EV_SET(&ev, sockets[1], EVFILT_WRITE, EV_ADD, 0, 0, NULL); 1155*3e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, NULL) == 0); 1156*3e7f8a8dSJohn Baldwin 1157*3e7f8a8dSJohn Baldwin received_len = 0; 1158*3e7f8a8dSJohn Baldwin outbuf_len = 0; 1159*3e7f8a8dSJohn Baldwin written = 0; 1160*3e7f8a8dSJohn Baldwin 1161*3e7f8a8dSJohn Baldwin while (received_len != len) { 1162*3e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, NULL, 0, &ev, 1, NULL) == 1); 1163*3e7f8a8dSJohn Baldwin 1164*3e7f8a8dSJohn Baldwin switch (ev.filter) { 1165*3e7f8a8dSJohn Baldwin case EVFILT_WRITE: 1166*3e7f8a8dSJohn Baldwin /* 1167*3e7f8a8dSJohn Baldwin * Compose the next TLS record to send. 1168*3e7f8a8dSJohn Baldwin */ 1169*3e7f8a8dSJohn Baldwin if (outbuf_len == 0) { 1170*3e7f8a8dSJohn Baldwin ATF_REQUIRE(written < len); 1171*3e7f8a8dSJohn Baldwin todo = len - written; 1172*3e7f8a8dSJohn Baldwin if (todo > TLS_MAX_MSG_SIZE_V10_2) 1173*3e7f8a8dSJohn Baldwin todo = TLS_MAX_MSG_SIZE_V10_2; 1174*3e7f8a8dSJohn Baldwin outbuf_len = encrypt_tls_record(en, 1175*3e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, seqno, plaintext + written, 1176*3e7f8a8dSJohn Baldwin todo, outbuf, outbuf_cap); 1177*3e7f8a8dSJohn Baldwin outbuf_sent = 0; 1178*3e7f8a8dSJohn Baldwin written += todo; 1179*3e7f8a8dSJohn Baldwin seqno++; 1180*3e7f8a8dSJohn Baldwin } 1181*3e7f8a8dSJohn Baldwin 1182*3e7f8a8dSJohn Baldwin /* 1183*3e7f8a8dSJohn Baldwin * Try to write the remainder of the current 1184*3e7f8a8dSJohn Baldwin * TLS record. 1185*3e7f8a8dSJohn Baldwin */ 1186*3e7f8a8dSJohn Baldwin rv = write(ev.ident, outbuf + outbuf_sent, 1187*3e7f8a8dSJohn Baldwin outbuf_len - outbuf_sent); 1188*3e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(rv > 0, 1189*3e7f8a8dSJohn Baldwin "failed to write to socket"); 1190*3e7f8a8dSJohn Baldwin outbuf_sent += rv; 1191*3e7f8a8dSJohn Baldwin if (outbuf_sent == outbuf_len) { 1192*3e7f8a8dSJohn Baldwin outbuf_len = 0; 1193*3e7f8a8dSJohn Baldwin if (written == len) { 1194*3e7f8a8dSJohn Baldwin ev.flags = EV_DISABLE; 1195*3e7f8a8dSJohn Baldwin ATF_REQUIRE(kevent(kq, &ev, 1, NULL, 0, 1196*3e7f8a8dSJohn Baldwin NULL) == 0); 1197*3e7f8a8dSJohn Baldwin } 1198*3e7f8a8dSJohn Baldwin } 1199*3e7f8a8dSJohn Baldwin break; 1200*3e7f8a8dSJohn Baldwin 1201*3e7f8a8dSJohn Baldwin case EVFILT_READ: 1202*3e7f8a8dSJohn Baldwin ATF_REQUIRE((ev.flags & EV_EOF) == 0); 1203*3e7f8a8dSJohn Baldwin 1204*3e7f8a8dSJohn Baldwin rv = ktls_receive_tls_record(en, ev.ident, 1205*3e7f8a8dSJohn Baldwin TLS_RLTYPE_APP, received + received_len, 1206*3e7f8a8dSJohn Baldwin len - received_len); 1207*3e7f8a8dSJohn Baldwin received_len += rv; 1208*3e7f8a8dSJohn Baldwin break; 1209*3e7f8a8dSJohn Baldwin } 1210*3e7f8a8dSJohn Baldwin } 1211*3e7f8a8dSJohn Baldwin 1212*3e7f8a8dSJohn Baldwin ATF_REQUIRE_MSG(written == received_len, 1213*3e7f8a8dSJohn Baldwin "read %zu decrypted bytes, but wrote %zu", received_len, written); 1214*3e7f8a8dSJohn Baldwin 1215*3e7f8a8dSJohn Baldwin ATF_REQUIRE(memcmp(plaintext, received, len) == 0); 1216*3e7f8a8dSJohn Baldwin 1217*3e7f8a8dSJohn Baldwin free(outbuf); 1218*3e7f8a8dSJohn Baldwin free(received); 1219*3e7f8a8dSJohn Baldwin free(plaintext); 1220*3e7f8a8dSJohn Baldwin 1221*3e7f8a8dSJohn Baldwin close(sockets[1]); 1222*3e7f8a8dSJohn Baldwin close(sockets[0]); 1223*3e7f8a8dSJohn Baldwin close(kq); 1224*3e7f8a8dSJohn Baldwin } 1225*3e7f8a8dSJohn Baldwin 12260ff2a12aSJohn Baldwin #define TLS_10_TESTS(M) \ 12270ff2a12aSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 12280ff2a12aSJohn Baldwin CRYPTO_SHA1_HMAC) \ 12290ff2a12aSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 12300ff2a12aSJohn Baldwin CRYPTO_SHA1_HMAC) 12310ff2a12aSJohn Baldwin 1232*3e7f8a8dSJohn Baldwin #define TLS_12_TESTS(M) \ 1233*3e7f8a8dSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1234*3e7f8a8dSJohn Baldwin TLS_MINOR_VER_TWO) \ 1235*3e7f8a8dSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1236*3e7f8a8dSJohn Baldwin TLS_MINOR_VER_TWO) \ 1237*3e7f8a8dSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1238*3e7f8a8dSJohn Baldwin TLS_MINOR_VER_TWO) 1239*3e7f8a8dSJohn Baldwin 1240a10482eaSJohn Baldwin #define AES_CBC_TESTS(M) \ 1241a10482eaSJohn Baldwin M(aes128_cbc_1_0_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1242a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 1243a10482eaSJohn Baldwin M(aes256_cbc_1_0_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1244a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ZERO) \ 1245a10482eaSJohn Baldwin M(aes128_cbc_1_1_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1246a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1247a10482eaSJohn Baldwin M(aes256_cbc_1_1_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1248a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_ONE) \ 1249a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1250a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1251a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha1, CRYPTO_AES_CBC, 256 / 8, \ 1252a10482eaSJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_TWO) \ 1253a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1254a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1255a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha256, CRYPTO_AES_CBC, 256 / 8, \ 1256a10482eaSJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_TWO) \ 1257a10482eaSJohn Baldwin M(aes128_cbc_1_2_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1258a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1259a10482eaSJohn Baldwin M(aes256_cbc_1_2_sha384, CRYPTO_AES_CBC, 256 / 8, \ 1260a10482eaSJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_TWO) \ 1261a10482eaSJohn Baldwin 1262a10482eaSJohn Baldwin #define AES_GCM_TESTS(M) \ 1263a10482eaSJohn Baldwin M(aes128_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1264a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1265a10482eaSJohn Baldwin M(aes256_gcm_1_2, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1266a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1267a10482eaSJohn Baldwin M(aes128_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1268a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) \ 1269a10482eaSJohn Baldwin M(aes256_gcm_1_3, CRYPTO_AES_NIST_GCM_16, 256 / 8, 0, \ 1270a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1271a10482eaSJohn Baldwin 1272a10482eaSJohn Baldwin #define CHACHA20_TESTS(M) \ 1273a10482eaSJohn Baldwin M(chacha20_poly1305_1_2, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1274a10482eaSJohn Baldwin TLS_MINOR_VER_TWO) \ 1275a10482eaSJohn Baldwin M(chacha20_poly1305_1_3, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1276a10482eaSJohn Baldwin TLS_MINOR_VER_THREE) 1277a10482eaSJohn Baldwin 1278a10482eaSJohn Baldwin #define GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1279a10482eaSJohn Baldwin auth_alg, minor, name, len) \ 1280a10482eaSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 1281a10482eaSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1282a10482eaSJohn Baldwin { \ 1283a10482eaSJohn Baldwin struct tls_enable en; \ 1284a10482eaSJohn Baldwin uint64_t seqno; \ 1285a10482eaSJohn Baldwin \ 1286a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1287a10482eaSJohn Baldwin seqno = random(); \ 1288a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1289a10482eaSJohn Baldwin &en); \ 1290a10482eaSJohn Baldwin test_ktls_transmit_app_data(&en, seqno, len); \ 1291a10482eaSJohn Baldwin free_tls_enable(&en); \ 1292a10482eaSJohn Baldwin } 1293a10482eaSJohn Baldwin 1294a10482eaSJohn Baldwin #define ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1295a10482eaSJohn Baldwin auth_alg, minor, name) \ 1296a10482eaSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1297a10482eaSJohn Baldwin 1298a10482eaSJohn Baldwin #define GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 129944265dc3SJohn Baldwin auth_alg, minor, name, type, len) \ 130044265dc3SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_##name); \ 130144265dc3SJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_##name, tc) \ 1302a10482eaSJohn Baldwin { \ 1303a10482eaSJohn Baldwin struct tls_enable en; \ 1304a10482eaSJohn Baldwin uint64_t seqno; \ 1305a10482eaSJohn Baldwin \ 1306a10482eaSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1307a10482eaSJohn Baldwin seqno = random(); \ 1308a10482eaSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1309a10482eaSJohn Baldwin &en); \ 1310a10482eaSJohn Baldwin test_ktls_transmit_control(&en, seqno, type, len); \ 1311a10482eaSJohn Baldwin free_tls_enable(&en); \ 1312a10482eaSJohn Baldwin } 1313a10482eaSJohn Baldwin 1314a10482eaSJohn Baldwin #define ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 131544265dc3SJohn Baldwin auth_alg, minor, name) \ 131644265dc3SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_##name); 1317a10482eaSJohn Baldwin 13180ff2a12aSJohn Baldwin #define GEN_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 13190ff2a12aSJohn Baldwin key_size, auth_alg) \ 13200ff2a12aSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_##cipher_name##_empty_fragment); \ 13210ff2a12aSJohn Baldwin ATF_TC_BODY(ktls_transmit_##cipher_name##_empty_fragment, tc) \ 13220ff2a12aSJohn Baldwin { \ 13230ff2a12aSJohn Baldwin struct tls_enable en; \ 13240ff2a12aSJohn Baldwin uint64_t seqno; \ 13250ff2a12aSJohn Baldwin \ 13260ff2a12aSJohn Baldwin ATF_REQUIRE_KTLS(); \ 13270ff2a12aSJohn Baldwin seqno = random(); \ 13280ff2a12aSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, \ 13290ff2a12aSJohn Baldwin TLS_MINOR_VER_ZERO, seqno, &en); \ 13300ff2a12aSJohn Baldwin test_ktls_transmit_empty_fragment(&en, seqno); \ 13310ff2a12aSJohn Baldwin free_tls_enable(&en); \ 13320ff2a12aSJohn Baldwin } 13330ff2a12aSJohn Baldwin 13340ff2a12aSJohn Baldwin #define ADD_TRANSMIT_EMPTY_FRAGMENT_TEST(cipher_name, cipher_alg, \ 13350ff2a12aSJohn Baldwin key_size, auth_alg) \ 13360ff2a12aSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_##cipher_name##_empty_fragment); 13370ff2a12aSJohn Baldwin 1338a10482eaSJohn Baldwin #define GEN_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1339a10482eaSJohn Baldwin minor) \ 1340a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1341a10482eaSJohn Baldwin auth_alg, minor, short, 64) \ 1342a10482eaSJohn Baldwin GEN_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1343a10482eaSJohn Baldwin auth_alg, minor, long, 64 * 1024) \ 1344a10482eaSJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 134544265dc3SJohn Baldwin auth_alg, minor, control, 0x21 /* Alert */, 32) 1346a10482eaSJohn Baldwin 1347a10482eaSJohn Baldwin #define ADD_TRANSMIT_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1348a10482eaSJohn Baldwin minor) \ 1349a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1350a10482eaSJohn Baldwin auth_alg, minor, short) \ 1351a10482eaSJohn Baldwin ADD_TRANSMIT_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1352a10482eaSJohn Baldwin auth_alg, minor, long) \ 1353a10482eaSJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 135444265dc3SJohn Baldwin auth_alg, minor, control) 1355a10482eaSJohn Baldwin 1356a10482eaSJohn Baldwin /* 1357a10482eaSJohn Baldwin * For each supported cipher suite, run three transmit tests: 1358a10482eaSJohn Baldwin * 1359a10482eaSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 1360a10482eaSJohn Baldwin * a single TLS record) 1361a10482eaSJohn Baldwin * 1362a10482eaSJohn Baldwin * - a long test which sends 64KB of application data (split across 1363a10482eaSJohn Baldwin * multiple TLS records) 1364a10482eaSJohn Baldwin * 1365a10482eaSJohn Baldwin * - a control test which sends a single record with a specific 1366a10482eaSJohn Baldwin * content type via sendmsg() 1367a10482eaSJohn Baldwin */ 1368a10482eaSJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_TESTS); 1369a10482eaSJohn Baldwin AES_GCM_TESTS(GEN_TRANSMIT_TESTS); 1370a10482eaSJohn Baldwin CHACHA20_TESTS(GEN_TRANSMIT_TESTS); 1371a10482eaSJohn Baldwin 137244265dc3SJohn Baldwin #define GEN_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 137344265dc3SJohn Baldwin auth_alg, minor) \ 137444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 137544265dc3SJohn Baldwin auth_alg, minor, padding_1, 0x21 /* Alert */, 1) \ 137644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 137744265dc3SJohn Baldwin auth_alg, minor, padding_2, 0x21 /* Alert */, 2) \ 137844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 137944265dc3SJohn Baldwin auth_alg, minor, padding_3, 0x21 /* Alert */, 3) \ 138044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 138144265dc3SJohn Baldwin auth_alg, minor, padding_4, 0x21 /* Alert */, 4) \ 138244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 138344265dc3SJohn Baldwin auth_alg, minor, padding_5, 0x21 /* Alert */, 5) \ 138444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 138544265dc3SJohn Baldwin auth_alg, minor, padding_6, 0x21 /* Alert */, 6) \ 138644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 138744265dc3SJohn Baldwin auth_alg, minor, padding_7, 0x21 /* Alert */, 7) \ 138844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 138944265dc3SJohn Baldwin auth_alg, minor, padding_8, 0x21 /* Alert */, 8) \ 139044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 139144265dc3SJohn Baldwin auth_alg, minor, padding_9, 0x21 /* Alert */, 9) \ 139244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 139344265dc3SJohn Baldwin auth_alg, minor, padding_10, 0x21 /* Alert */, 10) \ 139444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 139544265dc3SJohn Baldwin auth_alg, minor, padding_11, 0x21 /* Alert */, 11) \ 139644265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 139744265dc3SJohn Baldwin auth_alg, minor, padding_12, 0x21 /* Alert */, 12) \ 139844265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 139944265dc3SJohn Baldwin auth_alg, minor, padding_13, 0x21 /* Alert */, 13) \ 140044265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 140144265dc3SJohn Baldwin auth_alg, minor, padding_14, 0x21 /* Alert */, 14) \ 140244265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 140344265dc3SJohn Baldwin auth_alg, minor, padding_15, 0x21 /* Alert */, 15) \ 140444265dc3SJohn Baldwin GEN_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 140544265dc3SJohn Baldwin auth_alg, minor, padding_16, 0x21 /* Alert */, 16) 140644265dc3SJohn Baldwin 140744265dc3SJohn Baldwin #define ADD_TRANSMIT_PADDING_TESTS(cipher_name, cipher_alg, key_size, \ 140844265dc3SJohn Baldwin auth_alg, minor) \ 140944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 141044265dc3SJohn Baldwin auth_alg, minor, padding_1) \ 141144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 141244265dc3SJohn Baldwin auth_alg, minor, padding_2) \ 141344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 141444265dc3SJohn Baldwin auth_alg, minor, padding_3) \ 141544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 141644265dc3SJohn Baldwin auth_alg, minor, padding_4) \ 141744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 141844265dc3SJohn Baldwin auth_alg, minor, padding_5) \ 141944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 142044265dc3SJohn Baldwin auth_alg, minor, padding_6) \ 142144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 142244265dc3SJohn Baldwin auth_alg, minor, padding_7) \ 142344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 142444265dc3SJohn Baldwin auth_alg, minor, padding_8) \ 142544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 142644265dc3SJohn Baldwin auth_alg, minor, padding_9) \ 142744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 142844265dc3SJohn Baldwin auth_alg, minor, padding_10) \ 142944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 143044265dc3SJohn Baldwin auth_alg, minor, padding_11) \ 143144265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 143244265dc3SJohn Baldwin auth_alg, minor, padding_12) \ 143344265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 143444265dc3SJohn Baldwin auth_alg, minor, padding_13) \ 143544265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 143644265dc3SJohn Baldwin auth_alg, minor, padding_14) \ 143744265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 143844265dc3SJohn Baldwin auth_alg, minor, padding_15) \ 143944265dc3SJohn Baldwin ADD_TRANSMIT_CONTROL_TEST(cipher_name, cipher_alg, key_size, \ 144044265dc3SJohn Baldwin auth_alg, minor, padding_16) 144144265dc3SJohn Baldwin 144244265dc3SJohn Baldwin /* 144344265dc3SJohn Baldwin * For AES-CBC MTE cipher suites using padding, add tests of messages 144444265dc3SJohn Baldwin * with each possible padding size. Note that the padding_<N> tests 144544265dc3SJohn Baldwin * do not necessarily test <N> bytes of padding as the padding is a 144644265dc3SJohn Baldwin * function of the cipher suite's MAC length. However, cycling 144744265dc3SJohn Baldwin * through all of the payload sizes from 1 to 16 should exercise all 144844265dc3SJohn Baldwin * of the possible padding lengths for each suite. 144944265dc3SJohn Baldwin */ 145044265dc3SJohn Baldwin AES_CBC_TESTS(GEN_TRANSMIT_PADDING_TESTS); 145144265dc3SJohn Baldwin 14520ff2a12aSJohn Baldwin /* 14530ff2a12aSJohn Baldwin * Test "empty fragments" which are TLS records with no payload that 14540ff2a12aSJohn Baldwin * OpenSSL can send for TLS 1.0 connections. 14550ff2a12aSJohn Baldwin */ 14560ff2a12aSJohn Baldwin TLS_10_TESTS(GEN_TRANSMIT_EMPTY_FRAGMENT_TEST); 14570ff2a12aSJohn Baldwin 1458d1c369f9SJohn Baldwin static void 1459d1c369f9SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(struct tls_enable *en) 1460d1c369f9SJohn Baldwin { 1461d1c369f9SJohn Baldwin int sockets[2]; 1462d1c369f9SJohn Baldwin 1463d1c369f9SJohn Baldwin ATF_REQUIRE_MSG(socketpair_tcp(sockets), "failed to create sockets"); 1464d1c369f9SJohn Baldwin 1465d1c369f9SJohn Baldwin ATF_REQUIRE(setsockopt(sockets[1], IPPROTO_TCP, TCP_TXTLS_ENABLE, en, 1466d1c369f9SJohn Baldwin sizeof(*en)) == -1); 1467d1c369f9SJohn Baldwin ATF_REQUIRE(errno == EINVAL); 1468d1c369f9SJohn Baldwin 1469d1c369f9SJohn Baldwin close(sockets[1]); 1470d1c369f9SJohn Baldwin close(sockets[0]); 1471d1c369f9SJohn Baldwin } 1472d1c369f9SJohn Baldwin 1473d1c369f9SJohn Baldwin #define GEN_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 1474d1c369f9SJohn Baldwin minor) \ 1475d1c369f9SJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_transmit_invalid_##name); \ 1476d1c369f9SJohn Baldwin ATF_TC_BODY(ktls_transmit_invalid_##name, tc) \ 1477d1c369f9SJohn Baldwin { \ 1478d1c369f9SJohn Baldwin struct tls_enable en; \ 1479d1c369f9SJohn Baldwin uint64_t seqno; \ 1480d1c369f9SJohn Baldwin \ 1481d1c369f9SJohn Baldwin ATF_REQUIRE_KTLS(); \ 1482d1c369f9SJohn Baldwin seqno = random(); \ 1483d1c369f9SJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1484d1c369f9SJohn Baldwin &en); \ 1485d1c369f9SJohn Baldwin test_ktls_invalid_transmit_cipher_suite(&en); \ 1486d1c369f9SJohn Baldwin free_tls_enable(&en); \ 1487d1c369f9SJohn Baldwin } 1488d1c369f9SJohn Baldwin 1489d1c369f9SJohn Baldwin #define ADD_INVALID_TRANSMIT_TEST(name, cipher_alg, key_size, auth_alg, \ 1490d1c369f9SJohn Baldwin minor) \ 1491d1c369f9SJohn Baldwin ATF_TP_ADD_TC(tp, ktls_transmit_invalid_##name); 1492d1c369f9SJohn Baldwin 1493d1c369f9SJohn Baldwin #define INVALID_CIPHER_SUITES(M) \ 1494d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1495d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ZERO) \ 1496d1c369f9SJohn Baldwin M(aes128_cbc_1_0_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1497d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ZERO) \ 1498d1c369f9SJohn Baldwin M(aes128_gcm_1_0, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1499d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 1500d1c369f9SJohn Baldwin M(chacha20_poly1305_1_0, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1501d1c369f9SJohn Baldwin TLS_MINOR_VER_ZERO) \ 1502d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1503d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_ONE) \ 1504d1c369f9SJohn Baldwin M(aes128_cbc_1_1_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1505d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_ONE) \ 1506d1c369f9SJohn Baldwin M(aes128_gcm_1_1, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, \ 1507d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 1508d1c369f9SJohn Baldwin M(chacha20_poly1305_1_1, CRYPTO_CHACHA20_POLY1305, 256 / 8, 0, \ 1509d1c369f9SJohn Baldwin TLS_MINOR_VER_ONE) \ 1510d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha1, CRYPTO_AES_CBC, 128 / 8, \ 1511d1c369f9SJohn Baldwin CRYPTO_SHA1_HMAC, TLS_MINOR_VER_THREE) \ 1512d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha256, CRYPTO_AES_CBC, 128 / 8, \ 1513d1c369f9SJohn Baldwin CRYPTO_SHA2_256_HMAC, TLS_MINOR_VER_THREE) \ 1514d1c369f9SJohn Baldwin M(aes128_cbc_1_3_sha384, CRYPTO_AES_CBC, 128 / 8, \ 1515d1c369f9SJohn Baldwin CRYPTO_SHA2_384_HMAC, TLS_MINOR_VER_THREE) 1516d1c369f9SJohn Baldwin 1517d1c369f9SJohn Baldwin /* 1518d1c369f9SJohn Baldwin * Ensure that invalid cipher suites are rejected for transmit. 1519d1c369f9SJohn Baldwin */ 1520d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(GEN_INVALID_TRANSMIT_TEST); 1521d1c369f9SJohn Baldwin 1522*3e7f8a8dSJohn Baldwin #define GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1523*3e7f8a8dSJohn Baldwin auth_alg, minor, name, len) \ 1524*3e7f8a8dSJohn Baldwin ATF_TC_WITHOUT_HEAD(ktls_receive_##cipher_name##_##name); \ 1525*3e7f8a8dSJohn Baldwin ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ 1526*3e7f8a8dSJohn Baldwin { \ 1527*3e7f8a8dSJohn Baldwin struct tls_enable en; \ 1528*3e7f8a8dSJohn Baldwin uint64_t seqno; \ 1529*3e7f8a8dSJohn Baldwin \ 1530*3e7f8a8dSJohn Baldwin ATF_REQUIRE_KTLS(); \ 1531*3e7f8a8dSJohn Baldwin seqno = random(); \ 1532*3e7f8a8dSJohn Baldwin build_tls_enable(cipher_alg, key_size, auth_alg, minor, seqno, \ 1533*3e7f8a8dSJohn Baldwin &en); \ 1534*3e7f8a8dSJohn Baldwin test_ktls_receive_app_data(&en, seqno, len); \ 1535*3e7f8a8dSJohn Baldwin free_tls_enable(&en); \ 1536*3e7f8a8dSJohn Baldwin } 1537*3e7f8a8dSJohn Baldwin 1538*3e7f8a8dSJohn Baldwin #define ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1539*3e7f8a8dSJohn Baldwin auth_alg, minor, name) \ 1540*3e7f8a8dSJohn Baldwin ATF_TP_ADD_TC(tp, ktls_receive_##cipher_name##_##name); 1541*3e7f8a8dSJohn Baldwin 1542*3e7f8a8dSJohn Baldwin #define GEN_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1543*3e7f8a8dSJohn Baldwin minor) \ 1544*3e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1545*3e7f8a8dSJohn Baldwin auth_alg, minor, short, 64) \ 1546*3e7f8a8dSJohn Baldwin GEN_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1547*3e7f8a8dSJohn Baldwin auth_alg, minor, long, 64 * 1024) 1548*3e7f8a8dSJohn Baldwin 1549*3e7f8a8dSJohn Baldwin #define ADD_RECEIVE_TESTS(cipher_name, cipher_alg, key_size, auth_alg, \ 1550*3e7f8a8dSJohn Baldwin minor) \ 1551*3e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1552*3e7f8a8dSJohn Baldwin auth_alg, minor, short) \ 1553*3e7f8a8dSJohn Baldwin ADD_RECEIVE_APP_DATA_TEST(cipher_name, cipher_alg, key_size, \ 1554*3e7f8a8dSJohn Baldwin auth_alg, minor, long) 1555*3e7f8a8dSJohn Baldwin 1556*3e7f8a8dSJohn Baldwin /* 1557*3e7f8a8dSJohn Baldwin * For each supported cipher suite, run two receive tests: 1558*3e7f8a8dSJohn Baldwin * 1559*3e7f8a8dSJohn Baldwin * - a short test which sends 64 bytes of application data (likely as 1560*3e7f8a8dSJohn Baldwin * a single TLS record) 1561*3e7f8a8dSJohn Baldwin * 1562*3e7f8a8dSJohn Baldwin * - a long test which sends 64KB of application data (split across 1563*3e7f8a8dSJohn Baldwin * multiple TLS records) 1564*3e7f8a8dSJohn Baldwin * 1565*3e7f8a8dSJohn Baldwin * Note that receive is currently only supported for TLS 1.2 AEAD 1566*3e7f8a8dSJohn Baldwin * cipher suites. 1567*3e7f8a8dSJohn Baldwin */ 1568*3e7f8a8dSJohn Baldwin TLS_12_TESTS(GEN_RECEIVE_TESTS); 1569*3e7f8a8dSJohn Baldwin 1570a10482eaSJohn Baldwin ATF_TP_ADD_TCS(tp) 1571a10482eaSJohn Baldwin { 1572*3e7f8a8dSJohn Baldwin /* Transmit tests */ 1573a10482eaSJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_TESTS); 1574a10482eaSJohn Baldwin AES_GCM_TESTS(ADD_TRANSMIT_TESTS); 1575a10482eaSJohn Baldwin CHACHA20_TESTS(ADD_TRANSMIT_TESTS); 157644265dc3SJohn Baldwin AES_CBC_TESTS(ADD_TRANSMIT_PADDING_TESTS); 15770ff2a12aSJohn Baldwin TLS_10_TESTS(ADD_TRANSMIT_EMPTY_FRAGMENT_TEST); 1578d1c369f9SJohn Baldwin INVALID_CIPHER_SUITES(ADD_INVALID_TRANSMIT_TEST); 1579a10482eaSJohn Baldwin 1580*3e7f8a8dSJohn Baldwin /* Receive tests */ 1581*3e7f8a8dSJohn Baldwin TLS_12_TESTS(ADD_RECEIVE_TESTS); 1582a10482eaSJohn Baldwin return (atf_no_error()); 1583a10482eaSJohn Baldwin } 1584