15a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt/*
25a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
35a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * Copyright (c) 2013, Qualcomm Atheros, Inc.
45a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *
55a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * This software may be distributed under the terms of the BSD license.
65a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * See README for more details.
75a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt */
85a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
95a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifndef IEEE802_1X_KAY_H
105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define IEEE802_1X_KAY_H
115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "utils/list.h"
135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "common/defs.h"
145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "common/ieee802_1x_defs.h"
155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct macsec_init_params;
175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
189839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt#define MI_LEN			12  /* 96-bit Member Identifier */
195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define MAX_KEY_LEN		32  /* 32 bytes, 256 bits */
205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define MAX_CKN_LEN		32  /* 32 bytes, 256 bits */
215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt/* MKA timer, unit: millisecond */
235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define MKA_HELLO_TIME		2000
245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define MKA_LIFE_TIME		6000
255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define MKA_SAK_RETIRE_TIME	3000
265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
279839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt/**
289839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt * struct ieee802_1x_mka_ki - Key Identifier (KI)
299839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt * @mi: Key Server's Member Identifier
309839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt * @kn: Key Number, assigned by the Key Server
319839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt * IEEE 802.1X-2010 9.8 SAK generation, distribution, and selection
329839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt */
335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee802_1x_mka_ki {
345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 mi[MI_LEN];
355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 kn;
365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee802_1x_mka_sci {
395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 addr[ETH_ALEN];
404ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt	be16 port;
415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct mka_key {
445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 key[MAX_KEY_LEN];
455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	size_t len;
465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct mka_key_name {
495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 name[MAX_CKN_LEN];
505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	size_t len;
515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtenum mka_created_mode {
545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	PSK,
555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	EAP_EXCHANGE,
565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
589839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtstruct data_key {
599839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u8 *key;
609839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int key_len;
619839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct ieee802_1x_mka_ki key_identifier;
629839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	enum confidentiality_offset confidentiality_offset;
639839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u8 an;
649839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean transmits;
659839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean receives;
669839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct os_time created_time;
679839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u32 next_pn;
689839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
699839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	/* not defined data */
709839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean rx_latest;
719839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean tx_latest;
729839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
739839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int user;
749839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
759839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list list;
769839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt};
779839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
789839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt/* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
799839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtstruct transmit_sc {
809839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct ieee802_1x_mka_sci sci; /* const SCI sci */
819839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean transmitting; /* bool transmitting (read only) */
829839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
839839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct os_time created_time; /* Time createdTime */
849839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
859839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u8 encoding_sa; /* AN encodingSA (read only) */
869839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u8 enciphering_sa; /* AN encipheringSA (read only) */
879839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
889839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	/* not defined data */
899839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list list;
909839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list sa_list;
919839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt};
929839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
939839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt/* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
949839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtstruct transmit_sa {
959839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean in_use; /* bool inUse (read only) */
969839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u32 next_pn; /* PN nextPN (read only) */
979839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct os_time created_time; /* Time createdTime */
989839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
999839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean enable_transmit; /* bool EnableTransmit */
1009839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1019839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u8 an;
1029839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean confidentiality;
1039839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct data_key *pkey;
1049839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1059839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct transmit_sc *sc;
1069839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list list; /* list entry in struct transmit_sc::sa_list */
1079839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt};
1089839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1099839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt/* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
1109839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtstruct receive_sc {
1119839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct ieee802_1x_mka_sci sci; /* const SCI sci */
1129839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean receiving; /* bool receiving (read only) */
1139839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1149839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct os_time created_time; /* Time createdTime */
1159839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1169839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list list;
1179839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list sa_list;
1189839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt};
1199839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1209839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt/* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
1219839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtstruct receive_sa {
1229839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean enable_receive; /* bool enableReceive */
1239839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	Boolean in_use; /* bool inUse (read only) */
1249839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1259839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u32 next_pn; /* PN nextPN (read only) */
1269839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u32 lowest_pn; /* PN lowestPN (read only) */
1279839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	u8 an;
1289839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct os_time created_time;
1299839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1309839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct data_key *pkey;
1319839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
1329839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1339839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct dl_list list;
1349839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt};
1359839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
1365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee802_1x_kay_ctx {
1375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	/* pointer to arbitrary upper level context */
1385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	void *ctx;
1395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	/* abstract wpa driver interface */
1415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int (*macsec_init)(void *ctx, struct macsec_init_params *params);
1425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int (*macsec_deinit)(void *ctx);
1439839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*macsec_get_capability)(void *priv, enum macsec_cap *cap);
1445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int (*enable_protect_frames)(void *ctx, Boolean enabled);
145abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	int (*enable_encrypt)(void *ctx, Boolean enabled);
1465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int (*set_replay_protect)(void *ctx, Boolean enabled, u32 window);
1477d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt	int (*set_current_cipher_suite)(void *ctx, u64 cs);
1485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int (*enable_controlled_port)(void *ctx, Boolean enabled);
1499839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*get_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
1509839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*get_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
1519839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*set_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
1529839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*create_receive_sc)(void *ctx, struct receive_sc *sc,
1535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				 enum validate_frames vf,
1545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				 enum confidentiality_offset co);
1559839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*delete_receive_sc)(void *ctx, struct receive_sc *sc);
1569839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*create_receive_sa)(void *ctx, struct receive_sa *sa);
1579839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*delete_receive_sa)(void *ctx, struct receive_sa *sa);
1589839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*enable_receive_sa)(void *ctx, struct receive_sa *sa);
1599839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*disable_receive_sa)(void *ctx, struct receive_sa *sa);
1609839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*create_transmit_sc)(void *ctx, struct transmit_sc *sc,
1615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				  enum confidentiality_offset co);
1629839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*delete_transmit_sc)(void *ctx, struct transmit_sc *sc);
1639839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*create_transmit_sa)(void *ctx, struct transmit_sa *sa);
1649839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*delete_transmit_sa)(void *ctx, struct transmit_sa *sa);
1659839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*enable_transmit_sa)(void *ctx, struct transmit_sa *sa);
1669839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	int (*disable_transmit_sa)(void *ctx, struct transmit_sa *sa);
1675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
1685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee802_1x_kay {
1705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean enable;
1715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean active;
1725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean authenticated;
1745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean secured;
1755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean failed;
1765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_mka_sci actor_sci;
1785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 actor_priority;
1795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_mka_sci key_server_sci;
1805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 key_server_priority;
1815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	enum macsec_cap macsec_capable;
1835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean macsec_desired;
1845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean macsec_protect;
185abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	Boolean macsec_encrypt;
1865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean macsec_replay_protect;
1875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 macsec_replay_window;
1885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	enum validate_frames macsec_validate;
1895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	enum confidentiality_offset macsec_confidentiality;
1905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 ltx_kn;
1925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 ltx_an;
1935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 lrx_kn;
1945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 lrx_an;
1955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 otx_kn;
1975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 otx_an;
1985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 orx_kn;
1995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 orx_an;
2005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	/* not defined in IEEE802.1X */
2025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ctx;
2035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean is_key_server;
2045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean is_obliged_key_server;
2055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	char if_name[IFNAMSIZ];
2065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2077d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt	unsigned int macsec_csindex;  /* MACsec cipher suite table index */
2085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int mka_algindex;  /* MKA alg table index */
2095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 dist_kn;
211293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt	u32 rcvd_keys;
2125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 dist_an;
2135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	time_t dist_time;
2145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 mka_version;
2165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 algo_agility[4];
2175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u32 pn_exhaustion;
2195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean port_enable;
2205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean rx_enable;
2215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	Boolean tx_enable;
2225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct dl_list participant_list;
2245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	enum macsec_policy policy;
2255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_cp_sm *cp;
2275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct l2_packet_data *l2_mka;
2295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	enum validate_frames vf;
2315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	enum confidentiality_offset co;
2325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt};
2335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
235abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidtu64 mka_sci_u64(struct ieee802_1x_mka_sci *sci);
236abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt
2375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee802_1x_kay *
2385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
239293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt		    u16 port, u8 priority, const char *ifname, const u8 *addr);
2405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtvoid ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
2415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee802_1x_mka_participant *
2435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay,
2445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			  struct mka_key_name *ckn, struct mka_key *cak,
2455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			  u32 life, enum mka_created_mode mode,
2465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			  Boolean is_authenticator);
2475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtvoid ieee802_1x_kay_delete_mka(struct ieee802_1x_kay *kay,
2485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			       struct mka_key_name *ckn);
2495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtvoid ieee802_1x_kay_mka_participate(struct ieee802_1x_kay *kay,
2505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				    struct mka_key_name *ckn,
2515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				    Boolean status);
2525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_new_sak(struct ieee802_1x_kay *kay);
2535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_change_cipher_suite(struct ieee802_1x_kay *kay,
2547d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt				       unsigned int cs_index);
2555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_set_latest_sa_attr(struct ieee802_1x_kay *kay,
2575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				      struct ieee802_1x_mka_ki *lki, u8 lan,
2585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				      Boolean ltx, Boolean lrx);
2595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_set_old_sa_attr(struct ieee802_1x_kay *kay,
2605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				   struct ieee802_1x_mka_ki *oki,
2615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				   u8 oan, Boolean otx, Boolean orx);
2625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_create_sas(struct ieee802_1x_kay *kay,
2635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			      struct ieee802_1x_mka_ki *lki);
2645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_delete_sas(struct ieee802_1x_kay *kay,
2655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			      struct ieee802_1x_mka_ki *ki);
2665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_enable_tx_sas(struct ieee802_1x_kay *kay,
2675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				 struct ieee802_1x_mka_ki *lki);
2685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_enable_rx_sas(struct ieee802_1x_kay *kay,
2695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				 struct ieee802_1x_mka_ki *lki);
2705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
271293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidtint ieee802_1x_kay_get_status(struct ieee802_1x_kay *kay, char *buf,
272293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt			      size_t buflen);
2735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* IEEE802_1X_KAY_H */
275