/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * ************************************************************************* Module Name: wpa.h Abstract: Revision History: Who When What -------- ---------- ---------------------------------------------- Name Date Modification logs */ #ifndef __WPA_H__ #define __WPA_H__ // EAPOL Key descripter frame format related length #define LEN_KEY_DESC_NONCE 32 #define LEN_KEY_DESC_IV 16 #define LEN_KEY_DESC_RSC 8 #define LEN_KEY_DESC_ID 8 #define LEN_KEY_DESC_REPLAY 8 #define LEN_KEY_DESC_MIC 16 // The length is the EAPoL-Key frame except key data field. // Please refer to 802.11i-2004 ,Figure 43u in p.78 #define LEN_EAPOL_KEY_MSG (sizeof(KEY_DESCRIPTER) - MAX_LEN_OF_RSNIE) // EAP Code Type. #define EAP_CODE_REQUEST 1 #define EAP_CODE_RESPONSE 2 #define EAP_CODE_SUCCESS 3 #define EAP_CODE_FAILURE 4 // EAPOL frame Protocol Version #define EAPOL_VER 1 #define EAPOL_VER2 2 // EAPOL-KEY Descriptor Type #define WPA1_KEY_DESC 0xfe #define WPA2_KEY_DESC 0x02 // Key Descriptor Version of Key Information #define DESC_TYPE_TKIP 1 #define DESC_TYPE_AES 2 #define DESC_TYPE_MESH 3 #define LEN_MSG1_2WAY 0x7f #define MAX_LEN_OF_EAP_HS 256 #define LEN_MASTER_KEY 32 // EAPOL EK, MK #define LEN_EAP_EK 16 #define LEN_EAP_MICK 16 #define LEN_EAP_KEY ((LEN_EAP_EK)+(LEN_EAP_MICK)) // TKIP key related #define LEN_PMKID 16 #define LEN_TKIP_EK 16 #define LEN_TKIP_RXMICK 8 #define LEN_TKIP_TXMICK 8 #define LEN_AES_EK 16 #define LEN_AES_KEY LEN_AES_EK #define LEN_TKIP_KEY ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK)) #define TKIP_AP_TXMICK_OFFSET ((LEN_EAP_KEY)+(LEN_TKIP_EK)) #define TKIP_AP_RXMICK_OFFSET (TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK) #define TKIP_GTK_LENGTH ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK)) #define LEN_PTK ((LEN_EAP_KEY)+(LEN_TKIP_KEY)) // RSN IE Length definition #define MAX_LEN_OF_RSNIE 90 #define MIN_LEN_OF_RSNIE 8 //EAP Packet Type #define EAPPacket 0 #define EAPOLStart 1 #define EAPOLLogoff 2 #define EAPOLKey 3 #define EAPOLASFAlert 4 #define EAPTtypeMax 5 #define EAPOL_MSG_INVALID 0 #define EAPOL_PAIR_MSG_1 1 #define EAPOL_PAIR_MSG_2 2 #define EAPOL_PAIR_MSG_3 3 #define EAPOL_PAIR_MSG_4 4 #define EAPOL_GROUP_MSG_1 5 #define EAPOL_GROUP_MSG_2 6 #define PAIRWISEKEY 1 #define GROUPKEY 0 // Retry timer counter initial value #define PEER_MSG1_RETRY_TIMER_CTR 0 #define PEER_MSG3_RETRY_TIMER_CTR 10 #define GROUP_MSG1_RETRY_TIMER_CTR 20 #define EAPOL_START_DISABLE 0 #define EAPOL_START_PSK 1 #define EAPOL_START_1X 2 #define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0) #define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0) #define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0) #define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0) #define ROUND_UP(__x, __y) \ (((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1))) #define ADD_ONE_To_64BIT_VAR(_V) \ { \ UCHAR cnt = LEN_KEY_DESC_REPLAY; \ do \ { \ cnt--; \ _V[cnt]++; \ if (cnt == 0) \ break; \ }while (_V[cnt] == 0); \ } #define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK)) // EAPOL Key Information definition within Key descriptor format typedef struct PACKED _KEY_INFO { #ifdef RT_BIG_ENDIAN UCHAR KeyAck:1; UCHAR Install:1; UCHAR KeyIndex:2; UCHAR KeyType:1; UCHAR KeyDescVer:3; UCHAR Rsvd:3; UCHAR EKD_DL:1; // EKD for AP; DL for STA UCHAR Request:1; UCHAR Error:1; UCHAR Secure:1; UCHAR KeyMic:1; #else UCHAR KeyMic:1; UCHAR Secure:1; UCHAR Error:1; UCHAR Request:1; UCHAR EKD_DL:1; // EKD for AP; DL for STA UCHAR Rsvd:3; UCHAR KeyDescVer:3; UCHAR KeyType:1; UCHAR KeyIndex:2; UCHAR Install:1; UCHAR KeyAck:1; #endif } KEY_INFO, *PKEY_INFO; // EAPOL Key descriptor format typedef struct PACKED _KEY_DESCRIPTER { UCHAR Type; KEY_INFO KeyInfo; UCHAR KeyLength[2]; UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; UCHAR KeyNonce[LEN_KEY_DESC_NONCE]; UCHAR KeyIv[LEN_KEY_DESC_IV]; UCHAR KeyRsc[LEN_KEY_DESC_RSC]; UCHAR KeyId[LEN_KEY_DESC_ID]; UCHAR KeyMic[LEN_KEY_DESC_MIC]; UCHAR KeyDataLen[2]; UCHAR KeyData[MAX_LEN_OF_RSNIE]; } KEY_DESCRIPTER, *PKEY_DESCRIPTER; typedef struct PACKED _EAPOL_PACKET { UCHAR ProVer; UCHAR ProType; UCHAR Body_Len[2]; KEY_DESCRIPTER KeyDesc; } EAPOL_PACKET, *PEAPOL_PACKET; //802.11i D10 page 83 typedef struct PACKED _GTK_ENCAP { #ifndef RT_BIG_ENDIAN UCHAR Kid:2; UCHAR tx:1; UCHAR rsv:5; UCHAR rsv1; #else UCHAR rsv:5; UCHAR tx:1; UCHAR Kid:2; UCHAR rsv1; #endif UCHAR GTK[TKIP_GTK_LENGTH]; } GTK_ENCAP, *PGTK_ENCAP; typedef struct PACKED _KDE_ENCAP { UCHAR Type; UCHAR Len; UCHAR OUI[3]; UCHAR DataType; GTK_ENCAP GTKEncap; } KDE_ENCAP, *PKDE_ENCAP; // For WPA1 typedef struct PACKED _RSNIE { UCHAR oui[4]; USHORT version; UCHAR mcast[4]; USHORT ucount; struct PACKED { UCHAR oui[4]; }ucast[1]; } RSNIE, *PRSNIE; // For WPA2 typedef struct PACKED _RSNIE2 { USHORT version; UCHAR mcast[4]; USHORT ucount; struct PACKED { UCHAR oui[4]; }ucast[1]; } RSNIE2, *PRSNIE2; // AKM Suite typedef struct PACKED _RSNIE_AUTH { USHORT acount; struct PACKED { UCHAR oui[4]; }auth[1]; } RSNIE_AUTH,*PRSNIE_AUTH; typedef union PACKED _RSN_CAPABILITIES { struct PACKED { #ifdef RT_BIG_ENDIAN USHORT Rsvd:10; USHORT GTKSA_R_Counter:2; USHORT PTKSA_R_Counter:2; USHORT No_Pairwise:1; USHORT PreAuth:1; #else USHORT PreAuth:1; USHORT No_Pairwise:1; USHORT PTKSA_R_Counter:2; USHORT GTKSA_R_Counter:2; USHORT Rsvd:10; #endif } field; USHORT word; } RSN_CAPABILITIES, *PRSN_CAPABILITIES; typedef struct PACKED _EAP_HDR { UCHAR ProVer; UCHAR ProType; UCHAR Body_Len[2]; UCHAR code; UCHAR identifier; UCHAR length[2]; // including code and identifier, followed by length-2 octets of data } EAP_HDR, *PEAP_HDR; // For supplicant state machine states. 802.11i Draft 4.1, p. 97 // We simplified it typedef enum _WpaState { SS_NOTUSE, // 0 SS_START, // 1 SS_WAIT_MSG_3, // 2 SS_WAIT_GROUP, // 3 SS_FINISH, // 4 SS_KEYUPDATE, // 5 } WPA_STATE; // // The definition of the cipher combination // // bit3 bit2 bit1 bit0 // +------------+------------+ // | WPA | WPA2 | // +------+-----+------+-----+ // | TKIP | AES | TKIP | AES | // | 0 | 1 | 1 | 0 | -> 0x06 // | 0 | 1 | 1 | 1 | -> 0x07 // | 1 | 0 | 0 | 1 | -> 0x09 // | 1 | 0 | 1 | 1 | -> 0x0B // | 1 | 1 | 0 | 1 | -> 0x0D // | 1 | 1 | 1 | 0 | -> 0x0E // | 1 | 1 | 1 | 1 | -> 0x0F // +------+-----+------+-----+ // typedef enum _WpaMixPairCipher { MIX_CIPHER_NOTUSE = 0x00, WPA_NONE_WPA2_TKIPAES = 0x03, // WPA2-TKIPAES WPA_AES_WPA2_TKIP = 0x06, WPA_AES_WPA2_TKIPAES = 0x07, WPA_TKIP_WPA2_AES = 0x09, WPA_TKIP_WPA2_TKIPAES = 0x0B, WPA_TKIPAES_WPA2_NONE = 0x0C, // WPA-TKIPAES WPA_TKIPAES_WPA2_AES = 0x0D, WPA_TKIPAES_WPA2_TKIP = 0x0E, WPA_TKIPAES_WPA2_TKIPAES = 0x0F, } WPA_MIX_PAIR_CIPHER; typedef struct PACKED _RSN_IE_HEADER_STRUCT { UCHAR Eid; UCHAR Length; USHORT Version; // Little endian format } RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT; // Cipher suite selector types typedef struct PACKED _CIPHER_SUITE_STRUCT { UCHAR Oui[3]; UCHAR Type; } CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT; // Authentication and Key Management suite selector typedef struct PACKED _AKM_SUITE_STRUCT { UCHAR Oui[3]; UCHAR Type; } AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT; // RSN capability typedef struct PACKED _RSN_CAPABILITY { USHORT Rsv:10; USHORT GTKSAReplayCnt:2; USHORT PTKSAReplayCnt:2; USHORT NoPairwise:1; USHORT PreAuth:1; } RSN_CAPABILITY, *PRSN_CAPABILITY; #endif