[dpdk-dev] [PATCH 00/13] Crypto operation restructuring

Pablo de Lara pablo.de.lara.guarch at intel.com
Sun May 28 23:05:09 CEST 2017


This patchset attempts to correct and improve the current crypto operation (rte_crypto_op)
and symmetric crypto operation (rte_crypto_sym_op) structures, shrinking
their sizes to fit both structures into two 64-byte cache lines (with extra space
for the IV and other user data) as one of the goals.

It also introduces new AEAD algorithm specific parameters, to simplify
its setup with a single transform, instead of a concatenation of
a cipher and an authentication transform.

The following changes are made:

In rte_crypto_op:

- Moved session type (with session/sessionless) from symmetric op to crypto op,
  as this could be used for other types

- Combined operation type, operation status and session type into a 64-bit flag (each one taking 1 byte),
  instead of having enums taking 4 bytes each

- Removed opaque data from crypto operation, as private data can be allocated
  just after the symmetric (or other type) crypto operation

- Modified symmetric operation pointer to zero-array, as the symmetric op should be always after the crypto operation

In rte_crypto_sym_xform:

- Removed AAD length from sym_xform (will be taken from operation only)

- Added IV length and offset in sym_xform, so these will be fixed for all the operations in a session

In rte_crypto_sym_op:

- Removed IV parameters, which will be only in the session.

- Added AEAD specific parameters.

- Create union with the new AEAD parameters and the cipher/authenticatoin parameters,
  as the three cannot be used at the same time

- Removed digest length from sym crypto op, so this length will be fixed for all the operations in a session

- Added zero-array at the end of sym crypto op to be used to get extra allocated memory (IV + other user data)

Changes that will be made in v2:

- AEAD algorithms will be set up only using the AEAD structure

- AAD will be removed from authentication algorithms, as it is used for AEAD algorithms

- AES GMAC will be an authentication only algorithm

- Cryptodev tests and crypto applications will be updated with these changes


Previous rte_crypto_op (40 bytes) and rte_crypto_sym_op (114 bytes) structures:

struct rte_crypto_op {
        enum rte_crypto_op_type type;

        enum rte_crypto_op_status status;

        struct rte_mempool *mempool;

        phys_addr_t phys_addr;

        void *opaque_data;

        union {
                struct rte_crypto_sym_op *sym;
        };
} __rte_cache_aligned;

struct rte_crypto_sym_op {
        struct rte_mbuf *m_src;
        struct rte_mbuf *m_dst;

        enum rte_crypto_sym_op_sess_type sess_type;

        RTE_STD_C11
        union {
                struct rte_cryptodev_sym_session *session;
                struct rte_crypto_sym_xform *xform;
        };

        struct {
                struct {
                        uint32_t offset;
                        uint32_t length;
                } data;

                struct {
                        uint8_t *data;
                        phys_addr_t phys_addr;
                        uint16_t length;
                } iv;
        } cipher;

        struct {
                struct {
                        uint32_t offset;
                        uint32_t length;
                } data;
                struct {
                        uint8_t *data;
                        phys_addr_t phys_addr;
                        uint16_t length;
                } digest; /**< Digest parameters */

                struct {
                        uint8_t *data;
                        phys_addr_t phys_addr;
                        uint16_t length;
                } aad;

        } auth;
} __rte_cache_aligned;

New rte_crypto_op (24 bytes) and rte_crypto_sym_op (72 bytes) structures:

struct rte_crypto_op {
        uint64_t type: 8;
        uint64_t status: 8;
        uint64_t sess_type: 8;

        struct rte_mempool *mempool;

        phys_addr_t phys_addr;

        RTE_STD_C11
        union {
                struct rte_crypto_sym_op sym[0];
        };
} __rte_cache_aligned;

struct rte_crypto_sym_op {
        struct rte_mbuf *m_src;
        struct rte_mbuf *m_dst;

        RTE_STD_C11
        union {
                struct rte_cryptodev_sym_session *session;
                struct rte_crypto_sym_xform *xform;
        };

        struct {
                uint8_t offset;
        } iv;

        struct {
                union {
                        struct {
                                uint32_t offset;
                                uint32_t length;
                        } data;
                        struct {
                                uint32_t length;
                                uint8_t *data;
                                phys_addr_t phys_addr;
                        } aad;
                };

                struct {
                        uint8_t *data;
                        phys_addr_t phys_addr;
                } digest;

        } auth;
        struct {
                struct {
                        uint32_t offset;
                        uint32_t length;
                } data;

        } cipher;

        __extension__ char _private[0];
       };

struct rte_crypto_sym_op {
        struct rte_mbuf *m_src;
        struct rte_mbuf *m_dst;

        RTE_STD_C11
        union {
                struct rte_cryptodev_sym_session *session;
                struct rte_crypto_sym_xform *xform;
        };

        union {
                struct {
                        struct {
                                uint32_t offset;
                                uint32_t length;
                        } data; 
                        struct {
                                uint8_t *data;
                                phys_addr_t phys_addr;
                        } digest; 
                        struct {
                                uint8_t *data;
                                phys_addr_t phys_addr; 
                                uint32_t length; 
                        } aad;
                } aead;

