Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : :
5 : : #ifndef __ROC_SE_H__
6 : : #define __ROC_SE_H__
7 : :
8 : : #include "roc_constants.h"
9 : :
10 : : /* SE opcodes */
11 : : #define ROC_SE_MAJOR_OP_FC 0x33
12 : : #define ROC_SE_FC_MINOR_OP_ENCRYPT 0x0
13 : : #define ROC_SE_FC_MINOR_OP_DECRYPT 0x1
14 : : #define ROC_SE_FC_MINOR_OP_HMAC_FIRST 0x10
15 : : #define ROC_SE_FC_MINOR_OP_DOCSIS 0x40
16 : :
17 : : #define ROC_SE_MAJOR_OP_HASH 0x34
18 : : #define ROC_SE_MAJOR_OP_HMAC 0x35
19 : : #define ROC_SE_MAJOR_OP_PDCP 0x37
20 : : #define ROC_SE_MAJOR_OP_KASUMI 0x38
21 : : #define ROC_SE_MAJOR_OP_PDCP_CHAIN 0x3C
22 : : #define ROC_SE_MAJOR_OP_SM 0x3D
23 : :
24 : : #define ROC_SE_MAJOR_OP_MISC 0x01ULL
25 : : #define ROC_SE_MISC_MINOR_OP_PASSTHROUGH 0x03ULL
26 : : #define ROC_SE_MISC_MINOR_OP_DUMMY 0x04ULL
27 : : #define ROC_SE_MISC_MINOR_OP_HW_SUPPORT 0x08ULL
28 : :
29 : : #define ROC_SE_MAX_AAD_SIZE 64
30 : : #define ROC_SE_MAX_MAC_LEN 64
31 : :
32 : : #define ROC_SE_OFF_CTRL_LEN 8
33 : :
34 : : #define ROC_SE_SM4_KEY_LEN 16
35 : :
36 : : #define ROC_SE_ZS_EA 0x1
37 : : #define ROC_SE_ZS_IA 0x2
38 : : #define ROC_SE_K_F8 0x4
39 : : #define ROC_SE_K_F9 0x8
40 : :
41 : : #define ROC_SE_FC_GEN 0x1
42 : : #define ROC_SE_PDCP 0x2
43 : : #define ROC_SE_KASUMI 0x3
44 : : #define ROC_SE_HASH_HMAC 0x4
45 : : #define ROC_SE_PDCP_CHAIN 0x5
46 : : #define ROC_SE_SM 0x6
47 : :
48 : : #define ROC_SE_OP_CIPHER_ENCRYPT 0x1
49 : : #define ROC_SE_OP_CIPHER_DECRYPT 0x2
50 : : #define ROC_SE_OP_CIPHER_MASK \
51 : : (ROC_SE_OP_CIPHER_ENCRYPT | ROC_SE_OP_CIPHER_DECRYPT)
52 : :
53 : : #define ROC_SE_OP_AUTH_VERIFY 0x4
54 : : #define ROC_SE_OP_AUTH_GENERATE 0x8
55 : : #define ROC_SE_OP_AUTH_MASK \
56 : : (ROC_SE_OP_AUTH_VERIFY | ROC_SE_OP_AUTH_GENERATE)
57 : :
58 : : #define ROC_SE_OP_ENCODE (ROC_SE_OP_CIPHER_ENCRYPT | ROC_SE_OP_AUTH_GENERATE)
59 : : #define ROC_SE_OP_DECODE (ROC_SE_OP_CIPHER_DECRYPT | ROC_SE_OP_AUTH_VERIFY)
60 : :
61 : : #define ROC_SE_ALWAYS_USE_SEPARATE_BUF
62 : :
63 : : /*
64 : : * Parameters for Flexi Crypto
65 : : * requests
66 : : */
67 : : #define ROC_SE_VALID_AAD_BUF 0x01
68 : : #define ROC_SE_VALID_MAC_BUF 0x02
69 : : #define ROC_SE_VALID_IV_BUF 0x04
70 : : #define ROC_SE_SINGLE_BUF_INPLACE 0x08
71 : : #define ROC_SE_SINGLE_BUF_HEADROOM 0x10
72 : :
73 : : #define ROC_SE_ENCR_IV_OFFSET(__d_offs) (((__d_offs) >> 32) & 0xffff)
74 : : #define ROC_SE_ENCR_OFFSET(__d_offs) (((__d_offs) >> 16) & 0xffff)
75 : : #define ROC_SE_AUTH_OFFSET(__d_offs) ((__d_offs) & 0xffff)
76 : : #define ROC_SE_ENCR_DLEN(__d_lens) ((__d_lens) >> 32)
77 : : #define ROC_SE_AUTH_DLEN(__d_lens) ((__d_lens) & 0xffffffff)
78 : :
79 : : typedef enum { ROC_SE_FROM_CTX = 0, ROC_SE_FROM_DPTR = 1 } roc_se_input_type;
80 : :
81 : : typedef enum {
82 : : ROC_SE_MD5_TYPE = 1,
83 : : ROC_SE_SHA1_TYPE = 2,
84 : : ROC_SE_SHA2_SHA224 = 3,
85 : : ROC_SE_SHA2_SHA256 = 4,
86 : : ROC_SE_SHA2_SHA384 = 5,
87 : : ROC_SE_SHA2_SHA512 = 6,
88 : : ROC_SE_GMAC_TYPE = 7,
89 : : ROC_SE_POLY1305 = 8,
90 : : ROC_SE_SM3 = 9,
91 : : ROC_SE_SHA3_SHA224 = 10,
92 : : ROC_SE_SHA3_SHA256 = 11,
93 : : ROC_SE_SHA3_SHA384 = 12,
94 : : ROC_SE_SHA3_SHA512 = 13,
95 : : ROC_SE_SHA3_SHAKE128 = 14,
96 : : ROC_SE_SHA3_SHAKE256 = 15,
97 : :
98 : : /* These are only for software use */
99 : : ROC_SE_ZUC_EIA3 = 0x90,
100 : : ROC_SE_SNOW3G_UIA2 = 0x91,
101 : : ROC_SE_AES_CMAC_EIA2 = 0x92,
102 : : ROC_SE_KASUMI_F9_CBC = 0x93,
103 : : ROC_SE_KASUMI_F9_ECB = 0x94,
104 : : } roc_se_auth_type;
105 : :
106 : : typedef enum {
107 : : /* To support passthrough */
108 : : ROC_SE_PASSTHROUGH = 0x0,
109 : : /*
110 : : * These are defined by MC for Flexi crypto
111 : : * for field of 4 bits
112 : : */
113 : : ROC_SE_DES3_CBC = 0x1,
114 : : ROC_SE_DES3_ECB = 0x2,
115 : : ROC_SE_AES_CBC = 0x3,
116 : : ROC_SE_AES_ECB = 0x4,
117 : : ROC_SE_AES_CFB = 0x5,
118 : : ROC_SE_AES_CTR = 0x6,
119 : : ROC_SE_AES_GCM = 0x7,
120 : : ROC_SE_AES_XTS = 0x8,
121 : : ROC_SE_CHACHA20 = 0x9,
122 : : ROC_SE_AES_CCM = 0xA,
123 : :
124 : : /* These are only for software use */
125 : : ROC_SE_ZUC_EEA3 = 0x90,
126 : : ROC_SE_SNOW3G_UEA2 = 0x91,
127 : : ROC_SE_AES_CTR_EEA2 = 0x92,
128 : : ROC_SE_KASUMI_F8_CBC = 0x93,
129 : : ROC_SE_KASUMI_F8_ECB = 0x94,
130 : : ROC_SE_AES_DOCSISBPI = 0x95,
131 : : ROC_SE_DES_DOCSISBPI = 0x96,
132 : : } roc_se_cipher_type;
133 : :
134 : : typedef enum {
135 : : ROC_SM4_ECB = 0x0,
136 : : ROC_SM4_CBC = 0x1,
137 : : ROC_SM4_CTR = 0x2,
138 : : ROC_SM4_CFB = 0x3,
139 : : ROC_SM4_OFB = 0x4,
140 : : } roc_sm_cipher_type;
141 : :
142 : : typedef enum {
143 : : /* Microcode errors */
144 : : ROC_SE_NO_ERR = 0x00,
145 : : ROC_SE_ERR_OPCODE_UNSUPPORTED = 0x01,
146 : :
147 : : /* SCATTER GATHER */
148 : : ROC_SE_ERR_SCATTER_GATHER_WRITE_LENGTH = 0x02,
149 : : ROC_SE_ERR_SCATTER_GATHER_LIST = 0x03,
150 : : ROC_SE_ERR_SCATTER_GATHER_NOT_SUPPORTED = 0x04,
151 : :
152 : : /* SE GC */
153 : : ROC_SE_ERR_GC_LENGTH_INVALID = 0x41,
154 : : ROC_SE_ERR_GC_RANDOM_LEN_INVALID = 0x42,
155 : : ROC_SE_ERR_GC_DATA_LEN_INVALID = 0x43,
156 : : ROC_SE_ERR_GC_DRBG_TYPE_INVALID = 0x44,
157 : : ROC_SE_ERR_GC_CTX_LEN_INVALID = 0x45,
158 : : ROC_SE_ERR_GC_CIPHER_UNSUPPORTED = 0x46,
159 : : ROC_SE_ERR_GC_AUTH_UNSUPPORTED = 0x47,
160 : : ROC_SE_ERR_GC_OFFSET_INVALID = 0x48,
161 : : ROC_SE_ERR_GC_HASH_MODE_UNSUPPORTED = 0x49,
162 : : ROC_SE_ERR_GC_DRBG_ENTROPY_LEN_INVALID = 0x4a,
163 : : ROC_SE_ERR_GC_DRBG_ADDNL_LEN_INVALID = 0x4b,
164 : : ROC_SE_ERR_GC_ICV_MISCOMPARE = 0x4c,
165 : : ROC_SE_ERR_GC_DATA_UNALIGNED = 0x4d,
166 : :
167 : : ROC_SE_ERR_SSL_RECORD_LEN_INVALID = 0x82,
168 : : ROC_SE_ERR_SSL_CTX_LEN_INVALID = 0x83,
169 : : ROC_SE_ERR_SSL_CIPHER_UNSUPPORTED = 0x84,
170 : : ROC_SE_ERR_SSL_MAC_UNSUPPORTED = 0x85,
171 : : ROC_SE_ERR_SSL_VERSION_UNSUPPORTED = 0x86,
172 : : ROC_SE_ERR_SSL_POST_PROCESS = 0x88,
173 : : ROC_SE_ERR_SSL_MAC_MISMATCH = 0x89,
174 : : ROC_SE_ERR_SSL_PKT_REPLAY_SEQ_OUT_OF_WINDOW = 0xC1,
175 : : ROC_SE_ERR_SSL_PKT_REPLAY_SEQ = 0xC9,
176 : :
177 : : /* API Layer */
178 : : ROC_SE_ERR_REQ_PENDING = 0xfe,
179 : : ROC_SE_ERR_REQ_TIMEOUT = 0xff,
180 : :
181 : : } roc_se_error_code;
182 : :
183 : : typedef enum {
184 : : ROC_SE_AES_128_BIT = 0x1,
185 : : ROC_SE_AES_192_BIT = 0x2,
186 : : ROC_SE_AES_256_BIT = 0x3
187 : : } roc_se_aes_type;
188 : :
189 : : typedef enum {
190 : : ROC_SE_PDCP_MAC_LEN_32_BIT = 0x1,
191 : : ROC_SE_PDCP_MAC_LEN_64_BIT = 0x2,
192 : : ROC_SE_PDCP_MAC_LEN_128_BIT = 0x3
193 : : } roc_se_pdcp_mac_len_type;
194 : :
195 : : typedef enum {
196 : : ROC_SE_IPSEC = 0x0,
197 : : ROC_SE_TLS = 0x1,
198 : : ROC_SE_FC = 0x2,
199 : : } roc_se_op_type;
200 : :
201 : : struct roc_se_enc_context {
202 : : uint64_t iv_source : 1;
203 : : uint64_t aes_key : 2;
204 : : uint64_t rsvd_59 : 1;
205 : : uint64_t enc_cipher : 4;
206 : : uint64_t auth_input_type : 1;
207 : : uint64_t auth_key_src : 1;
208 : : uint64_t rsvd_50_51 : 2;
209 : : uint64_t hash_type : 4;
210 : : uint64_t mac_len : 8;
211 : : uint64_t rsvd_16_39 : 24;
212 : : uint64_t hmac_key_sz : 16;
213 : : uint8_t encr_key[32];
214 : : uint8_t encr_iv[16];
215 : : };
216 : :
217 : : struct roc_se_hmac_context {
218 : : uint8_t ipad[64];
219 : : uint8_t opad[64];
220 : : };
221 : :
222 : : struct roc_se_context {
223 : : struct roc_se_enc_context enc;
224 : : struct roc_se_hmac_context hmac;
225 : : };
226 : :
227 : : struct roc_se_sm_context {
228 : : uint64_t rsvd_56_60 : 5;
229 : : uint64_t enc_cipher : 3;
230 : : uint64_t rsvd_0_55 : 56;
231 : : uint8_t encr_key[16];
232 : : };
233 : :
234 : : struct roc_se_otk_zuc_ctx {
235 : : union {
236 : : uint64_t u64;
237 : : struct {
238 : : uint64_t rsvd_56 : 57;
239 : : uint64_t mac_len : 2;
240 : : uint64_t key_len : 2;
241 : : uint64_t lfsr_state : 1;
242 : : uint64_t alg_type : 2;
243 : : } s;
244 : : } w0;
245 : : uint8_t ci_key[32];
246 : : uint8_t encr_auth_iv[24];
247 : : uint8_t zuc_const[32];
248 : : };
249 : :
250 : : struct roc_se_onk_zuc_ctx {
251 : : uint8_t encr_auth_iv[16];
252 : : uint8_t ci_key[16];
253 : : uint8_t zuc_const[32];
254 : : };
255 : :
256 : : struct roc_se_pdcp_ctx {
257 : : union {
258 : : uint64_t u64;
259 : : struct {
260 : : uint64_t cipher_type : 2;
261 : : uint64_t rsvd58_59 : 2;
262 : : uint64_t auth_type : 2;
263 : : uint64_t rsvd62_63 : 2;
264 : : uint64_t mac_len : 4;
265 : : uint64_t ci_key_len : 2;
266 : : uint64_t auth_key_len : 2;
267 : : uint64_t rsvd42_47 : 6;
268 : : uint64_t state_conf : 2;
269 : : uint64_t rsvd0_39 : 40;
270 : : } s;
271 : : } w0;
272 : : union {
273 : : struct {
274 : : uint8_t encr_lfsr_state[72];
275 : : uint8_t auth_lfsr_state[72];
276 : : };
277 : : struct {
278 : : uint8_t ci_key[32];
279 : : uint8_t ci_zuc_const[32];
280 : : uint8_t rsvd[8];
281 : : uint8_t auth_key[32];
282 : : uint8_t auth_zuc_const[32];
283 : : uint8_t rsvd1[8];
284 : : };
285 : : } st;
286 : : };
287 : :
288 : : struct roc_se_kasumi_ctx {
289 : : uint8_t reg_A[8];
290 : : uint8_t ci_key[16];
291 : : };
292 : :
293 : : /* Buffer pointer */
294 : : struct roc_se_buf_ptr {
295 : : void *vaddr;
296 : : uint32_t size;
297 : : uint32_t resv;
298 : : };
299 : :
300 : : /* IOV Pointer */
301 : : struct roc_se_iov_ptr {
302 : : int buf_cnt;
303 : : struct roc_se_buf_ptr bufs[];
304 : : };
305 : :
306 : : #define ROC_SE_PDCP_ALG_TYPE_ZUC 0
307 : : #define ROC_SE_PDCP_ALG_TYPE_SNOW3G 1
308 : : #define ROC_SE_PDCP_ALG_TYPE_AES_CTR 2
309 : : #define ROC_SE_PDCP_ALG_TYPE_AES_CMAC 3
310 : : #define ROC_SE_PDCP_CHAIN_ALG_TYPE_SNOW3G 1
311 : : #define ROC_SE_PDCP_CHAIN_ALG_TYPE_ZUC 3
312 : :
313 : : #define ROC_SE_PDCP_CHAIN_CTX_LFSR 0
314 : : #define ROC_SE_PDCP_CHAIN_CTX_KEY_IV 1
315 : :
316 : : struct roc_se_ctx {
317 : : /* Below fields are accessed by sw */
318 : : uint64_t enc_cipher : 8;
319 : : uint64_t hash_type : 8;
320 : : uint64_t mac_len : 8;
321 : : uint64_t auth_key_len : 16;
322 : : uint64_t fc_type : 4;
323 : : uint64_t hmac : 1;
324 : : uint64_t zsk_flags : 3;
325 : : uint64_t k_ecb : 1;
326 : : uint64_t pdcp_ci_alg : 2;
327 : : uint64_t pdcp_auth_alg : 2;
328 : : uint64_t ciph_then_auth : 1;
329 : : uint64_t auth_then_ciph : 1;
330 : : uint64_t eia2 : 1;
331 : : /* auth_iv_offset passed to PDCP_CHAIN opcode based on FVC bit */
332 : : uint8_t pdcp_iv_offset;
333 : : union cpt_inst_w4 template_w4;
334 : : uint8_t *auth_key;
335 : : /* Below fields are accessed by hardware */
336 : : struct se_ctx_s {
337 : : /* Word0 */
338 : : union {
339 : : struct {
340 : : uint64_t rsvd : 48;
341 : :
342 : : uint64_t ctx_push_size : 7;
343 : : uint64_t rsvd1 : 1;
344 : :
345 : : uint64_t ctx_hdr_size : 2;
346 : : uint64_t aop_valid : 1;
347 : : uint64_t rsvd2 : 1;
348 : : uint64_t ctx_size : 4;
349 : : } s;
350 : : uint64_t u64;
351 : : } w0;
352 : : union {
353 : : struct roc_se_context fctx;
354 : : struct roc_se_pdcp_ctx pctx;
355 : : struct roc_se_kasumi_ctx k_ctx;
356 : : struct roc_se_sm_context sm_ctx;
357 : : };
358 : : } se_ctx __plt_aligned(ROC_ALIGN);
359 : : } __plt_aligned(ROC_ALIGN);
360 : :
361 : : struct roc_se_fc_params {
362 : : union {
363 : : struct roc_se_buf_ptr bufs[1];
364 : : struct {
365 : : struct roc_se_iov_ptr *src_iov;
366 : : struct roc_se_iov_ptr *dst_iov;
367 : : };
368 : : };
369 : : const void *iv_buf;
370 : : const void *auth_iv_buf;
371 : : struct roc_se_ctx *ctx;
372 : : struct roc_se_buf_ptr meta_buf;
373 : : uint8_t cipher_iv_len;
374 : : uint8_t auth_iv_len;
375 : : uint8_t pdcp_iv_offset;
376 : :
377 : : struct roc_se_buf_ptr aad_buf;
378 : : struct roc_se_buf_ptr mac_buf;
379 : : };
380 : :
381 : : static inline void
382 : : roc_se_zuc_bytes_swap(uint8_t *arr, int len)
383 : : {
384 : : int start, end;
385 : : uint8_t tmp;
386 : :
387 : : if (len <= 0)
388 : : return;
389 : :
390 : : start = 0;
391 : : end = len - 1;
392 : :
393 [ # # # # ]: 0 : while (start < end) {
394 : 0 : tmp = arr[start];
395 : 0 : arr[start] = arr[end];
396 : 0 : arr[end] = tmp;
397 : 0 : start++;
398 : 0 : end--;
399 : : }
400 : : }
401 : :
402 : : int __roc_api roc_se_auth_key_set(struct roc_se_ctx *se_ctx, roc_se_auth_type type,
403 : : const uint8_t *key, uint16_t key_len, uint16_t mac_len);
404 : :
405 : : int __roc_api roc_se_ciph_key_set(struct roc_se_ctx *se_ctx, roc_se_cipher_type type,
406 : : const uint8_t *key, uint16_t key_len);
407 : :
408 : : void __roc_api roc_se_ctx_swap(struct roc_se_ctx *se_ctx);
409 : : void __roc_api roc_se_ctx_init(struct roc_se_ctx *se_ctx);
410 : :
411 : : void __roc_api roc_se_hmac_opad_ipad_gen(roc_se_auth_type auth_type, const uint8_t *key,
412 : : uint16_t length, uint8_t *opad_ipad,
413 : : roc_se_op_type op_type);
414 : : #endif /* __ROC_SE_H__ */
|