1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3
4 /**
5 ***************************************************************************
6 * @file lac_sym_qat_constants_table.c
7 *
8 * @ingroup LacSymQat
9 ***************************************************************************/
10
11 /*
12 *******************************************************************************
13 * Include public/global header files
14 *******************************************************************************
15 */
16
17 #include "cpa.h"
18
19 /*
20 *******************************************************************************
21 * Include private header files
22 *******************************************************************************
23 */
24
25 #include "lac_common.h"
26 #include "icp_qat_fw_la.h"
27 #include "lac_log.h"
28 #include "lac_mem.h"
29 #include "sal_string_parse.h"
30 #include "lac_sal_types_crypto.h"
31 #include "sal_types_compression.h"
32
33 static uint8_t icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_DELIMITER]
34 [ICP_QAT_HW_CIPHER_MODE_DELIMITER][2]
35 [2]; /* IA version */
36 static uint8_t icp_qat_hw_auth_lookup_tbl[ICP_QAT_HW_AUTH_ALGO_DELIMITER]
37 [ICP_QAT_HW_AUTH_MODE_DELIMITER]
38 [2]; /* IA version */
39
40 #define ICP_QAT_HW_FILL_LOOKUP_TBLS \
41 { \
42 \
43 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_DES] \
44 [ICP_QAT_HW_CIPHER_ECB_MODE] \
45 [ICP_QAT_HW_CIPHER_ENCRYPT] \
46 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
47 9; \
48 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_DES] \
49 [ICP_QAT_HW_CIPHER_ECB_MODE] \
50 [ICP_QAT_HW_CIPHER_DECRYPT] \
51 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
52 10; \
53 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_DES] \
54 [ICP_QAT_HW_CIPHER_CBC_MODE] \
55 [ICP_QAT_HW_CIPHER_ENCRYPT] \
56 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
57 11; \
58 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_DES] \
59 [ICP_QAT_HW_CIPHER_CBC_MODE] \
60 [ICP_QAT_HW_CIPHER_DECRYPT] \
61 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
62 12; \
63 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_DES] \
64 [ICP_QAT_HW_CIPHER_CTR_MODE] \
65 [ICP_QAT_HW_CIPHER_ENCRYPT] \
66 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
67 13; \
68 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
69 [ICP_QAT_HW_CIPHER_ECB_MODE] \
70 [ICP_QAT_HW_CIPHER_ENCRYPT] \
71 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
72 14; \
73 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
74 [ICP_QAT_HW_CIPHER_ECB_MODE] \
75 [ICP_QAT_HW_CIPHER_ENCRYPT] \
76 [ICP_QAT_HW_CIPHER_KEY_CONVERT] = \
77 15; \
78 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
79 [ICP_QAT_HW_CIPHER_ECB_MODE] \
80 [ICP_QAT_HW_CIPHER_DECRYPT] \
81 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
82 16; \
83 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
84 [ICP_QAT_HW_CIPHER_ECB_MODE] \
85 [ICP_QAT_HW_CIPHER_DECRYPT] \
86 [ICP_QAT_HW_CIPHER_KEY_CONVERT] = \
87 17; \
88 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
89 [ICP_QAT_HW_CIPHER_CBC_MODE] \
90 [ICP_QAT_HW_CIPHER_ENCRYPT] \
91 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
92 18; \
93 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
94 [ICP_QAT_HW_CIPHER_CBC_MODE] \
95 [ICP_QAT_HW_CIPHER_ENCRYPT] \
96 [ICP_QAT_HW_CIPHER_KEY_CONVERT] = \
97 19; \
98 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
99 [ICP_QAT_HW_CIPHER_CBC_MODE] \
100 [ICP_QAT_HW_CIPHER_DECRYPT] \
101 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
102 20; \
103 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
104 [ICP_QAT_HW_CIPHER_CBC_MODE] \
105 [ICP_QAT_HW_CIPHER_DECRYPT] \
106 [ICP_QAT_HW_CIPHER_KEY_CONVERT] = \
107 21; \
108 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
109 [ICP_QAT_HW_CIPHER_CTR_MODE] \
110 [ICP_QAT_HW_CIPHER_ENCRYPT] \
111 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
112 22; \
113 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_AES128] \
114 [ICP_QAT_HW_CIPHER_F8_MODE] \
115 [ICP_QAT_HW_CIPHER_ENCRYPT] \
116 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
117 23; \
118 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_ARC4] \
119 [ICP_QAT_HW_CIPHER_ECB_MODE] \
120 [ICP_QAT_HW_CIPHER_ENCRYPT] \
121 [ICP_QAT_HW_CIPHER_NO_CONVERT] = \
122 24; \
123 icp_qat_hw_cipher_lookup_tbl[ICP_QAT_HW_CIPHER_ALGO_ARC4] \
124 [ICP_QAT_HW_CIPHER_ECB_MODE] \
125 [ICP_QAT_HW_CIPHER_ENCRYPT] \
126 [ICP_QAT_HW_CIPHER_KEY_CONVERT] = \
127 25; \
128 \
129 icp_qat_hw_auth_lookup_tbl \
130 [ICP_QAT_HW_AUTH_ALGO_MD5][ICP_QAT_HW_AUTH_MODE0] \
131 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 37; \
132 icp_qat_hw_auth_lookup_tbl \
133 [ICP_QAT_HW_AUTH_ALGO_SHA1][ICP_QAT_HW_AUTH_MODE0] \
134 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 41; \
135 icp_qat_hw_auth_lookup_tbl \
136 [ICP_QAT_HW_AUTH_ALGO_SHA1][ICP_QAT_HW_AUTH_MODE1] \
137 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 46; \
138 icp_qat_hw_auth_lookup_tbl \
139 [ICP_QAT_HW_AUTH_ALGO_SHA224][ICP_QAT_HW_AUTH_MODE0] \
140 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 48; \
141 icp_qat_hw_auth_lookup_tbl \
142 [ICP_QAT_HW_AUTH_ALGO_SHA256][ICP_QAT_HW_AUTH_MODE0] \
143 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 54; \
144 icp_qat_hw_auth_lookup_tbl \
145 [ICP_QAT_HW_AUTH_ALGO_SHA384][ICP_QAT_HW_AUTH_MODE0] \
146 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 60; \
147 icp_qat_hw_auth_lookup_tbl \
148 [ICP_QAT_HW_AUTH_ALGO_SHA512][ICP_QAT_HW_AUTH_MODE0] \
149 [ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED] = 70; \
150 }
151
152 /**
153 *****************************************************************************
154 * @ingroup LacSymQat
155 * LacSymQat_ConstantsInitLookupTables
156 *
157 *
158 *****************************************************************************/
159 void
LacSymQat_ConstantsInitLookupTables(CpaInstanceHandle instanceHandle)160 LacSymQat_ConstantsInitLookupTables(CpaInstanceHandle instanceHandle)
161 {
162 sal_service_t *pService = (sal_service_t *)instanceHandle;
163 lac_sym_qat_constants_t *pConstantsLookupTables;
164
165 /* Note the global tables are initialised first, then copied
166 * to the service which probably seems like a waste of memory
167 * and processing cycles as the global tables are never needed again
168 * but this allows use of the ICP_QAT_HW_FILL_LOOKUP_TBLS macro
169 * supplied by FW without modification */
170
171 if (SAL_SERVICE_TYPE_COMPRESSION == pService->type) {
172 /* DC chaining not supported yet */
173 return;
174 } else {
175 pConstantsLookupTables = &(
176 ((sal_crypto_service_t *)pService)->constantsLookupTables);
177 }
178
179 /* First fill the global lookup tables with zeroes. */
180 memset(icp_qat_hw_cipher_lookup_tbl,
181 0,
182 sizeof(icp_qat_hw_cipher_lookup_tbl));
183 memset(icp_qat_hw_auth_lookup_tbl,
184 0,
185 sizeof(icp_qat_hw_auth_lookup_tbl));
186
187 /* Override lookup tables with the offsets into the SHRAM table
188 * for supported algorithms/modes */
189 ICP_QAT_HW_FILL_LOOKUP_TBLS;
190
191 /* Copy the global tables to the service instance */
192 memcpy(pConstantsLookupTables->cipher_offset,
193 icp_qat_hw_cipher_lookup_tbl,
194 sizeof(pConstantsLookupTables->cipher_offset));
195 memcpy(pConstantsLookupTables->auth_offset,
196 icp_qat_hw_auth_lookup_tbl,
197 sizeof(pConstantsLookupTables->auth_offset));
198 }
199
200 /**
201 *****************************************************************************
202 * @ingroup LacSymQat
203 * LacSymQat_ConstantsGetCipherOffset
204 *
205 *
206 *****************************************************************************/
207 void
LacSymQat_ConstantsGetCipherOffset(CpaInstanceHandle instanceHandle,uint8_t algo,uint8_t mode,uint8_t direction,uint8_t convert,uint8_t * poffset)208 LacSymQat_ConstantsGetCipherOffset(CpaInstanceHandle instanceHandle,
209 uint8_t algo,
210 uint8_t mode,
211 uint8_t direction,
212 uint8_t convert,
213 uint8_t *poffset)
214 {
215 sal_service_t *pService = (sal_service_t *)instanceHandle;
216 lac_sym_qat_constants_t *pConstantsLookupTables;
217
218 if (SAL_SERVICE_TYPE_COMPRESSION == pService->type) {
219 /* DC chaining not supported yet */
220 return;
221 } else {
222 pConstantsLookupTables = &(
223 ((sal_crypto_service_t *)pService)->constantsLookupTables);
224 }
225
226 *poffset = pConstantsLookupTables
227 ->cipher_offset[algo][mode][direction][convert];
228 }
229
230 /**
231 *****************************************************************************
232 * @ingroup LacSymQat
233 * LacSymQat_ConstantsGetAuthOffset
234 *
235 *
236 *****************************************************************************/
237 void
LacSymQat_ConstantsGetAuthOffset(CpaInstanceHandle instanceHandle,uint8_t algo,uint8_t mode,uint8_t nested,uint8_t * poffset)238 LacSymQat_ConstantsGetAuthOffset(CpaInstanceHandle instanceHandle,
239 uint8_t algo,
240 uint8_t mode,
241 uint8_t nested,
242 uint8_t *poffset)
243 {
244 sal_service_t *pService = (sal_service_t *)instanceHandle;
245 lac_sym_qat_constants_t *pConstantsLookupTables;
246
247 if (SAL_SERVICE_TYPE_COMPRESSION == pService->type) {
248 /* DC chaining not supported yet */
249 return;
250 } else {
251 pConstantsLookupTables = &(
252 ((sal_crypto_service_t *)pService)->constantsLookupTables);
253 }
254
255 *poffset = pConstantsLookupTables->auth_offset[algo][mode][nested];
256 }
257