The changes in this patch enables the Kasumi F9 functionality
for Intel Quick Assist Technology

Signed-off-by: Deepak Kumar Jain <deepak.k.jain at intel.com>
---
 drivers/crypto/qat/qat_adf/qat_algs.h            |  7 ++++++
 drivers/crypto/qat/qat_adf/qat_algs_build_desc.c | 30 ++++++++++++++++++++++--
 drivers/crypto/qat/qat_crypto.c                  | 30 +++++++++++++++++++++++-
 3 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/drivers/crypto/qat/qat_adf/qat_algs.h 
b/drivers/crypto/qat/qat_adf/qat_algs.h
index 6a86053..0cc176f 100644
--- a/drivers/crypto/qat/qat_adf/qat_algs.h
+++ b/drivers/crypto/qat/qat_adf/qat_algs.h
@@ -51,6 +51,13 @@
 #include "icp_qat_fw.h"
 #include "icp_qat_fw_la.h"

+/*
+ * Key Modifier (KM) value used in Kasumi algorithm in F9 mode to XOR
+ * Integrity Key (IK)
+ */
+#define KASUMI_F9_KEY_MODIFIER_4_BYTES   0xAAAAAAAA
+
+
 #define QAT_AES_HW_CONFIG_CBC_ENC(alg) \
        ICP_QAT_HW_CIPHER_CONFIG_BUILD(ICP_QAT_HW_CIPHER_CBC_MODE, alg, \
                                        ICP_QAT_HW_CIPHER_NO_CONVERT, \
diff --git a/drivers/crypto/qat/qat_adf/qat_algs_build_desc.c 
b/drivers/crypto/qat/qat_adf/qat_algs_build_desc.c
index d9437bc..085a652 100644
--- a/drivers/crypto/qat/qat_adf/qat_algs_build_desc.c
+++ b/drivers/crypto/qat/qat_adf/qat_algs_build_desc.c
@@ -96,6 +96,9 @@ static int qat_hash_get_state1_size(enum icp_qat_hw_auth_algo 
qat_hash_alg)
        case ICP_QAT_HW_AUTH_ALGO_MD5:
                return QAT_HW_ROUND_UP(ICP_QAT_HW_MD5_STATE1_SZ,
                                                QAT_HW_DEFAULT_ALIGNMENT);
+       case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9:
+               return QAT_HW_ROUND_UP(ICP_QAT_HW_KASUMI_F9_STATE1_SZ,
+                                               QAT_HW_DEFAULT_ALIGNMENT);
        case ICP_QAT_HW_AUTH_ALGO_DELIMITER:
                /* return maximum state1 size in this case */
                return QAT_HW_ROUND_UP(ICP_QAT_HW_SHA512_STATE1_SZ,
@@ -559,6 +562,8 @@ int qat_alg_aead_session_create_content_desc_auth(struct 
qat_session *cdesc,
        uint16_t state1_size = 0, state2_size = 0;
        uint16_t hash_offset, cd_size;
        uint32_t *aad_len = NULL;
+       uint32_t wordIndex  = 0;
+       uint32_t *pTempKey;

        PMD_INIT_FUNC_TRACE();

@@ -605,7 +610,8 @@ int qat_alg_aead_session_create_content_desc_auth(struct 
qat_session *cdesc,
                        ICP_QAT_HW_AUTH_CONFIG_BUILD(ICP_QAT_HW_AUTH_MODE1,
                                cdesc->qat_hash_alg, digestsize);

-       if (cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2)
+       if (cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2
+               || cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_KASUMI_F9)
                hash->auth_counter.counter = 0;
        else
                hash->auth_counter.counter = rte_bswap32(
@@ -722,12 +728,32 @@ int qat_alg_aead_session_create_content_desc_auth(struct 
qat_session *cdesc,
                break;
        case ICP_QAT_HW_AUTH_ALGO_NULL:
                break;
+       case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9:
+               state1_size = qat_hash_get_state1_size(
+                               ICP_QAT_HW_AUTH_ALGO_KASUMI_F9);
+               state2_size = ICP_QAT_HW_KASUMI_F9_STATE2_SZ;
+               memset(cdesc->cd_cur_ptr, 0, state1_size + state2_size);
+               pTempKey = (uint32_t *)(cdesc->cd_cur_ptr + state1_size
+                                                               + authkeylen);
+               /*
+               ** The Inner Hash Initial State2 block must contain IK
+               ** (Initialisation Key), followed by IK XOR-ed with KM
+               ** (Key Modifier): IK||(IK^KM).
+               **/
+               /* write the auth key */
+               memcpy(cdesc->cd_cur_ptr + state1_size, authkey, authkeylen);
+               /* initialise temp key with auth key */
+               memcpy(pTempKey, authkey, authkeylen);
+               /* XOR Key with KASUMI F9 key modifier at 4 bytes level */
+               for (wordIndex = 0; wordIndex < (authkeylen >> 2); wordIndex++)
+                       pTempKey[wordIndex] ^= KASUMI_F9_KEY_MODIFIER_4_BYTES;
+               break;
        default:
                PMD_DRV_LOG(ERR, "Invalid HASH alg %u", cdesc->qat_hash_alg);
                return -EFAULT;
        }

-       /* Request template setup */
+       /* Request templat setup */
        qat_alg_init_common_hdr(header, proto);
        header->service_cmd_id = cdesc->qat_cmd;

diff --git a/drivers/crypto/qat/qat_crypto.c b/drivers/crypto/qat/qat_crypto.c
index 434ff81..1de95f1 100644
--- a/drivers/crypto/qat/qat_crypto.c
+++ b/drivers/crypto/qat/qat_crypto.c
@@ -304,6 +304,26 @@ static const struct rte_cryptodev_capabilities 
qat_pmd_capabilities[] = {
                        }, }
                }, }
        },
+       {       /* SNOW3G (UEA2) */
+               .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
+               {.sym = {
+                       .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
+                       {.cipher = {
+                               .algo = RTE_CRYPTO_CIPHER_KASUMI_F8,
+                               .block_size = 8,
+                               .key_size = {
+                                       .min = 16,
+                                       .max = 16,
+                                       .increment = 0
+                               },
+                               .iv_size = {
+                                       .min = 16,
+                                       .max = 16,
+                                       .increment = 0
+                               }
+                       }, }
+               }, }
+       },
        RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
 };

