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_I_H 10*a1157835SDaniel Fojt #define IEEE802_1X_KAY_I_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 #define MKA_VERSION_ID 1 17*a1157835SDaniel Fojt 18*a1157835SDaniel Fojt /* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 (MKPDU parameter sets) */ 19*a1157835SDaniel Fojt enum mka_packet_type { 20*a1157835SDaniel Fojt MKA_BASIC_PARAMETER_SET = MKA_VERSION_ID, 21*a1157835SDaniel Fojt MKA_LIVE_PEER_LIST = 1, 22*a1157835SDaniel Fojt MKA_POTENTIAL_PEER_LIST = 2, 23*a1157835SDaniel Fojt MKA_SAK_USE = 3, 24*a1157835SDaniel Fojt MKA_DISTRIBUTED_SAK = 4, 25*a1157835SDaniel Fojt MKA_DISTRIBUTED_CAK = 5, 26*a1157835SDaniel Fojt MKA_KMD = 6, 27*a1157835SDaniel Fojt MKA_ANNOUNCEMENT = 7, 28*a1157835SDaniel Fojt MKA_ICV_INDICATOR = 255 29*a1157835SDaniel Fojt }; 30*a1157835SDaniel Fojt 31*a1157835SDaniel Fojt #define ICV_LEN 16 /* 16 bytes */ 32*a1157835SDaniel Fojt #define SAK_WRAPPED_LEN 24 33*a1157835SDaniel Fojt /* KN + Wrapper SAK */ 34*a1157835SDaniel Fojt #define DEFAULT_DIS_SAK_BODY_LENGTH (SAK_WRAPPED_LEN + 4) 35*a1157835SDaniel Fojt #define MAX_RETRY_CNT 5 36*a1157835SDaniel Fojt 37*a1157835SDaniel Fojt struct ieee802_1x_kay; 38*a1157835SDaniel Fojt 39*a1157835SDaniel Fojt struct ieee802_1x_mka_peer_id { 40*a1157835SDaniel Fojt u8 mi[MI_LEN]; 41*a1157835SDaniel Fojt be32 mn; 42*a1157835SDaniel Fojt } STRUCT_PACKED; 43*a1157835SDaniel Fojt 44*a1157835SDaniel Fojt struct ieee802_1x_kay_peer { 45*a1157835SDaniel Fojt struct ieee802_1x_mka_sci sci; 46*a1157835SDaniel Fojt u8 mi[MI_LEN]; 47*a1157835SDaniel Fojt u32 mn; 48*a1157835SDaniel Fojt time_t expire; 49*a1157835SDaniel Fojt Boolean is_key_server; 50*a1157835SDaniel Fojt u8 key_server_priority; 51*a1157835SDaniel Fojt Boolean macsec_desired; 52*a1157835SDaniel Fojt enum macsec_cap macsec_capability; 53*a1157835SDaniel Fojt Boolean sak_used; 54*a1157835SDaniel Fojt int missing_sak_use_count; 55*a1157835SDaniel Fojt struct dl_list list; 56*a1157835SDaniel Fojt }; 57*a1157835SDaniel Fojt 58*a1157835SDaniel Fojt struct macsec_ciphersuite { 59*a1157835SDaniel Fojt u64 id; 60*a1157835SDaniel Fojt char name[32]; 61*a1157835SDaniel Fojt enum macsec_cap capable; 62*a1157835SDaniel Fojt int sak_len; /* unit: byte */ 63*a1157835SDaniel Fojt }; 64*a1157835SDaniel Fojt 65*a1157835SDaniel Fojt struct mka_alg { 66*a1157835SDaniel Fojt u8 parameter[4]; 67*a1157835SDaniel Fojt size_t icv_len; 68*a1157835SDaniel Fojt 69*a1157835SDaniel Fojt int (*cak_trfm)(const u8 *msk, size_t msk_bytes, const u8 *mac1, 70*a1157835SDaniel Fojt const u8 *mac2, u8 *cak, size_t cak_bytes); 71*a1157835SDaniel Fojt int (*ckn_trfm)(const u8 *msk, size_t msk_bytes, const u8 *mac1, 72*a1157835SDaniel Fojt const u8 *mac2, const u8 *sid, size_t sid_len, u8 *ckn); 73*a1157835SDaniel Fojt int (*kek_trfm)(const u8 *cak, size_t cak_bytes, 74*a1157835SDaniel Fojt const u8 *ckn, size_t ckn_len, 75*a1157835SDaniel Fojt u8 *kek, size_t kek_bytes); 76*a1157835SDaniel Fojt int (*ick_trfm)(const u8 *cak, size_t cak_bytes, 77*a1157835SDaniel Fojt const u8 *ckn, size_t ckn_len, 78*a1157835SDaniel Fojt u8 *ick, size_t ick_bytes); 79*a1157835SDaniel Fojt int (*icv_hash)(const u8 *ick, size_t ick_bytes, 80*a1157835SDaniel Fojt const u8 *msg, size_t msg_len, u8 *icv); 81*a1157835SDaniel Fojt }; 82*a1157835SDaniel Fojt 83*a1157835SDaniel Fojt #define DEFAULT_MKA_ALG_INDEX 0 84*a1157835SDaniel Fojt 85*a1157835SDaniel Fojt /* See IEEE Std 802.1X-2010, 9.16 MKA management */ 86*a1157835SDaniel Fojt struct ieee802_1x_mka_participant { 87*a1157835SDaniel Fojt /* used for active and potential participant */ 88*a1157835SDaniel Fojt struct mka_key_name ckn; 89*a1157835SDaniel Fojt struct mka_key cak; 90*a1157835SDaniel Fojt Boolean cached; 91*a1157835SDaniel Fojt 92*a1157835SDaniel Fojt /* used by management to monitor and control activation */ 93*a1157835SDaniel Fojt Boolean active; 94*a1157835SDaniel Fojt Boolean participant; 95*a1157835SDaniel Fojt Boolean retain; 96*a1157835SDaniel Fojt enum mka_created_mode mode; 97*a1157835SDaniel Fojt 98*a1157835SDaniel Fojt enum activate_ctrl { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate; 99*a1157835SDaniel Fojt 100*a1157835SDaniel Fojt /* used for active participant */ 101*a1157835SDaniel Fojt Boolean principal; 102*a1157835SDaniel Fojt struct dl_list live_peers; 103*a1157835SDaniel Fojt struct dl_list potential_peers; 104*a1157835SDaniel Fojt 105*a1157835SDaniel Fojt /* not defined in IEEE 802.1X */ 106*a1157835SDaniel Fojt struct dl_list list; 107*a1157835SDaniel Fojt 108*a1157835SDaniel Fojt struct mka_key kek; 109*a1157835SDaniel Fojt struct mka_key ick; 110*a1157835SDaniel Fojt 111*a1157835SDaniel Fojt struct ieee802_1x_mka_ki lki; 112*a1157835SDaniel Fojt u8 lan; 113*a1157835SDaniel Fojt Boolean ltx; 114*a1157835SDaniel Fojt Boolean lrx; 115*a1157835SDaniel Fojt 116*a1157835SDaniel Fojt struct ieee802_1x_mka_ki oki; 117*a1157835SDaniel Fojt u8 oan; 118*a1157835SDaniel Fojt Boolean otx; 119*a1157835SDaniel Fojt Boolean orx; 120*a1157835SDaniel Fojt 121*a1157835SDaniel Fojt Boolean is_key_server; 122*a1157835SDaniel Fojt Boolean is_obliged_key_server; 123*a1157835SDaniel Fojt Boolean can_be_key_server; 124*a1157835SDaniel Fojt Boolean is_elected; 125*a1157835SDaniel Fojt 126*a1157835SDaniel Fojt struct dl_list sak_list; 127*a1157835SDaniel Fojt struct dl_list rxsc_list; 128*a1157835SDaniel Fojt 129*a1157835SDaniel Fojt struct transmit_sc *txsc; 130*a1157835SDaniel Fojt 131*a1157835SDaniel Fojt u8 mi[MI_LEN]; 132*a1157835SDaniel Fojt u32 mn; 133*a1157835SDaniel Fojt 134*a1157835SDaniel Fojt /* Current peer MI and SCI during MKPDU processing */ 135*a1157835SDaniel Fojt struct ieee802_1x_mka_peer_id current_peer_id; 136*a1157835SDaniel Fojt struct ieee802_1x_mka_sci current_peer_sci; 137*a1157835SDaniel Fojt 138*a1157835SDaniel Fojt time_t cak_life; 139*a1157835SDaniel Fojt time_t mka_life; 140*a1157835SDaniel Fojt Boolean to_dist_sak; 141*a1157835SDaniel Fojt Boolean to_use_sak; 142*a1157835SDaniel Fojt Boolean new_sak; 143*a1157835SDaniel Fojt 144*a1157835SDaniel Fojt Boolean advised_desired; 145*a1157835SDaniel Fojt enum macsec_cap advised_capability; 146*a1157835SDaniel Fojt 147*a1157835SDaniel Fojt struct data_key *new_key; 148*a1157835SDaniel Fojt u32 retry_count; 149*a1157835SDaniel Fojt 150*a1157835SDaniel Fojt struct ieee802_1x_kay *kay; 151*a1157835SDaniel Fojt }; 152*a1157835SDaniel Fojt 153*a1157835SDaniel Fojt struct ieee802_1x_mka_hdr { 154*a1157835SDaniel Fojt /* octet 1 */ 155*a1157835SDaniel Fojt u8 type; 156*a1157835SDaniel Fojt /* octet 2 */ 157*a1157835SDaniel Fojt u8 reserve; 158*a1157835SDaniel Fojt /* octet 3 */ 159*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 160*a1157835SDaniel Fojt u8 length:4; 161*a1157835SDaniel Fojt u8 reserve1:4; 162*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 163*a1157835SDaniel Fojt u8 reserve1:4; 164*a1157835SDaniel Fojt u8 length:4; 165*a1157835SDaniel Fojt #else 166*a1157835SDaniel Fojt #error "Please fix <bits/endian.h>" 167*a1157835SDaniel Fojt #endif 168*a1157835SDaniel Fojt /* octet 4 */ 169*a1157835SDaniel Fojt u8 length1; 170*a1157835SDaniel Fojt } STRUCT_PACKED; 171*a1157835SDaniel Fojt 172*a1157835SDaniel Fojt #define MKA_HDR_LEN sizeof(struct ieee802_1x_mka_hdr) 173*a1157835SDaniel Fojt 174*a1157835SDaniel Fojt /** 175*a1157835SDaniel Fojt * struct ieee802_1x_mka_basic_body - Basic Parameter Set (Figure 11-8) 176*a1157835SDaniel Fojt * @version: MKA Version Identifier 177*a1157835SDaniel Fojt * @priority: Key Server Priority 178*a1157835SDaniel Fojt * @length: Parameter set body length 179*a1157835SDaniel Fojt * @macsec_capability: MACsec capability, as defined in ieee802_1x_defs.h 180*a1157835SDaniel Fojt * @macsec_desired: the participant wants MACsec to be used to protect frames 181*a1157835SDaniel Fojt * (9.6.1) 182*a1157835SDaniel Fojt * @key_server: the participant has not decided that another participant is or 183*a1157835SDaniel Fojt * will be the key server (9.5.1) 184*a1157835SDaniel Fojt * @length1: Parameter set body length (cont) 185*a1157835SDaniel Fojt * @actor_mi: Actor's Member Identifier 186*a1157835SDaniel Fojt * @actor_mn: Actor's Message Number 187*a1157835SDaniel Fojt * @algo_agility: Algorithm Agility parameter 188*a1157835SDaniel Fojt * @ckn: CAK Name 189*a1157835SDaniel Fojt */ 190*a1157835SDaniel Fojt struct ieee802_1x_mka_basic_body { 191*a1157835SDaniel Fojt /* octet 1 */ 192*a1157835SDaniel Fojt u8 version; 193*a1157835SDaniel Fojt /* octet 2 */ 194*a1157835SDaniel Fojt u8 priority; 195*a1157835SDaniel Fojt /* octet 3 */ 196*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 197*a1157835SDaniel Fojt u8 length:4; 198*a1157835SDaniel Fojt u8 macsec_capability:2; 199*a1157835SDaniel Fojt u8 macsec_desired:1; 200*a1157835SDaniel Fojt u8 key_server:1; 201*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 202*a1157835SDaniel Fojt u8 key_server:1; 203*a1157835SDaniel Fojt u8 macsec_desired:1; 204*a1157835SDaniel Fojt u8 macsec_capability:2; 205*a1157835SDaniel Fojt u8 length:4; 206*a1157835SDaniel Fojt #endif 207*a1157835SDaniel Fojt /* octet 4 */ 208*a1157835SDaniel Fojt u8 length1; 209*a1157835SDaniel Fojt 210*a1157835SDaniel Fojt struct ieee802_1x_mka_sci actor_sci; 211*a1157835SDaniel Fojt u8 actor_mi[MI_LEN]; 212*a1157835SDaniel Fojt be32 actor_mn; 213*a1157835SDaniel Fojt u8 algo_agility[4]; 214*a1157835SDaniel Fojt 215*a1157835SDaniel Fojt /* followed by CAK Name */ 216*a1157835SDaniel Fojt u8 ckn[0]; 217*a1157835SDaniel Fojt } STRUCT_PACKED; 218*a1157835SDaniel Fojt 219*a1157835SDaniel Fojt /** 220*a1157835SDaniel Fojt * struct ieee802_1x_mka_peer_body - Live Peer List and Potential Peer List 221*a1157835SDaniel Fojt * parameter sets (Figure 11-9) 222*a1157835SDaniel Fojt * @type: Parameter set type (1 or 2) 223*a1157835SDaniel Fojt * @length: Parameter set body length 224*a1157835SDaniel Fojt * @length1: Parameter set body length (cont) 225*a1157835SDaniel Fojt * @peer: array of (MI, MN) pairs 226*a1157835SDaniel Fojt */ 227*a1157835SDaniel Fojt struct ieee802_1x_mka_peer_body { 228*a1157835SDaniel Fojt /* octet 1 */ 229*a1157835SDaniel Fojt u8 type; 230*a1157835SDaniel Fojt /* octet 2 */ 231*a1157835SDaniel Fojt u8 reserve; 232*a1157835SDaniel Fojt /* octet 3 */ 233*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 234*a1157835SDaniel Fojt u8 length:4; 235*a1157835SDaniel Fojt u8 reserve1:4; 236*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 237*a1157835SDaniel Fojt u8 reserve1:4; 238*a1157835SDaniel Fojt u8 length:4; 239*a1157835SDaniel Fojt #endif 240*a1157835SDaniel Fojt /* octet 4 */ 241*a1157835SDaniel Fojt u8 length1; 242*a1157835SDaniel Fojt 243*a1157835SDaniel Fojt /* followed by Peers */ 244*a1157835SDaniel Fojt u8 peer[0]; 245*a1157835SDaniel Fojt } STRUCT_PACKED; 246*a1157835SDaniel Fojt 247*a1157835SDaniel Fojt /** 248*a1157835SDaniel Fojt * struct ieee802_1x_mka_sak_use_body - MACsec SAK Use parameter set (Figure 249*a1157835SDaniel Fojt * 11-10) 250*a1157835SDaniel Fojt * @type: MKA message type 251*a1157835SDaniel Fojt * @lan: latest key AN 252*a1157835SDaniel Fojt * @ltx: latest key TX 253*a1157835SDaniel Fojt * @lrx: latest key RX 254*a1157835SDaniel Fojt * @oan: old key AN 255*a1157835SDaniel Fojt * @otx: old key TX 256*a1157835SDaniel Fojt * @orx: old key RX 257*a1157835SDaniel Fojt * @ptx: plain TX, ie protectFrames is False 258*a1157835SDaniel Fojt * @prx: plain RX, ie validateFrames is not Strict 259*a1157835SDaniel Fojt * @delay_protect: True if LPNs are being reported sufficiently frequently to 260*a1157835SDaniel Fojt * allow the recipient to provide data delay protection. If False, the LPN 261*a1157835SDaniel Fojt * can be reported as zero. 262*a1157835SDaniel Fojt * @lsrv_mi: latest key server MI 263*a1157835SDaniel Fojt * @lkn: latest key number (together with MI, form the KI) 264*a1157835SDaniel Fojt * @llpn: latest lowest acceptable PN (LPN) 265*a1157835SDaniel Fojt * @osrv_mi: old key server MI 266*a1157835SDaniel Fojt * @okn: old key number (together with MI, form the KI) 267*a1157835SDaniel Fojt * @olpn: old lowest acceptable PN (LPN) 268*a1157835SDaniel Fojt */ 269*a1157835SDaniel Fojt struct ieee802_1x_mka_sak_use_body { 270*a1157835SDaniel Fojt /* octet 1 */ 271*a1157835SDaniel Fojt u8 type; 272*a1157835SDaniel Fojt /* octet 2 */ 273*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 274*a1157835SDaniel Fojt u8 orx:1; 275*a1157835SDaniel Fojt u8 otx:1; 276*a1157835SDaniel Fojt u8 oan:2; 277*a1157835SDaniel Fojt u8 lrx:1; 278*a1157835SDaniel Fojt u8 ltx:1; 279*a1157835SDaniel Fojt u8 lan:2; 280*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 281*a1157835SDaniel Fojt u8 lan:2; 282*a1157835SDaniel Fojt u8 ltx:1; 283*a1157835SDaniel Fojt u8 lrx:1; 284*a1157835SDaniel Fojt u8 oan:2; 285*a1157835SDaniel Fojt u8 otx:1; 286*a1157835SDaniel Fojt u8 orx:1; 287*a1157835SDaniel Fojt #endif 288*a1157835SDaniel Fojt 289*a1157835SDaniel Fojt /* octet 3 */ 290*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 291*a1157835SDaniel Fojt u8 length:4; 292*a1157835SDaniel Fojt u8 delay_protect:1; 293*a1157835SDaniel Fojt u8 reserve:1; 294*a1157835SDaniel Fojt u8 prx:1; 295*a1157835SDaniel Fojt u8 ptx:1; 296*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 297*a1157835SDaniel Fojt u8 ptx:1; 298*a1157835SDaniel Fojt u8 prx:1; 299*a1157835SDaniel Fojt u8 reserve:1; 300*a1157835SDaniel Fojt u8 delay_protect:1; 301*a1157835SDaniel Fojt u8 length:4; 302*a1157835SDaniel Fojt #endif 303*a1157835SDaniel Fojt 304*a1157835SDaniel Fojt /* octet 4 */ 305*a1157835SDaniel Fojt u8 length1; 306*a1157835SDaniel Fojt 307*a1157835SDaniel Fojt /* octet 5 - 16 */ 308*a1157835SDaniel Fojt u8 lsrv_mi[MI_LEN]; 309*a1157835SDaniel Fojt /* octet 17 - 20 */ 310*a1157835SDaniel Fojt be32 lkn; 311*a1157835SDaniel Fojt /* octet 21 - 24 */ 312*a1157835SDaniel Fojt be32 llpn; 313*a1157835SDaniel Fojt 314*a1157835SDaniel Fojt /* octet 25 - 36 */ 315*a1157835SDaniel Fojt u8 osrv_mi[MI_LEN]; 316*a1157835SDaniel Fojt /* octet 37 - 40 */ 317*a1157835SDaniel Fojt be32 okn; 318*a1157835SDaniel Fojt /* octet 41 - 44 */ 319*a1157835SDaniel Fojt be32 olpn; 320*a1157835SDaniel Fojt } STRUCT_PACKED; 321*a1157835SDaniel Fojt 322*a1157835SDaniel Fojt /** 323*a1157835SDaniel Fojt * struct ieee802_1x_mka_dist_sak_body - Distributed SAK parameter set 324*a1157835SDaniel Fojt * (GCM-AES-128, Figure 11-11) 325*a1157835SDaniel Fojt * @type: Parameter set type (4) 326*a1157835SDaniel Fojt * @length: Parameter set body length 327*a1157835SDaniel Fojt * @length1: Parameter set body length (cont) 328*a1157835SDaniel Fojt * Total parameter body length values: 329*a1157835SDaniel Fojt * - 0 for plain text 330*a1157835SDaniel Fojt * - 28 for GCM-AES-128 331*a1157835SDaniel Fojt * - 36 or more for other cipher suites 332*a1157835SDaniel Fojt * @confid_offset: confidentiality offset, as defined in ieee802_1x_defs.h 333*a1157835SDaniel Fojt * @dan: distributed AN (0 for plain text) 334*a1157835SDaniel Fojt * @kn: Key Number 335*a1157835SDaniel Fojt * @sak: AES Key Wrap of SAK (see 9.8) 336*a1157835SDaniel Fojt */ 337*a1157835SDaniel Fojt struct ieee802_1x_mka_dist_sak_body { 338*a1157835SDaniel Fojt /* octet 1 */ 339*a1157835SDaniel Fojt u8 type; 340*a1157835SDaniel Fojt /* octet 2 */ 341*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 342*a1157835SDaniel Fojt u8 reserve:4; 343*a1157835SDaniel Fojt u8 confid_offset:2; 344*a1157835SDaniel Fojt u8 dan:2; 345*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 346*a1157835SDaniel Fojt u8 dan:2; 347*a1157835SDaniel Fojt u8 confid_offset:2; 348*a1157835SDaniel Fojt u8 reserve:4; 349*a1157835SDaniel Fojt #endif 350*a1157835SDaniel Fojt /* octet 3 */ 351*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 352*a1157835SDaniel Fojt u8 length:4; 353*a1157835SDaniel Fojt u8 reserve1:4; 354*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 355*a1157835SDaniel Fojt u8 reserve1:4; 356*a1157835SDaniel Fojt u8 length:4; 357*a1157835SDaniel Fojt #endif 358*a1157835SDaniel Fojt /* octet 4 */ 359*a1157835SDaniel Fojt u8 length1; 360*a1157835SDaniel Fojt /* octet 5 - 8 */ 361*a1157835SDaniel Fojt be32 kn; 362*a1157835SDaniel Fojt 363*a1157835SDaniel Fojt /* for GCM-AES-128: octet 9-32: SAK 364*a1157835SDaniel Fojt * for other cipher suite: octet 9-16: cipher suite id, octet 17-: SAK 365*a1157835SDaniel Fojt */ 366*a1157835SDaniel Fojt u8 sak[0]; 367*a1157835SDaniel Fojt } STRUCT_PACKED; 368*a1157835SDaniel Fojt 369*a1157835SDaniel Fojt /** 370*a1157835SDaniel Fojt * struct ieee802_1x_mka_dist_cak_body - Distributed CAK parameter set (Figure 371*a1157835SDaniel Fojt * 11-13) 372*a1157835SDaniel Fojt * @type: Parameter set type (5) 373*a1157835SDaniel Fojt * @length: Parameter set body length 374*a1157835SDaniel Fojt * @length1: Parameter set body length (cont) 375*a1157835SDaniel Fojt * Total parameter body length values: 376*a1157835SDaniel Fojt * - 0 for plain text 377*a1157835SDaniel Fojt * - 28 for GCM-AES-128 378*a1157835SDaniel Fojt * - 36 or more for other cipher suites 379*a1157835SDaniel Fojt * @cak: AES Key Wrap of CAK (see 9.8) 380*a1157835SDaniel Fojt * @ckn: CAK Name 381*a1157835SDaniel Fojt */ 382*a1157835SDaniel Fojt struct ieee802_1x_mka_dist_cak_body { 383*a1157835SDaniel Fojt /* octet 1 */ 384*a1157835SDaniel Fojt u8 type; 385*a1157835SDaniel Fojt /* octet 2 */ 386*a1157835SDaniel Fojt u8 reserve; 387*a1157835SDaniel Fojt /* octet 3 */ 388*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 389*a1157835SDaniel Fojt u8 length:4; 390*a1157835SDaniel Fojt u8 reserve1:4; 391*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 392*a1157835SDaniel Fojt u8 reserve1:4; 393*a1157835SDaniel Fojt u8 length:4; 394*a1157835SDaniel Fojt #endif 395*a1157835SDaniel Fojt /* octet 4 */ 396*a1157835SDaniel Fojt u8 length1; 397*a1157835SDaniel Fojt 398*a1157835SDaniel Fojt /* octet 5 - 28 */ 399*a1157835SDaniel Fojt u8 cak[24]; 400*a1157835SDaniel Fojt 401*a1157835SDaniel Fojt /* followed by CAK Name, 29- */ 402*a1157835SDaniel Fojt u8 ckn[0]; 403*a1157835SDaniel Fojt } STRUCT_PACKED; 404*a1157835SDaniel Fojt 405*a1157835SDaniel Fojt struct ieee802_1x_mka_icv_body { 406*a1157835SDaniel Fojt /* octet 1 */ 407*a1157835SDaniel Fojt u8 type; 408*a1157835SDaniel Fojt /* octet 2 */ 409*a1157835SDaniel Fojt u8 reserve; 410*a1157835SDaniel Fojt /* octet 3 */ 411*a1157835SDaniel Fojt #if __BYTE_ORDER == __LITTLE_ENDIAN 412*a1157835SDaniel Fojt u8 length:4; 413*a1157835SDaniel Fojt u8 reserve1:4; 414*a1157835SDaniel Fojt #elif __BYTE_ORDER == __BIG_ENDIAN 415*a1157835SDaniel Fojt u8 reserve1:4; 416*a1157835SDaniel Fojt u8 length:4; 417*a1157835SDaniel Fojt #endif 418*a1157835SDaniel Fojt /* octet 4 */ 419*a1157835SDaniel Fojt u8 length1; 420*a1157835SDaniel Fojt 421*a1157835SDaniel Fojt /* octet 5 - */ 422*a1157835SDaniel Fojt u8 icv[0]; 423*a1157835SDaniel Fojt } STRUCT_PACKED; 424*a1157835SDaniel Fojt 425*a1157835SDaniel Fojt #endif /* IEEE802_1X_KAY_I_H */ 426