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