mka: Store cipher suite ID in a u64 instead of u8 pointer
[mech_eap.git] / src / pae / ieee802_1x_kay_i.h
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         be32 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_capability;
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         u64 id;
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         u8 type;
245         /* octet 2 */
246         u8 reserve;
247         /* octet 3 */
248 #if __BYTE_ORDER == __LITTLE_ENDIAN
249         u8 length:4;
250         u8 reserve1:4;
251 #elif __BYTE_ORDER == __BIG_ENDIAN
252         u8 reserve1:4;
253         u8 length:4;
254 #else
255 #error "Please fix <bits/endian.h>"
256 #endif
257         /* octet 4 */
258         u8 length1;
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         u8 version;
266         /* octet 2 */
267         u8 priority;
268         /* octet 3 */
269 #if __BYTE_ORDER == __LITTLE_ENDIAN
270         u8 length:4;
271         u8 macsec_capability:2;
272         u8 macsec_desired:1;
273         u8 key_server:1;
274 #elif __BYTE_ORDER == __BIG_ENDIAN
275         u8 key_server:1;
276         u8 macsec_desired:1;
277         u8 macsec_capability:2;
278         u8 length:4;
279 #endif
280         /* octet 4 */
281         u8 length1;
282
283         struct ieee802_1x_mka_sci actor_sci;
284         u8 actor_mi[MI_LEN];
285         be32 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         u8 type;
295         /* octet 2 */
296         u8 reserve;
297         /* octet 3 */
298 #if __BYTE_ORDER == __LITTLE_ENDIAN
299         u8 length:4;
300         u8 reserve1:4;
301 #elif __BYTE_ORDER == __BIG_ENDIAN
302         u8 reserve1:4;
303         u8 length:4;
304 #endif
305         /* octet 4 */
306         u8 length1;
307
308         u8 peer[0];
309         /* followed by Peers */
310 };
311
312 struct ieee802_1x_mka_sak_use_body {
313         /* octet 1 */
314         u8 type;
315         /* octet 2 */
316 #if __BYTE_ORDER == __LITTLE_ENDIAN
317         u8 orx:1;
318         u8 otx:1;
319         u8 oan:2;
320         u8 lrx:1;
321         u8 ltx:1;
322         u8 lan:2;
323 #elif __BYTE_ORDER == __BIG_ENDIAN
324         u8 lan:2;
325         u8 ltx:1;
326         u8 lrx:1;
327         u8 oan:2;
328         u8 otx:1;
329         u8 orx:1;
330 #endif
331
332         /* octet 3 */
333 #if __BYTE_ORDER == __LITTLE_ENDIAN
334         u8 length:4;
335         u8 delay_protect:1;
336         u8 reserve:1;
337         u8 prx:1;
338         u8 ptx:1;
339 #elif __BYTE_ORDER == __BIG_ENDIAN
340         u8 ptx:1;
341         u8 prx:1;
342         u8 reserve:1;
343         u8 delay_protect:1;
344         u8 length:4;
345 #endif
346
347         /* octet 4 */
348         u8 length1;
349
350         /* octet 5 - 16 */
351         u8 lsrv_mi[MI_LEN];
352         /* octet 17 - 20 */
353         be32 lkn;
354         /* octet 21 - 24 */
355         be32 llpn;
356
357         /* octet 25 - 36 */
358         u8 osrv_mi[MI_LEN];
359         /* octet 37 - 40 */
360         be32 okn;
361         /* octet 41 - 44 */
362         be32 olpn;
363 };
364
365
366 struct ieee802_1x_mka_dist_sak_body {
367         /* octet 1 */
368         u8 type;
369         /* octet 2 */
370 #if __BYTE_ORDER == __LITTLE_ENDIAN
371         u8 reserve:4;
372         u8 confid_offset:2;
373         u8 dan:2;
374 #elif __BYTE_ORDER == __BIG_ENDIAN
375         u8 dan:2;
376         u8 confid_offset:2;
377         u8 reserve:4;
378 #endif
379         /* octet 3 */
380 #if __BYTE_ORDER == __LITTLE_ENDIAN
381         u8 length:4;
382         u8 reserve1:4;
383 #elif __BYTE_ORDER == __BIG_ENDIAN
384         u8 reserve1:4;
385         u8 length:4;
386 #endif
387         /* octet 4 */
388         u8 length1;
389         /* octet 5 - 8 */
390         be32 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         u8 type;
402         /* octet 2 */
403         u8 reserve;
404         /* octet 3 */
405 #if __BYTE_ORDER == __LITTLE_ENDIAN
406         u8 length:4;
407         u8 reserve1:4;
408 #elif __BYTE_ORDER == __BIG_ENDIAN
409         u8 reserve1:4;
410         u8 length:4;
411 #endif
412         /* octet 4 */
413         u8 length1;
414
415         /* octet 5 - */
416         u8 icv[0];
417 };
418
419 #endif /* IEEE802_1X_KAY_I_H */