xref: /freebsd/contrib/wpa/src/pae/ieee802_1x_kay_i.h (revision 39ee7a7a6bdd1557b1c3532abf60d139798ac88b)
1 /*
2  * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
3  * Copyright (c) 2013, Qualcomm Atheros, Inc.
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 #ifndef IEEE802_1X_KAY_I_H
10 #define IEEE802_1X_KAY_I_H
11 
12 #include "utils/list.h"
13 #include "common/defs.h"
14 #include "common/ieee802_1x_defs.h"
15 
16 #define MKA_VERSION_ID              1
17 
18 /* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 */
19 enum mka_packet_type {
20 	MKA_BASIC_PARAMETER_SET = MKA_VERSION_ID,
21 	MKA_LIVE_PEER_LIST = 1,
22 	MKA_POTENTIAL_PEER_LIST = 2,
23 	MKA_SAK_USE = 3,
24 	MKA_DISTRIBUTED_SAK = 4,
25 	MKA_DISTRIBUTED_CAK = 5,
26 	MKA_KMD = 6,
27 	MKA_ANNOUNCEMENT = 7,
28 	MKA_ICV_INDICATOR = 255
29 };
30 
31 #define ICV_LEN                         16  /* 16 bytes */
32 #define SAK_WRAPPED_LEN                 24
33 /* KN + Wrapper SAK */
34 #define DEFAULT_DIS_SAK_BODY_LENGTH     (SAK_WRAPPED_LEN + 4)
35 #define MAX_RETRY_CNT                   5
36 
37 struct ieee802_1x_kay;
38 
39 struct ieee802_1x_mka_peer_id {
40 	u8 mi[MI_LEN];
41 	u32 mn;
42 };
43 
44 struct ieee802_1x_kay_peer {
45 	struct ieee802_1x_mka_sci sci;
46 	u8 mi[MI_LEN];
47 	u32 mn;
48 	time_t expire;
49 	Boolean is_key_server;
50 	u8 key_server_priority;
51 	Boolean macsec_desired;
52 	enum macsec_cap macsec_capbility;
53 	Boolean sak_used;
54 	struct dl_list list;
55 };
56 
57 struct key_conf {
58 	u8 *key;
59 	struct ieee802_1x_mka_ki ki;
60 	enum confidentiality_offset offset;
61 	u8 an;
62 	Boolean tx;
63 	Boolean rx;
64 	int key_len; /* unit: byte */
65 };
66 
67 struct data_key {
68 	u8 *key;
69 	int key_len;
70 	struct ieee802_1x_mka_ki key_identifier;
71 	enum confidentiality_offset confidentiality_offset;
72 	u8 an;
73 	Boolean transmits;
74 	Boolean receives;
75 	struct os_time created_time;
76 	u32 next_pn;
77 
78 	/* not defined data */
79 	Boolean rx_latest;
80 	Boolean tx_latest;
81 
82 	int user;  /* FIXME: to indicate if it can be delete safely */
83 
84 	struct dl_list list;
85 };
86 
87 /* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
88 struct transmit_sc {
89 	struct ieee802_1x_mka_sci sci; /* const SCI sci */
90 	Boolean transmitting; /* bool transmitting (read only) */
91 
92 	struct os_time created_time; /* Time createdTime */
93 
94 	u8 encoding_sa; /* AN encodingSA (read only) */
95 	u8 enciphering_sa; /* AN encipheringSA (read only) */
96 
97 	/* not defined data */
98 	unsigned int channel;
99 
100 	struct dl_list list;
101 	struct dl_list sa_list;
102 };
103 
104 /* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
105 struct transmit_sa {
106 	Boolean in_use; /* bool inUse (read only) */
107 	u32 next_pn; /* PN nextPN (read only) */
108 	struct os_time created_time; /* Time createdTime */
109 
110 	Boolean enable_transmit; /* bool EnableTransmit */
111 
112 	u8 an;
113 	Boolean confidentiality;
114 	struct data_key *pkey;
115 
116 	struct transmit_sc *sc;
117 	struct dl_list list; /* list entry in struct transmit_sc::sa_list */
118 };
119 
120 /* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
121 struct receive_sc {
122 	struct ieee802_1x_mka_sci sci; /* const SCI sci */
123 	Boolean receiving; /* bool receiving (read only) */
124 
125 	struct os_time created_time; /* Time createdTime */
126 
127 	unsigned int channel;
128 
129 	struct dl_list list;
130 	struct dl_list sa_list;
131 };
132 
133 /* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
134 struct receive_sa {
135 	Boolean enable_receive; /* bool enableReceive */
136 	Boolean in_use; /* bool inUse (read only) */
137 
138 	u32 next_pn; /* PN nextPN (read only) */
139 	u32 lowest_pn; /* PN lowestPN (read only) */
140 	u8 an;
141 	struct os_time created_time;
142 
143 	struct data_key *pkey;
144 	struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
145 
146 	struct dl_list list;
147 };
148 
149 struct macsec_ciphersuite {
150 	u8 id[CS_ID_LEN];
151 	char name[32];
152 	enum macsec_cap capable;
153 	int sak_len; /* unit: byte */
154 
155 	u32 index;
156 };
157 
158 struct mka_alg {
159 	u8 parameter[4];
160 	size_t cak_len;
161 	size_t kek_len;
162 	size_t ick_len;
163 	size_t icv_len;
164 
165 	int (*cak_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2, u8 *cak);
166 	int (*ckn_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2,
167 			const u8 *sid, size_t sid_len, u8 *ckn);
168 	int (*kek_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *kek);
169 	int (*ick_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *ick);
170 	int (*icv_hash)(const u8 *ick, const u8 *msg, size_t msg_len, u8 *icv);
171 
172 	int index; /* index for configuring */
173 };
174 
175 #define DEFAULT_MKA_ALG_INDEX 0
176 
177 /* See IEEE Std 802.1X-2010, 9.16 MKA management */
178 struct ieee802_1x_mka_participant {
179 	/* used for active and potential participant */
180 	struct mka_key_name ckn;
181 	struct mka_key cak;
182 	Boolean cached;
183 
184 	/* used by management to monitor and control activation */
185 	Boolean active;
186 	Boolean participant;
187 	Boolean retain;
188 
189 	enum { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;
190 
191 	/* used for active participant */
192 	Boolean principal;
193 	struct dl_list live_peers;
194 	struct dl_list potential_peers;
195 
196 	/* not defined in IEEE 802.1X */
197 	struct dl_list list;
198 
199 	struct mka_key kek;
200 	struct mka_key ick;
201 
202 	struct ieee802_1x_mka_ki lki;
203 	u8 lan;
204 	Boolean ltx;
205 	Boolean lrx;
206 
207 	struct ieee802_1x_mka_ki oki;
208 	u8 oan;
209 	Boolean otx;
210 	Boolean orx;
211 
212 	Boolean is_key_server;
213 	Boolean is_obliged_key_server;
214 	Boolean can_be_key_server;
215 	Boolean is_elected;
216 
217 	struct dl_list sak_list;
218 	struct dl_list rxsc_list;
219 
220 	struct transmit_sc *txsc;
221 
222 	u8 mi[MI_LEN];
223 	u32 mn;
224 
225 	struct ieee802_1x_mka_peer_id current_peer_id;
226 	struct ieee802_1x_mka_sci current_peer_sci;
227 	time_t cak_life;
228 	time_t mka_life;
229 	Boolean to_dist_sak;
230 	Boolean to_use_sak;
231 	Boolean new_sak;
232 
233 	Boolean advised_desired;
234 	enum macsec_cap advised_capability;
235 
236 	struct data_key *new_key;
237 	u32 retry_count;
238 
239 	struct ieee802_1x_kay *kay;
240 };
241 
242 struct ieee802_1x_mka_hdr {
243 	/* octet 1 */
244 	u32 type:8;
245 	/* octet 2 */
246 	u32 reserve:8;
247 	/* octet 3 */
248 #if __BYTE_ORDER == __LITTLE_ENDIAN
249 	u32 length:4;
250 	u32 reserve1:4;
251 #elif __BYTE_ORDER == __BIG_ENDIAN
252 	u32 reserve1:4;
253 	u32 length:4;
254 #else
255 #error "Please fix <bits/endian.h>"
256 #endif
257 	/* octet 4 */
258 	u32 length1:8;
259 };
260 
261 #define MKA_HDR_LEN sizeof(struct ieee802_1x_mka_hdr)
262 
263 struct ieee802_1x_mka_basic_body {
264 	/* octet 1 */
265 	u32 version:8;
266 	/* octet 2 */
267 	u32 priority:8;
268 	/* octet 3 */
269 #if __BYTE_ORDER == __LITTLE_ENDIAN
270 	u32 length:4;
271 	u32 macsec_capbility:2;
272 	u32 macsec_desired:1;
273 	u32 key_server:1;
274 #elif __BYTE_ORDER == __BIG_ENDIAN
275 	u32 key_server:1;
276 	u32 macsec_desired:1;
277 	u32 macsec_capbility:2;
278 	u32 length:4;
279 #endif
280 	/* octet 4 */
281 	u32 length1:8;
282 
283 	struct ieee802_1x_mka_sci actor_sci;
284 	u8 actor_mi[MI_LEN];
285 	u32 actor_mn;
286 	u8 algo_agility[4];
287 
288 	/* followed by CAK Name*/
289 	u8 ckn[0];
290 };
291 
292 struct ieee802_1x_mka_peer_body {
293 	/* octet 1 */
294 	u32 type:8;
295 	/* octet 2 */
296 	u32 reserve:8;
297 	/* octet 3 */
298 #if __BYTE_ORDER == __LITTLE_ENDIAN
299 	u32 length:4;
300 	u32 reserve1:4;
301 #elif __BYTE_ORDER == __BIG_ENDIAN
302 	u32 reserve1:4;
303 	u32 length:4;
304 #endif
305 	/* octet 4 */
306 	u32 length1:8;
307 
308 	u8 peer[0];
309 	/* followed by Peers */
310 };
311 
312 struct ieee802_1x_mka_sak_use_body {
313 	/* octet 1 */
314 	u32 type:8;
315 	/* octet 2 */
316 #if __BYTE_ORDER == __LITTLE_ENDIAN
317 	u32 orx:1;
318 	u32 otx:1;
319 	u32 oan:2;
320 	u32 lrx:1;
321 	u32 ltx:1;
322 	u32 lan:2;
323 #elif __BYTE_ORDER == __BIG_ENDIAN
324 	u32 lan:2;
325 	u32 ltx:1;
326 	u32 lrx:1;
327 	u32 oan:2;
328 	u32 otx:1;
329 	u32 orx:1;
330 #endif
331 
332 	/* octet 3 */
333 #if __BYTE_ORDER == __LITTLE_ENDIAN
334 	u32 length:4;
335 	u32 delay_protect:1;
336 	u32 reserve:1;
337 	u32 prx:1;
338 	u32 ptx:1;
339 #elif __BYTE_ORDER == __BIG_ENDIAN
340 	u32 ptx:1;
341 	u32 prx:1;
342 	u32 reserve:1;
343 	u32 delay_protect:1;
344 	u32 length:4;
345 #endif
346 
347 	/* octet 4 */
348 	u32 length1:8;
349 
350 	/* octet 5 - 16 */
351 	u8 lsrv_mi[MI_LEN];
352 	/* octet 17 - 20 */
353 	u32 lkn;
354 	/* octet 21 - 24 */
355 	u32 llpn;
356 
357 	/* octet 25 - 36 */
358 	u8 osrv_mi[MI_LEN];
359 	/* octet 37 - 40 */
360 	u32 okn;
361 	/* octet 41 - 44 */
362 	u32 olpn;
363 };
364 
365 
366 struct ieee802_1x_mka_dist_sak_body {
367 	/* octet 1 */
368 	u32 type:8;
369 	/* octet 2 */
370 #if __BYTE_ORDER == __LITTLE_ENDIAN
371 	u32 reserve:4;
372 	u32 confid_offset:2;
373 	u32 dan:2;
374 #elif __BYTE_ORDER == __BIG_ENDIAN
375 	u32 dan:2;
376 	u32 confid_offset:2;
377 	u32 reserve:4;
378 #endif
379 	/* octet 3 */
380 #if __BYTE_ORDER == __LITTLE_ENDIAN
381 	u32 length:4;
382 	u32 reserve1:4;
383 #elif __BYTE_ORDER == __BIG_ENDIAN
384 	u32 reserve1:4;
385 	u32 length:4;
386 #endif
387 	/* octet 4 */
388 	u32 length1:8;
389 	/* octet 5 - 8 */
390 	u32 kn;
391 
392 	/* for GCM-AES-128: octet 9-32: SAK
393 	 * for other cipher suite: octet 9-16: cipher suite id, octet 17-: SAK
394 	 */
395 	u8 sak[0];
396 };
397 
398 
399 struct ieee802_1x_mka_icv_body {
400 	/* octet 1 */
401 	u32 type:8;
402 	/* octet 2 */
403 	u32 reserve:8;
404 	/* octet 3 */
405 #if __BYTE_ORDER == __LITTLE_ENDIAN
406 	u32 length:4;
407 	u32 reserve1:4;
408 #elif __BYTE_ORDER == __BIG_ENDIAN
409 	u32 reserve1:4;
410 	u32 length:4;
411 #endif
412 	/* octet 4 */
413 	u32 length1:8;
414 
415 	/* octet 5 - */
416 	u8 icv[0];
417 };
418 
419 #endif /* IEEE802_1X_KAY_I_H */
420