1 /* 2 ************************************************************************* 3 * Ralink Tech Inc. 4 * 5F., No.36, Taiyuan St., Jhubei City, 5 * Hsinchu County 302, 6 * Taiwan, R.O.C. 7 * 8 * (c) Copyright 2002-2007, Ralink Technology, Inc. 9 * 10 * This program is free software; you can redistribute it and/or modify * 11 * it under the terms of the GNU General Public License as published by * 12 * the Free Software Foundation; either version 2 of the License, or * 13 * (at your option) any later version. * 14 * * 15 * This program is distributed in the hope that it will be useful, * 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 18 * GNU General Public License for more details. * 19 * * 20 * You should have received a copy of the GNU General Public License * 21 * along with this program; if not, write to the * 22 * Free Software Foundation, Inc., * 23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 24 * * 25 ************************************************************************* 26 27 Module Name: 28 wpa.h 29 30 Abstract: 31 32 Revision History: 33 Who When What 34 -------- ---------- ---------------------------------------------- 35 Name Date Modification logs 36 */ 37 38 #ifndef __WPA_H__ 39 #define __WPA_H__ 40 41 // EAPOL Key descripter frame format related length 42 #define LEN_KEY_DESC_NONCE 32 43 #define LEN_KEY_DESC_IV 16 44 #define LEN_KEY_DESC_RSC 8 45 #define LEN_KEY_DESC_ID 8 46 #define LEN_KEY_DESC_REPLAY 8 47 #define LEN_KEY_DESC_MIC 16 48 49 // The length is the EAPoL-Key frame except key data field. 50 // Please refer to 802.11i-2004 ,Figure 43u in p.78 51 #define LEN_EAPOL_KEY_MSG (sizeof(KEY_DESCRIPTER) - MAX_LEN_OF_RSNIE) 52 53 // EAP Code Type. 54 #define EAP_CODE_REQUEST 1 55 #define EAP_CODE_RESPONSE 2 56 #define EAP_CODE_SUCCESS 3 57 #define EAP_CODE_FAILURE 4 58 59 // EAPOL frame Protocol Version 60 #define EAPOL_VER 1 61 #define EAPOL_VER2 2 62 63 // EAPOL-KEY Descriptor Type 64 #define WPA1_KEY_DESC 0xfe 65 #define WPA2_KEY_DESC 0x02 66 67 // Key Descriptor Version of Key Information 68 #define DESC_TYPE_TKIP 1 69 #define DESC_TYPE_AES 2 70 #define DESC_TYPE_MESH 3 71 72 #define LEN_MSG1_2WAY 0x7f 73 #define MAX_LEN_OF_EAP_HS 256 74 75 #define LEN_MASTER_KEY 32 76 77 // EAPOL EK, MK 78 #define LEN_EAP_EK 16 79 #define LEN_EAP_MICK 16 80 #define LEN_EAP_KEY ((LEN_EAP_EK)+(LEN_EAP_MICK)) 81 // TKIP key related 82 #define LEN_PMKID 16 83 #define LEN_TKIP_EK 16 84 #define LEN_TKIP_RXMICK 8 85 #define LEN_TKIP_TXMICK 8 86 #define LEN_AES_EK 16 87 #define LEN_AES_KEY LEN_AES_EK 88 #define LEN_TKIP_KEY ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK)) 89 #define TKIP_AP_TXMICK_OFFSET ((LEN_EAP_KEY)+(LEN_TKIP_EK)) 90 #define TKIP_AP_RXMICK_OFFSET (TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK) 91 #define TKIP_GTK_LENGTH ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK)) 92 #define LEN_PTK ((LEN_EAP_KEY)+(LEN_TKIP_KEY)) 93 94 // RSN IE Length definition 95 #define MAX_LEN_OF_RSNIE 90 96 #define MIN_LEN_OF_RSNIE 8 97 98 //EAP Packet Type 99 #define EAPPacket 0 100 #define EAPOLStart 1 101 #define EAPOLLogoff 2 102 #define EAPOLKey 3 103 #define EAPOLASFAlert 4 104 #define EAPTtypeMax 5 105 106 #define EAPOL_MSG_INVALID 0 107 #define EAPOL_PAIR_MSG_1 1 108 #define EAPOL_PAIR_MSG_2 2 109 #define EAPOL_PAIR_MSG_3 3 110 #define EAPOL_PAIR_MSG_4 4 111 #define EAPOL_GROUP_MSG_1 5 112 #define EAPOL_GROUP_MSG_2 6 113 114 #define PAIRWISEKEY 1 115 #define GROUPKEY 0 116 117 // Retry timer counter initial value 118 #define PEER_MSG1_RETRY_TIMER_CTR 0 119 #define PEER_MSG3_RETRY_TIMER_CTR 10 120 #define GROUP_MSG1_RETRY_TIMER_CTR 20 121 122 123 #define EAPOL_START_DISABLE 0 124 #define EAPOL_START_PSK 1 125 #define EAPOL_START_1X 2 126 127 #define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0) 128 #define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0) 129 #define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0) 130 #define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0) 131 132 #define ROUND_UP(__x, __y) \ 133 (((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1))) 134 135 #define ADD_ONE_To_64BIT_VAR(_V) \ 136 { \ 137 UCHAR cnt = LEN_KEY_DESC_REPLAY; \ 138 do \ 139 { \ 140 cnt--; \ 141 _V[cnt]++; \ 142 if (cnt == 0) \ 143 break; \ 144 }while (_V[cnt] == 0); \ 145 } 146 147 #define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK)) 148 149 // EAPOL Key Information definition within Key descriptor format 150 typedef struct PACKED _KEY_INFO 151 { 152 #ifdef RT_BIG_ENDIAN 153 UCHAR KeyAck:1; 154 UCHAR Install:1; 155 UCHAR KeyIndex:2; 156 UCHAR KeyType:1; 157 UCHAR KeyDescVer:3; 158 UCHAR Rsvd:3; 159 UCHAR EKD_DL:1; // EKD for AP; DL for STA 160 UCHAR Request:1; 161 UCHAR Error:1; 162 UCHAR Secure:1; 163 UCHAR KeyMic:1; 164 #else 165 UCHAR KeyMic:1; 166 UCHAR Secure:1; 167 UCHAR Error:1; 168 UCHAR Request:1; 169 UCHAR EKD_DL:1; // EKD for AP; DL for STA 170 UCHAR Rsvd:3; 171 UCHAR KeyDescVer:3; 172 UCHAR KeyType:1; 173 UCHAR KeyIndex:2; 174 UCHAR Install:1; 175 UCHAR KeyAck:1; 176 #endif 177 } KEY_INFO, *PKEY_INFO; 178 179 // EAPOL Key descriptor format 180 typedef struct PACKED _KEY_DESCRIPTER 181 { 182 UCHAR Type; 183 KEY_INFO KeyInfo; 184 UCHAR KeyLength[2]; 185 UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; 186 UCHAR KeyNonce[LEN_KEY_DESC_NONCE]; 187 UCHAR KeyIv[LEN_KEY_DESC_IV]; 188 UCHAR KeyRsc[LEN_KEY_DESC_RSC]; 189 UCHAR KeyId[LEN_KEY_DESC_ID]; 190 UCHAR KeyMic[LEN_KEY_DESC_MIC]; 191 UCHAR KeyDataLen[2]; 192 UCHAR KeyData[MAX_LEN_OF_RSNIE]; 193 } KEY_DESCRIPTER, *PKEY_DESCRIPTER; 194 195 typedef struct PACKED _EAPOL_PACKET 196 { 197 UCHAR ProVer; 198 UCHAR ProType; 199 UCHAR Body_Len[2]; 200 KEY_DESCRIPTER KeyDesc; 201 } EAPOL_PACKET, *PEAPOL_PACKET; 202 203 //802.11i D10 page 83 204 typedef struct PACKED _GTK_ENCAP 205 { 206 #ifndef RT_BIG_ENDIAN 207 UCHAR Kid:2; 208 UCHAR tx:1; 209 UCHAR rsv:5; 210 UCHAR rsv1; 211 #else 212 UCHAR rsv:5; 213 UCHAR tx:1; 214 UCHAR Kid:2; 215 UCHAR rsv1; 216 #endif 217 UCHAR GTK[TKIP_GTK_LENGTH]; 218 } GTK_ENCAP, *PGTK_ENCAP; 219 220 typedef struct PACKED _KDE_ENCAP 221 { 222 UCHAR Type; 223 UCHAR Len; 224 UCHAR OUI[3]; 225 UCHAR DataType; 226 GTK_ENCAP GTKEncap; 227 } KDE_ENCAP, *PKDE_ENCAP; 228 229 // For WPA1 230 typedef struct PACKED _RSNIE { 231 UCHAR oui[4]; 232 USHORT version; 233 UCHAR mcast[4]; 234 USHORT ucount; 235 struct PACKED { 236 UCHAR oui[4]; 237 }ucast[1]; 238 } RSNIE, *PRSNIE; 239 240 // For WPA2 241 typedef struct PACKED _RSNIE2 { 242 USHORT version; 243 UCHAR mcast[4]; 244 USHORT ucount; 245 struct PACKED { 246 UCHAR oui[4]; 247 }ucast[1]; 248 } RSNIE2, *PRSNIE2; 249 250 // AKM Suite 251 typedef struct PACKED _RSNIE_AUTH { 252 USHORT acount; 253 struct PACKED { 254 UCHAR oui[4]; 255 }auth[1]; 256 } RSNIE_AUTH,*PRSNIE_AUTH; 257 258 typedef union PACKED _RSN_CAPABILITIES { 259 struct PACKED { 260 #ifdef RT_BIG_ENDIAN 261 USHORT Rsvd:10; 262 USHORT GTKSA_R_Counter:2; 263 USHORT PTKSA_R_Counter:2; 264 USHORT No_Pairwise:1; 265 USHORT PreAuth:1; 266 #else 267 USHORT PreAuth:1; 268 USHORT No_Pairwise:1; 269 USHORT PTKSA_R_Counter:2; 270 USHORT GTKSA_R_Counter:2; 271 USHORT Rsvd:10; 272 #endif 273 } field; 274 USHORT word; 275 } RSN_CAPABILITIES, *PRSN_CAPABILITIES; 276 277 typedef struct PACKED _EAP_HDR { 278 UCHAR ProVer; 279 UCHAR ProType; 280 UCHAR Body_Len[2]; 281 UCHAR code; 282 UCHAR identifier; 283 UCHAR length[2]; // including code and identifier, followed by length-2 octets of data 284 } EAP_HDR, *PEAP_HDR; 285 286 // For supplicant state machine states. 802.11i Draft 4.1, p. 97 287 // We simplified it 288 typedef enum _WpaState 289 { 290 SS_NOTUSE, // 0 291 SS_START, // 1 292 SS_WAIT_MSG_3, // 2 293 SS_WAIT_GROUP, // 3 294 SS_FINISH, // 4 295 SS_KEYUPDATE, // 5 296 } WPA_STATE; 297 298 // 299 // The definition of the cipher combination 300 // 301 // bit3 bit2 bit1 bit0 302 // +------------+------------+ 303 // | WPA | WPA2 | 304 // +------+-----+------+-----+ 305 // | TKIP | AES | TKIP | AES | 306 // | 0 | 1 | 1 | 0 | -> 0x06 307 // | 0 | 1 | 1 | 1 | -> 0x07 308 // | 1 | 0 | 0 | 1 | -> 0x09 309 // | 1 | 0 | 1 | 1 | -> 0x0B 310 // | 1 | 1 | 0 | 1 | -> 0x0D 311 // | 1 | 1 | 1 | 0 | -> 0x0E 312 // | 1 | 1 | 1 | 1 | -> 0x0F 313 // +------+-----+------+-----+ 314 // 315 typedef enum _WpaMixPairCipher 316 { 317 MIX_CIPHER_NOTUSE = 0x00, 318 WPA_NONE_WPA2_TKIPAES = 0x03, // WPA2-TKIPAES 319 WPA_AES_WPA2_TKIP = 0x06, 320 WPA_AES_WPA2_TKIPAES = 0x07, 321 WPA_TKIP_WPA2_AES = 0x09, 322 WPA_TKIP_WPA2_TKIPAES = 0x0B, 323 WPA_TKIPAES_WPA2_NONE = 0x0C, // WPA-TKIPAES 324 WPA_TKIPAES_WPA2_AES = 0x0D, 325 WPA_TKIPAES_WPA2_TKIP = 0x0E, 326 WPA_TKIPAES_WPA2_TKIPAES = 0x0F, 327 } WPA_MIX_PAIR_CIPHER; 328 329 typedef struct PACKED _RSN_IE_HEADER_STRUCT { 330 UCHAR Eid; 331 UCHAR Length; 332 USHORT Version; // Little endian format 333 } RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT; 334 335 // Cipher suite selector types 336 typedef struct PACKED _CIPHER_SUITE_STRUCT { 337 UCHAR Oui[3]; 338 UCHAR Type; 339 } CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT; 340 341 // Authentication and Key Management suite selector 342 typedef struct PACKED _AKM_SUITE_STRUCT { 343 UCHAR Oui[3]; 344 UCHAR Type; 345 } AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT; 346 347 // RSN capability 348 typedef struct PACKED _RSN_CAPABILITY { 349 USHORT Rsv:10; 350 USHORT GTKSAReplayCnt:2; 351 USHORT PTKSAReplayCnt:2; 352 USHORT NoPairwise:1; 353 USHORT PreAuth:1; 354 } RSN_CAPABILITY, *PRSN_CAPABILITY; 355 356 #endif 357