1 /* 2 * Copyright (C) 1999-2013, Broadcom Corporation 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * 16 * $Id: eapol.h 382882 2013-02-04 23:24:31Z $ 17 */ 18 19 #ifndef _eapol_h_ 20 #define _eapol_h_ 21 22 #ifndef _TYPEDEFS_H_ 23 #include <typedefs.h> 24 #endif 25 26 /* This marks the start of a packed structure section. */ 27 #include <packed_section_start.h> 28 29 #include <bcmcrypto/aeskeywrap.h> 30 31 /* EAPOL for 802.3/Ethernet */ 32 typedef BWL_PRE_PACKED_STRUCT struct { 33 struct ether_header eth; /* 802.3/Ethernet header */ 34 unsigned char version; /* EAPOL protocol version */ 35 unsigned char type; /* EAPOL type */ 36 unsigned short length; /* Length of body */ 37 unsigned char body[1]; /* Body (optional) */ 38 } BWL_POST_PACKED_STRUCT eapol_header_t; 39 40 #define EAPOL_HEADER_LEN 18 41 42 typedef struct { 43 unsigned char version; /* EAPOL protocol version */ 44 unsigned char type; /* EAPOL type */ 45 unsigned short length; /* Length of body */ 46 } eapol_hdr_t; 47 48 #define EAPOL_HDR_LEN 4 49 50 /* EAPOL version */ 51 #define WPA2_EAPOL_VERSION 2 52 #define WPA_EAPOL_VERSION 1 53 #define LEAP_EAPOL_VERSION 1 54 #define SES_EAPOL_VERSION 1 55 56 /* EAPOL types */ 57 #define EAP_PACKET 0 58 #define EAPOL_START 1 59 #define EAPOL_LOGOFF 2 60 #define EAPOL_KEY 3 61 #define EAPOL_ASF 4 62 63 /* EAPOL-Key types */ 64 #define EAPOL_RC4_KEY 1 65 #define EAPOL_WPA2_KEY 2 /* 802.11i/WPA2 */ 66 #define EAPOL_WPA_KEY 254 /* WPA */ 67 68 /* RC4 EAPOL-Key header field sizes */ 69 #define EAPOL_KEY_REPLAY_LEN 8 70 #define EAPOL_KEY_IV_LEN 16 71 #define EAPOL_KEY_SIG_LEN 16 72 73 /* RC4 EAPOL-Key */ 74 typedef BWL_PRE_PACKED_STRUCT struct { 75 unsigned char type; /* Key Descriptor Type */ 76 unsigned short length; /* Key Length (unaligned) */ 77 unsigned char replay[EAPOL_KEY_REPLAY_LEN]; /* Replay Counter */ 78 unsigned char iv[EAPOL_KEY_IV_LEN]; /* Key IV */ 79 unsigned char index; /* Key Flags & Index */ 80 unsigned char signature[EAPOL_KEY_SIG_LEN]; /* Key Signature */ 81 unsigned char key[1]; /* Key (optional) */ 82 } BWL_POST_PACKED_STRUCT eapol_key_header_t; 83 84 #define EAPOL_KEY_HEADER_LEN 44 85 86 /* RC4 EAPOL-Key flags */ 87 #define EAPOL_KEY_FLAGS_MASK 0x80 88 #define EAPOL_KEY_BROADCAST 0 89 #define EAPOL_KEY_UNICAST 0x80 90 91 /* RC4 EAPOL-Key index */ 92 #define EAPOL_KEY_INDEX_MASK 0x7f 93 94 /* WPA/802.11i/WPA2 EAPOL-Key header field sizes */ 95 #define EAPOL_WPA_KEY_REPLAY_LEN 8 96 #define EAPOL_WPA_KEY_NONCE_LEN 32 97 #define EAPOL_WPA_KEY_IV_LEN 16 98 #define EAPOL_WPA_KEY_RSC_LEN 8 99 #define EAPOL_WPA_KEY_ID_LEN 8 100 #define EAPOL_WPA_KEY_MIC_LEN 16 101 #define EAPOL_WPA_KEY_DATA_LEN (EAPOL_WPA_MAX_KEY_SIZE + AKW_BLOCK_LEN) 102 #define EAPOL_WPA_MAX_KEY_SIZE 32 103 104 /* WPA EAPOL-Key */ 105 typedef BWL_PRE_PACKED_STRUCT struct { 106 unsigned char type; /* Key Descriptor Type */ 107 unsigned short key_info; /* Key Information (unaligned) */ 108 unsigned short key_len; /* Key Length (unaligned) */ 109 unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN]; /* Replay Counter */ 110 unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN]; /* Nonce */ 111 unsigned char iv[EAPOL_WPA_KEY_IV_LEN]; /* Key IV */ 112 unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN]; /* Key RSC */ 113 unsigned char id[EAPOL_WPA_KEY_ID_LEN]; /* WPA:Key ID, 802.11i/WPA2: Reserved */ 114 unsigned char mic[EAPOL_WPA_KEY_MIC_LEN]; /* Key MIC */ 115 unsigned short data_len; /* Key Data Length */ 116 unsigned char data[EAPOL_WPA_KEY_DATA_LEN]; /* Key data */ 117 } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t; 118 119 #define EAPOL_WPA_KEY_LEN 95 120 121 /* WPA/802.11i/WPA2 KEY KEY_INFO bits */ 122 #define WPA_KEY_DESC_V1 0x01 123 #define WPA_KEY_DESC_V2 0x02 124 #define WPA_KEY_DESC_V3 0x03 125 #define WPA_KEY_PAIRWISE 0x08 126 #define WPA_KEY_INSTALL 0x40 127 #define WPA_KEY_ACK 0x80 128 #define WPA_KEY_MIC 0x100 129 #define WPA_KEY_SECURE 0x200 130 #define WPA_KEY_ERROR 0x400 131 #define WPA_KEY_REQ 0x800 132 133 #define WPA_KEY_DESC_V2_OR_V3 WPA_KEY_DESC_V2 134 135 /* WPA-only KEY KEY_INFO bits */ 136 #define WPA_KEY_INDEX_0 0x00 137 #define WPA_KEY_INDEX_1 0x10 138 #define WPA_KEY_INDEX_2 0x20 139 #define WPA_KEY_INDEX_3 0x30 140 #define WPA_KEY_INDEX_MASK 0x30 141 #define WPA_KEY_INDEX_SHIFT 0x04 142 143 /* 802.11i/WPA2-only KEY KEY_INFO bits */ 144 #define WPA_KEY_ENCRYPTED_DATA 0x1000 145 146 /* Key Data encapsulation */ 147 typedef BWL_PRE_PACKED_STRUCT struct { 148 uint8 type; 149 uint8 length; 150 uint8 oui[3]; 151 uint8 subtype; 152 uint8 data[1]; 153 } BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t; 154 155 #define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6 156 157 #define WPA2_KEY_DATA_SUBTYPE_GTK 1 158 #define WPA2_KEY_DATA_SUBTYPE_STAKEY 2 159 #define WPA2_KEY_DATA_SUBTYPE_MAC 3 160 #define WPA2_KEY_DATA_SUBTYPE_PMKID 4 161 #define WPA2_KEY_DATA_SUBTYPE_IGTK 9 162 163 /* GTK encapsulation */ 164 typedef BWL_PRE_PACKED_STRUCT struct { 165 uint8 flags; 166 uint8 reserved; 167 uint8 gtk[EAPOL_WPA_MAX_KEY_SIZE]; 168 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t; 169 170 #define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2 171 172 #define WPA2_GTK_INDEX_MASK 0x03 173 #define WPA2_GTK_INDEX_SHIFT 0x00 174 175 #define WPA2_GTK_TRANSMIT 0x04 176 177 /* IGTK encapsulation */ 178 typedef BWL_PRE_PACKED_STRUCT struct { 179 uint16 key_id; 180 uint8 ipn[6]; 181 uint8 key[EAPOL_WPA_MAX_KEY_SIZE]; 182 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_igtk_encap_t; 183 184 #define EAPOL_WPA2_KEY_IGTK_ENCAP_HDR_LEN 8 185 186 /* STAKey encapsulation */ 187 typedef BWL_PRE_PACKED_STRUCT struct { 188 uint8 reserved[2]; 189 uint8 mac[ETHER_ADDR_LEN]; 190 uint8 stakey[EAPOL_WPA_MAX_KEY_SIZE]; 191 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_stakey_encap_t; 192 193 #define WPA2_KEY_DATA_PAD 0xdd 194 195 196 /* This marks the end of a packed structure section. */ 197 #include <packed_section_end.h> 198 199 #endif /* _eapol_h_ */ 200