2 * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
3 * Copyright (c) 2013, Qualcomm Atheros, Inc.
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
9 #ifndef IEEE802_1X_KAY_H
10 #define IEEE802_1X_KAY_H
12 #include "utils/list.h"
13 #include "common/defs.h"
14 #include "common/ieee802_1x_defs.h"
16 struct macsec_init_params;
18 #define MI_LEN 12 /* 96-bit Member Identifier */
19 #define MAX_KEY_LEN 32 /* 32 bytes, 256 bits */
20 #define MAX_CKN_LEN 32 /* 32 bytes, 256 bits */
22 /* MKA timer, unit: millisecond */
23 #define MKA_HELLO_TIME 2000
24 #define MKA_LIFE_TIME 6000
25 #define MKA_SAK_RETIRE_TIME 3000
28 * struct ieee802_1x_mka_ki - Key Identifier (KI)
29 * @mi: Key Server's Member Identifier
30 * @kn: Key Number, assigned by the Key Server
31 * IEEE 802.1X-2010 9.8 SAK generation, distribution, and selection
33 struct ieee802_1x_mka_ki {
38 struct ieee802_1x_mka_sci {
53 enum mka_created_mode {
61 struct ieee802_1x_mka_ki key_identifier;
62 enum confidentiality_offset confidentiality_offset;
66 struct os_time created_time;
69 /* not defined data */
78 /* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
80 struct ieee802_1x_mka_sci sci; /* const SCI sci */
81 Boolean transmitting; /* bool transmitting (read only) */
83 struct os_time created_time; /* Time createdTime */
85 u8 encoding_sa; /* AN encodingSA (read only) */
86 u8 enciphering_sa; /* AN encipheringSA (read only) */
88 /* not defined data */
90 struct dl_list sa_list;
93 /* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
95 Boolean in_use; /* bool inUse (read only) */
96 u32 next_pn; /* PN nextPN (read only) */
97 struct os_time created_time; /* Time createdTime */
99 Boolean enable_transmit; /* bool EnableTransmit */
102 Boolean confidentiality;
103 struct data_key *pkey;
105 struct transmit_sc *sc;
106 struct dl_list list; /* list entry in struct transmit_sc::sa_list */
109 /* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
111 struct ieee802_1x_mka_sci sci; /* const SCI sci */
112 Boolean receiving; /* bool receiving (read only) */
114 struct os_time created_time; /* Time createdTime */
117 struct dl_list sa_list;
120 /* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
122 Boolean enable_receive; /* bool enableReceive */
123 Boolean in_use; /* bool inUse (read only) */
125 u32 next_pn; /* PN nextPN (read only) */
126 u32 lowest_pn; /* PN lowestPN (read only) */
128 struct os_time created_time;
130 struct data_key *pkey;
131 struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
136 struct ieee802_1x_kay_ctx {
137 /* pointer to arbitrary upper level context */
140 /* abstract wpa driver interface */
141 int (*macsec_init)(void *ctx, struct macsec_init_params *params);
142 int (*macsec_deinit)(void *ctx);
143 int (*macsec_get_capability)(void *priv, enum macsec_cap *cap);
144 int (*enable_protect_frames)(void *ctx, Boolean enabled);
145 int (*enable_encrypt)(void *ctx, Boolean enabled);
146 int (*set_replay_protect)(void *ctx, Boolean enabled, u32 window);
147 int (*set_current_cipher_suite)(void *ctx, u64 cs);
148 int (*enable_controlled_port)(void *ctx, Boolean enabled);
149 int (*get_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
150 int (*get_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
151 int (*set_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
152 int (*create_receive_sc)(void *ctx, struct receive_sc *sc,
153 enum validate_frames vf,
154 enum confidentiality_offset co);
155 int (*delete_receive_sc)(void *ctx, struct receive_sc *sc);
156 int (*create_receive_sa)(void *ctx, struct receive_sa *sa);
157 int (*delete_receive_sa)(void *ctx, struct receive_sa *sa);
158 int (*enable_receive_sa)(void *ctx, struct receive_sa *sa);
159 int (*disable_receive_sa)(void *ctx, struct receive_sa *sa);
160 int (*create_transmit_sc)(void *ctx, struct transmit_sc *sc,
161 enum confidentiality_offset co);
162 int (*delete_transmit_sc)(void *ctx, struct transmit_sc *sc);
163 int (*create_transmit_sa)(void *ctx, struct transmit_sa *sa);
164 int (*delete_transmit_sa)(void *ctx, struct transmit_sa *sa);
165 int (*enable_transmit_sa)(void *ctx, struct transmit_sa *sa);
166 int (*disable_transmit_sa)(void *ctx, struct transmit_sa *sa);
169 struct ieee802_1x_kay {
173 Boolean authenticated;
177 struct ieee802_1x_mka_sci actor_sci;
179 struct ieee802_1x_mka_sci key_server_sci;
180 u8 key_server_priority;
182 enum macsec_cap macsec_capable;
183 Boolean macsec_desired;
184 Boolean macsec_protect;
185 Boolean macsec_encrypt;
186 Boolean macsec_replay_protect;
187 u32 macsec_replay_window;
188 enum validate_frames macsec_validate;
189 enum confidentiality_offset macsec_confidentiality;
201 /* not defined in IEEE802.1X */
202 struct ieee802_1x_kay_ctx *ctx;
203 Boolean is_key_server;
204 Boolean is_obliged_key_server;
205 char if_name[IFNAMSIZ];
207 unsigned int macsec_csindex; /* MACsec cipher suite table index */
208 int mka_algindex; /* MKA alg table index */
223 struct dl_list participant_list;
224 enum macsec_policy policy;
226 struct ieee802_1x_cp_sm *cp;
228 struct l2_packet_data *l2_mka;
230 enum validate_frames vf;
231 enum confidentiality_offset co;
235 u64 mka_sci_u64(struct ieee802_1x_mka_sci *sci);
237 struct ieee802_1x_kay *
238 ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
239 u16 port, u8 priority, const char *ifname, const u8 *addr);
240 void ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
242 struct ieee802_1x_mka_participant *
243 ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay,
244 const struct mka_key_name *ckn,
245 const struct mka_key *cak,
246 u32 life, enum mka_created_mode mode,
247 Boolean is_authenticator);
248 void ieee802_1x_kay_delete_mka(struct ieee802_1x_kay *kay,
249 struct mka_key_name *ckn);
250 void ieee802_1x_kay_mka_participate(struct ieee802_1x_kay *kay,
251 struct mka_key_name *ckn,
253 int ieee802_1x_kay_new_sak(struct ieee802_1x_kay *kay);
254 int ieee802_1x_kay_change_cipher_suite(struct ieee802_1x_kay *kay,
255 unsigned int cs_index);
257 int ieee802_1x_kay_set_latest_sa_attr(struct ieee802_1x_kay *kay,
258 struct ieee802_1x_mka_ki *lki, u8 lan,
259 Boolean ltx, Boolean lrx);
260 int ieee802_1x_kay_set_old_sa_attr(struct ieee802_1x_kay *kay,
261 struct ieee802_1x_mka_ki *oki,
262 u8 oan, Boolean otx, Boolean orx);
263 int ieee802_1x_kay_create_sas(struct ieee802_1x_kay *kay,
264 struct ieee802_1x_mka_ki *lki);
265 int ieee802_1x_kay_delete_sas(struct ieee802_1x_kay *kay,
266 struct ieee802_1x_mka_ki *ki);
267 int ieee802_1x_kay_enable_tx_sas(struct ieee802_1x_kay *kay,
268 struct ieee802_1x_mka_ki *lki);
269 int ieee802_1x_kay_enable_rx_sas(struct ieee802_1x_kay *kay,
270 struct ieee802_1x_mka_ki *lki);
271 int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
272 int ieee802_1x_kay_get_status(struct ieee802_1x_kay *kay, char *buf,
275 #endif /* IEEE802_1X_KAY_H */