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 (2048 + 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_ARMV8_PMD crypto_armv8 63 #define CRYPTODEV_NAME_DPAA_SEC_PMD crypto_dpaa_sec 64 #define CRYPTODEV_NAME_DPAA2_SEC_PMD crypto_dpaa2_sec 65 #define CRYPTODEV_NAME_SCHEDULER_PMD crypto_scheduler 66 #define CRYPTODEV_NAME_MVSAM_PMD crypto_mvsam 67 #define CRYPTODEV_NAME_CCP_PMD crypto_ccp 68 #define CRYPTODEV_NAME_VIRTIO_PMD crypto_virtio 69 #define CRYPTODEV_NAME_OCTEONTX_SYM_PMD crypto_octeontx 70 #define CRYPTODEV_NAME_OCTEONTX2_PMD crypto_octeontx2 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 75 enum cryptodev_api_test_type { 76 CRYPTODEV_API_TEST = 0, 77 CRYPTODEV_RAW_API_TEST 78 }; 79 80 extern enum cryptodev_api_test_type global_api_test_type; 81 82 extern struct crypto_testsuite_params *p_testsuite_params; 83 struct crypto_testsuite_params { 84 struct rte_mempool *mbuf_pool; 85 struct rte_mempool *large_mbuf_pool; 86 struct rte_mempool *op_mpool; 87 struct rte_mempool *session_mpool; 88 struct rte_mempool *session_priv_mpool; 89 struct rte_cryptodev_config conf; 90 struct rte_cryptodev_qp_conf qp_conf; 91 92 uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS]; 93 uint8_t valid_dev_count; 94 }; 95 96 /** 97 * Write (spread) data from buffer to mbuf data 98 * 99 * @param mbuf 100 * Destination mbuf 101 * @param offset 102 * Start offset in mbuf 103 * @param len 104 * Number of bytes to copy 105 * @param buffer 106 * Continuous source buffer 107 */ 108 static inline void 109 pktmbuf_write(struct rte_mbuf *mbuf, int offset, int len, const uint8_t *buffer) 110 { 111 int n = len; 112 int l; 113 struct rte_mbuf *m; 114 char *dst; 115 116 for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) 117 offset -= m->data_len; 118 119 l = m->data_len - offset; 120 121 /* copy data from first segment */ 122 dst = rte_pktmbuf_mtod_offset(m, char *, offset); 123 if (len <= l) { 124 rte_memcpy(dst, buffer, len); 125 return; 126 } 127 128 rte_memcpy(dst, buffer, l); 129 buffer += l; 130 n -= l; 131 132 for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 133 dst = rte_pktmbuf_mtod(m, char *); 134 l = m->data_len; 135 if (n < l) { 136 rte_memcpy(dst, buffer, n); 137 return; 138 } 139 rte_memcpy(dst, buffer, l); 140 buffer += l; 141 n -= l; 142 } 143 } 144 145 static inline uint8_t * 146 pktmbuf_mtod_offset(struct rte_mbuf *mbuf, int offset) { 147 struct rte_mbuf *m; 148 149 for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) 150 offset -= m->data_len; 151 152 if (m == NULL) { 153 printf("pktmbuf_mtod_offset: offset out of buffer\n"); 154 return NULL; 155 } 156 return rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 157 } 158 159 static inline rte_iova_t 160 pktmbuf_iova_offset(struct rte_mbuf *mbuf, int offset) { 161 struct rte_mbuf *m; 162 163 for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) 164 offset -= m->data_len; 165 166 if (m == NULL) { 167 printf("pktmbuf_iova_offset: offset out of buffer\n"); 168 return 0; 169 } 170 return rte_pktmbuf_iova_offset(m, offset); 171 } 172 173 static inline struct rte_mbuf * 174 create_segmented_mbuf(struct rte_mempool *mbuf_pool, int pkt_len, 175 int nb_segs, uint8_t pattern) { 176 177 struct rte_mbuf *m = NULL, *mbuf = NULL; 178 uint8_t *dst; 179 int data_len = 0; 180 int i, size; 181 int t_len; 182 183 if (pkt_len < 1) { 184 printf("Packet size must be 1 or more (is %d)\n", pkt_len); 185 return NULL; 186 } 187 188 if (nb_segs < 1) { 189 printf("Number of segments must be 1 or more (is %d)\n", 190 nb_segs); 191 return NULL; 192 } 193 194 t_len = pkt_len >= nb_segs ? pkt_len / nb_segs : 1; 195 size = pkt_len; 196 197 /* Create chained mbuf_src and fill it generated data */ 198 for (i = 0; size > 0; i++) { 199 200 m = rte_pktmbuf_alloc(mbuf_pool); 201 if (i == 0) 202 mbuf = m; 203 204 if (m == NULL) { 205 printf("Cannot create segment for source mbuf"); 206 goto fail; 207 } 208 209 /* Make sure if tailroom is zeroed */ 210 memset(m->buf_addr, pattern, m->buf_len); 211 212 data_len = size > t_len ? t_len : size; 213 dst = (uint8_t *)rte_pktmbuf_append(m, data_len); 214 if (dst == NULL) { 215 printf("Cannot append %d bytes to the mbuf\n", 216 data_len); 217 goto fail; 218 } 219 220 if (mbuf != m) 221 rte_pktmbuf_chain(mbuf, m); 222 223 size -= data_len; 224 225 } 226 return mbuf; 227 228 fail: 229 if (mbuf) 230 rte_pktmbuf_free(mbuf); 231 return NULL; 232 } 233 234 void 235 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 236 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 237 uint8_t len_in_bits, uint8_t cipher_iv_len); 238 239 int 240 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 241 uint16_t num_ciphers); 242 243 int 244 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 245 uint16_t num_auths); 246 247 int 248 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 249 uint16_t num_aeads); 250 251 int 252 ut_setup(void); 253 254 void 255 ut_teardown(void); 256 257 #endif /* TEST_CRYPTODEV_H_ */ 258