xref: /openbmc/linux/drivers/crypto/caam/pdb.h (revision 2c684d89)
1 /*
2  * CAAM Protocol Data Block (PDB) definition header file
3  *
4  * Copyright 2008-2012 Freescale Semiconductor, Inc.
5  *
6  */
7 
8 #ifndef CAAM_PDB_H
9 #define CAAM_PDB_H
10 
11 /*
12  * PDB- IPSec ESP Header Modification Options
13  */
14 #define PDBHMO_ESP_DECAP_SHIFT	12
15 #define PDBHMO_ESP_ENCAP_SHIFT	4
16 /*
17  * Encap and Decap - Decrement TTL (Hop Limit) - Based on the value of the
18  * Options Byte IP version (IPvsn) field:
19  * if IPv4, decrement the inner IP header TTL field (byte 8);
20  * if IPv6 decrement the inner IP header Hop Limit field (byte 7).
21 */
22 #define PDBHMO_ESP_DECAP_DEC_TTL	(0x02 << PDBHMO_ESP_DECAP_SHIFT)
23 #define PDBHMO_ESP_ENCAP_DEC_TTL	(0x02 << PDBHMO_ESP_ENCAP_SHIFT)
24 /*
25  * Decap - DiffServ Copy - Copy the IPv4 TOS or IPv6 Traffic Class byte
26  * from the outer IP header to the inner IP header.
27  */
28 #define PDBHMO_ESP_DIFFSERV		(0x01 << PDBHMO_ESP_DECAP_SHIFT)
29 /*
30  * Encap- Copy DF bit -if an IPv4 tunnel mode outer IP header is coming from
31  * the PDB, copy the DF bit from the inner IP header to the outer IP header.
32  */
33 #define PDBHMO_ESP_DFBIT		(0x04 << PDBHMO_ESP_ENCAP_SHIFT)
34 
35 /*
36  * PDB - IPSec ESP Encap/Decap Options
37  */
38 #define PDBOPTS_ESP_ARSNONE	0x00 /* no antireplay window */
39 #define PDBOPTS_ESP_ARS32	0x40 /* 32-entry antireplay window */
40 #define PDBOPTS_ESP_ARS64	0xc0 /* 64-entry antireplay window */
41 #define PDBOPTS_ESP_IVSRC	0x20 /* IV comes from internal random gen */
42 #define PDBOPTS_ESP_ESN		0x10 /* extended sequence included */
43 #define PDBOPTS_ESP_OUTFMT	0x08 /* output only decapsulation (decap) */
44 #define PDBOPTS_ESP_IPHDRSRC	0x08 /* IP header comes from PDB (encap) */
45 #define PDBOPTS_ESP_INCIPHDR	0x04 /* Prepend IP header to output frame */
46 #define PDBOPTS_ESP_IPVSN	0x02 /* process IPv6 header */
47 #define PDBOPTS_ESP_AOFL	0x04 /* adjust out frame len (decap, SEC>=5.3)*/
48 #define PDBOPTS_ESP_TUNNEL	0x01 /* tunnel mode next-header byte */
49 #define PDBOPTS_ESP_IPV6	0x02 /* ip header version is V6 */
50 #define PDBOPTS_ESP_DIFFSERV	0x40 /* copy TOS/TC from inner iphdr */
51 #define PDBOPTS_ESP_UPDATE_CSUM 0x80 /* encap-update ip header checksum */
52 #define PDBOPTS_ESP_VERIFY_CSUM 0x20 /* decap-validate ip header checksum */
53 
54 /*
55  * General IPSec encap/decap PDB definitions
56  */
57 struct ipsec_encap_cbc {
58 	u32 iv[4];
59 };
60 
61 struct ipsec_encap_ctr {
62 	u32 ctr_nonce;
63 	u32 ctr_initial;
64 	u32 iv[2];
65 };
66 
67 struct ipsec_encap_ccm {
68 	u32 salt; /* lower 24 bits */
69 	u8 b0_flags;
70 	u8 ctr_flags;
71 	u16 ctr_initial;
72 	u32 iv[2];
73 };
74 
75 struct ipsec_encap_gcm {
76 	u32 salt; /* lower 24 bits */
77 	u32 rsvd1;
78 	u32 iv[2];
79 };
80 
81 struct ipsec_encap_pdb {
82 	u8 hmo_rsvd;
83 	u8 ip_nh;
84 	u8 ip_nh_offset;
85 	u8 options;
86 	u32 seq_num_ext_hi;
87 	u32 seq_num;
88 	union {
89 		struct ipsec_encap_cbc cbc;
90 		struct ipsec_encap_ctr ctr;
91 		struct ipsec_encap_ccm ccm;
92 		struct ipsec_encap_gcm gcm;
93 	};
94 	u32 spi;
95 	u16 rsvd1;
96 	u16 ip_hdr_len;
97 	u32 ip_hdr[0]; /* optional IP Header content */
98 };
99 
100 struct ipsec_decap_cbc {
101 	u32 rsvd[2];
102 };
103 
104 struct ipsec_decap_ctr {
105 	u32 salt;
106 	u32 ctr_initial;
107 };
108 
109 struct ipsec_decap_ccm {
110 	u32 salt;
111 	u8 iv_flags;
112 	u8 ctr_flags;
113 	u16 ctr_initial;
114 };
115 
116 struct ipsec_decap_gcm {
117 	u32 salt;
118 	u32 resvd;
119 };
120 
121 struct ipsec_decap_pdb {
122 	u16 hmo_ip_hdr_len;
123 	u8 ip_nh_offset;
124 	u8 options;
125 	union {
126 		struct ipsec_decap_cbc cbc;
127 		struct ipsec_decap_ctr ctr;
128 		struct ipsec_decap_ccm ccm;
129 		struct ipsec_decap_gcm gcm;
130 	};
131 	u32 seq_num_ext_hi;
132 	u32 seq_num;
133 	u32 anti_replay[2];
134 	u32 end_index[0];
135 };
136 
137 /*
138  * IPSec ESP Datapath Protocol Override Register (DPOVRD)
139  */
140 struct ipsec_deco_dpovrd {
141 #define IPSEC_ENCAP_DECO_DPOVRD_USE 0x80
142 	u8 ovrd_ecn;
143 	u8 ip_hdr_len;
144 	u8 nh_offset;
145 	u8 next_header; /* reserved if decap */
146 };
147 
148 /*
149  * IEEE 802.11i WiFi Protocol Data Block
150  */
151 #define WIFI_PDBOPTS_FCS	0x01
152 #define WIFI_PDBOPTS_AR		0x40
153 
154 struct wifi_encap_pdb {
155 	u16 mac_hdr_len;
156 	u8 rsvd;
157 	u8 options;
158 	u8 iv_flags;
159 	u8 pri;
160 	u16 pn1;
161 	u32 pn2;
162 	u16 frm_ctrl_mask;
163 	u16 seq_ctrl_mask;
164 	u8 rsvd1[2];
165 	u8 cnst;
166 	u8 key_id;
167 	u8 ctr_flags;
168 	u8 rsvd2;
169 	u16 ctr_init;
170 };
171 
172 struct wifi_decap_pdb {
173 	u16 mac_hdr_len;
174 	u8 rsvd;
175 	u8 options;
176 	u8 iv_flags;
177 	u8 pri;
178 	u16 pn1;
179 	u32 pn2;
180 	u16 frm_ctrl_mask;
181 	u16 seq_ctrl_mask;
182 	u8 rsvd1[4];
183 	u8 ctr_flags;
184 	u8 rsvd2;
185 	u16 ctr_init;
186 };
187 
188 /*
189  * IEEE 802.16 WiMAX Protocol Data Block
190  */
191 #define WIMAX_PDBOPTS_FCS	0x01
192 #define WIMAX_PDBOPTS_AR	0x40 /* decap only */
193 
194 struct wimax_encap_pdb {
195 	u8 rsvd[3];
196 	u8 options;
197 	u32 nonce;
198 	u8 b0_flags;
199 	u8 ctr_flags;
200 	u16 ctr_init;
201 	/* begin DECO writeback region */
202 	u32 pn;
203 	/* end DECO writeback region */
204 };
205 
206 struct wimax_decap_pdb {
207 	u8 rsvd[3];
208 	u8 options;
209 	u32 nonce;
210 	u8 iv_flags;
211 	u8 ctr_flags;
212 	u16 ctr_init;
213 	/* begin DECO writeback region */
214 	u32 pn;
215 	u8 rsvd1[2];
216 	u16 antireplay_len;
217 	u64 antireplay_scorecard;
218 	/* end DECO writeback region */
219 };
220 
221 /*
222  * IEEE 801.AE MacSEC Protocol Data Block
223  */
224 #define MACSEC_PDBOPTS_FCS	0x01
225 #define MACSEC_PDBOPTS_AR	0x40 /* used in decap only */
226 
227 struct macsec_encap_pdb {
228 	u16 aad_len;
229 	u8 rsvd;
230 	u8 options;
231 	u64 sci;
232 	u16 ethertype;
233 	u8 tci_an;
234 	u8 rsvd1;
235 	/* begin DECO writeback region */
236 	u32 pn;
237 	/* end DECO writeback region */
238 };
239 
240 struct macsec_decap_pdb {
241 	u16 aad_len;
242 	u8 rsvd;
243 	u8 options;
244 	u64 sci;
245 	u8 rsvd1[3];
246 	/* begin DECO writeback region */
247 	u8 antireplay_len;
248 	u32 pn;
249 	u64 antireplay_scorecard;
250 	/* end DECO writeback region */
251 };
252 
253 /*
254  * SSL/TLS/DTLS Protocol Data Blocks
255  */
256 
257 #define TLS_PDBOPTS_ARS32	0x40
258 #define TLS_PDBOPTS_ARS64	0xc0
259 #define TLS_PDBOPTS_OUTFMT	0x08
260 #define TLS_PDBOPTS_IV_WRTBK	0x02 /* 1.1/1.2/DTLS only */
261 #define TLS_PDBOPTS_EXP_RND_IV	0x01 /* 1.1/1.2/DTLS only */
262 
263 struct tls_block_encap_pdb {
264 	u8 type;
265 	u8 version[2];
266 	u8 options;
267 	u64 seq_num;
268 	u32 iv[4];
269 };
270 
271 struct tls_stream_encap_pdb {
272 	u8 type;
273 	u8 version[2];
274 	u8 options;
275 	u64 seq_num;
276 	u8 i;
277 	u8 j;
278 	u8 rsvd1[2];
279 };
280 
281 struct dtls_block_encap_pdb {
282 	u8 type;
283 	u8 version[2];
284 	u8 options;
285 	u16 epoch;
286 	u16 seq_num[3];
287 	u32 iv[4];
288 };
289 
290 struct tls_block_decap_pdb {
291 	u8 rsvd[3];
292 	u8 options;
293 	u64 seq_num;
294 	u32 iv[4];
295 };
296 
297 struct tls_stream_decap_pdb {
298 	u8 rsvd[3];
299 	u8 options;
300 	u64 seq_num;
301 	u8 i;
302 	u8 j;
303 	u8 rsvd1[2];
304 };
305 
306 struct dtls_block_decap_pdb {
307 	u8 rsvd[3];
308 	u8 options;
309 	u16 epoch;
310 	u16 seq_num[3];
311 	u32 iv[4];
312 	u64 antireplay_scorecard;
313 };
314 
315 /*
316  * SRTP Protocol Data Blocks
317  */
318 #define SRTP_PDBOPTS_MKI	0x08
319 #define SRTP_PDBOPTS_AR		0x40
320 
321 struct srtp_encap_pdb {
322 	u8 x_len;
323 	u8 mki_len;
324 	u8 n_tag;
325 	u8 options;
326 	u32 cnst0;
327 	u8 rsvd[2];
328 	u16 cnst1;
329 	u16 salt[7];
330 	u16 cnst2;
331 	u32 rsvd1;
332 	u32 roc;
333 	u32 opt_mki;
334 };
335 
336 struct srtp_decap_pdb {
337 	u8 x_len;
338 	u8 mki_len;
339 	u8 n_tag;
340 	u8 options;
341 	u32 cnst0;
342 	u8 rsvd[2];
343 	u16 cnst1;
344 	u16 salt[7];
345 	u16 cnst2;
346 	u16 rsvd1;
347 	u16 seq_num;
348 	u32 roc;
349 	u64 antireplay_scorecard;
350 };
351 
352 /*
353  * DSA/ECDSA Protocol Data Blocks
354  * Two of these exist: DSA-SIGN, and DSA-VERIFY. They are similar
355  * except for the treatment of "w" for verify, "s" for sign,
356  * and the placement of "a,b".
357  */
358 #define DSA_PDB_SGF_SHIFT	24
359 #define DSA_PDB_SGF_MASK	(0xff << DSA_PDB_SGF_SHIFT)
360 #define DSA_PDB_SGF_Q		(0x80 << DSA_PDB_SGF_SHIFT)
361 #define DSA_PDB_SGF_R		(0x40 << DSA_PDB_SGF_SHIFT)
362 #define DSA_PDB_SGF_G		(0x20 << DSA_PDB_SGF_SHIFT)
363 #define DSA_PDB_SGF_W		(0x10 << DSA_PDB_SGF_SHIFT)
364 #define DSA_PDB_SGF_S		(0x10 << DSA_PDB_SGF_SHIFT)
365 #define DSA_PDB_SGF_F		(0x08 << DSA_PDB_SGF_SHIFT)
366 #define DSA_PDB_SGF_C		(0x04 << DSA_PDB_SGF_SHIFT)
367 #define DSA_PDB_SGF_D		(0x02 << DSA_PDB_SGF_SHIFT)
368 #define DSA_PDB_SGF_AB_SIGN	(0x02 << DSA_PDB_SGF_SHIFT)
369 #define DSA_PDB_SGF_AB_VERIFY	(0x01 << DSA_PDB_SGF_SHIFT)
370 
371 #define DSA_PDB_L_SHIFT		7
372 #define DSA_PDB_L_MASK		(0x3ff << DSA_PDB_L_SHIFT)
373 
374 #define DSA_PDB_N_MASK		0x7f
375 
376 struct dsa_sign_pdb {
377 	u32 sgf_ln; /* Use DSA_PDB_ defintions per above */
378 	u8 *q;
379 	u8 *r;
380 	u8 *g;	/* or Gx,y */
381 	u8 *s;
382 	u8 *f;
383 	u8 *c;
384 	u8 *d;
385 	u8 *ab; /* ECC only */
386 	u8 *u;
387 };
388 
389 struct dsa_verify_pdb {
390 	u32 sgf_ln;
391 	u8 *q;
392 	u8 *r;
393 	u8 *g;	/* or Gx,y */
394 	u8 *w; /* or Wx,y */
395 	u8 *f;
396 	u8 *c;
397 	u8 *d;
398 	u8 *tmp; /* temporary data block */
399 	u8 *ab; /* only used if ECC processing */
400 };
401 
402 #endif
403