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> 47*a8280123SJohn Baldwin #include <netinet/in.h> 48b2e60773SJohn Baldwin #include <opencrypto/cryptodev.h> 49470e851cSJohn Baldwin #include <opencrypto/ktls.h> 50b2e60773SJohn Baldwin 51a4c5d490SJohn Baldwin struct ktls_ocf_sw { 52a4c5d490SJohn Baldwin /* Encrypt a single outbound TLS record. */ 53a4c5d490SJohn Baldwin int (*encrypt)(struct ktls_ocf_encrypt_state *state, 54a4c5d490SJohn Baldwin struct ktls_session *tls, struct mbuf *m, 55a4c5d490SJohn Baldwin struct iovec *outiov, int outiovcnt); 56a4c5d490SJohn Baldwin 57*a8280123SJohn Baldwin /* Re-encrypt a received TLS record that is partially decrypted. */ 58*a8280123SJohn Baldwin int (*recrypt)(struct ktls_session *tls, 59*a8280123SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, 60*a8280123SJohn Baldwin uint64_t seqno); 61*a8280123SJohn Baldwin 62a4c5d490SJohn Baldwin /* Decrypt a received TLS record. */ 63a4c5d490SJohn Baldwin int (*decrypt)(struct ktls_session *tls, 64a4c5d490SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, 65a4c5d490SJohn Baldwin uint64_t seqno, int *trailer_len); 66a4c5d490SJohn Baldwin }; 67a4c5d490SJohn Baldwin 68b33ff941SJohn Baldwin struct ktls_ocf_session { 69a4c5d490SJohn Baldwin const struct ktls_ocf_sw *sw; 70b2e60773SJohn Baldwin crypto_session_t sid; 7147e2650eSJohn Baldwin crypto_session_t mac_sid; 72*a8280123SJohn Baldwin crypto_session_t recrypt_sid; 73b2e60773SJohn Baldwin struct mtx lock; 7421e3c1fbSJohn Baldwin int mac_len; 7547e2650eSJohn Baldwin bool implicit_iv; 7647e2650eSJohn Baldwin 7747e2650eSJohn Baldwin /* Only used for TLS 1.0 with the implicit IV. */ 7847e2650eSJohn Baldwin #ifdef INVARIANTS 7947e2650eSJohn Baldwin bool in_progress; 8047e2650eSJohn Baldwin uint64_t next_seqno; 8147e2650eSJohn Baldwin #endif 8247e2650eSJohn Baldwin char iv[AES_BLOCK_LEN]; 83b2e60773SJohn Baldwin }; 84b2e60773SJohn Baldwin 85b2e60773SJohn Baldwin struct ocf_operation { 86b33ff941SJohn Baldwin struct ktls_ocf_session *os; 87b2e60773SJohn Baldwin bool done; 88b2e60773SJohn Baldwin }; 89b2e60773SJohn Baldwin 90b2e60773SJohn Baldwin static MALLOC_DEFINE(M_KTLS_OCF, "ktls_ocf", "OCF KTLS"); 91b2e60773SJohn Baldwin 92b2e60773SJohn Baldwin SYSCTL_DECL(_kern_ipc_tls); 93b2e60773SJohn Baldwin SYSCTL_DECL(_kern_ipc_tls_stats); 94b2e60773SJohn Baldwin 957029da5cSPawel Biernacki static SYSCTL_NODE(_kern_ipc_tls_stats, OID_AUTO, ocf, 967029da5cSPawel Biernacki CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 9755b7a0e1SJohn Baldwin "Kernel TLS offload via OCF stats"); 9855b7a0e1SJohn Baldwin 9916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls10_cbc_encrypts); 10016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls10_cbc_encrypts, 10116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls10_cbc_encrypts, 10247e2650eSJohn Baldwin "Total number of OCF TLS 1.0 CBC encryption operations"); 10347e2650eSJohn Baldwin 10416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls11_cbc_encrypts); 10516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls11_cbc_encrypts, 10616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls11_cbc_encrypts, 10747e2650eSJohn Baldwin "Total number of OCF TLS 1.1/1.2 CBC encryption operations"); 10847e2650eSJohn Baldwin 10916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_gcm_decrypts); 11016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_gcm_decrypts, 11116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_gcm_decrypts, 11216bea05aSJohn Baldwin "Total number of OCF TLS 1.2 GCM decryption operations"); 11316bea05aSJohn Baldwin 11416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_gcm_encrypts); 11516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_gcm_encrypts, 11616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_gcm_encrypts, 11755b7a0e1SJohn Baldwin "Total number of OCF TLS 1.2 GCM encryption operations"); 11855b7a0e1SJohn Baldwin 119*a8280123SJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_gcm_recrypts); 120*a8280123SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_gcm_recrypts, 121*a8280123SJohn Baldwin CTLFLAG_RD, &ocf_tls12_gcm_recrypts, 122*a8280123SJohn Baldwin "Total number of OCF TLS 1.2 GCM re-encryption operations"); 123*a8280123SJohn Baldwin 12416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_chacha20_decrypts); 12516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_chacha20_decrypts, 12616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_chacha20_decrypts, 12716bea05aSJohn Baldwin "Total number of OCF TLS 1.2 Chacha20-Poly1305 decryption operations"); 12816bea05aSJohn Baldwin 12916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls12_chacha20_encrypts); 13016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls12_chacha20_encrypts, 13116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls12_chacha20_encrypts, 1324dd6800eSJohn Baldwin "Total number of OCF TLS 1.2 Chacha20-Poly1305 encryption operations"); 1334dd6800eSJohn Baldwin 13405a1d0f5SJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_gcm_decrypts); 13505a1d0f5SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_gcm_decrypts, 13605a1d0f5SJohn Baldwin CTLFLAG_RD, &ocf_tls13_gcm_decrypts, 13705a1d0f5SJohn Baldwin "Total number of OCF TLS 1.3 GCM decryption operations"); 13805a1d0f5SJohn Baldwin 13916bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_gcm_encrypts); 14016bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_gcm_encrypts, 14116bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls13_gcm_encrypts, 14255b7a0e1SJohn Baldwin "Total number of OCF TLS 1.3 GCM encryption operations"); 143b2e60773SJohn Baldwin 144*a8280123SJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_gcm_recrypts); 145*a8280123SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_gcm_recrypts, 146*a8280123SJohn Baldwin CTLFLAG_RD, &ocf_tls13_gcm_recrypts, 147*a8280123SJohn Baldwin "Total number of OCF TLS 1.3 GCM re-encryption operations"); 148*a8280123SJohn Baldwin 14905a1d0f5SJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_chacha20_decrypts); 15005a1d0f5SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_chacha20_decrypts, 15105a1d0f5SJohn Baldwin CTLFLAG_RD, &ocf_tls13_chacha20_decrypts, 15205a1d0f5SJohn Baldwin "Total number of OCF TLS 1.3 Chacha20-Poly1305 decryption operations"); 15305a1d0f5SJohn Baldwin 15416bea05aSJohn Baldwin static COUNTER_U64_DEFINE_EARLY(ocf_tls13_chacha20_encrypts); 15516bea05aSJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, tls13_chacha20_encrypts, 15616bea05aSJohn Baldwin CTLFLAG_RD, &ocf_tls13_chacha20_encrypts, 1574dd6800eSJohn Baldwin "Total number of OCF TLS 1.3 Chacha20-Poly1305 encryption operations"); 1584dd6800eSJohn Baldwin 1591755b2b9SMark Johnston static COUNTER_U64_DEFINE_EARLY(ocf_inplace); 160080933c0SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, inplace, 161080933c0SJohn Baldwin CTLFLAG_RD, &ocf_inplace, 162080933c0SJohn Baldwin "Total number of OCF in-place operations"); 163080933c0SJohn Baldwin 1641755b2b9SMark Johnston static COUNTER_U64_DEFINE_EARLY(ocf_separate_output); 165080933c0SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, separate_output, 166080933c0SJohn Baldwin CTLFLAG_RD, &ocf_separate_output, 167080933c0SJohn Baldwin "Total number of OCF operations with a separate output buffer"); 168080933c0SJohn Baldwin 1691755b2b9SMark Johnston static COUNTER_U64_DEFINE_EARLY(ocf_retries); 17055b7a0e1SJohn Baldwin SYSCTL_COUNTER_U64(_kern_ipc_tls_stats_ocf, OID_AUTO, retries, CTLFLAG_RD, 171b2e60773SJohn Baldwin &ocf_retries, 172b2e60773SJohn Baldwin "Number of OCF encryption operation retries"); 173b2e60773SJohn Baldwin 174b2e60773SJohn Baldwin static int 175db6b5644SMark Johnston ktls_ocf_callback_sync(struct cryptop *crp __unused) 176db6b5644SMark Johnston { 177db6b5644SMark Johnston return (0); 178db6b5644SMark Johnston } 179db6b5644SMark Johnston 180db6b5644SMark Johnston static int 181db6b5644SMark Johnston ktls_ocf_callback_async(struct cryptop *crp) 182b2e60773SJohn Baldwin { 183b2e60773SJohn Baldwin struct ocf_operation *oo; 184b2e60773SJohn Baldwin 185b2e60773SJohn Baldwin oo = crp->crp_opaque; 186b2e60773SJohn Baldwin mtx_lock(&oo->os->lock); 187b2e60773SJohn Baldwin oo->done = true; 188b2e60773SJohn Baldwin mtx_unlock(&oo->os->lock); 189b2e60773SJohn Baldwin wakeup(oo); 190b2e60773SJohn Baldwin return (0); 191b2e60773SJohn Baldwin } 192b2e60773SJohn Baldwin 193b2e60773SJohn Baldwin static int 194b33ff941SJohn Baldwin ktls_ocf_dispatch(struct ktls_ocf_session *os, struct cryptop *crp) 19570d1a435SJohn Baldwin { 19670d1a435SJohn Baldwin struct ocf_operation oo; 19770d1a435SJohn Baldwin int error; 198db6b5644SMark Johnston bool async; 19970d1a435SJohn Baldwin 20070d1a435SJohn Baldwin oo.os = os; 20170d1a435SJohn Baldwin oo.done = false; 20270d1a435SJohn Baldwin 20370d1a435SJohn Baldwin crp->crp_opaque = &oo; 20470d1a435SJohn Baldwin for (;;) { 205db6b5644SMark Johnston async = !CRYPTO_SESS_SYNC(crp->crp_session); 206db6b5644SMark Johnston crp->crp_callback = async ? ktls_ocf_callback_async : 207db6b5644SMark Johnston ktls_ocf_callback_sync; 208db6b5644SMark Johnston 20970d1a435SJohn Baldwin error = crypto_dispatch(crp); 21070d1a435SJohn Baldwin if (error) 21170d1a435SJohn Baldwin break; 212db6b5644SMark Johnston if (async) { 21370d1a435SJohn Baldwin mtx_lock(&os->lock); 21470d1a435SJohn Baldwin while (!oo.done) 21570d1a435SJohn Baldwin mtx_sleep(&oo, &os->lock, 0, "ocfktls", 0); 21670d1a435SJohn Baldwin mtx_unlock(&os->lock); 217db6b5644SMark Johnston } 21870d1a435SJohn Baldwin 21970d1a435SJohn Baldwin if (crp->crp_etype != EAGAIN) { 22070d1a435SJohn Baldwin error = crp->crp_etype; 22170d1a435SJohn Baldwin break; 22270d1a435SJohn Baldwin } 22370d1a435SJohn Baldwin 22470d1a435SJohn Baldwin crp->crp_etype = 0; 22570d1a435SJohn Baldwin crp->crp_flags &= ~CRYPTO_F_DONE; 22670d1a435SJohn Baldwin oo.done = false; 22770d1a435SJohn Baldwin counter_u64_add(ocf_retries, 1); 22870d1a435SJohn Baldwin } 22970d1a435SJohn Baldwin return (error); 23070d1a435SJohn Baldwin } 23170d1a435SJohn Baldwin 23270d1a435SJohn Baldwin static int 233470e851cSJohn Baldwin ktls_ocf_dispatch_async_cb(struct cryptop *crp) 234470e851cSJohn Baldwin { 235470e851cSJohn Baldwin struct ktls_ocf_encrypt_state *state; 236470e851cSJohn Baldwin int error; 237470e851cSJohn Baldwin 238470e851cSJohn Baldwin state = crp->crp_opaque; 239470e851cSJohn Baldwin if (crp->crp_etype == EAGAIN) { 240470e851cSJohn Baldwin crp->crp_etype = 0; 241470e851cSJohn Baldwin crp->crp_flags &= ~CRYPTO_F_DONE; 242470e851cSJohn Baldwin counter_u64_add(ocf_retries, 1); 243470e851cSJohn Baldwin error = crypto_dispatch(crp); 244470e851cSJohn Baldwin if (error != 0) { 245470e851cSJohn Baldwin crypto_destroyreq(crp); 246470e851cSJohn Baldwin ktls_encrypt_cb(state, error); 247470e851cSJohn Baldwin } 248470e851cSJohn Baldwin return (0); 249470e851cSJohn Baldwin } 250470e851cSJohn Baldwin 251470e851cSJohn Baldwin error = crp->crp_etype; 252470e851cSJohn Baldwin crypto_destroyreq(crp); 253470e851cSJohn Baldwin ktls_encrypt_cb(state, error); 254470e851cSJohn Baldwin return (0); 255470e851cSJohn Baldwin } 256470e851cSJohn Baldwin 257470e851cSJohn Baldwin static int 258470e851cSJohn Baldwin ktls_ocf_dispatch_async(struct ktls_ocf_encrypt_state *state, 259470e851cSJohn Baldwin struct cryptop *crp) 260470e851cSJohn Baldwin { 261470e851cSJohn Baldwin int error; 262470e851cSJohn Baldwin 263470e851cSJohn Baldwin crp->crp_opaque = state; 264470e851cSJohn Baldwin crp->crp_callback = ktls_ocf_dispatch_async_cb; 265470e851cSJohn Baldwin error = crypto_dispatch(crp); 266470e851cSJohn Baldwin if (error != 0) 267470e851cSJohn Baldwin crypto_destroyreq(crp); 268470e851cSJohn Baldwin return (error); 269470e851cSJohn Baldwin } 270470e851cSJohn Baldwin 271470e851cSJohn Baldwin static int 272470e851cSJohn Baldwin ktls_ocf_tls_cbc_encrypt(struct ktls_ocf_encrypt_state *state, 273470e851cSJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 274470e851cSJohn Baldwin int outiovcnt) 27547e2650eSJohn Baldwin { 27621e3c1fbSJohn Baldwin const struct tls_record_layer *hdr; 277470e851cSJohn Baldwin struct uio *uio; 278470e851cSJohn Baldwin struct tls_mac_data *ad; 279470e851cSJohn Baldwin struct cryptop *crp; 280b33ff941SJohn Baldwin struct ktls_ocf_session *os; 28121e3c1fbSJohn Baldwin struct iovec iov[m->m_epg_npgs + 2]; 28221e3c1fbSJohn Baldwin u_int pgoff; 28347e2650eSJohn Baldwin int i, error; 28447e2650eSJohn Baldwin uint16_t tls_comp_len; 28547e2650eSJohn Baldwin uint8_t pad; 28621e3c1fbSJohn Baldwin 28721e3c1fbSJohn Baldwin MPASS(outiovcnt + 1 <= nitems(iov)); 28847e2650eSJohn Baldwin 289b33ff941SJohn Baldwin os = tls->ocf_session; 29021e3c1fbSJohn Baldwin hdr = (const struct tls_record_layer *)m->m_epg_hdr; 291470e851cSJohn Baldwin crp = &state->crp; 292470e851cSJohn Baldwin uio = &state->uio; 293470e851cSJohn Baldwin MPASS(tls->sync_dispatch); 29447e2650eSJohn Baldwin 29547e2650eSJohn Baldwin #ifdef INVARIANTS 29647e2650eSJohn Baldwin if (os->implicit_iv) { 29747e2650eSJohn Baldwin mtx_lock(&os->lock); 29847e2650eSJohn Baldwin KASSERT(!os->in_progress, 29947e2650eSJohn Baldwin ("concurrent implicit IV encryptions")); 30021e3c1fbSJohn Baldwin if (os->next_seqno != m->m_epg_seqno) { 30147e2650eSJohn Baldwin printf("KTLS CBC: TLS records out of order. " 30247e2650eSJohn Baldwin "Expected %ju, got %ju\n", 30321e3c1fbSJohn Baldwin (uintmax_t)os->next_seqno, 30421e3c1fbSJohn Baldwin (uintmax_t)m->m_epg_seqno); 30547e2650eSJohn Baldwin mtx_unlock(&os->lock); 30647e2650eSJohn Baldwin return (EINVAL); 30747e2650eSJohn Baldwin } 30847e2650eSJohn Baldwin os->in_progress = true; 30947e2650eSJohn Baldwin mtx_unlock(&os->lock); 31047e2650eSJohn Baldwin } 31147e2650eSJohn Baldwin #endif 31247e2650eSJohn Baldwin 31321e3c1fbSJohn Baldwin /* Payload length. */ 31421e3c1fbSJohn Baldwin tls_comp_len = m->m_len - (m->m_epg_hdrlen + m->m_epg_trllen); 31547e2650eSJohn Baldwin 31647e2650eSJohn Baldwin /* Initialize the AAD. */ 317470e851cSJohn Baldwin ad = &state->mac; 318470e851cSJohn Baldwin ad->seq = htobe64(m->m_epg_seqno); 319470e851cSJohn Baldwin ad->type = hdr->tls_type; 320470e851cSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 321470e851cSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 322470e851cSJohn Baldwin ad->tls_length = htons(tls_comp_len); 32347e2650eSJohn Baldwin 32447e2650eSJohn Baldwin /* First, compute the MAC. */ 325470e851cSJohn Baldwin iov[0].iov_base = ad; 326470e851cSJohn Baldwin iov[0].iov_len = sizeof(*ad); 32721e3c1fbSJohn Baldwin pgoff = m->m_epg_1st_off; 32821e3c1fbSJohn Baldwin for (i = 0; i < m->m_epg_npgs; i++, pgoff = 0) { 32921e3c1fbSJohn Baldwin iov[i + 1].iov_base = (void *)PHYS_TO_DMAP(m->m_epg_pa[i] + 33021e3c1fbSJohn Baldwin pgoff); 33121e3c1fbSJohn Baldwin iov[i + 1].iov_len = m_epg_pagelen(m, i, pgoff); 33221e3c1fbSJohn Baldwin } 33321e3c1fbSJohn Baldwin iov[m->m_epg_npgs + 1].iov_base = m->m_epg_trail; 33421e3c1fbSJohn Baldwin iov[m->m_epg_npgs + 1].iov_len = os->mac_len; 335470e851cSJohn Baldwin uio->uio_iov = iov; 336470e851cSJohn Baldwin uio->uio_iovcnt = m->m_epg_npgs + 2; 337470e851cSJohn Baldwin uio->uio_offset = 0; 338470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 339470e851cSJohn Baldwin uio->uio_td = curthread; 340470e851cSJohn Baldwin uio->uio_resid = sizeof(*ad) + tls_comp_len + os->mac_len; 34147e2650eSJohn Baldwin 342470e851cSJohn Baldwin crypto_initreq(crp, os->mac_sid); 343470e851cSJohn Baldwin crp->crp_payload_start = 0; 344470e851cSJohn Baldwin crp->crp_payload_length = sizeof(*ad) + tls_comp_len; 345470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_length; 346470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_COMPUTE_DIGEST; 347470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM; 348470e851cSJohn Baldwin crypto_use_uio(crp, uio); 349470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 35047e2650eSJohn Baldwin 351470e851cSJohn Baldwin crypto_destroyreq(crp); 35247e2650eSJohn Baldwin if (error) { 35347e2650eSJohn Baldwin #ifdef INVARIANTS 35447e2650eSJohn Baldwin if (os->implicit_iv) { 35547e2650eSJohn Baldwin mtx_lock(&os->lock); 35647e2650eSJohn Baldwin os->in_progress = false; 35747e2650eSJohn Baldwin mtx_unlock(&os->lock); 35847e2650eSJohn Baldwin } 35947e2650eSJohn Baldwin #endif 36047e2650eSJohn Baldwin return (error); 36147e2650eSJohn Baldwin } 36247e2650eSJohn Baldwin 36347e2650eSJohn Baldwin /* Second, add the padding. */ 36421e3c1fbSJohn Baldwin pad = m->m_epg_trllen - os->mac_len - 1; 36547e2650eSJohn Baldwin for (i = 0; i < pad + 1; i++) 36621e3c1fbSJohn Baldwin m->m_epg_trail[os->mac_len + i] = pad; 36747e2650eSJohn Baldwin 36847e2650eSJohn Baldwin /* Finally, encrypt the record. */ 369470e851cSJohn Baldwin crypto_initreq(crp, os->sid); 370470e851cSJohn Baldwin crp->crp_payload_start = m->m_epg_hdrlen; 371470e851cSJohn Baldwin crp->crp_payload_length = tls_comp_len + m->m_epg_trllen; 372470e851cSJohn Baldwin KASSERT(crp->crp_payload_length % AES_BLOCK_LEN == 0, 37321e3c1fbSJohn Baldwin ("invalid encryption size")); 374470e851cSJohn Baldwin crypto_use_single_mbuf(crp, m); 375470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_ENCRYPT; 376470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 37747e2650eSJohn Baldwin if (os->implicit_iv) 378470e851cSJohn Baldwin memcpy(crp->crp_iv, os->iv, AES_BLOCK_LEN); 37947e2650eSJohn Baldwin else 380470e851cSJohn Baldwin memcpy(crp->crp_iv, hdr + 1, AES_BLOCK_LEN); 38121e3c1fbSJohn Baldwin 38221e3c1fbSJohn Baldwin if (outiov != NULL) { 383470e851cSJohn Baldwin uio->uio_iov = outiov; 384470e851cSJohn Baldwin uio->uio_iovcnt = outiovcnt; 385470e851cSJohn Baldwin uio->uio_offset = 0; 386470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 387470e851cSJohn Baldwin uio->uio_td = curthread; 388470e851cSJohn Baldwin uio->uio_resid = crp->crp_payload_length; 389470e851cSJohn Baldwin crypto_use_output_uio(crp, uio); 39047e2650eSJohn Baldwin } 39147e2650eSJohn Baldwin 39247e2650eSJohn Baldwin if (os->implicit_iv) 39316bea05aSJohn Baldwin counter_u64_add(ocf_tls10_cbc_encrypts, 1); 39447e2650eSJohn Baldwin else 39516bea05aSJohn Baldwin counter_u64_add(ocf_tls11_cbc_encrypts, 1); 39621e3c1fbSJohn Baldwin if (outiov != NULL) 39747e2650eSJohn Baldwin counter_u64_add(ocf_separate_output, 1); 39821e3c1fbSJohn Baldwin else 39921e3c1fbSJohn Baldwin counter_u64_add(ocf_inplace, 1); 400470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 40147e2650eSJohn Baldwin 402470e851cSJohn Baldwin crypto_destroyreq(crp); 40347e2650eSJohn Baldwin 40447e2650eSJohn Baldwin if (os->implicit_iv) { 40547e2650eSJohn Baldwin KASSERT(os->mac_len + pad + 1 >= AES_BLOCK_LEN, 40647e2650eSJohn Baldwin ("trailer too short to read IV")); 40721e3c1fbSJohn Baldwin memcpy(os->iv, m->m_epg_trail + m->m_epg_trllen - AES_BLOCK_LEN, 40847e2650eSJohn Baldwin AES_BLOCK_LEN); 40947e2650eSJohn Baldwin #ifdef INVARIANTS 41047e2650eSJohn Baldwin mtx_lock(&os->lock); 41121e3c1fbSJohn Baldwin os->next_seqno = m->m_epg_seqno + 1; 41247e2650eSJohn Baldwin os->in_progress = false; 41347e2650eSJohn Baldwin mtx_unlock(&os->lock); 41447e2650eSJohn Baldwin #endif 41547e2650eSJohn Baldwin } 41647e2650eSJohn Baldwin return (error); 41747e2650eSJohn Baldwin } 41847e2650eSJohn Baldwin 419a4c5d490SJohn Baldwin static const struct ktls_ocf_sw ktls_ocf_tls_cbc_sw = { 420a4c5d490SJohn Baldwin .encrypt = ktls_ocf_tls_cbc_encrypt 421a4c5d490SJohn Baldwin }; 422a4c5d490SJohn Baldwin 42347e2650eSJohn Baldwin static int 424470e851cSJohn Baldwin ktls_ocf_tls12_aead_encrypt(struct ktls_ocf_encrypt_state *state, 425470e851cSJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 426470e851cSJohn Baldwin int outiovcnt) 427b2e60773SJohn Baldwin { 42821e3c1fbSJohn Baldwin const struct tls_record_layer *hdr; 429470e851cSJohn Baldwin struct uio *uio; 430470e851cSJohn Baldwin struct tls_aead_data *ad; 431470e851cSJohn Baldwin struct cryptop *crp; 432b33ff941SJohn Baldwin struct ktls_ocf_session *os; 43321e3c1fbSJohn Baldwin int error; 434b2e60773SJohn Baldwin uint16_t tls_comp_len; 435b2e60773SJohn Baldwin 436b33ff941SJohn Baldwin os = tls->ocf_session; 43721e3c1fbSJohn Baldwin hdr = (const struct tls_record_layer *)m->m_epg_hdr; 438470e851cSJohn Baldwin crp = &state->crp; 439470e851cSJohn Baldwin uio = &state->uio; 440b2e60773SJohn Baldwin 441470e851cSJohn Baldwin crypto_initreq(crp, os->sid); 442b2e60773SJohn Baldwin 443b2e60773SJohn Baldwin /* Setup the IV. */ 4444dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) { 445470e851cSJohn Baldwin memcpy(crp->crp_iv, tls->params.iv, TLS_AEAD_GCM_LEN); 446470e851cSJohn Baldwin memcpy(crp->crp_iv + TLS_AEAD_GCM_LEN, hdr + 1, 4474dd6800eSJohn Baldwin sizeof(uint64_t)); 4484dd6800eSJohn Baldwin } else { 4494dd6800eSJohn Baldwin /* 4504dd6800eSJohn Baldwin * Chacha20-Poly1305 constructs the IV for TLS 1.2 4514dd6800eSJohn Baldwin * identically to constructing the IV for AEAD in TLS 4524dd6800eSJohn Baldwin * 1.3. 4534dd6800eSJohn Baldwin */ 454470e851cSJohn Baldwin memcpy(crp->crp_iv, tls->params.iv, tls->params.iv_len); 455470e851cSJohn Baldwin *(uint64_t *)(crp->crp_iv + 4) ^= htobe64(m->m_epg_seqno); 4564dd6800eSJohn Baldwin } 457b2e60773SJohn Baldwin 458b2e60773SJohn Baldwin /* Setup the AAD. */ 459470e851cSJohn Baldwin ad = &state->aead; 46021e3c1fbSJohn Baldwin tls_comp_len = m->m_len - (m->m_epg_hdrlen + m->m_epg_trllen); 461470e851cSJohn Baldwin ad->seq = htobe64(m->m_epg_seqno); 462470e851cSJohn Baldwin ad->type = hdr->tls_type; 463470e851cSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 464470e851cSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 465470e851cSJohn Baldwin ad->tls_length = htons(tls_comp_len); 466470e851cSJohn Baldwin crp->crp_aad = ad; 467470e851cSJohn Baldwin crp->crp_aad_length = sizeof(*ad); 468b2e60773SJohn Baldwin 46921e3c1fbSJohn Baldwin /* Set fields for input payload. */ 470470e851cSJohn Baldwin crypto_use_single_mbuf(crp, m); 471470e851cSJohn Baldwin crp->crp_payload_start = m->m_epg_hdrlen; 472470e851cSJohn Baldwin crp->crp_payload_length = tls_comp_len; 473b2e60773SJohn Baldwin 47421e3c1fbSJohn Baldwin if (outiov != NULL) { 475470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_length; 47621e3c1fbSJohn Baldwin 477470e851cSJohn Baldwin uio->uio_iov = outiov; 478470e851cSJohn Baldwin uio->uio_iovcnt = outiovcnt; 479470e851cSJohn Baldwin uio->uio_offset = 0; 480470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 481470e851cSJohn Baldwin uio->uio_td = curthread; 482470e851cSJohn Baldwin uio->uio_resid = crp->crp_payload_length + tls->params.tls_tlen; 483470e851cSJohn Baldwin crypto_use_output_uio(crp, uio); 48421e3c1fbSJohn Baldwin } else 485470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_start + 486470e851cSJohn Baldwin crp->crp_payload_length; 487b2e60773SJohn Baldwin 488470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_ENCRYPT | CRYPTO_OP_COMPUTE_DIGEST; 489470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 4904dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 49116bea05aSJohn Baldwin counter_u64_add(ocf_tls12_gcm_encrypts, 1); 4924dd6800eSJohn Baldwin else 49316bea05aSJohn Baldwin counter_u64_add(ocf_tls12_chacha20_encrypts, 1); 49421e3c1fbSJohn Baldwin if (outiov != NULL) 495080933c0SJohn Baldwin counter_u64_add(ocf_separate_output, 1); 49621e3c1fbSJohn Baldwin else 49721e3c1fbSJohn Baldwin counter_u64_add(ocf_inplace, 1); 498470e851cSJohn Baldwin if (tls->sync_dispatch) { 499470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 500470e851cSJohn Baldwin crypto_destroyreq(crp); 501470e851cSJohn Baldwin } else 502470e851cSJohn Baldwin error = ktls_ocf_dispatch_async(state, crp); 50355b7a0e1SJohn Baldwin return (error); 50455b7a0e1SJohn Baldwin } 50555b7a0e1SJohn Baldwin 50655b7a0e1SJohn Baldwin static int 5074dd6800eSJohn Baldwin ktls_ocf_tls12_aead_decrypt(struct ktls_session *tls, 5083c0e5685SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, uint64_t seqno, 5093c0e5685SJohn Baldwin int *trailer_len) 5103c0e5685SJohn Baldwin { 5113c0e5685SJohn Baldwin struct tls_aead_data ad; 5123c0e5685SJohn Baldwin struct cryptop crp; 513b33ff941SJohn Baldwin struct ktls_ocf_session *os; 5143c0e5685SJohn Baldwin int error; 5153c0e5685SJohn Baldwin uint16_t tls_comp_len; 5163c0e5685SJohn Baldwin 517b33ff941SJohn Baldwin os = tls->ocf_session; 5183c0e5685SJohn Baldwin 5193c0e5685SJohn Baldwin crypto_initreq(&crp, os->sid); 5203c0e5685SJohn Baldwin 5213c0e5685SJohn Baldwin /* Setup the IV. */ 5224dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) { 5233c0e5685SJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, TLS_AEAD_GCM_LEN); 5244dd6800eSJohn Baldwin memcpy(crp.crp_iv + TLS_AEAD_GCM_LEN, hdr + 1, 5254dd6800eSJohn Baldwin sizeof(uint64_t)); 5264dd6800eSJohn Baldwin } else { 5274dd6800eSJohn Baldwin /* 5284dd6800eSJohn Baldwin * Chacha20-Poly1305 constructs the IV for TLS 1.2 5294dd6800eSJohn Baldwin * identically to constructing the IV for AEAD in TLS 5304dd6800eSJohn Baldwin * 1.3. 5314dd6800eSJohn Baldwin */ 5324dd6800eSJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, tls->params.iv_len); 5334dd6800eSJohn Baldwin *(uint64_t *)(crp.crp_iv + 4) ^= htobe64(seqno); 5344dd6800eSJohn Baldwin } 5353c0e5685SJohn Baldwin 5363c0e5685SJohn Baldwin /* Setup the AAD. */ 5374dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 5383c0e5685SJohn Baldwin tls_comp_len = ntohs(hdr->tls_length) - 5393c0e5685SJohn Baldwin (AES_GMAC_HASH_LEN + sizeof(uint64_t)); 5404dd6800eSJohn Baldwin else 5414dd6800eSJohn Baldwin tls_comp_len = ntohs(hdr->tls_length) - POLY1305_HASH_LEN; 5423c0e5685SJohn Baldwin ad.seq = htobe64(seqno); 5433c0e5685SJohn Baldwin ad.type = hdr->tls_type; 5443c0e5685SJohn Baldwin ad.tls_vmajor = hdr->tls_vmajor; 5453c0e5685SJohn Baldwin ad.tls_vminor = hdr->tls_vminor; 5463c0e5685SJohn Baldwin ad.tls_length = htons(tls_comp_len); 5473c0e5685SJohn Baldwin crp.crp_aad = &ad; 5483c0e5685SJohn Baldwin crp.crp_aad_length = sizeof(ad); 5493c0e5685SJohn Baldwin 5503c0e5685SJohn Baldwin crp.crp_payload_start = tls->params.tls_hlen; 5513c0e5685SJohn Baldwin crp.crp_payload_length = tls_comp_len; 5523c0e5685SJohn Baldwin crp.crp_digest_start = crp.crp_payload_start + crp.crp_payload_length; 5533c0e5685SJohn Baldwin 5543c0e5685SJohn Baldwin crp.crp_op = CRYPTO_OP_DECRYPT | CRYPTO_OP_VERIFY_DIGEST; 5553c0e5685SJohn Baldwin crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 5563c0e5685SJohn Baldwin crypto_use_mbuf(&crp, m); 5573c0e5685SJohn Baldwin 5584dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 55916bea05aSJohn Baldwin counter_u64_add(ocf_tls12_gcm_decrypts, 1); 5604dd6800eSJohn Baldwin else 56116bea05aSJohn Baldwin counter_u64_add(ocf_tls12_chacha20_decrypts, 1); 5623c0e5685SJohn Baldwin error = ktls_ocf_dispatch(os, &crp); 5633c0e5685SJohn Baldwin 5643c0e5685SJohn Baldwin crypto_destroyreq(&crp); 5654a92afaeSJohn Baldwin *trailer_len = tls->params.tls_tlen; 5663c0e5685SJohn Baldwin return (error); 5673c0e5685SJohn Baldwin } 5683c0e5685SJohn Baldwin 569*a8280123SJohn Baldwin /* 570*a8280123SJohn Baldwin * Reconstruct encrypted mbuf data in input buffer. 571*a8280123SJohn Baldwin */ 572*a8280123SJohn Baldwin static void 573*a8280123SJohn Baldwin ktls_ocf_recrypt_fixup(struct mbuf *m, u_int skip, u_int len, char *buf) 574*a8280123SJohn Baldwin { 575*a8280123SJohn Baldwin const char *src = buf; 576*a8280123SJohn Baldwin u_int todo; 577*a8280123SJohn Baldwin 578*a8280123SJohn Baldwin while (skip >= m->m_len) { 579*a8280123SJohn Baldwin skip -= m->m_len; 580*a8280123SJohn Baldwin m = m->m_next; 581*a8280123SJohn Baldwin } 582*a8280123SJohn Baldwin 583*a8280123SJohn Baldwin while (len > 0) { 584*a8280123SJohn Baldwin todo = m->m_len - skip; 585*a8280123SJohn Baldwin if (todo > len) 586*a8280123SJohn Baldwin todo = len; 587*a8280123SJohn Baldwin 588*a8280123SJohn Baldwin if (m->m_flags & M_DECRYPTED) 589*a8280123SJohn Baldwin memcpy(mtod(m, char *) + skip, src, todo); 590*a8280123SJohn Baldwin src += todo; 591*a8280123SJohn Baldwin len -= todo; 592*a8280123SJohn Baldwin skip = 0; 593*a8280123SJohn Baldwin m = m->m_next; 594*a8280123SJohn Baldwin } 595*a8280123SJohn Baldwin } 596*a8280123SJohn Baldwin 597*a8280123SJohn Baldwin static int 598*a8280123SJohn Baldwin ktls_ocf_tls12_aead_recrypt(struct ktls_session *tls, 599*a8280123SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, 600*a8280123SJohn Baldwin uint64_t seqno) 601*a8280123SJohn Baldwin { 602*a8280123SJohn Baldwin struct cryptop crp; 603*a8280123SJohn Baldwin struct ktls_ocf_session *os; 604*a8280123SJohn Baldwin char *buf; 605*a8280123SJohn Baldwin u_int payload_len; 606*a8280123SJohn Baldwin int error; 607*a8280123SJohn Baldwin 608*a8280123SJohn Baldwin os = tls->ocf_session; 609*a8280123SJohn Baldwin 610*a8280123SJohn Baldwin crypto_initreq(&crp, os->recrypt_sid); 611*a8280123SJohn Baldwin 612*a8280123SJohn Baldwin KASSERT(tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16, 613*a8280123SJohn Baldwin ("%s: only AES-GCM is supported", __func__)); 614*a8280123SJohn Baldwin 615*a8280123SJohn Baldwin /* Setup the IV. */ 616*a8280123SJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, TLS_AEAD_GCM_LEN); 617*a8280123SJohn Baldwin memcpy(crp.crp_iv + TLS_AEAD_GCM_LEN, hdr + 1, sizeof(uint64_t)); 618*a8280123SJohn Baldwin be32enc(crp.crp_iv + AES_GCM_IV_LEN, 2); 619*a8280123SJohn Baldwin 620*a8280123SJohn Baldwin payload_len = ntohs(hdr->tls_length) - 621*a8280123SJohn Baldwin (AES_GMAC_HASH_LEN + sizeof(uint64_t)); 622*a8280123SJohn Baldwin crp.crp_op = CRYPTO_OP_ENCRYPT; 623*a8280123SJohn Baldwin crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 624*a8280123SJohn Baldwin crypto_use_mbuf(&crp, m); 625*a8280123SJohn Baldwin crp.crp_payload_start = tls->params.tls_hlen; 626*a8280123SJohn Baldwin crp.crp_payload_length = payload_len; 627*a8280123SJohn Baldwin 628*a8280123SJohn Baldwin buf = malloc(payload_len, M_KTLS_OCF, M_WAITOK); 629*a8280123SJohn Baldwin crypto_use_output_buf(&crp, buf, payload_len); 630*a8280123SJohn Baldwin 631*a8280123SJohn Baldwin counter_u64_add(ocf_tls12_gcm_recrypts, 1); 632*a8280123SJohn Baldwin error = ktls_ocf_dispatch(os, &crp); 633*a8280123SJohn Baldwin 634*a8280123SJohn Baldwin crypto_destroyreq(&crp); 635*a8280123SJohn Baldwin 636*a8280123SJohn Baldwin if (error == 0) 637*a8280123SJohn Baldwin ktls_ocf_recrypt_fixup(m, tls->params.tls_hlen, payload_len, 638*a8280123SJohn Baldwin buf); 639*a8280123SJohn Baldwin 640*a8280123SJohn Baldwin free(buf, M_KTLS_OCF); 641*a8280123SJohn Baldwin return (error); 642*a8280123SJohn Baldwin } 643*a8280123SJohn Baldwin 644a4c5d490SJohn Baldwin static const struct ktls_ocf_sw ktls_ocf_tls12_aead_sw = { 645a4c5d490SJohn Baldwin .encrypt = ktls_ocf_tls12_aead_encrypt, 646*a8280123SJohn Baldwin .recrypt = ktls_ocf_tls12_aead_recrypt, 647a4c5d490SJohn Baldwin .decrypt = ktls_ocf_tls12_aead_decrypt, 648a4c5d490SJohn Baldwin }; 649a4c5d490SJohn Baldwin 6503c0e5685SJohn Baldwin static int 651470e851cSJohn Baldwin ktls_ocf_tls13_aead_encrypt(struct ktls_ocf_encrypt_state *state, 652470e851cSJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 653470e851cSJohn Baldwin int outiovcnt) 65455b7a0e1SJohn Baldwin { 65521e3c1fbSJohn Baldwin const struct tls_record_layer *hdr; 656470e851cSJohn Baldwin struct uio *uio; 657470e851cSJohn Baldwin struct tls_aead_data_13 *ad; 658470e851cSJohn Baldwin struct cryptop *crp; 659b33ff941SJohn Baldwin struct ktls_ocf_session *os; 66021e3c1fbSJohn Baldwin int error; 66155b7a0e1SJohn Baldwin 662b33ff941SJohn Baldwin os = tls->ocf_session; 66321e3c1fbSJohn Baldwin hdr = (const struct tls_record_layer *)m->m_epg_hdr; 664470e851cSJohn Baldwin crp = &state->crp; 665470e851cSJohn Baldwin uio = &state->uio; 66655b7a0e1SJohn Baldwin 667470e851cSJohn Baldwin crypto_initreq(crp, os->sid); 66855b7a0e1SJohn Baldwin 66955b7a0e1SJohn Baldwin /* Setup the nonce. */ 670663ae8f7SJohn Baldwin memcpy(crp->crp_iv, tls->params.iv, tls->params.iv_len); 671663ae8f7SJohn Baldwin *(uint64_t *)(crp->crp_iv + 4) ^= htobe64(m->m_epg_seqno); 67255b7a0e1SJohn Baldwin 67355b7a0e1SJohn Baldwin /* Setup the AAD. */ 674470e851cSJohn Baldwin ad = &state->aead13; 675470e851cSJohn Baldwin ad->type = hdr->tls_type; 676470e851cSJohn Baldwin ad->tls_vmajor = hdr->tls_vmajor; 677470e851cSJohn Baldwin ad->tls_vminor = hdr->tls_vminor; 678470e851cSJohn Baldwin ad->tls_length = hdr->tls_length; 679470e851cSJohn Baldwin crp->crp_aad = ad; 680470e851cSJohn Baldwin crp->crp_aad_length = sizeof(*ad); 681080933c0SJohn Baldwin 68221e3c1fbSJohn Baldwin /* Set fields for input payload. */ 683470e851cSJohn Baldwin crypto_use_single_mbuf(crp, m); 684470e851cSJohn Baldwin crp->crp_payload_start = m->m_epg_hdrlen; 685470e851cSJohn Baldwin crp->crp_payload_length = m->m_len - 686470e851cSJohn Baldwin (m->m_epg_hdrlen + m->m_epg_trllen); 68755b7a0e1SJohn Baldwin 6885b750b9aSJohn Baldwin /* Store the record type as the first byte of the trailer. */ 68921e3c1fbSJohn Baldwin m->m_epg_trail[0] = m->m_epg_record_type; 690470e851cSJohn Baldwin crp->crp_payload_length++; 69121e3c1fbSJohn Baldwin 69221e3c1fbSJohn Baldwin if (outiov != NULL) { 693470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_length; 6945b750b9aSJohn Baldwin 695470e851cSJohn Baldwin uio->uio_iov = outiov; 696470e851cSJohn Baldwin uio->uio_iovcnt = outiovcnt; 697470e851cSJohn Baldwin uio->uio_offset = 0; 698470e851cSJohn Baldwin uio->uio_segflg = UIO_SYSSPACE; 699470e851cSJohn Baldwin uio->uio_td = curthread; 700470e851cSJohn Baldwin uio->uio_resid = m->m_len - m->m_epg_hdrlen; 701470e851cSJohn Baldwin crypto_use_output_uio(crp, uio); 70221e3c1fbSJohn Baldwin } else 703470e851cSJohn Baldwin crp->crp_digest_start = crp->crp_payload_start + 704470e851cSJohn Baldwin crp->crp_payload_length; 70555b7a0e1SJohn Baldwin 706470e851cSJohn Baldwin crp->crp_op = CRYPTO_OP_ENCRYPT | CRYPTO_OP_COMPUTE_DIGEST; 707470e851cSJohn Baldwin crp->crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 70855b7a0e1SJohn Baldwin 7094dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 71016bea05aSJohn Baldwin counter_u64_add(ocf_tls13_gcm_encrypts, 1); 7114dd6800eSJohn Baldwin else 71216bea05aSJohn Baldwin counter_u64_add(ocf_tls13_chacha20_encrypts, 1); 71321e3c1fbSJohn Baldwin if (outiov != NULL) 714080933c0SJohn Baldwin counter_u64_add(ocf_separate_output, 1); 71521e3c1fbSJohn Baldwin else 71621e3c1fbSJohn Baldwin counter_u64_add(ocf_inplace, 1); 717470e851cSJohn Baldwin if (tls->sync_dispatch) { 718470e851cSJohn Baldwin error = ktls_ocf_dispatch(os, crp); 719470e851cSJohn Baldwin crypto_destroyreq(crp); 720470e851cSJohn Baldwin } else 721470e851cSJohn Baldwin error = ktls_ocf_dispatch_async(state, crp); 722b2e60773SJohn Baldwin return (error); 723b2e60773SJohn Baldwin } 724b2e60773SJohn Baldwin 72505a1d0f5SJohn Baldwin static int 72605a1d0f5SJohn Baldwin ktls_ocf_tls13_aead_decrypt(struct ktls_session *tls, 72705a1d0f5SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, uint64_t seqno, 72805a1d0f5SJohn Baldwin int *trailer_len) 72905a1d0f5SJohn Baldwin { 73005a1d0f5SJohn Baldwin struct tls_aead_data_13 ad; 73105a1d0f5SJohn Baldwin struct cryptop crp; 73205a1d0f5SJohn Baldwin struct ktls_ocf_session *os; 73305a1d0f5SJohn Baldwin int error; 73405a1d0f5SJohn Baldwin u_int tag_len; 73505a1d0f5SJohn Baldwin 73605a1d0f5SJohn Baldwin os = tls->ocf_session; 73705a1d0f5SJohn Baldwin 73805a1d0f5SJohn Baldwin tag_len = tls->params.tls_tlen - 1; 73905a1d0f5SJohn Baldwin 74005a1d0f5SJohn Baldwin /* Payload must contain at least one byte for the record type. */ 74105a1d0f5SJohn Baldwin if (ntohs(hdr->tls_length) < tag_len + 1) 74205a1d0f5SJohn Baldwin return (EBADMSG); 74305a1d0f5SJohn Baldwin 74405a1d0f5SJohn Baldwin crypto_initreq(&crp, os->sid); 74505a1d0f5SJohn Baldwin 74605a1d0f5SJohn Baldwin /* Setup the nonce. */ 74705a1d0f5SJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, tls->params.iv_len); 74805a1d0f5SJohn Baldwin *(uint64_t *)(crp.crp_iv + 4) ^= htobe64(seqno); 74905a1d0f5SJohn Baldwin 75005a1d0f5SJohn Baldwin /* Setup the AAD. */ 75105a1d0f5SJohn Baldwin ad.type = hdr->tls_type; 75205a1d0f5SJohn Baldwin ad.tls_vmajor = hdr->tls_vmajor; 75305a1d0f5SJohn Baldwin ad.tls_vminor = hdr->tls_vminor; 75405a1d0f5SJohn Baldwin ad.tls_length = hdr->tls_length; 75505a1d0f5SJohn Baldwin crp.crp_aad = &ad; 75605a1d0f5SJohn Baldwin crp.crp_aad_length = sizeof(ad); 75705a1d0f5SJohn Baldwin 75805a1d0f5SJohn Baldwin crp.crp_payload_start = tls->params.tls_hlen; 75905a1d0f5SJohn Baldwin crp.crp_payload_length = ntohs(hdr->tls_length) - tag_len; 76005a1d0f5SJohn Baldwin crp.crp_digest_start = crp.crp_payload_start + crp.crp_payload_length; 76105a1d0f5SJohn Baldwin 76205a1d0f5SJohn Baldwin crp.crp_op = CRYPTO_OP_DECRYPT | CRYPTO_OP_VERIFY_DIGEST; 76305a1d0f5SJohn Baldwin crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 76405a1d0f5SJohn Baldwin crypto_use_mbuf(&crp, m); 76505a1d0f5SJohn Baldwin 76605a1d0f5SJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) 76705a1d0f5SJohn Baldwin counter_u64_add(ocf_tls13_gcm_decrypts, 1); 76805a1d0f5SJohn Baldwin else 76905a1d0f5SJohn Baldwin counter_u64_add(ocf_tls13_chacha20_decrypts, 1); 77005a1d0f5SJohn Baldwin error = ktls_ocf_dispatch(os, &crp); 77105a1d0f5SJohn Baldwin 77205a1d0f5SJohn Baldwin crypto_destroyreq(&crp); 77305a1d0f5SJohn Baldwin *trailer_len = tag_len; 77405a1d0f5SJohn Baldwin return (error); 77505a1d0f5SJohn Baldwin } 77605a1d0f5SJohn Baldwin 777*a8280123SJohn Baldwin static int 778*a8280123SJohn Baldwin ktls_ocf_tls13_aead_recrypt(struct ktls_session *tls, 779*a8280123SJohn Baldwin const struct tls_record_layer *hdr, struct mbuf *m, 780*a8280123SJohn Baldwin uint64_t seqno) 781*a8280123SJohn Baldwin { 782*a8280123SJohn Baldwin struct cryptop crp; 783*a8280123SJohn Baldwin struct ktls_ocf_session *os; 784*a8280123SJohn Baldwin char *buf; 785*a8280123SJohn Baldwin u_int payload_len; 786*a8280123SJohn Baldwin int error; 787*a8280123SJohn Baldwin 788*a8280123SJohn Baldwin os = tls->ocf_session; 789*a8280123SJohn Baldwin 790*a8280123SJohn Baldwin crypto_initreq(&crp, os->recrypt_sid); 791*a8280123SJohn Baldwin 792*a8280123SJohn Baldwin KASSERT(tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16, 793*a8280123SJohn Baldwin ("%s: only AES-GCM is supported", __func__)); 794*a8280123SJohn Baldwin 795*a8280123SJohn Baldwin /* Setup the IV. */ 796*a8280123SJohn Baldwin memcpy(crp.crp_iv, tls->params.iv, tls->params.iv_len); 797*a8280123SJohn Baldwin *(uint64_t *)(crp.crp_iv + 4) ^= htobe64(seqno); 798*a8280123SJohn Baldwin be32enc(crp.crp_iv + 12, 2); 799*a8280123SJohn Baldwin 800*a8280123SJohn Baldwin payload_len = ntohs(hdr->tls_length) - AES_GMAC_HASH_LEN; 801*a8280123SJohn Baldwin crp.crp_op = CRYPTO_OP_ENCRYPT; 802*a8280123SJohn Baldwin crp.crp_flags = CRYPTO_F_CBIMM | CRYPTO_F_IV_SEPARATE; 803*a8280123SJohn Baldwin crypto_use_mbuf(&crp, m); 804*a8280123SJohn Baldwin crp.crp_payload_start = tls->params.tls_hlen; 805*a8280123SJohn Baldwin crp.crp_payload_length = payload_len; 806*a8280123SJohn Baldwin 807*a8280123SJohn Baldwin buf = malloc(payload_len, M_KTLS_OCF, M_WAITOK); 808*a8280123SJohn Baldwin crypto_use_output_buf(&crp, buf, payload_len); 809*a8280123SJohn Baldwin 810*a8280123SJohn Baldwin counter_u64_add(ocf_tls13_gcm_recrypts, 1); 811*a8280123SJohn Baldwin error = ktls_ocf_dispatch(os, &crp); 812*a8280123SJohn Baldwin 813*a8280123SJohn Baldwin crypto_destroyreq(&crp); 814*a8280123SJohn Baldwin 815*a8280123SJohn Baldwin if (error == 0) 816*a8280123SJohn Baldwin ktls_ocf_recrypt_fixup(m, tls->params.tls_hlen, payload_len, 817*a8280123SJohn Baldwin buf); 818*a8280123SJohn Baldwin 819*a8280123SJohn Baldwin free(buf, M_KTLS_OCF); 820*a8280123SJohn Baldwin return (error); 821*a8280123SJohn Baldwin } 822*a8280123SJohn Baldwin 823a4c5d490SJohn Baldwin static const struct ktls_ocf_sw ktls_ocf_tls13_aead_sw = { 824a4c5d490SJohn Baldwin .encrypt = ktls_ocf_tls13_aead_encrypt, 825*a8280123SJohn Baldwin .recrypt = ktls_ocf_tls13_aead_recrypt, 826a4c5d490SJohn Baldwin .decrypt = ktls_ocf_tls13_aead_decrypt, 827a4c5d490SJohn Baldwin }; 828a4c5d490SJohn Baldwin 82921e3c1fbSJohn Baldwin void 830b2e60773SJohn Baldwin ktls_ocf_free(struct ktls_session *tls) 831b2e60773SJohn Baldwin { 832b33ff941SJohn Baldwin struct ktls_ocf_session *os; 833b2e60773SJohn Baldwin 834b33ff941SJohn Baldwin os = tls->ocf_session; 835c0341432SJohn Baldwin crypto_freesession(os->sid); 8364b337adaSJohn Baldwin crypto_freesession(os->mac_sid); 837*a8280123SJohn Baldwin crypto_freesession(os->recrypt_sid); 838b2e60773SJohn Baldwin mtx_destroy(&os->lock); 8394a711b8dSJohn Baldwin zfree(os, M_KTLS_OCF); 840b2e60773SJohn Baldwin } 841b2e60773SJohn Baldwin 84221e3c1fbSJohn Baldwin int 8433c0e5685SJohn Baldwin ktls_ocf_try(struct socket *so, struct ktls_session *tls, int direction) 844b2e60773SJohn Baldwin { 845*a8280123SJohn Baldwin struct crypto_session_params csp, mac_csp, recrypt_csp; 846b33ff941SJohn Baldwin struct ktls_ocf_session *os; 84747e2650eSJohn Baldwin int error, mac_len; 848b2e60773SJohn Baldwin 849c0341432SJohn Baldwin memset(&csp, 0, sizeof(csp)); 85047e2650eSJohn Baldwin memset(&mac_csp, 0, sizeof(mac_csp)); 85147e2650eSJohn Baldwin mac_csp.csp_mode = CSP_MODE_NONE; 85247e2650eSJohn Baldwin mac_len = 0; 853*a8280123SJohn Baldwin memset(&recrypt_csp, 0, sizeof(mac_csp)); 854*a8280123SJohn Baldwin recrypt_csp.csp_mode = CSP_MODE_NONE; 855b2e60773SJohn Baldwin 856b2e60773SJohn Baldwin switch (tls->params.cipher_algorithm) { 857b2e60773SJohn Baldwin case CRYPTO_AES_NIST_GCM_16: 858b2e60773SJohn Baldwin switch (tls->params.cipher_key_len) { 859b2e60773SJohn Baldwin case 128 / 8: 860b2e60773SJohn Baldwin case 256 / 8: 861b2e60773SJohn Baldwin break; 862b2e60773SJohn Baldwin default: 863b2e60773SJohn Baldwin return (EINVAL); 864b2e60773SJohn Baldwin } 865b2e60773SJohn Baldwin 86655b7a0e1SJohn Baldwin /* Only TLS 1.2 and 1.3 are supported. */ 867b2e60773SJohn Baldwin if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 86855b7a0e1SJohn Baldwin tls->params.tls_vminor < TLS_MINOR_VER_TWO || 86955b7a0e1SJohn Baldwin tls->params.tls_vminor > TLS_MINOR_VER_THREE) 870b2e60773SJohn Baldwin return (EPROTONOSUPPORT); 871b2e60773SJohn Baldwin 87247e2650eSJohn Baldwin csp.csp_flags |= CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD; 87347e2650eSJohn Baldwin csp.csp_mode = CSP_MODE_AEAD; 87447e2650eSJohn Baldwin csp.csp_cipher_alg = CRYPTO_AES_NIST_GCM_16; 87547e2650eSJohn Baldwin csp.csp_cipher_key = tls->params.cipher_key; 87647e2650eSJohn Baldwin csp.csp_cipher_klen = tls->params.cipher_key_len; 87747e2650eSJohn Baldwin csp.csp_ivlen = AES_GCM_IV_LEN; 878*a8280123SJohn Baldwin 879*a8280123SJohn Baldwin recrypt_csp.csp_flags |= CSP_F_SEPARATE_OUTPUT; 880*a8280123SJohn Baldwin recrypt_csp.csp_mode = CSP_MODE_CIPHER; 881*a8280123SJohn Baldwin recrypt_csp.csp_cipher_alg = CRYPTO_AES_ICM; 882*a8280123SJohn Baldwin recrypt_csp.csp_cipher_key = tls->params.cipher_key; 883*a8280123SJohn Baldwin recrypt_csp.csp_cipher_klen = tls->params.cipher_key_len; 884*a8280123SJohn Baldwin recrypt_csp.csp_ivlen = AES_BLOCK_LEN; 88547e2650eSJohn Baldwin break; 88647e2650eSJohn Baldwin case CRYPTO_AES_CBC: 88747e2650eSJohn Baldwin switch (tls->params.cipher_key_len) { 88847e2650eSJohn Baldwin case 128 / 8: 88947e2650eSJohn Baldwin case 256 / 8: 89047e2650eSJohn Baldwin break; 89147e2650eSJohn Baldwin default: 89247e2650eSJohn Baldwin return (EINVAL); 89347e2650eSJohn Baldwin } 89447e2650eSJohn Baldwin 89547e2650eSJohn Baldwin switch (tls->params.auth_algorithm) { 89647e2650eSJohn Baldwin case CRYPTO_SHA1_HMAC: 89747e2650eSJohn Baldwin mac_len = SHA1_HASH_LEN; 89847e2650eSJohn Baldwin break; 89947e2650eSJohn Baldwin case CRYPTO_SHA2_256_HMAC: 90047e2650eSJohn Baldwin mac_len = SHA2_256_HASH_LEN; 90147e2650eSJohn Baldwin break; 90247e2650eSJohn Baldwin case CRYPTO_SHA2_384_HMAC: 90347e2650eSJohn Baldwin mac_len = SHA2_384_HASH_LEN; 90447e2650eSJohn Baldwin break; 90547e2650eSJohn Baldwin default: 90647e2650eSJohn Baldwin return (EINVAL); 90747e2650eSJohn Baldwin } 90847e2650eSJohn Baldwin 90947e2650eSJohn Baldwin /* Only TLS 1.0-1.2 are supported. */ 91047e2650eSJohn Baldwin if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 91147e2650eSJohn Baldwin tls->params.tls_vminor < TLS_MINOR_VER_ZERO || 91247e2650eSJohn Baldwin tls->params.tls_vminor > TLS_MINOR_VER_TWO) 91347e2650eSJohn Baldwin return (EPROTONOSUPPORT); 91447e2650eSJohn Baldwin 91547e2650eSJohn Baldwin /* AES-CBC is not supported for receive. */ 91647e2650eSJohn Baldwin if (direction == KTLS_RX) 91747e2650eSJohn Baldwin return (EPROTONOSUPPORT); 91847e2650eSJohn Baldwin 91947e2650eSJohn Baldwin csp.csp_flags |= CSP_F_SEPARATE_OUTPUT; 92047e2650eSJohn Baldwin csp.csp_mode = CSP_MODE_CIPHER; 92147e2650eSJohn Baldwin csp.csp_cipher_alg = CRYPTO_AES_CBC; 92247e2650eSJohn Baldwin csp.csp_cipher_key = tls->params.cipher_key; 92347e2650eSJohn Baldwin csp.csp_cipher_klen = tls->params.cipher_key_len; 92447e2650eSJohn Baldwin csp.csp_ivlen = AES_BLOCK_LEN; 92547e2650eSJohn Baldwin 92647e2650eSJohn Baldwin mac_csp.csp_flags |= CSP_F_SEPARATE_OUTPUT; 92747e2650eSJohn Baldwin mac_csp.csp_mode = CSP_MODE_DIGEST; 92847e2650eSJohn Baldwin mac_csp.csp_auth_alg = tls->params.auth_algorithm; 92947e2650eSJohn Baldwin mac_csp.csp_auth_key = tls->params.auth_key; 93047e2650eSJohn Baldwin mac_csp.csp_auth_klen = tls->params.auth_key_len; 93147e2650eSJohn Baldwin break; 9324dd6800eSJohn Baldwin case CRYPTO_CHACHA20_POLY1305: 9334dd6800eSJohn Baldwin switch (tls->params.cipher_key_len) { 9344dd6800eSJohn Baldwin case 256 / 8: 9354dd6800eSJohn Baldwin break; 9364dd6800eSJohn Baldwin default: 9374dd6800eSJohn Baldwin return (EINVAL); 9384dd6800eSJohn Baldwin } 9394dd6800eSJohn Baldwin 9404dd6800eSJohn Baldwin /* Only TLS 1.2 and 1.3 are supported. */ 9414dd6800eSJohn Baldwin if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 9424dd6800eSJohn Baldwin tls->params.tls_vminor < TLS_MINOR_VER_TWO || 9434dd6800eSJohn Baldwin tls->params.tls_vminor > TLS_MINOR_VER_THREE) 9444dd6800eSJohn Baldwin return (EPROTONOSUPPORT); 9454dd6800eSJohn Baldwin 9464dd6800eSJohn Baldwin csp.csp_flags |= CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD; 9474dd6800eSJohn Baldwin csp.csp_mode = CSP_MODE_AEAD; 9484dd6800eSJohn Baldwin csp.csp_cipher_alg = CRYPTO_CHACHA20_POLY1305; 9494dd6800eSJohn Baldwin csp.csp_cipher_key = tls->params.cipher_key; 9504dd6800eSJohn Baldwin csp.csp_cipher_klen = tls->params.cipher_key_len; 9514dd6800eSJohn Baldwin csp.csp_ivlen = CHACHA20_POLY1305_IV_LEN; 9524dd6800eSJohn Baldwin break; 95347e2650eSJohn Baldwin default: 95447e2650eSJohn Baldwin return (EPROTONOSUPPORT); 95547e2650eSJohn Baldwin } 95647e2650eSJohn Baldwin 957b2e60773SJohn Baldwin os = malloc(sizeof(*os), M_KTLS_OCF, M_NOWAIT | M_ZERO); 958b2e60773SJohn Baldwin if (os == NULL) 959b2e60773SJohn Baldwin return (ENOMEM); 960b2e60773SJohn Baldwin 961c0341432SJohn Baldwin error = crypto_newsession(&os->sid, &csp, 962b2e60773SJohn Baldwin CRYPTO_FLAG_HARDWARE | CRYPTO_FLAG_SOFTWARE); 963b2e60773SJohn Baldwin if (error) { 964b2e60773SJohn Baldwin free(os, M_KTLS_OCF); 965b2e60773SJohn Baldwin return (error); 966b2e60773SJohn Baldwin } 967b2e60773SJohn Baldwin 96847e2650eSJohn Baldwin if (mac_csp.csp_mode != CSP_MODE_NONE) { 96947e2650eSJohn Baldwin error = crypto_newsession(&os->mac_sid, &mac_csp, 97047e2650eSJohn Baldwin CRYPTO_FLAG_HARDWARE | CRYPTO_FLAG_SOFTWARE); 97147e2650eSJohn Baldwin if (error) { 97247e2650eSJohn Baldwin crypto_freesession(os->sid); 97347e2650eSJohn Baldwin free(os, M_KTLS_OCF); 97447e2650eSJohn Baldwin return (error); 97547e2650eSJohn Baldwin } 97647e2650eSJohn Baldwin os->mac_len = mac_len; 97747e2650eSJohn Baldwin } 97847e2650eSJohn Baldwin 979*a8280123SJohn Baldwin if (recrypt_csp.csp_mode != CSP_MODE_NONE) { 980*a8280123SJohn Baldwin error = crypto_newsession(&os->recrypt_sid, &recrypt_csp, 981*a8280123SJohn Baldwin CRYPTO_FLAG_HARDWARE | CRYPTO_FLAG_SOFTWARE); 982*a8280123SJohn Baldwin if (error) { 983*a8280123SJohn Baldwin crypto_freesession(os->sid); 984*a8280123SJohn Baldwin free(os, M_KTLS_OCF); 985*a8280123SJohn Baldwin return (error); 986*a8280123SJohn Baldwin } 987*a8280123SJohn Baldwin } 988*a8280123SJohn Baldwin 989b2e60773SJohn Baldwin mtx_init(&os->lock, "ktls_ocf", NULL, MTX_DEF); 990b33ff941SJohn Baldwin tls->ocf_session = os; 9914dd6800eSJohn Baldwin if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16 || 9924dd6800eSJohn Baldwin tls->params.cipher_algorithm == CRYPTO_CHACHA20_POLY1305) { 99355b7a0e1SJohn Baldwin if (tls->params.tls_vminor == TLS_MINOR_VER_THREE) 994a4c5d490SJohn Baldwin os->sw = &ktls_ocf_tls13_aead_sw; 99555b7a0e1SJohn Baldwin else 996a4c5d490SJohn Baldwin os->sw = &ktls_ocf_tls12_aead_sw; 9973c0e5685SJohn Baldwin } else { 998a4c5d490SJohn Baldwin os->sw = &ktls_ocf_tls_cbc_sw; 99947e2650eSJohn Baldwin if (tls->params.tls_vminor == TLS_MINOR_VER_ZERO) { 100047e2650eSJohn Baldwin os->implicit_iv = true; 100147e2650eSJohn Baldwin memcpy(os->iv, tls->params.iv, AES_BLOCK_LEN); 10024827bf76SJohn Baldwin #ifdef INVARIANTS 10034827bf76SJohn Baldwin os->next_seqno = tls->next_seqno; 10044827bf76SJohn Baldwin #endif 100547e2650eSJohn Baldwin } 100647e2650eSJohn Baldwin } 1007470e851cSJohn Baldwin 1008470e851cSJohn Baldwin /* 1009470e851cSJohn Baldwin * AES-CBC is always synchronous currently. Asynchronous 1010470e851cSJohn Baldwin * operation would require multiple callbacks and an additional 1011470e851cSJohn Baldwin * iovec array in ktls_ocf_encrypt_state. 1012470e851cSJohn Baldwin */ 1013470e851cSJohn Baldwin tls->sync_dispatch = CRYPTO_SESS_SYNC(os->sid) || 1014470e851cSJohn Baldwin tls->params.cipher_algorithm == CRYPTO_AES_CBC; 1015b2e60773SJohn Baldwin return (0); 1016b2e60773SJohn Baldwin } 1017a4c5d490SJohn Baldwin 1018a4c5d490SJohn Baldwin int 1019a4c5d490SJohn Baldwin ktls_ocf_encrypt(struct ktls_ocf_encrypt_state *state, 1020a4c5d490SJohn Baldwin struct ktls_session *tls, struct mbuf *m, struct iovec *outiov, 1021a4c5d490SJohn Baldwin int outiovcnt) 1022a4c5d490SJohn Baldwin { 1023a4c5d490SJohn Baldwin return (tls->ocf_session->sw->encrypt(state, tls, m, outiov, 1024a4c5d490SJohn Baldwin outiovcnt)); 1025a4c5d490SJohn Baldwin } 1026a4c5d490SJohn Baldwin 1027a4c5d490SJohn Baldwin int 1028a4c5d490SJohn Baldwin ktls_ocf_decrypt(struct ktls_session *tls, const struct tls_record_layer *hdr, 1029a4c5d490SJohn Baldwin struct mbuf *m, uint64_t seqno, int *trailer_len) 1030a4c5d490SJohn Baldwin { 1031a4c5d490SJohn Baldwin return (tls->ocf_session->sw->decrypt(tls, hdr, m, seqno, trailer_len)); 1032a4c5d490SJohn Baldwin } 1033*a8280123SJohn Baldwin 1034*a8280123SJohn Baldwin int 1035*a8280123SJohn Baldwin ktls_ocf_recrypt(struct ktls_session *tls, const struct tls_record_layer *hdr, 1036*a8280123SJohn Baldwin struct mbuf *m, uint64_t seqno) 1037*a8280123SJohn Baldwin { 1038*a8280123SJohn Baldwin return (tls->ocf_session->sw->recrypt(tls, hdr, m, seqno)); 1039*a8280123SJohn Baldwin } 1040*a8280123SJohn Baldwin 1041*a8280123SJohn Baldwin bool 1042*a8280123SJohn Baldwin ktls_ocf_recrypt_supported(struct ktls_session *tls) 1043*a8280123SJohn Baldwin { 1044*a8280123SJohn Baldwin return (tls->ocf_session->sw->recrypt != NULL && 1045*a8280123SJohn Baldwin tls->ocf_session->recrypt_sid != NULL); 1046*a8280123SJohn Baldwin } 1047