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