xref: /dflybsd-src/contrib/wpa_supplicant/src/pae/ieee802_1x_kay.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_H
10*a1157835SDaniel Fojt #define IEEE802_1X_KAY_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 struct macsec_init_params;
17*a1157835SDaniel Fojt 
18*a1157835SDaniel Fojt #define MI_LEN			12  /* 96-bit Member Identifier */
19*a1157835SDaniel Fojt #define MAX_KEY_LEN		32  /* 32 bytes, 256 bits */
20*a1157835SDaniel Fojt #define MAX_CKN_LEN		32  /* 32 bytes, 256 bits */
21*a1157835SDaniel Fojt 
22*a1157835SDaniel Fojt /* MKA timer, unit: millisecond */
23*a1157835SDaniel Fojt #define MKA_HELLO_TIME		2000
24*a1157835SDaniel Fojt #define MKA_BOUNDED_HELLO_TIME	 500
25*a1157835SDaniel Fojt #define MKA_LIFE_TIME		6000
26*a1157835SDaniel Fojt #define MKA_SAK_RETIRE_TIME	3000
27*a1157835SDaniel Fojt 
28*a1157835SDaniel Fojt /**
29*a1157835SDaniel Fojt  * struct ieee802_1x_mka_ki - Key Identifier (KI)
30*a1157835SDaniel Fojt  * @mi: Key Server's Member Identifier
31*a1157835SDaniel Fojt  * @kn: Key Number, assigned by the Key Server
32*a1157835SDaniel Fojt  * IEEE 802.1X-2010 9.8 SAK generation, distribution, and selection
33*a1157835SDaniel Fojt  */
34*a1157835SDaniel Fojt struct ieee802_1x_mka_ki {
35*a1157835SDaniel Fojt 	u8 mi[MI_LEN];
36*a1157835SDaniel Fojt 	u32 kn;
37*a1157835SDaniel Fojt };
38*a1157835SDaniel Fojt 
39*a1157835SDaniel Fojt struct ieee802_1x_mka_sci {
40*a1157835SDaniel Fojt 	u8 addr[ETH_ALEN];
41*a1157835SDaniel Fojt 	be16 port;
42*a1157835SDaniel Fojt } STRUCT_PACKED;
43*a1157835SDaniel Fojt 
44*a1157835SDaniel Fojt struct mka_key {
45*a1157835SDaniel Fojt 	u8 key[MAX_KEY_LEN];
46*a1157835SDaniel Fojt 	size_t len;
47*a1157835SDaniel Fojt };
48*a1157835SDaniel Fojt 
49*a1157835SDaniel Fojt struct mka_key_name {
50*a1157835SDaniel Fojt 	u8 name[MAX_CKN_LEN];
51*a1157835SDaniel Fojt 	size_t len;
52*a1157835SDaniel Fojt };
53*a1157835SDaniel Fojt 
54*a1157835SDaniel Fojt enum mka_created_mode {
55*a1157835SDaniel Fojt 	PSK,
56*a1157835SDaniel Fojt 	EAP_EXCHANGE,
57*a1157835SDaniel Fojt };
58*a1157835SDaniel Fojt 
59*a1157835SDaniel Fojt struct data_key {
60*a1157835SDaniel Fojt 	u8 *key;
61*a1157835SDaniel Fojt 	int key_len;
62*a1157835SDaniel Fojt 	struct ieee802_1x_mka_ki key_identifier;
63*a1157835SDaniel Fojt 	enum confidentiality_offset confidentiality_offset;
64*a1157835SDaniel Fojt 	u8 an;
65*a1157835SDaniel Fojt 	Boolean transmits;
66*a1157835SDaniel Fojt 	Boolean receives;
67*a1157835SDaniel Fojt 	struct os_time created_time;
68*a1157835SDaniel Fojt 	u32 next_pn;
69*a1157835SDaniel Fojt 
70*a1157835SDaniel Fojt 	/* not defined data */
71*a1157835SDaniel Fojt 	Boolean rx_latest;
72*a1157835SDaniel Fojt 	Boolean tx_latest;
73*a1157835SDaniel Fojt 
74*a1157835SDaniel Fojt 	int user;
75*a1157835SDaniel Fojt 
76*a1157835SDaniel Fojt 	struct dl_list list;
77*a1157835SDaniel Fojt };
78*a1157835SDaniel Fojt 
79*a1157835SDaniel Fojt /* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
80*a1157835SDaniel Fojt struct transmit_sc {
81*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci sci; /* const SCI sci */
82*a1157835SDaniel Fojt 	Boolean transmitting; /* bool transmitting (read only) */
83*a1157835SDaniel Fojt 
84*a1157835SDaniel Fojt 	struct os_time created_time; /* Time createdTime */
85*a1157835SDaniel Fojt 
86*a1157835SDaniel Fojt 	u8 encoding_sa; /* AN encodingSA (read only) */
87*a1157835SDaniel Fojt 	u8 enciphering_sa; /* AN encipheringSA (read only) */
88*a1157835SDaniel Fojt 
89*a1157835SDaniel Fojt 	/* not defined data */
90*a1157835SDaniel Fojt 	struct dl_list list;
91*a1157835SDaniel Fojt 	struct dl_list sa_list;
92*a1157835SDaniel Fojt };
93*a1157835SDaniel Fojt 
94*a1157835SDaniel Fojt /* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
95*a1157835SDaniel Fojt struct transmit_sa {
96*a1157835SDaniel Fojt 	Boolean in_use; /* bool inUse (read only) */
97*a1157835SDaniel Fojt 	u32 next_pn; /* PN nextPN (read only) */
98*a1157835SDaniel Fojt 	struct os_time created_time; /* Time createdTime */
99*a1157835SDaniel Fojt 
100*a1157835SDaniel Fojt 	Boolean enable_transmit; /* bool EnableTransmit */
101*a1157835SDaniel Fojt 
102*a1157835SDaniel Fojt 	u8 an;
103*a1157835SDaniel Fojt 	Boolean confidentiality;
104*a1157835SDaniel Fojt 	struct data_key *pkey;
105*a1157835SDaniel Fojt 
106*a1157835SDaniel Fojt 	struct transmit_sc *sc;
107*a1157835SDaniel Fojt 	struct dl_list list; /* list entry in struct transmit_sc::sa_list */
108*a1157835SDaniel Fojt };
109*a1157835SDaniel Fojt 
110*a1157835SDaniel Fojt /* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
111*a1157835SDaniel Fojt struct receive_sc {
112*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci sci; /* const SCI sci */
113*a1157835SDaniel Fojt 	Boolean receiving; /* bool receiving (read only) */
114*a1157835SDaniel Fojt 
115*a1157835SDaniel Fojt 	struct os_time created_time; /* Time createdTime */
116*a1157835SDaniel Fojt 
117*a1157835SDaniel Fojt 	struct dl_list list;
118*a1157835SDaniel Fojt 	struct dl_list sa_list;
119*a1157835SDaniel Fojt };
120*a1157835SDaniel Fojt 
121*a1157835SDaniel Fojt /* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
122*a1157835SDaniel Fojt struct receive_sa {
123*a1157835SDaniel Fojt 	Boolean enable_receive; /* bool enableReceive */
124*a1157835SDaniel Fojt 	Boolean in_use; /* bool inUse (read only) */
125*a1157835SDaniel Fojt 
126*a1157835SDaniel Fojt 	u32 next_pn; /* PN nextPN (read only) */
127*a1157835SDaniel Fojt 	u32 lowest_pn; /* PN lowestPN (read only) */
128*a1157835SDaniel Fojt 	u8 an;
129*a1157835SDaniel Fojt 	struct os_time created_time;
130*a1157835SDaniel Fojt 
131*a1157835SDaniel Fojt 	struct data_key *pkey;
132*a1157835SDaniel Fojt 	struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
133*a1157835SDaniel Fojt 
134*a1157835SDaniel Fojt 	struct dl_list list;
135*a1157835SDaniel Fojt };
136*a1157835SDaniel Fojt 
137*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx {
138*a1157835SDaniel Fojt 	/* pointer to arbitrary upper level context */
139*a1157835SDaniel Fojt 	void *ctx;
140*a1157835SDaniel Fojt 
141*a1157835SDaniel Fojt 	/* abstract wpa driver interface */
142*a1157835SDaniel Fojt 	int (*macsec_init)(void *ctx, struct macsec_init_params *params);
143*a1157835SDaniel Fojt 	int (*macsec_deinit)(void *ctx);
144*a1157835SDaniel Fojt 	int (*macsec_get_capability)(void *priv, enum macsec_cap *cap);
145*a1157835SDaniel Fojt 	int (*enable_protect_frames)(void *ctx, Boolean enabled);
146*a1157835SDaniel Fojt 	int (*enable_encrypt)(void *ctx, Boolean enabled);
147*a1157835SDaniel Fojt 	int (*set_replay_protect)(void *ctx, Boolean enabled, u32 window);
148*a1157835SDaniel Fojt 	int (*set_current_cipher_suite)(void *ctx, u64 cs);
149*a1157835SDaniel Fojt 	int (*enable_controlled_port)(void *ctx, Boolean enabled);
150*a1157835SDaniel Fojt 	int (*get_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
151*a1157835SDaniel Fojt 	int (*get_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
152*a1157835SDaniel Fojt 	int (*set_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
153*a1157835SDaniel Fojt 	int (*set_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
154*a1157835SDaniel Fojt 	int (*create_receive_sc)(void *ctx, struct receive_sc *sc,
155*a1157835SDaniel Fojt 				 enum validate_frames vf,
156*a1157835SDaniel Fojt 				 enum confidentiality_offset co);
157*a1157835SDaniel Fojt 	int (*delete_receive_sc)(void *ctx, struct receive_sc *sc);
158*a1157835SDaniel Fojt 	int (*create_receive_sa)(void *ctx, struct receive_sa *sa);
159*a1157835SDaniel Fojt 	int (*delete_receive_sa)(void *ctx, struct receive_sa *sa);
160*a1157835SDaniel Fojt 	int (*enable_receive_sa)(void *ctx, struct receive_sa *sa);
161*a1157835SDaniel Fojt 	int (*disable_receive_sa)(void *ctx, struct receive_sa *sa);
162*a1157835SDaniel Fojt 	int (*create_transmit_sc)(void *ctx, struct transmit_sc *sc,
163*a1157835SDaniel Fojt 				  enum confidentiality_offset co);
164*a1157835SDaniel Fojt 	int (*delete_transmit_sc)(void *ctx, struct transmit_sc *sc);
165*a1157835SDaniel Fojt 	int (*create_transmit_sa)(void *ctx, struct transmit_sa *sa);
166*a1157835SDaniel Fojt 	int (*delete_transmit_sa)(void *ctx, struct transmit_sa *sa);
167*a1157835SDaniel Fojt 	int (*enable_transmit_sa)(void *ctx, struct transmit_sa *sa);
168*a1157835SDaniel Fojt 	int (*disable_transmit_sa)(void *ctx, struct transmit_sa *sa);
169*a1157835SDaniel Fojt };
170*a1157835SDaniel Fojt 
171*a1157835SDaniel Fojt struct ieee802_1x_kay {
172*a1157835SDaniel Fojt 	Boolean enable;
173*a1157835SDaniel Fojt 	Boolean active;
174*a1157835SDaniel Fojt 
175*a1157835SDaniel Fojt 	Boolean authenticated;
176*a1157835SDaniel Fojt 	Boolean secured;
177*a1157835SDaniel Fojt 	Boolean failed;
178*a1157835SDaniel Fojt 
179*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci actor_sci;
180*a1157835SDaniel Fojt 	u8 actor_priority;
181*a1157835SDaniel Fojt 	struct ieee802_1x_mka_sci key_server_sci;
182*a1157835SDaniel Fojt 	u8 key_server_priority;
183*a1157835SDaniel Fojt 
184*a1157835SDaniel Fojt 	enum macsec_cap macsec_capable;
185*a1157835SDaniel Fojt 	Boolean macsec_desired;
186*a1157835SDaniel Fojt 	Boolean macsec_protect;
187*a1157835SDaniel Fojt 	Boolean macsec_encrypt;
188*a1157835SDaniel Fojt 	Boolean macsec_replay_protect;
189*a1157835SDaniel Fojt 	u32 macsec_replay_window;
190*a1157835SDaniel Fojt 	enum validate_frames macsec_validate;
191*a1157835SDaniel Fojt 	enum confidentiality_offset macsec_confidentiality;
192*a1157835SDaniel Fojt 	u32 mka_hello_time;
193*a1157835SDaniel Fojt 
194*a1157835SDaniel Fojt 	u32 ltx_kn;
195*a1157835SDaniel Fojt 	u8 ltx_an;
196*a1157835SDaniel Fojt 	u32 lrx_kn;
197*a1157835SDaniel Fojt 	u8 lrx_an;
198*a1157835SDaniel Fojt 
199*a1157835SDaniel Fojt 	u32 otx_kn;
200*a1157835SDaniel Fojt 	u8 otx_an;
201*a1157835SDaniel Fojt 	u32 orx_kn;
202*a1157835SDaniel Fojt 	u8 orx_an;
203*a1157835SDaniel Fojt 
204*a1157835SDaniel Fojt 	/* not defined in IEEE802.1X */
205*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ctx;
206*a1157835SDaniel Fojt 	Boolean is_key_server;
207*a1157835SDaniel Fojt 	Boolean is_obliged_key_server;
208*a1157835SDaniel Fojt 	char if_name[IFNAMSIZ];
209*a1157835SDaniel Fojt 
210*a1157835SDaniel Fojt 	unsigned int macsec_csindex;  /* MACsec cipher suite table index */
211*a1157835SDaniel Fojt 	int mka_algindex;  /* MKA alg table index */
212*a1157835SDaniel Fojt 
213*a1157835SDaniel Fojt 	u32 dist_kn;
214*a1157835SDaniel Fojt 	u32 rcvd_keys;
215*a1157835SDaniel Fojt 	u8 dist_an;
216*a1157835SDaniel Fojt 	time_t dist_time;
217*a1157835SDaniel Fojt 
218*a1157835SDaniel Fojt 	u8 mka_version;
219*a1157835SDaniel Fojt 	u8 algo_agility[4];
220*a1157835SDaniel Fojt 
221*a1157835SDaniel Fojt 	u32 pn_exhaustion;
222*a1157835SDaniel Fojt 	Boolean port_enable;
223*a1157835SDaniel Fojt 	Boolean rx_enable;
224*a1157835SDaniel Fojt 	Boolean tx_enable;
225*a1157835SDaniel Fojt 
226*a1157835SDaniel Fojt 	struct dl_list participant_list;
227*a1157835SDaniel Fojt 	enum macsec_policy policy;
228*a1157835SDaniel Fojt 
229*a1157835SDaniel Fojt 	struct ieee802_1x_cp_sm *cp;
230*a1157835SDaniel Fojt 
231*a1157835SDaniel Fojt 	struct l2_packet_data *l2_mka;
232*a1157835SDaniel Fojt 
233*a1157835SDaniel Fojt 	enum validate_frames vf;
234*a1157835SDaniel Fojt 	enum confidentiality_offset co;
235*a1157835SDaniel Fojt };
236*a1157835SDaniel Fojt 
237*a1157835SDaniel Fojt 
238*a1157835SDaniel Fojt u64 mka_sci_u64(struct ieee802_1x_mka_sci *sci);
239*a1157835SDaniel Fojt 
240*a1157835SDaniel Fojt struct ieee802_1x_kay *
241*a1157835SDaniel Fojt ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
242*a1157835SDaniel Fojt 		    Boolean macsec_replay_protect, u32 macsec_replay_window,
243*a1157835SDaniel Fojt 		    u16 port, u8 priority, const char *ifname, const u8 *addr);
244*a1157835SDaniel Fojt void ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
245*a1157835SDaniel Fojt 
246*a1157835SDaniel Fojt struct ieee802_1x_mka_participant *
247*a1157835SDaniel Fojt ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay,
248*a1157835SDaniel Fojt 			  const struct mka_key_name *ckn,
249*a1157835SDaniel Fojt 			  const struct mka_key *cak,
250*a1157835SDaniel Fojt 			  u32 life, enum mka_created_mode mode,
251*a1157835SDaniel Fojt 			  Boolean is_authenticator);
252*a1157835SDaniel Fojt void ieee802_1x_kay_delete_mka(struct ieee802_1x_kay *kay,
253*a1157835SDaniel Fojt 			       struct mka_key_name *ckn);
254*a1157835SDaniel Fojt void ieee802_1x_kay_mka_participate(struct ieee802_1x_kay *kay,
255*a1157835SDaniel Fojt 				    struct mka_key_name *ckn,
256*a1157835SDaniel Fojt 				    Boolean status);
257*a1157835SDaniel Fojt int ieee802_1x_kay_new_sak(struct ieee802_1x_kay *kay);
258*a1157835SDaniel Fojt int ieee802_1x_kay_change_cipher_suite(struct ieee802_1x_kay *kay,
259*a1157835SDaniel Fojt 				       unsigned int cs_index);
260*a1157835SDaniel Fojt 
261*a1157835SDaniel Fojt int ieee802_1x_kay_set_latest_sa_attr(struct ieee802_1x_kay *kay,
262*a1157835SDaniel Fojt 				      struct ieee802_1x_mka_ki *lki, u8 lan,
263*a1157835SDaniel Fojt 				      Boolean ltx, Boolean lrx);
264*a1157835SDaniel Fojt int ieee802_1x_kay_set_old_sa_attr(struct ieee802_1x_kay *kay,
265*a1157835SDaniel Fojt 				   struct ieee802_1x_mka_ki *oki,
266*a1157835SDaniel Fojt 				   u8 oan, Boolean otx, Boolean orx);
267*a1157835SDaniel Fojt int ieee802_1x_kay_create_sas(struct ieee802_1x_kay *kay,
268*a1157835SDaniel Fojt 			      struct ieee802_1x_mka_ki *lki);
269*a1157835SDaniel Fojt int ieee802_1x_kay_delete_sas(struct ieee802_1x_kay *kay,
270*a1157835SDaniel Fojt 			      struct ieee802_1x_mka_ki *ki);
271*a1157835SDaniel Fojt int ieee802_1x_kay_enable_tx_sas(struct ieee802_1x_kay *kay,
272*a1157835SDaniel Fojt 				 struct ieee802_1x_mka_ki *lki);
273*a1157835SDaniel Fojt int ieee802_1x_kay_enable_rx_sas(struct ieee802_1x_kay *kay,
274*a1157835SDaniel Fojt 				 struct ieee802_1x_mka_ki *lki);
275*a1157835SDaniel Fojt int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
276*a1157835SDaniel Fojt int ieee802_1x_kay_get_status(struct ieee802_1x_kay *kay, char *buf,
277*a1157835SDaniel Fojt 			      size_t buflen);
278*a1157835SDaniel Fojt int ieee802_1x_kay_get_mib(struct ieee802_1x_kay *kay, char *buf,
279*a1157835SDaniel Fojt 			   size_t buflen);
280*a1157835SDaniel Fojt 
281*a1157835SDaniel Fojt #endif /* IEEE802_1X_KAY_H */
282