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 */
20union 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
85union 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
145union 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
169struct 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 */
178struct 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 */
191struct 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 */
205struct 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 */
219struct 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 */
234struct 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 */
248struct 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 */
264struct 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
274static inline u32
275get_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
297static 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
302static 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
310

source code of linux/drivers/crypto/amcc/crypto4xx_sa.h