1aa906e2aSJohn Baldwin /* 2aa906e2aSJohn Baldwin * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. 3aa906e2aSJohn Baldwin * 4aa906e2aSJohn Baldwin * Licensed under the Apache License 2.0 (the "License"). You may not use 5aa906e2aSJohn Baldwin * this file except in compliance with the License. You can obtain a copy 6aa906e2aSJohn Baldwin * in the file LICENSE in the source distribution or at 7aa906e2aSJohn Baldwin * https://www.openssl.org/source/license.html 8aa906e2aSJohn Baldwin */ 9aa906e2aSJohn Baldwin 10aa906e2aSJohn Baldwin #if defined(OPENSSL_SYS_LINUX) 11aa906e2aSJohn Baldwin # ifndef OPENSSL_NO_KTLS 12aa906e2aSJohn Baldwin # include <linux/version.h> 13aa906e2aSJohn Baldwin # if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0) 14aa906e2aSJohn Baldwin # define OPENSSL_NO_KTLS 15aa906e2aSJohn Baldwin # ifndef PEDANTIC 16aa906e2aSJohn Baldwin # warning "KTLS requires Kernel Headers >= 4.13.0" 17aa906e2aSJohn Baldwin # warning "Skipping Compilation of KTLS" 18aa906e2aSJohn Baldwin # endif 19aa906e2aSJohn Baldwin # endif 20aa906e2aSJohn Baldwin # endif 21aa906e2aSJohn Baldwin #endif 22aa906e2aSJohn Baldwin 23aa906e2aSJohn Baldwin #ifndef HEADER_INTERNAL_KTLS 24aa906e2aSJohn Baldwin # define HEADER_INTERNAL_KTLS 25aa906e2aSJohn Baldwin # ifndef OPENSSL_NO_KTLS 26aa906e2aSJohn Baldwin 27aa906e2aSJohn Baldwin # if defined(__FreeBSD__) 28aa906e2aSJohn Baldwin # include <sys/types.h> 29aa906e2aSJohn Baldwin # include <sys/socket.h> 30aa906e2aSJohn Baldwin # include <sys/ktls.h> 31aa906e2aSJohn Baldwin # include <netinet/in.h> 32aa906e2aSJohn Baldwin # include <netinet/tcp.h> 33aa906e2aSJohn Baldwin # include "openssl/ssl3.h" 34aa906e2aSJohn Baldwin 35aa906e2aSJohn Baldwin # ifndef TCP_RXTLS_ENABLE 36aa906e2aSJohn Baldwin # define OPENSSL_NO_KTLS_RX 37aa906e2aSJohn Baldwin # endif 38aa906e2aSJohn Baldwin # define OPENSSL_KTLS_AES_GCM_128 39aa906e2aSJohn Baldwin # define OPENSSL_KTLS_AES_GCM_256 40aa906e2aSJohn Baldwin # define OPENSSL_KTLS_TLS13 41aa906e2aSJohn Baldwin 42aa906e2aSJohn Baldwin /* 43aa906e2aSJohn Baldwin * Only used by the tests in sslapitest.c. 44aa906e2aSJohn Baldwin */ 45aa906e2aSJohn Baldwin # define TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE 8 46aa906e2aSJohn Baldwin # define TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE 8 47aa906e2aSJohn Baldwin 48aa906e2aSJohn Baldwin typedef struct tls_enable ktls_crypto_info_t; 49aa906e2aSJohn Baldwin 50aa906e2aSJohn Baldwin /* 51aa906e2aSJohn Baldwin * FreeBSD does not require any additional steps to enable KTLS before 52aa906e2aSJohn Baldwin * setting keys. 53aa906e2aSJohn Baldwin */ 54aa906e2aSJohn Baldwin static ossl_inline int ktls_enable(int fd) 55aa906e2aSJohn Baldwin { 56aa906e2aSJohn Baldwin return 1; 57aa906e2aSJohn Baldwin } 58aa906e2aSJohn Baldwin 59aa906e2aSJohn Baldwin /* 60aa906e2aSJohn Baldwin * The TCP_TXTLS_ENABLE socket option marks the outgoing socket buffer 61aa906e2aSJohn Baldwin * as using TLS. If successful, then data sent using this socket will 62aa906e2aSJohn Baldwin * be encrypted and encapsulated in TLS records using the tls_en 63aa906e2aSJohn Baldwin * provided here. 64aa906e2aSJohn Baldwin * 65aa906e2aSJohn Baldwin * The TCP_RXTLS_ENABLE socket option marks the incoming socket buffer 66aa906e2aSJohn Baldwin * as using TLS. If successful, then data received for this socket will 67aa906e2aSJohn Baldwin * be authenticated and decrypted using the tls_en provided here. 68aa906e2aSJohn Baldwin */ 69aa906e2aSJohn Baldwin static ossl_inline int ktls_start(int fd, ktls_crypto_info_t *tls_en, int is_tx) 70aa906e2aSJohn Baldwin { 71aa906e2aSJohn Baldwin if (is_tx) 72aa906e2aSJohn Baldwin return setsockopt(fd, IPPROTO_TCP, TCP_TXTLS_ENABLE, 73aa906e2aSJohn Baldwin tls_en, sizeof(*tls_en)) ? 0 : 1; 74aa906e2aSJohn Baldwin # ifndef OPENSSL_NO_KTLS_RX 75aa906e2aSJohn Baldwin return setsockopt(fd, IPPROTO_TCP, TCP_RXTLS_ENABLE, tls_en, 76aa906e2aSJohn Baldwin sizeof(*tls_en)) ? 0 : 1; 77aa906e2aSJohn Baldwin # else 78aa906e2aSJohn Baldwin return 0; 79aa906e2aSJohn Baldwin # endif 80aa906e2aSJohn Baldwin } 81aa906e2aSJohn Baldwin 82aa906e2aSJohn Baldwin /* 83aa906e2aSJohn Baldwin * Send a TLS record using the tls_en provided in ktls_start and use 84aa906e2aSJohn Baldwin * record_type instead of the default SSL3_RT_APPLICATION_DATA. 85aa906e2aSJohn Baldwin * When the socket is non-blocking, then this call either returns EAGAIN or 86aa906e2aSJohn Baldwin * the entire record is pushed to TCP. It is impossible to send a partial 87aa906e2aSJohn Baldwin * record using this control message. 88aa906e2aSJohn Baldwin */ 89aa906e2aSJohn Baldwin static ossl_inline int ktls_send_ctrl_message(int fd, unsigned char record_type, 90aa906e2aSJohn Baldwin const void *data, size_t length) 91aa906e2aSJohn Baldwin { 92aa906e2aSJohn Baldwin struct msghdr msg = { 0 }; 93aa906e2aSJohn Baldwin int cmsg_len = sizeof(record_type); 94aa906e2aSJohn Baldwin struct cmsghdr *cmsg; 95aa906e2aSJohn Baldwin char buf[CMSG_SPACE(cmsg_len)]; 96aa906e2aSJohn Baldwin struct iovec msg_iov; /* Vector of data to send/receive into */ 97aa906e2aSJohn Baldwin 98aa906e2aSJohn Baldwin msg.msg_control = buf; 99aa906e2aSJohn Baldwin msg.msg_controllen = sizeof(buf); 100aa906e2aSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 101aa906e2aSJohn Baldwin cmsg->cmsg_level = IPPROTO_TCP; 102aa906e2aSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 103aa906e2aSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(cmsg_len); 104aa906e2aSJohn Baldwin *((unsigned char *)CMSG_DATA(cmsg)) = record_type; 105aa906e2aSJohn Baldwin msg.msg_controllen = cmsg->cmsg_len; 106aa906e2aSJohn Baldwin 107aa906e2aSJohn Baldwin msg_iov.iov_base = (void *)data; 108aa906e2aSJohn Baldwin msg_iov.iov_len = length; 109aa906e2aSJohn Baldwin msg.msg_iov = &msg_iov; 110aa906e2aSJohn Baldwin msg.msg_iovlen = 1; 111aa906e2aSJohn Baldwin 112aa906e2aSJohn Baldwin return sendmsg(fd, &msg, 0); 113aa906e2aSJohn Baldwin } 114aa906e2aSJohn Baldwin 115aa906e2aSJohn Baldwin # ifdef OPENSSL_NO_KTLS_RX 116aa906e2aSJohn Baldwin 117aa906e2aSJohn Baldwin static ossl_inline int ktls_read_record(int fd, void *data, size_t length) 118aa906e2aSJohn Baldwin { 119aa906e2aSJohn Baldwin return -1; 120aa906e2aSJohn Baldwin } 121aa906e2aSJohn Baldwin 122aa906e2aSJohn Baldwin # else /* !defined(OPENSSL_NO_KTLS_RX) */ 123aa906e2aSJohn Baldwin 124aa906e2aSJohn Baldwin /* 125aa906e2aSJohn Baldwin * Receive a TLS record using the tls_en provided in ktls_start. The 126aa906e2aSJohn Baldwin * kernel strips any explicit IV and authentication tag, but provides 127aa906e2aSJohn Baldwin * the TLS record header via a control message. If there is an error 128aa906e2aSJohn Baldwin * with the TLS record such as an invalid header, invalid padding, or 129aa906e2aSJohn Baldwin * authentication failure recvmsg() will fail with an error. 130aa906e2aSJohn Baldwin */ 131aa906e2aSJohn Baldwin static ossl_inline int ktls_read_record(int fd, void *data, size_t length) 132aa906e2aSJohn Baldwin { 133aa906e2aSJohn Baldwin struct msghdr msg = { 0 }; 134aa906e2aSJohn Baldwin int cmsg_len = sizeof(struct tls_get_record); 135aa906e2aSJohn Baldwin struct tls_get_record *tgr; 136aa906e2aSJohn Baldwin struct cmsghdr *cmsg; 137aa906e2aSJohn Baldwin char buf[CMSG_SPACE(cmsg_len)]; 138aa906e2aSJohn Baldwin struct iovec msg_iov; /* Vector of data to send/receive into */ 139aa906e2aSJohn Baldwin int ret; 140aa906e2aSJohn Baldwin unsigned char *p = data; 141aa906e2aSJohn Baldwin const size_t prepend_length = SSL3_RT_HEADER_LENGTH; 142aa906e2aSJohn Baldwin 143aa906e2aSJohn Baldwin if (length <= prepend_length) { 144aa906e2aSJohn Baldwin errno = EINVAL; 145aa906e2aSJohn Baldwin return -1; 146aa906e2aSJohn Baldwin } 147aa906e2aSJohn Baldwin 148aa906e2aSJohn Baldwin msg.msg_control = buf; 149aa906e2aSJohn Baldwin msg.msg_controllen = sizeof(buf); 150aa906e2aSJohn Baldwin 151aa906e2aSJohn Baldwin msg_iov.iov_base = p + prepend_length; 152aa906e2aSJohn Baldwin msg_iov.iov_len = length - prepend_length; 153aa906e2aSJohn Baldwin msg.msg_iov = &msg_iov; 154aa906e2aSJohn Baldwin msg.msg_iovlen = 1; 155aa906e2aSJohn Baldwin 156aa906e2aSJohn Baldwin ret = recvmsg(fd, &msg, 0); 157aa906e2aSJohn Baldwin if (ret <= 0) 158aa906e2aSJohn Baldwin return ret; 159aa906e2aSJohn Baldwin 160aa906e2aSJohn Baldwin if ((msg.msg_flags & (MSG_EOR | MSG_CTRUNC)) != MSG_EOR) { 161aa906e2aSJohn Baldwin errno = EMSGSIZE; 162aa906e2aSJohn Baldwin return -1; 163aa906e2aSJohn Baldwin } 164aa906e2aSJohn Baldwin 165aa906e2aSJohn Baldwin if (msg.msg_controllen == 0) { 166aa906e2aSJohn Baldwin errno = EBADMSG; 167aa906e2aSJohn Baldwin return -1; 168aa906e2aSJohn Baldwin } 169aa906e2aSJohn Baldwin 170aa906e2aSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 171aa906e2aSJohn Baldwin if (cmsg->cmsg_level != IPPROTO_TCP || cmsg->cmsg_type != TLS_GET_RECORD 172aa906e2aSJohn Baldwin || cmsg->cmsg_len != CMSG_LEN(cmsg_len)) { 173aa906e2aSJohn Baldwin errno = EBADMSG; 174aa906e2aSJohn Baldwin return -1; 175aa906e2aSJohn Baldwin } 176aa906e2aSJohn Baldwin 177aa906e2aSJohn Baldwin tgr = (struct tls_get_record *)CMSG_DATA(cmsg); 178aa906e2aSJohn Baldwin p[0] = tgr->tls_type; 179aa906e2aSJohn Baldwin p[1] = tgr->tls_vmajor; 180aa906e2aSJohn Baldwin p[2] = tgr->tls_vminor; 181aa906e2aSJohn Baldwin *(uint16_t *)(p + 3) = htons(ret); 182aa906e2aSJohn Baldwin 183aa906e2aSJohn Baldwin return ret + prepend_length; 184aa906e2aSJohn Baldwin } 185aa906e2aSJohn Baldwin 186aa906e2aSJohn Baldwin # endif /* OPENSSL_NO_KTLS_RX */ 187aa906e2aSJohn Baldwin 188aa906e2aSJohn Baldwin /* 189aa906e2aSJohn Baldwin * KTLS enables the sendfile system call to send data from a file over 190aa906e2aSJohn Baldwin * TLS. 191aa906e2aSJohn Baldwin */ 192aa906e2aSJohn Baldwin static ossl_inline ossl_ssize_t ktls_sendfile(int s, int fd, off_t off, 193aa906e2aSJohn Baldwin size_t size, int flags) 194aa906e2aSJohn Baldwin { 195*9b2f020cSOleksandr Tymoshenko off_t sbytes = 0; 196aa906e2aSJohn Baldwin int ret; 197aa906e2aSJohn Baldwin 198aa906e2aSJohn Baldwin ret = sendfile(fd, s, off, size, NULL, &sbytes, flags); 199*9b2f020cSOleksandr Tymoshenko if (ret == -1 && sbytes == 0) 200aa906e2aSJohn Baldwin return -1; 201aa906e2aSJohn Baldwin return sbytes; 202aa906e2aSJohn Baldwin } 203aa906e2aSJohn Baldwin 204aa906e2aSJohn Baldwin # endif /* __FreeBSD__ */ 205aa906e2aSJohn Baldwin 206aa906e2aSJohn Baldwin # if defined(OPENSSL_SYS_LINUX) 207aa906e2aSJohn Baldwin 208aa906e2aSJohn Baldwin # include <linux/tls.h> 209aa906e2aSJohn Baldwin # if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) 210aa906e2aSJohn Baldwin # define OPENSSL_NO_KTLS_RX 211aa906e2aSJohn Baldwin # ifndef PEDANTIC 212aa906e2aSJohn Baldwin # warning "KTLS requires Kernel Headers >= 4.17.0 for receiving" 213aa906e2aSJohn Baldwin # warning "Skipping Compilation of KTLS receive data path" 214aa906e2aSJohn Baldwin # endif 215aa906e2aSJohn Baldwin # endif 216aa906e2aSJohn Baldwin # define OPENSSL_KTLS_AES_GCM_128 217aa906e2aSJohn Baldwin # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) 218aa906e2aSJohn Baldwin # define OPENSSL_KTLS_AES_GCM_256 219aa906e2aSJohn Baldwin # define OPENSSL_KTLS_TLS13 220aa906e2aSJohn Baldwin # if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) 221aa906e2aSJohn Baldwin # define OPENSSL_KTLS_AES_CCM_128 222aa906e2aSJohn Baldwin # endif 223aa906e2aSJohn Baldwin # endif 224aa906e2aSJohn Baldwin 225aa906e2aSJohn Baldwin # include <sys/sendfile.h> 226aa906e2aSJohn Baldwin # include <netinet/tcp.h> 227aa906e2aSJohn Baldwin # include <linux/socket.h> 228aa906e2aSJohn Baldwin # include "openssl/ssl3.h" 229aa906e2aSJohn Baldwin # include "openssl/tls1.h" 230aa906e2aSJohn Baldwin # include "openssl/evp.h" 231aa906e2aSJohn Baldwin 232aa906e2aSJohn Baldwin # ifndef SOL_TLS 233aa906e2aSJohn Baldwin # define SOL_TLS 282 234aa906e2aSJohn Baldwin # endif 235aa906e2aSJohn Baldwin 236aa906e2aSJohn Baldwin # ifndef TCP_ULP 237aa906e2aSJohn Baldwin # define TCP_ULP 31 238aa906e2aSJohn Baldwin # endif 239aa906e2aSJohn Baldwin 240aa906e2aSJohn Baldwin # ifndef TLS_RX 241aa906e2aSJohn Baldwin # define TLS_RX 2 242aa906e2aSJohn Baldwin # endif 243aa906e2aSJohn Baldwin 244aa906e2aSJohn Baldwin struct tls_crypto_info_all { 245aa906e2aSJohn Baldwin union { 246aa906e2aSJohn Baldwin # ifdef OPENSSL_KTLS_AES_GCM_128 247aa906e2aSJohn Baldwin struct tls12_crypto_info_aes_gcm_128 gcm128; 248aa906e2aSJohn Baldwin # endif 249aa906e2aSJohn Baldwin # ifdef OPENSSL_KTLS_AES_GCM_256 250aa906e2aSJohn Baldwin struct tls12_crypto_info_aes_gcm_256 gcm256; 251aa906e2aSJohn Baldwin # endif 252aa906e2aSJohn Baldwin # ifdef OPENSSL_KTLS_AES_CCM_128 253aa906e2aSJohn Baldwin struct tls12_crypto_info_aes_ccm_128 ccm128; 254aa906e2aSJohn Baldwin # endif 255aa906e2aSJohn Baldwin }; 256aa906e2aSJohn Baldwin size_t tls_crypto_info_len; 257aa906e2aSJohn Baldwin }; 258aa906e2aSJohn Baldwin 259aa906e2aSJohn Baldwin typedef struct tls_crypto_info_all ktls_crypto_info_t; 260aa906e2aSJohn Baldwin 261aa906e2aSJohn Baldwin /* 262aa906e2aSJohn Baldwin * When successful, this socket option doesn't change the behaviour of the 263aa906e2aSJohn Baldwin * TCP socket, except changing the TCP setsockopt handler to enable the 264aa906e2aSJohn Baldwin * processing of SOL_TLS socket options. All other functionality remains the 265aa906e2aSJohn Baldwin * same. 266aa906e2aSJohn Baldwin */ 267aa906e2aSJohn Baldwin static ossl_inline int ktls_enable(int fd) 268aa906e2aSJohn Baldwin { 269aa906e2aSJohn Baldwin return setsockopt(fd, SOL_TCP, TCP_ULP, "tls", sizeof("tls")) ? 0 : 1; 270aa906e2aSJohn Baldwin } 271aa906e2aSJohn Baldwin 272aa906e2aSJohn Baldwin /* 273aa906e2aSJohn Baldwin * The TLS_TX socket option changes the send/sendmsg handlers of the TCP socket. 274aa906e2aSJohn Baldwin * If successful, then data sent using this socket will be encrypted and 275aa906e2aSJohn Baldwin * encapsulated in TLS records using the crypto_info provided here. 276aa906e2aSJohn Baldwin * The TLS_RX socket option changes the recv/recvmsg handlers of the TCP socket. 277aa906e2aSJohn Baldwin * If successful, then data received using this socket will be decrypted, 278aa906e2aSJohn Baldwin * authenticated and decapsulated using the crypto_info provided here. 279aa906e2aSJohn Baldwin */ 280aa906e2aSJohn Baldwin static ossl_inline int ktls_start(int fd, ktls_crypto_info_t *crypto_info, 281aa906e2aSJohn Baldwin int is_tx) 282aa906e2aSJohn Baldwin { 283aa906e2aSJohn Baldwin return setsockopt(fd, SOL_TLS, is_tx ? TLS_TX : TLS_RX, 284aa906e2aSJohn Baldwin crypto_info, crypto_info->tls_crypto_info_len) ? 0 : 1; 285aa906e2aSJohn Baldwin } 286aa906e2aSJohn Baldwin 287aa906e2aSJohn Baldwin /* 288aa906e2aSJohn Baldwin * Send a TLS record using the crypto_info provided in ktls_start and use 289aa906e2aSJohn Baldwin * record_type instead of the default SSL3_RT_APPLICATION_DATA. 290aa906e2aSJohn Baldwin * When the socket is non-blocking, then this call either returns EAGAIN or 291aa906e2aSJohn Baldwin * the entire record is pushed to TCP. It is impossible to send a partial 292aa906e2aSJohn Baldwin * record using this control message. 293aa906e2aSJohn Baldwin */ 294aa906e2aSJohn Baldwin static ossl_inline int ktls_send_ctrl_message(int fd, unsigned char record_type, 295aa906e2aSJohn Baldwin const void *data, size_t length) 296aa906e2aSJohn Baldwin { 297aa906e2aSJohn Baldwin struct msghdr msg; 298aa906e2aSJohn Baldwin int cmsg_len = sizeof(record_type); 299aa906e2aSJohn Baldwin struct cmsghdr *cmsg; 300aa906e2aSJohn Baldwin union { 301aa906e2aSJohn Baldwin struct cmsghdr hdr; 302aa906e2aSJohn Baldwin char buf[CMSG_SPACE(sizeof(unsigned char))]; 303aa906e2aSJohn Baldwin } cmsgbuf; 304aa906e2aSJohn Baldwin struct iovec msg_iov; /* Vector of data to send/receive into */ 305aa906e2aSJohn Baldwin 306aa906e2aSJohn Baldwin memset(&msg, 0, sizeof(msg)); 307aa906e2aSJohn Baldwin msg.msg_control = cmsgbuf.buf; 308aa906e2aSJohn Baldwin msg.msg_controllen = sizeof(cmsgbuf.buf); 309aa906e2aSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 310aa906e2aSJohn Baldwin cmsg->cmsg_level = SOL_TLS; 311aa906e2aSJohn Baldwin cmsg->cmsg_type = TLS_SET_RECORD_TYPE; 312aa906e2aSJohn Baldwin cmsg->cmsg_len = CMSG_LEN(cmsg_len); 313aa906e2aSJohn Baldwin *((unsigned char *)CMSG_DATA(cmsg)) = record_type; 314aa906e2aSJohn Baldwin msg.msg_controllen = cmsg->cmsg_len; 315aa906e2aSJohn Baldwin 316aa906e2aSJohn Baldwin msg_iov.iov_base = (void *)data; 317aa906e2aSJohn Baldwin msg_iov.iov_len = length; 318aa906e2aSJohn Baldwin msg.msg_iov = &msg_iov; 319aa906e2aSJohn Baldwin msg.msg_iovlen = 1; 320aa906e2aSJohn Baldwin 321aa906e2aSJohn Baldwin return sendmsg(fd, &msg, 0); 322aa906e2aSJohn Baldwin } 323aa906e2aSJohn Baldwin 324aa906e2aSJohn Baldwin /* 325aa906e2aSJohn Baldwin * KTLS enables the sendfile system call to send data from a file over TLS. 326aa906e2aSJohn Baldwin * @flags are ignored on Linux. (placeholder for FreeBSD sendfile) 327aa906e2aSJohn Baldwin * */ 328aa906e2aSJohn Baldwin static ossl_inline ossl_ssize_t ktls_sendfile(int s, int fd, off_t off, size_t size, int flags) 329aa906e2aSJohn Baldwin { 330aa906e2aSJohn Baldwin return sendfile(s, fd, &off, size); 331aa906e2aSJohn Baldwin } 332aa906e2aSJohn Baldwin 333aa906e2aSJohn Baldwin # ifdef OPENSSL_NO_KTLS_RX 334aa906e2aSJohn Baldwin 335aa906e2aSJohn Baldwin 336aa906e2aSJohn Baldwin static ossl_inline int ktls_read_record(int fd, void *data, size_t length) 337aa906e2aSJohn Baldwin { 338aa906e2aSJohn Baldwin return -1; 339aa906e2aSJohn Baldwin } 340aa906e2aSJohn Baldwin 341aa906e2aSJohn Baldwin # else /* !defined(OPENSSL_NO_KTLS_RX) */ 342aa906e2aSJohn Baldwin 343aa906e2aSJohn Baldwin /* 344aa906e2aSJohn Baldwin * Receive a TLS record using the crypto_info provided in ktls_start. 345aa906e2aSJohn Baldwin * The kernel strips the TLS record header, IV and authentication tag, 346aa906e2aSJohn Baldwin * returning only the plaintext data or an error on failure. 347aa906e2aSJohn Baldwin * We add the TLS record header here to satisfy routines in rec_layer_s3.c 348aa906e2aSJohn Baldwin */ 349aa906e2aSJohn Baldwin static ossl_inline int ktls_read_record(int fd, void *data, size_t length) 350aa906e2aSJohn Baldwin { 351aa906e2aSJohn Baldwin struct msghdr msg; 352aa906e2aSJohn Baldwin struct cmsghdr *cmsg; 353aa906e2aSJohn Baldwin union { 354aa906e2aSJohn Baldwin struct cmsghdr hdr; 355aa906e2aSJohn Baldwin char buf[CMSG_SPACE(sizeof(unsigned char))]; 356aa906e2aSJohn Baldwin } cmsgbuf; 357aa906e2aSJohn Baldwin struct iovec msg_iov; 358aa906e2aSJohn Baldwin int ret; 359aa906e2aSJohn Baldwin unsigned char *p = data; 360aa906e2aSJohn Baldwin const size_t prepend_length = SSL3_RT_HEADER_LENGTH; 361aa906e2aSJohn Baldwin 362aa906e2aSJohn Baldwin if (length < prepend_length + EVP_GCM_TLS_TAG_LEN) { 363aa906e2aSJohn Baldwin errno = EINVAL; 364aa906e2aSJohn Baldwin return -1; 365aa906e2aSJohn Baldwin } 366aa906e2aSJohn Baldwin 367aa906e2aSJohn Baldwin memset(&msg, 0, sizeof(msg)); 368aa906e2aSJohn Baldwin msg.msg_control = cmsgbuf.buf; 369aa906e2aSJohn Baldwin msg.msg_controllen = sizeof(cmsgbuf.buf); 370aa906e2aSJohn Baldwin 371aa906e2aSJohn Baldwin msg_iov.iov_base = p + prepend_length; 372aa906e2aSJohn Baldwin msg_iov.iov_len = length - prepend_length - EVP_GCM_TLS_TAG_LEN; 373aa906e2aSJohn Baldwin msg.msg_iov = &msg_iov; 374aa906e2aSJohn Baldwin msg.msg_iovlen = 1; 375aa906e2aSJohn Baldwin 376aa906e2aSJohn Baldwin ret = recvmsg(fd, &msg, 0); 377aa906e2aSJohn Baldwin if (ret < 0) 378aa906e2aSJohn Baldwin return ret; 379aa906e2aSJohn Baldwin 380aa906e2aSJohn Baldwin if (msg.msg_controllen > 0) { 381aa906e2aSJohn Baldwin cmsg = CMSG_FIRSTHDR(&msg); 382aa906e2aSJohn Baldwin if (cmsg->cmsg_type == TLS_GET_RECORD_TYPE) { 383aa906e2aSJohn Baldwin p[0] = *((unsigned char *)CMSG_DATA(cmsg)); 384aa906e2aSJohn Baldwin p[1] = TLS1_2_VERSION_MAJOR; 385aa906e2aSJohn Baldwin p[2] = TLS1_2_VERSION_MINOR; 386aa906e2aSJohn Baldwin /* returned length is limited to msg_iov.iov_len above */ 387aa906e2aSJohn Baldwin p[3] = (ret >> 8) & 0xff; 388aa906e2aSJohn Baldwin p[4] = ret & 0xff; 389aa906e2aSJohn Baldwin ret += prepend_length; 390aa906e2aSJohn Baldwin } 391aa906e2aSJohn Baldwin } 392aa906e2aSJohn Baldwin 393aa906e2aSJohn Baldwin return ret; 394aa906e2aSJohn Baldwin } 395aa906e2aSJohn Baldwin 396aa906e2aSJohn Baldwin # endif /* OPENSSL_NO_KTLS_RX */ 397aa906e2aSJohn Baldwin 398aa906e2aSJohn Baldwin # endif /* OPENSSL_SYS_LINUX */ 399aa906e2aSJohn Baldwin # endif /* OPENSSL_NO_KTLS */ 400aa906e2aSJohn Baldwin #endif /* HEADER_INTERNAL_KTLS */ 401