1b2e60773SJohn Baldwin /*- 2b2e60773SJohn Baldwin * SPDX-License-Identifier: BSD-2-Clause 3b2e60773SJohn Baldwin * 4b2e60773SJohn Baldwin * Copyright (c) 2019 Netflix Inc. 5b2e60773SJohn Baldwin * 6b2e60773SJohn Baldwin * Redistribution and use in source and binary forms, with or without 7b2e60773SJohn Baldwin * modification, are permitted provided that the following conditions 8b2e60773SJohn Baldwin * are met: 9b2e60773SJohn Baldwin * 1. Redistributions of source code must retain the above copyright 10b2e60773SJohn Baldwin * notice, this list of conditions and the following disclaimer. 11b2e60773SJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 12b2e60773SJohn Baldwin * notice, this list of conditions and the following disclaimer in the 13b2e60773SJohn Baldwin * documentation and/or other materials provided with the distribution. 14b2e60773SJohn Baldwin * 15b2e60773SJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16b2e60773SJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17b2e60773SJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18b2e60773SJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 19b2e60773SJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20b2e60773SJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21b2e60773SJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22b2e60773SJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23b2e60773SJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24b2e60773SJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25b2e60773SJohn Baldwin * SUCH DAMAGE. 26b2e60773SJohn Baldwin */ 27b2e60773SJohn Baldwin 28b2e60773SJohn Baldwin #include <sys/cdefs.h> 29b2e60773SJohn Baldwin __FBSDID("$FreeBSD$"); 30b2e60773SJohn Baldwin 31b2e60773SJohn Baldwin #include <sys/param.h> 32b2e60773SJohn Baldwin #include <sys/systm.h> 33b2e60773SJohn Baldwin #include <sys/counter.h> 34b2e60773SJohn Baldwin #include <sys/endian.h> 35b2e60773SJohn Baldwin #include <sys/kernel.h> 36b2e60773SJohn Baldwin #include <sys/ktls.h> 37b2e60773SJohn Baldwin #include <sys/lock.h> 38b2e60773SJohn Baldwin #include <sys/malloc.h> 3921e3c1fbSJohn Baldwin #include <sys/mbuf.h> 40b2e60773SJohn Baldwin #include <sys/module.h> 41b2e60773SJohn Baldwin #include <sys/mutex.h> 42b2e60773SJohn Baldwin #include <sys/sysctl.h> 43b2e60773SJohn Baldwin #include <sys/uio.h> 4421e3c1fbSJohn Baldwin #include <vm/vm.h> 4521e3c1fbSJohn Baldwin #include <vm/pmap.h> 4621e3c1fbSJohn Baldwin #include <vm/vm_param.h> 47b2e60773SJohn Baldwin #include <opencrypto/cryptodev.h> 48470e851cSJohn Baldwin #include <opencrypto/ktls.h> 49b2e60773SJohn Baldwin 50b33ff941SJohn Baldwin struct ktls_ocf_session { 51b2e60773SJohn Baldwin crypto_session_t sid; 5247e2650eSJohn Baldwin crypto_session_t mac_sid; 53b2e60773SJohn Baldwin struct mtx lock; 5421e3c1fbSJohn Baldwin int mac_len; 5547e2650eSJohn Baldwin bool implicit_iv; 5647e2650eSJohn Baldwin 5747e2650eSJohn Baldwin /* Only used for TLS 1.0 with the implicit IV. */ 5847e2650eSJohn Baldwin #ifdef INVARIANTS 5947e2650eSJohn Baldwin bool in_progress; 6047e2650eSJohn Baldwin uint64_t next_seqno; 6147e2650eSJohn Baldwin #endif 6247e2650eSJohn Baldwin char iv[AES_BLOCK_LEN]; 63b2e60773SJohn Baldwin }; 64b2e60773SJohn Baldwin 65b2e60773SJohn Baldwin struct ocf_operation { 66b33ff941SJohn Baldwin struct ktls_ocf_session *os; 67b2e60773SJohn Baldwin bool done; 68b2e60773SJohn Baldwin }; 69b2e60773SJohn Baldwin 70b2e60773SJohn Baldwin static MALLOC_DEFINE(M_KTLS_OCF, "ktls_ocf", "OCF KTLS"); 71b2e60773SJohn Baldwin 72b2e60773SJohn Baldwin SYSCTL_DECL(_kern_ipc_tls); 73b2e60773SJohn Baldwin SYSCTL_DECL(_kern_ipc_tls_stats); 74b2e60773SJohn Baldwin 757029da5cSPawel Biernacki static SYSCTL_NODE(_kern_ipc_tls_stats, OID_AUTO, ocf, 767029da5cSPawel Biernacki CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 7755b7a0e1SJohn Baldwin "Kernel TLS offload via OCF stats"); 7855b7a0e1SJohn Baldwin 7916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls10_cbc_encrypts); 8016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls10_cbc_encrypts, 8116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls10_cbc_encrypts, 8247e2650eSJohn Baldwin "Total number of OCF TLS 1.0 CBC encryption operations"); 8347e2650eSJohn Baldwin 8416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls11_cbc_encrypts); 8516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls11_cbc_encrypts, 8616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls11_cbc_encrypts, 8747e2650eSJohn Baldwin "Total number of OCF TLS 1.1/1.2 CBC encryption operations"); 8847e2650eSJohn Baldwin 8916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_gcm_decrypts); 9016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_gcm_decrypts, 9116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_gcm_decrypts, 9216bea05aSJohn Baldwin "Total number of OCF TLS 1.2 GCM decryption operations"); 9316bea05aSJohn Baldwin 9416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_gcm_encrypts); 9516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_gcm_encrypts, 9616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_gcm_encrypts, 9755b7a0e1SJohn Baldwin "Total number of OCF TLS 1.2 GCM encryption operations"); 9855b7a0e1SJohn Baldwin 9916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_chacha20_decrypts); 10016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_chacha20_decrypts, 10116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_chacha20_decrypts, 10216bea05aSJohn Baldwin "Total number of OCF TLS 1.2 Chacha20-Poly1305 decryption operations"); 10316bea05aSJohn Baldwin 10416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_chacha20_encrypts); 10516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_chacha20_encrypts, 10616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_chacha20_encrypts, 1074dd6800eSJohn Baldwin "Total number of OCF TLS 1.2 Chacha20-Poly1305 encryption operations"); 1084dd6800eSJohn Baldwin 109*05a1d0f5SJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_gcm_decrypts); 110*05a1d0f5SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_gcm_decrypts, 111*05a1d0f5SJohn Baldwin CTLFLAG_RD, &ocf_tls13_gcm_decrypts, 112*05a1d0f5SJohn Baldwin "Total number of OCF TLS 1.3 GCM decryption operations"); 113*05a1d0f5SJohn Baldwin 11416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_gcm_encrypts); 11516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_gcm_encrypts, 11616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls13_gcm_encrypts, 11755b7a0e1SJohn Baldwin "Total number of OCF TLS 1.3 GCM encryption operations"); 118b2e60773SJohn Baldwin 119*05a1d0f5SJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_chacha20_decrypts); 120*05a1d0f5SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_chacha20_decrypts, 121*05a1d0f5SJohn Baldwin CTLFLAG_RD, &ocf_tls13_chacha20_decrypts, 122*05a1d0f5SJohn Baldwin "Total number of OCF TLS 1.3 Chacha20-Poly1305 decryption operations"); 123*05a1d0f5SJohn Baldwin 12416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_chacha20_encrypts); 12516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_chacha20_encrypts, 12616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls13_chacha20_encrypts, 1274dd6800eSJohn Baldwin "Total number of OCF TLS 1.3 Chacha20-Poly1305 encryption operations"); 1284dd6800eSJohn Baldwin 1291755b2b9SMark Johnston static COUNTER_U64_DEFINE_EARLY(ocf_inplace); 130080933c0SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, inplace, 131080933c0SJohn Baldwin CTLFLAG_RD, &ocf_inplace, 132080933c0SJohn Baldwin "Total number of OCF in-place operations"); 133080933c0SJohn Baldwin 1341755b2b9SMark Johnston static COUNTER_U64_DEFINE_EARLY(ocf_separate_output); 135080933c0SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, separate_output, 136080933c0SJohn Baldwin CTLFLAG_RD, &ocf_separate_output, 137080933c0SJohn Baldwin "Total number of OCF operations with a separate output buffer"); 138080933c0SJohn Baldwin 1391755b2b9SMark Johnston static COUNTER_U64_DEFINE_EARLY(ocf_retries); 14055b7a0e1SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, retries, CTLFLAG_RD, 141b2e60773SJohn Baldwin &ocf_retries, 142b2e60773SJohn Baldwin "Number of OCF encryption operation retries"); 143b2e60773SJohn Baldwin 144b2e60773SJohn Baldwin static int 145db6b5644SMark Johnston ktls_ocf_callback_sync(struct cryptop *crp __unused) 146db6b5644SMark Johnston { 147db6b5644SMark Johnston return (0); 148db6b5644SMark Johnston } 149db6b5644SMark Johnston 150db6b5644SMark Johnston static int 151db6b5644SMark Johnston ktls_ocf_callback_async(struct cryptop *crp) 152b2e60773SJohn Baldwin { 153b2e60773SJohn Baldwin struct ocf_operation *oo; 154b2e60773SJohn Baldwin 155b2e60773SJohn Baldwin oo = crp->crp_opaque; 156b2e60773SJohn Baldwin mtx_lock(&oo->os->lock); 157b2e60773SJohn Baldwin oo->done = true; 158b2e60773SJohn Baldwin mtx_unlock(&oo->os->lock); 159b2e60773SJohn Baldwin wakeup(oo); 160b2e60773SJohn Baldwin return (0); 161b2e60773SJohn Baldwin } 162b2e60773SJohn Baldwin 163b2e60773SJohn Baldwin static int 164b33ff941SJohn Baldwin ktls_ocf_dispatch(struct ktls_ocf_session *os, struct cryptop *crp) 16570d1a435SJohn Baldwin { 16670d1a435SJohn Baldwin struct ocf_operation oo; 16770d1a435SJohn Baldwin int error; 168db6b5644SMark Johnston bool async; 16970d1a435SJohn Baldwin 17070d1a435SJohn Baldwin oo.os = os; 17170d1a435SJohn Baldwin oo.done = false; 17270d1a435SJohn Baldwin 17370d1a435SJohn Baldwin crp->crp_opaque = &oo; 17470d1a435SJohn Baldwin for (;;) { 175db6b5644SMark Johnston async = !CRYPTO_SESS_SYNC(crp->crp_session); 176db6b5644SMark Johnston crp->crp_callback = async ? ktls_ocf_callback_async : 177db6b5644SMark Johnston ktls_ocf_callback_sync; 178db6b5644SMark Johnston 17970d1a435SJohn Baldwin error = crypto_dispatch(crp); 18070d1a435SJohn Baldwin if (error) 18170d1a435SJohn Baldwin break; 182db6b5644SMark Johnston if (async) { 18370d1a435SJohn Baldwin mtx_lock(&os->lock); 18470d1a435SJohn Baldwin while (!oo.done) 18570d1a435SJohn Baldwin mtx_sleep(&oo, &os->lock, 0, "ocfktls", 0); 18670d1a435SJohn Baldwin mtx_unlock(&os->lock); 187db6b5644SMark Johnston } 18870d1a435SJohn Baldwin 18970d1a435SJohn Baldwin if (crp->crp_etype != EAGAIN) { 19070d1a435SJohn Baldwin error = crp->crp_etype; 19170d1a435SJohn Baldwin break; 19270d1a435SJohn Baldwin } 19370d1a435SJohn Baldwin 19470d1a435SJohn Baldwin crp->crp_etype = 0; 19570d1a435SJohn Baldwin crp->crp_flags &= ~CRYPTO_F_DONE; 19670d1a435SJohn Baldwin oo.done = false; 19770d1a435SJohn Baldwin counter_u64_add(ocf_retries, 1); 19870d1a435SJohn Baldwin } 19970d1a435SJohn Baldwin return (error); 20070d1a435SJohn Baldwin } 20170d1a435SJohn Baldwin 20270d1a435SJohn Baldwin static int 203470e851cSJohn Baldwin ktls_ocf_dispatch_async_cb(struct cryptop *crp) 204470e851cSJohn Baldwin { 205470e851cSJohn Baldwin struct ktls_ocf_encrypt_state *state; 206470e851cSJohn Baldwin int error; 207470e851cSJohn Baldwin 208470e851cSJohn Baldwin state = crp->crp_opaque; 209470e851cSJohn Baldwin if (crp->crp_etype == EAGAIN) { 210470e851cSJohn Baldwin crp->crp_etype = 0; 211470e851cSJohn Baldwin crp->crp_flags &= ~CRYPTO_F_DONE; 212470e851cSJohn Baldwin counter_u64_add(ocf_retries, 1); 213470e851cSJohn Baldwin error = crypto_dispatch(crp); 214470e851cSJohn Baldwin if (error != 0) { 215470e851cSJohn Baldwin crypto_destroyreq(crp); 216470e851cSJohn Baldwin ktls_encrypt_cb(state, error); 217470e851cSJohn Baldwin } 218470e851cSJohn Baldwin return (0); 219470e851cSJohn Baldwin } 220470e851cSJohn Baldwin 221470e851cSJohn Baldwin error = crp->crp_etype; 222470e851cSJohn Baldwin crypto_destroyreq(crp); 223470e851cSJohn Baldwin ktls_encrypt_cb(state, error); 224470e851cSJohn Baldwin return (0); 225470e851cSJohn Baldwin } 226470e851cSJohn Baldwin 227470e851cSJohn Baldwin static int 228470e851cSJohn Baldwin ktls_ocf_dispatch_async(struct ktls_ocf_encrypt_state *state, 229470e851cSJohn Baldwin struct cryptop *crp) 230470e851cSJohn Baldwin { 231470e851cSJohn Baldwin int error; 232470e851cSJohn Baldwin 233470e851cSJohn Baldwin crp->crp_opaque = state; 234470e851cSJohn Baldwin crp->crp_callback = ktls_ocf_dispatch_async_cb; 235470e851cSJohn Baldwin error = crypto_dispatch(crp); 236470e851cSJohn Baldwin if (error != 0) 237470e851cSJohn Baldwin crypto_destroyreq(crp); 238470e851cSJohn Baldwin return (error); 239470e851cSJohn Baldwin } 240470e851cSJohn Baldwin 241470e851cSJohn Baldwin static int 242470e851cSJohn Baldwin ktls_ocf_tls_cbc_encrypt(struct ktls_ocf_encrypt_state *state, 243470e851cSJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 244470e851cSJohn Baldwin int outiovcnt) 24547e2650eSJohn Baldwin { 24621e3c1fbSJohn Baldwin const struct tls_record_layer *hdr; 247470e851cSJohn Baldwin struct uio *uio; 248470e851cSJohn Baldwin struct tls_mac_data *ad; 249470e851cSJohn Baldwin struct cryptop *crp; 250b33ff941SJohn Baldwin struct ktls_ocf_session *os; 25121e3c1fbSJohn Baldwin struct iovec iov[m->m_epg_npgs + 2]; 25221e3c1fbSJohn Baldwin u_int pgoff; 25347e2650eSJohn Baldwin int i, error; 25447e2650eSJohn Baldwin uint16_t tls_comp_len; 25547e2650eSJohn Baldwin uint8_t pad; 25621e3c1fbSJohn Baldwin 25721e3c1fbSJohn Baldwin MPASS(outiovcnt + 1 <= nitems(iov)); 25847e2650eSJohn Baldwin 259b33ff941SJohn Baldwin os = tls->ocf_session; 26021e3c1fbSJohn Baldwin hdr = (const struct tls_record_layer *)m->m_epg_hdr; 261470e851cSJohn Baldwin crp = &state->crp; 262470e851cSJohn Baldwin uio = &state->uio; 263470e851cSJohn Baldwin MPASS(tls->sync_dispatch); 26447e2650eSJohn Baldwin 26547e2650eSJohn Baldwin #ifdef INVARIANTS 26647e2650eSJohn Baldwin if (os->implicit_iv) { 26747e2650eSJohn Baldwin mtx_lock(&os->lock); 26847e2650eSJohn Baldwin KASSERT(!os->in_progress, 26947e2650eSJohn Baldwin ("concurrent implicit IV encryptions")); 27021e3c1fbSJohn Baldwin if (os->next_seqno != m->m_epg_seqno) { 27147e2650eSJohn Baldwin printf("KTLS CBC: TLS records out of order. " 27247e2650eSJohn Baldwin "Expected %ju, got %ju\n", 27321e3c1fbSJohn Baldwin (uintmax_t)os->next_seqno, 27421e3c1fbSJohn Baldwin (uintmax_t)m->m_epg_seqno); 27547e2650eSJohn Baldwin mtx_unlock(&os->lock); 27647e2650eSJohn Baldwin return (EINVAL); 27747e2650eSJohn Baldwin } 27847e2650eSJohn Baldwin os->in_progress = true; 27947e2650eSJohn Baldwin mtx_unlock(&os->lock); 28047e2650eSJohn Baldwin } 28147e2650eSJohn Baldwin #endif 28247e2650eSJohn Baldwin 28321e3c1fbSJohn Baldwin /* Payload length. */ 28421e3c1fbSJohn Baldwin tls_comp_len = m->m_len - (m->m_epg_hdrlen + m->m_epg_trllen); 28547e2650eSJohn Baldwin 28647e2650eSJohn Baldwin /* Initialize the AAD. */ 287470e851cSJohn Baldwin ad = &state->mac; 288470e851cSJohn Baldwin ad->seq = htobe64(m->m_epg_seqno); 289470e851cSJohn Baldwin ad->type = hdr->tls_type; 290470e851cSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 291470e851cSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 292470e851cSJohn Baldwin ad->tls_length = htons(tls_comp_len); 29347e2650eSJohn Baldwin 29447e2650eSJohn Baldwin /* First, compute the MAC. */ 295470e851cSJohn Baldwin iov[0].iov_base = ad; 296470e851cSJohn Baldwin iov[0].iov_len = sizeof(*ad); 29721e3c1fbSJohn Baldwin pgoff = m->m_epg_1st_off; 29821e3c1fbSJohn Baldwin for (i = 0; i < m->m_epg_npgs; i++, pgoff = 0) { 29921e3c1fbSJohn Baldwin iov[i + 1].iov_base = (void *)PHYS_TO_DMAP(m->m_epg_pa[i] + 30021e3c1fbSJohn Baldwin pgoff); 30121e3c1fbSJohn Baldwin iov[i + 1].iov_len = m_epg_pagelen(m, i, pgoff); 30221e3c1fbSJohn Baldwin } 30321e3c1fbSJohn Baldwin iov[m->m_epg_npgs + 1].iov_base = m->m_epg_trail; 30421e3c1fbSJohn Baldwin iov[m->m_epg_npgs + 1].iov_len = os->mac_len; 305470e851cSJohn Baldwin uio->uio_iov = iov; 306470e851cSJohn Baldwin uio->uio_iovcnt = m->m_epg_npgs + 2; 307470e851cSJohn Baldwin uio->uio_offset = 0; 308470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 309470e851cSJohn Baldwin uio->uio_td = curthread; 310470e851cSJohn Baldwin uio->uio_resid = sizeof(*ad) + tls_comp_len + os->mac_len; 31147e2650eSJohn Baldwin 312470e851cSJohn Baldwin crypto_initreq(crp, os->mac_sid); 313470e851cSJohn Baldwin crp->crp_payload_start = 0; 314470e851cSJohn Baldwin crp->crp_payload_length = sizeof(*ad) + tls_comp_len; 315470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_length; 316470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_COMPUTE_DIGEST; 317470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM; 318470e851cSJohn Baldwin crypto_use_uio(crp, uio); 319470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 32047e2650eSJohn Baldwin 321470e851cSJohn Baldwin crypto_destroyreq(crp); 32247e2650eSJohn Baldwin if (error) { 32347e2650eSJohn Baldwin #ifdef INVARIANTS 32447e2650eSJohn Baldwin if (os->implicit_iv) { 32547e2650eSJohn Baldwin mtx_lock(&os->lock); 32647e2650eSJohn Baldwin os->in_progress = false; 32747e2650eSJohn Baldwin mtx_unlock(&os->lock); 32847e2650eSJohn Baldwin } 32947e2650eSJohn Baldwin #endif 33047e2650eSJohn Baldwin return (error); 33147e2650eSJohn Baldwin } 33247e2650eSJohn Baldwin 33347e2650eSJohn Baldwin /* Second, add the padding. */ 33421e3c1fbSJohn Baldwin pad = m->m_epg_trllen - os->mac_len - 1; 33547e2650eSJohn Baldwin for (i = 0; i < pad + 1; i++) 33621e3c1fbSJohn Baldwin m->m_epg_trail[os->mac_len + i] = pad; 33747e2650eSJohn Baldwin 33847e2650eSJohn Baldwin /* Finally, encrypt the record. */ 339470e851cSJohn Baldwin crypto_initreq(crp, os->sid); 340470e851cSJohn Baldwin crp->crp_payload_start = m->m_epg_hdrlen; 341470e851cSJohn Baldwin crp->crp_payload_length = tls_comp_len + m->m_epg_trllen; 342470e851cSJohn Baldwin KASSERT(crp->crp_payload_length % AES_BLOCK_LEN == 0, 34321e3c1fbSJohn Baldwin ("invalid encryption size")); 344470e851cSJohn Baldwin crypto_use_single_mbuf(crp, m); 345470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_ENCRYPT; 346470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 34747e2650eSJohn Baldwin if (os->implicit_iv) 348470e851cSJohn Baldwin memcpy(crp->crp_iv, os->iv, AES_BLOCK_LEN); 34947e2650eSJohn Baldwin else 350470e851cSJohn Baldwin memcpy(crp->crp_iv, hdr + 1, AES_BLOCK_LEN); 35121e3c1fbSJohn Baldwin 35221e3c1fbSJohn Baldwin if (outiov != NULL) { 353470e851cSJohn Baldwin uio->uio_iov = outiov; 354470e851cSJohn Baldwin uio->uio_iovcnt = outiovcnt; 355470e851cSJohn Baldwin uio->uio_offset = 0; 356470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 357470e851cSJohn Baldwin uio->uio_td = curthread; 358470e851cSJohn Baldwin uio->uio_resid = crp->crp_payload_length; 359470e851cSJohn Baldwin crypto_use_output_uio(crp, uio); 36047e2650eSJohn Baldwin } 36147e2650eSJohn Baldwin 36247e2650eSJohn Baldwin if (os->implicit_iv) 36316bea05aSJohn Baldwin counter_u64_add(ocf_tls10_cbc_encrypts, 1); 36447e2650eSJohn Baldwin else 36516bea05aSJohn Baldwin counter_u64_add(ocf_tls11_cbc_encrypts, 1); 36621e3c1fbSJohn Baldwin if (outiov != NULL) 36747e2650eSJohn Baldwin counter_u64_add(ocf_separate_output, 1); 36821e3c1fbSJohn Baldwin else 36921e3c1fbSJohn Baldwin counter_u64_add(ocf_inplace, 1); 370470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 37147e2650eSJohn Baldwin 372470e851cSJohn Baldwin crypto_destroyreq(crp); 37347e2650eSJohn Baldwin 37447e2650eSJohn Baldwin if (os->implicit_iv) { 37547e2650eSJohn Baldwin KASSERT(os->mac_len + pad + 1 >= AES_BLOCK_LEN, 37647e2650eSJohn Baldwin ("trailer too short to read IV")); 37721e3c1fbSJohn Baldwin memcpy(os->iv, m->m_epg_trail + m->m_epg_trllen - AES_BLOCK_LEN, 37847e2650eSJohn Baldwin AES_BLOCK_LEN); 37947e2650eSJohn Baldwin #ifdef INVARIANTS 38047e2650eSJohn Baldwin mtx_lock(&os->lock); 38121e3c1fbSJohn Baldwin os->next_seqno = m->m_epg_seqno + 1; 38247e2650eSJohn Baldwin os->in_progress = false; 38347e2650eSJohn Baldwin mtx_unlock(&os->lock); 38447e2650eSJohn Baldwin #endif 38547e2650eSJohn Baldwin } 38647e2650eSJohn Baldwin return (error); 38747e2650eSJohn Baldwin } 38847e2650eSJohn Baldwin 38947e2650eSJohn Baldwin static int 390470e851cSJohn Baldwin ktls_ocf_tls12_aead_encrypt(struct ktls_ocf_encrypt_state *state, 391470e851cSJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 392470e851cSJohn Baldwin int outiovcnt) 393b2e60773SJohn Baldwin { 39421e3c1fbSJohn Baldwin const struct tls_record_layer *hdr; 395470e851cSJohn Baldwin struct uio *uio; 396470e851cSJohn Baldwin struct tls_aead_data *ad; 397470e851cSJohn Baldwin struct cryptop *crp; 398b33ff941SJohn Baldwin struct ktls_ocf_session *os; 39921e3c1fbSJohn Baldwin int error; 400b2e60773SJohn Baldwin uint16_t tls_comp_len; 401b2e60773SJohn Baldwin 402b33ff941SJohn Baldwin os = tls->ocf_session; 40321e3c1fbSJohn Baldwin hdr = (const struct tls_record_layer *)m->m_epg_hdr; 404470e851cSJohn Baldwin crp = &state->crp; 405470e851cSJohn Baldwin uio = &state->uio; 406b2e60773SJohn Baldwin 407470e851cSJohn Baldwin crypto_initreq(crp, os->sid); 408b2e60773SJohn Baldwin 409b2e60773SJohn Baldwin /* Setup the IV. */ 4104dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) { 411470e851cSJohn Baldwin memcpy(crp->crp_iv, tls->params.iv, TLS_AEAD_GCM_LEN); 412470e851cSJohn Baldwin memcpy(crp->crp_iv + TLS_AEAD_GCM_LEN, hdr + 1, 4134dd6800eSJohn Baldwin sizeof(uint64_t)); 4144dd6800eSJohn Baldwin } else { 4154dd6800eSJohn Baldwin /* 4164dd6800eSJohn Baldwin * Chacha20-Poly1305 constructs the IV for TLS 1.2 4174dd6800eSJohn Baldwin * identically to constructing the IV for AEAD in TLS 4184dd6800eSJohn Baldwin * 1.3. 4194dd6800eSJohn Baldwin */ 420470e851cSJohn Baldwin memcpy(crp->crp_iv, tls->params.iv, tls->params.iv_len); 421470e851cSJohn Baldwin *(uint64_t *)(crp->crp_iv + 4) ^= htobe64(m->m_epg_seqno); 4224dd6800eSJohn Baldwin } 423b2e60773SJohn Baldwin 424b2e60773SJohn Baldwin /* Setup the AAD. */ 425470e851cSJohn Baldwin ad = &state->aead; 42621e3c1fbSJohn Baldwin tls_comp_len = m->m_len - (m->m_epg_hdrlen + m->m_epg_trllen); 427470e851cSJohn Baldwin ad->seq = htobe64(m->m_epg_seqno); 428470e851cSJohn Baldwin ad->type = hdr->tls_type; 429470e851cSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 430470e851cSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 431470e851cSJohn Baldwin ad->tls_length = htons(tls_comp_len); 432470e851cSJohn Baldwin crp->crp_aad = ad; 433470e851cSJohn Baldwin crp->crp_aad_length = sizeof(*ad); 434b2e60773SJohn Baldwin 43521e3c1fbSJohn Baldwin /* Set fields for input payload. */ 436470e851cSJohn Baldwin crypto_use_single_mbuf(crp, m); 437470e851cSJohn Baldwin crp->crp_payload_start = m->m_epg_hdrlen; 438470e851cSJohn Baldwin crp->crp_payload_length = tls_comp_len; 439b2e60773SJohn Baldwin 44021e3c1fbSJohn Baldwin if (outiov != NULL) { 441470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_length; 44221e3c1fbSJohn Baldwin 443470e851cSJohn Baldwin uio->uio_iov = outiov; 444470e851cSJohn Baldwin uio->uio_iovcnt = outiovcnt; 445470e851cSJohn Baldwin uio->uio_offset = 0; 446470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 447470e851cSJohn Baldwin uio->uio_td = curthread; 448470e851cSJohn Baldwin uio->uio_resid = crp->crp_payload_length + tls->params.tls_tlen; 449470e851cSJohn Baldwin crypto_use_output_uio(crp, uio); 45021e3c1fbSJohn Baldwin } else 451470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_start + 452470e851cSJohn Baldwin crp->crp_payload_length; 453b2e60773SJohn Baldwin 454470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_ENCRYPT | CRYPTO_OP_COMPUTE_DIGEST; 455470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 4564dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 45716bea05aSJohn Baldwin counter_u64_add(ocf_tls12_gcm_encrypts, 1); 4584dd6800eSJohn Baldwin else 45916bea05aSJohn Baldwin counter_u64_add(ocf_tls12_chacha20_encrypts, 1); 46021e3c1fbSJohn Baldwin if (outiov != NULL) 461080933c0SJohn Baldwin counter_u64_add(ocf_separate_output, 1); 46221e3c1fbSJohn Baldwin else 46321e3c1fbSJohn Baldwin counter_u64_add(ocf_inplace, 1); 464470e851cSJohn Baldwin if (tls->sync_dispatch) { 465470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 466470e851cSJohn Baldwin crypto_destroyreq(crp); 467470e851cSJohn Baldwin } else 468470e851cSJohn Baldwin error = ktls_ocf_dispatch_async(state, crp); 46955b7a0e1SJohn Baldwin return (error); 47055b7a0e1SJohn Baldwin } 47155b7a0e1SJohn Baldwin 47255b7a0e1SJohn Baldwin static int 4734dd6800eSJohn Baldwin ktls_ocf_tls12_aead_decrypt(struct ktls_session *tls, 4743c0e5685SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, uint64_t seqno, 4753c0e5685SJohn Baldwin int *trailer_len) 4763c0e5685SJohn Baldwin { 4773c0e5685SJohn Baldwin struct tls_aead_data ad; 4783c0e5685SJohn Baldwin struct cryptop crp; 479b33ff941SJohn Baldwin struct ktls_ocf_session *os; 4803c0e5685SJohn Baldwin int error; 4813c0e5685SJohn Baldwin uint16_t tls_comp_len; 4823c0e5685SJohn Baldwin 483b33ff941SJohn Baldwin os = tls->ocf_session; 4843c0e5685SJohn Baldwin 4853c0e5685SJohn Baldwin crypto_initreq(&crp, os->sid); 4863c0e5685SJohn Baldwin 4873c0e5685SJohn Baldwin /* Setup the IV. */ 4884dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) { 4893c0e5685SJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, TLS_AEAD_GCM_LEN); 4904dd6800eSJohn Baldwin memcpy(crp.crp_iv + TLS_AEAD_GCM_LEN, hdr + 1, 4914dd6800eSJohn Baldwin sizeof(uint64_t)); 4924dd6800eSJohn Baldwin } else { 4934dd6800eSJohn Baldwin /* 4944dd6800eSJohn Baldwin * Chacha20-Poly1305 constructs the IV for TLS 1.2 4954dd6800eSJohn Baldwin * identically to constructing the IV for AEAD in TLS 4964dd6800eSJohn Baldwin * 1.3. 4974dd6800eSJohn Baldwin */ 4984dd6800eSJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, tls->params.iv_len); 4994dd6800eSJohn Baldwin *(uint64_t *)(crp.crp_iv + 4) ^= htobe64(seqno); 5004dd6800eSJohn Baldwin } 5013c0e5685SJohn Baldwin 5023c0e5685SJohn Baldwin /* Setup the AAD. */ 5034dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 5043c0e5685SJohn Baldwin tls_comp_len = ntohs(hdr->tls_length) - 5053c0e5685SJohn Baldwin (AES_GMAC_HASH_LEN + sizeof(uint64_t)); 5064dd6800eSJohn Baldwin else 5074dd6800eSJohn Baldwin tls_comp_len = ntohs(hdr->tls_length) - POLY1305_HASH_LEN; 5083c0e5685SJohn Baldwin ad.seq = htobe64(seqno); 5093c0e5685SJohn Baldwin ad.type = hdr->tls_type; 5103c0e5685SJohn Baldwin ad.tls_vmajor = hdr->tls_vmajor; 5113c0e5685SJohn Baldwin ad.tls_vminor = hdr->tls_vminor; 5123c0e5685SJohn Baldwin ad.tls_length = htons(tls_comp_len); 5133c0e5685SJohn Baldwin crp.crp_aad = &ad; 5143c0e5685SJohn Baldwin crp.crp_aad_length = sizeof(ad); 5153c0e5685SJohn Baldwin 5163c0e5685SJohn Baldwin crp.crp_payload_start = tls->params.tls_hlen; 5173c0e5685SJohn Baldwin crp.crp_payload_length = tls_comp_len; 5183c0e5685SJohn Baldwin crp.crp_digest_start = crp.crp_payload_start + crp.crp_payload_length; 5193c0e5685SJohn Baldwin 5203c0e5685SJohn Baldwin crp.crp_op = CRYPTO_OP_DECRYPT | CRYPTO_OP_VERIFY_DIGEST; 5213c0e5685SJohn Baldwin crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 5223c0e5685SJohn Baldwin crypto_use_mbuf(&crp, m); 5233c0e5685SJohn Baldwin 5244dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 52516bea05aSJohn Baldwin counter_u64_add(ocf_tls12_gcm_decrypts, 1); 5264dd6800eSJohn Baldwin else 52716bea05aSJohn Baldwin counter_u64_add(ocf_tls12_chacha20_decrypts, 1); 5283c0e5685SJohn Baldwin error = ktls_ocf_dispatch(os, &crp); 5293c0e5685SJohn Baldwin 5303c0e5685SJohn Baldwin crypto_destroyreq(&crp); 5314a92afaeSJohn Baldwin *trailer_len = tls->params.tls_tlen; 5323c0e5685SJohn Baldwin return (error); 5333c0e5685SJohn Baldwin } 5343c0e5685SJohn Baldwin 5353c0e5685SJohn Baldwin static int 536470e851cSJohn Baldwin ktls_ocf_tls13_aead_encrypt(struct ktls_ocf_encrypt_state *state, 537470e851cSJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 538470e851cSJohn Baldwin int outiovcnt) 53955b7a0e1SJohn Baldwin { 54021e3c1fbSJohn Baldwin const struct tls_record_layer *hdr; 541470e851cSJohn Baldwin struct uio *uio; 542470e851cSJohn Baldwin struct tls_aead_data_13 *ad; 543470e851cSJohn Baldwin struct cryptop *crp; 544b33ff941SJohn Baldwin struct ktls_ocf_session *os; 545470e851cSJohn Baldwin char nonce[12]; 54621e3c1fbSJohn Baldwin int error; 54755b7a0e1SJohn Baldwin 548b33ff941SJohn Baldwin os = tls->ocf_session; 54921e3c1fbSJohn Baldwin hdr = (const struct tls_record_layer *)m->m_epg_hdr; 550470e851cSJohn Baldwin crp = &state->crp; 551470e851cSJohn Baldwin uio = &state->uio; 55255b7a0e1SJohn Baldwin 553470e851cSJohn Baldwin crypto_initreq(crp, os->sid); 55455b7a0e1SJohn Baldwin 55555b7a0e1SJohn Baldwin /* Setup the nonce. */ 55655b7a0e1SJohn Baldwin memcpy(nonce, tls->params.iv, tls->params.iv_len); 55721e3c1fbSJohn Baldwin *(uint64_t *)(nonce + 4) ^= htobe64(m->m_epg_seqno); 55855b7a0e1SJohn Baldwin 55955b7a0e1SJohn Baldwin /* Setup the AAD. */ 560470e851cSJohn Baldwin ad = &state->aead13; 561470e851cSJohn Baldwin ad->type = hdr->tls_type; 562470e851cSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 563470e851cSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 564470e851cSJohn Baldwin ad->tls_length = hdr->tls_length; 565470e851cSJohn Baldwin crp->crp_aad = ad; 566470e851cSJohn Baldwin crp->crp_aad_length = sizeof(*ad); 567080933c0SJohn Baldwin 56821e3c1fbSJohn Baldwin /* Set fields for input payload. */ 569470e851cSJohn Baldwin crypto_use_single_mbuf(crp, m); 570470e851cSJohn Baldwin crp->crp_payload_start = m->m_epg_hdrlen; 571470e851cSJohn Baldwin crp->crp_payload_length = m->m_len - 572470e851cSJohn Baldwin (m->m_epg_hdrlen + m->m_epg_trllen); 57355b7a0e1SJohn Baldwin 5745b750b9aSJohn Baldwin /* Store the record type as the first byte of the trailer. */ 57521e3c1fbSJohn Baldwin m->m_epg_trail[0] = m->m_epg_record_type; 576470e851cSJohn Baldwin crp->crp_payload_length++; 57721e3c1fbSJohn Baldwin 57821e3c1fbSJohn Baldwin if (outiov != NULL) { 579470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_length; 5805b750b9aSJohn Baldwin 581470e851cSJohn Baldwin uio->uio_iov = outiov; 582470e851cSJohn Baldwin uio->uio_iovcnt = outiovcnt; 583470e851cSJohn Baldwin uio->uio_offset = 0; 584470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 585470e851cSJohn Baldwin uio->uio_td = curthread; 586470e851cSJohn Baldwin uio->uio_resid = m->m_len - m->m_epg_hdrlen; 587470e851cSJohn Baldwin crypto_use_output_uio(crp, uio); 58821e3c1fbSJohn Baldwin } else 589470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_start + 590470e851cSJohn Baldwin crp->crp_payload_length; 59155b7a0e1SJohn Baldwin 592470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_ENCRYPT | CRYPTO_OP_COMPUTE_DIGEST; 593470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 59455b7a0e1SJohn Baldwin 595470e851cSJohn Baldwin memcpy(crp->crp_iv, nonce, sizeof(nonce)); 59655b7a0e1SJohn Baldwin 5974dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 59816bea05aSJohn Baldwin counter_u64_add(ocf_tls13_gcm_encrypts, 1); 5994dd6800eSJohn Baldwin else 60016bea05aSJohn Baldwin counter_u64_add(ocf_tls13_chacha20_encrypts, 1); 60121e3c1fbSJohn Baldwin if (outiov != NULL) 602080933c0SJohn Baldwin counter_u64_add(ocf_separate_output, 1); 60321e3c1fbSJohn Baldwin else 60421e3c1fbSJohn Baldwin counter_u64_add(ocf_inplace, 1); 605470e851cSJohn Baldwin if (tls->sync_dispatch) { 606470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 607470e851cSJohn Baldwin crypto_destroyreq(crp); 608470e851cSJohn Baldwin } else 609470e851cSJohn Baldwin error = ktls_ocf_dispatch_async(state, crp); 610b2e60773SJohn Baldwin return (error); 611b2e60773SJohn Baldwin } 612b2e60773SJohn Baldwin 613*05a1d0f5SJohn Baldwin static int 614*05a1d0f5SJohn Baldwin ktls_ocf_tls13_aead_decrypt(struct ktls_session *tls, 615*05a1d0f5SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, uint64_t seqno, 616*05a1d0f5SJohn Baldwin int *trailer_len) 617*05a1d0f5SJohn Baldwin { 618*05a1d0f5SJohn Baldwin struct tls_aead_data_13 ad; 619*05a1d0f5SJohn Baldwin struct cryptop crp; 620*05a1d0f5SJohn Baldwin struct ktls_ocf_session *os; 621*05a1d0f5SJohn Baldwin int error; 622*05a1d0f5SJohn Baldwin u_int tag_len; 623*05a1d0f5SJohn Baldwin 624*05a1d0f5SJohn Baldwin os = tls->ocf_session; 625*05a1d0f5SJohn Baldwin 626*05a1d0f5SJohn Baldwin tag_len = tls->params.tls_tlen - 1; 627*05a1d0f5SJohn Baldwin 628*05a1d0f5SJohn Baldwin /* Payload must contain at least one byte for the record type. */ 629*05a1d0f5SJohn Baldwin if (ntohs(hdr->tls_length) < tag_len + 1) 630*05a1d0f5SJohn Baldwin return (EBADMSG); 631*05a1d0f5SJohn Baldwin 632*05a1d0f5SJohn Baldwin crypto_initreq(&crp, os->sid); 633*05a1d0f5SJohn Baldwin 634*05a1d0f5SJohn Baldwin /* Setup the nonce. */ 635*05a1d0f5SJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, tls->params.iv_len); 636*05a1d0f5SJohn Baldwin *(uint64_t *)(crp.crp_iv + 4) ^= htobe64(seqno); 637*05a1d0f5SJohn Baldwin 638*05a1d0f5SJohn Baldwin /* Setup the AAD. */ 639*05a1d0f5SJohn Baldwin ad.type = hdr->tls_type; 640*05a1d0f5SJohn Baldwin ad.tls_vmajor = hdr->tls_vmajor; 641*05a1d0f5SJohn Baldwin ad.tls_vminor = hdr->tls_vminor; 642*05a1d0f5SJohn Baldwin ad.tls_length = hdr->tls_length; 643*05a1d0f5SJohn Baldwin crp.crp_aad = &ad; 644*05a1d0f5SJohn Baldwin crp.crp_aad_length = sizeof(ad); 645*05a1d0f5SJohn Baldwin 646*05a1d0f5SJohn Baldwin crp.crp_payload_start = tls->params.tls_hlen; 647*05a1d0f5SJohn Baldwin crp.crp_payload_length = ntohs(hdr->tls_length) - tag_len; 648*05a1d0f5SJohn Baldwin crp.crp_digest_start = crp.crp_payload_start + crp.crp_payload_length; 649*05a1d0f5SJohn Baldwin 650*05a1d0f5SJohn Baldwin crp.crp_op = CRYPTO_OP_DECRYPT | CRYPTO_OP_VERIFY_DIGEST; 651*05a1d0f5SJohn Baldwin crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 652*05a1d0f5SJohn Baldwin crypto_use_mbuf(&crp, m); 653*05a1d0f5SJohn Baldwin 654*05a1d0f5SJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 655*05a1d0f5SJohn Baldwin counter_u64_add(ocf_tls13_gcm_decrypts, 1); 656*05a1d0f5SJohn Baldwin else 657*05a1d0f5SJohn Baldwin counter_u64_add(ocf_tls13_chacha20_decrypts, 1); 658*05a1d0f5SJohn Baldwin error = ktls_ocf_dispatch(os, &crp); 659*05a1d0f5SJohn Baldwin 660*05a1d0f5SJohn Baldwin crypto_destroyreq(&crp); 661*05a1d0f5SJohn Baldwin *trailer_len = tag_len; 662*05a1d0f5SJohn Baldwin return (error); 663*05a1d0f5SJohn Baldwin } 664*05a1d0f5SJohn Baldwin 66521e3c1fbSJohn Baldwin void 666b2e60773SJohn Baldwin ktls_ocf_free(struct ktls_session *tls) 667b2e60773SJohn Baldwin { 668b33ff941SJohn Baldwin struct ktls_ocf_session *os; 669b2e60773SJohn Baldwin 670b33ff941SJohn Baldwin os = tls->ocf_session; 671c0341432SJohn Baldwin crypto_freesession(os->sid); 672b2e60773SJohn Baldwin mtx_destroy(&os->lock); 6734a711b8dSJohn Baldwin zfree(os, M_KTLS_OCF); 674b2e60773SJohn Baldwin } 675b2e60773SJohn Baldwin 67621e3c1fbSJohn Baldwin int 6773c0e5685SJohn Baldwin ktls_ocf_try(struct socket *so, struct ktls_session *tls, int direction) 678b2e60773SJohn Baldwin { 67947e2650eSJohn Baldwin struct crypto_session_params csp, mac_csp; 680b33ff941SJohn Baldwin struct ktls_ocf_session *os; 68147e2650eSJohn Baldwin int error, mac_len; 682b2e60773SJohn Baldwin 683c0341432SJohn Baldwin memset(&csp, 0, sizeof(csp)); 68447e2650eSJohn Baldwin memset(&mac_csp, 0, sizeof(mac_csp)); 68547e2650eSJohn Baldwin mac_csp.csp_mode = CSP_MODE_NONE; 68647e2650eSJohn Baldwin mac_len = 0; 687b2e60773SJohn Baldwin 688b2e60773SJohn Baldwin switch (tls->params.cipher_algorithm) { 689b2e60773SJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 690b2e60773SJohn Baldwin switch (tls->params.cipher_key_len) { 691b2e60773SJohn Baldwin case 128 / 8: 692b2e60773SJohn Baldwin case 256 / 8: 693b2e60773SJohn Baldwin break; 694b2e60773SJohn Baldwin default: 695b2e60773SJohn Baldwin return (EINVAL); 696b2e60773SJohn Baldwin } 697b2e60773SJohn Baldwin 69855b7a0e1SJohn Baldwin /* Only TLS 1.2 and 1.3 are supported. */ 699b2e60773SJohn Baldwin if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 70055b7a0e1SJohn Baldwin tls->params.tls_vminor < TLS_MINOR_VER_TWO || 70155b7a0e1SJohn Baldwin tls->params.tls_vminor > TLS_MINOR_VER_THREE) 702b2e60773SJohn Baldwin return (EPROTONOSUPPORT); 703b2e60773SJohn Baldwin 70447e2650eSJohn Baldwin csp.csp_flags |= CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD; 70547e2650eSJohn Baldwin csp.csp_mode = CSP_MODE_AEAD; 70647e2650eSJohn Baldwin csp.csp_cipher_alg = CRYPTO_AES_NIST_GCM_16; 70747e2650eSJohn Baldwin csp.csp_cipher_key = tls->params.cipher_key; 70847e2650eSJohn Baldwin csp.csp_cipher_klen = tls->params.cipher_key_len; 70947e2650eSJohn Baldwin csp.csp_ivlen = AES_GCM_IV_LEN; 71047e2650eSJohn Baldwin break; 71147e2650eSJohn Baldwin case CRYPTO_AES_CBC: 71247e2650eSJohn Baldwin switch (tls->params.cipher_key_len) { 71347e2650eSJohn Baldwin case 128 / 8: 71447e2650eSJohn Baldwin case 256 / 8: 71547e2650eSJohn Baldwin break; 71647e2650eSJohn Baldwin default: 71747e2650eSJohn Baldwin return (EINVAL); 71847e2650eSJohn Baldwin } 71947e2650eSJohn Baldwin 72047e2650eSJohn Baldwin switch (tls->params.auth_algorithm) { 72147e2650eSJohn Baldwin case CRYPTO_SHA1_HMAC: 72247e2650eSJohn Baldwin mac_len = SHA1_HASH_LEN; 72347e2650eSJohn Baldwin break; 72447e2650eSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 72547e2650eSJohn Baldwin mac_len = SHA2_256_HASH_LEN; 72647e2650eSJohn Baldwin break; 72747e2650eSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 72847e2650eSJohn Baldwin mac_len = SHA2_384_HASH_LEN; 72947e2650eSJohn Baldwin break; 73047e2650eSJohn Baldwin default: 73147e2650eSJohn Baldwin return (EINVAL); 73247e2650eSJohn Baldwin } 73347e2650eSJohn Baldwin 73447e2650eSJohn Baldwin /* Only TLS 1.0-1.2 are supported. */ 73547e2650eSJohn Baldwin if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 73647e2650eSJohn Baldwin tls->params.tls_vminor < TLS_MINOR_VER_ZERO || 73747e2650eSJohn Baldwin tls->params.tls_vminor > TLS_MINOR_VER_TWO) 73847e2650eSJohn Baldwin return (EPROTONOSUPPORT); 73947e2650eSJohn Baldwin 74047e2650eSJohn Baldwin /* AES-CBC is not supported for receive. */ 74147e2650eSJohn Baldwin if (direction == KTLS_RX) 74247e2650eSJohn Baldwin return (EPROTONOSUPPORT); 74347e2650eSJohn Baldwin 74447e2650eSJohn Baldwin csp.csp_flags |= CSP_F_SEPARATE_OUTPUT; 74547e2650eSJohn Baldwin csp.csp_mode = CSP_MODE_CIPHER; 74647e2650eSJohn Baldwin csp.csp_cipher_alg = CRYPTO_AES_CBC; 74747e2650eSJohn Baldwin csp.csp_cipher_key = tls->params.cipher_key; 74847e2650eSJohn Baldwin csp.csp_cipher_klen = tls->params.cipher_key_len; 74947e2650eSJohn Baldwin csp.csp_ivlen = AES_BLOCK_LEN; 75047e2650eSJohn Baldwin 75147e2650eSJohn Baldwin mac_csp.csp_flags |= CSP_F_SEPARATE_OUTPUT; 75247e2650eSJohn Baldwin mac_csp.csp_mode = CSP_MODE_DIGEST; 75347e2650eSJohn Baldwin mac_csp.csp_auth_alg = tls->params.auth_algorithm; 75447e2650eSJohn Baldwin mac_csp.csp_auth_key = tls->params.auth_key; 75547e2650eSJohn Baldwin mac_csp.csp_auth_klen = tls->params.auth_key_len; 75647e2650eSJohn Baldwin break; 7574dd6800eSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 7584dd6800eSJohn Baldwin switch (tls->params.cipher_key_len) { 7594dd6800eSJohn Baldwin case 256 / 8: 7604dd6800eSJohn Baldwin break; 7614dd6800eSJohn Baldwin default: 7624dd6800eSJohn Baldwin return (EINVAL); 7634dd6800eSJohn Baldwin } 7644dd6800eSJohn Baldwin 7654dd6800eSJohn Baldwin /* Only TLS 1.2 and 1.3 are supported. */ 7664dd6800eSJohn Baldwin if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 7674dd6800eSJohn Baldwin tls->params.tls_vminor < TLS_MINOR_VER_TWO || 7684dd6800eSJohn Baldwin tls->params.tls_vminor > TLS_MINOR_VER_THREE) 7694dd6800eSJohn Baldwin return (EPROTONOSUPPORT); 7704dd6800eSJohn Baldwin 7714dd6800eSJohn Baldwin csp.csp_flags |= CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD; 7724dd6800eSJohn Baldwin csp.csp_mode = CSP_MODE_AEAD; 7734dd6800eSJohn Baldwin csp.csp_cipher_alg = CRYPTO_CHACHA20_POLY1305; 7744dd6800eSJohn Baldwin csp.csp_cipher_key = tls->params.cipher_key; 7754dd6800eSJohn Baldwin csp.csp_cipher_klen = tls->params.cipher_key_len; 7764dd6800eSJohn Baldwin csp.csp_ivlen = CHACHA20_POLY1305_IV_LEN; 7774dd6800eSJohn Baldwin break; 77847e2650eSJohn Baldwin default: 77947e2650eSJohn Baldwin return (EPROTONOSUPPORT); 78047e2650eSJohn Baldwin } 78147e2650eSJohn Baldwin 782b2e60773SJohn Baldwin os = malloc(sizeof(*os), M_KTLS_OCF, M_NOWAIT | M_ZERO); 783b2e60773SJohn Baldwin if (os == NULL) 784b2e60773SJohn Baldwin return (ENOMEM); 785b2e60773SJohn Baldwin 786c0341432SJohn Baldwin error = crypto_newsession(&os->sid, &csp, 787b2e60773SJohn Baldwin CRYPTO_FLAG_HARDWARE | CRYPTO_FLAG_SOFTWARE); 788b2e60773SJohn Baldwin if (error) { 789b2e60773SJohn Baldwin free(os, M_KTLS_OCF); 790b2e60773SJohn Baldwin return (error); 791b2e60773SJohn Baldwin } 792b2e60773SJohn Baldwin 79347e2650eSJohn Baldwin if (mac_csp.csp_mode != CSP_MODE_NONE) { 79447e2650eSJohn Baldwin error = crypto_newsession(&os->mac_sid, &mac_csp, 79547e2650eSJohn Baldwin CRYPTO_FLAG_HARDWARE | CRYPTO_FLAG_SOFTWARE); 79647e2650eSJohn Baldwin if (error) { 79747e2650eSJohn Baldwin crypto_freesession(os->sid); 79847e2650eSJohn Baldwin free(os, M_KTLS_OCF); 79947e2650eSJohn Baldwin return (error); 80047e2650eSJohn Baldwin } 80147e2650eSJohn Baldwin os->mac_len = mac_len; 80247e2650eSJohn Baldwin } 80347e2650eSJohn Baldwin 804b2e60773SJohn Baldwin mtx_init(&os->lock, "ktls_ocf", NULL, MTX_DEF); 805b33ff941SJohn Baldwin tls->ocf_session = os; 8064dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16 || 8074dd6800eSJohn Baldwin tls->params.cipher_algorithm == CRYPTO_CHACHA20_POLY1305) { 8083c0e5685SJohn Baldwin if (direction == KTLS_TX) { 80955b7a0e1SJohn Baldwin if (tls->params.tls_vminor == TLS_MINOR_VER_THREE) 8104dd6800eSJohn Baldwin tls->sw_encrypt = ktls_ocf_tls13_aead_encrypt; 81155b7a0e1SJohn Baldwin else 8124dd6800eSJohn Baldwin tls->sw_encrypt = ktls_ocf_tls12_aead_encrypt; 8133c0e5685SJohn Baldwin } else { 814*05a1d0f5SJohn Baldwin if (tls->params.tls_vminor == TLS_MINOR_VER_THREE) 815*05a1d0f5SJohn Baldwin tls->sw_decrypt = ktls_ocf_tls13_aead_decrypt; 816*05a1d0f5SJohn Baldwin else 8174dd6800eSJohn Baldwin tls->sw_decrypt = ktls_ocf_tls12_aead_decrypt; 8183c0e5685SJohn Baldwin } 81947e2650eSJohn Baldwin } else { 82047e2650eSJohn Baldwin tls->sw_encrypt = ktls_ocf_tls_cbc_encrypt; 82147e2650eSJohn Baldwin if (tls->params.tls_vminor == TLS_MINOR_VER_ZERO) { 82247e2650eSJohn Baldwin os->implicit_iv = true; 82347e2650eSJohn Baldwin memcpy(os->iv, tls->params.iv, AES_BLOCK_LEN); 8244827bf76SJohn Baldwin #ifdef INVARIANTS 8254827bf76SJohn Baldwin os->next_seqno = tls->next_seqno; 8264827bf76SJohn Baldwin #endif 82747e2650eSJohn Baldwin } 82847e2650eSJohn Baldwin } 829470e851cSJohn Baldwin 830470e851cSJohn Baldwin /* 831470e851cSJohn Baldwin * AES-CBC is always synchronous currently. Asynchronous 832470e851cSJohn Baldwin * operation would require multiple callbacks and an additional 833470e851cSJohn Baldwin * iovec array in ktls_ocf_encrypt_state. 834470e851cSJohn Baldwin */ 835470e851cSJohn Baldwin tls->sync_dispatch = CRYPTO_SESS_SYNC(os->sid) || 836470e851cSJohn Baldwin tls->params.cipher_algorithm == CRYPTO_AES_CBC; 837b2e60773SJohn Baldwin return (0); 838b2e60773SJohn Baldwin } 839