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