xref: /dflybsd-src/contrib/wpa_supplicant/src/pae/ieee802_1x_secy_ops.c (revision 3a84a4273475ed07d0ab1c2dfeffdfedef35d9cd)
1*a1157835SDaniel Fojt  /*
2*a1157835SDaniel Fojt  * SecY Operations
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 #include "utils/includes.h"
10*a1157835SDaniel Fojt 
11*a1157835SDaniel Fojt #include "utils/common.h"
12*a1157835SDaniel Fojt #include "utils/eloop.h"
13*a1157835SDaniel Fojt #include "common/defs.h"
14*a1157835SDaniel Fojt #include "drivers/driver.h"
15*a1157835SDaniel Fojt #include "pae/ieee802_1x_kay.h"
16*a1157835SDaniel Fojt #include "pae/ieee802_1x_kay_i.h"
17*a1157835SDaniel Fojt #include "pae/ieee802_1x_secy_ops.h"
18*a1157835SDaniel Fojt 
19*a1157835SDaniel Fojt 
secy_cp_control_validate_frames(struct ieee802_1x_kay * kay,enum validate_frames vf)20*a1157835SDaniel Fojt int secy_cp_control_validate_frames(struct ieee802_1x_kay *kay,
21*a1157835SDaniel Fojt 				    enum validate_frames vf)
22*a1157835SDaniel Fojt {
23*a1157835SDaniel Fojt 	kay->vf = vf;
24*a1157835SDaniel Fojt 	return 0;
25*a1157835SDaniel Fojt }
26*a1157835SDaniel Fojt 
27*a1157835SDaniel Fojt 
secy_cp_control_protect_frames(struct ieee802_1x_kay * kay,Boolean enabled)28*a1157835SDaniel Fojt int secy_cp_control_protect_frames(struct ieee802_1x_kay *kay, Boolean enabled)
29*a1157835SDaniel Fojt {
30*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
31*a1157835SDaniel Fojt 
32*a1157835SDaniel Fojt 	if (!kay) {
33*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
34*a1157835SDaniel Fojt 		return -1;
35*a1157835SDaniel Fojt 	}
36*a1157835SDaniel Fojt 
37*a1157835SDaniel Fojt 	ops = kay->ctx;
38*a1157835SDaniel Fojt 	if (!ops || !ops->enable_protect_frames) {
39*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
40*a1157835SDaniel Fojt 			   "KaY: secy enable_protect_frames operation not supported");
41*a1157835SDaniel Fojt 		return -1;
42*a1157835SDaniel Fojt 	}
43*a1157835SDaniel Fojt 
44*a1157835SDaniel Fojt 	return ops->enable_protect_frames(ops->ctx, enabled);
45*a1157835SDaniel Fojt }
46*a1157835SDaniel Fojt 
47*a1157835SDaniel Fojt 
secy_cp_control_encrypt(struct ieee802_1x_kay * kay,Boolean enabled)48*a1157835SDaniel Fojt int secy_cp_control_encrypt(struct ieee802_1x_kay *kay, Boolean enabled)
49*a1157835SDaniel Fojt {
50*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
51*a1157835SDaniel Fojt 
52*a1157835SDaniel Fojt 	if (!kay) {
53*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
54*a1157835SDaniel Fojt 		return -1;
55*a1157835SDaniel Fojt 	}
56*a1157835SDaniel Fojt 
57*a1157835SDaniel Fojt 	ops = kay->ctx;
58*a1157835SDaniel Fojt 	if (!ops || !ops->enable_encrypt) {
59*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
60*a1157835SDaniel Fojt 			   "KaY: secy enable_encrypt operation not supported");
61*a1157835SDaniel Fojt 		return -1;
62*a1157835SDaniel Fojt 	}
63*a1157835SDaniel Fojt 
64*a1157835SDaniel Fojt 	return ops->enable_encrypt(ops->ctx, enabled);
65*a1157835SDaniel Fojt }
66*a1157835SDaniel Fojt 
67*a1157835SDaniel Fojt 
secy_cp_control_replay(struct ieee802_1x_kay * kay,Boolean enabled,u32 win)68*a1157835SDaniel Fojt int secy_cp_control_replay(struct ieee802_1x_kay *kay, Boolean enabled, u32 win)
69*a1157835SDaniel Fojt {
70*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
71*a1157835SDaniel Fojt 
72*a1157835SDaniel Fojt 	if (!kay) {
73*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
74*a1157835SDaniel Fojt 		return -1;
75*a1157835SDaniel Fojt 	}
76*a1157835SDaniel Fojt 
77*a1157835SDaniel Fojt 	ops = kay->ctx;
78*a1157835SDaniel Fojt 	if (!ops || !ops->set_replay_protect) {
79*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
80*a1157835SDaniel Fojt 			   "KaY: secy set_replay_protect operation not supported");
81*a1157835SDaniel Fojt 		return -1;
82*a1157835SDaniel Fojt 	}
83*a1157835SDaniel Fojt 
84*a1157835SDaniel Fojt 	return ops->set_replay_protect(ops->ctx, enabled, win);
85*a1157835SDaniel Fojt }
86*a1157835SDaniel Fojt 
87*a1157835SDaniel Fojt 
secy_cp_control_current_cipher_suite(struct ieee802_1x_kay * kay,u64 cs)88*a1157835SDaniel Fojt int secy_cp_control_current_cipher_suite(struct ieee802_1x_kay *kay, u64 cs)
89*a1157835SDaniel Fojt {
90*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
91*a1157835SDaniel Fojt 
92*a1157835SDaniel Fojt 	if (!kay) {
93*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
94*a1157835SDaniel Fojt 		return -1;
95*a1157835SDaniel Fojt 	}
96*a1157835SDaniel Fojt 
97*a1157835SDaniel Fojt 	ops = kay->ctx;
98*a1157835SDaniel Fojt 	if (!ops || !ops->set_current_cipher_suite) {
99*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
100*a1157835SDaniel Fojt 			   "KaY: secy set_current_cipher_suite operation not supported");
101*a1157835SDaniel Fojt 		return -1;
102*a1157835SDaniel Fojt 	}
103*a1157835SDaniel Fojt 
104*a1157835SDaniel Fojt 	return ops->set_current_cipher_suite(ops->ctx, cs);
105*a1157835SDaniel Fojt }
106*a1157835SDaniel Fojt 
107*a1157835SDaniel Fojt 
secy_cp_control_confidentiality_offset(struct ieee802_1x_kay * kay,enum confidentiality_offset co)108*a1157835SDaniel Fojt int secy_cp_control_confidentiality_offset(struct ieee802_1x_kay *kay,
109*a1157835SDaniel Fojt 					   enum confidentiality_offset co)
110*a1157835SDaniel Fojt {
111*a1157835SDaniel Fojt 	kay->co = co;
112*a1157835SDaniel Fojt 	return 0;
113*a1157835SDaniel Fojt }
114*a1157835SDaniel Fojt 
115*a1157835SDaniel Fojt 
secy_cp_control_enable_port(struct ieee802_1x_kay * kay,Boolean enabled)116*a1157835SDaniel Fojt int secy_cp_control_enable_port(struct ieee802_1x_kay *kay, Boolean enabled)
117*a1157835SDaniel Fojt {
118*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
119*a1157835SDaniel Fojt 
120*a1157835SDaniel Fojt 	if (!kay) {
121*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
122*a1157835SDaniel Fojt 		return -1;
123*a1157835SDaniel Fojt 	}
124*a1157835SDaniel Fojt 
125*a1157835SDaniel Fojt 	ops = kay->ctx;
126*a1157835SDaniel Fojt 	if (!ops || !ops->enable_controlled_port) {
127*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
128*a1157835SDaniel Fojt 			   "KaY: secy enable_controlled_port operation not supported");
129*a1157835SDaniel Fojt 		return -1;
130*a1157835SDaniel Fojt 	}
131*a1157835SDaniel Fojt 
132*a1157835SDaniel Fojt 	return ops->enable_controlled_port(ops->ctx, enabled);
133*a1157835SDaniel Fojt }
134*a1157835SDaniel Fojt 
135*a1157835SDaniel Fojt 
secy_get_capability(struct ieee802_1x_kay * kay,enum macsec_cap * cap)136*a1157835SDaniel Fojt int secy_get_capability(struct ieee802_1x_kay *kay, enum macsec_cap *cap)
137*a1157835SDaniel Fojt {
138*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
139*a1157835SDaniel Fojt 
140*a1157835SDaniel Fojt 	if (!kay) {
141*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
142*a1157835SDaniel Fojt 		return -1;
143*a1157835SDaniel Fojt 	}
144*a1157835SDaniel Fojt 
145*a1157835SDaniel Fojt 	ops = kay->ctx;
146*a1157835SDaniel Fojt 	if (!ops || !ops->macsec_get_capability) {
147*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
148*a1157835SDaniel Fojt 			   "KaY: secy macsec_get_capability operation not supported");
149*a1157835SDaniel Fojt 		return -1;
150*a1157835SDaniel Fojt 	}
151*a1157835SDaniel Fojt 
152*a1157835SDaniel Fojt 	return ops->macsec_get_capability(ops->ctx, cap);
153*a1157835SDaniel Fojt }
154*a1157835SDaniel Fojt 
155*a1157835SDaniel Fojt 
secy_get_receive_lowest_pn(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)156*a1157835SDaniel Fojt int secy_get_receive_lowest_pn(struct ieee802_1x_kay *kay,
157*a1157835SDaniel Fojt 			       struct receive_sa *rxsa)
158*a1157835SDaniel Fojt {
159*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
160*a1157835SDaniel Fojt 
161*a1157835SDaniel Fojt 	if (!kay || !rxsa) {
162*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
163*a1157835SDaniel Fojt 		return -1;
164*a1157835SDaniel Fojt 	}
165*a1157835SDaniel Fojt 
166*a1157835SDaniel Fojt 	ops = kay->ctx;
167*a1157835SDaniel Fojt 	if (!ops || !ops->get_receive_lowest_pn) {
168*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
169*a1157835SDaniel Fojt 			   "KaY: secy get_receive_lowest_pn operation not supported");
170*a1157835SDaniel Fojt 		return -1;
171*a1157835SDaniel Fojt 	}
172*a1157835SDaniel Fojt 
173*a1157835SDaniel Fojt 	return ops->get_receive_lowest_pn(ops->ctx, rxsa);
174*a1157835SDaniel Fojt }
175*a1157835SDaniel Fojt 
176*a1157835SDaniel Fojt 
secy_get_transmit_next_pn(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)177*a1157835SDaniel Fojt int secy_get_transmit_next_pn(struct ieee802_1x_kay *kay,
178*a1157835SDaniel Fojt 			      struct transmit_sa *txsa)
179*a1157835SDaniel Fojt {
180*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
181*a1157835SDaniel Fojt 
182*a1157835SDaniel Fojt 	if (!kay || !txsa) {
183*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
184*a1157835SDaniel Fojt 		return -1;
185*a1157835SDaniel Fojt 	}
186*a1157835SDaniel Fojt 
187*a1157835SDaniel Fojt 	ops = kay->ctx;
188*a1157835SDaniel Fojt 	if (!ops || !ops->get_transmit_next_pn) {
189*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
190*a1157835SDaniel Fojt 			   "KaY: secy get_transmit_next_pn operation not supported");
191*a1157835SDaniel Fojt 		return -1;
192*a1157835SDaniel Fojt 	}
193*a1157835SDaniel Fojt 
194*a1157835SDaniel Fojt 	return ops->get_transmit_next_pn(ops->ctx, txsa);
195*a1157835SDaniel Fojt }
196*a1157835SDaniel Fojt 
197*a1157835SDaniel Fojt 
secy_set_transmit_next_pn(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)198*a1157835SDaniel Fojt int secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
199*a1157835SDaniel Fojt 			      struct transmit_sa *txsa)
200*a1157835SDaniel Fojt {
201*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
202*a1157835SDaniel Fojt 
203*a1157835SDaniel Fojt 	if (!kay || !txsa) {
204*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
205*a1157835SDaniel Fojt 		return -1;
206*a1157835SDaniel Fojt 	}
207*a1157835SDaniel Fojt 
208*a1157835SDaniel Fojt 	ops = kay->ctx;
209*a1157835SDaniel Fojt 	if (!ops || !ops->set_transmit_next_pn) {
210*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
211*a1157835SDaniel Fojt 			   "KaY: secy set_transmit_next_pn operation not supported");
212*a1157835SDaniel Fojt 		return -1;
213*a1157835SDaniel Fojt 	}
214*a1157835SDaniel Fojt 
215*a1157835SDaniel Fojt 	return ops->set_transmit_next_pn(ops->ctx, txsa);
216*a1157835SDaniel Fojt }
217*a1157835SDaniel Fojt 
218*a1157835SDaniel Fojt 
secy_set_receive_lowest_pn(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)219*a1157835SDaniel Fojt int secy_set_receive_lowest_pn(struct ieee802_1x_kay *kay,
220*a1157835SDaniel Fojt 			       struct receive_sa *rxsa)
221*a1157835SDaniel Fojt {
222*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
223*a1157835SDaniel Fojt 
224*a1157835SDaniel Fojt 	if (!kay || !rxsa) {
225*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
226*a1157835SDaniel Fojt 		return -1;
227*a1157835SDaniel Fojt 	}
228*a1157835SDaniel Fojt 
229*a1157835SDaniel Fojt 	ops = kay->ctx;
230*a1157835SDaniel Fojt 	if (!ops || !ops->set_receive_lowest_pn) {
231*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
232*a1157835SDaniel Fojt 			   "KaY: secy set_receive_lowest_pn operation not supported");
233*a1157835SDaniel Fojt 		return -1;
234*a1157835SDaniel Fojt 	}
235*a1157835SDaniel Fojt 
236*a1157835SDaniel Fojt 	return ops->set_receive_lowest_pn(ops->ctx, rxsa);
237*a1157835SDaniel Fojt }
238*a1157835SDaniel Fojt 
239*a1157835SDaniel Fojt 
secy_create_receive_sc(struct ieee802_1x_kay * kay,struct receive_sc * rxsc)240*a1157835SDaniel Fojt int secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
241*a1157835SDaniel Fojt {
242*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
243*a1157835SDaniel Fojt 
244*a1157835SDaniel Fojt 	if (!kay || !rxsc) {
245*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
246*a1157835SDaniel Fojt 		return -1;
247*a1157835SDaniel Fojt 	}
248*a1157835SDaniel Fojt 
249*a1157835SDaniel Fojt 	ops = kay->ctx;
250*a1157835SDaniel Fojt 	if (!ops || !ops->create_receive_sc) {
251*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
252*a1157835SDaniel Fojt 			   "KaY: secy create_receive_sc operation not supported");
253*a1157835SDaniel Fojt 		return -1;
254*a1157835SDaniel Fojt 	}
255*a1157835SDaniel Fojt 
256*a1157835SDaniel Fojt 	return ops->create_receive_sc(ops->ctx, rxsc, kay->vf, kay->co);
257*a1157835SDaniel Fojt }
258*a1157835SDaniel Fojt 
259*a1157835SDaniel Fojt 
secy_delete_receive_sc(struct ieee802_1x_kay * kay,struct receive_sc * rxsc)260*a1157835SDaniel Fojt int secy_delete_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
261*a1157835SDaniel Fojt {
262*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
263*a1157835SDaniel Fojt 
264*a1157835SDaniel Fojt 	if (!kay || !rxsc) {
265*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
266*a1157835SDaniel Fojt 		return -1;
267*a1157835SDaniel Fojt 	}
268*a1157835SDaniel Fojt 
269*a1157835SDaniel Fojt 	ops = kay->ctx;
270*a1157835SDaniel Fojt 	if (!ops || !ops->delete_receive_sc) {
271*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
272*a1157835SDaniel Fojt 			   "KaY: secy delete_receive_sc operation not supported");
273*a1157835SDaniel Fojt 		return -1;
274*a1157835SDaniel Fojt 	}
275*a1157835SDaniel Fojt 
276*a1157835SDaniel Fojt 	return ops->delete_receive_sc(ops->ctx, rxsc);
277*a1157835SDaniel Fojt }
278*a1157835SDaniel Fojt 
279*a1157835SDaniel Fojt 
secy_create_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)280*a1157835SDaniel Fojt int secy_create_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
281*a1157835SDaniel Fojt {
282*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
283*a1157835SDaniel Fojt 
284*a1157835SDaniel Fojt 	if (!kay || !rxsa) {
285*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
286*a1157835SDaniel Fojt 		return -1;
287*a1157835SDaniel Fojt 	}
288*a1157835SDaniel Fojt 
289*a1157835SDaniel Fojt 	ops = kay->ctx;
290*a1157835SDaniel Fojt 	if (!ops || !ops->create_receive_sa) {
291*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
292*a1157835SDaniel Fojt 			   "KaY: secy create_receive_sa operation not supported");
293*a1157835SDaniel Fojt 		return -1;
294*a1157835SDaniel Fojt 	}
295*a1157835SDaniel Fojt 
296*a1157835SDaniel Fojt 	return ops->create_receive_sa(ops->ctx, rxsa);
297*a1157835SDaniel Fojt }
298*a1157835SDaniel Fojt 
299*a1157835SDaniel Fojt 
secy_delete_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)300*a1157835SDaniel Fojt int secy_delete_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
301*a1157835SDaniel Fojt {
302*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
303*a1157835SDaniel Fojt 
304*a1157835SDaniel Fojt 	if (!kay || !rxsa) {
305*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
306*a1157835SDaniel Fojt 		return -1;
307*a1157835SDaniel Fojt 	}
308*a1157835SDaniel Fojt 
309*a1157835SDaniel Fojt 	ops = kay->ctx;
310*a1157835SDaniel Fojt 	if (!ops || !ops->delete_receive_sa) {
311*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
312*a1157835SDaniel Fojt 			   "KaY: secy delete_receive_sa operation not supported");
313*a1157835SDaniel Fojt 		return -1;
314*a1157835SDaniel Fojt 	}
315*a1157835SDaniel Fojt 
316*a1157835SDaniel Fojt 	return ops->delete_receive_sa(ops->ctx, rxsa);
317*a1157835SDaniel Fojt }
318*a1157835SDaniel Fojt 
319*a1157835SDaniel Fojt 
secy_enable_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)320*a1157835SDaniel Fojt int secy_enable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
321*a1157835SDaniel Fojt {
322*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
323*a1157835SDaniel Fojt 
324*a1157835SDaniel Fojt 	if (!kay || !rxsa) {
325*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
326*a1157835SDaniel Fojt 		return -1;
327*a1157835SDaniel Fojt 	}
328*a1157835SDaniel Fojt 
329*a1157835SDaniel Fojt 	ops = kay->ctx;
330*a1157835SDaniel Fojt 	if (!ops || !ops->enable_receive_sa) {
331*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
332*a1157835SDaniel Fojt 			   "KaY: secy enable_receive_sa operation not supported");
333*a1157835SDaniel Fojt 		return -1;
334*a1157835SDaniel Fojt 	}
335*a1157835SDaniel Fojt 
336*a1157835SDaniel Fojt 	rxsa->enable_receive = TRUE;
337*a1157835SDaniel Fojt 
338*a1157835SDaniel Fojt 	return ops->enable_receive_sa(ops->ctx, rxsa);
339*a1157835SDaniel Fojt }
340*a1157835SDaniel Fojt 
341*a1157835SDaniel Fojt 
secy_disable_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)342*a1157835SDaniel Fojt int secy_disable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
343*a1157835SDaniel Fojt {
344*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
345*a1157835SDaniel Fojt 
346*a1157835SDaniel Fojt 	if (!kay || !rxsa) {
347*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
348*a1157835SDaniel Fojt 		return -1;
349*a1157835SDaniel Fojt 	}
350*a1157835SDaniel Fojt 
351*a1157835SDaniel Fojt 	ops = kay->ctx;
352*a1157835SDaniel Fojt 	if (!ops || !ops->disable_receive_sa) {
353*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
354*a1157835SDaniel Fojt 			   "KaY: secy disable_receive_sa operation not supported");
355*a1157835SDaniel Fojt 		return -1;
356*a1157835SDaniel Fojt 	}
357*a1157835SDaniel Fojt 
358*a1157835SDaniel Fojt 	rxsa->enable_receive = FALSE;
359*a1157835SDaniel Fojt 
360*a1157835SDaniel Fojt 	return ops->disable_receive_sa(ops->ctx, rxsa);
361*a1157835SDaniel Fojt }
362*a1157835SDaniel Fojt 
363*a1157835SDaniel Fojt 
secy_create_transmit_sc(struct ieee802_1x_kay * kay,struct transmit_sc * txsc)364*a1157835SDaniel Fojt int secy_create_transmit_sc(struct ieee802_1x_kay *kay,
365*a1157835SDaniel Fojt 			    struct transmit_sc *txsc)
366*a1157835SDaniel Fojt {
367*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
368*a1157835SDaniel Fojt 
369*a1157835SDaniel Fojt 	if (!kay || !txsc) {
370*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
371*a1157835SDaniel Fojt 		return -1;
372*a1157835SDaniel Fojt 	}
373*a1157835SDaniel Fojt 
374*a1157835SDaniel Fojt 	ops = kay->ctx;
375*a1157835SDaniel Fojt 	if (!ops || !ops->create_transmit_sc) {
376*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
377*a1157835SDaniel Fojt 			   "KaY: secy create_transmit_sc operation not supported");
378*a1157835SDaniel Fojt 		return -1;
379*a1157835SDaniel Fojt 	}
380*a1157835SDaniel Fojt 
381*a1157835SDaniel Fojt 	return ops->create_transmit_sc(ops->ctx, txsc, kay->co);
382*a1157835SDaniel Fojt }
383*a1157835SDaniel Fojt 
384*a1157835SDaniel Fojt 
secy_delete_transmit_sc(struct ieee802_1x_kay * kay,struct transmit_sc * txsc)385*a1157835SDaniel Fojt int secy_delete_transmit_sc(struct ieee802_1x_kay *kay,
386*a1157835SDaniel Fojt 			    struct transmit_sc *txsc)
387*a1157835SDaniel Fojt {
388*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
389*a1157835SDaniel Fojt 
390*a1157835SDaniel Fojt 	if (!kay || !txsc) {
391*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
392*a1157835SDaniel Fojt 		return -1;
393*a1157835SDaniel Fojt 	}
394*a1157835SDaniel Fojt 
395*a1157835SDaniel Fojt 	ops = kay->ctx;
396*a1157835SDaniel Fojt 	if (!ops || !ops->delete_transmit_sc) {
397*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
398*a1157835SDaniel Fojt 			   "KaY: secy delete_transmit_sc operation not supported");
399*a1157835SDaniel Fojt 		return -1;
400*a1157835SDaniel Fojt 	}
401*a1157835SDaniel Fojt 
402*a1157835SDaniel Fojt 	return ops->delete_transmit_sc(ops->ctx, txsc);
403*a1157835SDaniel Fojt }
404*a1157835SDaniel Fojt 
405*a1157835SDaniel Fojt 
secy_create_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)406*a1157835SDaniel Fojt int secy_create_transmit_sa(struct ieee802_1x_kay *kay,
407*a1157835SDaniel Fojt 			    struct transmit_sa *txsa)
408*a1157835SDaniel Fojt {
409*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
410*a1157835SDaniel Fojt 
411*a1157835SDaniel Fojt 	if (!kay || !txsa) {
412*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
413*a1157835SDaniel Fojt 		return -1;
414*a1157835SDaniel Fojt 	}
415*a1157835SDaniel Fojt 
416*a1157835SDaniel Fojt 	ops = kay->ctx;
417*a1157835SDaniel Fojt 	if (!ops || !ops->create_transmit_sa) {
418*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
419*a1157835SDaniel Fojt 			   "KaY: secy create_transmit_sa operation not supported");
420*a1157835SDaniel Fojt 		return -1;
421*a1157835SDaniel Fojt 	}
422*a1157835SDaniel Fojt 
423*a1157835SDaniel Fojt 	return ops->create_transmit_sa(ops->ctx, txsa);
424*a1157835SDaniel Fojt }
425*a1157835SDaniel Fojt 
426*a1157835SDaniel Fojt 
secy_delete_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)427*a1157835SDaniel Fojt int secy_delete_transmit_sa(struct ieee802_1x_kay *kay,
428*a1157835SDaniel Fojt 			    struct transmit_sa *txsa)
429*a1157835SDaniel Fojt {
430*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
431*a1157835SDaniel Fojt 
432*a1157835SDaniel Fojt 	if (!kay || !txsa) {
433*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
434*a1157835SDaniel Fojt 		return -1;
435*a1157835SDaniel Fojt 	}
436*a1157835SDaniel Fojt 
437*a1157835SDaniel Fojt 	ops = kay->ctx;
438*a1157835SDaniel Fojt 	if (!ops || !ops->delete_transmit_sa) {
439*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
440*a1157835SDaniel Fojt 			   "KaY: secy delete_transmit_sa operation not supported");
441*a1157835SDaniel Fojt 		return -1;
442*a1157835SDaniel Fojt 	}
443*a1157835SDaniel Fojt 
444*a1157835SDaniel Fojt 	return ops->delete_transmit_sa(ops->ctx, txsa);
445*a1157835SDaniel Fojt }
446*a1157835SDaniel Fojt 
447*a1157835SDaniel Fojt 
secy_enable_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)448*a1157835SDaniel Fojt int secy_enable_transmit_sa(struct ieee802_1x_kay *kay,
449*a1157835SDaniel Fojt 			    struct transmit_sa *txsa)
450*a1157835SDaniel Fojt {
451*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
452*a1157835SDaniel Fojt 
453*a1157835SDaniel Fojt 	if (!kay || !txsa) {
454*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
455*a1157835SDaniel Fojt 		return -1;
456*a1157835SDaniel Fojt 	}
457*a1157835SDaniel Fojt 
458*a1157835SDaniel Fojt 	ops = kay->ctx;
459*a1157835SDaniel Fojt 	if (!ops || !ops->enable_transmit_sa) {
460*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
461*a1157835SDaniel Fojt 			   "KaY: secy enable_transmit_sa operation not supported");
462*a1157835SDaniel Fojt 		return -1;
463*a1157835SDaniel Fojt 	}
464*a1157835SDaniel Fojt 
465*a1157835SDaniel Fojt 	txsa->enable_transmit = TRUE;
466*a1157835SDaniel Fojt 
467*a1157835SDaniel Fojt 	return ops->enable_transmit_sa(ops->ctx, txsa);
468*a1157835SDaniel Fojt }
469*a1157835SDaniel Fojt 
470*a1157835SDaniel Fojt 
secy_disable_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)471*a1157835SDaniel Fojt int secy_disable_transmit_sa(struct ieee802_1x_kay *kay,
472*a1157835SDaniel Fojt 			     struct transmit_sa *txsa)
473*a1157835SDaniel Fojt {
474*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
475*a1157835SDaniel Fojt 
476*a1157835SDaniel Fojt 	if (!kay || !txsa) {
477*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
478*a1157835SDaniel Fojt 		return -1;
479*a1157835SDaniel Fojt 	}
480*a1157835SDaniel Fojt 
481*a1157835SDaniel Fojt 	ops = kay->ctx;
482*a1157835SDaniel Fojt 	if (!ops || !ops->disable_transmit_sa) {
483*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
484*a1157835SDaniel Fojt 			   "KaY: secy disable_transmit_sa operation not supported");
485*a1157835SDaniel Fojt 		return -1;
486*a1157835SDaniel Fojt 	}
487*a1157835SDaniel Fojt 
488*a1157835SDaniel Fojt 	txsa->enable_transmit = FALSE;
489*a1157835SDaniel Fojt 
490*a1157835SDaniel Fojt 	return ops->disable_transmit_sa(ops->ctx, txsa);
491*a1157835SDaniel Fojt }
492*a1157835SDaniel Fojt 
493*a1157835SDaniel Fojt 
secy_init_macsec(struct ieee802_1x_kay * kay)494*a1157835SDaniel Fojt int secy_init_macsec(struct ieee802_1x_kay *kay)
495*a1157835SDaniel Fojt {
496*a1157835SDaniel Fojt 	int ret;
497*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
498*a1157835SDaniel Fojt 	struct macsec_init_params params;
499*a1157835SDaniel Fojt 
500*a1157835SDaniel Fojt 	if (!kay) {
501*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
502*a1157835SDaniel Fojt 		return -1;
503*a1157835SDaniel Fojt 	}
504*a1157835SDaniel Fojt 
505*a1157835SDaniel Fojt 	ops = kay->ctx;
506*a1157835SDaniel Fojt 	if (!ops || !ops->macsec_init) {
507*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
508*a1157835SDaniel Fojt 			   "KaY: secy macsec_init operation not supported");
509*a1157835SDaniel Fojt 		return -1;
510*a1157835SDaniel Fojt 	}
511*a1157835SDaniel Fojt 
512*a1157835SDaniel Fojt 	params.use_es = FALSE;
513*a1157835SDaniel Fojt 	params.use_scb = FALSE;
514*a1157835SDaniel Fojt 	params.always_include_sci = TRUE;
515*a1157835SDaniel Fojt 
516*a1157835SDaniel Fojt 	ret = ops->macsec_init(ops->ctx, &params);
517*a1157835SDaniel Fojt 
518*a1157835SDaniel Fojt 	return ret;
519*a1157835SDaniel Fojt }
520*a1157835SDaniel Fojt 
521*a1157835SDaniel Fojt 
secy_deinit_macsec(struct ieee802_1x_kay * kay)522*a1157835SDaniel Fojt int secy_deinit_macsec(struct ieee802_1x_kay *kay)
523*a1157835SDaniel Fojt {
524*a1157835SDaniel Fojt 	struct ieee802_1x_kay_ctx *ops;
525*a1157835SDaniel Fojt 
526*a1157835SDaniel Fojt 	if (!kay) {
527*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
528*a1157835SDaniel Fojt 		return -1;
529*a1157835SDaniel Fojt 	}
530*a1157835SDaniel Fojt 
531*a1157835SDaniel Fojt 	ops = kay->ctx;
532*a1157835SDaniel Fojt 	if (!ops || !ops->macsec_deinit) {
533*a1157835SDaniel Fojt 		wpa_printf(MSG_ERROR,
534*a1157835SDaniel Fojt 			   "KaY: secy macsec_deinit operation not supported");
535*a1157835SDaniel Fojt 		return -1;
536*a1157835SDaniel Fojt 	}
537*a1157835SDaniel Fojt 
538*a1157835SDaniel Fojt 	return ops->macsec_deinit(ops->ctx);
539*a1157835SDaniel Fojt }
540