LCOV - code coverage report
Current view: top level - drivers/crypto/zsda - zsda_crypto.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 118 0.0 %
Date: 2025-06-01 17:49:23 Functions: 0 8 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 60 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2025 ZTE Corporation
       3                 :            :  */
       4                 :            : 
       5                 :            : #include "zsda_crypto.h"
       6                 :            : 
       7                 :            : #define choose_dst_mbuf(mbuf_src, mbuf_dst) ((mbuf_dst) == NULL ? (mbuf_src) : (mbuf_dst))
       8                 :            : #define LBADS_MAX_REMAINDER (16 - 1)
       9                 :            : 
      10                 :            : int
      11                 :          0 : zsda_encry_match(const void *op_in)
      12                 :            : {
      13                 :            :         const struct rte_crypto_op *op = op_in;
      14                 :          0 :         struct rte_cryptodev_sym_session *session = op->sym->session;
      15                 :            :         struct zsda_sym_session *sess =
      16                 :            :                 (struct zsda_sym_session *)session->driver_priv_data;
      17                 :            : 
      18         [ #  # ]:          0 :         if (sess->chain_order == ZSDA_SYM_CHAIN_ONLY_CIPHER &&
      19         [ #  # ]:          0 :             sess->cipher.op == RTE_CRYPTO_CIPHER_OP_ENCRYPT)
      20                 :            :                 return 1;
      21                 :            :         else
      22                 :          0 :                 return 0;
      23                 :            : }
      24                 :            : 
      25                 :            : int
      26                 :          0 : zsda_decry_match(const void *op_in)
      27                 :            : {
      28                 :            :         const struct rte_crypto_op *op = op_in;
      29                 :          0 :         struct rte_cryptodev_sym_session *session = op->sym->session;
      30                 :            :         struct zsda_sym_session *sess =
      31                 :            :                 (struct zsda_sym_session *)session->driver_priv_data;
      32                 :            : 
      33         [ #  # ]:          0 :         if (sess->chain_order == ZSDA_SYM_CHAIN_ONLY_CIPHER &&
      34         [ #  # ]:          0 :             sess->cipher.op == RTE_CRYPTO_CIPHER_OP_DECRYPT)
      35                 :            :                 return 1;
      36                 :            :         else
      37                 :          0 :                 return 0;
      38                 :            : }
      39                 :            : 
      40                 :            : int
      41                 :          0 : zsda_hash_match(const void *op_in)
      42                 :            : {
      43                 :            :         const struct rte_crypto_op *op = op_in;
      44                 :          0 :         struct rte_cryptodev_sym_session *session = op->sym->session;
      45                 :            :         struct zsda_sym_session *sess =
      46                 :            :                 (struct zsda_sym_session *)session->driver_priv_data;
      47                 :            : 
      48         [ #  # ]:          0 :         if (sess->chain_order == ZSDA_SYM_CHAIN_ONLY_AUTH)
      49                 :            :                 return 1;
      50                 :            :         else
      51                 :          0 :                 return 0;
      52                 :            : }
      53                 :            : 
      54                 :            : static uint8_t
      55                 :            : zsda_opcode_hash_get(struct zsda_sym_session *sess)
      56                 :            : {
      57                 :          0 :         switch (sess->auth.algo) {
      58                 :            :         case RTE_CRYPTO_AUTH_SHA1:
      59                 :            :                 return ZSDA_OPC_HASH_SHA1;
      60                 :            : 
      61                 :            :         case RTE_CRYPTO_AUTH_SHA224:
      62                 :            :                 return ZSDA_OPC_HASH_SHA2_224;
      63                 :            : 
      64                 :            :         case RTE_CRYPTO_AUTH_SHA256:
      65                 :            :                 return ZSDA_OPC_HASH_SHA2_256;
      66                 :            : 
      67                 :            :         case RTE_CRYPTO_AUTH_SHA384:
      68                 :            :                 return ZSDA_OPC_HASH_SHA2_384;
      69                 :            : 
      70                 :            :         case RTE_CRYPTO_AUTH_SHA512:
      71                 :            :                 return ZSDA_OPC_HASH_SHA2_512;
      72                 :            : 
      73                 :            :         case RTE_CRYPTO_AUTH_SM3:
      74                 :            :                 return ZSDA_OPC_HASH_SM3;
      75                 :            :         default:
      76                 :            :                 break;
      77                 :            :         }
      78                 :            : 
      79                 :            :         return ZSDA_OPC_INVALID;
      80                 :            : }
      81                 :            : 
      82                 :            : static uint8_t
      83                 :          0 : zsda_opcode_crypto_get(struct zsda_sym_session *sess)
      84                 :            : {
      85         [ #  # ]:          0 :         if (sess->cipher.op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
      86         [ #  # ]:          0 :                 if (sess->cipher.algo == RTE_CRYPTO_CIPHER_AES_XTS &&
      87         [ #  # ]:          0 :                     sess->cipher.key_encry.length == 32)
      88                 :            :                         return ZSDA_OPC_EC_AES_XTS_256;
      89         [ #  # ]:          0 :                 else if (sess->cipher.algo == RTE_CRYPTO_CIPHER_AES_XTS &&
      90         [ #  # ]:          0 :                          sess->cipher.key_encry.length == 64)
      91                 :            :                         return ZSDA_OPC_EC_AES_XTS_512;
      92         [ #  # ]:          0 :                 else if (sess->cipher.algo == RTE_CRYPTO_CIPHER_SM4_XTS)
      93                 :          0 :                         return ZSDA_OPC_EC_SM4_XTS_256;
      94         [ #  # ]:          0 :         } else if (sess->cipher.op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
      95         [ #  # ]:          0 :                 if (sess->cipher.algo == RTE_CRYPTO_CIPHER_AES_XTS &&
      96         [ #  # ]:          0 :                     sess->cipher.key_decry.length == 32)
      97                 :            :                         return ZSDA_OPC_DC_AES_XTS_256;
      98         [ #  # ]:          0 :                 else if (sess->cipher.algo == RTE_CRYPTO_CIPHER_AES_XTS &&
      99         [ #  # ]:          0 :                          sess->cipher.key_decry.length == 64)
     100                 :            :                         return ZSDA_OPC_DC_AES_XTS_512;
     101         [ #  # ]:          0 :                 else if (sess->cipher.algo == RTE_CRYPTO_CIPHER_SM4_XTS)
     102                 :          0 :                         return ZSDA_OPC_DC_SM4_XTS_256;
     103                 :            :         }
     104                 :            :         return ZSDA_OPC_INVALID;
     105                 :            : }
     106                 :            : 
     107                 :            : static int
     108                 :          0 : zsda_len_lbads_chk(uint32_t data_len, uint32_t lbads_size)
     109                 :            : {
     110         [ #  # ]:          0 :         if (data_len < 16) {
     111                 :          0 :                 ZSDA_LOG(ERR, "data_len wrong data_len 0x%x!", data_len);
     112                 :          0 :                 return ZSDA_FAILED;
     113                 :            :         }
     114         [ #  # ]:          0 :         if (lbads_size != 0) {
     115         [ #  # ]:          0 :                 if (!(((data_len % lbads_size) == 0) ||
     116                 :            :                       ((data_len % lbads_size) > LBADS_MAX_REMAINDER))) {
     117                 :          0 :                         ZSDA_LOG(ERR, "data_len wrong! data_len 0x%x - %d",
     118                 :            :                                 data_len, data_len % lbads_size);
     119                 :          0 :                         return ZSDA_FAILED;
     120                 :            :                 }
     121                 :            :         }
     122                 :            : 
     123                 :            :         return ZSDA_SUCCESS;
     124                 :            : }
     125                 :            : 
     126                 :            : int
     127                 :          0 : zsda_crypto_wqe_build(void *op_in, const struct zsda_queue *queue,
     128                 :            :                          void **op_cookies, const uint16_t new_tail)
     129                 :            : {
     130                 :            :         struct rte_crypto_op *op = op_in;
     131                 :            : 
     132                 :          0 :         struct rte_cryptodev_sym_session *session = op->sym->session;
     133                 :          0 :         struct zsda_sym_session *sess =
     134                 :            :                 (struct zsda_sym_session *)session->driver_priv_data;
     135                 :            : 
     136                 :          0 :         struct zsda_wqe_crpt *wqe =
     137                 :          0 :                 (struct zsda_wqe_crpt *)(queue->base_addr +
     138                 :          0 :                                          (new_tail * queue->msg_size));
     139                 :          0 :         struct zsda_op_cookie *cookie = op_cookies[new_tail];
     140                 :          0 :         struct zsda_sgl *sgl_src = (struct zsda_sgl *)&cookie->sgl_src;
     141                 :          0 :         struct zsda_sgl *sgl_dst = (struct zsda_sgl *)&cookie->sgl_dst;
     142                 :            :         struct rte_mbuf *mbuf;
     143                 :            : 
     144                 :            :         int ret;
     145                 :            :         uint32_t op_offset;
     146                 :            :         uint32_t op_src_len;
     147                 :            :         uint32_t op_dst_len;
     148                 :            :         const uint8_t *iv_addr = NULL;
     149                 :            :         uint8_t iv_len = 0;
     150                 :            : 
     151                 :          0 :         ret = zsda_len_lbads_chk(op->sym->cipher.data.length,
     152                 :            :                                    sess->cipher.dataunit_len);
     153         [ #  # ]:          0 :         if (ret) {
     154                 :          0 :                 ZSDA_LOG(ERR, "data_len 0x%x", op->sym->cipher.data.length);
     155                 :          0 :                 return ZSDA_FAILED;
     156                 :            :         }
     157                 :            : 
     158                 :          0 :         op_offset = op->sym->cipher.data.offset;
     159                 :          0 :         op_src_len = op->sym->cipher.data.length;
     160                 :          0 :         mbuf = op->sym->m_src;
     161                 :          0 :         ret = zsda_sgl_fill(mbuf, op_offset, sgl_src, cookie->sgl_src_phys_addr,
     162                 :            :                             op_src_len, NULL);
     163                 :            : 
     164         [ #  # ]:          0 :         mbuf = choose_dst_mbuf(op->sym->m_src, op->sym->m_dst);
     165                 :          0 :         op_dst_len = mbuf->pkt_len - op_offset;
     166                 :          0 :         ret |= zsda_sgl_fill(mbuf, op_offset, sgl_dst,
     167                 :            :                              cookie->sgl_dst_phys_addr, op_dst_len, NULL);
     168                 :            : 
     169         [ #  # ]:          0 :         if (ret) {
     170                 :          0 :                 ZSDA_LOG(ERR, "Failed! zsda_sgl_fill");
     171                 :          0 :                 return ret;
     172                 :            :         }
     173                 :            : 
     174                 :          0 :         cookie->used = true;
     175                 :          0 :         cookie->sid = new_tail;
     176         [ #  # ]:          0 :         cookie->op = op;
     177                 :            : 
     178                 :            :         memset(wqe, 0, sizeof(struct zsda_wqe_crpt));
     179                 :          0 :         wqe->rx_length = op_src_len;
     180                 :          0 :         wqe->tx_length = op_dst_len;
     181                 :          0 :         wqe->valid = queue->valid;
     182                 :          0 :         wqe->op_code = zsda_opcode_crypto_get(sess);
     183                 :          0 :         wqe->sid = cookie->sid;
     184                 :          0 :         wqe->rx_sgl_type = WQE_ELM_TYPE_LIST;
     185                 :          0 :         wqe->tx_sgl_type = WQE_ELM_TYPE_LIST;
     186                 :          0 :         wqe->rx_addr = cookie->sgl_src_phys_addr;
     187                 :          0 :         wqe->tx_addr = cookie->sgl_dst_phys_addr;
     188                 :          0 :         wqe->cfg.lbads = sess->cipher.lbads;
     189                 :            : 
     190         [ #  # ]:          0 :         if (sess->cipher.op == RTE_CRYPTO_CIPHER_OP_ENCRYPT)
     191                 :          0 :                 memcpy((uint8_t *)wqe->cfg.key, sess->cipher.key_encry.data,
     192                 :            :                        ZSDA_CIPHER_KEY_MAX_LEN);
     193                 :            :         else
     194                 :          0 :                 memcpy((uint8_t *)wqe->cfg.key, sess->cipher.key_decry.data,
     195                 :            :                        ZSDA_CIPHER_KEY_MAX_LEN);
     196                 :            : 
     197                 :          0 :         iv_addr = (const uint8_t *)rte_crypto_op_ctod_offset(
     198                 :            :                                op, char *, sess->cipher.iv.offset);
     199                 :          0 :         iv_len = sess->cipher.iv.length;
     200                 :          0 :         zsda_reverse_memcpy((uint8_t *)wqe->cfg.slba_H, iv_addr, iv_len / 2);
     201                 :          0 :         zsda_reverse_memcpy((uint8_t *)wqe->cfg.slba_L, iv_addr + 8, iv_len / 2);
     202                 :            : 
     203                 :          0 :         return ret;
     204                 :            : }
     205                 :            : 
     206                 :            : int
     207                 :          0 : zsda_hash_wqe_build(void *op_in, const struct zsda_queue *queue,
     208                 :            :                void **op_cookies, const uint16_t new_tail)
     209                 :            : {
     210                 :            :         struct rte_crypto_op *op = op_in;
     211                 :            : 
     212                 :          0 :         struct rte_cryptodev_sym_session *session = op->sym->session;
     213                 :            :         struct zsda_sym_session *sess =
     214                 :            :                 (struct zsda_sym_session *)session->driver_priv_data;
     215                 :            : 
     216                 :          0 :         struct zsda_wqe_crpt *wqe =
     217                 :          0 :                 (struct zsda_wqe_crpt *)(queue->base_addr +
     218                 :          0 :                                          (new_tail * queue->msg_size));
     219                 :          0 :         struct zsda_op_cookie *cookie = op_cookies[new_tail];
     220         [ #  # ]:          0 :         struct zsda_sgl *sgl_src = &cookie->sgl_src;
     221                 :            :         uint8_t opcode;
     222                 :            :         uint32_t op_offset;
     223                 :            :         uint32_t op_src_len;
     224                 :            :         int ret;
     225                 :            : 
     226                 :            :         opcode = zsda_opcode_hash_get(sess);
     227         [ #  # ]:          0 :         if (opcode == ZSDA_OPC_INVALID) {
     228                 :          0 :                 ZSDA_LOG(ERR, "Failed! zsda_opcode_hash_get");
     229                 :          0 :                 return ZSDA_FAILED;
     230                 :            :         }
     231                 :            : 
     232                 :          0 :         op_offset = op->sym->auth.data.offset;
     233                 :          0 :         op_src_len = op->sym->auth.data.length;
     234                 :          0 :         ret = zsda_sgl_fill(op->sym->m_src, op_offset, sgl_src,
     235                 :            :                                    cookie->sgl_src_phys_addr, op_src_len, NULL);
     236         [ #  # ]:          0 :         if (ret) {
     237                 :          0 :                 ZSDA_LOG(ERR, "Failed! zsda_sgl_fill");
     238                 :          0 :                 return ret;
     239                 :            :         }
     240                 :            : 
     241                 :            :         memset(wqe, 0, sizeof(struct zsda_wqe_crpt));
     242                 :          0 :         cookie->used = true;
     243                 :          0 :         cookie->sid = new_tail;
     244                 :          0 :         cookie->op = op;
     245                 :          0 :         wqe->valid = queue->valid;
     246                 :          0 :         wqe->op_code = opcode;
     247                 :          0 :         wqe->sid = cookie->sid;
     248                 :          0 :         wqe->rx_sgl_type = WQE_ELM_TYPE_LIST;
     249                 :          0 :         wqe->tx_sgl_type = WQE_ELM_TYPE_PHYS_ADDR;
     250                 :          0 :         wqe->rx_addr = cookie->sgl_src_phys_addr;
     251                 :          0 :         wqe->tx_addr = op->sym->auth.digest.phys_addr;
     252                 :          0 :         wqe->rx_length = op->sym->auth.data.length;
     253                 :          0 :         wqe->tx_length = sess->auth.digest_length;
     254                 :            : 
     255                 :          0 :         return ret;
     256                 :            : }
     257                 :            : 
     258                 :            : int
     259                 :          0 : zsda_crypto_callback(void *cookie_in, struct zsda_cqe *cqe)
     260                 :            : {
     261                 :            :         struct zsda_op_cookie *tmp_cookie = cookie_in;
     262                 :          0 :         struct rte_crypto_op *op = tmp_cookie->op;
     263                 :            : 
     264   [ #  #  #  # ]:          0 :         if (!(CQE_ERR0(cqe->err0) || CQE_ERR1(cqe->err1)))
     265                 :          0 :                 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
     266                 :            :         else {
     267                 :          0 :                 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
     268                 :          0 :                 return ZSDA_FAILED;
     269                 :            :         }
     270                 :            : 
     271                 :          0 :         return ZSDA_SUCCESS;
     272                 :            : }

Generated by: LCOV version 1.14