3f918d64ea1fdd9525c5df593fade65f73dcc798
[mech_eap.git] / src / pae / ieee802_1x_kay.h
1 /*
2  * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
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 #ifndef IEEE802_1X_KAY_H
10 #define IEEE802_1X_KAY_H
11
12 #include "utils/list.h"
13 #include "common/defs.h"
14 #include "common/ieee802_1x_defs.h"
15
16 struct macsec_init_params;
17 struct ieee802_1x_cp_conf;
18
19 #define MI_LEN                  12
20 #define MAX_KEY_LEN             32  /* 32 bytes, 256 bits */
21 #define MAX_CKN_LEN             32  /* 32 bytes, 256 bits */
22
23 /* MKA timer, unit: millisecond */
24 #define MKA_HELLO_TIME          2000
25 #define MKA_LIFE_TIME           6000
26 #define MKA_SAK_RETIRE_TIME     3000
27
28 struct ieee802_1x_mka_ki {
29         u8 mi[MI_LEN];
30         u32 kn;
31 };
32
33 struct ieee802_1x_mka_sci {
34         u8 addr[ETH_ALEN];
35         be16 port;
36 };
37
38 struct mka_key {
39         u8 key[MAX_KEY_LEN];
40         size_t len;
41 };
42
43 struct mka_key_name {
44         u8 name[MAX_CKN_LEN];
45         size_t len;
46 };
47
48 enum mka_created_mode {
49         PSK,
50         EAP_EXCHANGE,
51 };
52
53 struct ieee802_1x_kay_ctx {
54         /* pointer to arbitrary upper level context */
55         void *ctx;
56
57         /* abstract wpa driver interface */
58         int (*macsec_init)(void *ctx, struct macsec_init_params *params);
59         int (*macsec_deinit)(void *ctx);
60         int (*enable_protect_frames)(void *ctx, Boolean enabled);
61         int (*set_replay_protect)(void *ctx, Boolean enabled, u32 window);
62         int (*set_current_cipher_suite)(void *ctx, u64 cs);
63         int (*enable_controlled_port)(void *ctx, Boolean enabled);
64         int (*get_receive_lowest_pn)(void *ctx, u32 channel, u8 an,
65                                      u32 *lowest_pn);
66         int (*get_transmit_next_pn)(void *ctx, u32 channel, u8 an,
67                                     u32 *next_pn);
68         int (*set_transmit_next_pn)(void *ctx, u32 channel, u8 an, u32 next_pn);
69         int (*get_available_receive_sc)(void *ctx, u32 *channel);
70         int (*create_receive_sc)(void *ctx, u32 channel,
71                                  struct ieee802_1x_mka_sci *sci,
72                                  enum validate_frames vf,
73                                  enum confidentiality_offset co);
74         int (*delete_receive_sc)(void *ctx, u32 channel);
75         int (*create_receive_sa)(void *ctx, u32 channel, u8 an, u32 lowest_pn,
76                                  const u8 *sak);
77         int (*enable_receive_sa)(void *ctx, u32 channel, u8 an);
78         int (*disable_receive_sa)(void *ctx, u32 channel, u8 an);
79         int (*get_available_transmit_sc)(void *ctx, u32 *channel);
80         int (*create_transmit_sc)(void *ctx, u32 channel,
81                                   const struct ieee802_1x_mka_sci *sci,
82                                   enum confidentiality_offset co);
83         int (*delete_transmit_sc)(void *ctx, u32 channel);
84         int (*create_transmit_sa)(void *ctx, u32 channel, u8 an, u32 next_pn,
85                                   Boolean confidentiality, const u8 *sak);
86         int (*enable_transmit_sa)(void *ctx, u32 channel, u8 an);
87         int (*disable_transmit_sa)(void *ctx, u32 channel, u8 an);
88 };
89
90 struct ieee802_1x_kay {
91         Boolean enable;
92         Boolean active;
93
94         Boolean authenticated;
95         Boolean secured;
96         Boolean failed;
97
98         struct ieee802_1x_mka_sci actor_sci;
99         u8 actor_priority;
100         struct ieee802_1x_mka_sci key_server_sci;
101         u8 key_server_priority;
102
103         enum macsec_cap macsec_capable;
104         Boolean macsec_desired;
105         Boolean macsec_protect;
106         Boolean macsec_replay_protect;
107         u32 macsec_replay_window;
108         enum validate_frames macsec_validate;
109         enum confidentiality_offset macsec_confidentiality;
110
111         u32 ltx_kn;
112         u8 ltx_an;
113         u32 lrx_kn;
114         u8 lrx_an;
115
116         u32 otx_kn;
117         u8 otx_an;
118         u32 orx_kn;
119         u8 orx_an;
120
121         /* not defined in IEEE802.1X */
122         struct ieee802_1x_kay_ctx *ctx;
123         Boolean is_key_server;
124         Boolean is_obliged_key_server;
125         char if_name[IFNAMSIZ];
126
127         unsigned int macsec_csindex;  /* MACsec cipher suite table index */
128         int mka_algindex;  /* MKA alg table index */
129
130         u32 dist_kn;
131         u8 dist_an;
132         time_t dist_time;
133
134         u8 mka_version;
135         u8 algo_agility[4];
136         u32 sc_ch;
137
138         u32 pn_exhaustion;
139         Boolean port_enable;
140         Boolean rx_enable;
141         Boolean tx_enable;
142
143         struct dl_list participant_list;
144         enum macsec_policy policy;
145
146         struct ieee802_1x_cp_sm *cp;
147
148         struct l2_packet_data *l2_mka;
149
150         enum validate_frames vf;
151         enum confidentiality_offset co;
152 };
153
154
155 struct ieee802_1x_kay *
156 ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
157                     const char *ifname, const u8 *addr);
158 void ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
159
160 struct ieee802_1x_mka_participant *
161 ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay,
162                           struct mka_key_name *ckn, struct mka_key *cak,
163                           u32 life, enum mka_created_mode mode,
164                           Boolean is_authenticator);
165 void ieee802_1x_kay_delete_mka(struct ieee802_1x_kay *kay,
166                                struct mka_key_name *ckn);
167 void ieee802_1x_kay_mka_participate(struct ieee802_1x_kay *kay,
168                                     struct mka_key_name *ckn,
169                                     Boolean status);
170 int ieee802_1x_kay_new_sak(struct ieee802_1x_kay *kay);
171 int ieee802_1x_kay_change_cipher_suite(struct ieee802_1x_kay *kay,
172                                        unsigned int cs_index);
173
174 int ieee802_1x_kay_set_latest_sa_attr(struct ieee802_1x_kay *kay,
175                                       struct ieee802_1x_mka_ki *lki, u8 lan,
176                                       Boolean ltx, Boolean lrx);
177 int ieee802_1x_kay_set_old_sa_attr(struct ieee802_1x_kay *kay,
178                                    struct ieee802_1x_mka_ki *oki,
179                                    u8 oan, Boolean otx, Boolean orx);
180 int ieee802_1x_kay_create_sas(struct ieee802_1x_kay *kay,
181                               struct ieee802_1x_mka_ki *lki);
182 int ieee802_1x_kay_delete_sas(struct ieee802_1x_kay *kay,
183                               struct ieee802_1x_mka_ki *ki);
184 int ieee802_1x_kay_enable_tx_sas(struct ieee802_1x_kay *kay,
185                                  struct ieee802_1x_mka_ki *lki);
186 int ieee802_1x_kay_enable_rx_sas(struct ieee802_1x_kay *kay,
187                                  struct ieee802_1x_mka_ki *lki);
188 int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
189 int ieee802_1x_kay_cp_conf(struct ieee802_1x_kay *kay,
190                            struct ieee802_1x_cp_conf *pconf);
191
192 #endif /* IEEE802_1X_KAY_H */