                struct {
                        struct {
                                struct {
                                        uint32_t offset;
                                        uint32_t length;
                                } data;
                        } cipher;

                        struct {
                                struct {
                                        uint32_t offset;
                                        uint32_t length;
                                } data;

                                struct {
                                        uint8_t *data;
                                        phys_addr_t phys_addr; 
                                } digest; 
                        } auth;
                };
        };
};

Pablo de Lara (13):
  cryptodev: move session type to generic crypto op
  cryptodev: replace enums with 1-byte variables
  cryptodev: remove opaque data pointer in crypto op
  cryptodev: do not store pointer to op specific params
  cryptodev: add crypto op helper macros
  cryptodev: remove additional auth data from xform
  cryptodev: remove digest length from crypto op
  app/crypto-perf: move IV to crypto op private data
  cryptodev: pass IV as offset
  cryptodev: move IV parameters to crypto session
  drivers/crypto: do not use AAD in wireless algorithms
  cryptodev: aad AEAD specific data
  cryptodev: add AEAD parameters in crypto operation

 app/test-crypto-perf/cperf_ops.c                   |  74 +--
 app/test-crypto-perf/cperf_ops.h                   |   6 +-
 app/test-crypto-perf/cperf_options.h               |   6 +-
 app/test-crypto-perf/cperf_options_parsing.c       |  13 +-
 app/test-crypto-perf/cperf_test_latency.c          |  44 +-
 app/test-crypto-perf/cperf_test_throughput.c       |  15 +-
 app/test-crypto-perf/cperf_test_vector_parsing.c   |   7 +-
 app/test-crypto-perf/cperf_test_vectors.c          |   7 +-
 app/test-crypto-perf/cperf_test_verify.c           |  14 +-
 app/test-crypto-perf/main.c                        |   9 +-
 doc/guides/tools/cryptoperf.rst                    |   8 +-
 drivers/crypto/aesni_gcm/aesni_gcm_pmd.c           | 135 +++--
 drivers/crypto/aesni_gcm/aesni_gcm_pmd_ops.c       |  12 +-
 drivers/crypto/aesni_gcm/aesni_gcm_pmd_private.h   |   7 +
 drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c         |  13 +-
 drivers/crypto/aesni_mb/rte_aesni_mb_pmd_ops.c     |  37 +-
 drivers/crypto/aesni_mb/rte_aesni_mb_pmd_private.h |   5 +
 drivers/crypto/armv8/rte_armv8_pmd.c               |  26 +-
 drivers/crypto/armv8/rte_armv8_pmd_ops.c           |  12 +-
 drivers/crypto/armv8/rte_armv8_pmd_private.h       |  10 +-
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c        |  71 ++-
 drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h          |  31 +-
 drivers/crypto/kasumi/rte_kasumi_pmd.c             |  67 ++-
 drivers/crypto/kasumi/rte_kasumi_pmd_ops.c         |  21 +-
 drivers/crypto/kasumi/rte_kasumi_pmd_private.h     |   1 +
 drivers/crypto/null/null_crypto_pmd.c              |  15 +-
 drivers/crypto/null/null_crypto_pmd_ops.c          |   7 +-
 drivers/crypto/openssl/rte_openssl_pmd.c           |  30 +-
 drivers/crypto/openssl/rte_openssl_pmd_ops.c       |  74 +--
 drivers/crypto/openssl/rte_openssl_pmd_private.h   |   8 +
 drivers/crypto/qat/qat_adf/qat_algs.h              |   8 +-
 drivers/crypto/qat/qat_adf/qat_algs_build_desc.c   |  20 +-
 drivers/crypto/qat/qat_crypto.c                    |  45 +-
 drivers/crypto/qat/qat_crypto_capabilities.h       | 159 +++---
 drivers/crypto/snow3g/rte_snow3g_pmd.c             |  64 +--
 drivers/crypto/snow3g/rte_snow3g_pmd_ops.c         |  21 +-
 drivers/crypto/snow3g/rte_snow3g_pmd_private.h     |   1 +
 drivers/crypto/zuc/rte_zuc_pmd.c                   |  52 +-
 drivers/crypto/zuc/rte_zuc_pmd_ops.c               |  21 +-
 drivers/crypto/zuc/rte_zuc_pmd_private.h           |   1 +
 lib/librte_cryptodev/rte_crypto.h                  |  39 +-
 lib/librte_cryptodev/rte_crypto_sym.h              | 599 ++++++++++++---------
 lib/librte_cryptodev/rte_cryptodev.c               |  69 ++-
 lib/librte_cryptodev/rte_cryptodev.h               |  89 ++-
 test/test/test_cryptodev.c                         |  61 +--
 test/test/test_cryptodev_perf.c                    |   1 -
 46 files changed, 1204 insertions(+), 831 deletions(-)

-- 
2.7.4



More information about the dev mailing list