crypto/dpaa_sec: add crypto driver for NXP DPAA platform
[dpdk.git] / drivers / crypto / aesni_gcm / aesni_gcm_pmd.c
index 91c3801..29c14e5 100644 (file)
@@ -63,7 +63,7 @@ aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
                if (auth_xform->auth.algo != RTE_CRYPTO_AUTH_AES_GMAC) {
                        GCM_LOG_ERR("Only AES GMAC is supported as an "
                                        "authentication only algorithm");
-                       return -EINVAL;
+                       return -ENOTSUP;
                }
                /* Set IV parameters */
                sess->iv.offset = auth_xform->auth.iv.offset;
@@ -86,7 +86,7 @@ aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
                if (aead_xform->aead.algo != RTE_CRYPTO_AEAD_AES_GCM) {
                        GCM_LOG_ERR("The only combined operation "
                                                "supported is AES GCM");
-                       return -EINVAL;
+                       return -ENOTSUP;
                }
 
                /* Set IV parameters */
@@ -102,11 +102,11 @@ aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
                key_length = aead_xform->aead.key.length;
                key = aead_xform->aead.key.data;
 
-               sess->aad_length = aead_xform->aead.add_auth_data_length;
+               sess->aad_length = aead_xform->aead.aad_length;
                digest_length = aead_xform->aead.digest_length;
        } else {
                GCM_LOG_ERR("Wrong xform type, has to be AEAD or authentication");
-               return -EINVAL;
+               return -ENOTSUP;
        }
 
 
@@ -129,7 +129,7 @@ aesni_gcm_set_session_parameters(const struct aesni_gcm_ops *gcm_ops,
                sess->key = AESNI_GCM_KEY_256;
                break;
        default:
-               GCM_LOG_ERR("Unsupported key length");
+               GCM_LOG_ERR("Invalid key length");
                return -EINVAL;
        }
 
@@ -224,7 +224,7 @@ process_gcm_crypto_op(struct aesni_gcm_qp *qp, struct rte_crypto_op *op,
 
        RTE_ASSERT(m_src != NULL);
 
-       while (offset >= m_src->data_len) {
+       while (offset >= m_src->data_len && data_length != 0) {
                offset -= m_src->data_len;
                m_src = m_src->next;
 
@@ -298,14 +298,7 @@ process_gcm_crypto_op(struct aesni_gcm_qp *qp, struct rte_crypto_op *op,
                                sym_op->aead.digest.data,
                                (uint64_t)session->digest_length);
        } else if (session->op == AESNI_GCM_OP_AUTHENTICATED_DECRYPTION) {
-               uint8_t *auth_tag = (uint8_t *)rte_pktmbuf_append(sym_op->m_dst ?
-                               sym_op->m_dst : sym_op->m_src,
-                               session->digest_length);
-
-               if (!auth_tag) {
-                       GCM_LOG_ERR("auth_tag");
-                       return -1;
-               }
+               uint8_t *auth_tag = qp->temp_digest;
 
                qp->ops[session->key].init(&session->gdata_key,
                                &qp->gdata_ctx,
@@ -350,14 +343,7 @@ process_gcm_crypto_op(struct aesni_gcm_qp *qp, struct rte_crypto_op *op,
                                sym_op->auth.digest.data,
                                (uint64_t)session->digest_length);
        } else { /* AESNI_GMAC_OP_VERIFY */
-               uint8_t *auth_tag = (uint8_t *)rte_pktmbuf_append(sym_op->m_dst ?
-                               sym_op->m_dst : sym_op->m_src,
-                               session->digest_length);
-
-               if (!auth_tag) {
-                       GCM_LOG_ERR("auth_tag");
-                       return -1;
-               }
+               uint8_t *auth_tag = qp->temp_digest;
 
                qp->ops[session->key].init(&session->gdata_key,
                                &qp->gdata_ctx,
@@ -385,11 +371,10 @@ process_gcm_crypto_op(struct aesni_gcm_qp *qp, struct rte_crypto_op *op,
  * - Returns NULL on invalid job
  */
 static void
-post_process_gcm_crypto_op(struct rte_crypto_op *op,
+post_process_gcm_crypto_op(struct aesni_gcm_qp *qp,
+               struct rte_crypto_op *op,
                struct aesni_gcm_session *session)
 {
-       struct rte_mbuf *m = op->sym->m_dst ? op->sym->m_dst : op->sym->m_src;
-
        op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
 
        /* Verify digest if required */
@@ -397,8 +382,7 @@ post_process_gcm_crypto_op(struct rte_crypto_op *op,
                        session->op == AESNI_GMAC_OP_VERIFY) {
                uint8_t *digest;
 
-               uint8_t *tag = rte_pktmbuf_mtod_offset(m, uint8_t *,
-                               m->data_len - session->digest_length);
+               uint8_t *tag = (uint8_t *)&qp->temp_digest;
 
                if (session->op == AESNI_GMAC_OP_VERIFY)
                        digest = op->sym->auth.digest.data;
@@ -414,9 +398,6 @@ post_process_gcm_crypto_op(struct rte_crypto_op *op,
 
                if (memcmp(tag, digest, session->digest_length) != 0)
                        op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
-
-               /* trim area used for digest from mbuf */
-               rte_pktmbuf_trim(m, session->digest_length);
        }
 }
 
@@ -435,7 +416,7 @@ handle_completed_gcm_crypto_op(struct aesni_gcm_qp *qp,
                struct rte_crypto_op *op,
                struct aesni_gcm_session *sess)
 {
-       post_process_gcm_crypto_op(op, sess);
+       post_process_gcm_crypto_op(qp, op, sess);
 
        /* Free session if a session-less crypto op */
        if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
@@ -630,10 +611,13 @@ static struct rte_vdev_driver aesni_gcm_pmd_drv = {
        .remove = aesni_gcm_remove
 };
 
+static struct cryptodev_driver aesni_gcm_crypto_drv;
+
 RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_AESNI_GCM_PMD, aesni_gcm_pmd_drv);
 RTE_PMD_REGISTER_ALIAS(CRYPTODEV_NAME_AESNI_GCM_PMD, cryptodev_aesni_gcm_pmd);
 RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_AESNI_GCM_PMD,
        "max_nb_queue_pairs=<int> "
        "max_nb_sessions=<int> "
        "socket_id=<int>");
-RTE_PMD_REGISTER_CRYPTO_DRIVER(aesni_gcm_pmd_drv, cryptodev_driver_id);
+RTE_PMD_REGISTER_CRYPTO_DRIVER(aesni_gcm_crypto_drv, aesni_gcm_pmd_drv,
+               cryptodev_driver_id);