xref: /dflybsd-src/contrib/wpa_supplicant/src/pae/ieee802_1x_kay_i.h (revision 3a84a4273475ed07d0ab1c2dfeffdfedef35d9cd)
1*a1157835SDaniel Fojt /*
2*a1157835SDaniel Fojt  * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
3*a1157835SDaniel Fojt  * Copyright (c) 2013, Qualcomm Atheros, Inc.
4*a1157835SDaniel Fojt  *
5*a1157835SDaniel Fojt  * This software may be distributed under the terms of the BSD license.
6*a1157835SDaniel Fojt  * See README for more details.
7*a1157835SDaniel Fojt  */
8*a1157835SDaniel Fojt 
9*a1157835SDaniel Fojt #ifndef IEEE802_1X_KAY_I_H
10*a1157835SDaniel Fojt #define IEEE802_1X_KAY_I_H
11*a1157835SDaniel Fojt 
12*a1157835SDaniel Fojt #include "utils/list.h"
13*a1157835SDaniel Fojt #include "common/defs.h"
14*a1157835SDaniel Fojt #include "common/ieee802_1x_defs.h"
15*a1157835SDaniel Fojt 
16*a1157835SDaniel Fojt #define MKA_VERSION_ID              1
17*a1157835SDaniel Fojt 
18*a1157835SDaniel Fojt /* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 (MKPDU parameter sets) */
19*a1157835SDaniel Fojt enum mka_packet_type {
20*a1157835SDaniel Fojt 	MKA_BASIC_PARAMETER_SET = MKA_VERSION_ID,
21*a1157835SDaniel Fojt 	MKA_LIVE_PEER_LIST = 1,
22*a1157835SDaniel Fojt 	MKA_POTENTIAL_PEER_LIST = 2,
23*a1157835SDaniel Fojt 	MKA_SAK_USE = 3,
24*a1157835SDaniel Fojt 	MKA_DISTRIBUTED_SAK = 4,
25*a1157835SDaniel Fojt 	MKA_DISTRIBUTED_CAK = 5,
26*a1157835SDaniel Fojt 	MKA_KMD = 6,
27*a1157835SDaniel Fojt 	MKA_ANNOUNCEMENT = 7,
28*a1157835SDaniel Fojt 	MKA_ICV_INDICATOR = 255
29*a1157835SDaniel Fojt };
30*a1157835SDaniel Fojt 
31*a1157835SDaniel Fojt #define ICV_LEN                         16  /* 16 bytes */
32*a1157835SDaniel Fojt #define SAK_WRAPPED_LEN                 24
33*a1157835SDaniel Fojt /* KN + Wrapper SAK */
34*a1157835SDaniel Fojt #define DEFAULT_DIS_SAK_BODY_LENGTH     (SAK_WRAPPED_LEN + 4)
35*a1157835SDaniel Fojt #define MAX_RETRY_CNT                   5
36*a1157835SDaniel Fojt 
37*a1157835SDaniel Fojt struct ieee802_1x_kay;
38*a1157835SDaniel Fojt 
39*a1157835SDaniel Fojt struct ieee802_1x_mka_peer_id {
40*a1157835SDaniel Fojt 	u8 mi[MI_LEN];
41*a1157835SDaniel Fojt 	be32 mn;
42*a1157835SDaniel Fojt } STRUCT_PACKED;
43*a1157835SDaniel Fojt 
44*a1157835SDaniel Fojt struct ieee802_1x_kay_peer {
45*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci sci;
46*a1157835SDaniel Fojt 	u8 mi[MI_LEN];
47*a1157835SDaniel Fojt 	u32 mn;
48*a1157835SDaniel Fojt 	time_t expire;
49*a1157835SDaniel Fojt 	Boolean is_key_server;
50*a1157835SDaniel Fojt 	u8 key_server_priority;
51*a1157835SDaniel Fojt 	Boolean macsec_desired;
52*a1157835SDaniel Fojt 	enum macsec_cap macsec_capability;
53*a1157835SDaniel Fojt 	Boolean sak_used;
54*a1157835SDaniel Fojt 	int missing_sak_use_count;
55*a1157835SDaniel Fojt 	struct dl_list list;
56*a1157835SDaniel Fojt };
57*a1157835SDaniel Fojt 
58*a1157835SDaniel Fojt struct macsec_ciphersuite {
59*a1157835SDaniel Fojt 	u64 id;
60*a1157835SDaniel Fojt 	char name[32];
61*a1157835SDaniel Fojt 	enum macsec_cap capable;
62*a1157835SDaniel Fojt 	int sak_len; /* unit: byte */
63*a1157835SDaniel Fojt };
64*a1157835SDaniel Fojt 
65*a1157835SDaniel Fojt struct mka_alg {
66*a1157835SDaniel Fojt 	u8 parameter[4];
67*a1157835SDaniel Fojt 	size_t icv_len;
68*a1157835SDaniel Fojt 
69*a1157835SDaniel Fojt 	int (*cak_trfm)(const u8 *msk, size_t msk_bytes, const u8 *mac1,
70*a1157835SDaniel Fojt 			const u8 *mac2, u8 *cak, size_t cak_bytes);
71*a1157835SDaniel Fojt 	int (*ckn_trfm)(const u8 *msk, size_t msk_bytes, const u8 *mac1,
72*a1157835SDaniel Fojt 			const u8 *mac2, const u8 *sid, size_t sid_len, u8 *ckn);
73*a1157835SDaniel Fojt 	int (*kek_trfm)(const u8 *cak, size_t cak_bytes,
74*a1157835SDaniel Fojt 			const u8 *ckn, size_t ckn_len,
75*a1157835SDaniel Fojt 			u8 *kek, size_t kek_bytes);
76*a1157835SDaniel Fojt 	int (*ick_trfm)(const u8 *cak, size_t cak_bytes,
77*a1157835SDaniel Fojt 			const u8 *ckn, size_t ckn_len,
78*a1157835SDaniel Fojt 			u8 *ick, size_t ick_bytes);
79*a1157835SDaniel Fojt 	int (*icv_hash)(const u8 *ick, size_t ick_bytes,
80*a1157835SDaniel Fojt 			const u8 *msg, size_t msg_len, u8 *icv);
81*a1157835SDaniel Fojt };
82*a1157835SDaniel Fojt 
83*a1157835SDaniel Fojt #define DEFAULT_MKA_ALG_INDEX 0
84*a1157835SDaniel Fojt 
85*a1157835SDaniel Fojt /* See IEEE Std 802.1X-2010, 9.16 MKA management */
86*a1157835SDaniel Fojt struct ieee802_1x_mka_participant {
87*a1157835SDaniel Fojt 	/* used for active and potential participant */
88*a1157835SDaniel Fojt 	struct mka_key_name ckn;
89*a1157835SDaniel Fojt 	struct mka_key cak;
90*a1157835SDaniel Fojt 	Boolean cached;
91*a1157835SDaniel Fojt 
92*a1157835SDaniel Fojt 	/* used by management to monitor and control activation */
93*a1157835SDaniel Fojt 	Boolean active;
94*a1157835SDaniel Fojt 	Boolean participant;
95*a1157835SDaniel Fojt 	Boolean retain;
96*a1157835SDaniel Fojt 	enum mka_created_mode mode;
97*a1157835SDaniel Fojt 
98*a1157835SDaniel Fojt 	enum activate_ctrl { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;
99*a1157835SDaniel Fojt 
100*a1157835SDaniel Fojt 	/* used for active participant */
101*a1157835SDaniel Fojt 	Boolean principal;
102*a1157835SDaniel Fojt 	struct dl_list live_peers;
103*a1157835SDaniel Fojt 	struct dl_list potential_peers;
104*a1157835SDaniel Fojt 
105*a1157835SDaniel Fojt 	/* not defined in IEEE 802.1X */
106*a1157835SDaniel Fojt 	struct dl_list list;
107*a1157835SDaniel Fojt 
108*a1157835SDaniel Fojt 	struct mka_key kek;
109*a1157835SDaniel Fojt 	struct mka_key ick;
110*a1157835SDaniel Fojt 
111*a1157835SDaniel Fojt 	struct ieee802_1x_mka_ki lki;
112*a1157835SDaniel Fojt 	u8 lan;
113*a1157835SDaniel Fojt 	Boolean ltx;
114*a1157835SDaniel Fojt 	Boolean lrx;
115*a1157835SDaniel Fojt 
116*a1157835SDaniel Fojt 	struct ieee802_1x_mka_ki oki;
117*a1157835SDaniel Fojt 	u8 oan;
118*a1157835SDaniel Fojt 	Boolean otx;
119*a1157835SDaniel Fojt 	Boolean orx;
120*a1157835SDaniel Fojt 
121*a1157835SDaniel Fojt 	Boolean is_key_server;
122*a1157835SDaniel Fojt 	Boolean is_obliged_key_server;
123*a1157835SDaniel Fojt 	Boolean can_be_key_server;
124*a1157835SDaniel Fojt 	Boolean is_elected;
125*a1157835SDaniel Fojt 
126*a1157835SDaniel Fojt 	struct dl_list sak_list;
127*a1157835SDaniel Fojt 	struct dl_list rxsc_list;
128*a1157835SDaniel Fojt 
129*a1157835SDaniel Fojt 	struct transmit_sc *txsc;
130*a1157835SDaniel Fojt 
131*a1157835SDaniel Fojt 	u8 mi[MI_LEN];
132*a1157835SDaniel Fojt 	u32 mn;
133*a1157835SDaniel Fojt 
134*a1157835SDaniel Fojt 	/* Current peer MI and SCI during MKPDU processing */
135*a1157835SDaniel Fojt 	struct ieee802_1x_mka_peer_id current_peer_id;
136*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci current_peer_sci;
137*a1157835SDaniel Fojt 
138*a1157835SDaniel Fojt 	time_t cak_life;
139*a1157835SDaniel Fojt 	time_t mka_life;
140*a1157835SDaniel Fojt 	Boolean to_dist_sak;
141*a1157835SDaniel Fojt 	Boolean to_use_sak;
142*a1157835SDaniel Fojt 	Boolean new_sak;
143*a1157835SDaniel Fojt 
144*a1157835SDaniel Fojt 	Boolean advised_desired;
145*a1157835SDaniel Fojt 	enum macsec_cap advised_capability;
146*a1157835SDaniel Fojt 
147*a1157835SDaniel Fojt 	struct data_key *new_key;
148*a1157835SDaniel Fojt 	u32 retry_count;
149*a1157835SDaniel Fojt 
150*a1157835SDaniel Fojt 	struct ieee802_1x_kay *kay;
151*a1157835SDaniel Fojt };
152*a1157835SDaniel Fojt 
153*a1157835SDaniel Fojt struct ieee802_1x_mka_hdr {
154*a1157835SDaniel Fojt 	/* octet 1 */
155*a1157835SDaniel Fojt 	u8 type;
156*a1157835SDaniel Fojt 	/* octet 2 */
157*a1157835SDaniel Fojt 	u8 reserve;
158*a1157835SDaniel Fojt 	/* octet 3 */
159*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
160*a1157835SDaniel Fojt 	u8 length:4;
161*a1157835SDaniel Fojt 	u8 reserve1:4;
162*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
163*a1157835SDaniel Fojt 	u8 reserve1:4;
164*a1157835SDaniel Fojt 	u8 length:4;
165*a1157835SDaniel Fojt #else
166*a1157835SDaniel Fojt #error "Please fix <bits/endian.h>"
167*a1157835SDaniel Fojt #endif
168*a1157835SDaniel Fojt 	/* octet 4 */
169*a1157835SDaniel Fojt 	u8 length1;
170*a1157835SDaniel Fojt } STRUCT_PACKED;
171*a1157835SDaniel Fojt 
172*a1157835SDaniel Fojt #define MKA_HDR_LEN sizeof(struct ieee802_1x_mka_hdr)
173*a1157835SDaniel Fojt 
174*a1157835SDaniel Fojt /**
175*a1157835SDaniel Fojt  * struct ieee802_1x_mka_basic_body - Basic Parameter Set (Figure 11-8)
176*a1157835SDaniel Fojt  * @version: MKA Version Identifier
177*a1157835SDaniel Fojt  * @priority: Key Server Priority
178*a1157835SDaniel Fojt  * @length: Parameter set body length
179*a1157835SDaniel Fojt  * @macsec_capability: MACsec capability, as defined in ieee802_1x_defs.h
180*a1157835SDaniel Fojt  * @macsec_desired: the participant wants MACsec to be used to protect frames
181*a1157835SDaniel Fojt  *	(9.6.1)
182*a1157835SDaniel Fojt  * @key_server: the participant has not decided that another participant is or
183*a1157835SDaniel Fojt  *	will be the key server (9.5.1)
184*a1157835SDaniel Fojt  * @length1: Parameter set body length (cont)
185*a1157835SDaniel Fojt  * @actor_mi: Actor's Member Identifier
186*a1157835SDaniel Fojt  * @actor_mn: Actor's Message Number
187*a1157835SDaniel Fojt  * @algo_agility: Algorithm Agility parameter
188*a1157835SDaniel Fojt  * @ckn: CAK Name
189*a1157835SDaniel Fojt  */
190*a1157835SDaniel Fojt struct ieee802_1x_mka_basic_body {
191*a1157835SDaniel Fojt 	/* octet 1 */
192*a1157835SDaniel Fojt 	u8 version;
193*a1157835SDaniel Fojt 	/* octet 2 */
194*a1157835SDaniel Fojt 	u8 priority;
195*a1157835SDaniel Fojt 	/* octet 3 */
196*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
197*a1157835SDaniel Fojt 	u8 length:4;
198*a1157835SDaniel Fojt 	u8 macsec_capability:2;
199*a1157835SDaniel Fojt 	u8 macsec_desired:1;
200*a1157835SDaniel Fojt 	u8 key_server:1;
201*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
202*a1157835SDaniel Fojt 	u8 key_server:1;
203*a1157835SDaniel Fojt 	u8 macsec_desired:1;
204*a1157835SDaniel Fojt 	u8 macsec_capability:2;
205*a1157835SDaniel Fojt 	u8 length:4;
206*a1157835SDaniel Fojt #endif
207*a1157835SDaniel Fojt 	/* octet 4 */
208*a1157835SDaniel Fojt 	u8 length1;
209*a1157835SDaniel Fojt 
210*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci actor_sci;
211*a1157835SDaniel Fojt 	u8 actor_mi[MI_LEN];
212*a1157835SDaniel Fojt 	be32 actor_mn;
213*a1157835SDaniel Fojt 	u8 algo_agility[4];
214*a1157835SDaniel Fojt 
215*a1157835SDaniel Fojt 	/* followed by CAK Name */
216*a1157835SDaniel Fojt 	u8 ckn[0];
217*a1157835SDaniel Fojt } STRUCT_PACKED;
218*a1157835SDaniel Fojt 
219*a1157835SDaniel Fojt /**
220*a1157835SDaniel Fojt  * struct ieee802_1x_mka_peer_body - Live Peer List and Potential Peer List
221*a1157835SDaniel Fojt  *	parameter sets (Figure 11-9)
222*a1157835SDaniel Fojt  * @type: Parameter set type (1 or 2)
223*a1157835SDaniel Fojt  * @length: Parameter set body length
224*a1157835SDaniel Fojt  * @length1: Parameter set body length (cont)
225*a1157835SDaniel Fojt  * @peer: array of (MI, MN) pairs
226*a1157835SDaniel Fojt  */
227*a1157835SDaniel Fojt struct ieee802_1x_mka_peer_body {
228*a1157835SDaniel Fojt 	/* octet 1 */
229*a1157835SDaniel Fojt 	u8 type;
230*a1157835SDaniel Fojt 	/* octet 2 */
231*a1157835SDaniel Fojt 	u8 reserve;
232*a1157835SDaniel Fojt 	/* octet 3 */
233*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
234*a1157835SDaniel Fojt 	u8 length:4;
235*a1157835SDaniel Fojt 	u8 reserve1:4;
236*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
237*a1157835SDaniel Fojt 	u8 reserve1:4;
238*a1157835SDaniel Fojt 	u8 length:4;
239*a1157835SDaniel Fojt #endif
240*a1157835SDaniel Fojt 	/* octet 4 */
241*a1157835SDaniel Fojt 	u8 length1;
242*a1157835SDaniel Fojt 
243*a1157835SDaniel Fojt 	/* followed by Peers */
244*a1157835SDaniel Fojt 	u8 peer[0];
245*a1157835SDaniel Fojt } STRUCT_PACKED;
246*a1157835SDaniel Fojt 
247*a1157835SDaniel Fojt /**
248*a1157835SDaniel Fojt  * struct ieee802_1x_mka_sak_use_body - MACsec SAK Use parameter set (Figure
249*a1157835SDaniel Fojt  *	11-10)
250*a1157835SDaniel Fojt  * @type: MKA message type
251*a1157835SDaniel Fojt  * @lan: latest key AN
252*a1157835SDaniel Fojt  * @ltx: latest key TX
253*a1157835SDaniel Fojt  * @lrx: latest key RX
254*a1157835SDaniel Fojt  * @oan: old key AN
255*a1157835SDaniel Fojt  * @otx: old key TX
256*a1157835SDaniel Fojt  * @orx: old key RX
257*a1157835SDaniel Fojt  * @ptx: plain TX, ie protectFrames is False
258*a1157835SDaniel Fojt  * @prx: plain RX, ie validateFrames is not Strict
259*a1157835SDaniel Fojt  * @delay_protect: True if LPNs are being reported sufficiently frequently to
260*a1157835SDaniel Fojt  *	allow the recipient to provide data delay protection. If False, the LPN
261*a1157835SDaniel Fojt  *	can be reported as zero.
262*a1157835SDaniel Fojt  * @lsrv_mi: latest key server MI
263*a1157835SDaniel Fojt  * @lkn: latest key number (together with MI, form the KI)
264*a1157835SDaniel Fojt  * @llpn: latest lowest acceptable PN (LPN)
265*a1157835SDaniel Fojt  * @osrv_mi: old key server MI
266*a1157835SDaniel Fojt  * @okn: old key number (together with MI, form the KI)
267*a1157835SDaniel Fojt  * @olpn: old lowest acceptable PN (LPN)
268*a1157835SDaniel Fojt  */
269*a1157835SDaniel Fojt struct ieee802_1x_mka_sak_use_body {
270*a1157835SDaniel Fojt 	/* octet 1 */
271*a1157835SDaniel Fojt 	u8 type;
272*a1157835SDaniel Fojt 	/* octet 2 */
273*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
274*a1157835SDaniel Fojt 	u8 orx:1;
275*a1157835SDaniel Fojt 	u8 otx:1;
276*a1157835SDaniel Fojt 	u8 oan:2;
277*a1157835SDaniel Fojt 	u8 lrx:1;
278*a1157835SDaniel Fojt 	u8 ltx:1;
279*a1157835SDaniel Fojt 	u8 lan:2;
280*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
281*a1157835SDaniel Fojt 	u8 lan:2;
282*a1157835SDaniel Fojt 	u8 ltx:1;
283*a1157835SDaniel Fojt 	u8 lrx:1;
284*a1157835SDaniel Fojt 	u8 oan:2;
285*a1157835SDaniel Fojt 	u8 otx:1;
286*a1157835SDaniel Fojt 	u8 orx:1;
287*a1157835SDaniel Fojt #endif
288*a1157835SDaniel Fojt 
289*a1157835SDaniel Fojt 	/* octet 3 */
290*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
291*a1157835SDaniel Fojt 	u8 length:4;
292*a1157835SDaniel Fojt 	u8 delay_protect:1;
293*a1157835SDaniel Fojt 	u8 reserve:1;
294*a1157835SDaniel Fojt 	u8 prx:1;
295*a1157835SDaniel Fojt 	u8 ptx:1;
296*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
297*a1157835SDaniel Fojt 	u8 ptx:1;
298*a1157835SDaniel Fojt 	u8 prx:1;
299*a1157835SDaniel Fojt 	u8 reserve:1;
300*a1157835SDaniel Fojt 	u8 delay_protect:1;
301*a1157835SDaniel Fojt 	u8 length:4;
302*a1157835SDaniel Fojt #endif
303*a1157835SDaniel Fojt 
304*a1157835SDaniel Fojt 	/* octet 4 */
305*a1157835SDaniel Fojt 	u8 length1;
306*a1157835SDaniel Fojt 
307*a1157835SDaniel Fojt 	/* octet 5 - 16 */
308*a1157835SDaniel Fojt 	u8 lsrv_mi[MI_LEN];
309*a1157835SDaniel Fojt 	/* octet 17 - 20 */
310*a1157835SDaniel Fojt 	be32 lkn;
311*a1157835SDaniel Fojt 	/* octet 21 - 24 */
312*a1157835SDaniel Fojt 	be32 llpn;
313*a1157835SDaniel Fojt 
314*a1157835SDaniel Fojt 	/* octet 25 - 36 */
315*a1157835SDaniel Fojt 	u8 osrv_mi[MI_LEN];
316*a1157835SDaniel Fojt 	/* octet 37 - 40 */
317*a1157835SDaniel Fojt 	be32 okn;
318*a1157835SDaniel Fojt 	/* octet 41 - 44 */
319*a1157835SDaniel Fojt 	be32 olpn;
320*a1157835SDaniel Fojt } STRUCT_PACKED;
321*a1157835SDaniel Fojt 
322*a1157835SDaniel Fojt /**
323*a1157835SDaniel Fojt  * struct ieee802_1x_mka_dist_sak_body - Distributed SAK parameter set
324*a1157835SDaniel Fojt  *	(GCM-AES-128, Figure 11-11)
325*a1157835SDaniel Fojt  * @type: Parameter set type (4)
326*a1157835SDaniel Fojt  * @length: Parameter set body length
327*a1157835SDaniel Fojt  * @length1: Parameter set body length (cont)
328*a1157835SDaniel Fojt  *           Total parameter body length values:
329*a1157835SDaniel Fojt  *            -  0 for plain text
330*a1157835SDaniel Fojt  *            - 28 for GCM-AES-128
331*a1157835SDaniel Fojt  *            - 36 or more for other cipher suites
332*a1157835SDaniel Fojt  * @confid_offset: confidentiality offset, as defined in ieee802_1x_defs.h
333*a1157835SDaniel Fojt  * @dan: distributed AN (0 for plain text)
334*a1157835SDaniel Fojt  * @kn: Key Number
335*a1157835SDaniel Fojt  * @sak: AES Key Wrap of SAK (see 9.8)
336*a1157835SDaniel Fojt  */
337*a1157835SDaniel Fojt struct ieee802_1x_mka_dist_sak_body {
338*a1157835SDaniel Fojt 	/* octet 1 */
339*a1157835SDaniel Fojt 	u8 type;
340*a1157835SDaniel Fojt 	/* octet 2 */
341*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
342*a1157835SDaniel Fojt 	u8 reserve:4;
343*a1157835SDaniel Fojt 	u8 confid_offset:2;
344*a1157835SDaniel Fojt 	u8 dan:2;
345*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
346*a1157835SDaniel Fojt 	u8 dan:2;
347*a1157835SDaniel Fojt 	u8 confid_offset:2;
348*a1157835SDaniel Fojt 	u8 reserve:4;
349*a1157835SDaniel Fojt #endif
350*a1157835SDaniel Fojt 	/* octet 3 */
351*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
352*a1157835SDaniel Fojt 	u8 length:4;
353*a1157835SDaniel Fojt 	u8 reserve1:4;
354*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
355*a1157835SDaniel Fojt 	u8 reserve1:4;
356*a1157835SDaniel Fojt 	u8 length:4;
357*a1157835SDaniel Fojt #endif
358*a1157835SDaniel Fojt 	/* octet 4 */
359*a1157835SDaniel Fojt 	u8 length1;
360*a1157835SDaniel Fojt 	/* octet 5 - 8 */
361*a1157835SDaniel Fojt 	be32 kn;
362*a1157835SDaniel Fojt 
363*a1157835SDaniel Fojt 	/* for GCM-AES-128: octet 9-32: SAK
364*a1157835SDaniel Fojt 	 * for other cipher suite: octet 9-16: cipher suite id, octet 17-: SAK
365*a1157835SDaniel Fojt 	 */
366*a1157835SDaniel Fojt 	u8 sak[0];
367*a1157835SDaniel Fojt } STRUCT_PACKED;
368*a1157835SDaniel Fojt 
369*a1157835SDaniel Fojt /**
370*a1157835SDaniel Fojt  * struct ieee802_1x_mka_dist_cak_body - Distributed CAK parameter set (Figure
371*a1157835SDaniel Fojt  *	11-13)
372*a1157835SDaniel Fojt  * @type: Parameter set type (5)
373*a1157835SDaniel Fojt  * @length: Parameter set body length
374*a1157835SDaniel Fojt  * @length1: Parameter set body length (cont)
375*a1157835SDaniel Fojt  *           Total parameter body length values:
376*a1157835SDaniel Fojt  *            -  0 for plain text
377*a1157835SDaniel Fojt  *            - 28 for GCM-AES-128
378*a1157835SDaniel Fojt  *            - 36 or more for other cipher suites
379*a1157835SDaniel Fojt  * @cak: AES Key Wrap of CAK (see 9.8)
380*a1157835SDaniel Fojt  * @ckn: CAK Name
381*a1157835SDaniel Fojt  */
382*a1157835SDaniel Fojt struct ieee802_1x_mka_dist_cak_body {
383*a1157835SDaniel Fojt 	/* octet 1 */
384*a1157835SDaniel Fojt 	u8 type;
385*a1157835SDaniel Fojt 	/* octet 2 */
386*a1157835SDaniel Fojt 	u8 reserve;
387*a1157835SDaniel Fojt 	/* octet 3 */
388*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
389*a1157835SDaniel Fojt 	u8 length:4;
390*a1157835SDaniel Fojt 	u8 reserve1:4;
391*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
392*a1157835SDaniel Fojt 	u8 reserve1:4;
393*a1157835SDaniel Fojt 	u8 length:4;
394*a1157835SDaniel Fojt #endif
395*a1157835SDaniel Fojt 	/* octet 4 */
396*a1157835SDaniel Fojt 	u8 length1;
397*a1157835SDaniel Fojt 
398*a1157835SDaniel Fojt 	/* octet 5 - 28 */
399*a1157835SDaniel Fojt 	u8 cak[24];
400*a1157835SDaniel Fojt 
401*a1157835SDaniel Fojt 	/* followed by CAK Name, 29- */
402*a1157835SDaniel Fojt 	u8 ckn[0];
403*a1157835SDaniel Fojt } STRUCT_PACKED;
404*a1157835SDaniel Fojt 
405*a1157835SDaniel Fojt struct ieee802_1x_mka_icv_body {
406*a1157835SDaniel Fojt 	/* octet 1 */
407*a1157835SDaniel Fojt 	u8 type;
408*a1157835SDaniel Fojt 	/* octet 2 */
409*a1157835SDaniel Fojt 	u8 reserve;
410*a1157835SDaniel Fojt 	/* octet 3 */
411*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN
412*a1157835SDaniel Fojt 	u8 length:4;
413*a1157835SDaniel Fojt 	u8 reserve1:4;
414*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN
415*a1157835SDaniel Fojt 	u8 reserve1:4;
416*a1157835SDaniel Fojt 	u8 length:4;
417*a1157835SDaniel Fojt #endif
418*a1157835SDaniel Fojt 	/* octet 4 */
419*a1157835SDaniel Fojt 	u8 length1;
420*a1157835SDaniel Fojt 
421*a1157835SDaniel Fojt 	/* octet 5 - */
422*a1157835SDaniel Fojt 	u8 icv[0];
423*a1157835SDaniel Fojt } STRUCT_PACKED;
424*a1157835SDaniel Fojt 
425*a1157835SDaniel Fojt #endif /* IEEE802_1X_KAY_I_H */
426