xref: /OK3568_Linux_fs/kernel/drivers/crypto/amcc/crypto4xx_sa.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /**
3*4882a593Smuzhiyun  * AMCC SoC PPC4xx Crypto Driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2008 Applied Micro Circuits Corporation.
6*4882a593Smuzhiyun  * All rights reserved. James Hsiao <jhsiao@amcc.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * This file defines the security context
9*4882a593Smuzhiyun  * associate format.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef __CRYPTO4XX_SA_H__
13*4882a593Smuzhiyun #define __CRYPTO4XX_SA_H__
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define AES_IV_SIZE				16
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /**
18*4882a593Smuzhiyun  * Contents of Dynamic Security Association (SA) with all possible fields
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun union dynamic_sa_contents {
21*4882a593Smuzhiyun 	struct {
22*4882a593Smuzhiyun 		u32 arc4_state_ptr:1;
23*4882a593Smuzhiyun 		u32 arc4_ij_ptr:1;
24*4882a593Smuzhiyun 		u32 state_ptr:1;
25*4882a593Smuzhiyun 		u32 iv3:1;
26*4882a593Smuzhiyun 		u32 iv2:1;
27*4882a593Smuzhiyun 		u32 iv1:1;
28*4882a593Smuzhiyun 		u32 iv0:1;
29*4882a593Smuzhiyun 		u32 seq_num_mask3:1;
30*4882a593Smuzhiyun 		u32 seq_num_mask2:1;
31*4882a593Smuzhiyun 		u32 seq_num_mask1:1;
32*4882a593Smuzhiyun 		u32 seq_num_mask0:1;
33*4882a593Smuzhiyun 		u32 seq_num1:1;
34*4882a593Smuzhiyun 		u32 seq_num0:1;
35*4882a593Smuzhiyun 		u32 spi:1;
36*4882a593Smuzhiyun 		u32 outer_size:5;
37*4882a593Smuzhiyun 		u32 inner_size:5;
38*4882a593Smuzhiyun 		u32 key_size:4;
39*4882a593Smuzhiyun 		u32 cmd_size:4;
40*4882a593Smuzhiyun 	} bf;
41*4882a593Smuzhiyun 	u32 w;
42*4882a593Smuzhiyun } __attribute__((packed));
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define DIR_OUTBOUND				0
45*4882a593Smuzhiyun #define DIR_INBOUND				1
46*4882a593Smuzhiyun #define SA_OP_GROUP_BASIC			0
47*4882a593Smuzhiyun #define SA_OPCODE_ENCRYPT			0
48*4882a593Smuzhiyun #define SA_OPCODE_DECRYPT			0
49*4882a593Smuzhiyun #define SA_OPCODE_ENCRYPT_HASH			1
50*4882a593Smuzhiyun #define SA_OPCODE_HASH_DECRYPT			1
51*4882a593Smuzhiyun #define SA_OPCODE_HASH				3
52*4882a593Smuzhiyun #define SA_CIPHER_ALG_DES			0
53*4882a593Smuzhiyun #define SA_CIPHER_ALG_3DES			1
54*4882a593Smuzhiyun #define SA_CIPHER_ALG_ARC4			2
55*4882a593Smuzhiyun #define SA_CIPHER_ALG_AES			3
56*4882a593Smuzhiyun #define SA_CIPHER_ALG_KASUMI			4
57*4882a593Smuzhiyun #define SA_CIPHER_ALG_NULL			15
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define SA_HASH_ALG_MD5				0
60*4882a593Smuzhiyun #define SA_HASH_ALG_SHA1			1
61*4882a593Smuzhiyun #define SA_HASH_ALG_GHASH			12
62*4882a593Smuzhiyun #define SA_HASH_ALG_CBC_MAC			14
63*4882a593Smuzhiyun #define SA_HASH_ALG_NULL			15
64*4882a593Smuzhiyun #define SA_HASH_ALG_SHA1_DIGEST_SIZE		20
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define SA_LOAD_HASH_FROM_SA			0
67*4882a593Smuzhiyun #define SA_LOAD_HASH_FROM_STATE			2
68*4882a593Smuzhiyun #define SA_NOT_LOAD_HASH			3
69*4882a593Smuzhiyun #define SA_LOAD_IV_FROM_SA			0
70*4882a593Smuzhiyun #define SA_LOAD_IV_FROM_INPUT			1
71*4882a593Smuzhiyun #define SA_LOAD_IV_FROM_STATE			2
72*4882a593Smuzhiyun #define SA_LOAD_IV_GEN_IV			3
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define SA_PAD_TYPE_CONSTANT			2
75*4882a593Smuzhiyun #define SA_PAD_TYPE_ZERO			3
76*4882a593Smuzhiyun #define SA_PAD_TYPE_TLS				5
77*4882a593Smuzhiyun #define SA_PAD_TYPE_DTLS			5
78*4882a593Smuzhiyun #define SA_NOT_SAVE_HASH			0
79*4882a593Smuzhiyun #define SA_SAVE_HASH				1
80*4882a593Smuzhiyun #define SA_NOT_SAVE_IV				0
81*4882a593Smuzhiyun #define SA_SAVE_IV				1
82*4882a593Smuzhiyun #define SA_HEADER_PROC				1
83*4882a593Smuzhiyun #define SA_NO_HEADER_PROC			0
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun union sa_command_0 {
86*4882a593Smuzhiyun 	struct {
87*4882a593Smuzhiyun 		u32 scatter:1;
88*4882a593Smuzhiyun 		u32 gather:1;
89*4882a593Smuzhiyun 		u32 save_hash_state:1;
90*4882a593Smuzhiyun 		u32 save_iv:1;
91*4882a593Smuzhiyun 		u32 load_hash_state:2;
92*4882a593Smuzhiyun 		u32 load_iv:2;
93*4882a593Smuzhiyun 		u32 digest_len:4;
94*4882a593Smuzhiyun 		u32 hdr_proc:1;
95*4882a593Smuzhiyun 		u32 extend_pad:1;
96*4882a593Smuzhiyun 		u32 stream_cipher_pad:1;
97*4882a593Smuzhiyun 		u32 rsv:1;
98*4882a593Smuzhiyun 		u32 hash_alg:4;
99*4882a593Smuzhiyun 		u32 cipher_alg:4;
100*4882a593Smuzhiyun 		u32 pad_type:2;
101*4882a593Smuzhiyun 		u32 op_group:2;
102*4882a593Smuzhiyun 		u32 dir:1;
103*4882a593Smuzhiyun 		u32 opcode:3;
104*4882a593Smuzhiyun 	} bf;
105*4882a593Smuzhiyun 	u32 w;
106*4882a593Smuzhiyun } __attribute__((packed));
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define CRYPTO_MODE_ECB				0
109*4882a593Smuzhiyun #define CRYPTO_MODE_CBC				1
110*4882a593Smuzhiyun #define CRYPTO_MODE_OFB				2
111*4882a593Smuzhiyun #define CRYPTO_MODE_CFB				3
112*4882a593Smuzhiyun #define CRYPTO_MODE_CTR				4
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define CRYPTO_FEEDBACK_MODE_NO_FB		0
115*4882a593Smuzhiyun #define CRYPTO_FEEDBACK_MODE_64BIT_OFB		0
116*4882a593Smuzhiyun #define CRYPTO_FEEDBACK_MODE_8BIT_CFB		1
117*4882a593Smuzhiyun #define CRYPTO_FEEDBACK_MODE_1BIT_CFB		2
118*4882a593Smuzhiyun #define CRYPTO_FEEDBACK_MODE_128BIT_CFB		3
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define SA_AES_KEY_LEN_128			2
121*4882a593Smuzhiyun #define SA_AES_KEY_LEN_192			3
122*4882a593Smuzhiyun #define SA_AES_KEY_LEN_256			4
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define SA_REV2					1
125*4882a593Smuzhiyun /**
126*4882a593Smuzhiyun  * The follow defines bits sa_command_1
127*4882a593Smuzhiyun  * In Basic hash mode  this bit define simple hash or hmac.
128*4882a593Smuzhiyun  * In IPsec mode, this bit define muting control.
129*4882a593Smuzhiyun  */
130*4882a593Smuzhiyun #define SA_HASH_MODE_HASH			0
131*4882a593Smuzhiyun #define SA_HASH_MODE_HMAC			1
132*4882a593Smuzhiyun #define SA_MC_ENABLE				0
133*4882a593Smuzhiyun #define SA_MC_DISABLE				1
134*4882a593Smuzhiyun #define SA_NOT_COPY_HDR				0
135*4882a593Smuzhiyun #define SA_COPY_HDR				1
136*4882a593Smuzhiyun #define SA_NOT_COPY_PAD				0
137*4882a593Smuzhiyun #define SA_COPY_PAD				1
138*4882a593Smuzhiyun #define SA_NOT_COPY_PAYLOAD			0
139*4882a593Smuzhiyun #define SA_COPY_PAYLOAD				1
140*4882a593Smuzhiyun #define SA_EXTENDED_SN_OFF			0
141*4882a593Smuzhiyun #define SA_EXTENDED_SN_ON			1
142*4882a593Smuzhiyun #define SA_SEQ_MASK_OFF				0
143*4882a593Smuzhiyun #define SA_SEQ_MASK_ON				1
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun union sa_command_1 {
146*4882a593Smuzhiyun 	struct {
147*4882a593Smuzhiyun 		u32 crypto_mode31:1;
148*4882a593Smuzhiyun 		u32 save_arc4_state:1;
149*4882a593Smuzhiyun 		u32 arc4_stateful:1;
150*4882a593Smuzhiyun 		u32 key_len:5;
151*4882a593Smuzhiyun 		u32 hash_crypto_offset:8;
152*4882a593Smuzhiyun 		u32 sa_rev:2;
153*4882a593Smuzhiyun 		u32 byte_offset:1;
154*4882a593Smuzhiyun 		u32 hmac_muting:1;
155*4882a593Smuzhiyun 		u32 feedback_mode:2;
156*4882a593Smuzhiyun 		u32 crypto_mode9_8:2;
157*4882a593Smuzhiyun 		u32 extended_seq_num:1;
158*4882a593Smuzhiyun 		u32 seq_num_mask:1;
159*4882a593Smuzhiyun 		u32 mutable_bit_proc:1;
160*4882a593Smuzhiyun 		u32 ip_version:1;
161*4882a593Smuzhiyun 		u32 copy_pad:1;
162*4882a593Smuzhiyun 		u32 copy_payload:1;
163*4882a593Smuzhiyun 		u32 copy_hdr:1;
164*4882a593Smuzhiyun 		u32 rsv1:1;
165*4882a593Smuzhiyun 	} bf;
166*4882a593Smuzhiyun 	u32 w;
167*4882a593Smuzhiyun } __attribute__((packed));
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun struct dynamic_sa_ctl {
170*4882a593Smuzhiyun 	union dynamic_sa_contents sa_contents;
171*4882a593Smuzhiyun 	union sa_command_0 sa_command_0;
172*4882a593Smuzhiyun 	union sa_command_1 sa_command_1;
173*4882a593Smuzhiyun } __attribute__((packed));
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /**
176*4882a593Smuzhiyun  * State Record for Security Association (SA)
177*4882a593Smuzhiyun  */
178*4882a593Smuzhiyun struct  sa_state_record {
179*4882a593Smuzhiyun 	__le32 save_iv[4];
180*4882a593Smuzhiyun 	__le32 save_hash_byte_cnt[2];
181*4882a593Smuzhiyun 	union {
182*4882a593Smuzhiyun 		u32 save_digest[16]; /* for MD5/SHA */
183*4882a593Smuzhiyun 		__le32 save_digest_le32[16]; /* GHASH / CBC */
184*4882a593Smuzhiyun 	};
185*4882a593Smuzhiyun } __attribute__((packed));
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /**
188*4882a593Smuzhiyun  * Security Association (SA) for AES128
189*4882a593Smuzhiyun  *
190*4882a593Smuzhiyun  */
191*4882a593Smuzhiyun struct dynamic_sa_aes128 {
192*4882a593Smuzhiyun 	struct dynamic_sa_ctl	ctrl;
193*4882a593Smuzhiyun 	__le32 key[4];
194*4882a593Smuzhiyun 	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
195*4882a593Smuzhiyun 	u32 state_ptr;
196*4882a593Smuzhiyun 	u32 reserved;
197*4882a593Smuzhiyun } __attribute__((packed));
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #define SA_AES128_LEN		(sizeof(struct dynamic_sa_aes128)/4)
200*4882a593Smuzhiyun #define SA_AES128_CONTENTS	0x3e000042
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /*
203*4882a593Smuzhiyun  * Security Association (SA) for AES192
204*4882a593Smuzhiyun  */
205*4882a593Smuzhiyun struct dynamic_sa_aes192 {
206*4882a593Smuzhiyun 	struct dynamic_sa_ctl ctrl;
207*4882a593Smuzhiyun 	__le32 key[6];
208*4882a593Smuzhiyun 	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
209*4882a593Smuzhiyun 	u32 state_ptr;
210*4882a593Smuzhiyun 	u32 reserved;
211*4882a593Smuzhiyun } __attribute__((packed));
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #define SA_AES192_LEN		(sizeof(struct dynamic_sa_aes192)/4)
214*4882a593Smuzhiyun #define SA_AES192_CONTENTS	0x3e000062
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /**
217*4882a593Smuzhiyun  * Security Association (SA) for AES256
218*4882a593Smuzhiyun  */
219*4882a593Smuzhiyun struct dynamic_sa_aes256 {
220*4882a593Smuzhiyun 	struct dynamic_sa_ctl ctrl;
221*4882a593Smuzhiyun 	__le32 key[8];
222*4882a593Smuzhiyun 	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
223*4882a593Smuzhiyun 	u32 state_ptr;
224*4882a593Smuzhiyun 	u32 reserved;
225*4882a593Smuzhiyun } __attribute__((packed));
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun #define SA_AES256_LEN		(sizeof(struct dynamic_sa_aes256)/4)
228*4882a593Smuzhiyun #define SA_AES256_CONTENTS	0x3e000082
229*4882a593Smuzhiyun #define SA_AES_CONTENTS		0x3e000002
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun /**
232*4882a593Smuzhiyun  * Security Association (SA) for AES128 CCM
233*4882a593Smuzhiyun  */
234*4882a593Smuzhiyun struct dynamic_sa_aes128_ccm {
235*4882a593Smuzhiyun 	struct dynamic_sa_ctl ctrl;
236*4882a593Smuzhiyun 	__le32 key[4];
237*4882a593Smuzhiyun 	__le32 iv[4];
238*4882a593Smuzhiyun 	u32 state_ptr;
239*4882a593Smuzhiyun 	u32 reserved;
240*4882a593Smuzhiyun } __packed;
241*4882a593Smuzhiyun #define SA_AES128_CCM_LEN	(sizeof(struct dynamic_sa_aes128_ccm)/4)
242*4882a593Smuzhiyun #define SA_AES128_CCM_CONTENTS	0x3e000042
243*4882a593Smuzhiyun #define SA_AES_CCM_CONTENTS	0x3e000002
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /**
246*4882a593Smuzhiyun  * Security Association (SA) for AES128_GCM
247*4882a593Smuzhiyun  */
248*4882a593Smuzhiyun struct dynamic_sa_aes128_gcm {
249*4882a593Smuzhiyun 	struct dynamic_sa_ctl ctrl;
250*4882a593Smuzhiyun 	__le32 key[4];
251*4882a593Smuzhiyun 	__le32 inner_digest[4];
252*4882a593Smuzhiyun 	__le32 iv[4];
253*4882a593Smuzhiyun 	u32 state_ptr;
254*4882a593Smuzhiyun 	u32 reserved;
255*4882a593Smuzhiyun } __packed;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun #define SA_AES128_GCM_LEN	(sizeof(struct dynamic_sa_aes128_gcm)/4)
258*4882a593Smuzhiyun #define SA_AES128_GCM_CONTENTS	0x3e000442
259*4882a593Smuzhiyun #define SA_AES_GCM_CONTENTS	0x3e000402
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /**
262*4882a593Smuzhiyun  * Security Association (SA) for HASH160: HMAC-SHA1
263*4882a593Smuzhiyun  */
264*4882a593Smuzhiyun struct dynamic_sa_hash160 {
265*4882a593Smuzhiyun 	struct dynamic_sa_ctl ctrl;
266*4882a593Smuzhiyun 	__le32 inner_digest[5];
267*4882a593Smuzhiyun 	__le32 outer_digest[5];
268*4882a593Smuzhiyun 	u32 state_ptr;
269*4882a593Smuzhiyun 	u32 reserved;
270*4882a593Smuzhiyun } __attribute__((packed));
271*4882a593Smuzhiyun #define SA_HASH160_LEN		(sizeof(struct dynamic_sa_hash160)/4)
272*4882a593Smuzhiyun #define SA_HASH160_CONTENTS     0x2000a502
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun static inline u32
get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl * cts)275*4882a593Smuzhiyun get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun 	u32 offset;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	offset = cts->sa_contents.bf.key_size
280*4882a593Smuzhiyun 		+ cts->sa_contents.bf.inner_size
281*4882a593Smuzhiyun 		+ cts->sa_contents.bf.outer_size
282*4882a593Smuzhiyun 		+ cts->sa_contents.bf.spi
283*4882a593Smuzhiyun 		+ cts->sa_contents.bf.seq_num0
284*4882a593Smuzhiyun 		+ cts->sa_contents.bf.seq_num1
285*4882a593Smuzhiyun 		+ cts->sa_contents.bf.seq_num_mask0
286*4882a593Smuzhiyun 		+ cts->sa_contents.bf.seq_num_mask1
287*4882a593Smuzhiyun 		+ cts->sa_contents.bf.seq_num_mask2
288*4882a593Smuzhiyun 		+ cts->sa_contents.bf.seq_num_mask3
289*4882a593Smuzhiyun 		+ cts->sa_contents.bf.iv0
290*4882a593Smuzhiyun 		+ cts->sa_contents.bf.iv1
291*4882a593Smuzhiyun 		+ cts->sa_contents.bf.iv2
292*4882a593Smuzhiyun 		+ cts->sa_contents.bf.iv3;
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	return sizeof(struct dynamic_sa_ctl) + offset * 4;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
get_dynamic_sa_key_field(struct dynamic_sa_ctl * cts)297*4882a593Smuzhiyun static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun 	return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun 
get_dynamic_sa_inner_digest(struct dynamic_sa_ctl * cts)302*4882a593Smuzhiyun static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	return (__le32 *) ((unsigned long)cts +
305*4882a593Smuzhiyun 		sizeof(struct dynamic_sa_ctl) +
306*4882a593Smuzhiyun 		cts->sa_contents.bf.key_size * 4);
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun #endif
310