xref: /dpdk/drivers/crypto/ccp/ccp_crypto.c (revision 0d526c7a6c2951859fe01c292601cff3dbde3b54)
129610e41SRavi Kumar /*   SPDX-License-Identifier: BSD-3-Clause
229610e41SRavi Kumar  *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
329610e41SRavi Kumar  */
429610e41SRavi Kumar 
57360749fSHeinrich Schuchardt #define OPENSSL_API_COMPAT 0x10100000L
67360749fSHeinrich Schuchardt 
729610e41SRavi Kumar #include <dirent.h>
829610e41SRavi Kumar #include <fcntl.h>
929610e41SRavi Kumar #include <stdio.h>
1029610e41SRavi Kumar #include <string.h>
1129610e41SRavi Kumar #include <sys/mman.h>
1229610e41SRavi Kumar #include <sys/queue.h>
1329610e41SRavi Kumar #include <sys/types.h>
1429610e41SRavi Kumar #include <unistd.h>
150c6a81efSRavi Kumar #include <openssl/sha.h>
16687ae11fSRavi Kumar #include <openssl/cmac.h> /*sub key apis*/
17687ae11fSRavi Kumar #include <openssl/evp.h> /*sub key apis*/
1829610e41SRavi Kumar 
1929610e41SRavi Kumar #include <rte_hexdump.h>
2029610e41SRavi Kumar #include <rte_memzone.h>
2129610e41SRavi Kumar #include <rte_malloc.h>
2229610e41SRavi Kumar #include <rte_memory.h>
2329610e41SRavi Kumar #include <rte_spinlock.h>
2429610e41SRavi Kumar #include <rte_string_fns.h>
25af668035SAkhil Goyal #include <cryptodev_pmd.h>
2629610e41SRavi Kumar 
2729610e41SRavi Kumar #include "ccp_dev.h"
2829610e41SRavi Kumar #include "ccp_crypto.h"
2929610e41SRavi Kumar #include "ccp_pmd_private.h"
3029610e41SRavi Kumar 
316c561b03SRavi Kumar #include <openssl/conf.h>
326c561b03SRavi Kumar #include <openssl/err.h>
336c561b03SRavi Kumar #include <openssl/hmac.h>
346c561b03SRavi Kumar 
350c6a81efSRavi Kumar /* SHA initial context values */
3609a0fd73SAmaranath Somalapuram uint32_t ccp_sha1_init[SHA_COMMON_DIGEST_SIZE / sizeof(uint32_t)] = {
370c6a81efSRavi Kumar 	SHA1_H4, SHA1_H3,
380c6a81efSRavi Kumar 	SHA1_H2, SHA1_H1,
390c6a81efSRavi Kumar 	SHA1_H0, 0x0U,
400c6a81efSRavi Kumar 	0x0U, 0x0U,
410c6a81efSRavi Kumar };
420c6a81efSRavi Kumar 
43ca40ea24SRavi Kumar uint32_t ccp_sha224_init[SHA256_DIGEST_SIZE / sizeof(uint32_t)] = {
44ca40ea24SRavi Kumar 	SHA224_H7, SHA224_H6,
45ca40ea24SRavi Kumar 	SHA224_H5, SHA224_H4,
46ca40ea24SRavi Kumar 	SHA224_H3, SHA224_H2,
47ca40ea24SRavi Kumar 	SHA224_H1, SHA224_H0,
48ca40ea24SRavi Kumar };
49ca40ea24SRavi Kumar 
50ca40ea24SRavi Kumar uint32_t ccp_sha256_init[SHA256_DIGEST_SIZE / sizeof(uint32_t)] = {
51ca40ea24SRavi Kumar 	SHA256_H7, SHA256_H6,
52ca40ea24SRavi Kumar 	SHA256_H5, SHA256_H4,
53ca40ea24SRavi Kumar 	SHA256_H3, SHA256_H2,
54ca40ea24SRavi Kumar 	SHA256_H1, SHA256_H0,
55ca40ea24SRavi Kumar };
56ca40ea24SRavi Kumar 
57ca40ea24SRavi Kumar uint64_t ccp_sha384_init[SHA512_DIGEST_SIZE / sizeof(uint64_t)] = {
58ca40ea24SRavi Kumar 	SHA384_H7, SHA384_H6,
59ca40ea24SRavi Kumar 	SHA384_H5, SHA384_H4,
60ca40ea24SRavi Kumar 	SHA384_H3, SHA384_H2,
61ca40ea24SRavi Kumar 	SHA384_H1, SHA384_H0,
62ca40ea24SRavi Kumar };
63ca40ea24SRavi Kumar 
64ca40ea24SRavi Kumar uint64_t ccp_sha512_init[SHA512_DIGEST_SIZE / sizeof(uint64_t)] = {
65ca40ea24SRavi Kumar 	SHA512_H7, SHA512_H6,
66ca40ea24SRavi Kumar 	SHA512_H5, SHA512_H4,
67ca40ea24SRavi Kumar 	SHA512_H3, SHA512_H2,
68ca40ea24SRavi Kumar 	SHA512_H1, SHA512_H0,
69ca40ea24SRavi Kumar };
70ca40ea24SRavi Kumar 
711df800f8SRavi Kumar #if defined(_MSC_VER)
721df800f8SRavi Kumar #define SHA3_CONST(x) x
731df800f8SRavi Kumar #else
741df800f8SRavi Kumar #define SHA3_CONST(x) x##L
751df800f8SRavi Kumar #endif
761df800f8SRavi Kumar 
771df800f8SRavi Kumar /** 'Words' here refers to uint64_t */
781df800f8SRavi Kumar #define SHA3_KECCAK_SPONGE_WORDS \
791df800f8SRavi Kumar 	(((1600) / 8) / sizeof(uint64_t))
801df800f8SRavi Kumar typedef struct sha3_context_ {
811df800f8SRavi Kumar 	uint64_t saved;
821df800f8SRavi Kumar 	/**
831df800f8SRavi Kumar 	 * The portion of the input message that we
841df800f8SRavi Kumar 	 * didn't consume yet
851df800f8SRavi Kumar 	 */
861df800f8SRavi Kumar 	union {
871df800f8SRavi Kumar 		uint64_t s[SHA3_KECCAK_SPONGE_WORDS];
881df800f8SRavi Kumar 		/* Keccak's state */
891df800f8SRavi Kumar 		uint8_t sb[SHA3_KECCAK_SPONGE_WORDS * 8];
901df800f8SRavi Kumar 		/**total 200 ctx size**/
911df800f8SRavi Kumar 	};
921df800f8SRavi Kumar 	unsigned int byteIndex;
931df800f8SRavi Kumar 	/**
941df800f8SRavi Kumar 	 * 0..7--the next byte after the set one
951df800f8SRavi Kumar 	 * (starts from 0; 0--none are buffered)
961df800f8SRavi Kumar 	 */
971df800f8SRavi Kumar 	unsigned int wordIndex;
981df800f8SRavi Kumar 	/**
991df800f8SRavi Kumar 	 * 0..24--the next word to integrate input
1001df800f8SRavi Kumar 	 * (starts from 0)
1011df800f8SRavi Kumar 	 */
1021df800f8SRavi Kumar 	unsigned int capacityWords;
1031df800f8SRavi Kumar 	/**
1041df800f8SRavi Kumar 	 * the double size of the hash output in
1051df800f8SRavi Kumar 	 * words (e.g. 16 for Keccak 512)
1061df800f8SRavi Kumar 	 */
1071df800f8SRavi Kumar } sha3_context;
1081df800f8SRavi Kumar 
1091df800f8SRavi Kumar #ifndef SHA3_ROTL64
1101df800f8SRavi Kumar #define SHA3_ROTL64(x, y) \
1111df800f8SRavi Kumar 	(((x) << (y)) | ((x) >> ((sizeof(uint64_t)*8) - (y))))
1121df800f8SRavi Kumar #endif
1131df800f8SRavi Kumar 
1141df800f8SRavi Kumar static const uint64_t keccakf_rndc[24] = {
1151df800f8SRavi Kumar 	SHA3_CONST(0x0000000000000001UL), SHA3_CONST(0x0000000000008082UL),
1161df800f8SRavi Kumar 	SHA3_CONST(0x800000000000808aUL), SHA3_CONST(0x8000000080008000UL),
1171df800f8SRavi Kumar 	SHA3_CONST(0x000000000000808bUL), SHA3_CONST(0x0000000080000001UL),
1181df800f8SRavi Kumar 	SHA3_CONST(0x8000000080008081UL), SHA3_CONST(0x8000000000008009UL),
1191df800f8SRavi Kumar 	SHA3_CONST(0x000000000000008aUL), SHA3_CONST(0x0000000000000088UL),
1201df800f8SRavi Kumar 	SHA3_CONST(0x0000000080008009UL), SHA3_CONST(0x000000008000000aUL),
1211df800f8SRavi Kumar 	SHA3_CONST(0x000000008000808bUL), SHA3_CONST(0x800000000000008bUL),
1221df800f8SRavi Kumar 	SHA3_CONST(0x8000000000008089UL), SHA3_CONST(0x8000000000008003UL),
1231df800f8SRavi Kumar 	SHA3_CONST(0x8000000000008002UL), SHA3_CONST(0x8000000000000080UL),
1241df800f8SRavi Kumar 	SHA3_CONST(0x000000000000800aUL), SHA3_CONST(0x800000008000000aUL),
1251df800f8SRavi Kumar 	SHA3_CONST(0x8000000080008081UL), SHA3_CONST(0x8000000000008080UL),
1261df800f8SRavi Kumar 	SHA3_CONST(0x0000000080000001UL), SHA3_CONST(0x8000000080008008UL)
1271df800f8SRavi Kumar };
1281df800f8SRavi Kumar 
1291df800f8SRavi Kumar static const unsigned int keccakf_rotc[24] = {
1301df800f8SRavi Kumar 	1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62,
1311df800f8SRavi Kumar 	18, 39, 61, 20, 44
1321df800f8SRavi Kumar };
1331df800f8SRavi Kumar 
1341df800f8SRavi Kumar static const unsigned int keccakf_piln[24] = {
1351df800f8SRavi Kumar 	10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20,
1361df800f8SRavi Kumar 	14, 22, 9, 6, 1
1371df800f8SRavi Kumar };
1381df800f8SRavi Kumar 
13929610e41SRavi Kumar static enum ccp_cmd_order
ccp_get_cmd_id(const struct rte_crypto_sym_xform * xform)14029610e41SRavi Kumar ccp_get_cmd_id(const struct rte_crypto_sym_xform *xform)
14129610e41SRavi Kumar {
14229610e41SRavi Kumar 	enum ccp_cmd_order res = CCP_CMD_NOT_SUPPORTED;
14329610e41SRavi Kumar 
14429610e41SRavi Kumar 	if (xform == NULL)
14529610e41SRavi Kumar 		return res;
14629610e41SRavi Kumar 	if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH) {
14729610e41SRavi Kumar 		if (xform->next == NULL)
14829610e41SRavi Kumar 			return CCP_CMD_AUTH;
14929610e41SRavi Kumar 		else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_CIPHER)
15029610e41SRavi Kumar 			return CCP_CMD_HASH_CIPHER;
15129610e41SRavi Kumar 	}
15229610e41SRavi Kumar 	if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER) {
15329610e41SRavi Kumar 		if (xform->next == NULL)
15429610e41SRavi Kumar 			return CCP_CMD_CIPHER;
15529610e41SRavi Kumar 		else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_AUTH)
15629610e41SRavi Kumar 			return CCP_CMD_CIPHER_HASH;
15729610e41SRavi Kumar 	}
15829610e41SRavi Kumar 	if (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD)
15929610e41SRavi Kumar 		return CCP_CMD_COMBINED;
16029610e41SRavi Kumar 	return res;
16129610e41SRavi Kumar }
16229610e41SRavi Kumar 
1630c6a81efSRavi Kumar /* partial hash using openssl */
partial_hash_sha1(uint8_t * data_in,uint8_t * data_out)1640c6a81efSRavi Kumar static int partial_hash_sha1(uint8_t *data_in, uint8_t *data_out)
1650c6a81efSRavi Kumar {
1660c6a81efSRavi Kumar 	SHA_CTX ctx;
1670c6a81efSRavi Kumar 
1680c6a81efSRavi Kumar 	if (!SHA1_Init(&ctx))
1690c6a81efSRavi Kumar 		return -EFAULT;
1700c6a81efSRavi Kumar 	SHA1_Transform(&ctx, data_in);
1710c6a81efSRavi Kumar 	rte_memcpy(data_out, &ctx, SHA_DIGEST_LENGTH);
1720c6a81efSRavi Kumar 	return 0;
1730c6a81efSRavi Kumar }
1740c6a81efSRavi Kumar 
partial_hash_sha224(uint8_t * data_in,uint8_t * data_out)175ca40ea24SRavi Kumar static int partial_hash_sha224(uint8_t *data_in, uint8_t *data_out)
176ca40ea24SRavi Kumar {
177ca40ea24SRavi Kumar 	SHA256_CTX ctx;
178ca40ea24SRavi Kumar 
179ca40ea24SRavi Kumar 	if (!SHA224_Init(&ctx))
180ca40ea24SRavi Kumar 		return -EFAULT;
181ca40ea24SRavi Kumar 	SHA256_Transform(&ctx, data_in);
182ca40ea24SRavi Kumar 	rte_memcpy(data_out, &ctx,
183ca40ea24SRavi Kumar 		   SHA256_DIGEST_LENGTH);
184ca40ea24SRavi Kumar 	return 0;
185ca40ea24SRavi Kumar }
186ca40ea24SRavi Kumar 
partial_hash_sha256(uint8_t * data_in,uint8_t * data_out)187ca40ea24SRavi Kumar static int partial_hash_sha256(uint8_t *data_in, uint8_t *data_out)
188ca40ea24SRavi Kumar {
189ca40ea24SRavi Kumar 	SHA256_CTX ctx;
190ca40ea24SRavi Kumar 
191ca40ea24SRavi Kumar 	if (!SHA256_Init(&ctx))
192ca40ea24SRavi Kumar 		return -EFAULT;
193ca40ea24SRavi Kumar 	SHA256_Transform(&ctx, data_in);
194ca40ea24SRavi Kumar 	rte_memcpy(data_out, &ctx,
195ca40ea24SRavi Kumar 		   SHA256_DIGEST_LENGTH);
196ca40ea24SRavi Kumar 	return 0;
197ca40ea24SRavi Kumar }
198ca40ea24SRavi Kumar 
partial_hash_sha384(uint8_t * data_in,uint8_t * data_out)199ca40ea24SRavi Kumar static int partial_hash_sha384(uint8_t *data_in, uint8_t *data_out)
200ca40ea24SRavi Kumar {
201ca40ea24SRavi Kumar 	SHA512_CTX ctx;
202ca40ea24SRavi Kumar 
203ca40ea24SRavi Kumar 	if (!SHA384_Init(&ctx))
204ca40ea24SRavi Kumar 		return -EFAULT;
205ca40ea24SRavi Kumar 	SHA512_Transform(&ctx, data_in);
206ca40ea24SRavi Kumar 	rte_memcpy(data_out, &ctx,
207ca40ea24SRavi Kumar 		   SHA512_DIGEST_LENGTH);
208ca40ea24SRavi Kumar 	return 0;
209ca40ea24SRavi Kumar }
210ca40ea24SRavi Kumar 
partial_hash_sha512(uint8_t * data_in,uint8_t * data_out)211ca40ea24SRavi Kumar static int partial_hash_sha512(uint8_t *data_in, uint8_t *data_out)
212ca40ea24SRavi Kumar {
213ca40ea24SRavi Kumar 	SHA512_CTX ctx;
214ca40ea24SRavi Kumar 
215ca40ea24SRavi Kumar 	if (!SHA512_Init(&ctx))
216ca40ea24SRavi Kumar 		return -EFAULT;
217ca40ea24SRavi Kumar 	SHA512_Transform(&ctx, data_in);
218ca40ea24SRavi Kumar 	rte_memcpy(data_out, &ctx,
219ca40ea24SRavi Kumar 		   SHA512_DIGEST_LENGTH);
220ca40ea24SRavi Kumar 	return 0;
221ca40ea24SRavi Kumar }
222ca40ea24SRavi Kumar 
2231df800f8SRavi Kumar static void
keccakf(uint64_t s[25])2241df800f8SRavi Kumar keccakf(uint64_t s[25])
2251df800f8SRavi Kumar {
2261df800f8SRavi Kumar 	int i, j, round;
2271df800f8SRavi Kumar 	uint64_t t, bc[5];
2281df800f8SRavi Kumar #define KECCAK_ROUNDS 24
2291df800f8SRavi Kumar 
2301df800f8SRavi Kumar 	for (round = 0; round < KECCAK_ROUNDS; round++) {
2311df800f8SRavi Kumar 
2321df800f8SRavi Kumar 		/* Theta */
2331df800f8SRavi Kumar 		for (i = 0; i < 5; i++)
2341df800f8SRavi Kumar 			bc[i] = s[i] ^ s[i + 5] ^ s[i + 10] ^ s[i + 15] ^
2351df800f8SRavi Kumar 				s[i + 20];
2361df800f8SRavi Kumar 
2371df800f8SRavi Kumar 		for (i = 0; i < 5; i++) {
2381df800f8SRavi Kumar 			t = bc[(i + 4) % 5] ^ SHA3_ROTL64(bc[(i + 1) % 5], 1);
2391df800f8SRavi Kumar 			for (j = 0; j < 25; j += 5)
2401df800f8SRavi Kumar 				s[j + i] ^= t;
2411df800f8SRavi Kumar 		}
2421df800f8SRavi Kumar 
2431df800f8SRavi Kumar 		/* Rho Pi */
2441df800f8SRavi Kumar 		t = s[1];
2451df800f8SRavi Kumar 		for (i = 0; i < 24; i++) {
2461df800f8SRavi Kumar 			j = keccakf_piln[i];
2471df800f8SRavi Kumar 			bc[0] = s[j];
2481df800f8SRavi Kumar 			s[j] = SHA3_ROTL64(t, keccakf_rotc[i]);
2491df800f8SRavi Kumar 			t = bc[0];
2501df800f8SRavi Kumar 		}
2511df800f8SRavi Kumar 
2521df800f8SRavi Kumar 		/* Chi */
2531df800f8SRavi Kumar 		for (j = 0; j < 25; j += 5) {
2541df800f8SRavi Kumar 			for (i = 0; i < 5; i++)
2551df800f8SRavi Kumar 				bc[i] = s[j + i];
2561df800f8SRavi Kumar 			for (i = 0; i < 5; i++)
2571df800f8SRavi Kumar 				s[j + i] ^= (~bc[(i + 1) % 5]) &
2581df800f8SRavi Kumar 					    bc[(i + 2) % 5];
2591df800f8SRavi Kumar 		}
2601df800f8SRavi Kumar 
2611df800f8SRavi Kumar 		/* Iota */
2621df800f8SRavi Kumar 		s[0] ^= keccakf_rndc[round];
2631df800f8SRavi Kumar 	}
2641df800f8SRavi Kumar }
2651df800f8SRavi Kumar 
2661df800f8SRavi Kumar static void
sha3_Init224(void * priv)2671df800f8SRavi Kumar sha3_Init224(void *priv)
2681df800f8SRavi Kumar {
2691df800f8SRavi Kumar 	sha3_context *ctx = (sha3_context *) priv;
2701df800f8SRavi Kumar 
2711df800f8SRavi Kumar 	memset(ctx, 0, sizeof(*ctx));
2721df800f8SRavi Kumar 	ctx->capacityWords = 2 * 224 / (8 * sizeof(uint64_t));
2731df800f8SRavi Kumar }
2741df800f8SRavi Kumar 
2751df800f8SRavi Kumar static void
sha3_Init256(void * priv)2761df800f8SRavi Kumar sha3_Init256(void *priv)
2771df800f8SRavi Kumar {
2781df800f8SRavi Kumar 	sha3_context *ctx = (sha3_context *) priv;
2791df800f8SRavi Kumar 
2801df800f8SRavi Kumar 	memset(ctx, 0, sizeof(*ctx));
2811df800f8SRavi Kumar 	ctx->capacityWords = 2 * 256 / (8 * sizeof(uint64_t));
2821df800f8SRavi Kumar }
2831df800f8SRavi Kumar 
2841df800f8SRavi Kumar static void
sha3_Init384(void * priv)2851df800f8SRavi Kumar sha3_Init384(void *priv)
2861df800f8SRavi Kumar {
2871df800f8SRavi Kumar 	sha3_context *ctx = (sha3_context *) priv;
2881df800f8SRavi Kumar 
2891df800f8SRavi Kumar 	memset(ctx, 0, sizeof(*ctx));
2901df800f8SRavi Kumar 	ctx->capacityWords = 2 * 384 / (8 * sizeof(uint64_t));
2911df800f8SRavi Kumar }
2921df800f8SRavi Kumar 
2931df800f8SRavi Kumar static void
sha3_Init512(void * priv)2941df800f8SRavi Kumar sha3_Init512(void *priv)
2951df800f8SRavi Kumar {
2961df800f8SRavi Kumar 	sha3_context *ctx = (sha3_context *) priv;
2971df800f8SRavi Kumar 
2981df800f8SRavi Kumar 	memset(ctx, 0, sizeof(*ctx));
2991df800f8SRavi Kumar 	ctx->capacityWords = 2 * 512 / (8 * sizeof(uint64_t));
3001df800f8SRavi Kumar }
3011df800f8SRavi Kumar 
3021df800f8SRavi Kumar 
3031df800f8SRavi Kumar /* This is simply the 'update' with the padding block.
3041df800f8SRavi Kumar  * The padding block is 0x01 || 0x00* || 0x80. First 0x01 and last 0x80
3051df800f8SRavi Kumar  * bytes are always present, but they can be the same byte.
3061df800f8SRavi Kumar  */
3071df800f8SRavi Kumar static void
sha3_Update(void * priv,void const * bufIn,size_t len)3081df800f8SRavi Kumar sha3_Update(void *priv, void const *bufIn, size_t len)
3091df800f8SRavi Kumar {
3101df800f8SRavi Kumar 	sha3_context *ctx = (sha3_context *) priv;
3111df800f8SRavi Kumar 	unsigned int old_tail = (8 - ctx->byteIndex) & 7;
3121df800f8SRavi Kumar 	size_t words;
3131df800f8SRavi Kumar 	unsigned int tail;
3141df800f8SRavi Kumar 	size_t i;
3151df800f8SRavi Kumar 	const uint8_t *buf = bufIn;
3161df800f8SRavi Kumar 
3171df800f8SRavi Kumar 	if (len < old_tail) {
3181df800f8SRavi Kumar 		while (len--)
3191df800f8SRavi Kumar 			ctx->saved |= (uint64_t) (*(buf++)) <<
3201df800f8SRavi Kumar 				      ((ctx->byteIndex++) * 8);
3211df800f8SRavi Kumar 		return;
3221df800f8SRavi Kumar 	}
3231df800f8SRavi Kumar 
3241df800f8SRavi Kumar 	if (old_tail) {
3251df800f8SRavi Kumar 		len -= old_tail;
3261df800f8SRavi Kumar 		while (old_tail--)
3271df800f8SRavi Kumar 			ctx->saved |= (uint64_t) (*(buf++)) <<
3281df800f8SRavi Kumar 				      ((ctx->byteIndex++) * 8);
3291df800f8SRavi Kumar 
3301df800f8SRavi Kumar 		ctx->s[ctx->wordIndex] ^= ctx->saved;
3311df800f8SRavi Kumar 		ctx->byteIndex = 0;
3321df800f8SRavi Kumar 		ctx->saved = 0;
3331df800f8SRavi Kumar 		if (++ctx->wordIndex ==
3341df800f8SRavi Kumar 		   (SHA3_KECCAK_SPONGE_WORDS - ctx->capacityWords)) {
3351df800f8SRavi Kumar 			keccakf(ctx->s);
3361df800f8SRavi Kumar 			ctx->wordIndex = 0;
3371df800f8SRavi Kumar 		}
3381df800f8SRavi Kumar 	}
3391df800f8SRavi Kumar 
3401df800f8SRavi Kumar 	words = len / sizeof(uint64_t);
3411df800f8SRavi Kumar 	tail = len - words * sizeof(uint64_t);
3421df800f8SRavi Kumar 
3431df800f8SRavi Kumar 	for (i = 0; i < words; i++, buf += sizeof(uint64_t)) {
3441df800f8SRavi Kumar 		const uint64_t t = (uint64_t) (buf[0]) |
3451df800f8SRavi Kumar 			((uint64_t) (buf[1]) << 8 * 1) |
3461df800f8SRavi Kumar 			((uint64_t) (buf[2]) << 8 * 2) |
3471df800f8SRavi Kumar 			((uint64_t) (buf[3]) << 8 * 3) |
3481df800f8SRavi Kumar 			((uint64_t) (buf[4]) << 8 * 4) |
3491df800f8SRavi Kumar 			((uint64_t) (buf[5]) << 8 * 5) |
3501df800f8SRavi Kumar 			((uint64_t) (buf[6]) << 8 * 6) |
3511df800f8SRavi Kumar 			((uint64_t) (buf[7]) << 8 * 7);
3521df800f8SRavi Kumar 		ctx->s[ctx->wordIndex] ^= t;
3531df800f8SRavi Kumar 		if (++ctx->wordIndex ==
3541df800f8SRavi Kumar 		   (SHA3_KECCAK_SPONGE_WORDS - ctx->capacityWords)) {
3551df800f8SRavi Kumar 			keccakf(ctx->s);
3561df800f8SRavi Kumar 			ctx->wordIndex = 0;
3571df800f8SRavi Kumar 		}
3581df800f8SRavi Kumar 	}
3591df800f8SRavi Kumar 
3601df800f8SRavi Kumar 	while (tail--)
3611df800f8SRavi Kumar 		ctx->saved |= (uint64_t) (*(buf++)) << ((ctx->byteIndex++) * 8);
3621df800f8SRavi Kumar }
3631df800f8SRavi Kumar 
partial_hash_sha3_224(uint8_t * data_in,uint8_t * data_out)3641df800f8SRavi Kumar int partial_hash_sha3_224(uint8_t *data_in, uint8_t *data_out)
3651df800f8SRavi Kumar {
3661df800f8SRavi Kumar 	sha3_context *ctx;
3671df800f8SRavi Kumar 	int i;
3681df800f8SRavi Kumar 
3691df800f8SRavi Kumar 	ctx = rte_zmalloc("sha3-ctx", sizeof(sha3_context), 0);
3701df800f8SRavi Kumar 	if (!ctx) {
3711df800f8SRavi Kumar 		CCP_LOG_ERR("sha3-ctx creation failed");
3721df800f8SRavi Kumar 		return -ENOMEM;
3731df800f8SRavi Kumar 	}
3741df800f8SRavi Kumar 	sha3_Init224(ctx);
3751df800f8SRavi Kumar 	sha3_Update(ctx, data_in, SHA3_224_BLOCK_SIZE);
3761df800f8SRavi Kumar 	for (i = 0; i < CCP_SHA3_CTX_SIZE; i++, data_out++)
3771df800f8SRavi Kumar 		*data_out = ctx->sb[CCP_SHA3_CTX_SIZE - i - 1];
3781df800f8SRavi Kumar 	rte_free(ctx);
3791df800f8SRavi Kumar 
3801df800f8SRavi Kumar 	return 0;
3811df800f8SRavi Kumar }
3821df800f8SRavi Kumar 
partial_hash_sha3_256(uint8_t * data_in,uint8_t * data_out)3831df800f8SRavi Kumar int partial_hash_sha3_256(uint8_t *data_in, uint8_t *data_out)
3841df800f8SRavi Kumar {
3851df800f8SRavi Kumar 	sha3_context *ctx;
3861df800f8SRavi Kumar 	int i;
3871df800f8SRavi Kumar 
3881df800f8SRavi Kumar 	ctx = rte_zmalloc("sha3-ctx", sizeof(sha3_context), 0);
3891df800f8SRavi Kumar 	if (!ctx) {
3901df800f8SRavi Kumar 		CCP_LOG_ERR("sha3-ctx creation failed");
3911df800f8SRavi Kumar 		return -ENOMEM;
3921df800f8SRavi Kumar 	}
3931df800f8SRavi Kumar 	sha3_Init256(ctx);
3941df800f8SRavi Kumar 	sha3_Update(ctx, data_in, SHA3_256_BLOCK_SIZE);
3951df800f8SRavi Kumar 	for (i = 0; i < CCP_SHA3_CTX_SIZE; i++, data_out++)
3961df800f8SRavi Kumar 		*data_out = ctx->sb[CCP_SHA3_CTX_SIZE - i - 1];
3971df800f8SRavi Kumar 	rte_free(ctx);
3981df800f8SRavi Kumar 
3991df800f8SRavi Kumar 	return 0;
4001df800f8SRavi Kumar }
4011df800f8SRavi Kumar 
partial_hash_sha3_384(uint8_t * data_in,uint8_t * data_out)4021df800f8SRavi Kumar int partial_hash_sha3_384(uint8_t *data_in, uint8_t *data_out)
4031df800f8SRavi Kumar {
4041df800f8SRavi Kumar 	sha3_context *ctx;
4051df800f8SRavi Kumar 	int i;
4061df800f8SRavi Kumar 
4071df800f8SRavi Kumar 	ctx = rte_zmalloc("sha3-ctx", sizeof(sha3_context), 0);
4081df800f8SRavi Kumar 	if (!ctx) {
4091df800f8SRavi Kumar 		CCP_LOG_ERR("sha3-ctx creation failed");
4101df800f8SRavi Kumar 		return -ENOMEM;
4111df800f8SRavi Kumar 	}
4121df800f8SRavi Kumar 	sha3_Init384(ctx);
4131df800f8SRavi Kumar 	sha3_Update(ctx, data_in, SHA3_384_BLOCK_SIZE);
4141df800f8SRavi Kumar 	for (i = 0; i < CCP_SHA3_CTX_SIZE; i++, data_out++)
4151df800f8SRavi Kumar 		*data_out = ctx->sb[CCP_SHA3_CTX_SIZE - i - 1];
4161df800f8SRavi Kumar 	rte_free(ctx);
4171df800f8SRavi Kumar 
4181df800f8SRavi Kumar 	return 0;
4191df800f8SRavi Kumar }
4201df800f8SRavi Kumar 
partial_hash_sha3_512(uint8_t * data_in,uint8_t * data_out)4211df800f8SRavi Kumar int partial_hash_sha3_512(uint8_t *data_in, uint8_t *data_out)
4221df800f8SRavi Kumar {
4231df800f8SRavi Kumar 	sha3_context *ctx;
4241df800f8SRavi Kumar 	int i;
4251df800f8SRavi Kumar 
4261df800f8SRavi Kumar 	ctx = rte_zmalloc("sha3-ctx", sizeof(sha3_context), 0);
4271df800f8SRavi Kumar 	if (!ctx) {
4281df800f8SRavi Kumar 		CCP_LOG_ERR("sha3-ctx creation failed");
4291df800f8SRavi Kumar 		return -ENOMEM;
4301df800f8SRavi Kumar 	}
4311df800f8SRavi Kumar 	sha3_Init512(ctx);
4321df800f8SRavi Kumar 	sha3_Update(ctx, data_in, SHA3_512_BLOCK_SIZE);
4331df800f8SRavi Kumar 	for (i = 0; i < CCP_SHA3_CTX_SIZE; i++, data_out++)
4341df800f8SRavi Kumar 		*data_out = ctx->sb[CCP_SHA3_CTX_SIZE - i - 1];
4351df800f8SRavi Kumar 	rte_free(ctx);
4361df800f8SRavi Kumar 
4371df800f8SRavi Kumar 	return 0;
4381df800f8SRavi Kumar }
4391df800f8SRavi Kumar 
generate_partial_hash(struct ccp_session * sess)4400c6a81efSRavi Kumar static int generate_partial_hash(struct ccp_session *sess)
4410c6a81efSRavi Kumar {
4420c6a81efSRavi Kumar 
4430c6a81efSRavi Kumar 	uint8_t ipad[sess->auth.block_size];
4440c6a81efSRavi Kumar 	uint8_t	opad[sess->auth.block_size];
4450c6a81efSRavi Kumar 	uint8_t *ipad_t, *opad_t;
4460c6a81efSRavi Kumar 	uint32_t *hash_value_be32, hash_temp32[8];
447ca40ea24SRavi Kumar 	uint64_t *hash_value_be64, hash_temp64[8];
4480c6a81efSRavi Kumar 	int i, count;
4491df800f8SRavi Kumar 	uint8_t *hash_value_sha3;
4500c6a81efSRavi Kumar 
4510c6a81efSRavi Kumar 	opad_t = ipad_t = (uint8_t *)sess->auth.key;
4520c6a81efSRavi Kumar 
4530c6a81efSRavi Kumar 	hash_value_be32 = (uint32_t *)((uint8_t *)sess->auth.pre_compute);
454ca40ea24SRavi Kumar 	hash_value_be64 = (uint64_t *)((uint8_t *)sess->auth.pre_compute);
4550c6a81efSRavi Kumar 
4560c6a81efSRavi Kumar 	/* considering key size is always equal to block size of algorithm */
4570c6a81efSRavi Kumar 	for (i = 0; i < sess->auth.block_size; i++) {
4580c6a81efSRavi Kumar 		ipad[i] = (ipad_t[i] ^ HMAC_IPAD_VALUE);
4590c6a81efSRavi Kumar 		opad[i] = (opad_t[i] ^ HMAC_OPAD_VALUE);
4600c6a81efSRavi Kumar 	}
4610c6a81efSRavi Kumar 
4620c6a81efSRavi Kumar 	switch (sess->auth.algo) {
4630c6a81efSRavi Kumar 	case CCP_AUTH_ALGO_SHA1_HMAC:
4640c6a81efSRavi Kumar 		count = SHA1_DIGEST_SIZE >> 2;
4650c6a81efSRavi Kumar 
4660c6a81efSRavi Kumar 		if (partial_hash_sha1(ipad, (uint8_t *)hash_temp32))
4670c6a81efSRavi Kumar 			return -1;
4680c6a81efSRavi Kumar 		for (i = 0; i < count; i++, hash_value_be32++)
4690c6a81efSRavi Kumar 			*hash_value_be32 = hash_temp32[count - 1 - i];
4700c6a81efSRavi Kumar 
4710c6a81efSRavi Kumar 		hash_value_be32 = (uint32_t *)((uint8_t *)sess->auth.pre_compute
4720c6a81efSRavi Kumar 					       + sess->auth.ctx_len);
4730c6a81efSRavi Kumar 		if (partial_hash_sha1(opad, (uint8_t *)hash_temp32))
4740c6a81efSRavi Kumar 			return -1;
4750c6a81efSRavi Kumar 		for (i = 0; i < count; i++, hash_value_be32++)
4760c6a81efSRavi Kumar 			*hash_value_be32 = hash_temp32[count - 1 - i];
4770c6a81efSRavi Kumar 		return 0;
478ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA224_HMAC:
479ca40ea24SRavi Kumar 		count = SHA256_DIGEST_SIZE >> 2;
480ca40ea24SRavi Kumar 
481ca40ea24SRavi Kumar 		if (partial_hash_sha224(ipad, (uint8_t *)hash_temp32))
482ca40ea24SRavi Kumar 			return -1;
483ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be32++)
484ca40ea24SRavi Kumar 			*hash_value_be32 = hash_temp32[count - 1 - i];
485ca40ea24SRavi Kumar 
486ca40ea24SRavi Kumar 		hash_value_be32 = (uint32_t *)((uint8_t *)sess->auth.pre_compute
487ca40ea24SRavi Kumar 					       + sess->auth.ctx_len);
488ca40ea24SRavi Kumar 		if (partial_hash_sha224(opad, (uint8_t *)hash_temp32))
489ca40ea24SRavi Kumar 			return -1;
490ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be32++)
491ca40ea24SRavi Kumar 			*hash_value_be32 = hash_temp32[count - 1 - i];
492ca40ea24SRavi Kumar 		return 0;
4931df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_224_HMAC:
4941df800f8SRavi Kumar 		hash_value_sha3 = sess->auth.pre_compute;
4951df800f8SRavi Kumar 		if (partial_hash_sha3_224(ipad, hash_value_sha3))
4961df800f8SRavi Kumar 			return -1;
4971df800f8SRavi Kumar 
4981df800f8SRavi Kumar 		hash_value_sha3 = (uint8_t *)(sess->auth.pre_compute
4991df800f8SRavi Kumar 					       + sess->auth.ctx_len);
5001df800f8SRavi Kumar 		if (partial_hash_sha3_224(opad, hash_value_sha3))
5011df800f8SRavi Kumar 			return -1;
5021df800f8SRavi Kumar 		return 0;
503ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA256_HMAC:
504ca40ea24SRavi Kumar 		count = SHA256_DIGEST_SIZE >> 2;
505ca40ea24SRavi Kumar 
506ca40ea24SRavi Kumar 		if (partial_hash_sha256(ipad, (uint8_t *)hash_temp32))
507ca40ea24SRavi Kumar 			return -1;
508ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be32++)
509ca40ea24SRavi Kumar 			*hash_value_be32 = hash_temp32[count - 1 - i];
510ca40ea24SRavi Kumar 
511ca40ea24SRavi Kumar 		hash_value_be32 = (uint32_t *)((uint8_t *)sess->auth.pre_compute
512ca40ea24SRavi Kumar 					       + sess->auth.ctx_len);
513ca40ea24SRavi Kumar 		if (partial_hash_sha256(opad, (uint8_t *)hash_temp32))
514ca40ea24SRavi Kumar 			return -1;
515ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be32++)
516ca40ea24SRavi Kumar 			*hash_value_be32 = hash_temp32[count - 1 - i];
517ca40ea24SRavi Kumar 		return 0;
5181df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_256_HMAC:
5191df800f8SRavi Kumar 		hash_value_sha3 = sess->auth.pre_compute;
5201df800f8SRavi Kumar 		if (partial_hash_sha3_256(ipad, hash_value_sha3))
5211df800f8SRavi Kumar 			return -1;
5221df800f8SRavi Kumar 
5231df800f8SRavi Kumar 		hash_value_sha3 = (uint8_t *)(sess->auth.pre_compute
5241df800f8SRavi Kumar 					      + sess->auth.ctx_len);
5251df800f8SRavi Kumar 		if (partial_hash_sha3_256(opad, hash_value_sha3))
5261df800f8SRavi Kumar 			return -1;
5271df800f8SRavi Kumar 		return 0;
528ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA384_HMAC:
529ca40ea24SRavi Kumar 		count = SHA512_DIGEST_SIZE >> 3;
530ca40ea24SRavi Kumar 
531ca40ea24SRavi Kumar 		if (partial_hash_sha384(ipad, (uint8_t *)hash_temp64))
532ca40ea24SRavi Kumar 			return -1;
533ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be64++)
534ca40ea24SRavi Kumar 			*hash_value_be64 = hash_temp64[count - 1 - i];
535ca40ea24SRavi Kumar 
536ca40ea24SRavi Kumar 		hash_value_be64 = (uint64_t *)((uint8_t *)sess->auth.pre_compute
537ca40ea24SRavi Kumar 					       + sess->auth.ctx_len);
538ca40ea24SRavi Kumar 		if (partial_hash_sha384(opad, (uint8_t *)hash_temp64))
539ca40ea24SRavi Kumar 			return -1;
540ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be64++)
541ca40ea24SRavi Kumar 			*hash_value_be64 = hash_temp64[count - 1 - i];
542ca40ea24SRavi Kumar 		return 0;
5431df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_384_HMAC:
5441df800f8SRavi Kumar 		hash_value_sha3 = sess->auth.pre_compute;
5451df800f8SRavi Kumar 		if (partial_hash_sha3_384(ipad, hash_value_sha3))
5461df800f8SRavi Kumar 			return -1;
5471df800f8SRavi Kumar 
5481df800f8SRavi Kumar 		hash_value_sha3 = (uint8_t *)(sess->auth.pre_compute
5491df800f8SRavi Kumar 					      + sess->auth.ctx_len);
5501df800f8SRavi Kumar 		if (partial_hash_sha3_384(opad, hash_value_sha3))
5511df800f8SRavi Kumar 			return -1;
5521df800f8SRavi Kumar 		return 0;
553ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA512_HMAC:
554ca40ea24SRavi Kumar 		count = SHA512_DIGEST_SIZE >> 3;
555ca40ea24SRavi Kumar 
556ca40ea24SRavi Kumar 		if (partial_hash_sha512(ipad, (uint8_t *)hash_temp64))
557ca40ea24SRavi Kumar 			return -1;
558ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be64++)
559ca40ea24SRavi Kumar 			*hash_value_be64 = hash_temp64[count - 1 - i];
560ca40ea24SRavi Kumar 
561ca40ea24SRavi Kumar 		hash_value_be64 = (uint64_t *)((uint8_t *)sess->auth.pre_compute
562ca40ea24SRavi Kumar 					       + sess->auth.ctx_len);
563ca40ea24SRavi Kumar 		if (partial_hash_sha512(opad, (uint8_t *)hash_temp64))
564ca40ea24SRavi Kumar 			return -1;
565ca40ea24SRavi Kumar 		for (i = 0; i < count; i++, hash_value_be64++)
566ca40ea24SRavi Kumar 			*hash_value_be64 = hash_temp64[count - 1 - i];
567ca40ea24SRavi Kumar 		return 0;
5681df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_512_HMAC:
5691df800f8SRavi Kumar 		hash_value_sha3 = sess->auth.pre_compute;
5701df800f8SRavi Kumar 		if (partial_hash_sha3_512(ipad, hash_value_sha3))
5711df800f8SRavi Kumar 			return -1;
5721df800f8SRavi Kumar 
5731df800f8SRavi Kumar 		hash_value_sha3 = (uint8_t *)(sess->auth.pre_compute
5741df800f8SRavi Kumar 					      + sess->auth.ctx_len);
5751df800f8SRavi Kumar 		if (partial_hash_sha3_512(opad, hash_value_sha3))
5761df800f8SRavi Kumar 			return -1;
5771df800f8SRavi Kumar 		return 0;
5780c6a81efSRavi Kumar 	default:
5790c6a81efSRavi Kumar 		CCP_LOG_ERR("Invalid auth algo");
5800c6a81efSRavi Kumar 		return -1;
5810c6a81efSRavi Kumar 	}
5820c6a81efSRavi Kumar }
5830c6a81efSRavi Kumar 
584687ae11fSRavi Kumar /* prepare temporary keys K1 and K2 */
prepare_key(unsigned char * k,unsigned char * l,int bl)585687ae11fSRavi Kumar static void prepare_key(unsigned char *k, unsigned char *l, int bl)
586687ae11fSRavi Kumar {
587687ae11fSRavi Kumar 	int i;
588687ae11fSRavi Kumar 	/* Shift block to left, including carry */
589687ae11fSRavi Kumar 	for (i = 0; i < bl; i++) {
590687ae11fSRavi Kumar 		k[i] = l[i] << 1;
591687ae11fSRavi Kumar 		if (i < bl - 1 && l[i + 1] & 0x80)
592687ae11fSRavi Kumar 			k[i] |= 1;
593687ae11fSRavi Kumar 	}
594687ae11fSRavi Kumar 	/* If MSB set fixup with R */
595687ae11fSRavi Kumar 	if (l[0] & 0x80)
596687ae11fSRavi Kumar 		k[bl - 1] ^= bl == 16 ? 0x87 : 0x1b;
597687ae11fSRavi Kumar }
598687ae11fSRavi Kumar 
599687ae11fSRavi Kumar /* subkeys K1 and K2 generation for CMAC */
600687ae11fSRavi Kumar static int
generate_cmac_subkeys(struct ccp_session * sess)601687ae11fSRavi Kumar generate_cmac_subkeys(struct ccp_session *sess)
602687ae11fSRavi Kumar {
603687ae11fSRavi Kumar 	const EVP_CIPHER *algo;
604687ae11fSRavi Kumar 	EVP_CIPHER_CTX *ctx;
605687ae11fSRavi Kumar 	unsigned char *ccp_ctx;
606687ae11fSRavi Kumar 	size_t i;
607687ae11fSRavi Kumar 	int dstlen, totlen;
608687ae11fSRavi Kumar 	unsigned char zero_iv[AES_BLOCK_SIZE] = {0};
609687ae11fSRavi Kumar 	unsigned char dst[2 * AES_BLOCK_SIZE] = {0};
610687ae11fSRavi Kumar 	unsigned char k1[AES_BLOCK_SIZE] = {0};
611687ae11fSRavi Kumar 	unsigned char k2[AES_BLOCK_SIZE] = {0};
612687ae11fSRavi Kumar 
613687ae11fSRavi Kumar 	if (sess->auth.ut.aes_type == CCP_AES_TYPE_128)
614687ae11fSRavi Kumar 		algo =  EVP_aes_128_cbc();
615687ae11fSRavi Kumar 	else if (sess->auth.ut.aes_type == CCP_AES_TYPE_192)
616687ae11fSRavi Kumar 		algo =  EVP_aes_192_cbc();
617687ae11fSRavi Kumar 	else if (sess->auth.ut.aes_type == CCP_AES_TYPE_256)
618687ae11fSRavi Kumar 		algo =  EVP_aes_256_cbc();
619687ae11fSRavi Kumar 	else {
620687ae11fSRavi Kumar 		CCP_LOG_ERR("Invalid CMAC type length");
621687ae11fSRavi Kumar 		return -1;
622687ae11fSRavi Kumar 	}
623687ae11fSRavi Kumar 
624687ae11fSRavi Kumar 	ctx = EVP_CIPHER_CTX_new();
625687ae11fSRavi Kumar 	if (!ctx) {
626687ae11fSRavi Kumar 		CCP_LOG_ERR("ctx creation failed");
627687ae11fSRavi Kumar 		return -1;
628687ae11fSRavi Kumar 	}
629687ae11fSRavi Kumar 	if (EVP_EncryptInit(ctx, algo, (unsigned char *)sess->auth.key,
630687ae11fSRavi Kumar 			    (unsigned char *)zero_iv) <= 0)
631687ae11fSRavi Kumar 		goto key_generate_err;
632687ae11fSRavi Kumar 	if (EVP_CIPHER_CTX_set_padding(ctx, 0) <= 0)
633687ae11fSRavi Kumar 		goto key_generate_err;
634687ae11fSRavi Kumar 	if (EVP_EncryptUpdate(ctx, dst, &dstlen, zero_iv,
635687ae11fSRavi Kumar 			      AES_BLOCK_SIZE) <= 0)
636687ae11fSRavi Kumar 		goto key_generate_err;
637687ae11fSRavi Kumar 	if (EVP_EncryptFinal_ex(ctx, dst + dstlen, &totlen) <= 0)
638687ae11fSRavi Kumar 		goto key_generate_err;
639687ae11fSRavi Kumar 
640687ae11fSRavi Kumar 	memset(sess->auth.pre_compute, 0, CCP_SB_BYTES * 2);
641687ae11fSRavi Kumar 
642687ae11fSRavi Kumar 	ccp_ctx = (unsigned char *)(sess->auth.pre_compute + CCP_SB_BYTES - 1);
643687ae11fSRavi Kumar 	prepare_key(k1, dst, AES_BLOCK_SIZE);
644687ae11fSRavi Kumar 	for (i = 0; i < AES_BLOCK_SIZE;  i++, ccp_ctx--)
645687ae11fSRavi Kumar 		*ccp_ctx = k1[i];
646687ae11fSRavi Kumar 
647687ae11fSRavi Kumar 	ccp_ctx = (unsigned char *)(sess->auth.pre_compute +
648687ae11fSRavi Kumar 				   (2 * CCP_SB_BYTES) - 1);
649687ae11fSRavi Kumar 	prepare_key(k2, k1, AES_BLOCK_SIZE);
650687ae11fSRavi Kumar 	for (i = 0; i < AES_BLOCK_SIZE;  i++, ccp_ctx--)
651687ae11fSRavi Kumar 		*ccp_ctx = k2[i];
652687ae11fSRavi Kumar 
653687ae11fSRavi Kumar 	EVP_CIPHER_CTX_free(ctx);
654687ae11fSRavi Kumar 
655687ae11fSRavi Kumar 	return 0;
656687ae11fSRavi Kumar 
657687ae11fSRavi Kumar key_generate_err:
658687ae11fSRavi Kumar 	CCP_LOG_ERR("CMAC Init failed");
659687ae11fSRavi Kumar 		return -1;
660687ae11fSRavi Kumar }
661687ae11fSRavi Kumar 
66229610e41SRavi Kumar /* configure session */
66329610e41SRavi Kumar static int
ccp_configure_session_cipher(struct ccp_session * sess,const struct rte_crypto_sym_xform * xform)66429610e41SRavi Kumar ccp_configure_session_cipher(struct ccp_session *sess,
66529610e41SRavi Kumar 			     const struct rte_crypto_sym_xform *xform)
66629610e41SRavi Kumar {
66729610e41SRavi Kumar 	const struct rte_crypto_cipher_xform *cipher_xform = NULL;
668c05adb06SRavi Kumar 	size_t i, j, x;
66929610e41SRavi Kumar 
67029610e41SRavi Kumar 	cipher_xform = &xform->cipher;
67129610e41SRavi Kumar 
67229610e41SRavi Kumar 	/* set cipher direction */
67329610e41SRavi Kumar 	if (cipher_xform->op ==  RTE_CRYPTO_CIPHER_OP_ENCRYPT)
67429610e41SRavi Kumar 		sess->cipher.dir = CCP_CIPHER_DIR_ENCRYPT;
67529610e41SRavi Kumar 	else
67629610e41SRavi Kumar 		sess->cipher.dir = CCP_CIPHER_DIR_DECRYPT;
67729610e41SRavi Kumar 
67829610e41SRavi Kumar 	/* set cipher key */
67929610e41SRavi Kumar 	sess->cipher.key_length = cipher_xform->key.length;
68029610e41SRavi Kumar 	rte_memcpy(sess->cipher.key, cipher_xform->key.data,
68129610e41SRavi Kumar 		   cipher_xform->key.length);
68229610e41SRavi Kumar 
68329610e41SRavi Kumar 	/* set iv parameters */
68429610e41SRavi Kumar 	sess->iv.offset = cipher_xform->iv.offset;
68529610e41SRavi Kumar 	sess->iv.length = cipher_xform->iv.length;
68629610e41SRavi Kumar 
68729610e41SRavi Kumar 	switch (cipher_xform->algo) {
688d9a9e561SRavi Kumar 	case RTE_CRYPTO_CIPHER_AES_CTR:
689d9a9e561SRavi Kumar 		sess->cipher.algo = CCP_CIPHER_ALGO_AES_CTR;
690d9a9e561SRavi Kumar 		sess->cipher.um.aes_mode = CCP_AES_MODE_CTR;
691d9a9e561SRavi Kumar 		sess->cipher.engine = CCP_ENGINE_AES;
692d9a9e561SRavi Kumar 		break;
693d9a9e561SRavi Kumar 	case RTE_CRYPTO_CIPHER_AES_ECB:
694d9a9e561SRavi Kumar 		sess->cipher.algo = CCP_CIPHER_ALGO_AES_CBC;
695d9a9e561SRavi Kumar 		sess->cipher.um.aes_mode = CCP_AES_MODE_ECB;
696d9a9e561SRavi Kumar 		sess->cipher.engine = CCP_ENGINE_AES;
697d9a9e561SRavi Kumar 		break;
698d9a9e561SRavi Kumar 	case RTE_CRYPTO_CIPHER_AES_CBC:
699d9a9e561SRavi Kumar 		sess->cipher.algo = CCP_CIPHER_ALGO_AES_CBC;
700d9a9e561SRavi Kumar 		sess->cipher.um.aes_mode = CCP_AES_MODE_CBC;
701d9a9e561SRavi Kumar 		sess->cipher.engine = CCP_ENGINE_AES;
702d9a9e561SRavi Kumar 		break;
703c05adb06SRavi Kumar 	case RTE_CRYPTO_CIPHER_3DES_CBC:
704c05adb06SRavi Kumar 		sess->cipher.algo = CCP_CIPHER_ALGO_3DES_CBC;
705c05adb06SRavi Kumar 		sess->cipher.um.des_mode = CCP_DES_MODE_CBC;
706c05adb06SRavi Kumar 		sess->cipher.engine = CCP_ENGINE_3DES;
707c05adb06SRavi Kumar 		break;
70829610e41SRavi Kumar 	default:
70929610e41SRavi Kumar 		CCP_LOG_ERR("Unsupported cipher algo");
71029610e41SRavi Kumar 		return -1;
71129610e41SRavi Kumar 	}
71229610e41SRavi Kumar 
71329610e41SRavi Kumar 
71429610e41SRavi Kumar 	switch (sess->cipher.engine) {
715d9a9e561SRavi Kumar 	case CCP_ENGINE_AES:
716d9a9e561SRavi Kumar 		if (sess->cipher.key_length == 16)
717d9a9e561SRavi Kumar 			sess->cipher.ut.aes_type = CCP_AES_TYPE_128;
718d9a9e561SRavi Kumar 		else if (sess->cipher.key_length == 24)
719d9a9e561SRavi Kumar 			sess->cipher.ut.aes_type = CCP_AES_TYPE_192;
720d9a9e561SRavi Kumar 		else if (sess->cipher.key_length == 32)
721d9a9e561SRavi Kumar 			sess->cipher.ut.aes_type = CCP_AES_TYPE_256;
722d9a9e561SRavi Kumar 		else {
723d9a9e561SRavi Kumar 			CCP_LOG_ERR("Invalid cipher key length");
724d9a9e561SRavi Kumar 			return -1;
725d9a9e561SRavi Kumar 		}
726d9a9e561SRavi Kumar 		for (i = 0; i < sess->cipher.key_length ; i++)
727d9a9e561SRavi Kumar 			sess->cipher.key_ccp[sess->cipher.key_length - i - 1] =
728d9a9e561SRavi Kumar 				sess->cipher.key[i];
729d9a9e561SRavi Kumar 		break;
730c05adb06SRavi Kumar 	case CCP_ENGINE_3DES:
731c05adb06SRavi Kumar 		if (sess->cipher.key_length == 16)
732c05adb06SRavi Kumar 			sess->cipher.ut.des_type = CCP_DES_TYPE_128;
733c05adb06SRavi Kumar 		else if (sess->cipher.key_length == 24)
734c05adb06SRavi Kumar 			sess->cipher.ut.des_type = CCP_DES_TYPE_192;
735c05adb06SRavi Kumar 		else {
736c05adb06SRavi Kumar 			CCP_LOG_ERR("Invalid cipher key length");
737c05adb06SRavi Kumar 			return -1;
738c05adb06SRavi Kumar 		}
739c05adb06SRavi Kumar 		for (j = 0, x = 0; j < sess->cipher.key_length/8; j++, x += 8)
740c05adb06SRavi Kumar 			for (i = 0; i < 8; i++)
741c05adb06SRavi Kumar 				sess->cipher.key_ccp[(8 + x) - i - 1] =
742c05adb06SRavi Kumar 					sess->cipher.key[i + x];
743c05adb06SRavi Kumar 		break;
74429610e41SRavi Kumar 	default:
74529610e41SRavi Kumar 		CCP_LOG_ERR("Invalid CCP Engine");
74629610e41SRavi Kumar 		return -ENOTSUP;
74729610e41SRavi Kumar 	}
74809a0fd73SAmaranath Somalapuram 	sess->cipher.nonce_phys = rte_mem_virt2iova(sess->cipher.nonce);
74909a0fd73SAmaranath Somalapuram 	sess->cipher.key_phys = rte_mem_virt2iova(sess->cipher.key_ccp);
75029610e41SRavi Kumar 	return 0;
75129610e41SRavi Kumar }
75229610e41SRavi Kumar 
75329610e41SRavi Kumar static int
ccp_configure_session_auth(struct ccp_session * sess,const struct rte_crypto_sym_xform * xform)75429610e41SRavi Kumar ccp_configure_session_auth(struct ccp_session *sess,
75529610e41SRavi Kumar 			   const struct rte_crypto_sym_xform *xform)
75629610e41SRavi Kumar {
75729610e41SRavi Kumar 	const struct rte_crypto_auth_xform *auth_xform = NULL;
758687ae11fSRavi Kumar 	size_t i;
75929610e41SRavi Kumar 
76029610e41SRavi Kumar 	auth_xform = &xform->auth;
76129610e41SRavi Kumar 
76229610e41SRavi Kumar 	sess->auth.digest_length = auth_xform->digest_length;
76329610e41SRavi Kumar 	if (auth_xform->op ==  RTE_CRYPTO_AUTH_OP_GENERATE)
76429610e41SRavi Kumar 		sess->auth.op = CCP_AUTH_OP_GENERATE;
76529610e41SRavi Kumar 	else
76629610e41SRavi Kumar 		sess->auth.op = CCP_AUTH_OP_VERIFY;
76729610e41SRavi Kumar 	switch (auth_xform->algo) {
7686c561b03SRavi Kumar 	case RTE_CRYPTO_AUTH_MD5_HMAC:
769e0d88a39SRavi Kumar 		if (sess->auth_opt) {
7706c561b03SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_MD5_HMAC;
771e0d88a39SRavi Kumar 			sess->auth.offset = ((CCP_SB_BYTES << 1) -
772e0d88a39SRavi Kumar 					     MD5_DIGEST_SIZE);
7736c561b03SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
7746c561b03SRavi Kumar 			sess->auth.block_size = MD5_BLOCK_SIZE;
7756c561b03SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
7766c561b03SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
7776c561b03SRavi Kumar 				   auth_xform->key.length);
778e0d88a39SRavi Kumar 		} else
779e0d88a39SRavi Kumar 			return -1; /* HMAC MD5 not supported on CCP */
7806c561b03SRavi Kumar 		break;
7810c6a81efSRavi Kumar 	case RTE_CRYPTO_AUTH_SHA1:
7820c6a81efSRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
7830c6a81efSRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA1;
7840c6a81efSRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA_TYPE_1;
7850c6a81efSRavi Kumar 		sess->auth.ctx = (void *)ccp_sha1_init;
7860c6a81efSRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES;
7870c6a81efSRavi Kumar 		sess->auth.offset = CCP_SB_BYTES - SHA1_DIGEST_SIZE;
7880c6a81efSRavi Kumar 		break;
7890c6a81efSRavi Kumar 	case RTE_CRYPTO_AUTH_SHA1_HMAC:
790e0d88a39SRavi Kumar 		if (sess->auth_opt) {
7916c561b03SRavi Kumar 			if (auth_xform->key.length > SHA1_BLOCK_SIZE)
7926c561b03SRavi Kumar 				return -1;
7936c561b03SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA1_HMAC;
7946c561b03SRavi Kumar 			sess->auth.offset = CCP_SB_BYTES - SHA1_DIGEST_SIZE;
7956c561b03SRavi Kumar 			sess->auth.block_size = SHA1_BLOCK_SIZE;
7966c561b03SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
7976c561b03SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
7986c561b03SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
7996c561b03SRavi Kumar 				   auth_xform->key.length);
800e0d88a39SRavi Kumar 		} else {
8010c6a81efSRavi Kumar 			if (auth_xform->key.length > SHA1_BLOCK_SIZE)
8020c6a81efSRavi Kumar 				return -1;
8030c6a81efSRavi Kumar 			sess->auth.engine = CCP_ENGINE_SHA;
8040c6a81efSRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA1_HMAC;
8050c6a81efSRavi Kumar 			sess->auth.ut.sha_type = CCP_SHA_TYPE_1;
8060c6a81efSRavi Kumar 			sess->auth.ctx_len = CCP_SB_BYTES;
8070c6a81efSRavi Kumar 			sess->auth.offset = CCP_SB_BYTES - SHA1_DIGEST_SIZE;
8080c6a81efSRavi Kumar 			sess->auth.block_size = SHA1_BLOCK_SIZE;
8090c6a81efSRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
8100c6a81efSRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
811e0d88a39SRavi Kumar 			memset(sess->auth.pre_compute, 0,
812e0d88a39SRavi Kumar 			       sess->auth.ctx_len << 1);
8130c6a81efSRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
8140c6a81efSRavi Kumar 				   auth_xform->key.length);
8150c6a81efSRavi Kumar 			if (generate_partial_hash(sess))
8160c6a81efSRavi Kumar 				return -1;
817e0d88a39SRavi Kumar 		}
8180c6a81efSRavi Kumar 		break;
819ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA224:
820ca40ea24SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA224;
821ca40ea24SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
822ca40ea24SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA_TYPE_224;
823ca40ea24SRavi Kumar 		sess->auth.ctx = (void *)ccp_sha224_init;
824ca40ea24SRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES;
825ca40ea24SRavi Kumar 		sess->auth.offset = CCP_SB_BYTES - SHA224_DIGEST_SIZE;
826ca40ea24SRavi Kumar 		break;
827ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA224_HMAC:
828e0d88a39SRavi Kumar 		if (sess->auth_opt) {
8296c561b03SRavi Kumar 			if (auth_xform->key.length > SHA224_BLOCK_SIZE)
8306c561b03SRavi Kumar 				return -1;
8316c561b03SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA224_HMAC;
8326c561b03SRavi Kumar 			sess->auth.offset = CCP_SB_BYTES - SHA224_DIGEST_SIZE;
8336c561b03SRavi Kumar 			sess->auth.block_size = SHA224_BLOCK_SIZE;
8346c561b03SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
8356c561b03SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
8366c561b03SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
8376c561b03SRavi Kumar 				   auth_xform->key.length);
838e0d88a39SRavi Kumar 		} else {
839ca40ea24SRavi Kumar 			if (auth_xform->key.length > SHA224_BLOCK_SIZE)
840ca40ea24SRavi Kumar 				return -1;
841ca40ea24SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA224_HMAC;
842ca40ea24SRavi Kumar 			sess->auth.engine = CCP_ENGINE_SHA;
843ca40ea24SRavi Kumar 			sess->auth.ut.sha_type = CCP_SHA_TYPE_224;
844ca40ea24SRavi Kumar 			sess->auth.ctx_len = CCP_SB_BYTES;
845ca40ea24SRavi Kumar 			sess->auth.offset = CCP_SB_BYTES - SHA224_DIGEST_SIZE;
846ca40ea24SRavi Kumar 			sess->auth.block_size = SHA224_BLOCK_SIZE;
847ca40ea24SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
848ca40ea24SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
849e0d88a39SRavi Kumar 			memset(sess->auth.pre_compute, 0,
850e0d88a39SRavi Kumar 			       sess->auth.ctx_len << 1);
851ca40ea24SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
852ca40ea24SRavi Kumar 				   auth_xform->key.length);
853ca40ea24SRavi Kumar 			if (generate_partial_hash(sess))
854ca40ea24SRavi Kumar 				return -1;
855e0d88a39SRavi Kumar 		}
856ca40ea24SRavi Kumar 		break;
8571df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_224:
8581df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_224;
8591df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
8601df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_224;
8611df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
8621df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA224_DIGEST_SIZE;
8631df800f8SRavi Kumar 		break;
8641df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_224_HMAC:
8651df800f8SRavi Kumar 		if (auth_xform->key.length > SHA3_224_BLOCK_SIZE)
8661df800f8SRavi Kumar 			return -1;
8671df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_224_HMAC;
8681df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
8691df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_224;
8701df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
8711df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA224_DIGEST_SIZE;
8721df800f8SRavi Kumar 		sess->auth.block_size = SHA3_224_BLOCK_SIZE;
8731df800f8SRavi Kumar 		sess->auth.key_length = auth_xform->key.length;
8741df800f8SRavi Kumar 		memset(sess->auth.key, 0, sess->auth.block_size);
8751df800f8SRavi Kumar 		memset(sess->auth.pre_compute, 0, 2 * sess->auth.ctx_len);
8761df800f8SRavi Kumar 		rte_memcpy(sess->auth.key, auth_xform->key.data,
8771df800f8SRavi Kumar 			   auth_xform->key.length);
8781df800f8SRavi Kumar 		if (generate_partial_hash(sess))
8791df800f8SRavi Kumar 			return -1;
8801df800f8SRavi Kumar 		break;
881ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA256:
882ca40ea24SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA256;
883ca40ea24SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
884ca40ea24SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA_TYPE_256;
885ca40ea24SRavi Kumar 		sess->auth.ctx = (void *)ccp_sha256_init;
886ca40ea24SRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES;
887ca40ea24SRavi Kumar 		sess->auth.offset = CCP_SB_BYTES - SHA256_DIGEST_SIZE;
888ca40ea24SRavi Kumar 		break;
889ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA256_HMAC:
890e0d88a39SRavi Kumar 		if (sess->auth_opt) {
8916c561b03SRavi Kumar 			if (auth_xform->key.length > SHA256_BLOCK_SIZE)
8926c561b03SRavi Kumar 				return -1;
8936c561b03SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA256_HMAC;
8946c561b03SRavi Kumar 			sess->auth.offset = CCP_SB_BYTES - SHA256_DIGEST_SIZE;
8956c561b03SRavi Kumar 			sess->auth.block_size = SHA256_BLOCK_SIZE;
8966c561b03SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
8976c561b03SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
8986c561b03SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
8996c561b03SRavi Kumar 				   auth_xform->key.length);
900e0d88a39SRavi Kumar 		} else {
901ca40ea24SRavi Kumar 			if (auth_xform->key.length > SHA256_BLOCK_SIZE)
902ca40ea24SRavi Kumar 				return -1;
903ca40ea24SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA256_HMAC;
904ca40ea24SRavi Kumar 			sess->auth.engine = CCP_ENGINE_SHA;
905ca40ea24SRavi Kumar 			sess->auth.ut.sha_type = CCP_SHA_TYPE_256;
906ca40ea24SRavi Kumar 			sess->auth.ctx_len = CCP_SB_BYTES;
907ca40ea24SRavi Kumar 			sess->auth.offset = CCP_SB_BYTES - SHA256_DIGEST_SIZE;
908ca40ea24SRavi Kumar 			sess->auth.block_size = SHA256_BLOCK_SIZE;
909ca40ea24SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
910ca40ea24SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
911e0d88a39SRavi Kumar 			memset(sess->auth.pre_compute, 0,
912e0d88a39SRavi Kumar 			       sess->auth.ctx_len << 1);
913ca40ea24SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
914ca40ea24SRavi Kumar 				   auth_xform->key.length);
915ca40ea24SRavi Kumar 			if (generate_partial_hash(sess))
916ca40ea24SRavi Kumar 				return -1;
917e0d88a39SRavi Kumar 		}
918ca40ea24SRavi Kumar 		break;
9191df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_256:
9201df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_256;
9211df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
9221df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_256;
9231df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
9241df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA256_DIGEST_SIZE;
9251df800f8SRavi Kumar 		break;
9261df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_256_HMAC:
9271df800f8SRavi Kumar 		if (auth_xform->key.length > SHA3_256_BLOCK_SIZE)
9281df800f8SRavi Kumar 			return -1;
9291df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_256_HMAC;
9301df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
9311df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_256;
9321df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
9331df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA256_DIGEST_SIZE;
9341df800f8SRavi Kumar 		sess->auth.block_size = SHA3_256_BLOCK_SIZE;
9351df800f8SRavi Kumar 		sess->auth.key_length = auth_xform->key.length;
9361df800f8SRavi Kumar 		memset(sess->auth.key, 0, sess->auth.block_size);
9371df800f8SRavi Kumar 		memset(sess->auth.pre_compute, 0, 2 * sess->auth.ctx_len);
9381df800f8SRavi Kumar 		rte_memcpy(sess->auth.key, auth_xform->key.data,
9391df800f8SRavi Kumar 			   auth_xform->key.length);
9401df800f8SRavi Kumar 		if (generate_partial_hash(sess))
9411df800f8SRavi Kumar 			return -1;
9421df800f8SRavi Kumar 		break;
943ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA384:
944ca40ea24SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA384;
945ca40ea24SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
946ca40ea24SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA_TYPE_384;
947ca40ea24SRavi Kumar 		sess->auth.ctx = (void *)ccp_sha384_init;
948ca40ea24SRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES << 1;
949ca40ea24SRavi Kumar 		sess->auth.offset = (CCP_SB_BYTES << 1) - SHA384_DIGEST_SIZE;
950ca40ea24SRavi Kumar 		break;
951ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA384_HMAC:
952e0d88a39SRavi Kumar 		if (sess->auth_opt) {
9536c561b03SRavi Kumar 			if (auth_xform->key.length > SHA384_BLOCK_SIZE)
9546c561b03SRavi Kumar 				return -1;
9556c561b03SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA384_HMAC;
956e0d88a39SRavi Kumar 			sess->auth.offset = ((CCP_SB_BYTES << 1) -
957e0d88a39SRavi Kumar 					     SHA384_DIGEST_SIZE);
9586c561b03SRavi Kumar 			sess->auth.block_size = SHA384_BLOCK_SIZE;
9596c561b03SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
9606c561b03SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
9616c561b03SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
9626c561b03SRavi Kumar 				   auth_xform->key.length);
963e0d88a39SRavi Kumar 		} else {
964ca40ea24SRavi Kumar 			if (auth_xform->key.length > SHA384_BLOCK_SIZE)
965ca40ea24SRavi Kumar 				return -1;
966ca40ea24SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA384_HMAC;
967ca40ea24SRavi Kumar 			sess->auth.engine = CCP_ENGINE_SHA;
968ca40ea24SRavi Kumar 			sess->auth.ut.sha_type = CCP_SHA_TYPE_384;
969ca40ea24SRavi Kumar 			sess->auth.ctx_len = CCP_SB_BYTES << 1;
970e0d88a39SRavi Kumar 			sess->auth.offset = ((CCP_SB_BYTES << 1) -
971e0d88a39SRavi Kumar 					     SHA384_DIGEST_SIZE);
972ca40ea24SRavi Kumar 			sess->auth.block_size = SHA384_BLOCK_SIZE;
973ca40ea24SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
974ca40ea24SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
975e0d88a39SRavi Kumar 			memset(sess->auth.pre_compute, 0,
976e0d88a39SRavi Kumar 			       sess->auth.ctx_len << 1);
977ca40ea24SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
978ca40ea24SRavi Kumar 				   auth_xform->key.length);
979ca40ea24SRavi Kumar 			if (generate_partial_hash(sess))
980ca40ea24SRavi Kumar 				return -1;
981e0d88a39SRavi Kumar 		}
982ca40ea24SRavi Kumar 		break;
9831df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_384:
9841df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_384;
9851df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
9861df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_384;
9871df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
9881df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA384_DIGEST_SIZE;
9891df800f8SRavi Kumar 		break;
9901df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_384_HMAC:
9911df800f8SRavi Kumar 		if (auth_xform->key.length > SHA3_384_BLOCK_SIZE)
9921df800f8SRavi Kumar 			return -1;
9931df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_384_HMAC;
9941df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
9951df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_384;
9961df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
9971df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA384_DIGEST_SIZE;
9981df800f8SRavi Kumar 		sess->auth.block_size = SHA3_384_BLOCK_SIZE;
9991df800f8SRavi Kumar 		sess->auth.key_length = auth_xform->key.length;
10001df800f8SRavi Kumar 		memset(sess->auth.key, 0, sess->auth.block_size);
10011df800f8SRavi Kumar 		memset(sess->auth.pre_compute, 0, 2 * sess->auth.ctx_len);
10021df800f8SRavi Kumar 		rte_memcpy(sess->auth.key, auth_xform->key.data,
10031df800f8SRavi Kumar 			   auth_xform->key.length);
10041df800f8SRavi Kumar 		if (generate_partial_hash(sess))
10051df800f8SRavi Kumar 			return -1;
10061df800f8SRavi Kumar 		break;
1007ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA512:
1008ca40ea24SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA512;
1009ca40ea24SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
1010ca40ea24SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA_TYPE_512;
1011ca40ea24SRavi Kumar 		sess->auth.ctx = (void *)ccp_sha512_init;
1012ca40ea24SRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES << 1;
1013ca40ea24SRavi Kumar 		sess->auth.offset = (CCP_SB_BYTES << 1) - SHA512_DIGEST_SIZE;
1014ca40ea24SRavi Kumar 		break;
1015ca40ea24SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA512_HMAC:
1016e0d88a39SRavi Kumar 		if (sess->auth_opt) {
10176c561b03SRavi Kumar 			if (auth_xform->key.length > SHA512_BLOCK_SIZE)
10186c561b03SRavi Kumar 				return -1;
10196c561b03SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA512_HMAC;
1020e0d88a39SRavi Kumar 			sess->auth.offset = ((CCP_SB_BYTES << 1) -
1021e0d88a39SRavi Kumar 					     SHA512_DIGEST_SIZE);
10226c561b03SRavi Kumar 			sess->auth.block_size = SHA512_BLOCK_SIZE;
10236c561b03SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
10246c561b03SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
10256c561b03SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
10266c561b03SRavi Kumar 				   auth_xform->key.length);
1027e0d88a39SRavi Kumar 		} else {
1028ca40ea24SRavi Kumar 			if (auth_xform->key.length > SHA512_BLOCK_SIZE)
1029ca40ea24SRavi Kumar 				return -1;
1030ca40ea24SRavi Kumar 			sess->auth.algo = CCP_AUTH_ALGO_SHA512_HMAC;
1031ca40ea24SRavi Kumar 			sess->auth.engine = CCP_ENGINE_SHA;
1032ca40ea24SRavi Kumar 			sess->auth.ut.sha_type = CCP_SHA_TYPE_512;
1033ca40ea24SRavi Kumar 			sess->auth.ctx_len = CCP_SB_BYTES << 1;
1034e0d88a39SRavi Kumar 			sess->auth.offset = ((CCP_SB_BYTES << 1) -
1035e0d88a39SRavi Kumar 					     SHA512_DIGEST_SIZE);
1036ca40ea24SRavi Kumar 			sess->auth.block_size = SHA512_BLOCK_SIZE;
1037ca40ea24SRavi Kumar 			sess->auth.key_length = auth_xform->key.length;
1038ca40ea24SRavi Kumar 			memset(sess->auth.key, 0, sess->auth.block_size);
1039e0d88a39SRavi Kumar 			memset(sess->auth.pre_compute, 0,
1040e0d88a39SRavi Kumar 			       sess->auth.ctx_len << 1);
1041ca40ea24SRavi Kumar 			rte_memcpy(sess->auth.key, auth_xform->key.data,
1042ca40ea24SRavi Kumar 				   auth_xform->key.length);
1043ca40ea24SRavi Kumar 			if (generate_partial_hash(sess))
1044ca40ea24SRavi Kumar 				return -1;
1045e0d88a39SRavi Kumar 		}
1046ca40ea24SRavi Kumar 		break;
10471df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_512:
10481df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_512;
10491df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
10501df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_512;
10511df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
10521df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA512_DIGEST_SIZE;
10531df800f8SRavi Kumar 		break;
10541df800f8SRavi Kumar 	case RTE_CRYPTO_AUTH_SHA3_512_HMAC:
10551df800f8SRavi Kumar 		if (auth_xform->key.length > SHA3_512_BLOCK_SIZE)
10561df800f8SRavi Kumar 			return -1;
10571df800f8SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_SHA3_512_HMAC;
10581df800f8SRavi Kumar 		sess->auth.engine = CCP_ENGINE_SHA;
10591df800f8SRavi Kumar 		sess->auth.ut.sha_type = CCP_SHA3_TYPE_512;
10601df800f8SRavi Kumar 		sess->auth.ctx_len = CCP_SHA3_CTX_SIZE;
10611df800f8SRavi Kumar 		sess->auth.offset = CCP_SHA3_CTX_SIZE - SHA512_DIGEST_SIZE;
10621df800f8SRavi Kumar 		sess->auth.block_size = SHA3_512_BLOCK_SIZE;
10631df800f8SRavi Kumar 		sess->auth.key_length = auth_xform->key.length;
10641df800f8SRavi Kumar 		memset(sess->auth.key, 0, sess->auth.block_size);
10651df800f8SRavi Kumar 		memset(sess->auth.pre_compute, 0, 2 * sess->auth.ctx_len);
10661df800f8SRavi Kumar 		rte_memcpy(sess->auth.key, auth_xform->key.data,
10671df800f8SRavi Kumar 			   auth_xform->key.length);
10681df800f8SRavi Kumar 		if (generate_partial_hash(sess))
10691df800f8SRavi Kumar 			return -1;
10701df800f8SRavi Kumar 		break;
1071687ae11fSRavi Kumar 	case RTE_CRYPTO_AUTH_AES_CMAC:
1072687ae11fSRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_AES_CMAC;
1073687ae11fSRavi Kumar 		sess->auth.engine = CCP_ENGINE_AES;
1074687ae11fSRavi Kumar 		sess->auth.um.aes_mode = CCP_AES_MODE_CMAC;
1075687ae11fSRavi Kumar 		sess->auth.key_length = auth_xform->key.length;
10766c561b03SRavi Kumar 		/* padding and hash result */
1077687ae11fSRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES << 1;
1078687ae11fSRavi Kumar 		sess->auth.offset = AES_BLOCK_SIZE;
1079687ae11fSRavi Kumar 		sess->auth.block_size = AES_BLOCK_SIZE;
1080687ae11fSRavi Kumar 		if (sess->auth.key_length == 16)
1081687ae11fSRavi Kumar 			sess->auth.ut.aes_type = CCP_AES_TYPE_128;
1082687ae11fSRavi Kumar 		else if (sess->auth.key_length == 24)
1083687ae11fSRavi Kumar 			sess->auth.ut.aes_type = CCP_AES_TYPE_192;
1084687ae11fSRavi Kumar 		else if (sess->auth.key_length == 32)
1085687ae11fSRavi Kumar 			sess->auth.ut.aes_type = CCP_AES_TYPE_256;
1086687ae11fSRavi Kumar 		else {
1087687ae11fSRavi Kumar 			CCP_LOG_ERR("Invalid CMAC key length");
1088687ae11fSRavi Kumar 			return -1;
1089687ae11fSRavi Kumar 		}
1090687ae11fSRavi Kumar 		rte_memcpy(sess->auth.key, auth_xform->key.data,
1091687ae11fSRavi Kumar 			   sess->auth.key_length);
1092687ae11fSRavi Kumar 		for (i = 0; i < sess->auth.key_length; i++)
1093687ae11fSRavi Kumar 			sess->auth.key_ccp[sess->auth.key_length - i - 1] =
1094687ae11fSRavi Kumar 				sess->auth.key[i];
1095687ae11fSRavi Kumar 		if (generate_cmac_subkeys(sess))
1096687ae11fSRavi Kumar 			return -1;
1097687ae11fSRavi Kumar 		break;
109829610e41SRavi Kumar 	default:
109929610e41SRavi Kumar 		CCP_LOG_ERR("Unsupported hash algo");
110029610e41SRavi Kumar 		return -ENOTSUP;
110129610e41SRavi Kumar 	}
110229610e41SRavi Kumar 	return 0;
110329610e41SRavi Kumar }
110429610e41SRavi Kumar 
110529610e41SRavi Kumar static int
ccp_configure_session_aead(struct ccp_session * sess,const struct rte_crypto_sym_xform * xform)110629610e41SRavi Kumar ccp_configure_session_aead(struct ccp_session *sess,
110729610e41SRavi Kumar 			   const struct rte_crypto_sym_xform *xform)
110829610e41SRavi Kumar {
110929610e41SRavi Kumar 	const struct rte_crypto_aead_xform *aead_xform = NULL;
1110afc53459SRavi Kumar 	size_t i;
111129610e41SRavi Kumar 
111229610e41SRavi Kumar 	aead_xform = &xform->aead;
111329610e41SRavi Kumar 
111429610e41SRavi Kumar 	sess->cipher.key_length = aead_xform->key.length;
111529610e41SRavi Kumar 	rte_memcpy(sess->cipher.key, aead_xform->key.data,
111629610e41SRavi Kumar 		   aead_xform->key.length);
111729610e41SRavi Kumar 
111829610e41SRavi Kumar 	if (aead_xform->op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
111929610e41SRavi Kumar 		sess->cipher.dir = CCP_CIPHER_DIR_ENCRYPT;
112029610e41SRavi Kumar 		sess->auth.op = CCP_AUTH_OP_GENERATE;
112129610e41SRavi Kumar 	} else {
112229610e41SRavi Kumar 		sess->cipher.dir = CCP_CIPHER_DIR_DECRYPT;
112329610e41SRavi Kumar 		sess->auth.op = CCP_AUTH_OP_VERIFY;
112429610e41SRavi Kumar 	}
1125afc53459SRavi Kumar 	sess->aead_algo = aead_xform->algo;
112629610e41SRavi Kumar 	sess->auth.aad_length = aead_xform->aad_length;
112729610e41SRavi Kumar 	sess->auth.digest_length = aead_xform->digest_length;
112829610e41SRavi Kumar 
112929610e41SRavi Kumar 	/* set iv parameters */
113029610e41SRavi Kumar 	sess->iv.offset = aead_xform->iv.offset;
113129610e41SRavi Kumar 	sess->iv.length = aead_xform->iv.length;
113229610e41SRavi Kumar 
113329610e41SRavi Kumar 	switch (aead_xform->algo) {
1134afc53459SRavi Kumar 	case RTE_CRYPTO_AEAD_AES_GCM:
1135afc53459SRavi Kumar 		sess->cipher.algo = CCP_CIPHER_ALGO_AES_GCM;
1136afc53459SRavi Kumar 		sess->cipher.um.aes_mode = CCP_AES_MODE_GCTR;
1137afc53459SRavi Kumar 		sess->cipher.engine = CCP_ENGINE_AES;
1138afc53459SRavi Kumar 		if (sess->cipher.key_length == 16)
1139afc53459SRavi Kumar 			sess->cipher.ut.aes_type = CCP_AES_TYPE_128;
1140afc53459SRavi Kumar 		else if (sess->cipher.key_length == 24)
1141afc53459SRavi Kumar 			sess->cipher.ut.aes_type = CCP_AES_TYPE_192;
1142afc53459SRavi Kumar 		else if (sess->cipher.key_length == 32)
1143afc53459SRavi Kumar 			sess->cipher.ut.aes_type = CCP_AES_TYPE_256;
1144afc53459SRavi Kumar 		else {
1145afc53459SRavi Kumar 			CCP_LOG_ERR("Invalid aead key length");
1146afc53459SRavi Kumar 			return -1;
1147afc53459SRavi Kumar 		}
1148afc53459SRavi Kumar 		for (i = 0; i < sess->cipher.key_length; i++)
1149afc53459SRavi Kumar 			sess->cipher.key_ccp[sess->cipher.key_length - i - 1] =
1150afc53459SRavi Kumar 				sess->cipher.key[i];
1151afc53459SRavi Kumar 		sess->auth.algo = CCP_AUTH_ALGO_AES_GCM;
1152afc53459SRavi Kumar 		sess->auth.engine = CCP_ENGINE_AES;
1153afc53459SRavi Kumar 		sess->auth.um.aes_mode = CCP_AES_MODE_GHASH;
1154afc53459SRavi Kumar 		sess->auth.ctx_len = CCP_SB_BYTES;
1155afc53459SRavi Kumar 		sess->auth.offset = 0;
1156afc53459SRavi Kumar 		sess->auth.block_size = AES_BLOCK_SIZE;
1157afc53459SRavi Kumar 		sess->cmd_id = CCP_CMD_COMBINED;
1158afc53459SRavi Kumar 		break;
115929610e41SRavi Kumar 	default:
116029610e41SRavi Kumar 		CCP_LOG_ERR("Unsupported aead algo");
116129610e41SRavi Kumar 		return -ENOTSUP;
116229610e41SRavi Kumar 	}
116309a0fd73SAmaranath Somalapuram 	sess->cipher.nonce_phys = rte_mem_virt2iova(sess->cipher.nonce);
116409a0fd73SAmaranath Somalapuram 	sess->cipher.key_phys = rte_mem_virt2iova(sess->cipher.key_ccp);
116529610e41SRavi Kumar 	return 0;
116629610e41SRavi Kumar }
116729610e41SRavi Kumar 
116829610e41SRavi Kumar int
ccp_set_session_parameters(struct ccp_session * sess,const struct rte_crypto_sym_xform * xform,struct ccp_private * internals)116929610e41SRavi Kumar ccp_set_session_parameters(struct ccp_session *sess,
1170e0d88a39SRavi Kumar 			   const struct rte_crypto_sym_xform *xform,
1171e0d88a39SRavi Kumar 			   struct ccp_private *internals)
117229610e41SRavi Kumar {
117329610e41SRavi Kumar 	const struct rte_crypto_sym_xform *cipher_xform = NULL;
117429610e41SRavi Kumar 	const struct rte_crypto_sym_xform *auth_xform = NULL;
117529610e41SRavi Kumar 	const struct rte_crypto_sym_xform *aead_xform = NULL;
117629610e41SRavi Kumar 	int ret = 0;
117729610e41SRavi Kumar 
1178e0d88a39SRavi Kumar 	sess->auth_opt = internals->auth_opt;
117929610e41SRavi Kumar 	sess->cmd_id = ccp_get_cmd_id(xform);
118029610e41SRavi Kumar 
118129610e41SRavi Kumar 	switch (sess->cmd_id) {
118229610e41SRavi Kumar 	case CCP_CMD_CIPHER:
118329610e41SRavi Kumar 		cipher_xform = xform;
118429610e41SRavi Kumar 		break;
118529610e41SRavi Kumar 	case CCP_CMD_AUTH:
118629610e41SRavi Kumar 		auth_xform = xform;
118729610e41SRavi Kumar 		break;
118829610e41SRavi Kumar 	case CCP_CMD_CIPHER_HASH:
118929610e41SRavi Kumar 		cipher_xform = xform;
119029610e41SRavi Kumar 		auth_xform = xform->next;
119129610e41SRavi Kumar 		break;
119229610e41SRavi Kumar 	case CCP_CMD_HASH_CIPHER:
119329610e41SRavi Kumar 		auth_xform = xform;
119429610e41SRavi Kumar 		cipher_xform = xform->next;
119529610e41SRavi Kumar 		break;
119629610e41SRavi Kumar 	case CCP_CMD_COMBINED:
119729610e41SRavi Kumar 		aead_xform = xform;
119829610e41SRavi Kumar 		break;
119929610e41SRavi Kumar 	default:
120029610e41SRavi Kumar 		CCP_LOG_ERR("Unsupported cmd_id");
120129610e41SRavi Kumar 		return -1;
120229610e41SRavi Kumar 	}
120329610e41SRavi Kumar 
120429610e41SRavi Kumar 	/* Default IV length = 0 */
120529610e41SRavi Kumar 	sess->iv.length = 0;
120629610e41SRavi Kumar 	if (cipher_xform) {
120729610e41SRavi Kumar 		ret = ccp_configure_session_cipher(sess, cipher_xform);
120829610e41SRavi Kumar 		if (ret != 0) {
120929610e41SRavi Kumar 			CCP_LOG_ERR("Invalid/unsupported cipher parameters");
121029610e41SRavi Kumar 			return ret;
121129610e41SRavi Kumar 		}
121229610e41SRavi Kumar 	}
121329610e41SRavi Kumar 	if (auth_xform) {
121429610e41SRavi Kumar 		ret = ccp_configure_session_auth(sess, auth_xform);
121529610e41SRavi Kumar 		if (ret != 0) {
121629610e41SRavi Kumar 			CCP_LOG_ERR("Invalid/unsupported auth parameters");
121729610e41SRavi Kumar 			return ret;
121829610e41SRavi Kumar 		}
121929610e41SRavi Kumar 	}
122029610e41SRavi Kumar 	if (aead_xform) {
122129610e41SRavi Kumar 		ret = ccp_configure_session_aead(sess, aead_xform);
122229610e41SRavi Kumar 		if (ret != 0) {
122329610e41SRavi Kumar 			CCP_LOG_ERR("Invalid/unsupported aead parameters");
122429610e41SRavi Kumar 			return ret;
122529610e41SRavi Kumar 		}
122629610e41SRavi Kumar 	}
122729610e41SRavi Kumar 	return ret;
122829610e41SRavi Kumar }
122970f0f8a8SRavi Kumar 
123070f0f8a8SRavi Kumar /* calculate CCP descriptors requirement */
123170f0f8a8SRavi Kumar static inline int
ccp_cipher_slot(struct ccp_session * session)123270f0f8a8SRavi Kumar ccp_cipher_slot(struct ccp_session *session)
123370f0f8a8SRavi Kumar {
123470f0f8a8SRavi Kumar 	int count = 0;
123570f0f8a8SRavi Kumar 
123670f0f8a8SRavi Kumar 	switch (session->cipher.algo) {
1237d9a9e561SRavi Kumar 	case CCP_CIPHER_ALGO_AES_CBC:
1238d9a9e561SRavi Kumar 		count = 2;
1239d9a9e561SRavi Kumar 		/**< op + passthrough for iv */
1240d9a9e561SRavi Kumar 		break;
1241d9a9e561SRavi Kumar 	case CCP_CIPHER_ALGO_AES_ECB:
1242d9a9e561SRavi Kumar 		count = 1;
1243d9a9e561SRavi Kumar 		/**<only op*/
1244d9a9e561SRavi Kumar 		break;
1245d9a9e561SRavi Kumar 	case CCP_CIPHER_ALGO_AES_CTR:
1246d9a9e561SRavi Kumar 		count = 2;
1247d9a9e561SRavi Kumar 		/**< op + passthrough for iv */
1248d9a9e561SRavi Kumar 		break;
1249c05adb06SRavi Kumar 	case CCP_CIPHER_ALGO_3DES_CBC:
1250c05adb06SRavi Kumar 		count = 2;
1251c05adb06SRavi Kumar 		/**< op + passthrough for iv */
1252c05adb06SRavi Kumar 		break;
125370f0f8a8SRavi Kumar 	default:
125470f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported cipher algo %d",
125570f0f8a8SRavi Kumar 			    session->cipher.algo);
125670f0f8a8SRavi Kumar 	}
125770f0f8a8SRavi Kumar 	return count;
125870f0f8a8SRavi Kumar }
125970f0f8a8SRavi Kumar 
126070f0f8a8SRavi Kumar static inline int
ccp_auth_slot(struct ccp_session * session)126170f0f8a8SRavi Kumar ccp_auth_slot(struct ccp_session *session)
126270f0f8a8SRavi Kumar {
126370f0f8a8SRavi Kumar 	int count = 0;
126470f0f8a8SRavi Kumar 
126570f0f8a8SRavi Kumar 	switch (session->auth.algo) {
12660c6a81efSRavi Kumar 	case CCP_AUTH_ALGO_SHA1:
1267ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA224:
1268ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA256:
1269ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA384:
1270ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA512:
12710c6a81efSRavi Kumar 		count = 3;
12720c6a81efSRavi Kumar 		/**< op + lsb passthrough cpy to/from*/
12730c6a81efSRavi Kumar 		break;
12746c561b03SRavi Kumar 	case CCP_AUTH_ALGO_MD5_HMAC:
12756c561b03SRavi Kumar 		break;
12760c6a81efSRavi Kumar 	case CCP_AUTH_ALGO_SHA1_HMAC:
1277ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA224_HMAC:
1278ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA256_HMAC:
1279e0d88a39SRavi Kumar 		if (session->auth_opt == 0)
12800c6a81efSRavi Kumar 			count = 6;
12810c6a81efSRavi Kumar 		break;
1282ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA384_HMAC:
1283ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA512_HMAC:
1284ca40ea24SRavi Kumar 		/**
1285ca40ea24SRavi Kumar 		 * 1. Load PHash1 = H(k ^ ipad); to LSB
12867be78d02SJosh Soref 		 * 2. generate IHash = H(hash on message with PHash1
1287ca40ea24SRavi Kumar 		 * as init values);
1288ca40ea24SRavi Kumar 		 * 3. Retrieve IHash 2 slots for 384/512
1289ca40ea24SRavi Kumar 		 * 4. Load Phash2 = H(k ^ opad); to LSB
1290ca40ea24SRavi Kumar 		 * 5. generate FHash = H(hash on Ihash with Phash2
1291ca40ea24SRavi Kumar 		 * as init value);
1292ca40ea24SRavi Kumar 		 * 6. Retrieve HMAC output from LSB to host memory
1293ca40ea24SRavi Kumar 		 */
1294e0d88a39SRavi Kumar 		if (session->auth_opt == 0)
1295e0d88a39SRavi Kumar 			count = 7;
1296ca40ea24SRavi Kumar 		break;
12971df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_224:
12981df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_256:
12991df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_384:
13001df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_512:
13011df800f8SRavi Kumar 		count = 1;
13021df800f8SRavi Kumar 		/**< only op ctx and dst in host memory*/
13031df800f8SRavi Kumar 		break;
13041df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_224_HMAC:
13051df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_256_HMAC:
13061df800f8SRavi Kumar 		count = 3;
13071df800f8SRavi Kumar 		break;
13081df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_384_HMAC:
13091df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_512_HMAC:
13101df800f8SRavi Kumar 		count = 4;
13111df800f8SRavi Kumar 		/**
13121df800f8SRavi Kumar 		 * 1. Op to Perform Ihash
13131df800f8SRavi Kumar 		 * 2. Retrieve result from LSB to host memory
13141df800f8SRavi Kumar 		 * 3. Perform final hash
13151df800f8SRavi Kumar 		 */
13161df800f8SRavi Kumar 		break;
1317687ae11fSRavi Kumar 	case CCP_AUTH_ALGO_AES_CMAC:
1318687ae11fSRavi Kumar 		count = 4;
1319687ae11fSRavi Kumar 		/**
1320687ae11fSRavi Kumar 		 * op
1321687ae11fSRavi Kumar 		 * extra descriptor in padding case
1322687ae11fSRavi Kumar 		 * (k1/k2(255:128) with iv(127:0))
1323687ae11fSRavi Kumar 		 * Retrieve result
1324687ae11fSRavi Kumar 		 */
1325687ae11fSRavi Kumar 		break;
132670f0f8a8SRavi Kumar 	default:
132770f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported auth algo %d",
132870f0f8a8SRavi Kumar 			    session->auth.algo);
132970f0f8a8SRavi Kumar 	}
133070f0f8a8SRavi Kumar 
133170f0f8a8SRavi Kumar 	return count;
133270f0f8a8SRavi Kumar }
133370f0f8a8SRavi Kumar 
133470f0f8a8SRavi Kumar static int
ccp_aead_slot(struct ccp_session * session)133570f0f8a8SRavi Kumar ccp_aead_slot(struct ccp_session *session)
133670f0f8a8SRavi Kumar {
133770f0f8a8SRavi Kumar 	int count = 0;
133870f0f8a8SRavi Kumar 
133970f0f8a8SRavi Kumar 	switch (session->aead_algo) {
1340afc53459SRavi Kumar 	case RTE_CRYPTO_AEAD_AES_GCM:
1341afc53459SRavi Kumar 		break;
134270f0f8a8SRavi Kumar 	default:
134370f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported aead algo %d",
134470f0f8a8SRavi Kumar 			    session->aead_algo);
134570f0f8a8SRavi Kumar 	}
1346afc53459SRavi Kumar 	switch (session->auth.algo) {
1347afc53459SRavi Kumar 	case CCP_AUTH_ALGO_AES_GCM:
1348afc53459SRavi Kumar 		count = 5;
1349afc53459SRavi Kumar 		/**
1350afc53459SRavi Kumar 		 * 1. Passthru iv
1351afc53459SRavi Kumar 		 * 2. Hash AAD
1352afc53459SRavi Kumar 		 * 3. GCTR
1353afc53459SRavi Kumar 		 * 4. Reload passthru
1354afc53459SRavi Kumar 		 * 5. Hash Final tag
1355afc53459SRavi Kumar 		 */
1356afc53459SRavi Kumar 		break;
1357afc53459SRavi Kumar 	default:
1358afc53459SRavi Kumar 		CCP_LOG_ERR("Unsupported combined auth ALGO %d",
1359afc53459SRavi Kumar 			    session->auth.algo);
1360afc53459SRavi Kumar 	}
136170f0f8a8SRavi Kumar 	return count;
136270f0f8a8SRavi Kumar }
136370f0f8a8SRavi Kumar 
136470f0f8a8SRavi Kumar int
ccp_compute_slot_count(struct ccp_session * session)136570f0f8a8SRavi Kumar ccp_compute_slot_count(struct ccp_session *session)
136670f0f8a8SRavi Kumar {
136770f0f8a8SRavi Kumar 	int count = 0;
136870f0f8a8SRavi Kumar 
136970f0f8a8SRavi Kumar 	switch (session->cmd_id) {
137070f0f8a8SRavi Kumar 	case CCP_CMD_CIPHER:
137170f0f8a8SRavi Kumar 		count = ccp_cipher_slot(session);
137270f0f8a8SRavi Kumar 		break;
137370f0f8a8SRavi Kumar 	case CCP_CMD_AUTH:
137470f0f8a8SRavi Kumar 		count = ccp_auth_slot(session);
137570f0f8a8SRavi Kumar 		break;
137670f0f8a8SRavi Kumar 	case CCP_CMD_CIPHER_HASH:
137770f0f8a8SRavi Kumar 	case CCP_CMD_HASH_CIPHER:
137870f0f8a8SRavi Kumar 		count = ccp_cipher_slot(session);
137970f0f8a8SRavi Kumar 		count += ccp_auth_slot(session);
138070f0f8a8SRavi Kumar 		break;
138170f0f8a8SRavi Kumar 	case CCP_CMD_COMBINED:
138270f0f8a8SRavi Kumar 		count = ccp_aead_slot(session);
138370f0f8a8SRavi Kumar 		break;
138470f0f8a8SRavi Kumar 	default:
138570f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported cmd_id");
138670f0f8a8SRavi Kumar 
138770f0f8a8SRavi Kumar 	}
138870f0f8a8SRavi Kumar 
138970f0f8a8SRavi Kumar 	return count;
139070f0f8a8SRavi Kumar }
139170f0f8a8SRavi Kumar 
13926c561b03SRavi Kumar static uint8_t
algo_select(int sessalgo,const EVP_MD ** algo)13936c561b03SRavi Kumar algo_select(int sessalgo,
13946c561b03SRavi Kumar 	    const EVP_MD **algo)
13956c561b03SRavi Kumar {
13966c561b03SRavi Kumar 	int res = 0;
13976c561b03SRavi Kumar 
13986c561b03SRavi Kumar 	switch (sessalgo) {
13996c561b03SRavi Kumar 	case CCP_AUTH_ALGO_MD5_HMAC:
14006c561b03SRavi Kumar 		*algo = EVP_md5();
14016c561b03SRavi Kumar 		break;
14026c561b03SRavi Kumar 	case CCP_AUTH_ALGO_SHA1_HMAC:
14036c561b03SRavi Kumar 		*algo = EVP_sha1();
14046c561b03SRavi Kumar 		break;
14056c561b03SRavi Kumar 	case CCP_AUTH_ALGO_SHA224_HMAC:
14066c561b03SRavi Kumar 		*algo = EVP_sha224();
14076c561b03SRavi Kumar 		break;
14086c561b03SRavi Kumar 	case CCP_AUTH_ALGO_SHA256_HMAC:
14096c561b03SRavi Kumar 		*algo = EVP_sha256();
14106c561b03SRavi Kumar 		break;
14116c561b03SRavi Kumar 	case CCP_AUTH_ALGO_SHA384_HMAC:
14126c561b03SRavi Kumar 		*algo = EVP_sha384();
14136c561b03SRavi Kumar 		break;
14146c561b03SRavi Kumar 	case CCP_AUTH_ALGO_SHA512_HMAC:
14156c561b03SRavi Kumar 		*algo = EVP_sha512();
14166c561b03SRavi Kumar 		break;
14176c561b03SRavi Kumar 	default:
14186c561b03SRavi Kumar 		res = -EINVAL;
14196c561b03SRavi Kumar 		break;
14206c561b03SRavi Kumar 	}
14216c561b03SRavi Kumar 	return res;
14226c561b03SRavi Kumar }
14236c561b03SRavi Kumar 
14246c561b03SRavi Kumar static int
process_cpu_auth_hmac(uint8_t * src,uint8_t * dst,__rte_unused uint8_t * iv,EVP_PKEY * pkey,int srclen,EVP_MD_CTX * ctx,const EVP_MD * algo,uint16_t d_len)14256c561b03SRavi Kumar process_cpu_auth_hmac(uint8_t *src, uint8_t *dst,
14266c561b03SRavi Kumar 		      __rte_unused uint8_t *iv,
14276c561b03SRavi Kumar 		      EVP_PKEY *pkey,
14286c561b03SRavi Kumar 		      int srclen,
14296c561b03SRavi Kumar 		      EVP_MD_CTX *ctx,
14306c561b03SRavi Kumar 		      const EVP_MD *algo,
14316c561b03SRavi Kumar 		      uint16_t d_len)
14326c561b03SRavi Kumar {
14336c561b03SRavi Kumar 	size_t dstlen;
14346c561b03SRavi Kumar 	unsigned char temp_dst[64];
14356c561b03SRavi Kumar 
14366c561b03SRavi Kumar 	if (EVP_DigestSignInit(ctx, NULL, algo, NULL, pkey) <= 0)
14376c561b03SRavi Kumar 		goto process_auth_err;
14386c561b03SRavi Kumar 
14396c561b03SRavi Kumar 	if (EVP_DigestSignUpdate(ctx, (char *)src, srclen) <= 0)
14406c561b03SRavi Kumar 		goto process_auth_err;
14416c561b03SRavi Kumar 
14426c561b03SRavi Kumar 	if (EVP_DigestSignFinal(ctx, temp_dst, &dstlen) <= 0)
14436c561b03SRavi Kumar 		goto process_auth_err;
14446c561b03SRavi Kumar 
14456c561b03SRavi Kumar 	memcpy(dst, temp_dst, d_len);
14466c561b03SRavi Kumar 	return 0;
14476c561b03SRavi Kumar process_auth_err:
14486c561b03SRavi Kumar 	CCP_LOG_ERR("Process cpu auth failed");
14496c561b03SRavi Kumar 	return -EINVAL;
14506c561b03SRavi Kumar }
14516c561b03SRavi Kumar 
cpu_crypto_auth(struct ccp_qp * qp,struct rte_crypto_op * op,struct ccp_session * sess,EVP_MD_CTX * ctx)14526c561b03SRavi Kumar static int cpu_crypto_auth(struct ccp_qp *qp,
14536c561b03SRavi Kumar 			   struct rte_crypto_op *op,
14546c561b03SRavi Kumar 			   struct ccp_session *sess,
14556c561b03SRavi Kumar 			   EVP_MD_CTX *ctx)
14566c561b03SRavi Kumar {
14576c561b03SRavi Kumar 	uint8_t *src, *dst;
14586c561b03SRavi Kumar 	int srclen, status;
14596c561b03SRavi Kumar 	struct rte_mbuf *mbuf_src, *mbuf_dst;
14606c561b03SRavi Kumar 	const EVP_MD *algo = NULL;
14616c561b03SRavi Kumar 	EVP_PKEY *pkey;
14626c561b03SRavi Kumar 
14636c561b03SRavi Kumar 	algo_select(sess->auth.algo, &algo);
14646c561b03SRavi Kumar 	pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sess->auth.key,
14656c561b03SRavi Kumar 				    sess->auth.key_length);
14666c561b03SRavi Kumar 	mbuf_src = op->sym->m_src;
14676c561b03SRavi Kumar 	mbuf_dst = op->sym->m_dst ? op->sym->m_dst : op->sym->m_src;
14686c561b03SRavi Kumar 	srclen = op->sym->auth.data.length;
14696c561b03SRavi Kumar 	src = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *,
14706c561b03SRavi Kumar 				      op->sym->auth.data.offset);
14716c561b03SRavi Kumar 
14726c561b03SRavi Kumar 	if (sess->auth.op == CCP_AUTH_OP_VERIFY) {
14736c561b03SRavi Kumar 		dst = qp->temp_digest;
14746c561b03SRavi Kumar 	} else {
14756c561b03SRavi Kumar 		dst = op->sym->auth.digest.data;
14766c561b03SRavi Kumar 		if (dst == NULL) {
14776c561b03SRavi Kumar 			dst = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *,
14786c561b03SRavi Kumar 						     op->sym->auth.data.offset +
14796c561b03SRavi Kumar 						     sess->auth.digest_length);
14806c561b03SRavi Kumar 		}
14816c561b03SRavi Kumar 	}
14826c561b03SRavi Kumar 	status = process_cpu_auth_hmac(src, dst, NULL,
14836c561b03SRavi Kumar 				       pkey, srclen,
14846c561b03SRavi Kumar 				       ctx,
14856c561b03SRavi Kumar 				       algo,
14866c561b03SRavi Kumar 				       sess->auth.digest_length);
14876c561b03SRavi Kumar 	if (status) {
14886c561b03SRavi Kumar 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
14896c561b03SRavi Kumar 		return status;
14906c561b03SRavi Kumar 	}
14916c561b03SRavi Kumar 
14926c561b03SRavi Kumar 	if (sess->auth.op == CCP_AUTH_OP_VERIFY) {
14936c561b03SRavi Kumar 		if (memcmp(dst, op->sym->auth.digest.data,
14946c561b03SRavi Kumar 			   sess->auth.digest_length) != 0) {
14956c561b03SRavi Kumar 			op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
14966c561b03SRavi Kumar 		} else {
14976c561b03SRavi Kumar 			op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
14986c561b03SRavi Kumar 		}
14996c561b03SRavi Kumar 	} else {
15006c561b03SRavi Kumar 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
15016c561b03SRavi Kumar 	}
15026c561b03SRavi Kumar 	EVP_PKEY_free(pkey);
15036c561b03SRavi Kumar 	return 0;
15046c561b03SRavi Kumar }
15056c561b03SRavi Kumar 
1506d9a9e561SRavi Kumar static void
ccp_perform_passthru(struct ccp_passthru * pst,struct ccp_queue * cmd_q)1507d9a9e561SRavi Kumar ccp_perform_passthru(struct ccp_passthru *pst,
1508d9a9e561SRavi Kumar 		     struct ccp_queue *cmd_q)
1509d9a9e561SRavi Kumar {
1510d9a9e561SRavi Kumar 	struct ccp_desc *desc;
1511d9a9e561SRavi Kumar 	union ccp_function function;
1512d9a9e561SRavi Kumar 
1513d9a9e561SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
1514d9a9e561SRavi Kumar 
1515d9a9e561SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_PASSTHRU;
1516d9a9e561SRavi Kumar 
1517d9a9e561SRavi Kumar 	CCP_CMD_SOC(desc) = 0;
1518d9a9e561SRavi Kumar 	CCP_CMD_IOC(desc) = 0;
1519d9a9e561SRavi Kumar 	CCP_CMD_INIT(desc) = 0;
1520d9a9e561SRavi Kumar 	CCP_CMD_EOM(desc) = 0;
1521d9a9e561SRavi Kumar 	CCP_CMD_PROT(desc) = 0;
1522d9a9e561SRavi Kumar 
1523d9a9e561SRavi Kumar 	function.raw = 0;
1524d9a9e561SRavi Kumar 	CCP_PT_BYTESWAP(&function) = pst->byte_swap;
1525d9a9e561SRavi Kumar 	CCP_PT_BITWISE(&function) = pst->bit_mod;
1526d9a9e561SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
1527d9a9e561SRavi Kumar 
1528d9a9e561SRavi Kumar 	CCP_CMD_LEN(desc) = pst->len;
1529d9a9e561SRavi Kumar 
1530d9a9e561SRavi Kumar 	if (pst->dir) {
1531d9a9e561SRavi Kumar 		CCP_CMD_SRC_LO(desc) = (uint32_t)(pst->src_addr);
1532d9a9e561SRavi Kumar 		CCP_CMD_SRC_HI(desc) = high32_value(pst->src_addr);
1533d9a9e561SRavi Kumar 		CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
1534d9a9e561SRavi Kumar 
1535d9a9e561SRavi Kumar 		CCP_CMD_DST_LO(desc) = (uint32_t)(pst->dest_addr);
1536d9a9e561SRavi Kumar 		CCP_CMD_DST_HI(desc) = 0;
1537d9a9e561SRavi Kumar 		CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SB;
1538d9a9e561SRavi Kumar 
1539d9a9e561SRavi Kumar 		if (pst->bit_mod != CCP_PASSTHRU_BITWISE_NOOP)
1540d9a9e561SRavi Kumar 			CCP_CMD_LSB_ID(desc) = cmd_q->sb_key;
1541d9a9e561SRavi Kumar 	} else {
1542d9a9e561SRavi Kumar 
1543d9a9e561SRavi Kumar 		CCP_CMD_SRC_LO(desc) = (uint32_t)(pst->src_addr);
1544d9a9e561SRavi Kumar 		CCP_CMD_SRC_HI(desc) = 0;
1545d9a9e561SRavi Kumar 		CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SB;
1546d9a9e561SRavi Kumar 
1547d9a9e561SRavi Kumar 		CCP_CMD_DST_LO(desc) = (uint32_t)(pst->dest_addr);
1548d9a9e561SRavi Kumar 		CCP_CMD_DST_HI(desc) = high32_value(pst->dest_addr);
1549d9a9e561SRavi Kumar 		CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SYSTEM;
1550d9a9e561SRavi Kumar 	}
1551d9a9e561SRavi Kumar 
1552d9a9e561SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
1553d9a9e561SRavi Kumar }
1554d9a9e561SRavi Kumar 
1555d9a9e561SRavi Kumar static int
ccp_perform_hmac(struct rte_crypto_op * op,struct ccp_queue * cmd_q)15560c6a81efSRavi Kumar ccp_perform_hmac(struct rte_crypto_op *op,
15570c6a81efSRavi Kumar 		 struct ccp_queue *cmd_q)
15580c6a81efSRavi Kumar {
15590c6a81efSRavi Kumar 
15600c6a81efSRavi Kumar 	struct ccp_session *session;
15610c6a81efSRavi Kumar 	union ccp_function function;
15620c6a81efSRavi Kumar 	struct ccp_desc *desc;
15630c6a81efSRavi Kumar 	uint32_t tail;
15640c6a81efSRavi Kumar 	phys_addr_t src_addr, dest_addr, dest_addr_t;
15650c6a81efSRavi Kumar 	struct ccp_passthru pst;
15660c6a81efSRavi Kumar 	uint64_t auth_msg_bits;
15670c6a81efSRavi Kumar 	void *append_ptr;
15680c6a81efSRavi Kumar 	uint8_t *addr;
15690c6a81efSRavi Kumar 
15702a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
15710c6a81efSRavi Kumar 	addr = session->auth.pre_compute;
15720c6a81efSRavi Kumar 
1573ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
15740c6a81efSRavi Kumar 					      op->sym->auth.data.offset);
15750c6a81efSRavi Kumar 	append_ptr = (void *)rte_pktmbuf_append(op->sym->m_src,
15760c6a81efSRavi Kumar 						session->auth.ctx_len);
15779631fb8fSDavid Marchand 	dest_addr_t = dest_addr = (phys_addr_t)rte_mem_virt2iova(append_ptr);
157809a0fd73SAmaranath Somalapuram 	pst.src_addr = (phys_addr_t)rte_mem_virt2iova((void *)addr);
15790c6a81efSRavi Kumar 
15800c6a81efSRavi Kumar 	/** Load PHash1 to LSB*/
15810c6a81efSRavi Kumar 	pst.dest_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
15820c6a81efSRavi Kumar 	pst.len = session->auth.ctx_len;
15830c6a81efSRavi Kumar 	pst.dir = 1;
15840c6a81efSRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
15850c6a81efSRavi Kumar 	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
15860c6a81efSRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
15870c6a81efSRavi Kumar 
15880c6a81efSRavi Kumar 	/**sha engine command descriptor for IntermediateHash*/
15890c6a81efSRavi Kumar 
15900c6a81efSRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
15910c6a81efSRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
15920c6a81efSRavi Kumar 
15930c6a81efSRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_SHA;
15940c6a81efSRavi Kumar 
15950c6a81efSRavi Kumar 	CCP_CMD_SOC(desc) = 0;
15960c6a81efSRavi Kumar 	CCP_CMD_IOC(desc) = 0;
15970c6a81efSRavi Kumar 	CCP_CMD_INIT(desc) = 1;
15980c6a81efSRavi Kumar 	CCP_CMD_EOM(desc) = 1;
15990c6a81efSRavi Kumar 	CCP_CMD_PROT(desc) = 0;
16000c6a81efSRavi Kumar 
16010c6a81efSRavi Kumar 	function.raw = 0;
16020c6a81efSRavi Kumar 	CCP_SHA_TYPE(&function) = session->auth.ut.sha_type;
16030c6a81efSRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
16040c6a81efSRavi Kumar 
16050c6a81efSRavi Kumar 	CCP_CMD_LEN(desc) = op->sym->auth.data.length;
16060c6a81efSRavi Kumar 	auth_msg_bits = (op->sym->auth.data.length +
16070c6a81efSRavi Kumar 			 session->auth.block_size)  * 8;
16080c6a81efSRavi Kumar 
16090c6a81efSRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
16100c6a81efSRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
16110c6a81efSRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
16120c6a81efSRavi Kumar 
16130c6a81efSRavi Kumar 	CCP_CMD_LSB_ID(desc) = cmd_q->sb_sha;
16140c6a81efSRavi Kumar 	CCP_CMD_SHA_LO(desc) = ((uint32_t)auth_msg_bits);
16150c6a81efSRavi Kumar 	CCP_CMD_SHA_HI(desc) = high32_value(auth_msg_bits);
16160c6a81efSRavi Kumar 
16170c6a81efSRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
16180c6a81efSRavi Kumar 
16190c6a81efSRavi Kumar 	rte_wmb();
16200c6a81efSRavi Kumar 
16210c6a81efSRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
16220c6a81efSRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
16230c6a81efSRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
16240c6a81efSRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
16250c6a81efSRavi Kumar 
16260c6a81efSRavi Kumar 	/* Intermediate Hash value retrieve */
16270c6a81efSRavi Kumar 	if ((session->auth.ut.sha_type == CCP_SHA_TYPE_384) ||
16280c6a81efSRavi Kumar 	    (session->auth.ut.sha_type == CCP_SHA_TYPE_512)) {
16290c6a81efSRavi Kumar 
16300c6a81efSRavi Kumar 		pst.src_addr =
16310c6a81efSRavi Kumar 			(phys_addr_t)((cmd_q->sb_sha + 1) * CCP_SB_BYTES);
16320c6a81efSRavi Kumar 		pst.dest_addr = dest_addr_t;
16330c6a81efSRavi Kumar 		pst.len = CCP_SB_BYTES;
16340c6a81efSRavi Kumar 		pst.dir = 0;
16350c6a81efSRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
16360c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
16370c6a81efSRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
16380c6a81efSRavi Kumar 
16390c6a81efSRavi Kumar 		pst.src_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
16400c6a81efSRavi Kumar 		pst.dest_addr = dest_addr_t + CCP_SB_BYTES;
16410c6a81efSRavi Kumar 		pst.len = CCP_SB_BYTES;
16420c6a81efSRavi Kumar 		pst.dir = 0;
16430c6a81efSRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
16440c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
16450c6a81efSRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
16460c6a81efSRavi Kumar 
16470c6a81efSRavi Kumar 	} else {
16480c6a81efSRavi Kumar 		pst.src_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
16490c6a81efSRavi Kumar 		pst.dest_addr = dest_addr_t;
16500c6a81efSRavi Kumar 		pst.len = session->auth.ctx_len;
16510c6a81efSRavi Kumar 		pst.dir = 0;
16520c6a81efSRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
16530c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
16540c6a81efSRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
16550c6a81efSRavi Kumar 
16560c6a81efSRavi Kumar 	}
16570c6a81efSRavi Kumar 
16580c6a81efSRavi Kumar 	/** Load PHash2 to LSB*/
16590c6a81efSRavi Kumar 	addr += session->auth.ctx_len;
166009a0fd73SAmaranath Somalapuram 	pst.src_addr = (phys_addr_t)rte_mem_virt2iova((void *)addr);
16610c6a81efSRavi Kumar 	pst.dest_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
16620c6a81efSRavi Kumar 	pst.len = session->auth.ctx_len;
16630c6a81efSRavi Kumar 	pst.dir = 1;
16640c6a81efSRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
16650c6a81efSRavi Kumar 	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
16660c6a81efSRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
16670c6a81efSRavi Kumar 
16680c6a81efSRavi Kumar 	/**sha engine command descriptor for FinalHash*/
16690c6a81efSRavi Kumar 	dest_addr_t += session->auth.offset;
16700c6a81efSRavi Kumar 
16710c6a81efSRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
16720c6a81efSRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
16730c6a81efSRavi Kumar 
16740c6a81efSRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_SHA;
16750c6a81efSRavi Kumar 
16760c6a81efSRavi Kumar 	CCP_CMD_SOC(desc) = 0;
16770c6a81efSRavi Kumar 	CCP_CMD_IOC(desc) = 0;
16780c6a81efSRavi Kumar 	CCP_CMD_INIT(desc) = 1;
16790c6a81efSRavi Kumar 	CCP_CMD_EOM(desc) = 1;
16800c6a81efSRavi Kumar 	CCP_CMD_PROT(desc) = 0;
16810c6a81efSRavi Kumar 
16820c6a81efSRavi Kumar 	function.raw = 0;
16830c6a81efSRavi Kumar 	CCP_SHA_TYPE(&function) = session->auth.ut.sha_type;
16840c6a81efSRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
16850c6a81efSRavi Kumar 
16860c6a81efSRavi Kumar 	CCP_CMD_LEN(desc) = (session->auth.ctx_len -
16870c6a81efSRavi Kumar 			     session->auth.offset);
16880c6a81efSRavi Kumar 	auth_msg_bits = (session->auth.block_size +
16890c6a81efSRavi Kumar 			 session->auth.ctx_len -
16900c6a81efSRavi Kumar 			 session->auth.offset) * 8;
16910c6a81efSRavi Kumar 
16920c6a81efSRavi Kumar 	CCP_CMD_SRC_LO(desc) = (uint32_t)(dest_addr_t);
16930c6a81efSRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(dest_addr_t);
16940c6a81efSRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
16950c6a81efSRavi Kumar 
16960c6a81efSRavi Kumar 	CCP_CMD_LSB_ID(desc) = cmd_q->sb_sha;
16970c6a81efSRavi Kumar 	CCP_CMD_SHA_LO(desc) = ((uint32_t)auth_msg_bits);
16980c6a81efSRavi Kumar 	CCP_CMD_SHA_HI(desc) = high32_value(auth_msg_bits);
16990c6a81efSRavi Kumar 
17000c6a81efSRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
17010c6a81efSRavi Kumar 
17020c6a81efSRavi Kumar 	rte_wmb();
17030c6a81efSRavi Kumar 
17040c6a81efSRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
17050c6a81efSRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
17060c6a81efSRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
17070c6a81efSRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
17080c6a81efSRavi Kumar 
17090c6a81efSRavi Kumar 	/* Retrieve hmac output */
17100c6a81efSRavi Kumar 	pst.src_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
17110c6a81efSRavi Kumar 	pst.dest_addr = dest_addr;
17120c6a81efSRavi Kumar 	pst.len = session->auth.ctx_len;
17130c6a81efSRavi Kumar 	pst.dir = 0;
17140c6a81efSRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
17150c6a81efSRavi Kumar 	if ((session->auth.ut.sha_type == CCP_SHA_TYPE_384) ||
17160c6a81efSRavi Kumar 	    (session->auth.ut.sha_type == CCP_SHA_TYPE_512))
17170c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
17180c6a81efSRavi Kumar 	else
17190c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
17200c6a81efSRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
17210c6a81efSRavi Kumar 
17220c6a81efSRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
17230c6a81efSRavi Kumar 	return 0;
17240c6a81efSRavi Kumar 
17250c6a81efSRavi Kumar }
17260c6a81efSRavi Kumar 
17270c6a81efSRavi Kumar static int
ccp_perform_sha(struct rte_crypto_op * op,struct ccp_queue * cmd_q)17280c6a81efSRavi Kumar ccp_perform_sha(struct rte_crypto_op *op,
17290c6a81efSRavi Kumar 		struct ccp_queue *cmd_q)
17300c6a81efSRavi Kumar {
17310c6a81efSRavi Kumar 	struct ccp_session *session;
17320c6a81efSRavi Kumar 	union ccp_function function;
17330c6a81efSRavi Kumar 	struct ccp_desc *desc;
17340c6a81efSRavi Kumar 	uint32_t tail;
17350c6a81efSRavi Kumar 	phys_addr_t src_addr, dest_addr;
17360c6a81efSRavi Kumar 	struct ccp_passthru pst;
17370c6a81efSRavi Kumar 	void *append_ptr;
17380c6a81efSRavi Kumar 	uint64_t auth_msg_bits;
17390c6a81efSRavi Kumar 
17402a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
17410c6a81efSRavi Kumar 
1742ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
17430c6a81efSRavi Kumar 					      op->sym->auth.data.offset);
17440c6a81efSRavi Kumar 	append_ptr = (void *)rte_pktmbuf_append(op->sym->m_src,
17450c6a81efSRavi Kumar 						session->auth.ctx_len);
17469631fb8fSDavid Marchand 	pst.src_addr = (phys_addr_t)rte_mem_virt2iova((void *)session->auth.ctx);
174709a0fd73SAmaranath Somalapuram 	dest_addr = (phys_addr_t)rte_mem_virt2iova(append_ptr);
17480c6a81efSRavi Kumar 
17490c6a81efSRavi Kumar 	/** Passthru sha context*/
17500c6a81efSRavi Kumar 
17510c6a81efSRavi Kumar 	pst.dest_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
17520c6a81efSRavi Kumar 	pst.len = session->auth.ctx_len;
17530c6a81efSRavi Kumar 	pst.dir = 1;
17540c6a81efSRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
17550c6a81efSRavi Kumar 	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
17560c6a81efSRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
17570c6a81efSRavi Kumar 
17580c6a81efSRavi Kumar 	/**prepare sha command descriptor*/
17590c6a81efSRavi Kumar 
17600c6a81efSRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
17610c6a81efSRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
17620c6a81efSRavi Kumar 
17630c6a81efSRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_SHA;
17640c6a81efSRavi Kumar 
17650c6a81efSRavi Kumar 	CCP_CMD_SOC(desc) = 0;
17660c6a81efSRavi Kumar 	CCP_CMD_IOC(desc) = 0;
17670c6a81efSRavi Kumar 	CCP_CMD_INIT(desc) = 1;
17680c6a81efSRavi Kumar 	CCP_CMD_EOM(desc) = 1;
17690c6a81efSRavi Kumar 	CCP_CMD_PROT(desc) = 0;
17700c6a81efSRavi Kumar 
17710c6a81efSRavi Kumar 	function.raw = 0;
17720c6a81efSRavi Kumar 	CCP_SHA_TYPE(&function) = session->auth.ut.sha_type;
17730c6a81efSRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
17740c6a81efSRavi Kumar 
17750c6a81efSRavi Kumar 	CCP_CMD_LEN(desc) = op->sym->auth.data.length;
17760c6a81efSRavi Kumar 	auth_msg_bits = op->sym->auth.data.length * 8;
17770c6a81efSRavi Kumar 
17780c6a81efSRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
17790c6a81efSRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
17800c6a81efSRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
17810c6a81efSRavi Kumar 
17820c6a81efSRavi Kumar 	CCP_CMD_LSB_ID(desc) = cmd_q->sb_sha;
17830c6a81efSRavi Kumar 	CCP_CMD_SHA_LO(desc) = ((uint32_t)auth_msg_bits);
17840c6a81efSRavi Kumar 	CCP_CMD_SHA_HI(desc) = high32_value(auth_msg_bits);
17850c6a81efSRavi Kumar 
17860c6a81efSRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
17870c6a81efSRavi Kumar 
17880c6a81efSRavi Kumar 	rte_wmb();
17890c6a81efSRavi Kumar 
17900c6a81efSRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
17910c6a81efSRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
17920c6a81efSRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
17930c6a81efSRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
17940c6a81efSRavi Kumar 
17950c6a81efSRavi Kumar 	/* Hash value retrieve */
17960c6a81efSRavi Kumar 	pst.src_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
17970c6a81efSRavi Kumar 	pst.dest_addr = dest_addr;
17980c6a81efSRavi Kumar 	pst.len = session->auth.ctx_len;
17990c6a81efSRavi Kumar 	pst.dir = 0;
18000c6a81efSRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
18010c6a81efSRavi Kumar 	if ((session->auth.ut.sha_type == CCP_SHA_TYPE_384) ||
18020c6a81efSRavi Kumar 	    (session->auth.ut.sha_type == CCP_SHA_TYPE_512))
18030c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
18040c6a81efSRavi Kumar 	else
18050c6a81efSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
18060c6a81efSRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
18070c6a81efSRavi Kumar 
18080c6a81efSRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
18090c6a81efSRavi Kumar 	return 0;
18100c6a81efSRavi Kumar 
18110c6a81efSRavi Kumar }
18120c6a81efSRavi Kumar 
18130c6a81efSRavi Kumar static int
ccp_perform_sha3_hmac(struct rte_crypto_op * op,struct ccp_queue * cmd_q)18141df800f8SRavi Kumar ccp_perform_sha3_hmac(struct rte_crypto_op *op,
18151df800f8SRavi Kumar 		      struct ccp_queue *cmd_q)
18161df800f8SRavi Kumar {
18171df800f8SRavi Kumar 	struct ccp_session *session;
18181df800f8SRavi Kumar 	struct ccp_passthru pst;
18191df800f8SRavi Kumar 	union ccp_function function;
18201df800f8SRavi Kumar 	struct ccp_desc *desc;
18211df800f8SRavi Kumar 	uint8_t *append_ptr;
18221df800f8SRavi Kumar 	uint32_t tail;
18231df800f8SRavi Kumar 	phys_addr_t src_addr, dest_addr, ctx_paddr, dest_addr_t;
18241df800f8SRavi Kumar 
18252a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
18261df800f8SRavi Kumar 
1827ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
18281df800f8SRavi Kumar 					      op->sym->auth.data.offset);
18291df800f8SRavi Kumar 	append_ptr = (uint8_t *)rte_pktmbuf_append(op->sym->m_src,
18301df800f8SRavi Kumar 						session->auth.ctx_len);
18311df800f8SRavi Kumar 	if (!append_ptr) {
1832*0d526c7aSDavid Marchand 		CCP_LOG_ERR("CCP MBUF append failed");
18331df800f8SRavi Kumar 		return -1;
18341df800f8SRavi Kumar 	}
183509a0fd73SAmaranath Somalapuram 	dest_addr = (phys_addr_t)rte_mem_virt2iova((void *)append_ptr);
18369631fb8fSDavid Marchand 	ctx_paddr = (phys_addr_t)rte_mem_virt2iova(session->auth.pre_compute);
18371df800f8SRavi Kumar 	dest_addr_t = dest_addr + (session->auth.ctx_len / 2);
18381df800f8SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
18391df800f8SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
18401df800f8SRavi Kumar 
18411df800f8SRavi Kumar 	/*desc1 for SHA3-Ihash operation */
18421df800f8SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_SHA;
18431df800f8SRavi Kumar 	CCP_CMD_INIT(desc) = 1;
18441df800f8SRavi Kumar 	CCP_CMD_EOM(desc) = 1;
18451df800f8SRavi Kumar 
18461df800f8SRavi Kumar 	function.raw = 0;
18471df800f8SRavi Kumar 	CCP_SHA_TYPE(&function) = session->auth.ut.sha_type;
18481df800f8SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
18491df800f8SRavi Kumar 	CCP_CMD_LEN(desc) = op->sym->auth.data.length;
18501df800f8SRavi Kumar 
18511df800f8SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
18521df800f8SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
18531df800f8SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
18541df800f8SRavi Kumar 
18551df800f8SRavi Kumar 	CCP_CMD_DST_LO(desc) = (cmd_q->sb_sha * CCP_SB_BYTES);
18561df800f8SRavi Kumar 	CCP_CMD_DST_HI(desc) = 0;
18571df800f8SRavi Kumar 	CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SB;
18581df800f8SRavi Kumar 
18591df800f8SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)ctx_paddr);
18601df800f8SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(ctx_paddr);
18611df800f8SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
18621df800f8SRavi Kumar 
18631df800f8SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
18641df800f8SRavi Kumar 
18651df800f8SRavi Kumar 	rte_wmb();
18661df800f8SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
18671df800f8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
18681df800f8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
18691df800f8SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
18701df800f8SRavi Kumar 
18711df800f8SRavi Kumar 	/* Intermediate Hash value retrieve */
18721df800f8SRavi Kumar 	if ((session->auth.ut.sha_type == CCP_SHA3_TYPE_384) ||
18731df800f8SRavi Kumar 	    (session->auth.ut.sha_type == CCP_SHA3_TYPE_512)) {
18741df800f8SRavi Kumar 
18751df800f8SRavi Kumar 		pst.src_addr =
18761df800f8SRavi Kumar 			(phys_addr_t)((cmd_q->sb_sha + 1) * CCP_SB_BYTES);
18771df800f8SRavi Kumar 		pst.dest_addr = dest_addr_t;
18781df800f8SRavi Kumar 		pst.len = CCP_SB_BYTES;
18791df800f8SRavi Kumar 		pst.dir = 0;
18801df800f8SRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
18811df800f8SRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
18821df800f8SRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
18831df800f8SRavi Kumar 
18841df800f8SRavi Kumar 		pst.src_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
18851df800f8SRavi Kumar 		pst.dest_addr = dest_addr_t + CCP_SB_BYTES;
18861df800f8SRavi Kumar 		pst.len = CCP_SB_BYTES;
18871df800f8SRavi Kumar 		pst.dir = 0;
18881df800f8SRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
18891df800f8SRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
18901df800f8SRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
18911df800f8SRavi Kumar 
18921df800f8SRavi Kumar 	} else {
18931df800f8SRavi Kumar 		pst.src_addr = (phys_addr_t)(cmd_q->sb_sha * CCP_SB_BYTES);
18941df800f8SRavi Kumar 		pst.dest_addr = dest_addr_t;
18951df800f8SRavi Kumar 		pst.len = CCP_SB_BYTES;
18961df800f8SRavi Kumar 		pst.dir = 0;
18971df800f8SRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
18981df800f8SRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
18991df800f8SRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
19001df800f8SRavi Kumar 	}
19011df800f8SRavi Kumar 
19021df800f8SRavi Kumar 	/**sha engine command descriptor for FinalHash*/
19031df800f8SRavi Kumar 	ctx_paddr += CCP_SHA3_CTX_SIZE;
19041df800f8SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
19051df800f8SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
19061df800f8SRavi Kumar 
19071df800f8SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_SHA;
19081df800f8SRavi Kumar 	CCP_CMD_INIT(desc) = 1;
19091df800f8SRavi Kumar 	CCP_CMD_EOM(desc) = 1;
19101df800f8SRavi Kumar 
19111df800f8SRavi Kumar 	function.raw = 0;
19121df800f8SRavi Kumar 	CCP_SHA_TYPE(&function) = session->auth.ut.sha_type;
19131df800f8SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
19141df800f8SRavi Kumar 
19151df800f8SRavi Kumar 	if (session->auth.ut.sha_type == CCP_SHA3_TYPE_224) {
19161df800f8SRavi Kumar 		dest_addr_t += (CCP_SB_BYTES - SHA224_DIGEST_SIZE);
19171df800f8SRavi Kumar 		CCP_CMD_LEN(desc) = SHA224_DIGEST_SIZE;
19181df800f8SRavi Kumar 	} else if (session->auth.ut.sha_type == CCP_SHA3_TYPE_256) {
19191df800f8SRavi Kumar 		CCP_CMD_LEN(desc) = SHA256_DIGEST_SIZE;
19201df800f8SRavi Kumar 	} else if (session->auth.ut.sha_type == CCP_SHA3_TYPE_384) {
19211df800f8SRavi Kumar 		dest_addr_t += (2 * CCP_SB_BYTES - SHA384_DIGEST_SIZE);
19221df800f8SRavi Kumar 		CCP_CMD_LEN(desc) = SHA384_DIGEST_SIZE;
19231df800f8SRavi Kumar 	} else {
19241df800f8SRavi Kumar 		CCP_CMD_LEN(desc) = SHA512_DIGEST_SIZE;
19251df800f8SRavi Kumar 	}
19261df800f8SRavi Kumar 
19271df800f8SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)dest_addr_t);
19281df800f8SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(dest_addr_t);
19291df800f8SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
19301df800f8SRavi Kumar 
19311df800f8SRavi Kumar 	CCP_CMD_DST_LO(desc) = (uint32_t)dest_addr;
19321df800f8SRavi Kumar 	CCP_CMD_DST_HI(desc) = high32_value(dest_addr);
19331df800f8SRavi Kumar 	CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SYSTEM;
19341df800f8SRavi Kumar 
19351df800f8SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)ctx_paddr);
19361df800f8SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(ctx_paddr);
19371df800f8SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
19381df800f8SRavi Kumar 
19391df800f8SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
19401df800f8SRavi Kumar 
19411df800f8SRavi Kumar 	rte_wmb();
19421df800f8SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
19431df800f8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
19441df800f8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
19451df800f8SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
19461df800f8SRavi Kumar 
19471df800f8SRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
19481df800f8SRavi Kumar 	return 0;
19491df800f8SRavi Kumar }
19501df800f8SRavi Kumar 
19511df800f8SRavi Kumar static int
ccp_perform_sha3(struct rte_crypto_op * op,struct ccp_queue * cmd_q)19521df800f8SRavi Kumar ccp_perform_sha3(struct rte_crypto_op *op,
19531df800f8SRavi Kumar 		 struct ccp_queue *cmd_q)
19541df800f8SRavi Kumar {
19551df800f8SRavi Kumar 	struct ccp_session *session;
19561df800f8SRavi Kumar 	union ccp_function function;
19571df800f8SRavi Kumar 	struct ccp_desc *desc;
195809a0fd73SAmaranath Somalapuram 	uint8_t *ctx_addr = NULL, *append_ptr = NULL;
19591df800f8SRavi Kumar 	uint32_t tail;
19601df800f8SRavi Kumar 	phys_addr_t src_addr, dest_addr, ctx_paddr;
19611df800f8SRavi Kumar 
19622a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
19631df800f8SRavi Kumar 
1964ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
19651df800f8SRavi Kumar 					      op->sym->auth.data.offset);
19661df800f8SRavi Kumar 	append_ptr = (uint8_t *)rte_pktmbuf_append(op->sym->m_src,
19671df800f8SRavi Kumar 						session->auth.ctx_len);
19681df800f8SRavi Kumar 	if (!append_ptr) {
1969*0d526c7aSDavid Marchand 		CCP_LOG_ERR("CCP MBUF append failed");
19701df800f8SRavi Kumar 		return -1;
19711df800f8SRavi Kumar 	}
197209a0fd73SAmaranath Somalapuram 	dest_addr = (phys_addr_t)rte_mem_virt2iova((void *)append_ptr);
197309a0fd73SAmaranath Somalapuram 	ctx_paddr = (phys_addr_t)rte_mem_virt2iova((void *)ctx_addr);
197409a0fd73SAmaranath Somalapuram 
197509a0fd73SAmaranath Somalapuram 	ctx_addr = session->auth.sha3_ctx;
19761df800f8SRavi Kumar 
19771df800f8SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
19781df800f8SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
19791df800f8SRavi Kumar 
19801df800f8SRavi Kumar 	/* prepare desc for SHA3 operation */
19811df800f8SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_SHA;
19821df800f8SRavi Kumar 	CCP_CMD_INIT(desc) = 1;
19831df800f8SRavi Kumar 	CCP_CMD_EOM(desc) = 1;
19841df800f8SRavi Kumar 
19851df800f8SRavi Kumar 	function.raw = 0;
19861df800f8SRavi Kumar 	CCP_SHA_TYPE(&function) = session->auth.ut.sha_type;
19871df800f8SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
19881df800f8SRavi Kumar 
19891df800f8SRavi Kumar 	CCP_CMD_LEN(desc) = op->sym->auth.data.length;
19901df800f8SRavi Kumar 
19911df800f8SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
19921df800f8SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
19931df800f8SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
19941df800f8SRavi Kumar 
19951df800f8SRavi Kumar 	CCP_CMD_DST_LO(desc) = ((uint32_t)dest_addr);
19961df800f8SRavi Kumar 	CCP_CMD_DST_HI(desc) = high32_value(dest_addr);
19971df800f8SRavi Kumar 	CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SYSTEM;
19981df800f8SRavi Kumar 
19991df800f8SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)ctx_paddr);
20001df800f8SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(ctx_paddr);
20011df800f8SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
20021df800f8SRavi Kumar 
20031df800f8SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
20041df800f8SRavi Kumar 
20051df800f8SRavi Kumar 	rte_wmb();
20061df800f8SRavi Kumar 
20071df800f8SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
20081df800f8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
20091df800f8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
20101df800f8SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
20111df800f8SRavi Kumar 
20121df800f8SRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
20131df800f8SRavi Kumar 	return 0;
20141df800f8SRavi Kumar }
20151df800f8SRavi Kumar 
20161df800f8SRavi Kumar static int
ccp_perform_aes_cmac(struct rte_crypto_op * op,struct ccp_queue * cmd_q)2017687ae11fSRavi Kumar ccp_perform_aes_cmac(struct rte_crypto_op *op,
2018687ae11fSRavi Kumar 		     struct ccp_queue *cmd_q)
2019687ae11fSRavi Kumar {
2020687ae11fSRavi Kumar 	struct ccp_session *session;
2021687ae11fSRavi Kumar 	union ccp_function function;
2022687ae11fSRavi Kumar 	struct ccp_passthru pst;
2023687ae11fSRavi Kumar 	struct ccp_desc *desc;
2024687ae11fSRavi Kumar 	uint32_t tail;
2025687ae11fSRavi Kumar 	uint8_t *src_tb, *append_ptr, *ctx_addr;
2026687ae11fSRavi Kumar 	phys_addr_t src_addr, dest_addr, key_addr;
2027687ae11fSRavi Kumar 	int length, non_align_len;
2028687ae11fSRavi Kumar 
20292a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
2030687ae11fSRavi Kumar 	key_addr = rte_mem_virt2phy(session->auth.key_ccp);
2031687ae11fSRavi Kumar 
2032ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
2033687ae11fSRavi Kumar 					      op->sym->auth.data.offset);
2034687ae11fSRavi Kumar 	append_ptr = (uint8_t *)rte_pktmbuf_append(op->sym->m_src,
2035687ae11fSRavi Kumar 						session->auth.ctx_len);
2036687ae11fSRavi Kumar 	dest_addr = (phys_addr_t)rte_mem_virt2phy((void *)append_ptr);
2037687ae11fSRavi Kumar 
2038687ae11fSRavi Kumar 	function.raw = 0;
2039687ae11fSRavi Kumar 	CCP_AES_ENCRYPT(&function) = CCP_CIPHER_DIR_ENCRYPT;
2040687ae11fSRavi Kumar 	CCP_AES_MODE(&function) = session->auth.um.aes_mode;
2041687ae11fSRavi Kumar 	CCP_AES_TYPE(&function) = session->auth.ut.aes_type;
2042687ae11fSRavi Kumar 
2043687ae11fSRavi Kumar 	if (op->sym->auth.data.length % session->auth.block_size == 0) {
2044687ae11fSRavi Kumar 
2045687ae11fSRavi Kumar 		ctx_addr = session->auth.pre_compute;
2046687ae11fSRavi Kumar 		memset(ctx_addr, 0, AES_BLOCK_SIZE);
20479631fb8fSDavid Marchand 		pst.src_addr = (phys_addr_t)rte_mem_virt2iova((void *)ctx_addr);
2048687ae11fSRavi Kumar 		pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2049687ae11fSRavi Kumar 		pst.len = CCP_SB_BYTES;
2050687ae11fSRavi Kumar 		pst.dir = 1;
2051687ae11fSRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2052687ae11fSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
2053687ae11fSRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
2054687ae11fSRavi Kumar 
2055687ae11fSRavi Kumar 		desc = &cmd_q->qbase_desc[cmd_q->qidx];
2056687ae11fSRavi Kumar 		memset(desc, 0, Q_DESC_SIZE);
2057687ae11fSRavi Kumar 
2058687ae11fSRavi Kumar 		/* prepare desc for aes-cmac command */
2059687ae11fSRavi Kumar 		CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2060687ae11fSRavi Kumar 		CCP_CMD_EOM(desc) = 1;
2061687ae11fSRavi Kumar 		CCP_CMD_FUNCTION(desc) = function.raw;
2062687ae11fSRavi Kumar 
2063687ae11fSRavi Kumar 		CCP_CMD_LEN(desc) = op->sym->auth.data.length;
2064687ae11fSRavi Kumar 		CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
2065687ae11fSRavi Kumar 		CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
2066687ae11fSRavi Kumar 		CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2067687ae11fSRavi Kumar 
2068687ae11fSRavi Kumar 		CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2069687ae11fSRavi Kumar 		CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2070687ae11fSRavi Kumar 		CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2071687ae11fSRavi Kumar 		CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2072687ae11fSRavi Kumar 
2073687ae11fSRavi Kumar 		cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2074687ae11fSRavi Kumar 
2075687ae11fSRavi Kumar 		rte_wmb();
2076687ae11fSRavi Kumar 
2077687ae11fSRavi Kumar 		tail =
2078687ae11fSRavi Kumar 		(uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
2079687ae11fSRavi Kumar 		CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
2080687ae11fSRavi Kumar 		CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
2081687ae11fSRavi Kumar 			      cmd_q->qcontrol | CMD_Q_RUN);
2082687ae11fSRavi Kumar 	} else {
2083687ae11fSRavi Kumar 		ctx_addr = session->auth.pre_compute + CCP_SB_BYTES;
2084687ae11fSRavi Kumar 		memset(ctx_addr, 0, AES_BLOCK_SIZE);
20859631fb8fSDavid Marchand 		pst.src_addr = (phys_addr_t)rte_mem_virt2iova((void *)ctx_addr);
2086687ae11fSRavi Kumar 		pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2087687ae11fSRavi Kumar 		pst.len = CCP_SB_BYTES;
2088687ae11fSRavi Kumar 		pst.dir = 1;
2089687ae11fSRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2090687ae11fSRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
2091687ae11fSRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
2092687ae11fSRavi Kumar 
2093687ae11fSRavi Kumar 		length = (op->sym->auth.data.length / AES_BLOCK_SIZE);
2094687ae11fSRavi Kumar 		length *= AES_BLOCK_SIZE;
2095687ae11fSRavi Kumar 		non_align_len = op->sym->auth.data.length - length;
2096687ae11fSRavi Kumar 		/* prepare desc for aes-cmac command */
2097687ae11fSRavi Kumar 		/*Command 1*/
2098687ae11fSRavi Kumar 		desc = &cmd_q->qbase_desc[cmd_q->qidx];
2099687ae11fSRavi Kumar 		memset(desc, 0, Q_DESC_SIZE);
2100687ae11fSRavi Kumar 
2101687ae11fSRavi Kumar 		CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2102687ae11fSRavi Kumar 		CCP_CMD_INIT(desc) = 1;
2103687ae11fSRavi Kumar 		CCP_CMD_FUNCTION(desc) = function.raw;
2104687ae11fSRavi Kumar 
2105687ae11fSRavi Kumar 		CCP_CMD_LEN(desc) = length;
2106687ae11fSRavi Kumar 		CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
2107687ae11fSRavi Kumar 		CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
2108687ae11fSRavi Kumar 		CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2109687ae11fSRavi Kumar 
2110687ae11fSRavi Kumar 		CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2111687ae11fSRavi Kumar 		CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2112687ae11fSRavi Kumar 		CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2113687ae11fSRavi Kumar 		CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2114687ae11fSRavi Kumar 
2115687ae11fSRavi Kumar 		cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2116687ae11fSRavi Kumar 
2117687ae11fSRavi Kumar 		/*Command 2*/
2118687ae11fSRavi Kumar 		append_ptr = append_ptr + CCP_SB_BYTES;
2119687ae11fSRavi Kumar 		memset(append_ptr, 0, AES_BLOCK_SIZE);
2120687ae11fSRavi Kumar 		src_tb = rte_pktmbuf_mtod_offset(op->sym->m_src,
2121687ae11fSRavi Kumar 						 uint8_t *,
2122687ae11fSRavi Kumar 						 op->sym->auth.data.offset +
2123687ae11fSRavi Kumar 						 length);
2124687ae11fSRavi Kumar 		rte_memcpy(append_ptr, src_tb, non_align_len);
2125687ae11fSRavi Kumar 		append_ptr[non_align_len] = CMAC_PAD_VALUE;
2126687ae11fSRavi Kumar 
2127687ae11fSRavi Kumar 		desc = &cmd_q->qbase_desc[cmd_q->qidx];
2128687ae11fSRavi Kumar 		memset(desc, 0, Q_DESC_SIZE);
2129687ae11fSRavi Kumar 
2130687ae11fSRavi Kumar 		CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2131687ae11fSRavi Kumar 		CCP_CMD_EOM(desc) = 1;
2132687ae11fSRavi Kumar 		CCP_CMD_FUNCTION(desc) = function.raw;
2133687ae11fSRavi Kumar 		CCP_CMD_LEN(desc) = AES_BLOCK_SIZE;
2134687ae11fSRavi Kumar 
2135687ae11fSRavi Kumar 		CCP_CMD_SRC_LO(desc) = ((uint32_t)(dest_addr + CCP_SB_BYTES));
2136687ae11fSRavi Kumar 		CCP_CMD_SRC_HI(desc) = high32_value(dest_addr + CCP_SB_BYTES);
2137687ae11fSRavi Kumar 		CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2138687ae11fSRavi Kumar 
2139687ae11fSRavi Kumar 		CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2140687ae11fSRavi Kumar 		CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2141687ae11fSRavi Kumar 		CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2142687ae11fSRavi Kumar 		CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2143687ae11fSRavi Kumar 
2144687ae11fSRavi Kumar 		cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2145687ae11fSRavi Kumar 
2146687ae11fSRavi Kumar 		rte_wmb();
2147687ae11fSRavi Kumar 		tail =
2148687ae11fSRavi Kumar 		(uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
2149687ae11fSRavi Kumar 		CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
2150687ae11fSRavi Kumar 		CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
2151687ae11fSRavi Kumar 			      cmd_q->qcontrol | CMD_Q_RUN);
2152687ae11fSRavi Kumar 	}
2153687ae11fSRavi Kumar 	/* Retrieve result */
2154687ae11fSRavi Kumar 	pst.dest_addr = dest_addr;
2155687ae11fSRavi Kumar 	pst.src_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2156687ae11fSRavi Kumar 	pst.len = CCP_SB_BYTES;
2157687ae11fSRavi Kumar 	pst.dir = 0;
2158687ae11fSRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2159687ae11fSRavi Kumar 	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
2160687ae11fSRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
2161687ae11fSRavi Kumar 
2162687ae11fSRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
2163687ae11fSRavi Kumar 	return 0;
2164687ae11fSRavi Kumar }
2165687ae11fSRavi Kumar 
2166687ae11fSRavi Kumar static int
ccp_perform_aes(struct rte_crypto_op * op,struct ccp_queue * cmd_q,struct ccp_batch_info * b_info)2167d9a9e561SRavi Kumar ccp_perform_aes(struct rte_crypto_op *op,
2168d9a9e561SRavi Kumar 		struct ccp_queue *cmd_q,
2169d9a9e561SRavi Kumar 		struct ccp_batch_info *b_info)
2170d9a9e561SRavi Kumar {
2171d9a9e561SRavi Kumar 	struct ccp_session *session;
2172d9a9e561SRavi Kumar 	union ccp_function function;
2173d9a9e561SRavi Kumar 	uint8_t *lsb_buf;
2174d9a9e561SRavi Kumar 	struct ccp_passthru pst = {0};
2175d9a9e561SRavi Kumar 	struct ccp_desc *desc;
2176d9a9e561SRavi Kumar 	phys_addr_t src_addr, dest_addr, key_addr;
2177d9a9e561SRavi Kumar 	uint8_t *iv;
2178d9a9e561SRavi Kumar 
21792a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
2180d9a9e561SRavi Kumar 	function.raw = 0;
2181d9a9e561SRavi Kumar 
2182d9a9e561SRavi Kumar 	iv = rte_crypto_op_ctod_offset(op, uint8_t *, session->iv.offset);
2183d9a9e561SRavi Kumar 	if (session->cipher.um.aes_mode != CCP_AES_MODE_ECB) {
2184d9a9e561SRavi Kumar 		if (session->cipher.um.aes_mode == CCP_AES_MODE_CTR) {
2185d9a9e561SRavi Kumar 			rte_memcpy(session->cipher.nonce + AES_BLOCK_SIZE,
2186d9a9e561SRavi Kumar 				   iv, session->iv.length);
2187d9a9e561SRavi Kumar 			pst.src_addr = (phys_addr_t)session->cipher.nonce_phys;
2188d9a9e561SRavi Kumar 			CCP_AES_SIZE(&function) = 0x1F;
2189d9a9e561SRavi Kumar 		} else {
2190d9a9e561SRavi Kumar 			lsb_buf =
2191d9a9e561SRavi Kumar 			&(b_info->lsb_buf[b_info->lsb_buf_idx*CCP_SB_BYTES]);
2192d9a9e561SRavi Kumar 			rte_memcpy(lsb_buf +
2193d9a9e561SRavi Kumar 				   (CCP_SB_BYTES - session->iv.length),
2194d9a9e561SRavi Kumar 				   iv, session->iv.length);
2195d9a9e561SRavi Kumar 			pst.src_addr = b_info->lsb_buf_phys +
2196d9a9e561SRavi Kumar 				(b_info->lsb_buf_idx * CCP_SB_BYTES);
2197d9a9e561SRavi Kumar 			b_info->lsb_buf_idx++;
2198d9a9e561SRavi Kumar 		}
2199d9a9e561SRavi Kumar 
2200d9a9e561SRavi Kumar 		pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2201d9a9e561SRavi Kumar 		pst.len = CCP_SB_BYTES;
2202d9a9e561SRavi Kumar 		pst.dir = 1;
2203d9a9e561SRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2204d9a9e561SRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
2205d9a9e561SRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
2206d9a9e561SRavi Kumar 	}
2207d9a9e561SRavi Kumar 
2208d9a9e561SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
2209d9a9e561SRavi Kumar 
2210ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
2211d9a9e561SRavi Kumar 					      op->sym->cipher.data.offset);
2212d9a9e561SRavi Kumar 	if (likely(op->sym->m_dst != NULL))
2213ce627d63SThomas Monjalon 		dest_addr = rte_pktmbuf_iova_offset(op->sym->m_dst,
2214d9a9e561SRavi Kumar 						op->sym->cipher.data.offset);
2215d9a9e561SRavi Kumar 	else
2216d9a9e561SRavi Kumar 		dest_addr = src_addr;
2217d9a9e561SRavi Kumar 	key_addr = session->cipher.key_phys;
2218d9a9e561SRavi Kumar 
2219d9a9e561SRavi Kumar 	/* prepare desc for aes command */
2220d9a9e561SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2221d9a9e561SRavi Kumar 	CCP_CMD_INIT(desc) = 1;
2222d9a9e561SRavi Kumar 	CCP_CMD_EOM(desc) = 1;
2223d9a9e561SRavi Kumar 
2224d9a9e561SRavi Kumar 	CCP_AES_ENCRYPT(&function) = session->cipher.dir;
2225d9a9e561SRavi Kumar 	CCP_AES_MODE(&function) = session->cipher.um.aes_mode;
2226d9a9e561SRavi Kumar 	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
2227d9a9e561SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
2228d9a9e561SRavi Kumar 
2229d9a9e561SRavi Kumar 	CCP_CMD_LEN(desc) = op->sym->cipher.data.length;
2230d9a9e561SRavi Kumar 
2231d9a9e561SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
2232d9a9e561SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
2233d9a9e561SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2234d9a9e561SRavi Kumar 
2235d9a9e561SRavi Kumar 	CCP_CMD_DST_LO(desc) = ((uint32_t)dest_addr);
2236d9a9e561SRavi Kumar 	CCP_CMD_DST_HI(desc) = high32_value(dest_addr);
2237d9a9e561SRavi Kumar 	CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2238d9a9e561SRavi Kumar 
2239d9a9e561SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2240d9a9e561SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2241d9a9e561SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2242d9a9e561SRavi Kumar 
2243d9a9e561SRavi Kumar 	if (session->cipher.um.aes_mode != CCP_AES_MODE_ECB)
2244d9a9e561SRavi Kumar 		CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2245d9a9e561SRavi Kumar 
2246d9a9e561SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2247d9a9e561SRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
2248d9a9e561SRavi Kumar 	return 0;
2249d9a9e561SRavi Kumar }
2250d9a9e561SRavi Kumar 
2251c05adb06SRavi Kumar static int
ccp_perform_3des(struct rte_crypto_op * op,struct ccp_queue * cmd_q,struct ccp_batch_info * b_info)2252c05adb06SRavi Kumar ccp_perform_3des(struct rte_crypto_op *op,
2253c05adb06SRavi Kumar 		struct ccp_queue *cmd_q,
2254c05adb06SRavi Kumar 		struct ccp_batch_info *b_info)
2255c05adb06SRavi Kumar {
2256c05adb06SRavi Kumar 	struct ccp_session *session;
2257c05adb06SRavi Kumar 	union ccp_function function;
2258c05adb06SRavi Kumar 	unsigned char *lsb_buf;
2259c05adb06SRavi Kumar 	struct ccp_passthru pst;
2260c05adb06SRavi Kumar 	struct ccp_desc *desc;
2261c05adb06SRavi Kumar 	uint32_t tail;
2262c05adb06SRavi Kumar 	uint8_t *iv;
2263c05adb06SRavi Kumar 	phys_addr_t src_addr, dest_addr, key_addr;
2264c05adb06SRavi Kumar 
22652a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
2266c05adb06SRavi Kumar 
2267c05adb06SRavi Kumar 	iv = rte_crypto_op_ctod_offset(op, uint8_t *, session->iv.offset);
2268c05adb06SRavi Kumar 	switch (session->cipher.um.des_mode) {
2269c05adb06SRavi Kumar 	case CCP_DES_MODE_CBC:
2270c05adb06SRavi Kumar 		lsb_buf = &(b_info->lsb_buf[b_info->lsb_buf_idx*CCP_SB_BYTES]);
2271c05adb06SRavi Kumar 		b_info->lsb_buf_idx++;
2272c05adb06SRavi Kumar 
2273c05adb06SRavi Kumar 		rte_memcpy(lsb_buf + (CCP_SB_BYTES - session->iv.length),
2274c05adb06SRavi Kumar 			   iv, session->iv.length);
22759631fb8fSDavid Marchand 		pst.src_addr = (phys_addr_t)rte_mem_virt2iova((void *) lsb_buf);
2276c05adb06SRavi Kumar 		pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2277c05adb06SRavi Kumar 		pst.len = CCP_SB_BYTES;
2278c05adb06SRavi Kumar 		pst.dir = 1;
2279c05adb06SRavi Kumar 		pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2280c05adb06SRavi Kumar 		pst.byte_swap = CCP_PASSTHRU_BYTESWAP_256BIT;
2281c05adb06SRavi Kumar 		ccp_perform_passthru(&pst, cmd_q);
2282c05adb06SRavi Kumar 		break;
2283c05adb06SRavi Kumar 	case CCP_DES_MODE_CFB:
2284c05adb06SRavi Kumar 	case CCP_DES_MODE_ECB:
2285c05adb06SRavi Kumar 		CCP_LOG_ERR("Unsupported DES cipher mode");
2286c05adb06SRavi Kumar 		return -ENOTSUP;
2287c05adb06SRavi Kumar 	}
2288c05adb06SRavi Kumar 
2289ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
2290c05adb06SRavi Kumar 					      op->sym->cipher.data.offset);
2291c05adb06SRavi Kumar 	if (unlikely(op->sym->m_dst != NULL))
2292c05adb06SRavi Kumar 		dest_addr =
2293ce627d63SThomas Monjalon 			rte_pktmbuf_iova_offset(op->sym->m_dst,
2294c05adb06SRavi Kumar 						   op->sym->cipher.data.offset);
2295c05adb06SRavi Kumar 	else
2296c05adb06SRavi Kumar 		dest_addr = src_addr;
2297c05adb06SRavi Kumar 
229809a0fd73SAmaranath Somalapuram 	key_addr = rte_mem_virt2iova(session->cipher.key_ccp);
2299c05adb06SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
2300c05adb06SRavi Kumar 
2301c05adb06SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
2302c05adb06SRavi Kumar 
2303c05adb06SRavi Kumar 	/* prepare desc for des command */
2304c05adb06SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_3DES;
2305c05adb06SRavi Kumar 
2306c05adb06SRavi Kumar 	CCP_CMD_SOC(desc) = 0;
2307c05adb06SRavi Kumar 	CCP_CMD_IOC(desc) = 0;
2308c05adb06SRavi Kumar 	CCP_CMD_INIT(desc) = 1;
2309c05adb06SRavi Kumar 	CCP_CMD_EOM(desc) = 1;
2310c05adb06SRavi Kumar 	CCP_CMD_PROT(desc) = 0;
2311c05adb06SRavi Kumar 
2312c05adb06SRavi Kumar 	function.raw = 0;
2313c05adb06SRavi Kumar 	CCP_DES_ENCRYPT(&function) = session->cipher.dir;
2314c05adb06SRavi Kumar 	CCP_DES_MODE(&function) = session->cipher.um.des_mode;
2315c05adb06SRavi Kumar 	CCP_DES_TYPE(&function) = session->cipher.ut.des_type;
2316c05adb06SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
2317c05adb06SRavi Kumar 
2318c05adb06SRavi Kumar 	CCP_CMD_LEN(desc) = op->sym->cipher.data.length;
2319c05adb06SRavi Kumar 
2320c05adb06SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
2321c05adb06SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
2322c05adb06SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2323c05adb06SRavi Kumar 
2324c05adb06SRavi Kumar 	CCP_CMD_DST_LO(desc) = ((uint32_t)dest_addr);
2325c05adb06SRavi Kumar 	CCP_CMD_DST_HI(desc) = high32_value(dest_addr);
2326c05adb06SRavi Kumar 	CCP_CMD_DST_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2327c05adb06SRavi Kumar 
2328c05adb06SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2329c05adb06SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2330c05adb06SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2331c05adb06SRavi Kumar 
2332c05adb06SRavi Kumar 	if (session->cipher.um.des_mode)
2333c05adb06SRavi Kumar 		CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2334c05adb06SRavi Kumar 
2335c05adb06SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2336c05adb06SRavi Kumar 
2337c05adb06SRavi Kumar 	rte_wmb();
2338c05adb06SRavi Kumar 
2339c05adb06SRavi Kumar 	/* Write the new tail address back to the queue register */
2340c05adb06SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
2341c05adb06SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
2342c05adb06SRavi Kumar 	/* Turn the queue back on using our cached control register */
2343c05adb06SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
2344c05adb06SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
2345c05adb06SRavi Kumar 
2346c05adb06SRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
2347c05adb06SRavi Kumar 	return 0;
2348c05adb06SRavi Kumar }
2349c05adb06SRavi Kumar 
2350afc53459SRavi Kumar static int
ccp_perform_aes_gcm(struct rte_crypto_op * op,struct ccp_queue * cmd_q)2351afc53459SRavi Kumar ccp_perform_aes_gcm(struct rte_crypto_op *op, struct ccp_queue *cmd_q)
2352afc53459SRavi Kumar {
2353afc53459SRavi Kumar 	struct ccp_session *session;
2354afc53459SRavi Kumar 	union ccp_function function;
2355afc53459SRavi Kumar 	uint8_t *iv;
2356afc53459SRavi Kumar 	struct ccp_passthru pst;
2357afc53459SRavi Kumar 	struct ccp_desc *desc;
2358afc53459SRavi Kumar 	uint32_t tail;
2359afc53459SRavi Kumar 	uint64_t *temp;
2360afc53459SRavi Kumar 	phys_addr_t src_addr, dest_addr, key_addr, aad_addr;
2361afc53459SRavi Kumar 	phys_addr_t digest_dest_addr;
2362afc53459SRavi Kumar 	int length, non_align_len;
2363afc53459SRavi Kumar 
23642a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
2365afc53459SRavi Kumar 	iv = rte_crypto_op_ctod_offset(op, uint8_t *, session->iv.offset);
2366afc53459SRavi Kumar 	key_addr = session->cipher.key_phys;
2367afc53459SRavi Kumar 
2368ce627d63SThomas Monjalon 	src_addr = rte_pktmbuf_iova_offset(op->sym->m_src,
2369afc53459SRavi Kumar 					      op->sym->aead.data.offset);
2370afc53459SRavi Kumar 	if (unlikely(op->sym->m_dst != NULL))
2371ce627d63SThomas Monjalon 		dest_addr = rte_pktmbuf_iova_offset(op->sym->m_dst,
2372afc53459SRavi Kumar 						op->sym->aead.data.offset);
2373afc53459SRavi Kumar 	else
2374afc53459SRavi Kumar 		dest_addr = src_addr;
2375afc53459SRavi Kumar 	rte_pktmbuf_append(op->sym->m_src, session->auth.ctx_len);
2376afc53459SRavi Kumar 	digest_dest_addr = op->sym->aead.digest.phys_addr;
2377afc53459SRavi Kumar 	temp = (uint64_t *)(op->sym->aead.digest.data + AES_BLOCK_SIZE);
2378afc53459SRavi Kumar 	*temp++ = rte_bswap64(session->auth.aad_length << 3);
2379afc53459SRavi Kumar 	*temp = rte_bswap64(op->sym->aead.data.length << 3);
2380afc53459SRavi Kumar 
2381afc53459SRavi Kumar 	non_align_len = op->sym->aead.data.length % AES_BLOCK_SIZE;
2382afc53459SRavi Kumar 	length = CCP_ALIGN(op->sym->aead.data.length, AES_BLOCK_SIZE);
2383afc53459SRavi Kumar 
2384afc53459SRavi Kumar 	aad_addr = op->sym->aead.aad.phys_addr;
2385afc53459SRavi Kumar 
2386afc53459SRavi Kumar 	/* CMD1 IV Passthru */
2387afc53459SRavi Kumar 	rte_memcpy(session->cipher.nonce + AES_BLOCK_SIZE, iv,
2388afc53459SRavi Kumar 		   session->iv.length);
2389afc53459SRavi Kumar 	pst.src_addr = session->cipher.nonce_phys;
2390afc53459SRavi Kumar 	pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2391afc53459SRavi Kumar 	pst.len = CCP_SB_BYTES;
2392afc53459SRavi Kumar 	pst.dir = 1;
2393afc53459SRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2394afc53459SRavi Kumar 	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
2395afc53459SRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
2396afc53459SRavi Kumar 
2397afc53459SRavi Kumar 	/* CMD2 GHASH-AAD */
2398afc53459SRavi Kumar 	function.raw = 0;
2399afc53459SRavi Kumar 	CCP_AES_ENCRYPT(&function) = CCP_AES_MODE_GHASH_AAD;
2400afc53459SRavi Kumar 	CCP_AES_MODE(&function) = CCP_AES_MODE_GHASH;
2401afc53459SRavi Kumar 	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
2402afc53459SRavi Kumar 
2403afc53459SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
2404afc53459SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
2405afc53459SRavi Kumar 
2406afc53459SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2407afc53459SRavi Kumar 	CCP_CMD_INIT(desc) = 1;
2408afc53459SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
2409afc53459SRavi Kumar 
2410afc53459SRavi Kumar 	CCP_CMD_LEN(desc) = session->auth.aad_length;
2411afc53459SRavi Kumar 
2412afc53459SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)aad_addr);
2413afc53459SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(aad_addr);
2414afc53459SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2415afc53459SRavi Kumar 
2416afc53459SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2417afc53459SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2418afc53459SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2419afc53459SRavi Kumar 
2420afc53459SRavi Kumar 	CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2421afc53459SRavi Kumar 
2422afc53459SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2423afc53459SRavi Kumar 	rte_wmb();
2424afc53459SRavi Kumar 
2425afc53459SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
2426afc53459SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
2427afc53459SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
2428afc53459SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
2429afc53459SRavi Kumar 
2430afc53459SRavi Kumar 	/* CMD3 : GCTR Plain text */
2431afc53459SRavi Kumar 	function.raw = 0;
2432afc53459SRavi Kumar 	CCP_AES_ENCRYPT(&function) = session->cipher.dir;
2433afc53459SRavi Kumar 	CCP_AES_MODE(&function) = CCP_AES_MODE_GCTR;
2434afc53459SRavi Kumar 	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
2435afc53459SRavi Kumar 	if (non_align_len == 0)
2436afc53459SRavi Kumar 		CCP_AES_SIZE(&function) = (AES_BLOCK_SIZE << 3) - 1;
2437afc53459SRavi Kumar 	else
2438afc53459SRavi Kumar 		CCP_AES_SIZE(&function) = (non_align_len << 3) - 1;
2439afc53459SRavi Kumar 
2440afc53459SRavi Kumar 
2441afc53459SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
2442afc53459SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
2443afc53459SRavi Kumar 
2444afc53459SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2445afc53459SRavi Kumar 	CCP_CMD_EOM(desc) = 1;
2446afc53459SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
2447afc53459SRavi Kumar 
2448afc53459SRavi Kumar 	CCP_CMD_LEN(desc) = length;
2449afc53459SRavi Kumar 
2450afc53459SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
2451afc53459SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
2452afc53459SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2453afc53459SRavi Kumar 
2454afc53459SRavi Kumar 	CCP_CMD_DST_LO(desc) = ((uint32_t)dest_addr);
2455afc53459SRavi Kumar 	CCP_CMD_DST_HI(desc) = high32_value(dest_addr);
2456afc53459SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2457afc53459SRavi Kumar 
2458afc53459SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2459afc53459SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2460afc53459SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2461afc53459SRavi Kumar 
2462afc53459SRavi Kumar 	CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2463afc53459SRavi Kumar 
2464afc53459SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2465afc53459SRavi Kumar 	rte_wmb();
2466afc53459SRavi Kumar 
2467afc53459SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
2468afc53459SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
2469afc53459SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
2470afc53459SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
2471afc53459SRavi Kumar 
2472afc53459SRavi Kumar 	/* CMD4 : PT to copy IV */
2473afc53459SRavi Kumar 	pst.src_addr = session->cipher.nonce_phys;
2474afc53459SRavi Kumar 	pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
2475afc53459SRavi Kumar 	pst.len = AES_BLOCK_SIZE;
2476afc53459SRavi Kumar 	pst.dir = 1;
2477afc53459SRavi Kumar 	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
2478afc53459SRavi Kumar 	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
2479afc53459SRavi Kumar 	ccp_perform_passthru(&pst, cmd_q);
2480afc53459SRavi Kumar 
2481afc53459SRavi Kumar 	/* CMD5 : GHASH-Final */
2482afc53459SRavi Kumar 	function.raw = 0;
2483afc53459SRavi Kumar 	CCP_AES_ENCRYPT(&function) = CCP_AES_MODE_GHASH_FINAL;
2484afc53459SRavi Kumar 	CCP_AES_MODE(&function) = CCP_AES_MODE_GHASH;
2485afc53459SRavi Kumar 	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
2486afc53459SRavi Kumar 
2487afc53459SRavi Kumar 	desc = &cmd_q->qbase_desc[cmd_q->qidx];
2488afc53459SRavi Kumar 	memset(desc, 0, Q_DESC_SIZE);
2489afc53459SRavi Kumar 
2490afc53459SRavi Kumar 	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
2491afc53459SRavi Kumar 	CCP_CMD_FUNCTION(desc) = function.raw;
2492afc53459SRavi Kumar 	/* Last block (AAD_len || PT_len)*/
2493afc53459SRavi Kumar 	CCP_CMD_LEN(desc) = AES_BLOCK_SIZE;
2494afc53459SRavi Kumar 
2495afc53459SRavi Kumar 	CCP_CMD_SRC_LO(desc) = ((uint32_t)digest_dest_addr + AES_BLOCK_SIZE);
2496afc53459SRavi Kumar 	CCP_CMD_SRC_HI(desc) = high32_value(digest_dest_addr + AES_BLOCK_SIZE);
2497afc53459SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2498afc53459SRavi Kumar 
2499afc53459SRavi Kumar 	CCP_CMD_DST_LO(desc) = ((uint32_t)digest_dest_addr);
2500afc53459SRavi Kumar 	CCP_CMD_DST_HI(desc) = high32_value(digest_dest_addr);
2501afc53459SRavi Kumar 	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2502afc53459SRavi Kumar 
2503afc53459SRavi Kumar 	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
2504afc53459SRavi Kumar 	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
2505afc53459SRavi Kumar 	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
2506afc53459SRavi Kumar 
2507afc53459SRavi Kumar 	CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
2508afc53459SRavi Kumar 
2509afc53459SRavi Kumar 	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
2510afc53459SRavi Kumar 	rte_wmb();
2511afc53459SRavi Kumar 
2512afc53459SRavi Kumar 	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
2513afc53459SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
2514afc53459SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
2515afc53459SRavi Kumar 		      cmd_q->qcontrol | CMD_Q_RUN);
2516afc53459SRavi Kumar 
2517afc53459SRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
2518afc53459SRavi Kumar 	return 0;
2519afc53459SRavi Kumar }
2520afc53459SRavi Kumar 
252170f0f8a8SRavi Kumar static inline int
ccp_crypto_cipher(struct rte_crypto_op * op,struct ccp_queue * cmd_q,struct ccp_batch_info * b_info)252270f0f8a8SRavi Kumar ccp_crypto_cipher(struct rte_crypto_op *op,
2523d9a9e561SRavi Kumar 		  struct ccp_queue *cmd_q,
2524d9a9e561SRavi Kumar 		  struct ccp_batch_info *b_info)
252570f0f8a8SRavi Kumar {
252670f0f8a8SRavi Kumar 	int result = 0;
252770f0f8a8SRavi Kumar 	struct ccp_session *session;
252870f0f8a8SRavi Kumar 
25292a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
253070f0f8a8SRavi Kumar 
253170f0f8a8SRavi Kumar 	switch (session->cipher.algo) {
2532d9a9e561SRavi Kumar 	case CCP_CIPHER_ALGO_AES_CBC:
2533d9a9e561SRavi Kumar 		result = ccp_perform_aes(op, cmd_q, b_info);
2534d9a9e561SRavi Kumar 		b_info->desccnt += 2;
2535d9a9e561SRavi Kumar 		break;
2536d9a9e561SRavi Kumar 	case CCP_CIPHER_ALGO_AES_CTR:
2537d9a9e561SRavi Kumar 		result = ccp_perform_aes(op, cmd_q, b_info);
2538d9a9e561SRavi Kumar 		b_info->desccnt += 2;
2539d9a9e561SRavi Kumar 		break;
2540d9a9e561SRavi Kumar 	case CCP_CIPHER_ALGO_AES_ECB:
2541d9a9e561SRavi Kumar 		result = ccp_perform_aes(op, cmd_q, b_info);
2542d9a9e561SRavi Kumar 		b_info->desccnt += 1;
2543d9a9e561SRavi Kumar 		break;
2544c05adb06SRavi Kumar 	case CCP_CIPHER_ALGO_3DES_CBC:
2545c05adb06SRavi Kumar 		result = ccp_perform_3des(op, cmd_q, b_info);
2546c05adb06SRavi Kumar 		b_info->desccnt += 2;
2547c05adb06SRavi Kumar 		break;
254870f0f8a8SRavi Kumar 	default:
254970f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported cipher algo %d",
255070f0f8a8SRavi Kumar 			    session->cipher.algo);
255170f0f8a8SRavi Kumar 		return -ENOTSUP;
255270f0f8a8SRavi Kumar 	}
255370f0f8a8SRavi Kumar 	return result;
255470f0f8a8SRavi Kumar }
255570f0f8a8SRavi Kumar 
255670f0f8a8SRavi Kumar static inline int
ccp_crypto_auth(struct rte_crypto_op * op,struct ccp_queue * cmd_q,struct ccp_batch_info * b_info)255770f0f8a8SRavi Kumar ccp_crypto_auth(struct rte_crypto_op *op,
2558687ae11fSRavi Kumar 		struct ccp_queue *cmd_q,
2559687ae11fSRavi Kumar 		struct ccp_batch_info *b_info)
256070f0f8a8SRavi Kumar {
256170f0f8a8SRavi Kumar 
256270f0f8a8SRavi Kumar 	int result = 0;
256370f0f8a8SRavi Kumar 	struct ccp_session *session;
256470f0f8a8SRavi Kumar 
25652a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
256670f0f8a8SRavi Kumar 
256770f0f8a8SRavi Kumar 	switch (session->auth.algo) {
25680c6a81efSRavi Kumar 	case CCP_AUTH_ALGO_SHA1:
2569ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA224:
2570ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA256:
2571ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA384:
2572ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA512:
25730c6a81efSRavi Kumar 		result = ccp_perform_sha(op, cmd_q);
25740c6a81efSRavi Kumar 		b_info->desccnt += 3;
25750c6a81efSRavi Kumar 		break;
25766c561b03SRavi Kumar 	case CCP_AUTH_ALGO_MD5_HMAC:
2577e0d88a39SRavi Kumar 		if (session->auth_opt == 0)
2578e0d88a39SRavi Kumar 			result = -1;
25796c561b03SRavi Kumar 		break;
25800c6a81efSRavi Kumar 	case CCP_AUTH_ALGO_SHA1_HMAC:
2581ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA224_HMAC:
2582ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA256_HMAC:
2583e0d88a39SRavi Kumar 		if (session->auth_opt == 0) {
25840c6a81efSRavi Kumar 			result = ccp_perform_hmac(op, cmd_q);
25850c6a81efSRavi Kumar 			b_info->desccnt += 6;
2586e0d88a39SRavi Kumar 		}
25870c6a81efSRavi Kumar 		break;
2588ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA384_HMAC:
2589ca40ea24SRavi Kumar 	case CCP_AUTH_ALGO_SHA512_HMAC:
2590e0d88a39SRavi Kumar 		if (session->auth_opt == 0) {
2591ca40ea24SRavi Kumar 			result = ccp_perform_hmac(op, cmd_q);
2592ca40ea24SRavi Kumar 			b_info->desccnt += 7;
2593e0d88a39SRavi Kumar 		}
2594ca40ea24SRavi Kumar 		break;
25951df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_224:
25961df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_256:
25971df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_384:
25981df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_512:
25991df800f8SRavi Kumar 		result = ccp_perform_sha3(op, cmd_q);
26001df800f8SRavi Kumar 		b_info->desccnt += 1;
26011df800f8SRavi Kumar 		break;
26021df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_224_HMAC:
26031df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_256_HMAC:
26041df800f8SRavi Kumar 		result = ccp_perform_sha3_hmac(op, cmd_q);
26051df800f8SRavi Kumar 		b_info->desccnt += 3;
26061df800f8SRavi Kumar 		break;
26071df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_384_HMAC:
26081df800f8SRavi Kumar 	case CCP_AUTH_ALGO_SHA3_512_HMAC:
26091df800f8SRavi Kumar 		result = ccp_perform_sha3_hmac(op, cmd_q);
26101df800f8SRavi Kumar 		b_info->desccnt += 4;
26111df800f8SRavi Kumar 		break;
2612687ae11fSRavi Kumar 	case CCP_AUTH_ALGO_AES_CMAC:
2613687ae11fSRavi Kumar 		result = ccp_perform_aes_cmac(op, cmd_q);
2614687ae11fSRavi Kumar 		b_info->desccnt += 4;
2615687ae11fSRavi Kumar 		break;
261670f0f8a8SRavi Kumar 	default:
261770f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported auth algo %d",
261870f0f8a8SRavi Kumar 			    session->auth.algo);
261970f0f8a8SRavi Kumar 		return -ENOTSUP;
262070f0f8a8SRavi Kumar 	}
262170f0f8a8SRavi Kumar 
262270f0f8a8SRavi Kumar 	return result;
262370f0f8a8SRavi Kumar }
262470f0f8a8SRavi Kumar 
262570f0f8a8SRavi Kumar static inline int
ccp_crypto_aead(struct rte_crypto_op * op,struct ccp_queue * cmd_q,struct ccp_batch_info * b_info)262670f0f8a8SRavi Kumar ccp_crypto_aead(struct rte_crypto_op *op,
2627afc53459SRavi Kumar 		struct ccp_queue *cmd_q,
2628afc53459SRavi Kumar 		struct ccp_batch_info *b_info)
262970f0f8a8SRavi Kumar {
263070f0f8a8SRavi Kumar 	int result = 0;
263170f0f8a8SRavi Kumar 	struct ccp_session *session;
263270f0f8a8SRavi Kumar 
26332a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
263470f0f8a8SRavi Kumar 
2635afc53459SRavi Kumar 	switch (session->auth.algo) {
2636afc53459SRavi Kumar 	case CCP_AUTH_ALGO_AES_GCM:
2637afc53459SRavi Kumar 		if (session->cipher.algo != CCP_CIPHER_ALGO_AES_GCM) {
2638afc53459SRavi Kumar 			CCP_LOG_ERR("Incorrect chain order");
2639afc53459SRavi Kumar 			return -1;
2640afc53459SRavi Kumar 		}
2641afc53459SRavi Kumar 		result = ccp_perform_aes_gcm(op, cmd_q);
2642afc53459SRavi Kumar 		b_info->desccnt += 5;
2643afc53459SRavi Kumar 		break;
264470f0f8a8SRavi Kumar 	default:
264570f0f8a8SRavi Kumar 		CCP_LOG_ERR("Unsupported aead algo %d",
264670f0f8a8SRavi Kumar 			    session->aead_algo);
264770f0f8a8SRavi Kumar 		return -ENOTSUP;
264870f0f8a8SRavi Kumar 	}
264970f0f8a8SRavi Kumar 	return result;
265070f0f8a8SRavi Kumar }
265170f0f8a8SRavi Kumar 
265270f0f8a8SRavi Kumar int
process_ops_to_enqueue(struct ccp_qp * qp,struct rte_crypto_op ** op,struct ccp_queue * cmd_q,uint16_t nb_ops,uint16_t total_nb_ops,int slots_req,uint16_t b_idx)26536c561b03SRavi Kumar process_ops_to_enqueue(struct ccp_qp *qp,
265470f0f8a8SRavi Kumar 		       struct rte_crypto_op **op,
265570f0f8a8SRavi Kumar 		       struct ccp_queue *cmd_q,
265670f0f8a8SRavi Kumar 		       uint16_t nb_ops,
265772775857SAmaranath Somalapuram 		       uint16_t total_nb_ops,
265872775857SAmaranath Somalapuram 		       int slots_req,
265972775857SAmaranath Somalapuram 		       uint16_t b_idx)
266070f0f8a8SRavi Kumar {
266170f0f8a8SRavi Kumar 	int i, result = 0;
266270f0f8a8SRavi Kumar 	struct ccp_batch_info *b_info;
266370f0f8a8SRavi Kumar 	struct ccp_session *session;
26646c561b03SRavi Kumar 	EVP_MD_CTX *auth_ctx = NULL;
266570f0f8a8SRavi Kumar 
266670f0f8a8SRavi Kumar 	if (rte_mempool_get(qp->batch_mp, (void **)&b_info)) {
266770f0f8a8SRavi Kumar 		CCP_LOG_ERR("batch info allocation failed");
266870f0f8a8SRavi Kumar 		return 0;
266970f0f8a8SRavi Kumar 	}
2670e0d88a39SRavi Kumar 
26716c561b03SRavi Kumar 	auth_ctx = EVP_MD_CTX_create();
26726c561b03SRavi Kumar 	if (unlikely(!auth_ctx)) {
26736c561b03SRavi Kumar 		CCP_LOG_ERR("Unable to create auth ctx");
26746c561b03SRavi Kumar 		return 0;
26756c561b03SRavi Kumar 	}
26766c561b03SRavi Kumar 	b_info->auth_ctr = 0;
2677e0d88a39SRavi Kumar 
267870f0f8a8SRavi Kumar 	/* populate batch info necessary for dequeue */
267970f0f8a8SRavi Kumar 	b_info->op_idx = 0;
268072775857SAmaranath Somalapuram 	b_info->b_idx = 0;
268170f0f8a8SRavi Kumar 	b_info->lsb_buf_idx = 0;
268270f0f8a8SRavi Kumar 	b_info->desccnt = 0;
268370f0f8a8SRavi Kumar 	b_info->cmd_q = cmd_q;
26849631fb8fSDavid Marchand 	b_info->lsb_buf_phys = (phys_addr_t)rte_mem_virt2iova((void *)b_info->lsb_buf);
268509a0fd73SAmaranath Somalapuram 
268670f0f8a8SRavi Kumar 	rte_atomic64_sub(&b_info->cmd_q->free_slots, slots_req);
268770f0f8a8SRavi Kumar 
268870f0f8a8SRavi Kumar 	b_info->head_offset = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx *
268970f0f8a8SRavi Kumar 					 Q_DESC_SIZE);
269072775857SAmaranath Somalapuram 	for (i = b_idx; i < (nb_ops+b_idx); i++) {
26912a440d6aSAkhil Goyal 		session = CRYPTODEV_GET_SYM_SESS_PRIV(op[i]->sym->session);
269270f0f8a8SRavi Kumar 		switch (session->cmd_id) {
269370f0f8a8SRavi Kumar 		case CCP_CMD_CIPHER:
269470f0f8a8SRavi Kumar 			result = ccp_crypto_cipher(op[i], cmd_q, b_info);
269570f0f8a8SRavi Kumar 			break;
269670f0f8a8SRavi Kumar 		case CCP_CMD_AUTH:
2697e0d88a39SRavi Kumar 			if (session->auth_opt) {
26986c561b03SRavi Kumar 				b_info->auth_ctr++;
26996c561b03SRavi Kumar 				result = cpu_crypto_auth(qp, op[i],
27006c561b03SRavi Kumar 							 session, auth_ctx);
2701e0d88a39SRavi Kumar 			} else
2702e0d88a39SRavi Kumar 				result = ccp_crypto_auth(op[i], cmd_q, b_info);
270370f0f8a8SRavi Kumar 			break;
270470f0f8a8SRavi Kumar 		case CCP_CMD_CIPHER_HASH:
270570f0f8a8SRavi Kumar 			result = ccp_crypto_cipher(op[i], cmd_q, b_info);
270670f0f8a8SRavi Kumar 			if (result)
270770f0f8a8SRavi Kumar 				break;
270870f0f8a8SRavi Kumar 			result = ccp_crypto_auth(op[i], cmd_q, b_info);
270970f0f8a8SRavi Kumar 			break;
271070f0f8a8SRavi Kumar 		case CCP_CMD_HASH_CIPHER:
2711e0d88a39SRavi Kumar 			if (session->auth_opt) {
27126c561b03SRavi Kumar 				result = cpu_crypto_auth(qp, op[i],
27136c561b03SRavi Kumar 							 session, auth_ctx);
2714e0d88a39SRavi Kumar 				if (op[i]->status !=
2715e0d88a39SRavi Kumar 				    RTE_CRYPTO_OP_STATUS_SUCCESS)
2716b3d1a3c6SAmaranath Somalapuram 					CCP_LOG_ERR("RTE_CRYPTO_OP_STATUS_AUTH_FAILED");
2717e0d88a39SRavi Kumar 			} else
2718e0d88a39SRavi Kumar 				result = ccp_crypto_auth(op[i], cmd_q, b_info);
2719e0d88a39SRavi Kumar 
272070f0f8a8SRavi Kumar 			if (result)
272170f0f8a8SRavi Kumar 				break;
272270f0f8a8SRavi Kumar 			result = ccp_crypto_cipher(op[i], cmd_q, b_info);
272370f0f8a8SRavi Kumar 			break;
272470f0f8a8SRavi Kumar 		case CCP_CMD_COMBINED:
272570f0f8a8SRavi Kumar 			result = ccp_crypto_aead(op[i], cmd_q, b_info);
272670f0f8a8SRavi Kumar 			break;
272770f0f8a8SRavi Kumar 		default:
272870f0f8a8SRavi Kumar 			CCP_LOG_ERR("Unsupported cmd_id");
272970f0f8a8SRavi Kumar 			result = -1;
273070f0f8a8SRavi Kumar 		}
273170f0f8a8SRavi Kumar 		if (unlikely(result < 0)) {
273270f0f8a8SRavi Kumar 			rte_atomic64_add(&b_info->cmd_q->free_slots,
273370f0f8a8SRavi Kumar 					 (slots_req - b_info->desccnt));
273470f0f8a8SRavi Kumar 			break;
273570f0f8a8SRavi Kumar 		}
273670f0f8a8SRavi Kumar 		b_info->op[i] = op[i];
273770f0f8a8SRavi Kumar 	}
273870f0f8a8SRavi Kumar 
273970f0f8a8SRavi Kumar 	b_info->opcnt = i;
274072775857SAmaranath Somalapuram 	b_info->b_idx = b_idx;
274172775857SAmaranath Somalapuram 	b_info->total_nb_ops = total_nb_ops;
274270f0f8a8SRavi Kumar 	b_info->tail_offset = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx *
274370f0f8a8SRavi Kumar 					 Q_DESC_SIZE);
274470f0f8a8SRavi Kumar 
274570f0f8a8SRavi Kumar 	rte_wmb();
274670f0f8a8SRavi Kumar 	/* Write the new tail address back to the queue register */
274770f0f8a8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE,
274870f0f8a8SRavi Kumar 			      b_info->tail_offset);
274970f0f8a8SRavi Kumar 	/* Turn the queue back on using our cached control register */
275070f0f8a8SRavi Kumar 	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
275170f0f8a8SRavi Kumar 			      cmd_q->qcontrol | CMD_Q_RUN);
275270f0f8a8SRavi Kumar 
275370f0f8a8SRavi Kumar 	rte_ring_enqueue(qp->processed_pkts, (void *)b_info);
275470f0f8a8SRavi Kumar 
27556c561b03SRavi Kumar 	EVP_MD_CTX_destroy(auth_ctx);
275672775857SAmaranath Somalapuram 	return i-b_idx;
275770f0f8a8SRavi Kumar }
275870f0f8a8SRavi Kumar 
ccp_auth_dq_prepare(struct rte_crypto_op * op)275970f0f8a8SRavi Kumar static inline void ccp_auth_dq_prepare(struct rte_crypto_op *op)
276070f0f8a8SRavi Kumar {
276170f0f8a8SRavi Kumar 	struct ccp_session *session;
276270f0f8a8SRavi Kumar 	uint8_t *digest_data, *addr;
276370f0f8a8SRavi Kumar 	struct rte_mbuf *m_last;
276470f0f8a8SRavi Kumar 	int offset, digest_offset;
276570f0f8a8SRavi Kumar 	uint8_t digest_le[64];
276670f0f8a8SRavi Kumar 
27672a440d6aSAkhil Goyal 	session = CRYPTODEV_GET_SYM_SESS_PRIV(op->sym->session);
276870f0f8a8SRavi Kumar 
276970f0f8a8SRavi Kumar 	if (session->cmd_id == CCP_CMD_COMBINED) {
277070f0f8a8SRavi Kumar 		digest_data = op->sym->aead.digest.data;
277170f0f8a8SRavi Kumar 		digest_offset = op->sym->aead.data.offset +
277270f0f8a8SRavi Kumar 					op->sym->aead.data.length;
277370f0f8a8SRavi Kumar 	} else {
277470f0f8a8SRavi Kumar 		digest_data = op->sym->auth.digest.data;
277570f0f8a8SRavi Kumar 		digest_offset = op->sym->auth.data.offset +
277670f0f8a8SRavi Kumar 					op->sym->auth.data.length;
277770f0f8a8SRavi Kumar 	}
277870f0f8a8SRavi Kumar 	m_last = rte_pktmbuf_lastseg(op->sym->m_src);
277970f0f8a8SRavi Kumar 	addr = (uint8_t *)((char *)m_last->buf_addr + m_last->data_off +
278070f0f8a8SRavi Kumar 			   m_last->data_len - session->auth.ctx_len);
278170f0f8a8SRavi Kumar 
278270f0f8a8SRavi Kumar 	rte_mb();
278370f0f8a8SRavi Kumar 	offset = session->auth.offset;
278470f0f8a8SRavi Kumar 
278570f0f8a8SRavi Kumar 	if (session->auth.engine == CCP_ENGINE_SHA)
278670f0f8a8SRavi Kumar 		if ((session->auth.ut.sha_type != CCP_SHA_TYPE_1) &&
278770f0f8a8SRavi Kumar 		    (session->auth.ut.sha_type != CCP_SHA_TYPE_224) &&
278870f0f8a8SRavi Kumar 		    (session->auth.ut.sha_type != CCP_SHA_TYPE_256)) {
278970f0f8a8SRavi Kumar 			/* All other algorithms require byte
279070f0f8a8SRavi Kumar 			 * swap done by host
279170f0f8a8SRavi Kumar 			 */
279270f0f8a8SRavi Kumar 			unsigned int i;
279370f0f8a8SRavi Kumar 
279470f0f8a8SRavi Kumar 			offset = session->auth.ctx_len -
279570f0f8a8SRavi Kumar 				session->auth.offset - 1;
279670f0f8a8SRavi Kumar 			for (i = 0; i < session->auth.digest_length; i++)
279770f0f8a8SRavi Kumar 				digest_le[i] = addr[offset - i];
279870f0f8a8SRavi Kumar 			offset = 0;
279970f0f8a8SRavi Kumar 			addr = digest_le;
280070f0f8a8SRavi Kumar 		}
280170f0f8a8SRavi Kumar 
280270f0f8a8SRavi Kumar 	op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
280370f0f8a8SRavi Kumar 	if (session->auth.op == CCP_AUTH_OP_VERIFY) {
280470f0f8a8SRavi Kumar 		if (memcmp(addr + offset, digest_data,
280570f0f8a8SRavi Kumar 			   session->auth.digest_length) != 0)
280670f0f8a8SRavi Kumar 			op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
280770f0f8a8SRavi Kumar 
280870f0f8a8SRavi Kumar 	} else {
280970f0f8a8SRavi Kumar 		if (unlikely(digest_data == 0))
281070f0f8a8SRavi Kumar 			digest_data = rte_pktmbuf_mtod_offset(
281170f0f8a8SRavi Kumar 					op->sym->m_dst, uint8_t *,
281270f0f8a8SRavi Kumar 					digest_offset);
281370f0f8a8SRavi Kumar 		rte_memcpy(digest_data, addr + offset,
281470f0f8a8SRavi Kumar 			   session->auth.digest_length);
281570f0f8a8SRavi Kumar 	}
281670f0f8a8SRavi Kumar 	/* Trim area used for digest from mbuf. */
281770f0f8a8SRavi Kumar 	rte_pktmbuf_trim(op->sym->m_src,
281870f0f8a8SRavi Kumar 			 session->auth.ctx_len);
281970f0f8a8SRavi Kumar }
282070f0f8a8SRavi Kumar 
282170f0f8a8SRavi Kumar static int
ccp_prepare_ops(struct ccp_qp * qp,struct rte_crypto_op ** op_d,struct ccp_batch_info * b_info,uint16_t nb_ops)28226c561b03SRavi Kumar ccp_prepare_ops(struct ccp_qp *qp,
28236c561b03SRavi Kumar 		struct rte_crypto_op **op_d,
282470f0f8a8SRavi Kumar 		struct ccp_batch_info *b_info,
282570f0f8a8SRavi Kumar 		uint16_t nb_ops)
282670f0f8a8SRavi Kumar {
282770f0f8a8SRavi Kumar 	int i, min_ops;
282870f0f8a8SRavi Kumar 	struct ccp_session *session;
282970f0f8a8SRavi Kumar 
28306c561b03SRavi Kumar 	EVP_MD_CTX *auth_ctx = NULL;
28316c561b03SRavi Kumar 
28326c561b03SRavi Kumar 	auth_ctx = EVP_MD_CTX_create();
28336c561b03SRavi Kumar 	if (unlikely(!auth_ctx)) {
28346c561b03SRavi Kumar 		CCP_LOG_ERR("Unable to create auth ctx");
28356c561b03SRavi Kumar 		return 0;
28366c561b03SRavi Kumar 	}
283770f0f8a8SRavi Kumar 	min_ops = RTE_MIN(nb_ops, b_info->opcnt);
283870f0f8a8SRavi Kumar 
283972775857SAmaranath Somalapuram 	for (i =  b_info->b_idx; i < min_ops; i++) {
284072775857SAmaranath Somalapuram 		op_d[i] = b_info->op[b_info->b_idx + b_info->op_idx++];
28412a440d6aSAkhil Goyal 		session = CRYPTODEV_GET_SYM_SESS_PRIV(op_d[i]->sym->session);
284270f0f8a8SRavi Kumar 		switch (session->cmd_id) {
284370f0f8a8SRavi Kumar 		case CCP_CMD_CIPHER:
284470f0f8a8SRavi Kumar 			op_d[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
284570f0f8a8SRavi Kumar 			break;
284670f0f8a8SRavi Kumar 		case CCP_CMD_AUTH:
2847e0d88a39SRavi Kumar 			if (session->auth_opt == 0)
28486c561b03SRavi Kumar 				ccp_auth_dq_prepare(op_d[i]);
28496c561b03SRavi Kumar 			break;
285070f0f8a8SRavi Kumar 		case CCP_CMD_CIPHER_HASH:
2851e0d88a39SRavi Kumar 			if (session->auth_opt)
28526c561b03SRavi Kumar 				cpu_crypto_auth(qp, op_d[i],
28536c561b03SRavi Kumar 						session, auth_ctx);
2854e0d88a39SRavi Kumar 			else
28556c561b03SRavi Kumar 				ccp_auth_dq_prepare(op_d[i]);
28566c561b03SRavi Kumar 			break;
285770f0f8a8SRavi Kumar 		case CCP_CMD_HASH_CIPHER:
2858e0d88a39SRavi Kumar 			if (session->auth_opt)
28596c561b03SRavi Kumar 				op_d[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
2860e0d88a39SRavi Kumar 			else
28616c561b03SRavi Kumar 				ccp_auth_dq_prepare(op_d[i]);
28626c561b03SRavi Kumar 			break;
286370f0f8a8SRavi Kumar 		case CCP_CMD_COMBINED:
286470f0f8a8SRavi Kumar 			ccp_auth_dq_prepare(op_d[i]);
286570f0f8a8SRavi Kumar 			break;
286670f0f8a8SRavi Kumar 		default:
286770f0f8a8SRavi Kumar 			CCP_LOG_ERR("Unsupported cmd_id");
286870f0f8a8SRavi Kumar 		}
286970f0f8a8SRavi Kumar 	}
287070f0f8a8SRavi Kumar 
28716c561b03SRavi Kumar 	EVP_MD_CTX_destroy(auth_ctx);
287270f0f8a8SRavi Kumar 	b_info->opcnt -= min_ops;
287370f0f8a8SRavi Kumar 	return min_ops;
287470f0f8a8SRavi Kumar }
287570f0f8a8SRavi Kumar 
287670f0f8a8SRavi Kumar int
process_ops_to_dequeue(struct ccp_qp * qp,struct rte_crypto_op ** op,uint16_t nb_ops,uint16_t * total_nb_ops)287770f0f8a8SRavi Kumar process_ops_to_dequeue(struct ccp_qp *qp,
287870f0f8a8SRavi Kumar 		       struct rte_crypto_op **op,
287972775857SAmaranath Somalapuram 		       uint16_t nb_ops,
288072775857SAmaranath Somalapuram 		       uint16_t *total_nb_ops)
288170f0f8a8SRavi Kumar {
288270f0f8a8SRavi Kumar 	struct ccp_batch_info *b_info;
288370f0f8a8SRavi Kumar 	uint32_t cur_head_offset;
288470f0f8a8SRavi Kumar 
288570f0f8a8SRavi Kumar 	if (qp->b_info != NULL) {
288670f0f8a8SRavi Kumar 		b_info = qp->b_info;
288770f0f8a8SRavi Kumar 		if (unlikely(b_info->op_idx > 0))
288870f0f8a8SRavi Kumar 			goto success;
288970f0f8a8SRavi Kumar 	} else if (rte_ring_dequeue(qp->processed_pkts,
289070f0f8a8SRavi Kumar 				    (void **)&b_info))
289170f0f8a8SRavi Kumar 		return 0;
2892e0d88a39SRavi Kumar 
28936c561b03SRavi Kumar 	if (b_info->auth_ctr == b_info->opcnt)
28946c561b03SRavi Kumar 		goto success;
289572775857SAmaranath Somalapuram 	*total_nb_ops = b_info->total_nb_ops;
289670f0f8a8SRavi Kumar 	cur_head_offset = CCP_READ_REG(b_info->cmd_q->reg_base,
289770f0f8a8SRavi Kumar 				       CMD_Q_HEAD_LO_BASE);
289870f0f8a8SRavi Kumar 
289970f0f8a8SRavi Kumar 	if (b_info->head_offset < b_info->tail_offset) {
290070f0f8a8SRavi Kumar 		if ((cur_head_offset >= b_info->head_offset) &&
290170f0f8a8SRavi Kumar 		    (cur_head_offset < b_info->tail_offset)) {
290270f0f8a8SRavi Kumar 			qp->b_info = b_info;
290370f0f8a8SRavi Kumar 			return 0;
290470f0f8a8SRavi Kumar 		}
290572775857SAmaranath Somalapuram 	} else if (b_info->tail_offset != b_info->head_offset) {
290670f0f8a8SRavi Kumar 		if ((cur_head_offset >= b_info->head_offset) ||
290770f0f8a8SRavi Kumar 		    (cur_head_offset < b_info->tail_offset)) {
290870f0f8a8SRavi Kumar 			qp->b_info = b_info;
290970f0f8a8SRavi Kumar 			return 0;
291070f0f8a8SRavi Kumar 		}
291170f0f8a8SRavi Kumar 	}
291270f0f8a8SRavi Kumar 
291370f0f8a8SRavi Kumar 
291470f0f8a8SRavi Kumar success:
291572775857SAmaranath Somalapuram 	*total_nb_ops = b_info->total_nb_ops;
29166c561b03SRavi Kumar 	nb_ops = ccp_prepare_ops(qp, op, b_info, nb_ops);
291770f0f8a8SRavi Kumar 	rte_atomic64_add(&b_info->cmd_q->free_slots, b_info->desccnt);
291870f0f8a8SRavi Kumar 	b_info->desccnt = 0;
291970f0f8a8SRavi Kumar 	if (b_info->opcnt > 0) {
292070f0f8a8SRavi Kumar 		qp->b_info = b_info;
292170f0f8a8SRavi Kumar 	} else {
292270f0f8a8SRavi Kumar 		rte_mempool_put(qp->batch_mp, (void *)b_info);
292370f0f8a8SRavi Kumar 		qp->b_info = NULL;
292470f0f8a8SRavi Kumar 	}
292570f0f8a8SRavi Kumar 
292670f0f8a8SRavi Kumar 	return nb_ops;
292770f0f8a8SRavi Kumar }
2928