cryptodev: use AES-GCM/CCM as AEAD algorithms
[dpdk.git] / drivers / crypto / dpaa2_sec / dpaa2_sec_dpseci.c
index e154395..3620751 100644 (file)
@@ -84,9 +84,11 @@ build_authenc_fd(dpaa2_sec_session *sess,
        struct sec_flow_context *flc;
        uint32_t auth_only_len = sym_op->auth.data.length -
                                sym_op->cipher.data.length;
-       int icv_len = sym_op->auth.digest.length;
+       int icv_len = sess->digest_length;
        uint8_t *old_icv;
        uint32_t mem_len = (7 * sizeof(struct qbman_fle)) + icv_len;
+       uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *,
+                       sess->iv.offset);
 
        PMD_INIT_FUNC_TRACE();
 
@@ -133,10 +135,10 @@ build_authenc_fd(dpaa2_sec_session *sess,
                   "cipher_off: 0x%x/length %d, iv-len=%d data_off: 0x%x\n",
                   sym_op->auth.data.offset,
                   sym_op->auth.data.length,
-                  sym_op->auth.digest.length,
+                  sess->digest_length,
                   sym_op->cipher.data.offset,
                   sym_op->cipher.data.length,
-                  sym_op->cipher.iv.length,
+                  sess->iv.length,
                   sym_op->m_src->data_off);
 
        /* Configure Output FLE with Scatter/Gather Entry */
@@ -159,9 +161,9 @@ build_authenc_fd(dpaa2_sec_session *sess,
                sge++;
                DPAA2_SET_FLE_ADDR(sge,
                                DPAA2_VADDR_TO_IOVA(sym_op->auth.digest.data));
-               sge->length = sym_op->auth.digest.length;
+               sge->length = sess->digest_length;
                DPAA2_SET_FD_LEN(fd, (sym_op->auth.data.length +
-                                       sym_op->cipher.iv.length));
+                                       sess->iv.length));
        }
        DPAA2_SET_FLE_FIN(sge);
 
@@ -173,13 +175,13 @@ build_authenc_fd(dpaa2_sec_session *sess,
        DPAA2_SET_FLE_SG_EXT(fle);
        DPAA2_SET_FLE_FIN(fle);
        fle->length = (sess->dir == DIR_ENC) ?
-                       (sym_op->auth.data.length + sym_op->cipher.iv.length) :
-                       (sym_op->auth.data.length + sym_op->cipher.iv.length +
-                        sym_op->auth.digest.length);
+                       (sym_op->auth.data.length + sess->iv.length) :
+                       (sym_op->auth.data.length + sess->iv.length +
+                        sess->digest_length);
 
        /* Configure Input SGE for Encap/Decap */
-       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(sym_op->cipher.iv.data));
-       sge->length = sym_op->cipher.iv.length;
+       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(iv_ptr));
+       sge->length = sess->iv.length;
        sge++;
 
        DPAA2_SET_FLE_ADDR(sge, DPAA2_MBUF_VADDR_TO_IOVA(sym_op->m_src));
@@ -190,13 +192,13 @@ build_authenc_fd(dpaa2_sec_session *sess,
                sge++;
                old_icv = (uint8_t *)(sge + 1);
                memcpy(old_icv, sym_op->auth.digest.data,
-                      sym_op->auth.digest.length);
-               memset(sym_op->auth.digest.data, 0, sym_op->auth.digest.length);
+                      sess->digest_length);
+               memset(sym_op->auth.digest.data, 0, sess->digest_length);
                DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(old_icv));
-               sge->length = sym_op->auth.digest.length;
+               sge->length = sess->digest_length;
                DPAA2_SET_FD_LEN(fd, (sym_op->auth.data.length +
-                                sym_op->auth.digest.length +
-                                sym_op->cipher.iv.length));
+                                sess->digest_length +
+                                sess->iv.length));
        }
        DPAA2_SET_FLE_FIN(sge);
        if (auth_only_len) {
@@ -215,7 +217,7 @@ build_auth_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
        uint32_t mem_len = (sess->dir == DIR_ENC) ?
                           (3 * sizeof(struct qbman_fle)) :
                           (5 * sizeof(struct qbman_fle) +
-                           sym_op->auth.digest.length);
+                           sess->digest_length);
        struct sec_flow_context *flc;
        struct ctxt_priv *priv = sess->ctxt;
        uint8_t *old_digest;
@@ -249,7 +251,7 @@ build_auth_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
        DPAA2_SET_FD_FLC(fd, DPAA2_VADDR_TO_IOVA(flc));
 
        DPAA2_SET_FLE_ADDR(fle, DPAA2_VADDR_TO_IOVA(sym_op->auth.digest.data));
-       fle->length = sym_op->auth.digest.length;
+       fle->length = sess->digest_length;
 
        DPAA2_SET_FD_ADDR(fd, DPAA2_VADDR_TO_IOVA(fle));
        DPAA2_SET_FD_COMPOUND_FMT(fd);
