add session function.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> drivers/crypto/zsda/zsda_sym_session.c | 231 +++++++++++++++++++++++++<br /> drivers/crypto/zsda/zsda_sym_session.h |  74 ++++++++<br /> 2 files changed, 305 insertions(+)<br /> <br />diff --git a/drivers/crypto/zsda/zsda_sym_session.c b/drivers/crypto/zsda/zsda_sym_session.c<br />index ddb6b6a62f..7189b353c4 100644<br />--- a/drivers/crypto/zsda/zsda_sym_session.c<br />+++ b/drivers/crypto/zsda/zsda_sym_session.c<br />@@ -279,3 +279,234 @@ zsda_aes_key_expansion(uint8_t *round_key, uint32_t round_num,<br />         round_key[j + 3] = round_key[k + 3] ^ tempa[3];<br />     }<br /> }<br />+<br />+void<br />+zsda_reverse_memcpy(uint8_t *dst, const uint8_t *src, size_t n)<br />+{<br />+    size_t i;<br />+<br />+    for (i = 0; i < n; ++i)<br />+        dst[n - 1 - i] = src[i];<br />+}<br />+<br />+static void<br />+zsda_decry_set_key(uint8_t key[64], const uint8_t *key1_ptr, uint8_t skey_len,<br />+          enum rte_crypto_cipher_algorithm algo)<br />+{<br />+    uint8_t round_num;<br />+    uint8_t dec_key1[ZSDA_AES_MAX_KEY_BYTE_LEN] = {0};<br />+    uint8_t aes_round_key[ZSDA_AES_MAX_EXP_BYTE_SIZE] = {0};<br />+    uint32_t sm4_round_key[ZSDA_SM4_MAX_EXP_DWORD_SIZE] = {0};<br />+<br />+    switch (algo) {<br />+    case RTE_CRYPTO_CIPHER_AES_XTS:<br />+        round_num = (skey_len == ZSDA_SYM_XTS_256_SKEY_LEN)<br />+                    ? ZSDA_AES256_ROUND_NUM<br />+                    : ZSDA_AES512_ROUND_NUM;<br />+        zsda_aes_key_expansion(aes_round_key, round_num, key1_ptr,<br />+                       skey_len);<br />+        rte_memcpy(dec_key1,<br />+               ((uint8_t *)aes_round_key + (16 * round_num)), 16);<br />+<br />+        if (skey_len == ZSDA_SYM_XTS_512_SKEY_LEN && <br />+            (16 * round_num) <= ZSDA_AES_MAX_EXP_BYTE_SIZE) {<br />+            for (int i = 0; i < 16; i++) {<br />+                dec_key1[i + 16] =<br />+                    aes_round_key[(16 * (round_num - 1)) + i];<br />+            }<br />+        }<br />+        break;<br />+    case RTE_CRYPTO_CIPHER_SM4_XTS:<br />+        zsda_sm4_key_expansion(sm4_round_key, key1_ptr);<br />+        for (size_t i = 0; i < 4; i++)<br />+            u32_to_u8((uint32_t *)sm4_round_key +<br />+                      ZSDA_SM4_MAX_EXP_DWORD_SIZE - 1 - i,<br />+                  dec_key1 + (4 * i));<br />+        break;<br />+    default:<br />+        ZSDA_LOG(ERR, "unknown cipher algo!");<br />+        return;<br />+    }<br />+<br />+    if (skey_len == ZSDA_SYM_XTS_256_SKEY_LEN) {<br />+        zsda_reverse_memcpy((uint8_t *)key + ZSDA_SYM_XTS_256_KEY2_OFF,<br />+                   key1_ptr + skey_len, skey_len);<br />+        zsda_reverse_memcpy((uint8_t *)key + ZSDA_SYM_XTS_256_KEY1_OFF,<br />+                   dec_key1, skey_len);<br />+    } else {<br />+        zsda_reverse_memcpy(key, key1_ptr + skey_len, skey_len);<br />+        zsda_reverse_memcpy((uint8_t *)key + ZSDA_SYM_XTS_512_KEY1_OFF,<br />+                   dec_key1, skey_len);<br />+    }<br />+}<br />+<br />+static uint8_t<br />+zsda_sym_lbads(uint32_t dataunit_len)<br />+{<br />+    uint8_t lbads;<br />+<br />+    switch (dataunit_len) {<br />+    case ZSDA_AES_LBADS_512:<br />+        lbads = ZSDA_AES_LBADS_INDICATE_512;<br />+        break;<br />+    case ZSDA_AES_LBADS_4096:<br />+        lbads = ZSDA_AES_LBADS_INDICATE_4096;<br />+        break;<br />+    case ZSDA_AES_LBADS_8192:<br />+        lbads = ZSDA_AES_LBADS_INDICATE_8192;<br />+        break;<br />+    case ZSDA_AES_LBADS_0:<br />+        lbads = ZSDA_AES_LBADS_INDICATE_0;<br />+        break;<br />+    default:<br />+        ZSDA_LOG(ERR, "dataunit_len should be 0/512/4096/8192 - %d.",<br />+             dataunit_len);<br />+        lbads = ZSDA_AES_LBADS_INDICATE_INVALID;<br />+        break;<br />+    }<br />+    return lbads;<br />+}<br />+<br />+static int<br />+zsda_set_session_cipher(struct zsda_sym_session *sess,<br />+                   struct rte_crypto_cipher_xform *cipher_xform)<br />+{<br />+    uint8_t skey_len = 0;<br />+    const uint8_t *key1_ptr = NULL;<br />+<br />+    if (cipher_xform->key.length > ZSDA_CIPHER_KEY_MAX_LEN) {<br />+        ZSDA_LOG(ERR, "key length not supported");<br />+        return -EINVAL;<br />+    }<br />+<br />+    sess->chain_order = ZSDA_SYM_CHAIN_ONLY_CIPHER;<br />+    sess->cipher.iv.offset = cipher_xform->iv.offset;<br />+    sess->cipher.iv.length = cipher_xform->iv.length;<br />+    sess->cipher.op = cipher_xform->op;<br />+    sess->cipher.algo = cipher_xform->algo;<br />+    sess->cipher.dataunit_len = cipher_xform->dataunit_len;<br />+    sess->cipher.lbads = zsda_sym_lbads(cipher_xform->dataunit_len);<br />+    if (sess->cipher.lbads == 0xff) {<br />+        ZSDA_LOG(ERR, "dataunit_len wrong!");<br />+        return -EINVAL;<br />+    }<br />+<br />+    skey_len = (cipher_xform->key.length / 2) & 0xff;<br />+<br />+    /* key set */<br />+    if (sess->cipher.op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {<br />+        sess->cipher.key_encry.length = cipher_xform->key.length;<br />+        if (skey_len == ZSDA_SYM_XTS_256_SKEY_LEN) {<br />+            zsda_reverse_memcpy((uint8_t *)sess->cipher.key_encry.data +<br />+                           ZSDA_SYM_XTS_256_KEY2_OFF,<br />+                       (cipher_xform->key.data + skey_len),<br />+                       skey_len);<br />+            zsda_reverse_memcpy(((uint8_t *)sess->cipher.key_encry.data +<br />+                    ZSDA_SYM_XTS_256_KEY1_OFF),<br />+                       cipher_xform->key.data, skey_len);<br />+        } else<br />+            zsda_reverse_memcpy((uint8_t *)sess->cipher.key_encry.data,<br />+                       cipher_xform->key.data,<br />+                       cipher_xform->key.length);<br />+    } else if (sess->cipher.op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {<br />+        sess->cipher.key_decry.length = cipher_xform->key.length;<br />+        key1_ptr = cipher_xform->key.data;<br />+        zsda_decry_set_key(sess->cipher.key_decry.data, key1_ptr, skey_len,<br />+                  sess->cipher.algo);<br />+    }<br />+<br />+    return ZSDA_SUCCESS;<br />+}<br />+<br />+static void<br />+zsda_set_session_auth(struct zsda_sym_session *sess,<br />+                 struct rte_crypto_auth_xform *xform)<br />+{<br />+    sess->auth.op = xform->op;<br />+    sess->auth.algo = xform->algo;<br />+    sess->auth.digest_length = xform->digest_length;<br />+    sess->chain_order = ZSDA_SYM_CHAIN_ONLY_AUTH;<br />+}<br />+<br />+static struct rte_crypto_auth_xform *<br />+zsda_get_auth_xform(struct rte_crypto_sym_xform *xform)<br />+{<br />+    do {<br />+        if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH)<br />+            return &xform->auth;<br />+<br />+        xform = xform->next;<br />+    } while (xform);<br />+<br />+    return NULL;<br />+}<br />+<br />+static struct rte_crypto_cipher_xform *<br />+zsda_get_cipher_xform(struct rte_crypto_sym_xform *xform)<br />+{<br />+    do {<br />+        if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER)<br />+            return &xform->cipher;<br />+<br />+        xform = xform->next;<br />+    } while (xform);<br />+<br />+    return NULL;<br />+}<br />+<br />+/** Configure the session from a crypto xform chain */<br />+static enum zsda_sym_chain_order<br />+zsda_crypto_get_chain_order(const struct rte_crypto_sym_xform *xform)<br />+{<br />+    enum zsda_sym_chain_order res = ZSDA_SYM_CHAIN_NOT_SUPPORTED;<br />+<br />+    if (xform != NULL) {<br />+        if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH) {<br />+            if (xform->next == NULL)<br />+                res = ZSDA_SYM_CHAIN_ONLY_AUTH;<br />+            else if (xform->next->type ==<br />+                    RTE_CRYPTO_SYM_XFORM_CIPHER)<br />+                res = ZSDA_SYM_CHAIN_AUTH_CIPHER;<br />+        }<br />+        if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER) {<br />+            if (xform->next == NULL)<br />+                res = ZSDA_SYM_CHAIN_ONLY_CIPHER;<br />+            else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_AUTH)<br />+                res = ZSDA_SYM_CHAIN_CIPHER_AUTH;<br />+        }<br />+    }<br />+<br />+    return res;<br />+}<br />+<br />+/* Set session cipher parameters */<br />+int<br />+zsda_crypto_set_session_parameters(void *sess_priv,<br />+             struct rte_crypto_sym_xform *xform)<br />+{<br />+<br />+    struct zsda_sym_session *sess = sess_priv;<br />+    struct rte_crypto_cipher_xform *cipher_xform =<br />+            zsda_get_cipher_xform(xform);<br />+    struct rte_crypto_auth_xform *auth_xform =<br />+            zsda_get_auth_xform(xform);<br />+<br />+    int ret = ZSDA_SUCCESS;<br />+<br />+    sess->chain_order = zsda_crypto_get_chain_order(xform);<br />+    switch (sess->chain_order) {<br />+    case ZSDA_SYM_CHAIN_ONLY_CIPHER:<br />+        zsda_set_session_cipher(sess, cipher_xform);<br />+        break;<br />+    case ZSDA_SYM_CHAIN_ONLY_AUTH:<br />+        zsda_set_session_auth(sess, auth_xform);<br />+        break;<br />+<br />+    default:<br />+        ZSDA_LOG(ERR, "Invalid chain order");<br />+        ret = -EINVAL;<br />+        break;<br />+    }<br />+<br />+    return ret;<br />+}<br />diff --git a/drivers/crypto/zsda/zsda_sym_session.h b/drivers/crypto/zsda/zsda_sym_session.h<br />index 15897b1aaf..eefd38f8bb 100644<br />--- a/drivers/crypto/zsda/zsda_sym_session.h<br />+++ b/drivers/crypto/zsda/zsda_sym_session.h<br />@@ -5,5 +5,79 @@<br /> #ifndef _ZSDA_SYM_SESSION_H_<br /> #define _ZSDA_SYM_SESSION_H_<br />  <br />+#define ZSDA_SYM_XTS_IV_SLBA_OFF  (8)<br />+#define ZSDA_SYM_XTS_256_SKEY_LEN (16)<br />+#define ZSDA_SYM_XTS_512_SKEY_LEN (32)<br />+#define ZSDA_SYM_XTS_256_KEY2_OFF (16)<br />+#define ZSDA_SYM_XTS_256_KEY1_OFF (48)<br />+#define ZSDA_SYM_XTS_512_KEY1_OFF (32)<br />+#define ZSDA_SYM_MIN_SRC_LEN_HASH (16)<br />+<br />+#define ZSDA_AES256_ROUND_NUM        (10)<br />+#define ZSDA_AES512_ROUND_NUM        (14)<br />+#define ZSDA_AES_MAX_EXP_BYTE_SIZE  (240)<br />+#define ZSDA_AES_MAX_KEY_BYTE_LEN   (32)<br />+#define ZSDA_SM4_MAX_EXP_DWORD_SIZE (32)<br />+<br />+#define ZSDA_AES_LBADS_0      (0)<br />+#define ZSDA_AES_LBADS_512      (512)<br />+#define ZSDA_AES_LBADS_4096      (4096)<br />+#define ZSDA_AES_LBADS_8192      (8192)<br />+<br />+#define ZSDA_AES_LBADS_INDICATE_0       (0x0)<br />+#define ZSDA_AES_LBADS_INDICATE_512     (0x9)<br />+#define ZSDA_AES_LBADS_INDICATE_4096    (0xC)<br />+#define ZSDA_AES_LBADS_INDICATE_8192    (0xD)<br />+#define ZSDA_AES_LBADS_INDICATE_INVALID (0xff)<br />+<br />+#define ZSDA_CIPHER_KEY_MAX_LEN 64<br />+<br />+enum zsda_sym_chain_order {<br />+    ZSDA_SYM_CHAIN_ONLY_CIPHER,<br />+    ZSDA_SYM_CHAIN_ONLY_AUTH,<br />+    ZSDA_SYM_CHAIN_CIPHER_AUTH,<br />+    ZSDA_SYM_CHAIN_AUTH_CIPHER,<br />+    ZSDA_SYM_CHAIN_NOT_SUPPORTED<br />+};<br />+<br />+struct __rte_cache_aligned zsda_sym_session {<br />+    enum zsda_sym_chain_order chain_order;<br />+<br />+    /* Cipher Parameters */<br />+    struct {<br />+        enum rte_crypto_cipher_operation op;<br />+        enum rte_crypto_cipher_algorithm algo;<br />+        struct {<br />+            uint8_t data[ZSDA_CIPHER_KEY_MAX_LEN];<br />+            size_t length;<br />+        } key_encry;<br />+        struct {<br />+            uint8_t data[ZSDA_CIPHER_KEY_MAX_LEN];<br />+            size_t length;<br />+        } key_decry;<br />+        struct {<br />+            uint32_t offset;<br />+            size_t length;<br />+        } iv;<br />+<br />+        uint32_t dataunit_len;<br />+        uint8_t lbads;<br />+    } cipher;<br />+<br />+    struct {<br />+        enum rte_crypto_auth_operation op;<br />+        /* Auth operation */<br />+        enum rte_crypto_auth_algorithm algo;<br />+        /* Auth algorithm */<br />+        uint16_t digest_length;<br />+    } auth;<br />+<br />+    bool cipher_first;<br />+};<br />+<br />+void zsda_reverse_memcpy(uint8_t *dst, const uint8_t *src, size_t n);<br />+<br />+int zsda_crypto_set_session_parameters(void *sess_priv,<br />+                       struct rte_crypto_sym_xform *xform);<br />  <br /> #endif /* _ZSDA_SYM_SESSION_H_ */<br />--  <br />2.27.0<br />