1 /* 2 * 802.1x EAPOL definitions 3 * 4 * See 5 * IEEE Std 802.1X-2001 6 * IEEE 802.1X RADIUS Usage Guidelines 7 * 8 * Copyright (C) 2002 Broadcom Corporation 9 * 10 * $Id: eapol.h,v 9.18.260.1.2.1.6.6 2009/04/08 05:00:08 Exp $ 11 */ 12 13 #ifndef _eapol_h_ 14 #define _eapol_h_ 15 16 #ifndef _TYPEDEFS_H_ 17 #include <typedefs.h> 18 #endif 19 20 /* This marks the start of a packed structure section. */ 21 #include <packed_section_start.h> 22 23 #define AKW_BLOCK_LEN 8 /* The only def we need here */ 24 25 /* EAPOL for 802.3/Ethernet */ 26 typedef struct { 27 struct ether_header eth; /* 802.3/Ethernet header */ 28 unsigned char version; /* EAPOL protocol version */ 29 unsigned char type; /* EAPOL type */ 30 unsigned short length; /* Length of body */ 31 unsigned char body[1]; /* Body (optional) */ 32 } eapol_header_t; 33 34 #define EAPOL_HEADER_LEN 18 35 36 /* EAPOL version */ 37 #define WPA2_EAPOL_VERSION 2 38 #define WPA_EAPOL_VERSION 1 39 #define LEAP_EAPOL_VERSION 1 40 #define SES_EAPOL_VERSION 1 41 42 /* EAPOL types */ 43 #define EAP_PACKET 0 44 #define EAPOL_START 1 45 #define EAPOL_LOGOFF 2 46 #define EAPOL_KEY 3 47 #define EAPOL_ASF 4 48 49 /* EAPOL-Key types */ 50 #define EAPOL_RC4_KEY 1 51 #define EAPOL_WPA2_KEY 2 /* 802.11i/WPA2 */ 52 #define EAPOL_WPA_KEY 254 /* WPA */ 53 54 /* RC4 EAPOL-Key header field sizes */ 55 #define EAPOL_KEY_REPLAY_LEN 8 56 #define EAPOL_KEY_IV_LEN 16 57 #define EAPOL_KEY_SIG_LEN 16 58 59 /* RC4 EAPOL-Key */ 60 typedef BWL_PRE_PACKED_STRUCT struct { 61 unsigned char type; /* Key Descriptor Type */ 62 unsigned short length; /* Key Length (unaligned) */ 63 unsigned char replay[EAPOL_KEY_REPLAY_LEN]; /* Replay Counter */ 64 unsigned char iv[EAPOL_KEY_IV_LEN]; /* Key IV */ 65 unsigned char index; /* Key Flags & Index */ 66 unsigned char signature[EAPOL_KEY_SIG_LEN]; /* Key Signature */ 67 unsigned char key[1]; /* Key (optional) */ 68 } BWL_POST_PACKED_STRUCT eapol_key_header_t; 69 70 #define EAPOL_KEY_HEADER_LEN 44 71 72 /* RC4 EAPOL-Key flags */ 73 #define EAPOL_KEY_FLAGS_MASK 0x80 74 #define EAPOL_KEY_BROADCAST 0 75 #define EAPOL_KEY_UNICAST 0x80 76 77 /* RC4 EAPOL-Key index */ 78 #define EAPOL_KEY_INDEX_MASK 0x7f 79 80 /* WPA/802.11i/WPA2 EAPOL-Key header field sizes */ 81 #define EAPOL_WPA_KEY_REPLAY_LEN 8 82 #define EAPOL_WPA_KEY_NONCE_LEN 32 83 #define EAPOL_WPA_KEY_IV_LEN 16 84 #define EAPOL_WPA_KEY_ID_LEN 8 85 #define EAPOL_WPA_KEY_RSC_LEN 8 86 #define EAPOL_WPA_KEY_MIC_LEN 16 87 #define EAPOL_WPA_KEY_DATA_LEN (EAPOL_WPA_MAX_KEY_SIZE + AKW_BLOCK_LEN) 88 #define EAPOL_WPA_MAX_KEY_SIZE 32 89 90 /* WPA EAPOL-Key */ 91 typedef BWL_PRE_PACKED_STRUCT struct { 92 unsigned char type; /* Key Descriptor Type */ 93 unsigned short key_info; /* Key Information (unaligned) */ 94 unsigned short key_len; /* Key Length (unaligned) */ 95 unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN]; /* Replay Counter */ 96 unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN]; /* Nonce */ 97 unsigned char iv[EAPOL_WPA_KEY_IV_LEN]; /* Key IV */ 98 unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN]; /* Key RSC */ 99 unsigned char id[EAPOL_WPA_KEY_ID_LEN]; /* WPA:Key ID, 802.11i/WPA2: Reserved */ 100 unsigned char mic[EAPOL_WPA_KEY_MIC_LEN]; /* Key MIC */ 101 unsigned short data_len; /* Key Data Length */ 102 unsigned char data[EAPOL_WPA_KEY_DATA_LEN]; /* Key data */ 103 } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t; 104 105 #define EAPOL_WPA_KEY_LEN 95 106 107 /* WPA/802.11i/WPA2 KEY KEY_INFO bits */ 108 #define WPA_KEY_DESC_V1 0x01 109 #define WPA_KEY_DESC_V2 0x02 110 #define WPA_KEY_PAIRWISE 0x08 111 #define WPA_KEY_INSTALL 0x40 112 #define WPA_KEY_ACK 0x80 113 #define WPA_KEY_MIC 0x100 114 #define WPA_KEY_SECURE 0x200 115 #define WPA_KEY_ERROR 0x400 116 #define WPA_KEY_REQ 0x800 117 118 /* WPA-only KEY KEY_INFO bits */ 119 #define WPA_KEY_INDEX_0 0x00 120 #define WPA_KEY_INDEX_1 0x10 121 #define WPA_KEY_INDEX_2 0x20 122 #define WPA_KEY_INDEX_3 0x30 123 #define WPA_KEY_INDEX_MASK 0x30 124 #define WPA_KEY_INDEX_SHIFT 0x04 125 126 /* 802.11i/WPA2-only KEY KEY_INFO bits */ 127 #define WPA_KEY_ENCRYPTED_DATA 0x1000 128 129 /* Key Data encapsulation */ 130 typedef BWL_PRE_PACKED_STRUCT struct { 131 uint8 type; 132 uint8 length; 133 uint8 oui[3]; 134 uint8 subtype; 135 uint8 data[1]; 136 } BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t; 137 138 #define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6 139 140 #define WPA2_KEY_DATA_SUBTYPE_GTK 1 141 #define WPA2_KEY_DATA_SUBTYPE_STAKEY 2 142 #define WPA2_KEY_DATA_SUBTYPE_MAC 3 143 #define WPA2_KEY_DATA_SUBTYPE_PMKID 4 144 145 /* GTK encapsulation */ 146 typedef BWL_PRE_PACKED_STRUCT struct { 147 uint8 flags; 148 uint8 reserved; 149 uint8 gtk[EAPOL_WPA_MAX_KEY_SIZE]; 150 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t; 151 152 #define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2 153 154 #define WPA2_GTK_INDEX_MASK 0x03 155 #define WPA2_GTK_INDEX_SHIFT 0x00 156 157 #define WPA2_GTK_TRANSMIT 0x04 158 159 /* STAKey encapsulation */ 160 typedef BWL_PRE_PACKED_STRUCT struct { 161 uint8 reserved[2]; 162 uint8 mac[ETHER_ADDR_LEN]; 163 uint8 stakey[EAPOL_WPA_MAX_KEY_SIZE]; 164 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_stakey_encap_t; 165 166 #define WPA2_KEY_DATA_PAD 0xdd 167 168 169 /* This marks the end of a packed structure section. */ 170 #include <packed_section_end.h> 171 172 #endif /* _eapol_h_ */ 173