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