[dpdk-dev] [PATCH v2 00/27] Crypto operation restructuring

Akhil Goyal akhil.goyal at nxp.com
Thu Jun 29 18:39:28 CEST 2017


On 6/26/2017 3:52 PM, Pablo de Lara wrote:
> 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
>
> - Removed unnecessary cache alignment
>
> In rte_crypto_sym_xform:
>
> - Added IV length and offset in sym_xform, so these will be fixed for all the operations in a session
>
> - Added a new AEAD transform
>
> - Added IV for authentication and AEAD transforms
>
> - Removed AAD length from authentication transform, as it is only used for AEAD algorithms
>
> 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/authentication 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
>
> - Removed AAD length from sym crypto op, so this length will be fixed for all operations in a session
>
> - Removed AAD from authentication structure, as it is only used for AEAD algorithms
>
> - Added zero-array at the end of sym crypto op to be used to get extra allocated memory (IV + other user data)
>
>
> In terms of algorithm usage:
>
> - AEAD algorithms (like AES-GCM) are set up only using the AEAD structure
>
> - AES GMAC will be an authentication only algorithm, using the source buffer directly, instead of AAD field
>
> - Wireless algorithms (like SNOW3G) do not use AAD field for authentication IV anymore, as this is available now.
>
>
> Finally, a comparison between the previous operation and the new operation:
>
> 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;
>
>     union {
>         struct rte_cryptodev_sym_session *session;
>         /**< Handle for the initialised session context */
>         struct rte_crypto_sym_xform *xform;
>         /**< Session-less API Crypto operation parameters */
>     };
>
>     union {
>         struct {
>             struct {
>                 uint32_t offset;
>                 uint32_t length;
>             } data; /**< Data offsets and length for AEAD */
>
>             struct {
>                 uint8_t *data;
>                 phys_addr_t phys_addr;
>             } digest; /**< Digest parameters */
>
>             struct {
>                 uint8_t *data;
>                 phys_addr_t phys_addr;
>             } aad;
>             /**< Additional authentication parameters */
>         } aead;
>
>         struct {
>             struct {
>                 struct {
>                     uint32_t offset;
>                     uint32_t length;
>                 } data; /**< Data offsets and length for ciphering */
>             } cipher;
>
>             struct {
>                 struct {
>                     uint32_t offset;
>                     uint32_t length;
>                 } data;
>                 /**< Data offsets and length for authentication */
>
>                 struct {
>                     uint8_t *data;
>                     phys_addr_t phys_addr;
>                 } digest; /**< Digest parameters */
>             } auth;
>         };
>     };
> };
>
> Changes in v2:
>
> - Added AEAD structures
>
> - Added authentication IV (used for AES-GMAC and wireless algorithms)
>
> - Modified all applications with the changes
>
> - Modified all drivers with the changes
>
> - Moved AAD length to the crypto session
>
> - Rebased against latest dpdk-next-crypto
>
> - Added documentation changes
>
> Pablo de Lara (27):
>   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: remove useless alignment
>   cryptodev: add crypto op helper macros
>   crypto/qat: fix KASUMI authentication
>   test/crypto: move IV to crypto op private data
>   test/crypto-perf: move IV to crypto op private data
>   app/crypto-perf: move IV to crypto op private data
>   examples/l2fwd-crypto: move IV to crypto op private data
>   examples/ipsec-secgw: move IV to crypto op private data
>   cryptodev: pass IV as offset
>   cryptodev: move IV parameters to crypto session
>   cryptodev: add auth IV
>   cryptodev: do not use AAD in wireless algorithms
>   cryptodev: remove AAD length from crypto op
>   cryptodev: remove digest length from crypto op
>   cryptodev: set AES-GMAC as auth-only algo
>   cryptodev: add AEAD specific data
>   cryptodev: add AEAD parameters in crypto operation
>   examples/l2fwd-crypto: avoid too many tabs
>   app/test-crypto-perf: add AEAD parameters
>   examples/ipsec-secgw: add AEAD parameters
>   examples/l2fwd-crypto: add AEAD parameters
>   cryptodev: use AES-GCM/CCM as AEAD algorithms
>   cryptodev: remove AAD from authentication structure
>
>  app/test-crypto-perf/cperf_ops.c                   |  215 ++--
>  app/test-crypto-perf/cperf_ops.h                   |    6 +-
>  app/test-crypto-perf/cperf_options.h               |   24 +-
>  app/test-crypto-perf/cperf_options_parsing.c       |  148 ++-
>  app/test-crypto-perf/cperf_test_latency.c          |   59 +-
>  app/test-crypto-perf/cperf_test_throughput.c       |   24 +-
>  app/test-crypto-perf/cperf_test_vector_parsing.c   |   67 +-
>  app/test-crypto-perf/cperf_test_vectors.c          |  140 ++-
>  app/test-crypto-perf/cperf_test_vectors.h          |   20 +-
>  app/test-crypto-perf/cperf_test_verify.c           |   25 +-
>  app/test-crypto-perf/data/aes_cbc_128_sha.data     |    2 +-
>  app/test-crypto-perf/data/aes_cbc_192_sha.data     |    2 +-
>  app/test-crypto-perf/data/aes_cbc_256_sha.data     |    2 +-
>  app/test-crypto-perf/main.c                        |   61 +-
>  doc/guides/prog_guide/cryptodev_lib.rst            |  107 +-
>  doc/guides/prog_guide/img/crypto_xform_chain.svg   |    8 +-
>  doc/guides/rel_notes/release_17_08.rst             |   36 +
>  doc/guides/sample_app_ug/ipsec_secgw.rst           |   43 +-
>  doc/guides/sample_app_ug/l2_forward_crypto.rst     |   41 +-
>  doc/guides/tools/cryptoperf.rst                    |   50 +-
>  drivers/crypto/aesni_gcm/aesni_gcm_pmd.c           |  260 +++--
>  drivers/crypto/aesni_gcm/aesni_gcm_pmd_ops.c       |   32 +-
>  drivers/crypto/aesni_gcm/aesni_gcm_pmd_private.h   |   13 +-
>  drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c         |   16 +-
>  drivers/crypto/aesni_mb/rte_aesni_mb_pmd_ops.c     |   21 +-
>  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           |    6 +-
>  drivers/crypto/armv8/rte_armv8_pmd_private.h       |    9 +-
>  drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c        |   87 +-
>  drivers/crypto/dpaa2_sec/dpaa2_sec_priv.h          |   25 +-
>  drivers/crypto/kasumi/rte_kasumi_pmd.c             |   88 +-
>  drivers/crypto/kasumi/rte_kasumi_pmd_ops.c         |    5 +-
>  drivers/crypto/kasumi/rte_kasumi_pmd_private.h     |    2 +
>  drivers/crypto/null/null_crypto_pmd.c              |   15 +-
>  drivers/crypto/null/null_crypto_pmd_ops.c          |    9 +-
>  drivers/crypto/openssl/rte_openssl_pmd.c           |  209 +++-
>  drivers/crypto/openssl/rte_openssl_pmd_ops.c       |  103 +-
>  drivers/crypto/openssl/rte_openssl_pmd_private.h   |   14 +
>  drivers/crypto/qat/qat_adf/qat_algs.h              |    9 +
>  drivers/crypto/qat/qat_adf/qat_algs_build_desc.c   |    7 +-
>  drivers/crypto/qat/qat_crypto.c                    |  372 +++++--
>  drivers/crypto/qat/qat_crypto.h                    |    4 +
>  drivers/crypto/qat/qat_crypto_capabilities.h       |   82 +-
>  drivers/crypto/snow3g/rte_snow3g_pmd.c             |   79 +-
>  drivers/crypto/snow3g/rte_snow3g_pmd_ops.c         |    5 +-
>  drivers/crypto/snow3g/rte_snow3g_pmd_private.h     |    2 +
>  drivers/crypto/zuc/rte_zuc_pmd.c                   |   63 +-
>  drivers/crypto/zuc/rte_zuc_pmd_ops.c               |    7 +-
>  drivers/crypto/zuc/rte_zuc_pmd_private.h           |    2 +
>  examples/ipsec-secgw/esp.c                         |  243 ++--
>  examples/ipsec-secgw/ipsec.c                       |    1 -
>  examples/ipsec-secgw/ipsec.h                       |    6 +-
>  examples/ipsec-secgw/sa.c                          |  285 +++--
>  examples/l2fwd-crypto/main.c                       |  721 +++++++++---
>  lib/librte_cryptodev/rte_crypto.h                  |   37 +-
>  lib/librte_cryptodev/rte_crypto_sym.h              |  618 +++++-----
>  lib/librte_cryptodev/rte_cryptodev.c               |   71 +-
>  lib/librte_cryptodev/rte_cryptodev.h               |   90 +-
>  lib/librte_cryptodev/rte_cryptodev_version.map     |   10 +
>  test/test/test_cryptodev.c                         | 1176 ++++++++------------
>  test/test/test_cryptodev.h                         |    6 +
>  test/test/test_cryptodev_blockcipher.c             |   35 +-
>  test/test/test_cryptodev_gcm_test_vectors.h        |   29 +-
>  .../test/test_cryptodev_kasumi_hash_test_vectors.h |   16 +-
>  test/test/test_cryptodev_kasumi_test_vectors.h     |   20 +-
>  test/test/test_cryptodev_perf.c                    |  673 +++++------
>  .../test/test_cryptodev_snow3g_hash_test_vectors.h |   14 +-
>  test/test/test_cryptodev_snow3g_test_vectors.h     |   24 +-
>  test/test/test_cryptodev_zuc_test_vectors.h        |   38 +-
>  70 files changed, 4042 insertions(+), 2728 deletions(-)
>

Acked-by: Akhil Goyal <akhil.goyal at nxp.com>



More information about the dev mailing list