@@ -562,6 +582,9 @@ qat_crypto_sym_configure_session_auth(struct rte_cryptodev 
*dev,
        case RTE_CRYPTO_AUTH_NULL:
                session->qat_hash_alg = ICP_QAT_HW_AUTH_ALGO_NULL;
                break;
+       case RTE_CRYPTO_AUTH_KASUMI_F9:
+               session->qat_hash_alg = ICP_QAT_HW_AUTH_ALGO_KASUMI_F9;
+               break;
        case RTE_CRYPTO_AUTH_SHA1:
        case RTE_CRYPTO_AUTH_SHA256:
        case RTE_CRYPTO_AUTH_SHA512:
@@ -570,7 +593,6 @@ qat_crypto_sym_configure_session_auth(struct rte_cryptodev 
*dev,
        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:
        case RTE_CRYPTO_AUTH_AES_CBC_MAC:
        case RTE_CRYPTO_AUTH_ZUC_EIA3:
@@ -817,6 +839,12 @@ qat_write_hw_desc_entry(struct rte_crypto_op *op, uint8_t 
*out_msg)
                auth_param->auth_off >>= 3;
                auth_param->auth_len >>= 3;
        }
+       if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_KASUMI_F9) {
+               auth_param->auth_len = (auth_param->auth_len >> 3)
+                                       + (auth_param->auth_off >> 3)
+                                       + (BYTE_LENGTH >> 3);
+               auth_param->auth_off = 0;
+       }
        auth_param->u1.aad_adr = op->sym->auth.aad.phys_addr;

        if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_128 ||
-- 
2.5.5

Reply via email to