@@ -280,17 +282,17 @@ build_auth_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
                                     sym_op->m_src->data_off);
 
                DPAA2_SET_FD_LEN(fd, sym_op->auth.data.length +
-                                sym_op->auth.digest.length);
+                                sess->digest_length);
                sge->length = sym_op->auth.data.length;
                sge++;
                old_digest = (uint8_t *)(sge + 1);
                rte_memcpy(old_digest, sym_op->auth.digest.data,
-                          sym_op->auth.digest.length);
-               memset(sym_op->auth.digest.data, 0, sym_op->auth.digest.length);
+                          sess->digest_length);
+               memset(sym_op->auth.digest.data, 0, sess->digest_length);
                DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(old_digest));
-               sge->length = sym_op->auth.digest.length;
+               sge->length = sess->digest_length;
                fle->length = sym_op->auth.data.length +
-                               sym_op->auth.digest.length;
+                               sess->digest_length;
                DPAA2_SET_FLE_FIN(sge);
        }
        DPAA2_SET_FLE_FIN(fle);
@@ -307,6 +309,8 @@ build_cipher_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
        uint32_t mem_len = (5 * sizeof(struct qbman_fle));
        struct sec_flow_context *flc;
        struct ctxt_priv *priv = sess->ctxt;
+       uint8_t *iv_ptr = rte_crypto_op_ctod_offset(op, uint8_t *,
+                       sess->iv.offset);
 
        PMD_INIT_FUNC_TRACE();
 
@@ -343,21 +347,21 @@ build_cipher_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
        flc = &priv->flc_desc[0].flc;
        DPAA2_SET_FD_ADDR(fd, DPAA2_VADDR_TO_IOVA(fle));
        DPAA2_SET_FD_LEN(fd, sym_op->cipher.data.length +
-                        sym_op->cipher.iv.length);
+                        sess->iv.length);
        DPAA2_SET_FD_COMPOUND_FMT(fd);
        DPAA2_SET_FD_FLC(fd, DPAA2_VADDR_TO_IOVA(flc));
 
        PMD_TX_LOG(DEBUG, "cipher_off: 0x%x/length %d,ivlen=%d data_off: 0x%x",
                   sym_op->cipher.data.offset,
                   sym_op->cipher.data.length,
-                  sym_op->cipher.iv.length,
+                  sess->iv.length,
                   sym_op->m_src->data_off);
 
        DPAA2_SET_FLE_ADDR(fle, DPAA2_MBUF_VADDR_TO_IOVA(sym_op->m_src));
        DPAA2_SET_FLE_OFFSET(fle, sym_op->cipher.data.offset +
                             sym_op->m_src->data_off);
 
-       fle->length = sym_op->cipher.data.length + sym_op->cipher.iv.length;
+       fle->length = sym_op->cipher.data.length + sess->iv.length;
 
        PMD_TX_LOG(DEBUG, "1 - flc = %p, fle = %p FLEaddr = %x-%x, length %d",
                   flc, fle, fle->addr_hi, fle->addr_lo, fle->length);
@@ -365,12 +369,12 @@ build_cipher_fd(dpaa2_sec_session *sess, struct rte_crypto_op *op,
        fle++;
 
        DPAA2_SET_FLE_ADDR(fle, DPAA2_VADDR_TO_IOVA(sge));
-       fle->length = sym_op->cipher.data.length + sym_op->cipher.iv.length;
+       fle->length = sym_op->cipher.data.length + sess->iv.length;
 
        DPAA2_SET_FLE_SG_EXT(fle);
 
-       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(sym_op->cipher.iv.data));
-       sge->length = sym_op->cipher.iv.length;
+       DPAA2_SET_FLE_ADDR(sge, DPAA2_VADDR_TO_IOVA(iv_ptr));
+       sge->length = sess->iv.length;
 
        sge++;
        DPAA2_SET_FLE_ADDR(sge, DPAA2_MBUF_VADDR_TO_IOVA(sym_op->m_src));
