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