crypto/dpaa2_sec: support authenc with raw buffer API

This patch supports AUTHENC with raw buufer APIs

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
Acked-by: Akhil Goyal <gakhil@marvell.com>
This commit is contained in:
Gagandeep Singh 2021-10-14 00:30:24 +05:30 committed by Akhil Goyal
parent d9d36d6ff5
commit aa6ec1fd84

View File

@ -31,14 +31,128 @@ build_raw_dp_chain_fd(uint8_t *drv_ctx,
void *userdata,
struct qbman_fd *fd)
{
RTE_SET_USED(drv_ctx);
RTE_SET_USED(sgl);
RTE_SET_USED(iv);
RTE_SET_USED(digest);
RTE_SET_USED(auth_iv);
RTE_SET_USED(ofs);
RTE_SET_USED(userdata);
RTE_SET_USED(fd);
dpaa2_sec_session *sess =
((struct dpaa2_sec_raw_dp_ctx *)drv_ctx)->session;
struct ctxt_priv *priv = sess->ctxt;
struct qbman_fle *fle, *sge, *ip_fle, *op_fle;
struct sec_flow_context *flc;
int data_len = 0, auth_len = 0, cipher_len = 0;
unsigned int i = 0;
uint16_t auth_hdr_len = ofs.ofs.cipher.head -
ofs.ofs.auth.head;
uint16_t auth_tail_len = ofs.ofs.auth.tail;
uint32_t auth_only_len = (auth_tail_len << 16) | auth_hdr_len;
int icv_len = sess->digest_length;
uint8_t *old_icv;
uint8_t *iv_ptr = iv->va;
for (i = 0; i < sgl->num; i++)
data_len += sgl->vec[i].len;
cipher_len = data_len - ofs.ofs.cipher.head - ofs.ofs.cipher.tail;
auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail;
/* first FLE entry used to store session ctxt */
fle = (struct qbman_fle *)rte_malloc(NULL,
FLE_SG_MEM_SIZE(2 * sgl->num),
RTE_CACHE_LINE_SIZE);
if (unlikely(!fle)) {
DPAA2_SEC_ERR("AUTHENC SG: Memory alloc failed for SGE");
return -ENOMEM;
}
memset(fle, 0, FLE_SG_MEM_SIZE(2 * sgl->num));
DPAA2_SET_FLE_ADDR(fle, (size_t)userdata);
DPAA2_FLE_SAVE_CTXT(fle, (ptrdiff_t)priv);
op_fle = fle + 1;
ip_fle = fle + 2;
sge = fle + 3;
/* Save the shared descriptor */
flc = &priv->flc_desc[0].flc;
/* Configure FD as a FRAME LIST */
DPAA2_SET_FD_ADDR(fd, DPAA2_VADDR_TO_IOVA(op_fle));
DPAA2_SET_FD_COMPOUND_FMT(fd);
DPAA2_SET_FD_FLC(fd, DPAA2_VADDR_TO_IOVA(flc));
/* Configure Output FLE with Scatter/Gather Entry */
DPAA2_SET_FLE_SG_EXT(op_fle);
DPAA2_SET_FLE_ADDR(op_fle, DPAA2_VADDR_TO_IOVA(sge));
if (auth_only_len)
DPAA2_SET_FLE_INTERNAL_JD(op_fle, auth_only_len);
op_fle->length = (sess->dir == DIR_ENC) ?
(cipher_len + icv_len) :
cipher_len;
/* Configure Output SGE for Encap/Decap */
DPAA2_SET_FLE_ADDR(sge, sgl->vec[0].iova);
DPAA2_SET_FLE_OFFSET(sge, ofs.ofs.auth.head);
sge->length = sgl->vec[0].len - ofs.ofs.auth.head;
/* o/p segs */
for (i = 1; i < sgl->num; i++) {
sge++;
DPAA2_SET_FLE_ADDR(sge, sgl->vec[i].iova);
DPAA2_SET_FLE_OFFSET(sge, 0);
sge->length = sgl->vec[i].len;
}
if (sess->dir == DIR_ENC) {
sge++;
DPAA2_SET_FLE_ADDR(sge,
digest->iova);
sge->length = icv_len;
}
DPAA2_SET_FLE_FIN(sge);
sge++;
/* Configure Input FLE with Scatter/Gather Entry */
DPAA2_SET_FLE_ADDR(ip_fle, DPAA2_VADDR_TO_IOVA(sge));
DPAA2_SET_FLE_SG_EXT(ip_fle);
DPAA2_SET_FLE_FIN(ip_fle);
ip_fle->length = (sess->dir == DIR_ENC) ?
(auth_len + sess->iv.length) :
(auth_len + sess->iv.length +
icv_len);
/* Configure Input SGE for Encap/Decap */
DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(iv_ptr));
sge->length = sess->iv.length;
sge++;
DPAA2_SET_FLE_ADDR(sge, sgl->vec[0].iova);
DPAA2_SET_FLE_OFFSET(sge, ofs.ofs.auth.head);
sge->length = sgl->vec[0].len - ofs.ofs.auth.head;
for (i = 1; i < sgl->num; i++) {
sge++;
DPAA2_SET_FLE_ADDR(sge, sgl->vec[i].iova);
DPAA2_SET_FLE_OFFSET(sge, 0);
sge->length = sgl->vec[i].len;
}
if (sess->dir == DIR_DEC) {
sge++;
old_icv = (uint8_t *)(sge + 1);
memcpy(old_icv, digest->va,
icv_len);
DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(old_icv));
sge->length = icv_len;
}
DPAA2_SET_FLE_FIN(sge);
if (auth_only_len) {
DPAA2_SET_FLE_INTERNAL_JD(ip_fle, auth_only_len);
DPAA2_SET_FD_INTERNAL_JD(fd, auth_only_len);
}
DPAA2_SET_FD_LEN(fd, ip_fle->length);
return 0;
}