@@ -794,6 +798,10 @@ dpaa2_sec_cipher_init(struct rte_cryptodev *dev,
        cipherdata.key_enc_flags = 0;
        cipherdata.key_type = RTA_DATA_IMM;
 
+       /* Set IV parameters */
+       session->iv.offset = xform->cipher.iv.offset;
+       session->iv.length = xform->cipher.iv.length;
+
        switch (xform->cipher.algo) {
        case RTE_CRYPTO_CIPHER_AES_CBC:
                cipherdata.algtype = OP_ALG_ALGSEL_AES;
@@ -809,8 +817,6 @@ dpaa2_sec_cipher_init(struct rte_cryptodev *dev,
                break;
        case RTE_CRYPTO_CIPHER_AES_CTR:
        case RTE_CRYPTO_CIPHER_3DES_CTR:
-       case RTE_CRYPTO_CIPHER_AES_GCM:
-       case RTE_CRYPTO_CIPHER_AES_CCM:
        case RTE_CRYPTO_CIPHER_AES_ECB:
        case RTE_CRYPTO_CIPHER_3DES_ECB:
        case RTE_CRYPTO_CIPHER_AES_XTS:
@@ -904,6 +910,8 @@ dpaa2_sec_auth_init(struct rte_cryptodev *dev,
        authdata.key_enc_flags = 0;
        authdata.key_type = RTA_DATA_IMM;
 
+       session->digest_length = xform->auth.digest_length;
+
        switch (xform->auth.algo) {
        case RTE_CRYPTO_AUTH_SHA1_HMAC:
                authdata.algtype = OP_ALG_ALGSEL_SHA1;
@@ -936,7 +944,6 @@ dpaa2_sec_auth_init(struct rte_cryptodev *dev,
                session->auth_alg = RTE_CRYPTO_AUTH_SHA224_HMAC;
                break;
        case RTE_CRYPTO_AUTH_AES_XCBC_MAC:
-       case RTE_CRYPTO_AUTH_AES_GCM:
        case RTE_CRYPTO_AUTH_SNOW3G_UIA2:
        case RTE_CRYPTO_AUTH_NULL:
        case RTE_CRYPTO_AUTH_SHA1:
@@ -945,7 +952,6 @@ dpaa2_sec_auth_init(struct rte_cryptodev *dev,
        case RTE_CRYPTO_AUTH_SHA224:
        case RTE_CRYPTO_AUTH_SHA384:
        case RTE_CRYPTO_AUTH_MD5:
-       case RTE_CRYPTO_AUTH_AES_CCM:
        case RTE_CRYPTO_AUTH_AES_GMAC:
        case RTE_CRYPTO_AUTH_KASUMI_F9:
        case RTE_CRYPTO_AUTH_AES_CMAC:
@@ -1012,6 +1018,11 @@ dpaa2_sec_aead_init(struct rte_cryptodev *dev,
                        (cipher_xform->op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) ?
                        DPAA2_SEC_HASH_CIPHER : DPAA2_SEC_CIPHER_HASH;
        }
+
+       /* Set IV parameters */
+       session->iv.offset = cipher_xform->iv.offset;
+       session->iv.length = cipher_xform->iv.length;
+
        /* For SEC AEAD only one descriptor is required */
        priv = (struct ctxt_priv *)rte_zmalloc(NULL,
                        sizeof(struct ctxt_priv) + sizeof(struct sec_flc_desc),
@@ -1051,6 +1062,8 @@ dpaa2_sec_aead_init(struct rte_cryptodev *dev,
        authdata.key_enc_flags = 0;
        authdata.key_type = RTA_DATA_IMM;
 
+       session->digest_length = auth_xform->digest_length;
+
        switch (auth_xform->algo) {
        case RTE_CRYPTO_AUTH_SHA1_HMAC:
                authdata.algtype = OP_ALG_ALGSEL_SHA1;
@@ -1083,7 +1096,6 @@ dpaa2_sec_aead_init(struct rte_cryptodev *dev,
                session->auth_alg = RTE_CRYPTO_AUTH_SHA512_HMAC;
                break;
        case RTE_CRYPTO_AUTH_AES_XCBC_MAC:
-       case RTE_CRYPTO_AUTH_AES_GCM:
        case RTE_CRYPTO_AUTH_SNOW3G_UIA2:
        case RTE_CRYPTO_AUTH_NULL:
        case RTE_CRYPTO_AUTH_SHA1:
@@ -1092,7 +1104,6 @@ dpaa2_sec_aead_init(struct rte_cryptodev *dev,
        case RTE_CRYPTO_AUTH_SHA224:
        case RTE_CRYPTO_AUTH_SHA384:
        case RTE_CRYPTO_AUTH_MD5:
-       case RTE_CRYPTO_AUTH_AES_CCM:
        case RTE_CRYPTO_AUTH_AES_GMAC:
        case RTE_CRYPTO_AUTH_KASUMI_F9:
        case RTE_CRYPTO_AUTH_AES_CMAC:
@@ -1124,13 +1135,11 @@ dpaa2_sec_aead_init(struct rte_cryptodev *dev,
                session->cipher_alg = RTE_CRYPTO_CIPHER_3DES_CBC;
                ctxt->iv.length = TDES_CBC_IV_LEN;
                break;
-       case RTE_CRYPTO_CIPHER_AES_GCM:
        case RTE_CRYPTO_CIPHER_SNOW3G_UEA2:
        case RTE_CRYPTO_CIPHER_NULL:
        case RTE_CRYPTO_CIPHER_3DES_ECB:
        case RTE_CRYPTO_CIPHER_AES_ECB:
        case RTE_CRYPTO_CIPHER_AES_CTR:
-       case RTE_CRYPTO_CIPHER_AES_CCM:
        case RTE_CRYPTO_CIPHER_KASUMI_F8:
                RTE_LOG(ERR, PMD, "Crypto: Unsupported Cipher alg %u",
                        cipher_xform->algo);
@@ -1212,6 +1221,10 @@ dpaa2_sec_session_configure(struct rte_cryptodev *dev,
                RTE_LOG(ERR, PMD, "invalid session struct");
                return NULL;
        }
+
+       /* Default IV length = 0 */
+       session->iv.length = 0;
+
        /* Cipher Only */
        if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER && xform->next == NULL) {
                session->ctxt_type = DPAA2_SEC_CIPHER;