38#include <sys/malloc.h>
40#include <sys/module.h>
41#include <sys/sglist.h>
43#include <opencrypto/cryptodev.h>
44#include <opencrypto/xform.h>
46#include "cryptodev_if.h"
122#define MAX_AAD_LEN 511
130#define MAX_RX_PHYS_DSGL_SGE 32
131#define DSGL_SGE_MAXLEN 2048
138#define MAX_REQUEST_SIZE 65535
253 struct sysctl_ctx_list
ctx;
283 switch (cb->cb_type) {
284 case CRYPTO_BUF_MBUF:
285 error = sglist_append_mbuf(sg, cb->cb_mbuf);
287 case CRYPTO_BUF_SINGLE_MBUF:
288 error = sglist_append_single_mbuf(sg, cb->cb_mbuf);
291 error = sglist_append_uio(sg, cb->cb_uio);
293 case CRYPTO_BUF_CONTIG:
294 error = sglist_append(sg, cb->cb_buf, cb->cb_buf_len);
296 case CRYPTO_BUF_VMPAGE:
297 error = sglist_append_vmpages(sg, cb->cb_vm_page,
298 cb->cb_vm_page_len, cb->cb_vm_page_offset);
316 for (i = 0; i < sg->sg_nseg; i++)
317 nsegs += howmany(sg->sg_segs[i].ss_len, maxsegsize);
328 if ((nsegs % 8) != 0) {
329 len +=
sizeof(uint16_t) * 8;
330 len += roundup2(nsegs % 8, 2) *
sizeof(uint64_t);
360 for (i = 0; i < sg->sg_nseg; i++) {
361 seglen = sg->sg_segs[i].ss_len;
362 paddr = sg->sg_segs[i].ss_paddr;
364 sgl->
addr[j] = htobe64(paddr);
370 sgl->
len[j] = htobe16(seglen);
378 }
while (seglen != 0);
380 MPASS(j + 8 * (sgl - (
struct phys_sge_pairs *)(cpl + 1)) == nsegs);
390 n =
sizeof(
struct ulptx_sgl) + 8 * ((3 * nsegs) / 2 + (nsegs & 1));
391 return (roundup2(n, 16));
399 struct sglist_seg *
ss;
403 MPASS(nsegs == sg->sg_nseg);
404 ss = &sg->sg_segs[0];
408 usgl->
len0 = htobe32(
ss->ss_len);
409 usgl->
addr0 = htobe64(
ss->ss_paddr);
411 for (i = 0; i < sg->sg_nseg - 1; i++) {
412 usgl->
sge[i / 2].
len[i & 1] = htobe32(
ss->ss_len);
413 usgl->
sge[i / 2].
addr[i & 1] = htobe64(
ss->ss_paddr);
424 if (roundup2(transhdr_len, 16) + roundup2(input_len, 16) >
432 struct chcr_wr *crwr, u_int kctx_len, u_int wr_len, u_int imm_len,
433 u_int sgl_len, u_int hash_size,
struct cryptop *crp)
435 u_int cctx_size, idata_len;
437 cctx_size =
sizeof(
struct _key_ctx) + kctx_len;
471 idata_len = wr_len - offsetof(
struct chcr_wr, sec_cpl) - sgl_len;
472 if (imm_len % 16 != 0)
473 idata_len -= 16 - imm_len % 16;
482 const struct auth_hash *axf;
484 u_int hash_size_in_response, kctx_flits, kctx_len, transhdr_len, wr_len;
485 u_int hmac_ctrl, imm_len, iopad_size;
486 int error, sgl_nsegs, sgl_len, use_opad;
494 if (s->
mode == HMAC) {
509 kctx_len = iopad_size;
511 kctx_len += iopad_size;
512 hash_size_in_response = axf->hashsize;
515 if (crp->crp_payload_length == 0) {
516 imm_len = axf->blocksize;
520 imm_len = crp->crp_payload_length;
527 crp->crp_payload_start, crp->crp_payload_length);
534 wr_len = roundup2(transhdr_len, 16) + roundup2(imm_len, 16) + sgl_len;
543 memset(crwr, 0, wr_len);
546 hash_size_in_response, crp);
555 crwr->
sec_cpl.
pldlen = htobe32(crp->crp_payload_length == 0 ?
556 axf->blocksize : crp->crp_payload_length);
576 kctx_flits = (
sizeof(
struct _key_ctx) + kctx_len) / 16;
584 if (crp->crp_payload_length == 0) {
587 *(uint64_t *)(dst + axf->blocksize -
sizeof(uint64_t)) =
588 htobe64(axf->blocksize << 3);
589 }
else if (imm_len != 0)
590 crypto_copydata(crp, crp->crp_payload_start,
591 crp->crp_payload_length, dst);
605 uint8_t hash[HASH_MAX_LEN];
610 if (crp->crp_op & CRYPTO_OP_VERIFY_DIGEST) {
611 crypto_copydata(crp, crp->crp_digest_start, s->
hmac.
hash_len,
613 if (timingsafe_bcmp((cpl + 1), hash, s->
hmac.
hash_len) != 0)
616 crypto_copyback(crp, crp->crp_digest_start, s->
hmac.
hash_len,
628 u_int kctx_len, key_half, op_type, transhdr_len,
wr_len;
629 u_int imm_len, iv_len;
630 int dsgl_nsegs, dsgl_len;
631 int sgl_nsegs, sgl_len;
637 (crp->crp_payload_length % AES_BLOCK_LEN) != 0)
644 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
650 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
652 crp->crp_payload_output_start, crp->crp_payload_length);
655 crp->crp_payload_start, crp->crp_payload_length);
669 iv_len = AES_BLOCK_LEN;
674 imm_len = crp->crp_payload_length;
681 crp->crp_payload_start, crp->crp_payload_length);
688 wr_len = roundup2(transhdr_len, 16) + iv_len +
689 roundup2(imm_len, 16) + sgl_len;
700 crypto_read_iv(crp, iv);
715 crwr->
sec_cpl.
pldlen = htobe32(iv_len + crp->crp_payload_length);
741 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
756 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
765 dst = (
char *)(crwr + 1) + kctx_len;
768 memcpy(dst, iv, iv_len);
771 crypto_copydata(crp, crp->crp_payload_start,
772 crp->crp_payload_length, dst);
779 explicit_bzero(iv,
sizeof(iv));
785 struct cryptop *crp,
const struct cpl_fw6_pld *cpl,
int error)
808 if (authsize == hashsize / 2)
819 const struct auth_hash *axf;
821 u_int kctx_len, key_half, op_type, transhdr_len, wr_len;
822 u_int hash_size_in_response, imm_len, iopad_size, iv_len;
823 u_int aad_start, aad_stop;
825 u_int cipher_start, cipher_stop;
826 u_int hmac_ctrl, input_len;
827 int dsgl_nsegs, dsgl_len;
828 int sgl_nsegs, sgl_len;
838 (crp->crp_payload_length % AES_BLOCK_LEN) != 0)
843 iv_len = AES_BLOCK_LEN;
852 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
867 if (iv_len + crp->crp_aad_length + crp->crp_payload_length +
871 if (iv_len + crp->crp_aad_length + crp->crp_payload_length >
877 iv_len + crp->crp_aad_length);
880 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
882 crp->crp_payload_output_start, crp->crp_payload_length);
885 crp->crp_payload_start, crp->crp_payload_length);
889 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
891 crp->crp_digest_start, hash_size_in_response);
894 crp->crp_digest_start, hash_size_in_response);
924 input_len = crp->crp_aad_length + crp->crp_payload_length;
933 if (input_len + roundup2(axf->hashsize, 16) + (512 - 16) >
937 input_len += hash_size_in_response;
946 if (crp->crp_aad_length != 0) {
947 if (crp->crp_aad != NULL)
949 crp->crp_aad, crp->crp_aad_length);
951 error = sglist_append_sglist(s->
sg_ulptx,
953 crp->crp_aad_length);
958 crp->crp_payload_start, crp->crp_payload_length);
963 crp->crp_digest_start, hash_size_in_response);
972 if (crp->crp_aad_length != 0) {
973 aad_start = iv_len + 1;
974 aad_stop = aad_start + crp->crp_aad_length - 1;
979 cipher_start = iv_len + crp->crp_aad_length + 1;
981 cipher_stop = hash_size_in_response;
985 auth_insert = hash_size_in_response;
989 wr_len = roundup2(transhdr_len, 16) + iv_len + roundup2(imm_len, 16) +
999 memset(crwr, 0, wr_len);
1001 crypto_read_iv(crp, iv);
1030 hmac_ctrl =
ccr_hmac_ctrl(axf->hashsize, hash_size_in_response);
1049 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
1064 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
1074 memcpy(dst, s->
hmac.
pads, iopad_size * 2);
1076 dst = (
char *)(crwr + 1) + kctx_len;
1079 memcpy(dst, iv, iv_len);
1082 if (crp->crp_aad_length != 0) {
1083 if (crp->crp_aad != NULL)
1084 memcpy(dst, crp->crp_aad, crp->crp_aad_length);
1086 crypto_copydata(crp, crp->crp_aad_start,
1087 crp->crp_aad_length, dst);
1088 dst += crp->crp_aad_length;
1090 crypto_copydata(crp, crp->crp_payload_start,
1091 crp->crp_payload_length, dst);
1092 dst += crp->crp_payload_length;
1094 crypto_copydata(crp, crp->crp_digest_start,
1095 hash_size_in_response, dst);
1102 explicit_bzero(iv,
sizeof(iv));
1108 struct cryptop *crp,
const struct cpl_fw6_pld *cpl,
int error)
1125 u_int iv_len, kctx_len, op_type, transhdr_len,
wr_len;
1126 u_int hash_size_in_response, imm_len;
1127 u_int aad_start, aad_stop, cipher_start, cipher_stop, auth_insert;
1128 u_int hmac_ctrl, input_len;
1129 int dsgl_nsegs, dsgl_len;
1130 int sgl_nsegs, sgl_len;
1140 if (crp->crp_payload_length == 0)
1143 if (crp->crp_aad_length + AES_BLOCK_LEN >
MAX_AAD_LEN)
1147 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
1152 iv_len = AES_BLOCK_LEN;
1157 if ((crp->crp_flags & CRYPTO_F_IV_SEPARATE) == 0)
1170 if (iv_len + crp->crp_aad_length + crp->crp_payload_length +
1174 if (iv_len + crp->crp_aad_length + crp->crp_payload_length >
1180 crp->crp_aad_length);
1183 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
1185 crp->crp_payload_output_start, crp->crp_payload_length);
1188 crp->crp_payload_start, crp->crp_payload_length);
1192 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
1194 crp->crp_digest_start, hash_size_in_response);
1197 crp->crp_digest_start, hash_size_in_response);
1210 kctx_len = roundup2(s->
cipher.
key_len, 16) + GMAC_BLOCK_LEN;
1224 input_len = crp->crp_aad_length + crp->crp_payload_length;
1226 input_len += hash_size_in_response;
1230 imm_len = input_len;
1236 if (crp->crp_aad_length != 0) {
1237 if (crp->crp_aad != NULL)
1239 crp->crp_aad, crp->crp_aad_length);
1241 error = sglist_append_sglist(s->
sg_ulptx,
1243 crp->crp_aad_length);
1248 crp->crp_payload_start, crp->crp_payload_length);
1253 crp->crp_digest_start, hash_size_in_response);
1261 if (crp->crp_aad_length != 0) {
1262 aad_start = iv_len + 1;
1263 aad_stop = aad_start + crp->crp_aad_length - 1;
1268 cipher_start = iv_len + crp->crp_aad_length + 1;
1270 cipher_stop = hash_size_in_response;
1274 auth_insert = hash_size_in_response;
1278 wr_len = roundup2(transhdr_len, 16) + iv_len + roundup2(imm_len, 16) +
1290 crypto_read_iv(crp, iv);
1291 *(uint32_t *)&iv[12] = htobe32(1);
1326 hmac_ctrl =
ccr_hmac_ctrl(AES_GMAC_HASH_LEN, hash_size_in_response);
1347 dst = (
char *)(crwr + 1) + kctx_len;
1350 memcpy(dst, iv, iv_len);
1353 if (crp->crp_aad_length != 0) {
1354 if (crp->crp_aad != NULL)
1355 memcpy(dst, crp->crp_aad, crp->crp_aad_length);
1357 crypto_copydata(crp, crp->crp_aad_start,
1358 crp->crp_aad_length, dst);
1359 dst += crp->crp_aad_length;
1361 crypto_copydata(crp, crp->crp_payload_start,
1362 crp->crp_payload_length, dst);
1363 dst += crp->crp_payload_length;
1365 crypto_copydata(crp, crp->crp_digest_start,
1366 hash_size_in_response, dst);
1373 explicit_bzero(iv,
sizeof(iv));
1379 struct cryptop *crp,
const struct cpl_fw6_pld *cpl,
int error)
1410 __assert_unreachable();
1416 const char *iv,
char *b0)
1418 u_int i, payload_len, L;
1425 b0[0] |= (((hash_size_in_response - 2) / 2) << 3);
1428 payload_len = crp->crp_payload_length;
1429 for (i = 0; i < L; i++) {
1430 b0[CCM_CBC_BLOCK_LEN - 1 - i] = payload_len;
1440 if (crp->crp_aad_length != 0) {
1442 *(uint16_t *)(b0 +
CCM_B0_SIZE) = htobe16(crp->crp_aad_length);
1450 const struct crypto_session_params *csp;
1455 u_int iv_len, kctx_len, op_type, transhdr_len,
wr_len;
1456 u_int aad_len, b0_len, hash_size_in_response, imm_len;
1457 u_int aad_start, aad_stop, cipher_start, cipher_stop, auth_insert;
1458 u_int hmac_ctrl, input_len;
1459 int dsgl_nsegs, dsgl_len;
1460 int sgl_nsegs, sgl_len;
1463 csp = crypto_get_params(crp->crp_session);
1472 if (crp->crp_payload_length == 0)
1476 if (crp->crp_payload_length > ccm_max_payload_length(csp))
1484 if (crp->crp_aad_length != 0)
1486 aad_len = b0_len + crp->crp_aad_length;
1492 if ((crp->crp_flags & CRYPTO_F_IV_SEPARATE) == 0)
1499 iv_len = AES_BLOCK_LEN;
1505 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
1520 if (iv_len + aad_len + crp->crp_payload_length +
1524 if (iv_len + aad_len + crp->crp_payload_length >
1533 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
1535 crp->crp_payload_output_start, crp->crp_payload_length);
1538 crp->crp_payload_start, crp->crp_payload_length);
1542 if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
1544 crp->crp_digest_start, hash_size_in_response);
1547 crp->crp_digest_start, hash_size_in_response);
1574 input_len = aad_len + crp->crp_payload_length;
1576 input_len += hash_size_in_response;
1580 imm_len = input_len;
1588 if (crp->crp_aad_length != 0) {
1589 if (crp->crp_aad != NULL)
1591 crp->crp_aad, crp->crp_aad_length);
1593 error = sglist_append_sglist(s->
sg_ulptx,
1595 crp->crp_aad_length);
1600 crp->crp_payload_start, crp->crp_payload_length);
1605 crp->crp_digest_start, hash_size_in_response);
1613 aad_start = iv_len + 1;
1614 aad_stop = aad_start + aad_len - 1;
1615 cipher_start = aad_stop + 1;
1617 cipher_stop = hash_size_in_response;
1621 auth_insert = hash_size_in_response;
1625 wr_len = roundup2(transhdr_len, 16) + iv_len + roundup2(imm_len, 16) +
1641 memset(iv, 0, iv_len);
1642 iv[0] = (15 - csp->csp_ivlen) - 1;
1643 crypto_read_iv(crp, iv + 1);
1694 dst = (
char *)(crwr + 1) + kctx_len;
1697 memcpy(dst, iv, iv_len);
1700 if (sgl_nsegs == 0) {
1702 if (crp->crp_aad_length != 0) {
1703 if (crp->crp_aad != NULL)
1704 memcpy(dst, crp->crp_aad, crp->crp_aad_length);
1706 crypto_copydata(crp, crp->crp_aad_start,
1707 crp->crp_aad_length, dst);
1708 dst += crp->crp_aad_length;
1710 crypto_copydata(crp, crp->crp_payload_start,
1711 crp->crp_payload_length, dst);
1712 dst += crp->crp_payload_length;
1714 crypto_copydata(crp, crp->crp_digest_start,
1715 hash_size_in_response, dst);
1725 (
"b0_len mismatch"));
1728 idata = (
void *)(dst + 8);
1730 idata->
len = htobe32(0);
1731 dst = (
void *)(idata + 1);
1739 explicit_bzero(iv,
sizeof(iv));
1745 struct cryptop *crp,
const struct cpl_fw6_pld *cpl,
int error)
1765 struct cryptop *orig;
1767 orig = crp->crp_opaque;
1768 orig->crp_etype = crp->crp_etype;
1769 crypto_freereq(crp);
1777 struct cryptop *
new;
1780 new = crypto_clonereq(crp, s->
sw_session, M_NOWAIT);
1782 crp->crp_etype = ENOMEM;
1793 new->crp_opaque = crp;
1795 error = crypto_dispatch_async(
new, CRYPTO_ASYNC_ORDERED);
1797 crp->crp_etype = error;
1807 sc = device_get_softc(parent);
1809 device_find_child(parent,
"ccr", -1) == NULL)
1810 device_add_child(parent,
"ccr", -1);
1817 device_set_desc(
dev,
"Chelsio Crypto Accelerator");
1818 return (BUS_PROBE_DEFAULT);
1824 struct sysctl_ctx_list *ctx = &sc->
ctx;
1825 struct sysctl_oid *oid, *port_oid;
1826 struct sysctl_oid_list *children;
1833 oid = device_get_sysctl_tree(sc->
dev);
1834 children = SYSCTL_CHILDREN(oid);
1836 SYSCTL_ADD_UINT(ctx, children, OID_AUTO,
"port_mask", CTLFLAG_RW,
1837 &sc->
port_mask, 0,
"Mask of enabled ports");
1842 oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO,
"stats",
1843 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
"statistics");
1844 children = SYSCTL_CHILDREN(oid);
1846 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"hash", CTLFLAG_RD,
1848 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"hmac", CTLFLAG_RD,
1850 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"cipher_encrypt",
1852 "Cipher encryption requests submitted");
1853 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"cipher_decrypt",
1855 "Cipher decryption requests submitted");
1856 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"eta_encrypt",
1858 "Combined AES+HMAC encryption requests submitted");
1859 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"eta_decrypt",
1861 "Combined AES+HMAC decryption requests submitted");
1862 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"gcm_encrypt",
1864 "AES-GCM encryption requests submitted");
1865 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"gcm_decrypt",
1867 "AES-GCM decryption requests submitted");
1868 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"ccm_encrypt",
1870 "AES-CCM encryption requests submitted");
1871 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"ccm_decrypt",
1873 "AES-CCM decryption requests submitted");
1874 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"wr_nomem", CTLFLAG_RD,
1876 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"inflight", CTLFLAG_RD,
1878 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"mac_error", CTLFLAG_RD,
1880 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"pad_error", CTLFLAG_RD,
1882 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"sglist_error",
1884 "Requests for which DMA mapping failed");
1885 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"process_error",
1887 "Requests failed during queueing");
1888 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"sw_fallback",
1890 "Requests processed by falling back to software");
1895 port_oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO,
"port",
1896 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
"Per-port statistics");
1898 for (i = 0; i < nitems(sc->
ports); i++) {
1905 snprintf(buf,
sizeof(buf),
"%d", i);
1906 oid = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(port_oid), OID_AUTO,
1907 buf, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, buf);
1908 children = SYSCTL_CHILDREN(oid);
1910 SYSCTL_ADD_UINT(ctx, children, OID_AUTO,
"active_sessions",
1912 "Count of active sessions");
1913 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"queued",
1915 SYSCTL_ADD_COUNTER_U64(ctx, children, OID_AUTO,
"completed",
1917 "Requests completed");
1934 "Too many ports to fit in port_mask");
1953 sc = device_get_softc(
dev);
1955 sysctl_ctx_init(&sc->
ctx);
1956 sc->
adapter = device_get_softc(device_get_parent(
dev));
1961 CRYPTOCAP_F_HARDWARE);
1963 device_printf(
dev,
"could not get crypto driver id\n");
1975 mtx_init(&sc->
lock,
"ccr", NULL, MTX_DEF);
1980 sc->
stats_hash = counter_u64_alloc(M_WAITOK);
1981 sc->
stats_hmac = counter_u64_alloc(M_WAITOK);
2014 sc = device_get_softc(
dev);
2016 mtx_lock(&sc->
lock);
2018 mtx_unlock(&sc->
lock);
2020 crypto_unregister_all(sc->
cid);
2022 sysctl_ctx_free(&sc->
ctx);
2023 mtx_destroy(&sc->
lock);
2053 union authctx auth_ctx;
2054 const struct auth_hash *axf;
2057 axf->Init(&auth_ctx);
2068 if (alg == CRYPTO_AES_XTS)
2074 if (alg != CRYPTO_AES_XTS)
2086 unsigned int ck_size, iopad_size, kctx_flits, kctx_len, kbits, mk_size;
2087 unsigned int opad_present;
2090 kbits = (klen / 2) * 8;
2104 panic(
"should not get here");
2122 kctx_len += iopad_size * 2;
2127 kctx_len += GMAC_BLOCK_LEN;
2141 panic(
"should not get here");
2151 kctx_flits = (
sizeof(
struct _key_ctx) + kctx_len) / 16;
2164 switch (csp->csp_auth_alg) {
2166 case CRYPTO_SHA2_224:
2167 case CRYPTO_SHA2_256:
2168 case CRYPTO_SHA2_384:
2169 case CRYPTO_SHA2_512:
2170 case CRYPTO_SHA1_HMAC:
2171 case CRYPTO_SHA2_224_HMAC:
2172 case CRYPTO_SHA2_256_HMAC:
2173 case CRYPTO_SHA2_384_HMAC:
2174 case CRYPTO_SHA2_512_HMAC:
2186 switch (csp->csp_cipher_alg) {
2187 case CRYPTO_AES_CBC:
2188 if (csp->csp_ivlen != AES_BLOCK_LEN)
2191 case CRYPTO_AES_ICM:
2192 if (csp->csp_ivlen != AES_BLOCK_LEN)
2195 case CRYPTO_AES_XTS:
2196 if (csp->csp_ivlen != AES_XTS_IV_LEN)
2203 csp->csp_cipher_klen));
2210 switch (csp->csp_cipher_alg) {
2211 case CRYPTO_AES_CBC:
2213 case CRYPTO_AES_ICM:
2215 case CRYPTO_AES_NIST_GCM_16:
2217 case CRYPTO_AES_XTS:
2219 case CRYPTO_AES_CCM_16:
2229 unsigned int cipher_mode;
2231 if ((csp->csp_flags & ~(CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD)) !=
2234 switch (csp->csp_mode) {
2235 case CSP_MODE_DIGEST:
2239 case CSP_MODE_CIPHER:
2244 switch (csp->csp_cipher_alg) {
2245 case CRYPTO_AES_NIST_GCM_16:
2246 case CRYPTO_AES_CCM_16:
2260 if (csp->csp_cipher_klen != 0) {
2266 return (CRYPTODEV_PROBE_HARDWARE);
2278 mtx_assert(&sc->
lock, MA_OWNED);
2280 for (i = 0; i < nitems(sc->
ports); i++) {
2314 mtx_destroy(&s->
lock);
2319 const struct crypto_session_params *csp)
2323 const struct auth_hash *auth_hash;
2324 unsigned int auth_mode, cipher_mode, mk_size;
2325 unsigned int partial_digest_len;
2328 switch (csp->csp_auth_alg) {
2330 case CRYPTO_SHA1_HMAC:
2331 auth_hash = &auth_hash_hmac_sha1;
2334 partial_digest_len = SHA1_HASH_LEN;
2336 case CRYPTO_SHA2_224:
2337 case CRYPTO_SHA2_224_HMAC:
2338 auth_hash = &auth_hash_hmac_sha2_224;
2341 partial_digest_len = SHA2_256_HASH_LEN;
2343 case CRYPTO_SHA2_256:
2344 case CRYPTO_SHA2_256_HMAC:
2345 auth_hash = &auth_hash_hmac_sha2_256;
2348 partial_digest_len = SHA2_256_HASH_LEN;
2350 case CRYPTO_SHA2_384:
2351 case CRYPTO_SHA2_384_HMAC:
2352 auth_hash = &auth_hash_hmac_sha2_384;
2355 partial_digest_len = SHA2_512_HASH_LEN;
2357 case CRYPTO_SHA2_512:
2358 case CRYPTO_SHA2_512_HMAC:
2359 auth_hash = &auth_hash_hmac_sha2_512;
2362 partial_digest_len = SHA2_512_HASH_LEN;
2368 partial_digest_len = 0;
2375 switch (csp->csp_mode) {
2376 case CSP_MODE_CIPHER:
2380 panic(
"invalid cipher algo");
2382 case CSP_MODE_DIGEST:
2384 panic(
"invalid auth algo");
2389 panic(
"invalid aead cipher algo");
2391 panic(
"invalid aead auth aglo");
2397 panic(
"invalid cipher algo");
2399 panic(
"invalid auth algo");
2402 panic(
"invalid csp mode");
2406 s = crypto_get_driver_session(cses);
2407 mtx_init(&s->
lock,
"ccr session", NULL, MTX_DEF);
2418 if (csp->csp_mode == CSP_MODE_AEAD) {
2419 error = crypto_newsession(&s->
sw_session, csp,
2420 CRYPTOCAP_F_SOFTWARE);
2427 sc = device_get_softc(dev);
2429 mtx_lock(&sc->
lock);
2431 mtx_unlock(&sc->
lock);
2437 if (s->
port == NULL) {
2438 mtx_unlock(&sc->
lock);
2443 switch (csp->csp_mode) {
2453 case CSP_MODE_DIGEST:
2454 if (csp->csp_auth_klen != 0)
2459 case CSP_MODE_CIPHER:
2464 if (s->
mode == GCM) {
2465 if (csp->csp_auth_mlen == 0)
2471 }
else if (s->
mode == CCM) {
2472 if (csp->csp_auth_mlen == 0)
2481 if (csp->csp_auth_mlen == 0)
2485 if (csp->csp_auth_key != NULL)
2487 csp->csp_auth_key, csp->csp_auth_klen,
2495 if (csp->csp_cipher_key != NULL)
2497 csp->csp_cipher_klen);
2501 mtx_unlock(&sc->
lock);
2511 sc = device_get_softc(dev);
2512 s = crypto_get_driver_session(cses);
2514 if (s->pending != 0)
2516 "session %p freed with %d pending requests\n", s,
2519 mtx_lock(&sc->
lock);
2521 mtx_unlock(&sc->
lock);
2528 const struct crypto_session_params *csp;
2533 csp = crypto_get_params(crp->crp_session);
2534 s = crypto_get_driver_session(crp->crp_session);
2535 sc = device_get_softc(dev);
2539 if (error == 0 && CRYPTO_HAS_OUTPUT_BUFFER(crp))
2553 if (crp->crp_auth_key != NULL)
2562 if (crp->crp_cipher_key != NULL)
2564 csp->csp_cipher_klen);
2567 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
2574 if (crp->crp_auth_key != NULL)
2578 if (crp->crp_cipher_key != NULL)
2580 csp->csp_cipher_klen);
2583 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
2590 if (crp->crp_cipher_key != NULL) {
2594 csp->csp_cipher_klen);
2597 if (error == EMSGSIZE || error == EFBIG) {
2599 mtx_unlock(&s->
lock);
2604 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
2611 if (crp->crp_cipher_key != NULL) {
2613 csp->csp_cipher_klen);
2616 if (error == EMSGSIZE || error == EFBIG) {
2618 mtx_unlock(&s->
lock);
2623 if (CRYPTO_OP_IS_ENCRYPT(crp->crp_op))
2641 mtx_unlock(&s->
lock);
2644 crp->crp_etype = error;
2658 struct cryptop *crp;
2663 cpl = mtod(m,
const void *);
2665 cpl = (
const void *)(rss + 1);
2667 crp = (
struct cryptop *)(uintptr_t)be64toh(cpl->
data[1]);
2668 s = crypto_get_driver_session(crp->crp_session);
2669 status = be64toh(cpl->
data[0]);
2678 mtx_unlock(&s->
lock);
2702 if (error == EBADMSG) {
2708 crp->crp_etype = error;
2726 return (EOPNOTSUPP);
static struct wrqe * alloc_wrqe(int wr_len, struct sge_wrq *wrq)
void t4_init_gmac_hash(const char *, int, char *)
uint8_t ss[SGE_MAX_WR_LEN]
void t4_register_cpl_handler(int, cpl_handler_t)
static void * wrtod(struct wrqe *wr)
static void t4_wrq_tx(struct adapter *sc, struct wrqe *wr)
void t4_init_hmac_digest(const struct auth_hash *, u_int, const char *, int, char *)
void t4_aes_getdeckey(void *, const void *, unsigned int)
void t4_copy_partial_hash(int, union authctx *, void *)
#define for_each_port(adapter, iter)
struct adapter_params params
struct port_info * port[MAX_NPORTS]
counter_u64_t stats_completed
counter_u64_t stats_queued
char deckey[CHCR_AES_MAX_KEY_LEN]
char enckey[CHCR_AES_MAX_KEY_LEN]
char ghash_h[GMAC_BLOCK_LEN]
const struct auth_hash * auth_hash
unsigned int partial_digest_len
char pads[CHCR_HASH_MAX_BLOCK_SIZE_128 *2]
enum ccr_session::@53 mode
struct ccr_session_ccm_mac ccm_mac
struct sglist * sg_output
crypto_session_t sw_session
struct ccr_session_cipher cipher
struct ccr_session_gmac gmac
struct ccr_session_hmac hmac
counter_u64_t stats_gcm_decrypt
counter_u64_t stats_inflight
counter_u64_t stats_eta_encrypt
counter_u64_t stats_ccm_encrypt
counter_u64_t stats_cipher_encrypt
counter_u64_t stats_eta_decrypt
counter_u64_t stats_mac_error
struct ccr_port ports[MAX_NPORTS]
struct sysctl_ctx_list ctx
counter_u64_t stats_gcm_encrypt
counter_u64_t stats_wr_nomem
counter_u64_t stats_pad_error
counter_u64_t stats_cipher_decrypt
struct sglist * sg_iv_aad
counter_u64_t stats_ccm_decrypt
counter_u64_t stats_sglist_error
counter_u64_t stats_process_error
counter_u64_t stats_sw_fallback
struct fw_crypto_lookaside_wr wreq
struct cpl_tx_sec_pdu sec_cpl
struct ulptx_idata sc_imm
struct rss_header rss_hdr_int
__be32 pcirlxorder_to_noofsgentr
__be32 aadstart_cipherstop_hi
__be32 cipherstop_lo_authinsert
__be32 pld_size_hash_size
__be32 rx_chid_to_rx_q_id
struct ulptx_sge_pair sge[]
static int ccr_newsession(device_t dev, crypto_session_t cses, const struct crypto_session_params *csp)
static bool ccr_use_imm_data(u_int transhdr_len, u_int input_len)
static void ccr_freesession(device_t dev, crypto_session_t cses)
static void ccr_soft(struct ccr_session *s, struct cryptop *crp)
static int ccr_cipher_mode(const struct crypto_session_params *csp)
static int ccr_ccm_hmac_ctrl(unsigned int authsize)
static int ccr_modevent(module_t mod, int cmd, void *arg)
#define MAX_RX_PHYS_DSGL_SGE
static struct ccr_port * ccr_choose_port(struct ccr_softc *sc)
static void ccr_sysctls(struct ccr_softc *sc)
static device_method_t ccr_methods[]
static void ccr_write_phys_dsgl(struct ccr_session *s, void *dst, int nsegs)
static bool ccr_auth_supported(const struct crypto_session_params *csp)
static void ccr_init_port(struct ccr_softc *sc, int port)
static int ccr_soft_done(struct cryptop *crp)
static int ccr_populate_sglist(struct sglist *sg, struct crypto_buffer *cb)
static int ccr_process(device_t dev, struct cryptop *crp, int hint)
static void generate_ccm_b0(struct cryptop *crp, u_int hash_size_in_response, const char *iv, char *b0)
static int do_cpl6_fw_pld(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
static int ccr_detach(device_t dev)
static int ccr_cipher_done(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp, const struct cpl_fw6_pld *cpl, int error)
static int ccr_cipher(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
static int ccr_eta_done(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp, const struct cpl_fw6_pld *cpl, int error)
static int ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
static driver_t ccr_driver
static void ccr_free_port(struct ccr_softc *sc, int port)
static void ccr_populate_wreq(struct ccr_softc *sc, struct ccr_session *s, struct chcr_wr *crwr, u_int kctx_len, u_int wr_len, u_int imm_len, u_int sgl_len, u_int hash_size, struct cryptop *crp)
static int ccr_attach(device_t dev)
static devclass_t ccr_devclass
static int ccr_probesession(device_t dev, const struct crypto_session_params *csp)
static int ccr_eta(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
static void ccr_aes_setkey(struct ccr_session *s, const void *key, int klen)
static int ccr_hmac_ctrl(unsigned int hashsize, unsigned int authsize)
static void ccr_init_hash_digest(struct ccr_session *s)
static MALLOC_DEFINE(M_CCR, "ccr", "Chelsio T6 crypto")
MODULE_DEPEND(ccr, crypto, 1, 1, 1)
static bool ccr_cipher_supported(const struct crypto_session_params *csp)
static bool ccr_aes_check_keylen(int alg, int klen)
static void ccr_identify(driver_t *driver, device_t parent)
static int ccr_phys_dsgl_len(int nsegs)
static int ccr_hash_done(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp, const struct cpl_fw6_pld *cpl, int error)
static int ccr_ccm_done(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp, const struct cpl_fw6_pld *cpl, int error)
static void ccr_write_ulptx_sgl(struct ccr_session *s, void *dst, int nsegs)
static int ccr_count_sgl(struct sglist *sg, int maxsegsize)
static int ccr_hash(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
static int ccr_ulptx_sgl_len(int nsegs)
DRIVER_MODULE(ccr, t6nex, ccr_driver, ccr_devclass, ccr_modevent, NULL)
static void ccr_delete_session(struct ccr_session *s)
static int ccr_gcm_done(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp, const struct cpl_fw6_pld *cpl, int error)
static int ccr_ccm(struct ccr_softc *sc, struct ccr_session *s, struct cryptop *crp)
static int ccr_probe(device_t dev)
#define CHCR_KEYCTX_CIPHER_KEY_SIZE_256
#define SCMD_HMAC_CTRL_IPSEC_96BIT
#define CHCR_KEYCTX_MAC_KEY_SIZE_192
#define SCMD_AUTH_MODE_NOP
#define SCMD_AUTH_MODE_GHASH
#define SCMD_CIPH_MODE_AES_CCM
#define CHCR_KEYCTX_CIPHER_KEY_SIZE_128
#define CHCR_MAX_CRYPTO_IV_LEN
#define V_KEY_CONTEXT_OPAD_PRESENT(x)
#define CIPHER_TRANSHDR_SIZE(kctx_len, sge_pairs)
#define SCMD_AUTH_MODE_SHA224
#define CHCR_KEYCTX_MAC_KEY_SIZE_256
#define CCM_AAD_FIELD_SIZE
#define SCMD_HMAC_CTRL_NO_TRUNC
#define SCMD_AUTH_MODE_SHA256
#define HASH_TRANSHDR_SIZE(kctx_len)
#define SCMD_AUTH_MODE_CBCMAC
#define CHCR_KEYCTX_NO_KEY
#define CHK_MAC_ERR_BIT(x)
#define CHCR_KEYCTX_MAC_KEY_SIZE_512
#define SCMD_AUTH_MODE_SHA1
#define SCMD_HMAC_CTRL_NOP
#define CHK_PAD_ERR_BIT(x)
#define SCMD_PROTO_VERSION_GENERIC
#define SCMD_CIPH_MODE_NOP
#define CHCR_KEYCTX_MAC_KEY_SIZE_128
#define SCMD_CIPH_MODE_AES_GCM
#define CHCR_KEYCTX_MAC_KEY_SIZE_160
#define CHCR_KEYCTX_CIPHER_KEY_SIZE_192
#define CRYPTO_MAX_IMM_TX_PKT_LEN
#define V_KEY_CONTEXT_MK_SIZE(x)
#define SCMD_HMAC_CTRL_PL1
#define SCMD_HMAC_CTRL_DIV2
#define V_KEY_CONTEXT_CK_SIZE(x)
#define SCMD_AUTH_MODE_SHA512_512
#define SCMD_HMAC_CTRL_PL3
#define CHCR_AES_MAX_KEY_LEN
#define V_KEY_CONTEXT_SALT_PRESENT(x)
#define SCMD_HMAC_CTRL_PL2
#define CHCR_HASH_MAX_BLOCK_SIZE_128
#define SCMD_AUTH_MODE_SHA512_384
#define SCMD_CIPH_MODE_AES_XTS
#define SCMD_CIPH_MODE_AES_CTR
#define V_KEY_CONTEXT_CTX_LEN(x)
#define SCMD_CIPH_MODE_AES_CBC
#define V_KEY_CONTEXT_DUAL_CK(x)
#define V_KEY_CONTEXT_VALID(x)
#define SCMD_HMAC_CTRL_TRUNC_RFC4366
#define V_CPL_TX_SEC_PDU_AADSTOP(x)
#define V_CPL_TX_SEC_PDU_CPLLEN(x)
#define V_SCMD_ENC_DEC_CTRL(x)
#define V_ULP_TXPKT_FID(x)
#define V_CPL_TX_SEC_PDU_ULPTXLPBK(x)
#define V_CPL_TX_SEC_PDU_RXCHID(x)
#define V_CPL_TX_SEC_PDU_CIPHERSTOP_HI(x)
#define V_CPL_TX_SEC_PDU_AUTHINSERT(x)
#define V_SCMD_CIPH_AUTH_SEQ_CTRL(x)
#define V_SCMD_HDR_LEN(x)
#define V_SCMD_IV_GEN_CTRL(x)
#define V_SCMD_HMAC_CTRL(x)
#define V_CPL_TX_SEC_PDU_AADSTART(x)
#define V_CPL_RX_PHYS_DSGL_PCIRLXORDER(x)
#define V_SCMD_CIPH_MODE(x)
#define V_ULP_TXPKT_CHANNELID(x)
#define V_ULP_TXPKT_RO(x)
#define V_CPL_RX_PHYS_DSGL_PCINOSNOOP(x)
#define V_SCMD_AADIVDROP(x)
#define V_SCMD_NUM_IVS(x)
#define V_CPL_TX_SEC_PDU_ACKFOLLOWS(x)
#define V_ULP_TXPKT_DEST(x)
#define V_SCMD_MORE_FRAGS(x)
#define V_SCMD_AUTH_MODE(x)
#define V_CPL_TX_SEC_PDU_AUTHSTART(x)
#define V_SCMD_PROTO_VERSION(x)
#define V_SCMD_LAST_FRAG(x)
#define V_CPL_RX_PHYS_DSGL_PCITPHNTENB(x)
#define V_CPL_TX_SEC_PDU_IVINSRTOFST(x)
#define V_CPL_TX_SEC_PDU_CIPHERSTOP_LO(x)
#define V_CPL_RX_PHYS_DSGL_DCAID(x)
#define V_ULP_TX_SC_MORE(x)
#define V_SCMD_SEQ_NO_CTRL(x)
#define V_CPL_TX_SEC_PDU_PLACEHOLDER(x)
#define V_ULP_TXPKT_DATAMODIFY(x)
#define V_CPL_TX_SEC_PDU_AUTHSTOP(x)
#define V_CPL_RX_PHYS_DSGL_NOOFSGENTR(x)
#define V_CPL_TX_SEC_PDU_CIPHERSTART(x)
#define V_CPL_TX_SEC_PDU_OPCODE(x)
#define V_CPL_RX_PHYS_DSGL_ISRDMA(x)
#define V_CPL_RX_PHYS_DSGL_OPCODE(x)
#define V_SCMD_MAC_ONLY(x)
#define V_SCMD_IV_SIZE(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_COMPL(x)
@ FW_CAPS_CONFIG_CRYPTO_LOOKASIDE
#define V_FW_CRYPTO_LOOKASIDE_WR_OPCODE(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_HASH_SIZE(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_LCB(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_CCTX_LOC(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_CCTX_SIZE(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_RX_CHID(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_IMM_LEN(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_PLD_SIZE(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_PHASH(x)
#define FW_VERSION32(MAJOR, MINOR, MICRO, BUILD)
#define V_FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_LEN16(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_TX_CH(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_FQIDX(x)
#define V_FW_CRYPTO_LOOKASIDE_WR_IV(x)