1 /***************************************************************************
2 *
3 * <COPYRIGHT_TAG>
4 *
5 ***************************************************************************/
6
7 /**
8 *****************************************************************************
9 * @file lac_sym_alg_chain.h
10 *
11 * @defgroup LacAlgChain Algorithm Chaining
12 *
13 * @ingroup LacSym
14 *
15 * Interfaces exposed by the Algorithm Chaining Component
16 *
17 * @lld_start
18 *
19 * @lld_overview
20 * This is the LAC Algorithm-Chaining feature component. This component
21 * implements session registration and cleanup functions, and a perform
22 * function. Statistics are maintained to track requests issued and completed,
23 * errors incurred, and authentication verification failures. For each
24 * function the parameters supplied by the client are checked, and then the
25 * function proceeds if all the parameters are valid. This component also
26 * incorporates support for Authenticated-Encryption (CCM and GCM) which
27 * essentially comprises of a cipher operation and a hash operation combined.
28 *
29 * This component can combine a cipher operation with a hash operation or just
30 * simply create a hash only or cipher only operation and is called from the
31 * LAC Symmetric API component. In turn it calls the LAC Cipher, LAC Hash, and
32 * LAC Symmetric QAT components. The goal here is to duplicate as little code
33 * as possible from the Cipher and Hash components.
34 *
35 * The cipher and hash operations can be combined in either order, i.e. cipher
36 * first then hash or hash first then cipher. The client specifies this via
37 * the algChainOrder field in the session context. This ordering choice is
38 * stored as part of the session descriptor, so that it is known when a
39 * perform request is issued. In the case of Authenticated-Encryption, the
40 * ordering is an implicit part of the CCM or GCM protocol.
41 *
42 * When building a content descriptor, as part of session registration, this
43 * component asks the Cipher and Hash components to build their respective
44 * parts of the session descriptor. The key aspect here is to provide the
45 * correct offsets to the Cipher and Hash components for where in the content
46 * descriptor to write their Config and Hardware Setup blocks. Also the
47 * Config block in each case must specify the appropriate next slice.
48 *
49 * When building request parameters, as part of a perform operation, this
50 * component asks the Cipher and Hash components to build their respective
51 * parts of the request parameters block. Again the key aspect here is to
52 * provide the correct offsets to the Cipher and Hash components for where in
53 * the request parameters block to write their parameters. Also the request
54 * parameters block in each case must specify the appropriate next slice.
55 *
56 * Parameter checking for session registration and for operation perform is
57 * mostly delegated to the Cipher and Hash components. There are a few
58 * extra checks that this component must perform: check the algChainOrder
59 * parameter, ensure that CCM/GCM are specified for hash/cipher algorithms
60 * as appropriate, and ensure that requests are for full packets (partial
61 * packets are not supported for Algorithm-Chaining).
62 *
63 * The perform operation allocates a cookie to capture information required
64 * in the request callback. This cookie is then freed in the callback.
65 *
66 * @lld_dependencies
67 * - \ref LacCipher "Cipher" : For taking care of the cipher aspects of
68 * session registration and operation perform
69 * - \ref LacHash "Hash" : For taking care of the hash aspects of session
70 * registration and operation perform
71 * - \ref LacSymCommon "Symmetric Common" : statistics.
72 * - \ref LacSymQat "Symmetric QAT": To build the QAT request message,
73 * request param structure, and populate the content descriptor. Also
74 * for registering a callback function to process the QAT response.
75 * - \ref QatComms "QAT Comms" : For sending messages to the QAT, and for
76 * setting the response callback
77 * - \ref LacMem "Mem" : For memory allocation and freeing, virtual/physical
78 * address translation, and translating between scalar and pointer types
79 * - OSAL : For atomics and locking
80 *
81 * @lld_module_algorithms
82 * This component builds up a chain of slices at session init time
83 * and stores it in the session descriptor. This is used for building up the
84 * content descriptor at session init time and the request parameters structure
85 * in the perform operation.
86 *
87 * The offsets for the first slice are updated so that the second slice adds
88 * its configuration information after that of the first slice. The first
89 * slice also configures the next slice appropriately.
90 *
91 * This component is very much hard-coded to just support cipher+hash or
92 * hash+cipher. It should be quite possible to extend this idea to support
93 * an arbitrary chain of commands, by building up a command chain that can
94 * be traversed in order to build up the appropriate configuration for the
95 * QAT. This notion should be looked at in the future if other forms of
96 * Algorithm-Chaining are desired.
97 *
98 * @lld_process_context
99 *
100 * @lld_end
101 *
102 *****************************************************************************/
103
104 /*****************************************************************************/
105
106 #ifndef LAC_SYM_ALG_CHAIN_H
107 #define LAC_SYM_ALG_CHAIN_H
108
109 /*
110 ******************************************************************************
111 * Include public/global header files
112 ******************************************************************************
113 */
114
115 #include "cpa.h"
116 #include "cpa_cy_sym.h"
117 #include "lac_session.h"
118
119 /*
120 *******************************************************************************
121 * Include private header files
122 *******************************************************************************
123 */
124
125 /* Macro for checking if zero length buffer are supported
126 * only for cipher is AES-GCM and hash are AES-GCM/AES-GMAC */
127 #define IS_ZERO_LENGTH_BUFFER_SUPPORTED(cipherAlgo, hashAlgo) \
128 (CPA_CY_SYM_CIPHER_AES_GCM == cipherAlgo && \
129 (CPA_CY_SYM_HASH_AES_GMAC == hashAlgo || \
130 CPA_CY_SYM_HASH_AES_GCM == hashAlgo))
131
132 /**
133 *******************************************************************************
134 * @ingroup LacAlgChain
135 * This function registers a session for an Algorithm-Chaining operation.
136 *
137 * @description
138 * This function is called from the LAC session register API function for
139 * Algorithm-Chaining operations. It validates all input parameters. If
140 * an invalid parameter is passed, an error is returned to the calling
141 * function. If all parameters are valid an Algorithm-Chaining session is
142 * registered.
143 *
144 * @param[in] instanceHandle Instance Handle
145 *
146 * @param[in] pSessionCtx Pointer to session context which contains
147 * parameters which are static for a given
148 * cryptographic session such as operation type,
149 * mechanisms, and keys for cipher and/or digest
150 * operations.
151 * @param[out] pSessionDesc Pointer to session descriptor
152 *
153 * @retval CPA_STATUS_SUCCESS Function executed successfully.
154 * @retval CPA_STATUS_FAIL Function failed.
155 * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in.
156 * @retval CPA_STATUS_RESOURCE Error related to system resources.
157 *
158 * @see cpaCySymInitSession()
159 *
160 *****************************************************************************/
161 CpaStatus LacAlgChain_SessionInit(const CpaInstanceHandle instanceHandle,
162 const CpaCySymSessionSetupData *pSessionCtx,
163 lac_session_desc_t *pSessionDesc);
164
165 /**
166 *******************************************************************************
167 * @ingroup LacAlgChain
168 * Data path function for the Algorithm-Chaining component
169 *
170 * @description
171 * This function gets called from cpaCySymPerformOp() which is the
172 * symmetric LAC API function. It is the data path function for the
173 * Algorithm-Chaining component. It does the parameter checking on the
174 * client supplied parameters and if the parameters are valid, the
175 * operation is performed and a request sent to the QAT, otherwise an
176 * error is returned to the client.
177 *
178 * @param[in] instanceHandle Instance Handle
179 *
180 * @param[in] pSessionDesc Pointer to session descriptor
181 * @param[in] pCallbackTag The application's context for this call
182 * @param[in] pOpData Pointer to a structure containing request
183 * parameters. The client code allocates the memory for
184 * this structure. This component takes ownership of
185 * the memory until it is returned in the callback.
186 *
187 * @param[in] pSrcBuffer Source Buffer List
188 * @param[out] pDstBuffer Destination Buffer List
189 * @param[out] pVerifyResult Verify Result
190 *
191 * @retval CPA_STATUS_SUCCESS Function executed successfully.
192 * @retval CPA_STATUS_FAIL Function failed.
193 * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in.
194 * @retval CPA_STATUS_RESOURCE Error related to system resource.
195 *
196 * @see cpaCySymPerformOp()
197 *
198 *****************************************************************************/
199 CpaStatus LacAlgChain_Perform(const CpaInstanceHandle instanceHandle,
200 lac_session_desc_t *pSessionDesc,
201 void *pCallbackTag,
202 const CpaCySymOpData *pOpData,
203 const CpaBufferList *pSrcBuffer,
204 CpaBufferList *pDstBuffer,
205 CpaBoolean *pVerifyResult);
206
207 /**
208 *******************************************************************************
209 * @ingroup LacAlgChain
210 * This function is used to update cipher key, as specified in provided
211 * input.
212 *
213 * @description
214 * This function is called from the LAC session register API function for
215 * Algorithm-Chaining operations. It validates all input parameters. If
216 * an invalid parameter is passed, an error is returned to the calling
217 * function. If all parameters are valid an Algorithm-Chaining session is
218 * updated.
219 *
220 * @threadSafe
221 * No
222 *
223 * @param[in] pSessionDesc Pointer to session descriptor
224 * @param[in] pCipherKey Pointer to new cipher key.
225 *
226 * @retval CPA_STATUS_SUCCESS Function executed successfully.
227 * @retval CPA_STATUS_FAIL Function failed.
228 * @retval CPA_STATUS_RETRY Resubmit the request.
229 * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in.
230 * @retval CPA_STATUS_UNSUPPORTED Function is not supported.
231 *
232 *****************************************************************************/
233 CpaStatus LacAlgChain_SessionCipherKeyUpdate(lac_session_desc_t *pSessionDesc,
234 Cpa8U *pCipherKey);
235
236 /**
237 *******************************************************************************
238 * @ingroup LacAlgChain
239 * This function is used to update authentication key, as specified in
240 * provided input.
241 *
242 * @description
243 * This function is called from the LAC session register API function for
244 * Algorithm-Chaining operations. It validates all input parameters. If
245 * an invalid parameter is passed, an error is returned to the calling
246 * function. If all parameters are valid an Algorithm-Chaining session is
247 * updated.
248 *
249 * @threadSafe
250 * No
251 *
252 * @param[in] pSessionDesc Pointer to session descriptor
253 * @param[in] pCipherKey Pointer to new authentication key.
254 *
255 * @retval CPA_STATUS_SUCCESS Function executed successfully.
256 * @retval CPA_STATUS_FAIL Function failed.
257 * @retval CPA_STATUS_RETRY Resubmit the request.
258 * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in.
259 * @retval CPA_STATUS_UNSUPPORTED Function is not supported.
260 *
261 *****************************************************************************/
262 CpaStatus LacAlgChain_SessionAuthKeyUpdate(lac_session_desc_t *pSessionDesc,
263 Cpa8U *pAuthKey);
264
265 /**
266 *******************************************************************************
267 * @ingroup LacAlgChain
268 * This function is used to update AAD length as specified in provided
269 * input.
270 *
271 * @description
272 * This function is called from the LAC session register API function for
273 * Algorithm-Chaining operations. It validates all input parameters. If
274 * an invalid parameter is passed, an error is returned to the calling
275 * function. If all parameters are valid an Algorithm-Chaining session is
276 * updated.
277 *
278 * @threadSafe
279 * No
280 *
281 * @param[in] pSessionDesc Pointer to session descriptor
282 * @param[in] newAADLength New AAD length.
283 *
284 * @retval CPA_STATUS_SUCCESS Function executed successfully.
285 * @retval CPA_STATUS_FAIL Function failed.
286 * @retval CPA_STATUS_RETRY Resubmit the request.
287 * @retval CPA_STATUS_INVALID_PARAM Invalid parameter passed in.
288 * @retval CPA_STATUS_UNSUPPORTED Function is not supported.
289 *
290 *****************************************************************************/
291 CpaStatus LacAlgChain_SessionAADUpdate(lac_session_desc_t *pSessionDesc,
292 Cpa32U newAADLength);
293
294 #endif /* LAC_SYM_ALG_CHAIN_H */
Cache object: 95cede0fb75a7bb732c231f4b858dbed
|