crypto/openssl: fix AEAD parameters
[dpdk.git] / drivers / crypto / openssl / rte_openssl_pmd.c
index 948bc71..cc1ec39 100644 (file)
@@ -355,6 +355,33 @@ openssl_set_session_cipher_parameters(struct openssl_session *sess,
                                sess->cipher.key.data) != 0)
                        return -EINVAL;
                break;
+
+       case RTE_CRYPTO_CIPHER_DES_CBC:
+               sess->cipher.algo = xform->cipher.algo;
+               sess->cipher.ctx = EVP_CIPHER_CTX_new();
+               sess->cipher.evp_algo = EVP_des_cbc();
+
+               get_cipher_key(xform->cipher.key.data, sess->cipher.key.length,
+                       sess->cipher.key.data);
+               if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
+                       if (EVP_EncryptInit_ex(sess->cipher.ctx,
+                                       sess->cipher.evp_algo,
+                                       NULL, xform->cipher.key.data,
+                                       NULL) != 1) {
+                               return -EINVAL;
+                       }
+               } else if (sess->cipher.direction ==
+                               RTE_CRYPTO_CIPHER_OP_DECRYPT) {
+                       if (EVP_DecryptInit_ex(sess->cipher.ctx,
+                                       sess->cipher.evp_algo,
+                                       NULL, xform->cipher.key.data,
+                                       NULL) != 1) {
+                               return -EINVAL;
+                       }
+               }
+
+               break;
+
        case RTE_CRYPTO_CIPHER_DES_DOCSISBPI:
                sess->cipher.algo = xform->cipher.algo;
                sess->chain_order = OPENSSL_CHAIN_CIPHER_BPI;
@@ -482,8 +509,15 @@ static int
 openssl_set_session_aead_parameters(struct openssl_session *sess,
                const struct rte_crypto_sym_xform *xform)
 {
-       /* Select cipher direction */
-       sess->cipher.direction = xform->cipher.op;
+       /* Select cipher direction and auth operation */
+       if (xform->aead.op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
+               sess->cipher.direction = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
+               sess->auth.operation = RTE_CRYPTO_AUTH_OP_GENERATE;
+       } else {
+               sess->cipher.direction = RTE_CRYPTO_CIPHER_OP_DECRYPT;
+               sess->auth.operation = RTE_CRYPTO_AUTH_OP_VERIFY;
+       }
+
        /* Select cipher key */
        sess->cipher.key.length = xform->aead.key.length;
 
@@ -491,10 +525,6 @@ openssl_set_session_aead_parameters(struct openssl_session *sess,
        sess->iv.offset = xform->aead.iv.offset;
        sess->iv.length = xform->aead.iv.length;
 
-       /* Select auth generate/verify */
-       sess->auth.operation = xform->auth.op;
-       sess->auth.algo = xform->auth.algo;
-
        /* Select auth algo */
        switch (xform->aead.algo) {
        case RTE_CRYPTO_AEAD_AES_GCM:
@@ -1284,9 +1314,9 @@ process_openssl_docsis_bpi_op(struct rte_crypto_op *op,
 
 /** Process auth operation */
 static void
-process_openssl_auth_op
-               (struct rte_crypto_op *op, struct openssl_session *sess,
-               struct rte_mbuf *mbuf_src, struct rte_mbuf *mbuf_dst)
+process_openssl_auth_op(struct openssl_qp *qp, struct rte_crypto_op *op,
+               struct openssl_session *sess, struct rte_mbuf *mbuf_src,
+               struct rte_mbuf *mbuf_dst)
 {
        uint8_t *dst;
        int srclen, status;
@@ -1294,8 +1324,7 @@ process_openssl_auth_op
        srclen = op->sym->auth.data.length;
 
        if (sess->auth.operation == RTE_CRYPTO_AUTH_OP_VERIFY)
-               dst = (uint8_t *)rte_pktmbuf_append(mbuf_src,
-                               sess->auth.digest_length);
+               dst = qp->temp_digest;
        else {
                dst = op->sym->auth.digest.data;
                if (dst == NULL)
@@ -1325,8 +1354,6 @@ process_openssl_auth_op
                                sess->auth.digest_length) != 0) {
                        op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
                }
-               /* Trim area used for digest from mbuf. */
-               rte_pktmbuf_trim(mbuf_src, sess->auth.digest_length);
        }
 
        if (status != 0)
@@ -1335,7 +1362,7 @@ process_openssl_auth_op
 
 /** Process crypto operation for mbuf */
 static int
-process_op(const struct openssl_qp *qp, struct rte_crypto_op *op,
+process_op(struct openssl_qp *qp, struct rte_crypto_op *op,
                struct openssl_session *sess)
 {
        struct rte_mbuf *msrc, *mdst;
@@ -1351,14 +1378,14 @@ process_op(const struct openssl_qp *qp, struct rte_crypto_op *op,
                process_openssl_cipher_op(op, sess, msrc, mdst);
                break;
        case OPENSSL_CHAIN_ONLY_AUTH:
-               process_openssl_auth_op(op, sess, msrc, mdst);
+               process_openssl_auth_op(qp, op, sess, msrc, mdst);
                break;
        case OPENSSL_CHAIN_CIPHER_AUTH:
                process_openssl_cipher_op(op, sess, msrc, mdst);
-               process_openssl_auth_op(op, sess, mdst, mdst);
+               process_openssl_auth_op(qp, op, sess, mdst, mdst);
                break;
        case OPENSSL_CHAIN_AUTH_CIPHER:
-               process_openssl_auth_op(op, sess, msrc, mdst);
+               process_openssl_auth_op(qp, op, sess, msrc, mdst);
                process_openssl_cipher_op(op, sess, msrc, mdst);
                break;
        case OPENSSL_CHAIN_COMBINED:
@@ -1548,10 +1575,13 @@ static struct rte_vdev_driver cryptodev_openssl_pmd_drv = {
        .remove = cryptodev_openssl_remove
 };
 
+static struct cryptodev_driver openssl_crypto_drv;
+
 RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_OPENSSL_PMD,
        cryptodev_openssl_pmd_drv);
 RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_OPENSSL_PMD,
        "max_nb_queue_pairs=<int> "
        "max_nb_sessions=<int> "
        "socket_id=<int>");
-RTE_PMD_REGISTER_CRYPTO_DRIVER(cryptodev_openssl_pmd_drv, cryptodev_driver_id);
+RTE_PMD_REGISTER_CRYPTO_DRIVER(openssl_crypto_drv, cryptodev_openssl_pmd_drv,
+               cryptodev_driver_id);