Home | History | Annotate | Download | only in pae
      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_I_H
     10 #define IEEE802_1X_KAY_I_H
     11 
     12 #include "utils/list.h"
     13 #include "common/defs.h"
     14 #include "common/ieee802_1x_defs.h"
     15 
     16 #define MKA_VERSION_ID              1
     17 
     18 /* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 */
     19 enum mka_packet_type {
     20 	MKA_BASIC_PARAMETER_SET = MKA_VERSION_ID,
     21 	MKA_LIVE_PEER_LIST = 1,
     22 	MKA_POTENTIAL_PEER_LIST = 2,
     23 	MKA_SAK_USE = 3,
     24 	MKA_DISTRIBUTED_SAK = 4,
     25 	MKA_DISTRIBUTED_CAK = 5,
     26 	MKA_KMD = 6,
     27 	MKA_ANNOUNCEMENT = 7,
     28 	MKA_ICV_INDICATOR = 255
     29 };
     30 
     31 #define ICV_LEN                         16  /* 16 bytes */
     32 #define SAK_WRAPPED_LEN                 24
     33 /* KN + Wrapper SAK */
     34 #define DEFAULT_DIS_SAK_BODY_LENGTH     (SAK_WRAPPED_LEN + 4)
     35 #define MAX_RETRY_CNT                   5
     36 
     37 struct ieee802_1x_kay;
     38 
     39 struct ieee802_1x_mka_peer_id {
     40 	u8 mi[MI_LEN];
     41 	u32 mn;
     42 };
     43 
     44 struct ieee802_1x_kay_peer {
     45 	struct ieee802_1x_mka_sci sci;
     46 	u8 mi[MI_LEN];
     47 	u32 mn;
     48 	time_t expire;
     49 	Boolean is_key_server;
     50 	u8 key_server_priority;
     51 	Boolean macsec_desired;
     52 	enum macsec_cap macsec_capbility;
     53 	Boolean sak_used;
     54 	struct dl_list list;
     55 };
     56 
     57 struct key_conf {
     58 	u8 *key;
     59 	struct ieee802_1x_mka_ki ki;
     60 	enum confidentiality_offset offset;
     61 	u8 an;
     62 	Boolean tx;
     63 	Boolean rx;
     64 	int key_len; /* unit: byte */
     65 };
     66 
     67 struct data_key {
     68 	u8 *key;
     69 	int key_len;
     70 	struct ieee802_1x_mka_ki key_identifier;
     71 	enum confidentiality_offset confidentiality_offset;
     72 	u8 an;
     73 	Boolean transmits;
     74 	Boolean receives;
     75 	struct os_time created_time;
     76 	u32 next_pn;
     77 
     78 	/* not defined data */
     79 	Boolean rx_latest;
     80 	Boolean tx_latest;
     81 
     82 	int user;  /* FIXME: to indicate if it can be delete safely */
     83 
     84 	struct dl_list list;
     85 };
     86 
     87 /* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
     88 struct transmit_sc {
     89 	struct ieee802_1x_mka_sci sci; /* const SCI sci */
     90 	Boolean transmitting; /* bool transmitting (read only) */
     91 
     92 	struct os_time created_time; /* Time createdTime */
     93 
     94 	u8 encoding_sa; /* AN encodingSA (read only) */
     95 	u8 enciphering_sa; /* AN encipheringSA (read only) */
     96 
     97 	/* not defined data */
     98 	unsigned int channel;
     99 
    100 	struct dl_list list;
    101 	struct dl_list sa_list;
    102 };
    103 
    104 /* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
    105 struct transmit_sa {
    106 	Boolean in_use; /* bool inUse (read only) */
    107 	u32 next_pn; /* PN nextPN (read only) */
    108 	struct os_time created_time; /* Time createdTime */
    109 
    110 	Boolean enable_transmit; /* bool EnableTransmit */
    111 
    112 	u8 an;
    113 	Boolean confidentiality;
    114 	struct data_key *pkey;
    115 
    116 	struct transmit_sc *sc;
    117 	struct dl_list list; /* list entry in struct transmit_sc::sa_list */
    118 };
    119 
    120 /* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
    121 struct receive_sc {
    122 	struct ieee802_1x_mka_sci sci; /* const SCI sci */
    123 	Boolean receiving; /* bool receiving (read only) */
    124 
    125 	struct os_time created_time; /* Time createdTime */
    126 
    127 	unsigned int channel;
    128 
    129 	struct dl_list list;
    130 	struct dl_list sa_list;
    131 };
    132 
    133 /* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
    134 struct receive_sa {
    135 	Boolean enable_receive; /* bool enableReceive */
    136 	Boolean in_use; /* bool inUse (read only) */
    137 
    138 	u32 next_pn; /* PN nextPN (read only) */
    139 	u32 lowest_pn; /* PN lowestPN (read only) */
    140 	u8 an;
    141 	struct os_time created_time;
    142 
    143 	struct data_key *pkey;
    144 	struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
    145 
    146 	struct dl_list list;
    147 };
    148 
    149 struct macsec_ciphersuite {
    150 	u8 id[CS_ID_LEN];
    151 	char name[32];
    152 	enum macsec_cap capable;
    153 	int sak_len; /* unit: byte */
    154 
    155 	u32 index;
    156 };
    157 
    158 struct mka_alg {
    159 	u8 parameter[4];
    160 	size_t cak_len;
    161 	size_t kek_len;
    162 	size_t ick_len;
    163 	size_t icv_len;
    164 
    165 	int (*cak_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2, u8 *cak);
    166 	int (*ckn_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2,
    167 			const u8 *sid, size_t sid_len, u8 *ckn);
    168 	int (*kek_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *kek);
    169 	int (*ick_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *ick);
    170 	int (*icv_hash)(const u8 *ick, const u8 *msg, size_t msg_len, u8 *icv);
    171 
    172 	int index; /* index for configuring */
    173 };
    174 
    175 #define DEFAULT_MKA_ALG_INDEX 0
    176 
    177 /* See IEEE Std 802.1X-2010, 9.16 MKA management */
    178 struct ieee802_1x_mka_participant {
    179 	/* used for active and potential participant */
    180 	struct mka_key_name ckn;
    181 	struct mka_key cak;
    182 	Boolean cached;
    183 
    184 	/* used by management to monitor and control activation */
    185 	Boolean active;
    186 	Boolean participant;
    187 	Boolean retain;
    188 
    189 	enum { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;
    190 
    191 	/* used for active participant */
    192 	Boolean principal;
    193 	struct dl_list live_peers;
    194 	struct dl_list potential_peers;
    195 
    196 	/* not defined in IEEE 802.1X */
    197 	struct dl_list list;
    198 
    199 	struct mka_key kek;
    200 	struct mka_key ick;
    201 
    202 	struct ieee802_1x_mka_ki lki;
    203 	u8 lan;
    204 	Boolean ltx;
    205 	Boolean lrx;
    206 
    207 	struct ieee802_1x_mka_ki oki;
    208 	u8 oan;
    209 	Boolean otx;
    210 	Boolean orx;
    211 
    212 	Boolean is_key_server;
    213 	Boolean is_obliged_key_server;
    214 	Boolean can_be_key_server;
    215 	Boolean is_elected;
    216 
    217 	struct dl_list sak_list;
    218 	struct dl_list rxsc_list;
    219 
    220 	struct transmit_sc *txsc;
    221 
    222 	u8 mi[MI_LEN];
    223 	u32 mn;
    224 
    225 	struct ieee802_1x_mka_peer_id current_peer_id;
    226 	struct ieee802_1x_mka_sci current_peer_sci;
    227 	time_t cak_life;
    228 	time_t mka_life;
    229 	Boolean to_dist_sak;
    230 	Boolean to_use_sak;
    231 	Boolean new_sak;
    232 
    233 	Boolean advised_desired;
    234 	enum macsec_cap advised_capability;
    235 
    236 	struct data_key *new_key;
    237 	u32 retry_count;
    238 
    239 	struct ieee802_1x_kay *kay;
    240 };
    241 
    242 struct ieee802_1x_mka_hdr {
    243 	/* octet 1 */
    244 	u32 type:8;
    245 	/* octet 2 */
    246 	u32 reserve:8;
    247 	/* octet 3 */
    248 #if __BYTE_ORDER == __LITTLE_ENDIAN
    249 	u32 length:4;
    250 	u32 reserve1:4;
    251 #elif __BYTE_ORDER == __BIG_ENDIAN
    252 	u32 reserve1:4;
    253 	u32 length:4;
    254 #else
    255 #error "Please fix <bits/endian.h>"
    256 #endif
    257 	/* octet 4 */
    258 	u32 length1:8;
    259 };
    260 
    261 #define MKA_HDR_LEN sizeof(struct ieee802_1x_mka_hdr)
    262 
    263 struct ieee802_1x_mka_basic_body {
    264 	/* octet 1 */
    265 	u32 version:8;
    266 	/* octet 2 */
    267 	u32 priority:8;
    268 	/* octet 3 */
    269 #if __BYTE_ORDER == __LITTLE_ENDIAN
    270 	u32 length:4;
    271 	u32 macsec_capbility:2;
    272 	u32 macsec_desired:1;
    273 	u32 key_server:1;
    274 #elif __BYTE_ORDER == __BIG_ENDIAN
    275 	u32 key_server:1;
    276 	u32 macsec_desired:1;
    277 	u32 macsec_capbility:2;
    278 	u32 length:4;
    279 #endif
    280 	/* octet 4 */
    281 	u32 length1:8;
    282 
    283 	struct ieee802_1x_mka_sci actor_sci;
    284 	u8 actor_mi[MI_LEN];
    285 	u32 actor_mn;
    286 	u8 algo_agility[4];
    287 
    288 	/* followed by CAK Name*/
    289 	u8 ckn[0];
    290 };
    291 
    292 struct ieee802_1x_mka_peer_body {
    293 	/* octet 1 */
    294 	u32 type:8;
    295 	/* octet 2 */
    296 	u32 reserve:8;
    297 	/* octet 3 */
    298 #if __BYTE_ORDER == __LITTLE_ENDIAN
    299 	u32 length:4;
    300 	u32 reserve1:4;
    301 #elif __BYTE_ORDER == __BIG_ENDIAN
    302 	u32 reserve1:4;
    303 	u32 length:4;
    304 #endif
    305 	/* octet 4 */
    306 	u32 length1:8;
    307 
    308 	u8 peer[0];
    309 	/* followed by Peers */
    310 };
    311 
    312 struct ieee802_1x_mka_sak_use_body {
    313 	/* octet 1 */
    314 	u32 type:8;
    315 	/* octet 2 */
    316 #if __BYTE_ORDER == __LITTLE_ENDIAN
    317 	u32 orx:1;
    318 	u32 otx:1;
    319 	u32 oan:2;
    320 	u32 lrx:1;
    321 	u32 ltx:1;
    322 	u32 lan:2;
    323 #elif __BYTE_ORDER == __BIG_ENDIAN
    324 	u32 lan:2;
    325 	u32 ltx:1;
    326 	u32 lrx:1;
    327 	u32 oan:2;
    328 	u32 otx:1;
    329 	u32 orx:1;
    330 #endif
    331 
    332 	/* octet 3 */
    333 #if __BYTE_ORDER == __LITTLE_ENDIAN
    334 	u32 length:4;
    335 	u32 delay_protect:1;
    336 	u32 reserve:1;
    337 	u32 prx:1;
    338 	u32 ptx:1;
    339 #elif __BYTE_ORDER == __BIG_ENDIAN
    340 	u32 ptx:1;
    341 	u32 prx:1;
    342 	u32 reserve:1;
    343 	u32 delay_protect:1;
    344 	u32 length:4;
    345 #endif
    346 
    347 	/* octet 4 */
    348 	u32 length1:8;
    349 
    350 	/* octet 5 - 16 */
    351 	u8 lsrv_mi[MI_LEN];
    352 	/* octet 17 - 20 */
    353 	u32 lkn;
    354 	/* octet 21 - 24 */
    355 	u32 llpn;
    356 
    357 	/* octet 25 - 36 */
    358 	u8 osrv_mi[MI_LEN];
    359 	/* octet 37 - 40 */
    360 	u32 okn;
    361 	/* octet 41 - 44 */
    362 	u32 olpn;
    363 };
    364 
    365 
    366 struct ieee802_1x_mka_dist_sak_body {
    367 	/* octet 1 */
    368 	u32 type:8;
    369 	/* octet 2 */
    370 #if __BYTE_ORDER == __LITTLE_ENDIAN
    371 	u32 reserve:4;
    372 	u32 confid_offset:2;
    373 	u32 dan:2;
    374 #elif __BYTE_ORDER == __BIG_ENDIAN
    375 	u32 dan:2;
    376 	u32 confid_offset:2;
    377 	u32 reserve:4;
    378 #endif
    379 	/* octet 3 */
    380 #if __BYTE_ORDER == __LITTLE_ENDIAN
    381 	u32 length:4;
    382 	u32 reserve1:4;
    383 #elif __BYTE_ORDER == __BIG_ENDIAN
    384 	u32 reserve1:4;
    385 	u32 length:4;
    386 #endif
    387 	/* octet 4 */
    388 	u32 length1:8;
    389 	/* octet 5 - 8 */
    390 	u32 kn;
    391 
    392 	/* for GCM-AES-128: octet 9-32: SAK
    393 	 * for other cipher suite: octet 9-16: cipher suite id, octet 17-: SAK
    394 	 */
    395 	u8 sak[0];
    396 };
    397 
    398 
    399 struct ieee802_1x_mka_icv_body {
    400 	/* octet 1 */
    401 	u32 type:8;
    402 	/* octet 2 */
    403 	u32 reserve:8;
    404 	/* octet 3 */
    405 #if __BYTE_ORDER == __LITTLE_ENDIAN
    406 	u32 length:4;
    407 	u32 reserve1:4;
    408 #elif __BYTE_ORDER == __BIG_ENDIAN
    409 	u32 reserve1:4;
    410 	u32 length:4;
    411 #endif
    412 	/* octet 4 */
    413 	u32 length1:8;
    414 
    415 	/* octet 5 - */
    416 	u8 icv[0];
    417 };
    418 
    419 #endif /* IEEE802_1X_KAY_I_H */
    420