1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * 802.1x EAPOL definitions 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * See 5*4882a593Smuzhiyun * IEEE Std 802.1X-2001 6*4882a593Smuzhiyun * IEEE 802.1X RADIUS Usage Guidelines 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Copyright (C) 1999-2017, Broadcom Corporation 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 13*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 14*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 15*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 16*4882a593Smuzhiyun * following added to such license: 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 19*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 20*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 21*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 22*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 23*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 24*4882a593Smuzhiyun * modifications of the software. 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * Notwithstanding the above, under no circumstances may you combine this 27*4882a593Smuzhiyun * software in any way with any other Broadcom software provided under a license 28*4882a593Smuzhiyun * other than the GPL, without Broadcom's express prior written consent. 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * 31*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>> 32*4882a593Smuzhiyun * 33*4882a593Smuzhiyun * $Id$ 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifndef _eapol_h_ 37*4882a593Smuzhiyun #define _eapol_h_ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #ifndef _TYPEDEFS_H_ 40*4882a593Smuzhiyun #include <typedefs.h> 41*4882a593Smuzhiyun #endif // endif 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* This marks the start of a packed structure section. */ 44*4882a593Smuzhiyun #include <packed_section_start.h> 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #if !defined(BCMCRYPTO_COMPONENT) 47*4882a593Smuzhiyun #include <bcmcrypto/aeskeywrap.h> 48*4882a593Smuzhiyun #endif /* !BCMCRYPTO_COMPONENT */ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* EAPOL for 802.3/Ethernet */ 51*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 52*4882a593Smuzhiyun struct ether_header eth; /* 802.3/Ethernet header */ 53*4882a593Smuzhiyun unsigned char version; /* EAPOL protocol version */ 54*4882a593Smuzhiyun unsigned char type; /* EAPOL type */ 55*4882a593Smuzhiyun unsigned short length; /* Length of body */ 56*4882a593Smuzhiyun unsigned char body[1]; /* Body (optional) */ 57*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_header_t; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define EAPOL_HEADER_LEN 18 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun typedef struct { 62*4882a593Smuzhiyun unsigned char version; /* EAPOL protocol version */ 63*4882a593Smuzhiyun unsigned char type; /* EAPOL type */ 64*4882a593Smuzhiyun unsigned short length; /* Length of body */ 65*4882a593Smuzhiyun } eapol_hdr_t; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define EAPOL_HDR_LEN 4u 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* EAPOL version */ 70*4882a593Smuzhiyun #define WPA2_EAPOL_VERSION 2u 71*4882a593Smuzhiyun #define WPA_EAPOL_VERSION 1u 72*4882a593Smuzhiyun #define LEAP_EAPOL_VERSION 1u 73*4882a593Smuzhiyun #define SES_EAPOL_VERSION 1u 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* EAPOL types */ 76*4882a593Smuzhiyun #define EAP_PACKET 0 77*4882a593Smuzhiyun #define EAPOL_START 1u 78*4882a593Smuzhiyun #define EAPOL_LOGOFF 2u 79*4882a593Smuzhiyun #define EAPOL_KEY 3u 80*4882a593Smuzhiyun #define EAPOL_ASF 4u 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* EAPOL-Key types */ 83*4882a593Smuzhiyun #define EAPOL_RC4_KEY 1u 84*4882a593Smuzhiyun #define EAPOL_WPA2_KEY 2u /* 802.11i/WPA2 */ 85*4882a593Smuzhiyun #define EAPOL_WPA_KEY 254u /* WPA */ 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* RC4 EAPOL-Key header field sizes */ 88*4882a593Smuzhiyun #define EAPOL_KEY_REPLAY_LEN 8u 89*4882a593Smuzhiyun #define EAPOL_KEY_IV_LEN 16u 90*4882a593Smuzhiyun #define EAPOL_KEY_SIG_LEN 16u 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* RC4 EAPOL-Key */ 93*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 94*4882a593Smuzhiyun unsigned char type; /* Key Descriptor Type */ 95*4882a593Smuzhiyun unsigned short length; /* Key Length (unaligned) */ 96*4882a593Smuzhiyun unsigned char replay[EAPOL_KEY_REPLAY_LEN]; /* Replay Counter */ 97*4882a593Smuzhiyun unsigned char iv[EAPOL_KEY_IV_LEN]; /* Key IV */ 98*4882a593Smuzhiyun unsigned char index; /* Key Flags & Index */ 99*4882a593Smuzhiyun unsigned char signature[EAPOL_KEY_SIG_LEN]; /* Key Signature */ 100*4882a593Smuzhiyun unsigned char key[1]; /* Key (optional) */ 101*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_key_header_t; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define EAPOL_KEY_HEADER_LEN 44u 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* RC4 EAPOL-Key flags */ 106*4882a593Smuzhiyun #define EAPOL_KEY_FLAGS_MASK 0x80u 107*4882a593Smuzhiyun #define EAPOL_KEY_BROADCAST 0u 108*4882a593Smuzhiyun #define EAPOL_KEY_UNICAST 0x80u 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* RC4 EAPOL-Key index */ 111*4882a593Smuzhiyun #define EAPOL_KEY_INDEX_MASK 0x7fu 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* WPA/802.11i/WPA2 EAPOL-Key header field sizes */ 114*4882a593Smuzhiyun #define EAPOL_AKW_BLOCK_LEN 8 115*4882a593Smuzhiyun #define EAPOL_WPA_KEY_REPLAY_LEN 8u 116*4882a593Smuzhiyun #define EAPOL_WPA_KEY_NONCE_LEN 32u 117*4882a593Smuzhiyun #define EAPOL_WPA_KEY_IV_LEN 16u 118*4882a593Smuzhiyun #define EAPOL_WPA_KEY_RSC_LEN 8u 119*4882a593Smuzhiyun #define EAPOL_WPA_KEY_ID_LEN 8u 120*4882a593Smuzhiyun #define EAPOL_WPA_KEY_DATA_LEN (EAPOL_WPA_MAX_KEY_SIZE + EAPOL_AKW_BLOCK_LEN) 121*4882a593Smuzhiyun #define EAPOL_WPA_MAX_KEY_SIZE 32u 122*4882a593Smuzhiyun #define EAPOL_WPA_KEY_MAX_MIC_LEN 32u 123*4882a593Smuzhiyun #define EAPOL_WPA_ENCR_KEY_MAX_LEN 64u 124*4882a593Smuzhiyun #define EAPOL_WPA_TEMP_ENCR_KEY_MAX_LEN 32u 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define EAPOL_WPA_PMK_MAX_LEN 64u 127*4882a593Smuzhiyun #define EAPOL_WPA_PMK_SHA384_LEN 48u 128*4882a593Smuzhiyun #define EAPOL_WPA_PMK_DEFAULT_LEN 32u 129*4882a593Smuzhiyun #define EAPOL_WPA_KCK_DEFAULT_LEN 16u 130*4882a593Smuzhiyun #define EAPOL_WPA_KCK_MIC_DEFAULT_LEN 16u 131*4882a593Smuzhiyun #define EAPOL_WPA_ENCR_KEY_DEFAULT_LEN 16u 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #ifndef EAPOL_KEY_HDR_VER_V2 134*4882a593Smuzhiyun #define EAPOL_WPA_KEY_LEN 95u /* deprecated */ 135*4882a593Smuzhiyun #endif // endif 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* MIC length for SHA1 and HMAC-SHA-256 based key derivation/intergrity algorithm */ 138*4882a593Smuzhiyun #define EAPOL_WPA_KEY_MIC_LEN 16u /* deprecated */ 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* MIC length for HMAC-SHA-384 based key derivation/integrity algorithm */ 141*4882a593Smuzhiyun #define EAPOL_WPA_KEY_MIC_LEN_SHA384 24u 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #ifndef EAPOL_KEY_HDR_VER_V2 144*4882a593Smuzhiyun /* WPA EAPOL-Key : deprecated */ 145*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 146*4882a593Smuzhiyun unsigned char type; /* Key Descriptor Type */ 147*4882a593Smuzhiyun unsigned short key_info; /* Key Information (unaligned) */ 148*4882a593Smuzhiyun unsigned short key_len; /* Key Length (unaligned) */ 149*4882a593Smuzhiyun unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN]; /* Replay Counter */ 150*4882a593Smuzhiyun unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN]; /* Nonce */ 151*4882a593Smuzhiyun unsigned char iv[EAPOL_WPA_KEY_IV_LEN]; /* Key IV */ 152*4882a593Smuzhiyun unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN]; /* Key RSC */ 153*4882a593Smuzhiyun unsigned char id[EAPOL_WPA_KEY_ID_LEN]; /* WPA:Key ID, 802.11i/WPA2: Reserved */ 154*4882a593Smuzhiyun unsigned char mic[EAPOL_WPA_KEY_MIC_LEN]; /* Key MIC */ 155*4882a593Smuzhiyun unsigned short data_len; /* Key Data Length */ 156*4882a593Smuzhiyun unsigned char data[EAPOL_WPA_KEY_DATA_LEN]; /* Key data */ 157*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t; 158*4882a593Smuzhiyun #else 159*4882a593Smuzhiyun /* WPA EAPOL-Key : new structure to consider dynamic MIC length */ 160*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 161*4882a593Smuzhiyun unsigned char type; /* Key Descriptor Type */ 162*4882a593Smuzhiyun unsigned short key_info; /* Key Information (unaligned) */ 163*4882a593Smuzhiyun unsigned short key_len; /* Key Length (unaligned) */ 164*4882a593Smuzhiyun unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN]; /* Replay Counter */ 165*4882a593Smuzhiyun unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN]; /* Nonce */ 166*4882a593Smuzhiyun unsigned char iv[EAPOL_WPA_KEY_IV_LEN]; /* Key IV */ 167*4882a593Smuzhiyun unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN]; /* Key RSC */ 168*4882a593Smuzhiyun unsigned char id[EAPOL_WPA_KEY_ID_LEN]; /* WPA:Key ID, 802.11i/WPA2: Reserved */ 169*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_v2_t; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun typedef eapol_wpa_key_header_v2_t eapol_wpa_key_header_t; 172*4882a593Smuzhiyun #endif /* EAPOL_KEY_HDR_VER_V2 */ 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define EAPOL_WPA_KEY_DATA_LEN_SIZE 2u 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #ifdef EAPOL_KEY_HDR_VER_V2 177*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_SIZE(mic_len) (sizeof(eapol_wpa_key_header_v2_t) \ 178*4882a593Smuzhiyun + mic_len + EAPOL_WPA_KEY_DATA_LEN_SIZE) 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /* WPA EAPOL-Key header macros to reach out mic/data_len/data field */ 181*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_MIC_PTR(pos) ((uint8 *)pos + sizeof(eapol_wpa_key_header_v2_t)) 182*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_DATA_LEN_PTR(pos, mic_len) \ 183*4882a593Smuzhiyun ((uint8 *)pos + sizeof(eapol_wpa_key_header_v2_t) + mic_len) 184*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_DATA_PTR(pos, mic_len) \ 185*4882a593Smuzhiyun ((uint8 *)pos + EAPOL_WPA_KEY_HDR_SIZE(mic_len)) 186*4882a593Smuzhiyun #else 187*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_SIZE(mic_len) EAPOL_WPA_KEY_LEN 188*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_MIC_PTR(pos) ((uint8 *)&pos->mic) 189*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_DATA_LEN_PTR(pos, mic_len) ((uint8 *)&pos->data_len) 190*4882a593Smuzhiyun #define EAPOL_WPA_KEY_HDR_DATA_PTR(pos, mic_len) ((uint8 *)&pos->data) 191*4882a593Smuzhiyun #endif /* EAPOL_KEY_HDR_VER_V2 */ 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* WPA/802.11i/WPA2 KEY KEY_INFO bits */ 194*4882a593Smuzhiyun #define WPA_KEY_DESC_OSEN 0x0 195*4882a593Smuzhiyun #define WPA_KEY_DESC_V0 0x0 196*4882a593Smuzhiyun #define WPA_KEY_DESC_V1 0x01 197*4882a593Smuzhiyun #define WPA_KEY_DESC_V2 0x02 198*4882a593Smuzhiyun #define WPA_KEY_DESC_V3 0x03 199*4882a593Smuzhiyun #define WPA_KEY_PAIRWISE 0x08 200*4882a593Smuzhiyun #define WPA_KEY_INSTALL 0x40 201*4882a593Smuzhiyun #define WPA_KEY_ACK 0x80 202*4882a593Smuzhiyun #define WPA_KEY_MIC 0x100 203*4882a593Smuzhiyun #define WPA_KEY_SECURE 0x200 204*4882a593Smuzhiyun #define WPA_KEY_ERROR 0x400 205*4882a593Smuzhiyun #define WPA_KEY_REQ 0x800 206*4882a593Smuzhiyun #define WPA_KEY_DESC_VER(_ki) ((_ki) & 0x03u) 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun #define WPA_KEY_DESC_V2_OR_V3 WPA_KEY_DESC_V2 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /* WPA-only KEY KEY_INFO bits */ 211*4882a593Smuzhiyun #define WPA_KEY_INDEX_0 0x00 212*4882a593Smuzhiyun #define WPA_KEY_INDEX_1 0x10 213*4882a593Smuzhiyun #define WPA_KEY_INDEX_2 0x20 214*4882a593Smuzhiyun #define WPA_KEY_INDEX_3 0x30 215*4882a593Smuzhiyun #define WPA_KEY_INDEX_MASK 0x30 216*4882a593Smuzhiyun #define WPA_KEY_INDEX_SHIFT 0x04 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun /* 802.11i/WPA2-only KEY KEY_INFO bits */ 219*4882a593Smuzhiyun #define WPA_KEY_ENCRYPTED_DATA 0x1000 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* Key Data encapsulation */ 222*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 223*4882a593Smuzhiyun uint8 type; 224*4882a593Smuzhiyun uint8 length; 225*4882a593Smuzhiyun uint8 oui[3]; 226*4882a593Smuzhiyun uint8 subtype; 227*4882a593Smuzhiyun uint8 data[1]; 228*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun #define WPA2_KEY_DATA_SUBTYPE_GTK 1 233*4882a593Smuzhiyun #define WPA2_KEY_DATA_SUBTYPE_STAKEY 2 234*4882a593Smuzhiyun #define WPA2_KEY_DATA_SUBTYPE_MAC 3 235*4882a593Smuzhiyun #define WPA2_KEY_DATA_SUBTYPE_PMKID 4 236*4882a593Smuzhiyun #define WPA2_KEY_DATA_SUBTYPE_IGTK 9 237*4882a593Smuzhiyun #define WPA2_KEY_DATA_SUBTYPE_TRANS_DISABLE 32 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* GTK encapsulation */ 240*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 241*4882a593Smuzhiyun uint8 flags; 242*4882a593Smuzhiyun uint8 reserved; 243*4882a593Smuzhiyun uint8 gtk[EAPOL_WPA_MAX_KEY_SIZE]; 244*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun #define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun #define WPA2_GTK_INDEX_MASK 0x03 249*4882a593Smuzhiyun #define WPA2_GTK_INDEX_SHIFT 0x00 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun #define WPA2_GTK_TRANSMIT 0x04 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* IGTK encapsulation */ 254*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 255*4882a593Smuzhiyun uint16 key_id; 256*4882a593Smuzhiyun uint8 ipn[6]; 257*4882a593Smuzhiyun uint8 key[EAPOL_WPA_MAX_KEY_SIZE]; 258*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_wpa2_key_igtk_encap_t; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun #define EAPOL_WPA2_KEY_IGTK_ENCAP_HDR_LEN 8 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /* STAKey encapsulation */ 263*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct { 264*4882a593Smuzhiyun uint8 reserved[2]; 265*4882a593Smuzhiyun uint8 mac[ETHER_ADDR_LEN]; 266*4882a593Smuzhiyun uint8 stakey[EAPOL_WPA_MAX_KEY_SIZE]; 267*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT eapol_wpa2_key_stakey_encap_t; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun #define WPA2_KEY_DATA_PAD 0xdd 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* Transition Disable Bitmap field encapsualtion */ 272*4882a593Smuzhiyun #define TRANS_BITMAP_FIELD_LEN 1 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* Transition Disable Bitmap field index values */ 275*4882a593Smuzhiyun #define TRANS_DISABLE_WPA3_PSK 0 276*4882a593Smuzhiyun #define TRANS_DISABLE_SAE_PK 1 277*4882a593Smuzhiyun #define TRANS_DISABLE_WPA3_ENT 2 278*4882a593Smuzhiyun #define TRANS_DISABLE_WIFI_ENHANCE_OPEN 3 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* This marks the end of a packed structure section. */ 281*4882a593Smuzhiyun #include <packed_section_end.h> 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #endif /* _eapol_h_ */ 284