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