1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
13 #include <rte_atomic.h>
14 #include <rte_byteorder.h>
17 #include <rte_spinlock.h>
18 #include <rte_crypto_sym.h>
19 #include <rte_cryptodev.h>
23 #define AES_BLOCK_SIZE 16
24 #define CMAC_PAD_VALUE 0x80
25 #define CTR_NONCE_SIZE 4
27 #define CCP_SHA3_CTX_SIZE 200
29 /**Macro helpers for CCP command creation*/
30 #define CCP_AES_SIZE(p) ((p)->aes.size)
31 #define CCP_AES_ENCRYPT(p) ((p)->aes.encrypt)
32 #define CCP_AES_MODE(p) ((p)->aes.mode)
33 #define CCP_AES_TYPE(p) ((p)->aes.type)
34 #define CCP_DES_ENCRYPT(p) ((p)->des.encrypt)
35 #define CCP_DES_MODE(p) ((p)->des.mode)
36 #define CCP_DES_TYPE(p) ((p)->des.type)
37 #define CCP_SHA_TYPE(p) ((p)->sha.type)
38 #define CCP_PT_BYTESWAP(p) ((p)->pt.byteswap)
39 #define CCP_PT_BITWISE(p) ((p)->pt.bitwise)
42 #define HMAC_IPAD_VALUE 0x36
43 #define HMAC_OPAD_VALUE 0x5c
45 #ifdef RTE_LIBRTE_PMD_CCP_CPU_AUTH
46 #define MD5_DIGEST_SIZE 16
47 #define MD5_BLOCK_SIZE 64
51 #define SHA_COMMON_DIGEST_SIZE 32
52 #define SHA1_DIGEST_SIZE 20
53 #define SHA1_BLOCK_SIZE 64
55 #define SHA224_DIGEST_SIZE 28
56 #define SHA224_BLOCK_SIZE 64
57 #define SHA3_224_BLOCK_SIZE 144
59 #define SHA256_DIGEST_SIZE 32
60 #define SHA256_BLOCK_SIZE 64
61 #define SHA3_256_BLOCK_SIZE 136
63 #define SHA384_DIGEST_SIZE 48
64 #define SHA384_BLOCK_SIZE 128
65 #define SHA3_384_BLOCK_SIZE 104
67 #define SHA512_DIGEST_SIZE 64
68 #define SHA512_BLOCK_SIZE 128
69 #define SHA3_512_BLOCK_SIZE 72
71 /* Maximum length for digest */
72 #define DIGEST_LENGTH_MAX 64
74 /* SHA LSB intialiazation values */
76 #define SHA1_H0 0x67452301UL
77 #define SHA1_H1 0xefcdab89UL
78 #define SHA1_H2 0x98badcfeUL
79 #define SHA1_H3 0x10325476UL
80 #define SHA1_H4 0xc3d2e1f0UL
82 #define SHA224_H0 0xc1059ed8UL
83 #define SHA224_H1 0x367cd507UL
84 #define SHA224_H2 0x3070dd17UL
85 #define SHA224_H3 0xf70e5939UL
86 #define SHA224_H4 0xffc00b31UL
87 #define SHA224_H5 0x68581511UL
88 #define SHA224_H6 0x64f98fa7UL
89 #define SHA224_H7 0xbefa4fa4UL
91 #define SHA256_H0 0x6a09e667UL
92 #define SHA256_H1 0xbb67ae85UL
93 #define SHA256_H2 0x3c6ef372UL
94 #define SHA256_H3 0xa54ff53aUL
95 #define SHA256_H4 0x510e527fUL
96 #define SHA256_H5 0x9b05688cUL
97 #define SHA256_H6 0x1f83d9abUL
98 #define SHA256_H7 0x5be0cd19UL
100 #define SHA384_H0 0xcbbb9d5dc1059ed8ULL
101 #define SHA384_H1 0x629a292a367cd507ULL
102 #define SHA384_H2 0x9159015a3070dd17ULL
103 #define SHA384_H3 0x152fecd8f70e5939ULL
104 #define SHA384_H4 0x67332667ffc00b31ULL
105 #define SHA384_H5 0x8eb44a8768581511ULL
106 #define SHA384_H6 0xdb0c2e0d64f98fa7ULL
107 #define SHA384_H7 0x47b5481dbefa4fa4ULL
109 #define SHA512_H0 0x6a09e667f3bcc908ULL
110 #define SHA512_H1 0xbb67ae8584caa73bULL
111 #define SHA512_H2 0x3c6ef372fe94f82bULL
112 #define SHA512_H3 0xa54ff53a5f1d36f1ULL
113 #define SHA512_H4 0x510e527fade682d1ULL
114 #define SHA512_H5 0x9b05688c2b3e6c1fULL
115 #define SHA512_H6 0x1f83d9abfb41bd6bULL
116 #define SHA512_H7 0x5be0cd19137e2179ULL
119 * CCP supported AES modes
122 CCP_AES_MODE_ECB = 0,
136 enum ccp_aes_ghash_mode {
137 CCP_AES_MODE_GHASH_AAD = 0,
138 CCP_AES_MODE_GHASH_FINAL
142 * CCP supported AES types
145 CCP_AES_TYPE_128 = 0,
151 /***** 3DES engine *****/
154 * CCP supported DES/3DES modes
157 CCP_DES_MODE_ECB = 0, /* Not supported */
163 * CCP supported DES types
166 CCP_DES_TYPE_128 = 0, /* 112 + 16 parity */
167 CCP_DES_TYPE_192, /* 168 + 24 parity */
171 /***** SHA engine *****/
174 * ccp_sha_type - type of SHA operation
176 * @CCP_SHA_TYPE_1: SHA-1 operation
177 * @CCP_SHA_TYPE_224: SHA-224 operation
178 * @CCP_SHA_TYPE_256: SHA-256 operation
196 * CCP supported cipher algorithms
198 enum ccp_cipher_algo {
199 CCP_CIPHER_ALGO_AES_CBC = 0,
200 CCP_CIPHER_ALGO_AES_ECB,
201 CCP_CIPHER_ALGO_AES_CTR,
202 CCP_CIPHER_ALGO_AES_GCM,
203 CCP_CIPHER_ALGO_3DES_CBC,
207 * CCP cipher operation type
209 enum ccp_cipher_dir {
210 CCP_CIPHER_DIR_DECRYPT = 0,
211 CCP_CIPHER_DIR_ENCRYPT = 1,
215 * CCP supported hash algorithms
218 CCP_AUTH_ALGO_SHA1 = 0,
219 CCP_AUTH_ALGO_SHA1_HMAC,
220 CCP_AUTH_ALGO_SHA224,
221 CCP_AUTH_ALGO_SHA224_HMAC,
222 CCP_AUTH_ALGO_SHA3_224,
223 CCP_AUTH_ALGO_SHA3_224_HMAC,
224 CCP_AUTH_ALGO_SHA256,
225 CCP_AUTH_ALGO_SHA256_HMAC,
226 CCP_AUTH_ALGO_SHA3_256,
227 CCP_AUTH_ALGO_SHA3_256_HMAC,
228 CCP_AUTH_ALGO_SHA384,
229 CCP_AUTH_ALGO_SHA384_HMAC,
230 CCP_AUTH_ALGO_SHA3_384,
231 CCP_AUTH_ALGO_SHA3_384_HMAC,
232 CCP_AUTH_ALGO_SHA512,
233 CCP_AUTH_ALGO_SHA512_HMAC,
234 CCP_AUTH_ALGO_SHA3_512,
235 CCP_AUTH_ALGO_SHA3_512_HMAC,
236 CCP_AUTH_ALGO_AES_CMAC,
237 CCP_AUTH_ALGO_AES_GCM,
238 #ifdef RTE_LIBRTE_PMD_CCP_CPU_AUTH
239 CCP_AUTH_ALGO_MD5_HMAC,
244 * CCP hash operation type
247 CCP_AUTH_OP_GENERATE = 0,
248 CCP_AUTH_OP_VERIFY = 1,
251 /* CCP crypto private session structure */
253 enum ccp_cmd_order cmd_id;
254 /**< chain order mode */
259 /**< IV parameters */
261 enum ccp_cipher_algo algo;
262 enum ccp_engine engine;
264 enum ccp_aes_mode aes_mode;
265 enum ccp_des_mode des_mode;
268 enum ccp_aes_type aes_type;
269 enum ccp_des_type des_type;
271 enum ccp_cipher_dir dir;
273 /**< max cipher key size 256 bits */
277 phys_addr_t key_phys;
278 /**AES-ctr nonce(4) iv(8) ctr*/
280 phys_addr_t nonce_phys;
282 /**< Cipher Parameters */
285 enum ccp_hash_algo algo;
286 enum ccp_engine engine;
288 enum ccp_aes_mode aes_mode;
291 enum ccp_sha_type sha_type;
292 enum ccp_aes_type aes_type;
296 /**< max hash key size 144 bytes (struct capabilties) */
298 /**< max be key size of AES is 32*/
300 phys_addr_t key_phys;
301 uint64_t digest_length;
306 /**< Buffer to store Software generated precomute values*/
307 /**< For HMAC H(ipad ^ key) and H(opad ^ key) */
308 /**< For CMAC K1 IV and K2 IV*/
309 uint8_t pre_compute[2 * CCP_SHA3_CTX_SIZE];
310 /**< SHA3 initial ctx all zeros*/
311 uint8_t sha3_ctx[200];
314 /**< Authentication Parameters */
315 enum rte_crypto_aead_algorithm aead_algo;
316 /**< AEAD Algorithm */
319 } __rte_cache_aligned;
321 extern uint8_t ccp_cryptodev_driver_id;
326 * Set and validate CCP crypto session parameters
328 * @param sess ccp private session
329 * @param xform crypto xform for this session
330 * @return 0 on success otherwise -1
332 int ccp_set_session_parameters(struct ccp_session *sess,
333 const struct rte_crypto_sym_xform *xform);
336 * Find count of slots
338 * @param session CCP private session
339 * @return count of free slots available
341 int ccp_compute_slot_count(struct ccp_session *session);
344 * process crypto ops to be enqueued
346 * @param qp CCP crypto queue-pair
347 * @param op crypto ops table
348 * @param cmd_q CCP cmd queue
349 * @param nb_ops No. of ops to be submitted
350 * @return 0 on success otherwise -1
352 int process_ops_to_enqueue(struct ccp_qp *qp,
353 struct rte_crypto_op **op,
354 struct ccp_queue *cmd_q,
359 * process crypto ops to be dequeued
361 * @param qp CCP crypto queue-pair
362 * @param op crypto ops table
363 * @param nb_ops requested no. of ops
364 * @return 0 on success otherwise -1
366 int process_ops_to_dequeue(struct ccp_qp *qp,
367 struct rte_crypto_op **op,
372 * Apis for SHA3 partial hash generation
373 * @param data_in buffer pointer on which phash is applied
374 * @param data_out phash result in ccp be format is written
376 int partial_hash_sha3_224(uint8_t *data_in,
379 int partial_hash_sha3_256(uint8_t *data_in,
382 int partial_hash_sha3_384(uint8_t *data_in,
385 int partial_hash_sha3_512(uint8_t *data_in,
388 #endif /* _CCP_CRYPTO_H_ */