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