123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /*
- * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
- * Copyright (c) 2013, Qualcomm Atheros, Inc.
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
- #ifndef IEEE802_1X_KAY_H
- #define IEEE802_1X_KAY_H
- #include "utils/list.h"
- #include "common/defs.h"
- #include "common/ieee802_1x_defs.h"
- struct macsec_init_params;
- #define MI_LEN 12 /* 96-bit Member Identifier */
- #define MAX_KEY_LEN 32 /* 32 bytes, 256 bits */
- #define MAX_CKN_LEN 32 /* 32 bytes, 256 bits */
- /* MKA timer, unit: millisecond */
- #define MKA_HELLO_TIME 2000
- #define MKA_LIFE_TIME 6000
- #define MKA_SAK_RETIRE_TIME 3000
- /**
- * struct ieee802_1x_mka_ki - Key Identifier (KI)
- * @mi: Key Server's Member Identifier
- * @kn: Key Number, assigned by the Key Server
- * IEEE 802.1X-2010 9.8 SAK generation, distribution, and selection
- */
- struct ieee802_1x_mka_ki {
- u8 mi[MI_LEN];
- u32 kn;
- };
- struct ieee802_1x_mka_sci {
- u8 addr[ETH_ALEN];
- be16 port;
- };
- struct mka_key {
- u8 key[MAX_KEY_LEN];
- size_t len;
- };
- struct mka_key_name {
- u8 name[MAX_CKN_LEN];
- size_t len;
- };
- enum mka_created_mode {
- PSK,
- EAP_EXCHANGE,
- };
- struct data_key {
- u8 *key;
- int key_len;
- struct ieee802_1x_mka_ki key_identifier;
- enum confidentiality_offset confidentiality_offset;
- u8 an;
- Boolean transmits;
- Boolean receives;
- struct os_time created_time;
- u32 next_pn;
- /* not defined data */
- Boolean rx_latest;
- Boolean tx_latest;
- int user;
- struct dl_list list;
- };
- /* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
- struct transmit_sc {
- struct ieee802_1x_mka_sci sci; /* const SCI sci */
- Boolean transmitting; /* bool transmitting (read only) */
- struct os_time created_time; /* Time createdTime */
- u8 encoding_sa; /* AN encodingSA (read only) */
- u8 enciphering_sa; /* AN encipheringSA (read only) */
- /* not defined data */
- struct dl_list list;
- struct dl_list sa_list;
- };
- /* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
- struct transmit_sa {
- Boolean in_use; /* bool inUse (read only) */
- u32 next_pn; /* PN nextPN (read only) */
- struct os_time created_time; /* Time createdTime */
- Boolean enable_transmit; /* bool EnableTransmit */
- u8 an;
- Boolean confidentiality;
- struct data_key *pkey;
- struct transmit_sc *sc;
- struct dl_list list; /* list entry in struct transmit_sc::sa_list */
- };
- /* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
- struct receive_sc {
- struct ieee802_1x_mka_sci sci; /* const SCI sci */
- Boolean receiving; /* bool receiving (read only) */
- struct os_time created_time; /* Time createdTime */
- struct dl_list list;
- struct dl_list sa_list;
- };
- /* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
- struct receive_sa {
- Boolean enable_receive; /* bool enableReceive */
- Boolean in_use; /* bool inUse (read only) */
- u32 next_pn; /* PN nextPN (read only) */
- u32 lowest_pn; /* PN lowestPN (read only) */
- u8 an;
- struct os_time created_time;
- struct data_key *pkey;
- struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
- struct dl_list list;
- };
- struct ieee802_1x_kay_ctx {
- /* pointer to arbitrary upper level context */
- void *ctx;
- /* abstract wpa driver interface */
- int (*macsec_init)(void *ctx, struct macsec_init_params *params);
- int (*macsec_deinit)(void *ctx);
- int (*macsec_get_capability)(void *priv, enum macsec_cap *cap);
- int (*enable_protect_frames)(void *ctx, Boolean enabled);
- int (*enable_encrypt)(void *ctx, Boolean enabled);
- int (*set_replay_protect)(void *ctx, Boolean enabled, u32 window);
- int (*set_current_cipher_suite)(void *ctx, u64 cs);
- int (*enable_controlled_port)(void *ctx, Boolean enabled);
- int (*get_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
- int (*get_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
- int (*set_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
- int (*create_receive_sc)(void *ctx, struct receive_sc *sc,
- enum validate_frames vf,
- enum confidentiality_offset co);
- int (*delete_receive_sc)(void *ctx, struct receive_sc *sc);
- int (*create_receive_sa)(void *ctx, struct receive_sa *sa);
- int (*delete_receive_sa)(void *ctx, struct receive_sa *sa);
- int (*enable_receive_sa)(void *ctx, struct receive_sa *sa);
- int (*disable_receive_sa)(void *ctx, struct receive_sa *sa);
- int (*create_transmit_sc)(void *ctx, struct transmit_sc *sc,
- enum confidentiality_offset co);
- int (*delete_transmit_sc)(void *ctx, struct transmit_sc *sc);
- int (*create_transmit_sa)(void *ctx, struct transmit_sa *sa);
- int (*delete_transmit_sa)(void *ctx, struct transmit_sa *sa);
- int (*enable_transmit_sa)(void *ctx, struct transmit_sa *sa);
- int (*disable_transmit_sa)(void *ctx, struct transmit_sa *sa);
- };
- struct ieee802_1x_kay {
- Boolean enable;
- Boolean active;
- Boolean authenticated;
- Boolean secured;
- Boolean failed;
- struct ieee802_1x_mka_sci actor_sci;
- u8 actor_priority;
- struct ieee802_1x_mka_sci key_server_sci;
- u8 key_server_priority;
- enum macsec_cap macsec_capable;
- Boolean macsec_desired;
- Boolean macsec_protect;
- Boolean macsec_encrypt;
- Boolean macsec_replay_protect;
- u32 macsec_replay_window;
- enum validate_frames macsec_validate;
- enum confidentiality_offset macsec_confidentiality;
- u32 ltx_kn;
- u8 ltx_an;
- u32 lrx_kn;
- u8 lrx_an;
- u32 otx_kn;
- u8 otx_an;
- u32 orx_kn;
- u8 orx_an;
- /* not defined in IEEE802.1X */
- struct ieee802_1x_kay_ctx *ctx;
- Boolean is_key_server;
- Boolean is_obliged_key_server;
- char if_name[IFNAMSIZ];
- unsigned int macsec_csindex; /* MACsec cipher suite table index */
- int mka_algindex; /* MKA alg table index */
- u32 dist_kn;
- u32 rcvd_keys;
- u8 dist_an;
- time_t dist_time;
- u8 mka_version;
- u8 algo_agility[4];
- u32 pn_exhaustion;
- Boolean port_enable;
- Boolean rx_enable;
- Boolean tx_enable;
- struct dl_list participant_list;
- enum macsec_policy policy;
- struct ieee802_1x_cp_sm *cp;
- struct l2_packet_data *l2_mka;
- enum validate_frames vf;
- enum confidentiality_offset co;
- };
- u64 mka_sci_u64(struct ieee802_1x_mka_sci *sci);
- struct ieee802_1x_kay *
- ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
- u16 port, u8 priority, const char *ifname, const u8 *addr);
- void ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
- struct ieee802_1x_mka_participant *
- ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay,
- struct mka_key_name *ckn, struct mka_key *cak,
- u32 life, enum mka_created_mode mode,
- Boolean is_authenticator);
- void ieee802_1x_kay_delete_mka(struct ieee802_1x_kay *kay,
- struct mka_key_name *ckn);
- void ieee802_1x_kay_mka_participate(struct ieee802_1x_kay *kay,
- struct mka_key_name *ckn,
- Boolean status);
- int ieee802_1x_kay_new_sak(struct ieee802_1x_kay *kay);
- int ieee802_1x_kay_change_cipher_suite(struct ieee802_1x_kay *kay,
- unsigned int cs_index);
- int ieee802_1x_kay_set_latest_sa_attr(struct ieee802_1x_kay *kay,
- struct ieee802_1x_mka_ki *lki, u8 lan,
- Boolean ltx, Boolean lrx);
- int ieee802_1x_kay_set_old_sa_attr(struct ieee802_1x_kay *kay,
- struct ieee802_1x_mka_ki *oki,
- u8 oan, Boolean otx, Boolean orx);
- int ieee802_1x_kay_create_sas(struct ieee802_1x_kay *kay,
- struct ieee802_1x_mka_ki *lki);
- int ieee802_1x_kay_delete_sas(struct ieee802_1x_kay *kay,
- struct ieee802_1x_mka_ki *ki);
- int ieee802_1x_kay_enable_tx_sas(struct ieee802_1x_kay *kay,
- struct ieee802_1x_mka_ki *lki);
- int ieee802_1x_kay_enable_rx_sas(struct ieee802_1x_kay *kay,
- struct ieee802_1x_mka_ki *lki);
- int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
- int ieee802_1x_kay_get_status(struct ieee802_1x_kay *kay, char *buf,
- size_t buflen);
- #endif /* IEEE802_1X_KAY_H */
|