1/* SPDX-License-Identifier: BSD-3-Clause */
2/* Copyright(c) 2007-2022 Intel Corporation */
3
4/**
5 ***************************************************************************
6 * @file lac_sym_hash_precomputes.h
7 *
8 * @defgroup LacHashDefs Hash Definitions
9 *
10 * @ingroup  LacHash
11 *
12 * Constants for hash algorithms
13 *
14 ***************************************************************************/
15#ifndef LAC_SYM_HASH_PRECOMPUTES_H
16#define LAC_SYM_HASH_PRECOMPUTES_H
17
18#include "lac_sym_hash.h"
19
20#define LAC_SYM_AES_CMAC_RB_128 0x87 /* constant used for   */
21				     /* CMAC calculation    */
22
23#define LAC_SYM_HASH_MSBIT_MASK 0x80 /* Mask to check MSB top bit */
24				     /* zero or one */
25
26#define LAC_SINGLE_BUFFER_HW_META_SIZE                                         \
27	(sizeof(icp_buffer_list_desc_t) + sizeof(icp_flat_buffer_desc_t))
28/**< size of memory to allocate for the HW buffer list that is sent to the
29 * QAT */
30
31#define LAC_SYM_HASH_PRECOMP_MAX_WORKING_BUFFER                                \
32	((sizeof(lac_sym_hash_precomp_op_data_t) * 2) +                        \
33	 sizeof(lac_sym_hash_precomp_op_t))
34/**< maximum size of the working data for the HMAC precompute operations
35 *
36 * Maximum size of lac_sym_hash_precomp_op_data_t is 264 bytes. For hash
37 * precomputes there are 2 of these structrues and a further
38 * lac_sym_hash_precomp_op_t structure required. This comes to a total of 536
39 * bytes.
40 * For the asynchronous version of the precomputes, the memory for the hash
41 * state prefix buffer is used as the working memory. There are 584 bytes
42 * which are alloacted for the hash state prefix buffer which is enough to
43 * carve up for the precomputes.
44 */
45
46#define LAC_SYM_HASH_PRECOMP_MAX_AES_ECB_DATA                                  \
47	((ICP_QAT_HW_AES_128_KEY_SZ) * (3))
48/**< Maximum size for the data that an AES ECB precompute is generated on */
49
50/**
51 *****************************************************************************
52 * @ingroup LacHashDefs
53 *      Precompute type enum
54 * @description
55 *      Enum used to distinguish between precompute types
56 *
57 *****************************************************************************/
58typedef enum {
59	LAC_SYM_HASH_PRECOMP_HMAC = 1,
60	/**< Hmac precompute operation. Copy state from hash state buffer */
61	LAC_SYM_HASH_PRECOMP_AES_ECB,
62	/**< XCBC/CGM precompute, Copy state from data buffer */
63} lac_sym_hash_precomp_type_t;
64
65/**
66 *****************************************************************************
67 * @ingroup LacHashDefs
68 *      overall precompute management structure
69 * @description
70 *      structure used to manage the precompute operations for a session
71 *
72 *****************************************************************************/
73typedef struct lac_sym_hash_precomp_op_s {
74	lac_hash_precompute_done_cb_t callbackFn;
75	/**< Callback function to be invoked when the final precompute completes
76	 */
77
78	void *pCallbackTag;
79	/**< Opaque data to be passed back as a parameter in the callback */
80
81	QatUtilsAtomic opsPending;
82	/**< counter used to determine if the current precompute is the
83	 * final one. */
84
85} lac_sym_hash_precomp_op_t;
86
87/**
88 *****************************************************************************
89 * @ingroup LacHashDefs
90 *      hmac precompute structure as used by the QAT
91 * @description
92 *      data used by the QAT for HMAC precomputes
93 *
94 *      Must be allocated on an 8-byte aligned memory address.
95 *
96 *****************************************************************************/
97typedef struct lac_sym_hash_hmac_precomp_qat_s {
98	Cpa8U data[LAC_HASH_SHA512_BLOCK_SIZE];
99	/**< data to be hashed - block size of data for the algorithm */
100	/* NOTE: to save space we could have got the QAT to overwrite
101	 * this with the hash state storage */
102	icp_qat_fw_la_auth_req_params_t hashReqParams;
103	/**< Request parameters as read in by the QAT */
104	Cpa8U bufferDesc[LAC_SINGLE_BUFFER_HW_META_SIZE];
105	/**< Buffer descriptor structure */
106	Cpa8U hashStateStorage[LAC_MAX_HASH_STATE_STORAGE_SIZE];
107	/**< Internal buffer where QAT writes the intermediate partial
108	 * state that is used in the precompute */
109} lac_sym_hash_hmac_precomp_qat_t;
110
111/**
112 *****************************************************************************
113 * @ingroup LacHashDefs
114 *      AES ECB precompute structure as used by the QAT
115 * @description
116 *      data used by the QAT for AES ECB precomptes
117 *
118 *      Must be allocated on an 8-byte aligned memory address.
119 *
120 *****************************************************************************/
121typedef struct lac_sym_hash_aes_precomp_qat_s {
122	Cpa8U contentDesc[LAC_SYM_QAT_MAX_CIPHER_SETUP_BLK_SZ];
123	/**< Content descriptor for a cipher operation */
124	Cpa8U data[LAC_SYM_HASH_PRECOMP_MAX_AES_ECB_DATA];
125	/**< The data to be ciphered is conatined here and the result is
126	 * written in place back into this buffer */
127	icp_qat_fw_la_cipher_req_params_t cipherReqParams;
128	/**< Request parameters as read in by the QAT */
129	Cpa8U bufferDesc[LAC_SINGLE_BUFFER_HW_META_SIZE];
130	/**< Buffer descriptor structure */
131} lac_sym_hash_aes_precomp_qat_t;
132
133/**
134 *****************************************************************************
135 * @ingroup LacHashDefs
136 *      overall structure for managing a single precompute operation
137 * @description
138 *      overall structure for managing a single precompute operation
139 *
140 *      Must be allocated on an 8-byte aligned memory address.
141 *
142 *****************************************************************************/
143typedef struct lac_sym_hash_precomp_op_data_s {
144	sal_crypto_service_t *pInstance;
145	/**< Instance handle for the operation */
146	Cpa8U reserved[4];
147	/**< padding to align later structures on minimum 8-Byte address */
148	lac_sym_hash_precomp_type_t opType;
149	/**< operation type to determine the precompute type in the callback */
150	lac_sym_hash_precomp_op_t *pOpStatus;
151	/**< structure containing the counter and the condition for the overall
152	 * precompute operation. This is a pointer because the memory structure
153	 * may be shared between precomputes when there are more than 1 as in
154	 * the
155	 * case of HMAC */
156	union {
157		lac_sym_hash_hmac_precomp_qat_t hmacQatData;
158		/**< Data sent to the QAT for hmac precomputes */
159		lac_sym_hash_aes_precomp_qat_t aesQatData;
160		/**< Data sent to the QAT for AES ECB precomputes */
161	} u;
162
163	/**< ASSUMPTION: The above structures are 8 byte aligned if the overall
164	 * struct is 8 byte aligned, as there are two 4 byte fields before this
165	 * union */
166	Cpa32U stateSize;
167	/**< Size of the state to be copied into the state pointer in the
168	 * content
169	 * descriptor */
170	Cpa8U *pState;
171	/**< pointer to the state in the content descriptor where the result of
172	 * the precompute should be copied to */
173} lac_sym_hash_precomp_op_data_t;
174
175#endif /* LAC_SYM_HASH_PRECOMPUTES_H */
176