| 1395 | } |
| 1396 | |
| 1397 | static int __must_check |
| 1398 | ccp_do_xts(struct ccp_queue *qp, struct ccp_session *s, struct cryptop *crp, |
| 1399 | enum ccp_cipher_dir dir, const struct ccp_completion_ctx *cctx) |
| 1400 | { |
| 1401 | struct ccp_desc *desc; |
| 1402 | device_t dev; |
| 1403 | unsigned i; |
| 1404 | enum ccp_xts_unitsize usize; |
| 1405 | |
| 1406 | /* IV and Key data are already loaded */ |
| 1407 | |
| 1408 | dev = qp->cq_softc->dev; |
| 1409 | |
| 1410 | for (i = 0; i < nitems(ccp_xts_unitsize_map); i++) |
| 1411 | if (ccp_xts_unitsize_map[i].cxu_size == |
| 1412 | crp->crp_payload_length) { |
| 1413 | usize = ccp_xts_unitsize_map[i].cxu_id; |
| 1414 | break; |
| 1415 | } |
| 1416 | if (i >= nitems(ccp_xts_unitsize_map)) |
| 1417 | return (EINVAL); |
| 1418 | |
| 1419 | for (i = 0; i < qp->cq_sg_ulptx->sg_nseg; i++) { |
| 1420 | struct sglist_seg *seg; |
| 1421 | |
| 1422 | seg = &qp->cq_sg_ulptx->sg_segs[i]; |
| 1423 | |
| 1424 | desc = &qp->desc_ring[qp->cq_tail]; |
| 1425 | desc->engine = CCP_ENGINE_XTS_AES; |
| 1426 | desc->som = (i == 0); |
| 1427 | desc->eom = (i == qp->cq_sg_ulptx->sg_nseg - 1); |
| 1428 | desc->ioc = (desc->eom && cctx != NULL); |
| 1429 | DPRINTF(dev, "%s: XTS %u: som:%d eom:%d ioc:%d dir:%d\n", |
| 1430 | __func__, qp->cq_tail, (int)desc->som, (int)desc->eom, |
| 1431 | (int)desc->ioc, (int)dir); |
| 1432 | |
| 1433 | if (desc->ioc) |
| 1434 | memcpy(&qp->completions_ring[qp->cq_tail], cctx, |
| 1435 | sizeof(*cctx)); |
| 1436 | |
| 1437 | desc->aes_xts.encrypt = dir; |
| 1438 | desc->aes_xts.type = s->blkcipher.cipher_type; |
| 1439 | desc->aes_xts.size = usize; |
| 1440 | |
| 1441 | DPRINTF(dev, "XXX %s: XTS %u: type:%u size:%u\n", __func__, |
| 1442 | qp->cq_tail, (unsigned)desc->aes_xts.type, |
| 1443 | (unsigned)desc->aes_xts.size); |
| 1444 | |
| 1445 | desc->length = seg->ss_len; |
| 1446 | desc->src_lo = (uint32_t)seg->ss_paddr; |
| 1447 | desc->src_hi = (seg->ss_paddr >> 32); |
| 1448 | desc->src_mem = CCP_MEMTYPE_SYSTEM; |
| 1449 | |
| 1450 | /* Crypt in-place */ |
| 1451 | desc->dst_lo = desc->src_lo; |
| 1452 | desc->dst_hi = desc->src_hi; |
| 1453 | desc->dst_mem = desc->src_mem; |
| 1454 |
no test coverage detected