1049359d6SJames Hsiao /**
2049359d6SJames Hsiao  * AMCC SoC PPC4xx Crypto Driver
3049359d6SJames Hsiao  *
4049359d6SJames Hsiao  * Copyright (c) 2008 Applied Micro Circuits Corporation.
5049359d6SJames Hsiao  * All rights reserved. James Hsiao <jhsiao@amcc.com>
6049359d6SJames Hsiao  *
7049359d6SJames Hsiao  * This program is free software; you can redistribute it and/or modify
8049359d6SJames Hsiao  * it under the terms of the GNU General Public License as published by
9049359d6SJames Hsiao  * the Free Software Foundation; either version 2 of the License, or
10049359d6SJames Hsiao  * (at your option) any later version.
11049359d6SJames Hsiao  *
12049359d6SJames Hsiao  * This program is distributed in the hope that it will be useful,
13049359d6SJames Hsiao  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14049359d6SJames Hsiao  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15049359d6SJames Hsiao  * GNU General Public License for more details.
16049359d6SJames Hsiao  *
17049359d6SJames Hsiao  * This file defines the security context
1825985edcSLucas De Marchi  * associate format.
19049359d6SJames Hsiao  */
20049359d6SJames Hsiao 
21049359d6SJames Hsiao #ifndef __CRYPTO4XX_SA_H__
22049359d6SJames Hsiao #define __CRYPTO4XX_SA_H__
23049359d6SJames Hsiao 
24049359d6SJames Hsiao #define AES_IV_SIZE				16
25049359d6SJames Hsiao 
26049359d6SJames Hsiao /**
27049359d6SJames Hsiao  * Contents of Dynamic Security Association (SA) with all possible fields
28049359d6SJames Hsiao  */
29049359d6SJames Hsiao union dynamic_sa_contents {
30049359d6SJames Hsiao 	struct {
31049359d6SJames Hsiao 		u32 arc4_state_ptr:1;
32049359d6SJames Hsiao 		u32 arc4_ij_ptr:1;
33049359d6SJames Hsiao 		u32 state_ptr:1;
34049359d6SJames Hsiao 		u32 iv3:1;
35049359d6SJames Hsiao 		u32 iv2:1;
36049359d6SJames Hsiao 		u32 iv1:1;
37049359d6SJames Hsiao 		u32 iv0:1;
38049359d6SJames Hsiao 		u32 seq_num_mask3:1;
39049359d6SJames Hsiao 		u32 seq_num_mask2:1;
40049359d6SJames Hsiao 		u32 seq_num_mask1:1;
41049359d6SJames Hsiao 		u32 seq_num_mask0:1;
42049359d6SJames Hsiao 		u32 seq_num1:1;
43049359d6SJames Hsiao 		u32 seq_num0:1;
44049359d6SJames Hsiao 		u32 spi:1;
45049359d6SJames Hsiao 		u32 outer_size:5;
46049359d6SJames Hsiao 		u32 inner_size:5;
47049359d6SJames Hsiao 		u32 key_size:4;
48049359d6SJames Hsiao 		u32 cmd_size:4;
49049359d6SJames Hsiao 	} bf;
50049359d6SJames Hsiao 	u32 w;
51049359d6SJames Hsiao } __attribute__((packed));
52049359d6SJames Hsiao 
53049359d6SJames Hsiao #define DIR_OUTBOUND				0
54049359d6SJames Hsiao #define DIR_INBOUND				1
55049359d6SJames Hsiao #define SA_OP_GROUP_BASIC			0
56049359d6SJames Hsiao #define SA_OPCODE_ENCRYPT			0
57049359d6SJames Hsiao #define SA_OPCODE_DECRYPT			0
58049359d6SJames Hsiao #define SA_OPCODE_HASH				3
59049359d6SJames Hsiao #define SA_CIPHER_ALG_DES			0
60049359d6SJames Hsiao #define SA_CIPHER_ALG_3DES			1
61049359d6SJames Hsiao #define SA_CIPHER_ALG_ARC4			2
62049359d6SJames Hsiao #define SA_CIPHER_ALG_AES			3
63049359d6SJames Hsiao #define SA_CIPHER_ALG_KASUMI			4
64049359d6SJames Hsiao #define SA_CIPHER_ALG_NULL			15
65049359d6SJames Hsiao 
66049359d6SJames Hsiao #define SA_HASH_ALG_MD5				0
67049359d6SJames Hsiao #define SA_HASH_ALG_SHA1			1
68049359d6SJames Hsiao #define SA_HASH_ALG_NULL			15
69049359d6SJames Hsiao #define SA_HASH_ALG_SHA1_DIGEST_SIZE		20
70049359d6SJames Hsiao 
71049359d6SJames Hsiao #define SA_LOAD_HASH_FROM_SA			0
72049359d6SJames Hsiao #define SA_LOAD_HASH_FROM_STATE			2
73049359d6SJames Hsiao #define SA_NOT_LOAD_HASH			3
74049359d6SJames Hsiao #define SA_LOAD_IV_FROM_SA			0
75049359d6SJames Hsiao #define SA_LOAD_IV_FROM_INPUT			1
76049359d6SJames Hsiao #define SA_LOAD_IV_FROM_STATE			2
77049359d6SJames Hsiao #define SA_LOAD_IV_GEN_IV			3
78049359d6SJames Hsiao 
79049359d6SJames Hsiao #define SA_PAD_TYPE_CONSTANT			2
80049359d6SJames Hsiao #define SA_PAD_TYPE_ZERO			3
81049359d6SJames Hsiao #define SA_PAD_TYPE_TLS				5
82049359d6SJames Hsiao #define SA_PAD_TYPE_DTLS			5
83049359d6SJames Hsiao #define SA_NOT_SAVE_HASH			0
84049359d6SJames Hsiao #define SA_SAVE_HASH				1
85049359d6SJames Hsiao #define SA_NOT_SAVE_IV				0
86049359d6SJames Hsiao #define SA_SAVE_IV				1
87049359d6SJames Hsiao #define SA_HEADER_PROC				1
88049359d6SJames Hsiao #define SA_NO_HEADER_PROC			0
89049359d6SJames Hsiao 
90049359d6SJames Hsiao union sa_command_0 {
91049359d6SJames Hsiao 	struct {
92049359d6SJames Hsiao 		u32 scatter:1;
93049359d6SJames Hsiao 		u32 gather:1;
94049359d6SJames Hsiao 		u32 save_hash_state:1;
95049359d6SJames Hsiao 		u32 save_iv:1;
96049359d6SJames Hsiao 		u32 load_hash_state:2;
97049359d6SJames Hsiao 		u32 load_iv:2;
98049359d6SJames Hsiao 		u32 digest_len:4;
99049359d6SJames Hsiao 		u32 hdr_proc:1;
100049359d6SJames Hsiao 		u32 extend_pad:1;
101049359d6SJames Hsiao 		u32 stream_cipher_pad:1;
102049359d6SJames Hsiao 		u32 rsv:1;
103049359d6SJames Hsiao 		u32 hash_alg:4;
104049359d6SJames Hsiao 		u32 cipher_alg:4;
105049359d6SJames Hsiao 		u32 pad_type:2;
106049359d6SJames Hsiao 		u32 op_group:2;
107049359d6SJames Hsiao 		u32 dir:1;
108049359d6SJames Hsiao 		u32 opcode:3;
109049359d6SJames Hsiao 	} bf;
110049359d6SJames Hsiao 	u32 w;
111049359d6SJames Hsiao } __attribute__((packed));
112049359d6SJames Hsiao 
113049359d6SJames Hsiao #define CRYPTO_MODE_ECB				0
114049359d6SJames Hsiao #define CRYPTO_MODE_CBC				1
115049359d6SJames Hsiao 
116049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_NO_FB		0
117049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_64BIT_OFB		0
118049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_8BIT_CFB		1
119049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_1BIT_CFB		2
120049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_128BIT_CFB		3
121049359d6SJames Hsiao 
122049359d6SJames Hsiao #define SA_AES_KEY_LEN_128			2
123049359d6SJames Hsiao #define SA_AES_KEY_LEN_192			3
124049359d6SJames Hsiao #define SA_AES_KEY_LEN_256			4
125049359d6SJames Hsiao 
126049359d6SJames Hsiao #define SA_REV2					1
127049359d6SJames Hsiao /**
128049359d6SJames Hsiao  * The follow defines bits sa_command_1
129049359d6SJames Hsiao  * In Basic hash mode  this bit define simple hash or hmac.
130049359d6SJames Hsiao  * In IPsec mode, this bit define muting control.
131049359d6SJames Hsiao  */
132049359d6SJames Hsiao #define SA_HASH_MODE_HASH			0
133049359d6SJames Hsiao #define SA_HASH_MODE_HMAC			1
134049359d6SJames Hsiao #define SA_MC_ENABLE				0
135049359d6SJames Hsiao #define SA_MC_DISABLE				1
136049359d6SJames Hsiao #define SA_NOT_COPY_HDR				0
137049359d6SJames Hsiao #define SA_COPY_HDR				1
138049359d6SJames Hsiao #define SA_NOT_COPY_PAD				0
139049359d6SJames Hsiao #define SA_COPY_PAD				1
140049359d6SJames Hsiao #define SA_NOT_COPY_PAYLOAD			0
141049359d6SJames Hsiao #define SA_COPY_PAYLOAD				1
142049359d6SJames Hsiao #define SA_EXTENDED_SN_OFF			0
143049359d6SJames Hsiao #define SA_EXTENDED_SN_ON			1
144049359d6SJames Hsiao #define SA_SEQ_MASK_OFF				0
145049359d6SJames Hsiao #define SA_SEQ_MASK_ON				1
146049359d6SJames Hsiao 
147049359d6SJames Hsiao union sa_command_1 {
148049359d6SJames Hsiao 	struct {
149049359d6SJames Hsiao 		u32 crypto_mode31:1;
150049359d6SJames Hsiao 		u32 save_arc4_state:1;
151049359d6SJames Hsiao 		u32 arc4_stateful:1;
152049359d6SJames Hsiao 		u32 key_len:5;
153049359d6SJames Hsiao 		u32 hash_crypto_offset:8;
154049359d6SJames Hsiao 		u32 sa_rev:2;
155049359d6SJames Hsiao 		u32 byte_offset:1;
156049359d6SJames Hsiao 		u32 hmac_muting:1;
157049359d6SJames Hsiao 		u32 feedback_mode:2;
158049359d6SJames Hsiao 		u32 crypto_mode9_8:2;
159049359d6SJames Hsiao 		u32 extended_seq_num:1;
160049359d6SJames Hsiao 		u32 seq_num_mask:1;
161049359d6SJames Hsiao 		u32 mutable_bit_proc:1;
162049359d6SJames Hsiao 		u32 ip_version:1;
163049359d6SJames Hsiao 		u32 copy_pad:1;
164049359d6SJames Hsiao 		u32 copy_payload:1;
165049359d6SJames Hsiao 		u32 copy_hdr:1;
166049359d6SJames Hsiao 		u32 rsv1:1;
167049359d6SJames Hsiao 	} bf;
168049359d6SJames Hsiao 	u32 w;
169049359d6SJames Hsiao } __attribute__((packed));
170049359d6SJames Hsiao 
171049359d6SJames Hsiao struct dynamic_sa_ctl {
172453e3090SChristian Lamparter 	union dynamic_sa_contents sa_contents;
173049359d6SJames Hsiao 	union sa_command_0 sa_command_0;
174049359d6SJames Hsiao 	union sa_command_1 sa_command_1;
175049359d6SJames Hsiao } __attribute__((packed));
176049359d6SJames Hsiao 
177049359d6SJames Hsiao /**
178049359d6SJames Hsiao  * State Record for Security Association (SA)
179049359d6SJames Hsiao  */
180049359d6SJames Hsiao struct  sa_state_record {
181049359d6SJames Hsiao 	u32 save_iv[4];
182049359d6SJames Hsiao 	u32 save_hash_byte_cnt[2];
183049359d6SJames Hsiao 	u32 save_digest[16];
184049359d6SJames Hsiao } __attribute__((packed));
185049359d6SJames Hsiao 
186049359d6SJames Hsiao /**
187049359d6SJames Hsiao  * Security Association (SA) for AES128
188049359d6SJames Hsiao  *
189049359d6SJames Hsiao  */
190049359d6SJames Hsiao struct dynamic_sa_aes128 {
191049359d6SJames Hsiao 	struct dynamic_sa_ctl	ctrl;
192049359d6SJames Hsiao 	u32 key[4];
193049359d6SJames Hsiao 	u32 iv[4]; /* for CBC, OFC, and CFB mode */
194049359d6SJames Hsiao 	u32 state_ptr;
195049359d6SJames Hsiao 	u32 reserved;
196049359d6SJames Hsiao } __attribute__((packed));
197049359d6SJames Hsiao 
198049359d6SJames Hsiao #define SA_AES128_LEN		(sizeof(struct dynamic_sa_aes128)/4)
199049359d6SJames Hsiao #define SA_AES128_CONTENTS	0x3e000042
200049359d6SJames Hsiao 
201049359d6SJames Hsiao /*
202049359d6SJames Hsiao  * Security Association (SA) for AES192
203049359d6SJames Hsiao  */
204049359d6SJames Hsiao struct dynamic_sa_aes192 {
205049359d6SJames Hsiao 	struct dynamic_sa_ctl ctrl;
206049359d6SJames Hsiao 	u32 key[6];
207049359d6SJames Hsiao 	u32 iv[4]; /* for CBC, OFC, and CFB mode */
208049359d6SJames Hsiao 	u32 state_ptr;
209049359d6SJames Hsiao 	u32 reserved;
210049359d6SJames Hsiao } __attribute__((packed));
211049359d6SJames Hsiao 
212049359d6SJames Hsiao #define SA_AES192_LEN		(sizeof(struct dynamic_sa_aes192)/4)
213049359d6SJames Hsiao #define SA_AES192_CONTENTS	0x3e000062
214049359d6SJames Hsiao 
215049359d6SJames Hsiao /**
216049359d6SJames Hsiao  * Security Association (SA) for AES256
217049359d6SJames Hsiao  */
218049359d6SJames Hsiao struct dynamic_sa_aes256 {
219049359d6SJames Hsiao 	struct dynamic_sa_ctl ctrl;
220049359d6SJames Hsiao 	u32 key[8];
221049359d6SJames Hsiao 	u32 iv[4]; /* for CBC, OFC, and CFB mode */
222049359d6SJames Hsiao 	u32 state_ptr;
223049359d6SJames Hsiao 	u32 reserved;
224049359d6SJames Hsiao } __attribute__((packed));
225049359d6SJames Hsiao 
226049359d6SJames Hsiao #define SA_AES256_LEN		(sizeof(struct dynamic_sa_aes256)/4)
227049359d6SJames Hsiao #define SA_AES256_CONTENTS	0x3e000082
228049359d6SJames Hsiao #define SA_AES_CONTENTS		0x3e000002
229049359d6SJames Hsiao 
230049359d6SJames Hsiao /**
231049359d6SJames Hsiao  * Security Association (SA) for HASH160: HMAC-SHA1
232049359d6SJames Hsiao  */
233049359d6SJames Hsiao struct dynamic_sa_hash160 {
234049359d6SJames Hsiao 	struct dynamic_sa_ctl ctrl;
235049359d6SJames Hsiao 	u32 inner_digest[5];
236049359d6SJames Hsiao 	u32 outer_digest[5];
237049359d6SJames Hsiao 	u32 state_ptr;
238049359d6SJames Hsiao 	u32 reserved;
239049359d6SJames Hsiao } __attribute__((packed));
240049359d6SJames Hsiao #define SA_HASH160_LEN		(sizeof(struct dynamic_sa_hash160)/4)
241049359d6SJames Hsiao #define SA_HASH160_CONTENTS     0x2000a502
242049359d6SJames Hsiao 
243049359d6SJames Hsiao #endif
244