1  /* SPDX-License-Identifier: GPL-2.0 */
2  /* Copyright (c) 2019 HiSilicon Limited. */
3  
4  #ifndef __HISI_SEC_V2_CRYPTO_H
5  #define __HISI_SEC_V2_CRYPTO_H
6  
7  #define SEC_AIV_SIZE		12
8  #define SEC_IV_SIZE		24
9  #define SEC_MAX_KEY_SIZE	64
10  #define SEC_MAX_AKEY_SIZE	128
11  #define SEC_COMM_SCENE		0
12  #define SEC_MIN_BLOCK_SZ	1
13  
14  enum sec_calg {
15  	SEC_CALG_3DES = 0x1,
16  	SEC_CALG_AES  = 0x2,
17  	SEC_CALG_SM4  = 0x3,
18  };
19  
20  enum sec_hash_alg {
21  	SEC_A_HMAC_SHA1   = 0x10,
22  	SEC_A_HMAC_SHA256 = 0x11,
23  	SEC_A_HMAC_SHA512 = 0x15,
24  };
25  
26  enum sec_mac_len {
27  	SEC_HMAC_CCM_MAC   = 16,
28  	SEC_HMAC_GCM_MAC   = 16,
29  	SEC_SM3_MAC        = 32,
30  	SEC_HMAC_SM3_MAC   = 32,
31  	SEC_HMAC_MD5_MAC   = 16,
32  	SEC_HMAC_SHA1_MAC   = 20,
33  	SEC_HMAC_SHA256_MAC = 32,
34  	SEC_HMAC_SHA512_MAC = 64,
35  };
36  
37  enum sec_cmode {
38  	SEC_CMODE_ECB    = 0x0,
39  	SEC_CMODE_CBC    = 0x1,
40  	SEC_CMODE_CFB    = 0x2,
41  	SEC_CMODE_OFB    = 0x3,
42  	SEC_CMODE_CTR    = 0x4,
43  	SEC_CMODE_CCM    = 0x5,
44  	SEC_CMODE_GCM    = 0x6,
45  	SEC_CMODE_XTS    = 0x7,
46  };
47  
48  enum sec_ckey_type {
49  	SEC_CKEY_128BIT = 0x0,
50  	SEC_CKEY_192BIT = 0x1,
51  	SEC_CKEY_256BIT = 0x2,
52  	SEC_CKEY_3DES_3KEY = 0x1,
53  	SEC_CKEY_3DES_2KEY = 0x3,
54  };
55  
56  enum sec_bd_type {
57  	SEC_BD_TYPE1 = 0x1,
58  	SEC_BD_TYPE2 = 0x2,
59  	SEC_BD_TYPE3 = 0x3,
60  };
61  
62  enum sec_auth {
63  	SEC_NO_AUTH = 0x0,
64  	SEC_AUTH_TYPE1 = 0x1,
65  	SEC_AUTH_TYPE2 = 0x2,
66  };
67  
68  enum sec_cipher_dir {
69  	SEC_CIPHER_ENC = 0x1,
70  	SEC_CIPHER_DEC = 0x2,
71  };
72  
73  enum sec_addr_type {
74  	SEC_PBUF = 0x0,
75  	SEC_SGL  = 0x1,
76  	SEC_PRP  = 0x2,
77  };
78  
79  struct bd_status {
80  	u64 tag;
81  	u8 done;
82  	u8 err_type;
83  	u16 flag;
84  	u16 icv;
85  };
86  
87  enum {
88  	AUTHPAD_PAD,
89  	AUTHPAD_NOPAD,
90  };
91  
92  enum {
93  	AIGEN_GEN,
94  	AIGEN_NOGEN,
95  };
96  
97  struct sec_sqe_type2 {
98  	/*
99  	 * mac_len: 0~4 bits
100  	 * a_key_len: 5~10 bits
101  	 * a_alg: 11~16 bits
102  	 */
103  	__le32 mac_key_alg;
104  
105  	/*
106  	 * c_icv_len: 0~5 bits
107  	 * c_width: 6~8 bits
108  	 * c_key_len: 9~11 bits
109  	 * c_mode: 12~15 bits
110  	 */
111  	__le16 icvw_kmode;
112  
113  	/* c_alg: 0~3 bits */
114  	__u8 c_alg;
115  	__u8 rsvd4;
116  
117  	/*
118  	 * a_len: 0~23 bits
119  	 * iv_offset_l: 24~31 bits
120  	 */
121  	__le32 alen_ivllen;
122  
123  	/*
124  	 * c_len: 0~23 bits
125  	 * iv_offset_h: 24~31 bits
126  	 */
127  	__le32 clen_ivhlen;
128  
129  	__le16 auth_src_offset;
130  	__le16 cipher_src_offset;
131  	__le16 cs_ip_header_offset;
132  	__le16 cs_udp_header_offset;
133  	__le16 pass_word_len;
134  	__le16 dk_len;
135  	__u8 salt3;
136  	__u8 salt2;
137  	__u8 salt1;
138  	__u8 salt0;
139  
140  	__le16 tag;
141  	__le16 rsvd5;
142  
143  	/*
144  	 * c_pad_type: 0~3 bits
145  	 * c_pad_len: 4~11 bits
146  	 * c_pad_data_type: 12~15 bits
147  	 */
148  	__le16 cph_pad;
149  
150  	/* c_pad_len_field: 0~1 bits */
151  	__le16 c_pad_len_field;
152  
153  	__le64 long_a_data_len;
154  	__le64 a_ivin_addr;
155  	__le64 a_key_addr;
156  	__le64 mac_addr;
157  	__le64 c_ivin_addr;
158  	__le64 c_key_addr;
159  
160  	__le64 data_src_addr;
161  	__le64 data_dst_addr;
162  
163  	/*
164  	 * done: 0 bit
165  	 * icv: 1~3 bits
166  	 * csc: 4~6 bits
167  	 * flag: 7-10 bits
168  	 * dif_check: 11~13 bits
169  	 */
170  	__le16 done_flag;
171  
172  	__u8 error_type;
173  	__u8 warning_type;
174  	__u8 mac_i3;
175  	__u8 mac_i2;
176  	__u8 mac_i1;
177  	__u8 mac_i0;
178  	__le16 check_sum_i;
179  	__u8 tls_pad_len_i;
180  	__u8 rsvd12;
181  	__le32 counter;
182  };
183  
184  struct sec_sqe {
185  	/*
186  	 * type:	0~3 bits
187  	 * cipher:	4~5 bits
188  	 * auth:	6~7 bit s
189  	 */
190  	__u8 type_cipher_auth;
191  
192  	/*
193  	 * seq:	0 bit
194  	 * de:	1~2 bits
195  	 * scene:	3~6 bits
196  	 * src_addr_type: ~7 bit, with sdm_addr_type 0-1 bits
197  	 */
198  	__u8 sds_sa_type;
199  
200  	/*
201  	 * src_addr_type: 0~1 bits, not used now,
202  	 * if support PRP, set this field, or set zero.
203  	 * dst_addr_type: 2~4 bits
204  	 * mac_addr_type: 5~7 bits
205  	 */
206  	__u8 sdm_addr_type;
207  	__u8 rsvd0;
208  
209  	/*
210  	 * nonce_len(type2): 0~3 bits
211  	 * huk(type2): 4 bit
212  	 * key_s(type2): 5 bit
213  	 * ci_gen: 6~7 bits
214  	 */
215  	__u8 huk_key_ci;
216  
217  	/*
218  	 * ai_gen: 0~1 bits
219  	 * a_pad(type2): 2~3 bits
220  	 * c_s(type2): 4~5 bits
221  	 */
222  	__u8 ai_apd_cs;
223  
224  	/*
225  	 * rhf(type2): 0 bit
226  	 * c_key_type: 1~2 bits
227  	 * a_key_type: 3~4 bits
228  	 * write_frame_len(type2): 5~7 bits
229  	 */
230  	__u8 rca_key_frm;
231  
232  	/*
233  	 * cal_iv_addr_en(type2): 0 bit
234  	 * tls_up(type2): 1 bit
235  	 * inveld: 7 bit
236  	 */
237  	__u8 iv_tls_ld;
238  
239  	/* Just using type2 BD now */
240  	struct sec_sqe_type2 type2;
241  };
242  
243  struct bd3_auth_ivin {
244  	__le64 a_ivin_addr;
245  	__le32 rsvd0;
246  	__le32 rsvd1;
247  } __packed __aligned(4);
248  
249  struct bd3_skip_data {
250  	__le32 rsvd0;
251  
252  	/*
253  	 * gran_num: 0~15 bits
254  	 * reserved: 16~31 bits
255  	 */
256  	__le32 gran_num;
257  
258  	/*
259  	 * src_skip_data_len: 0~24 bits
260  	 * reserved: 25~31 bits
261  	 */
262  	__le32 src_skip_data_len;
263  
264  	/*
265  	 * dst_skip_data_len: 0~24 bits
266  	 * reserved: 25~31 bits
267  	 */
268  	__le32 dst_skip_data_len;
269  };
270  
271  struct bd3_stream_scene {
272  	__le64 c_ivin_addr;
273  	__le64 long_a_data_len;
274  
275  	/*
276  	 * auth_pad: 0~1 bits
277  	 * stream_protocol: 2~4 bits
278  	 * reserved: 5~7 bits
279  	 */
280  	__u8 stream_auth_pad;
281  	__u8 plaintext_type;
282  	__le16 pad_len_1p3;
283  } __packed __aligned(4);
284  
285  struct bd3_no_scene {
286  	__le64 c_ivin_addr;
287  	__le32 rsvd0;
288  	__le32 rsvd1;
289  	__le32 rsvd2;
290  } __packed __aligned(4);
291  
292  struct bd3_check_sum {
293  	__u8 rsvd0;
294  	__u8 hac_sva_status;
295  	__le16 check_sum_i;
296  };
297  
298  struct bd3_tls_type_back {
299  	__u8 tls_1p3_type_back;
300  	__u8 hac_sva_status;
301  	__le16 pad_len_1p3_back;
302  };
303  
304  struct sec_sqe3 {
305  	/*
306  	 * type: 0~3 bit
307  	 * bd_invalid: 4 bit
308  	 * scene: 5~8 bit
309  	 * de: 9~10 bit
310  	 * src_addr_type: 11~13 bit
311  	 * dst_addr_type: 14~16 bit
312  	 * mac_addr_type: 17~19 bit
313  	 * reserved: 20~31 bits
314  	 */
315  	__le32 bd_param;
316  
317  	/*
318  	 * cipher: 0~1 bits
319  	 * ci_gen: 2~3 bit
320  	 * c_icv_len: 4~9 bit
321  	 * c_width: 10~12 bits
322  	 * c_key_len: 13~15 bits
323  	 */
324  	__le16 c_icv_key;
325  
326  	/*
327  	 * c_mode : 0~3 bits
328  	 * c_alg : 4~7 bits
329  	 */
330  	__u8 c_mode_alg;
331  
332  	/*
333  	 * nonce_len : 0~3 bits
334  	 * huk : 4 bits
335  	 * cal_iv_addr_en : 5 bits
336  	 * seq : 6 bits
337  	 * reserved : 7 bits
338  	 */
339  	__u8 huk_iv_seq;
340  
341  	__le64 tag;
342  	__le64 data_src_addr;
343  	__le64 a_key_addr;
344  	union {
345  		struct bd3_auth_ivin auth_ivin;
346  		struct bd3_skip_data skip_data;
347  	};
348  
349  	__le64 c_key_addr;
350  
351  	/*
352  	 * auth: 0~1 bits
353  	 * ai_gen: 2~3 bits
354  	 * mac_len: 4~8 bits
355  	 * akey_len: 9~14 bits
356  	 * a_alg: 15~20 bits
357  	 * key_sel: 21~24 bits
358  	 * ctr_count_mode/sm4_xts: 25~26 bits
359  	 * sva_prefetch: 27 bits
360  	 * key_wrap_num: 28~30 bits
361  	 * update_key: 31 bits
362  	 */
363  	__le32 auth_mac_key;
364  	__le32 salt;
365  	__le16 auth_src_offset;
366  	__le16 cipher_src_offset;
367  
368  	/*
369  	 * auth_len: 0~23 bit
370  	 * auth_key_offset: 24~31 bits
371  	 */
372  	__le32 a_len_key;
373  
374  	/*
375  	 * cipher_len: 0~23 bit
376  	 * auth_ivin_offset: 24~31 bits
377  	 */
378  	__le32 c_len_ivin;
379  	__le64 data_dst_addr;
380  	__le64 mac_addr;
381  	union {
382  		struct bd3_stream_scene stream_scene;
383  		struct bd3_no_scene no_scene;
384  	};
385  
386  	/*
387  	 * done: 0 bit
388  	 * icv: 1~3 bit
389  	 * csc: 4~6 bit
390  	 * flag: 7~10 bit
391  	 * reserved: 11~15 bit
392  	 */
393  	__le16 done_flag;
394  	__u8 error_type;
395  	__u8 warning_type;
396  	union {
397  		__le32 mac_i;
398  		__le32 kek_key_addr_l;
399  	};
400  	union {
401  		__le32 kek_key_addr_h;
402  		struct bd3_check_sum check_sum;
403  		struct bd3_tls_type_back tls_type_back;
404  	};
405  	__le32 counter;
406  } __packed __aligned(4);
407  
408  int sec_register_to_crypto(struct hisi_qm *qm);
409  void sec_unregister_from_crypto(struct hisi_qm *qm);
410  #endif
411