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