1 /**
2  * AMCC SoC PPC4xx Crypto Driver
3  *
4  * Copyright (c) 2008 Applied Micro Circuits Corporation.
5  * All rights reserved. James Hsiao <jhsiao@amcc.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * This file defines the security context
18  * associate format.
19  */
20 
21 #ifndef __CRYPTO4XX_SA_H__
22 #define __CRYPTO4XX_SA_H__
23 
24 #define AES_IV_SIZE				16
25 
26 /**
27  * Contents of Dynamic Security Association (SA) with all possible fields
28  */
29 union dynamic_sa_contents {
30 	struct {
31 		u32 arc4_state_ptr:1;
32 		u32 arc4_ij_ptr:1;
33 		u32 state_ptr:1;
34 		u32 iv3:1;
35 		u32 iv2:1;
36 		u32 iv1:1;
37 		u32 iv0:1;
38 		u32 seq_num_mask3:1;
39 		u32 seq_num_mask2:1;
40 		u32 seq_num_mask1:1;
41 		u32 seq_num_mask0:1;
42 		u32 seq_num1:1;
43 		u32 seq_num0:1;
44 		u32 spi:1;
45 		u32 outer_size:5;
46 		u32 inner_size:5;
47 		u32 key_size:4;
48 		u32 cmd_size:4;
49 	} bf;
50 	u32 w;
51 } __attribute__((packed));
52 
53 #define DIR_OUTBOUND				0
54 #define DIR_INBOUND				1
55 #define SA_OP_GROUP_BASIC			0
56 #define SA_OPCODE_ENCRYPT			0
57 #define SA_OPCODE_DECRYPT			0
58 #define SA_OPCODE_HASH				3
59 #define SA_CIPHER_ALG_DES			0
60 #define SA_CIPHER_ALG_3DES			1
61 #define SA_CIPHER_ALG_ARC4			2
62 #define SA_CIPHER_ALG_AES			3
63 #define SA_CIPHER_ALG_KASUMI			4
64 #define SA_CIPHER_ALG_NULL			15
65 
66 #define SA_HASH_ALG_MD5				0
67 #define SA_HASH_ALG_SHA1			1
68 #define SA_HASH_ALG_NULL			15
69 #define SA_HASH_ALG_SHA1_DIGEST_SIZE		20
70 
71 #define SA_LOAD_HASH_FROM_SA			0
72 #define SA_LOAD_HASH_FROM_STATE			2
73 #define SA_NOT_LOAD_HASH			3
74 #define SA_LOAD_IV_FROM_SA			0
75 #define SA_LOAD_IV_FROM_INPUT			1
76 #define SA_LOAD_IV_FROM_STATE			2
77 #define SA_LOAD_IV_GEN_IV			3
78 
79 #define SA_PAD_TYPE_CONSTANT			2
80 #define SA_PAD_TYPE_ZERO			3
81 #define SA_PAD_TYPE_TLS				5
82 #define SA_PAD_TYPE_DTLS			5
83 #define SA_NOT_SAVE_HASH			0
84 #define SA_SAVE_HASH				1
85 #define SA_NOT_SAVE_IV				0
86 #define SA_SAVE_IV				1
87 #define SA_HEADER_PROC				1
88 #define SA_NO_HEADER_PROC			0
89 
90 union sa_command_0 {
91 	struct {
92 		u32 scatter:1;
93 		u32 gather:1;
94 		u32 save_hash_state:1;
95 		u32 save_iv:1;
96 		u32 load_hash_state:2;
97 		u32 load_iv:2;
98 		u32 digest_len:4;
99 		u32 hdr_proc:1;
100 		u32 extend_pad:1;
101 		u32 stream_cipher_pad:1;
102 		u32 rsv:1;
103 		u32 hash_alg:4;
104 		u32 cipher_alg:4;
105 		u32 pad_type:2;
106 		u32 op_group:2;
107 		u32 dir:1;
108 		u32 opcode:3;
109 	} bf;
110 	u32 w;
111 } __attribute__((packed));
112 
113 #define CRYPTO_MODE_ECB				0
114 #define CRYPTO_MODE_CBC				1
115 
116 #define CRYPTO_FEEDBACK_MODE_NO_FB		0
117 #define CRYPTO_FEEDBACK_MODE_64BIT_OFB		0
118 #define CRYPTO_FEEDBACK_MODE_8BIT_CFB		1
119 #define CRYPTO_FEEDBACK_MODE_1BIT_CFB		2
120 #define CRYPTO_FEEDBACK_MODE_128BIT_CFB		3
121 
122 #define SA_AES_KEY_LEN_128			2
123 #define SA_AES_KEY_LEN_192			3
124 #define SA_AES_KEY_LEN_256			4
125 
126 #define SA_REV2					1
127 /**
128  * The follow defines bits sa_command_1
129  * In Basic hash mode  this bit define simple hash or hmac.
130  * In IPsec mode, this bit define muting control.
131  */
132 #define SA_HASH_MODE_HASH			0
133 #define SA_HASH_MODE_HMAC			1
134 #define SA_MC_ENABLE				0
135 #define SA_MC_DISABLE				1
136 #define SA_NOT_COPY_HDR				0
137 #define SA_COPY_HDR				1
138 #define SA_NOT_COPY_PAD				0
139 #define SA_COPY_PAD				1
140 #define SA_NOT_COPY_PAYLOAD			0
141 #define SA_COPY_PAYLOAD				1
142 #define SA_EXTENDED_SN_OFF			0
143 #define SA_EXTENDED_SN_ON			1
144 #define SA_SEQ_MASK_OFF				0
145 #define SA_SEQ_MASK_ON				1
146 
147 union sa_command_1 {
148 	struct {
149 		u32 crypto_mode31:1;
150 		u32 save_arc4_state:1;
151 		u32 arc4_stateful:1;
152 		u32 key_len:5;
153 		u32 hash_crypto_offset:8;
154 		u32 sa_rev:2;
155 		u32 byte_offset:1;
156 		u32 hmac_muting:1;
157 		u32 feedback_mode:2;
158 		u32 crypto_mode9_8:2;
159 		u32 extended_seq_num:1;
160 		u32 seq_num_mask:1;
161 		u32 mutable_bit_proc:1;
162 		u32 ip_version:1;
163 		u32 copy_pad:1;
164 		u32 copy_payload:1;
165 		u32 copy_hdr:1;
166 		u32 rsv1:1;
167 	} bf;
168 	u32 w;
169 } __attribute__((packed));
170 
171 struct dynamic_sa_ctl {
172 	u32 sa_contents;
173 	union sa_command_0 sa_command_0;
174 	union sa_command_1 sa_command_1;
175 } __attribute__((packed));
176 
177 /**
178  * State Record for Security Association (SA)
179  */
180 struct  sa_state_record {
181 	u32 save_iv[4];
182 	u32 save_hash_byte_cnt[2];
183 	u32 save_digest[16];
184 } __attribute__((packed));
185 
186 /**
187  * Security Association (SA) for AES128
188  *
189  */
190 struct dynamic_sa_aes128 {
191 	struct dynamic_sa_ctl	ctrl;
192 	u32 key[4];
193 	u32 iv[4]; /* for CBC, OFC, and CFB mode */
194 	u32 state_ptr;
195 	u32 reserved;
196 } __attribute__((packed));
197 
198 #define SA_AES128_LEN		(sizeof(struct dynamic_sa_aes128)/4)
199 #define SA_AES128_CONTENTS	0x3e000042
200 
201 /*
202  * Security Association (SA) for AES192
203  */
204 struct dynamic_sa_aes192 {
205 	struct dynamic_sa_ctl ctrl;
206 	u32 key[6];
207 	u32 iv[4]; /* for CBC, OFC, and CFB mode */
208 	u32 state_ptr;
209 	u32 reserved;
210 } __attribute__((packed));
211 
212 #define SA_AES192_LEN		(sizeof(struct dynamic_sa_aes192)/4)
213 #define SA_AES192_CONTENTS	0x3e000062
214 
215 /**
216  * Security Association (SA) for AES256
217  */
218 struct dynamic_sa_aes256 {
219 	struct dynamic_sa_ctl ctrl;
220 	u32 key[8];
221 	u32 iv[4]; /* for CBC, OFC, and CFB mode */
222 	u32 state_ptr;
223 	u32 reserved;
224 } __attribute__((packed));
225 
226 #define SA_AES256_LEN		(sizeof(struct dynamic_sa_aes256)/4)
227 #define SA_AES256_CONTENTS	0x3e000082
228 #define SA_AES_CONTENTS		0x3e000002
229 
230 /**
231  * Security Association (SA) for HASH160: HMAC-SHA1
232  */
233 struct dynamic_sa_hash160 {
234 	struct dynamic_sa_ctl ctrl;
235 	u32 inner_digest[5];
236 	u32 outer_digest[5];
237 	u32 state_ptr;
238 	u32 reserved;
239 } __attribute__((packed));
240 #define SA_HASH160_LEN		(sizeof(struct dynamic_sa_hash160)/4)
241 #define SA_HASH160_CONTENTS     0x2000a502
242 
243 #endif
244