dpdk/app/test/test_cryptodev.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2015-2017 Intel Corporation
   3 */
   4#ifndef TEST_CRYPTODEV_H_
   5#define TEST_CRYPTODEV_H_
   6
   7#define HEX_DUMP 0
   8
   9#define FALSE                           0
  10#define TRUE                            1
  11
  12#define MAX_NUM_OPS_INFLIGHT            (4096)
  13#define MIN_NUM_OPS_INFLIGHT            (128)
  14#define DEFAULT_NUM_OPS_INFLIGHT        (128)
  15
  16#define MAX_NUM_QPS_PER_QAT_DEVICE      (2)
  17#define DEFAULT_NUM_QPS_PER_QAT_DEVICE  (2)
  18#define DEFAULT_BURST_SIZE              (64)
  19#define DEFAULT_NUM_XFORMS              (2)
  20#define NUM_MBUFS                       (8191)
  21#define MBUF_CACHE_SIZE                 (256)
  22#define MBUF_DATAPAYLOAD_SIZE           (4096 + DIGEST_BYTE_LENGTH_SHA512)
  23#define MBUF_SIZE                       (sizeof(struct rte_mbuf) + \
  24                RTE_PKTMBUF_HEADROOM + MBUF_DATAPAYLOAD_SIZE)
  25
  26#define BYTE_LENGTH(x)                          (x/8)
  27/* HASH DIGEST LENGTHS */
  28#define DIGEST_BYTE_LENGTH_MD5                  (BYTE_LENGTH(128))
  29#define DIGEST_BYTE_LENGTH_SHA1                 (BYTE_LENGTH(160))
  30#define DIGEST_BYTE_LENGTH_SHA224               (BYTE_LENGTH(224))
  31#define DIGEST_BYTE_LENGTH_SHA256               (BYTE_LENGTH(256))
  32#define DIGEST_BYTE_LENGTH_SHA384               (BYTE_LENGTH(384))
  33#define DIGEST_BYTE_LENGTH_SHA512               (BYTE_LENGTH(512))
  34#define DIGEST_BYTE_LENGTH_AES_XCBC             (BYTE_LENGTH(96))
  35#define DIGEST_BYTE_LENGTH_SNOW3G_UIA2          (BYTE_LENGTH(32))
  36#define DIGEST_BYTE_LENGTH_KASUMI_F9            (BYTE_LENGTH(32))
  37#define AES_XCBC_MAC_KEY_SZ                     (16)
  38#define DIGEST_BYTE_LENGTH_AES_GCM              (BYTE_LENGTH(128))
  39
  40#define TRUNCATED_DIGEST_BYTE_LENGTH_SHA1               (12)
  41#define TRUNCATED_DIGEST_BYTE_LENGTH_SHA224             (16)
  42#define TRUNCATED_DIGEST_BYTE_LENGTH_SHA256             (16)
  43#define TRUNCATED_DIGEST_BYTE_LENGTH_SHA384             (24)
  44#define TRUNCATED_DIGEST_BYTE_LENGTH_SHA512             (32)
  45
  46#define MAXIMUM_IV_LENGTH                               (16)
  47#define AES_GCM_J0_LENGTH                               (16)
  48
  49#define IV_OFFSET                       (sizeof(struct rte_crypto_op) + \
  50                sizeof(struct rte_crypto_sym_op) + DEFAULT_NUM_XFORMS * \
  51                sizeof(struct rte_crypto_sym_xform))
  52
  53#define CRYPTODEV_NAME_NULL_PMD         crypto_null
  54#define CRYPTODEV_NAME_AESNI_MB_PMD     crypto_aesni_mb
  55#define CRYPTODEV_NAME_AESNI_GCM_PMD    crypto_aesni_gcm
  56#define CRYPTODEV_NAME_OPENSSL_PMD      crypto_openssl
  57#define CRYPTODEV_NAME_QAT_SYM_PMD      crypto_qat
  58#define CRYPTODEV_NAME_QAT_ASYM_PMD     crypto_qat_asym
  59#define CRYPTODEV_NAME_SNOW3G_PMD       crypto_snow3g
  60#define CRYPTODEV_NAME_KASUMI_PMD       crypto_kasumi
  61#define CRYPTODEV_NAME_ZUC_PMD          crypto_zuc
  62#define CRYPTODEV_NAME_CHACHA20_POLY1305_PMD    crypto_chacha20_poly1305
  63#define CRYPTODEV_NAME_ARMV8_PMD        crypto_armv8
  64#define CRYPTODEV_NAME_DPAA_SEC_PMD     crypto_dpaa_sec
  65#define CRYPTODEV_NAME_DPAA2_SEC_PMD    crypto_dpaa2_sec
  66#define CRYPTODEV_NAME_SCHEDULER_PMD    crypto_scheduler
  67#define CRYPTODEV_NAME_MVSAM_PMD                crypto_mvsam
  68#define CRYPTODEV_NAME_CCP_PMD          crypto_ccp
  69#define CRYPTODEV_NAME_VIRTIO_PMD       crypto_virtio
  70#define CRYPTODEV_NAME_OCTEONTX_SYM_PMD crypto_octeontx
  71#define CRYPTODEV_NAME_CAAM_JR_PMD      crypto_caam_jr
  72#define CRYPTODEV_NAME_NITROX_PMD       crypto_nitrox_sym
  73#define CRYPTODEV_NAME_BCMFS_PMD        crypto_bcmfs
  74#define CRYPTODEV_NAME_CN9K_PMD         crypto_cn9k
  75#define CRYPTODEV_NAME_CN10K_PMD        crypto_cn10k
  76#define CRYPTODEV_NAME_MLX5_PMD         crypto_mlx5
  77
  78
  79enum cryptodev_api_test_type {
  80        CRYPTODEV_API_TEST = 0,
  81        CRYPTODEV_RAW_API_TEST
  82};
  83
  84extern enum cryptodev_api_test_type global_api_test_type;
  85
  86extern struct crypto_testsuite_params *p_testsuite_params;
  87struct crypto_testsuite_params {
  88        struct rte_mempool *mbuf_pool;
  89        struct rte_mempool *large_mbuf_pool;
  90        struct rte_mempool *op_mpool;
  91        struct rte_mempool *session_mpool;
  92        struct rte_mempool *session_priv_mpool;
  93        struct rte_cryptodev_config conf;
  94        struct rte_cryptodev_qp_conf qp_conf;
  95
  96        uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
  97        uint8_t valid_dev_count;
  98};
  99
 100/**
 101 * Write (spread) data from buffer to mbuf data
 102 *
 103 * @param mbuf
 104 *   Destination mbuf
 105 * @param offset
 106 *   Start offset in mbuf
 107 * @param len
 108 *   Number of bytes to copy
 109 * @param buffer
 110 *   Continuous source buffer
 111 */
 112static inline void
 113pktmbuf_write(struct rte_mbuf *mbuf, int offset, int len, const uint8_t *buffer)
 114{
 115        int n = len;
 116        int l;
 117        struct rte_mbuf *m;
 118        char *dst;
 119
 120        for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next)
 121                offset -= m->data_len;
 122
 123        l = m->data_len - offset;
 124
 125        /* copy data from first segment */
 126        dst = rte_pktmbuf_mtod_offset(m, char *, offset);
 127        if (len <= l) {
 128                rte_memcpy(dst, buffer, len);
 129                return;
 130        }
 131
 132        rte_memcpy(dst, buffer, l);
 133        buffer += l;
 134        n -= l;
 135
 136        for (m = m->next; (m != NULL) && (n > 0); m = m->next) {
 137                dst = rte_pktmbuf_mtod(m, char *);
 138                l = m->data_len;
 139                if (n < l) {
 140                        rte_memcpy(dst, buffer, n);
 141                        return;
 142                }
 143                rte_memcpy(dst, buffer, l);
 144                buffer += l;
 145                n -= l;
 146        }
 147}
 148
 149static inline uint8_t *
 150pktmbuf_mtod_offset(struct rte_mbuf *mbuf, int offset) {
 151        struct rte_mbuf *m;
 152
 153        for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next)
 154                offset -= m->data_len;
 155
 156        if (m == NULL) {
 157                printf("pktmbuf_mtod_offset: offset out of buffer\n");
 158                return NULL;
 159        }
 160        return rte_pktmbuf_mtod_offset(m, uint8_t *, offset);
 161}
 162
 163static inline rte_iova_t
 164pktmbuf_iova_offset(struct rte_mbuf *mbuf, int offset) {
 165        struct rte_mbuf *m;
 166
 167        for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next)
 168                offset -= m->data_len;
 169
 170        if (m == NULL) {
 171                printf("pktmbuf_iova_offset: offset out of buffer\n");
 172                return 0;
 173        }
 174        return rte_pktmbuf_iova_offset(m, offset);
 175}
 176
 177static inline struct rte_mbuf *
 178create_segmented_mbuf(struct rte_mempool *mbuf_pool, int pkt_len,
 179                int nb_segs, uint8_t pattern) {
 180
 181        struct rte_mbuf *m = NULL, *mbuf = NULL;
 182        uint8_t *dst;
 183        int data_len = 0;
 184        int i, size;
 185        int t_len;
 186
 187        if (pkt_len < 1) {
 188                printf("Packet size must be 1 or more (is %d)\n", pkt_len);
 189                return NULL;
 190        }
 191
 192        if (nb_segs < 1) {
 193                printf("Number of segments must be 1 or more (is %d)\n",
 194                                nb_segs);
 195                return NULL;
 196        }
 197
 198        t_len = pkt_len >= nb_segs ? pkt_len / nb_segs : 1;
 199        size = pkt_len;
 200
 201        /* Create chained mbuf_src and fill it generated data */
 202        for (i = 0; size > 0; i++) {
 203
 204                m = rte_pktmbuf_alloc(mbuf_pool);
 205                if (i == 0)
 206                        mbuf = m;
 207
 208                if (m == NULL) {
 209                        printf("Cannot create segment for source mbuf");
 210                        goto fail;
 211                }
 212
 213                /* Make sure if tailroom is zeroed */
 214                memset(m->buf_addr, pattern, m->buf_len);
 215
 216                data_len = size > t_len ? t_len : size;
 217                dst = (uint8_t *)rte_pktmbuf_append(m, data_len);
 218                if (dst == NULL) {
 219                        printf("Cannot append %d bytes to the mbuf\n",
 220                                        data_len);
 221                        goto fail;
 222                }
 223
 224                if (mbuf != m)
 225                        rte_pktmbuf_chain(mbuf, m);
 226
 227                size -= data_len;
 228
 229        }
 230        return mbuf;
 231
 232fail:
 233        rte_pktmbuf_free(mbuf);
 234        return NULL;
 235}
 236
 237void
 238process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
 239                struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
 240                uint8_t len_in_bits, uint8_t cipher_iv_len);
 241
 242int
 243check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
 244                uint16_t num_ciphers);
 245
 246int
 247check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
 248                uint16_t num_auths);
 249
 250int
 251check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
 252                uint16_t num_aeads);
 253
 254int
 255ut_setup(void);
 256
 257void
 258ut_teardown(void);
 259
 260#endif /* TEST_CRYPTODEV_H_ */
 261