2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
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. *
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. *
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. *
25 *************************************************************************
34 -------- ---------- ----------------------------------------------
35 Name Date Modification logs
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
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(struct rt_key_descripter) - MAX_LEN_OF_RSNIE)
54 #define EAP_CODE_REQUEST 1
55 #define EAP_CODE_RESPONSE 2
56 #define EAP_CODE_SUCCESS 3
57 #define EAP_CODE_FAILURE 4
59 /* EAPOL frame Protocol Version */
63 /* EAPOL-KEY Descriptor Type */
64 #define WPA1_KEY_DESC 0xfe
65 #define WPA2_KEY_DESC 0x02
67 /* Key Descriptor Version of Key Information */
68 #define DESC_TYPE_TKIP 1
69 #define DESC_TYPE_AES 2
71 #define LEN_MSG1_2WAY 0x7f
72 #define MAX_LEN_OF_EAP_HS 256
74 #define LEN_MASTER_KEY 32
78 #define LEN_EAP_MICK 16
79 #define LEN_EAP_KEY ((LEN_EAP_EK)+(LEN_EAP_MICK))
80 /* TKIP key related */
82 #define LEN_TKIP_EK 16
83 #define LEN_TKIP_RXMICK 8
84 #define LEN_TKIP_TXMICK 8
86 #define LEN_AES_KEY LEN_AES_EK
87 #define LEN_TKIP_KEY ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK))
88 #define TKIP_AP_TXMICK_OFFSET ((LEN_EAP_KEY)+(LEN_TKIP_EK))
89 #define TKIP_AP_RXMICK_OFFSET (TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK)
90 #define TKIP_GTK_LENGTH ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK))
91 #define LEN_PTK ((LEN_EAP_KEY)+(LEN_TKIP_KEY))
92 #define MIN_LEN_OF_GTK 5
94 #define LEN_PMK_NAME 16
97 /* RSN IE Length definition */
98 #define MAX_LEN_OF_RSNIE 255
99 #define MIN_LEN_OF_RSNIE 8
101 #define KEY_LIFETIME 3600
106 #define EAPOLLogoff 2
108 #define EAPOLASFAlert 4
109 #define EAPTtypeMax 5
111 #define EAPOL_MSG_INVALID 0
112 #define EAPOL_PAIR_MSG_1 1
113 #define EAPOL_PAIR_MSG_2 2
114 #define EAPOL_PAIR_MSG_3 3
115 #define EAPOL_PAIR_MSG_4 4
116 #define EAPOL_GROUP_MSG_1 5
117 #define EAPOL_GROUP_MSG_2 6
119 #define PAIRWISEKEY 1
122 /* Retry timer counter initial value */
123 #define PEER_MSG1_RETRY_TIMER_CTR 0
124 #define PEER_MSG3_RETRY_TIMER_CTR 10
125 #define GROUP_MSG1_RETRY_TIMER_CTR 20
127 /*#ifdef CONFIG_AP_SUPPORT */
128 /* WPA mechanism retry timer interval */
129 #define PEER_MSG1_RETRY_EXEC_INTV 1000 /* 1 sec */
130 #define PEER_MSG3_RETRY_EXEC_INTV 3000 /* 3 sec */
131 #define GROUP_KEY_UPDATE_EXEC_INTV 1000 /* 1 sec */
132 #define PEER_GROUP_KEY_UPDATE_INIV 2000 /* 2 sec */
134 #define ENQUEUE_EAPOL_START_TIMER 200 /* 200 ms */
136 /* group rekey interval */
139 #define DISABLE_REKEY 2
142 #define MAX_REKEY_INTER 0x3ffffff
143 /*#endif // CONFIG_AP_SUPPORT // */
145 #define GROUP_SUITE 0
146 #define PAIRWISE_SUITE 1
150 #define EAPOL_START_DISABLE 0
151 #define EAPOL_START_PSK 1
152 #define EAPOL_START_1X 2
154 #define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0)
155 #define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0)
156 #define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0)
157 #define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0)
160 #define ROUND_UP(__x, __y) \
161 (((unsigned long)((__x)+((__y)-1))) & ((unsigned long)~((__y)-1)))
164 #define SET_u16_TO_ARRARY(_V, _LEN) \
166 _V[0] = (_LEN & 0xFF00) >> 8; \
167 _V[1] = (_LEN & 0xFF); \
170 #define INC_u16_TO_ARRARY(_V, _LEN) \
174 var_len = (_V[0]<<8) | (_V[1]); \
177 _V[0] = (var_len & 0xFF00) >> 8; \
178 _V[1] = (var_len & 0xFF); \
181 #define CONV_ARRARY_TO_u16(_V) ((_V[0]<<8) | (_V[1]))
183 #define ADD_ONE_To_64BIT_VAR(_V) \
185 u8 cnt = LEN_KEY_DESC_REPLAY; \
192 }while (_V[cnt] == 0); \
195 #define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
197 /* EAPOL Key Information definition within Key descriptor format */
198 struct PACKED rt_key_info
{
203 u8 EKD_DL
:1; /* EKD for AP; DL for STA */
212 /* EAPOL Key descriptor format */
213 struct PACKED rt_key_descripter
{
215 struct rt_key_info KeyInfo
;
217 u8 ReplayCounter
[LEN_KEY_DESC_REPLAY
];
218 u8 KeyNonce
[LEN_KEY_DESC_NONCE
];
219 u8 KeyIv
[LEN_KEY_DESC_IV
];
220 u8 KeyRsc
[LEN_KEY_DESC_RSC
];
221 u8 KeyId
[LEN_KEY_DESC_ID
];
222 u8 KeyMic
[LEN_KEY_DESC_MIC
];
224 u8 KeyData
[MAX_LEN_OF_RSNIE
];
227 struct PACKED rt_eapol_packet
{
231 struct rt_key_descripter KeyDesc
;
234 /*802.11i D10 page 83 */
235 struct PACKED rt_gtk_encap
{
240 u8 GTK
[TKIP_GTK_LENGTH
];
243 struct PACKED rt_kde_encap
{
248 struct rt_gtk_encap GTKEncap
;
252 struct PACKED rt_rsnie
{
263 struct PACKED rt_rsnie2
{
273 struct PACKED rt_rsnie_auth
{
280 typedef union PACKED _RSN_CAPABILITIES
{
284 u16 PTKSA_R_Counter
:2;
285 u16 GTKSA_R_Counter
:2;
289 } RSN_CAPABILITIES
, *PRSN_CAPABILITIES
;
291 struct PACKED rt_eap_hdr
{
297 u8 length
[2]; /* including code and identifier, followed by length-2 octets of data */
300 /* For supplicant state machine states. 802.11i Draft 4.1, p. 97 */
301 /* We simplified it */
302 typedef enum _WpaState
{
305 SS_WAIT_MSG_3
, /* 2 */
306 SS_WAIT_GROUP
, /* 3 */
308 SS_KEYUPDATE
, /* 5 */
312 /* The definition of the cipher combination */
314 /* bit3 bit2 bit1 bit0 */
315 /* +------------+------------+ */
317 /* +------+-----+------+-----+ */
318 /* | TKIP | AES | TKIP | AES | */
319 /* | 0 | 1 | 1 | 0 | -> 0x06 */
320 /* | 0 | 1 | 1 | 1 | -> 0x07 */
321 /* | 1 | 0 | 0 | 1 | -> 0x09 */
322 /* | 1 | 0 | 1 | 1 | -> 0x0B */
323 /* | 1 | 1 | 0 | 1 | -> 0x0D */
324 /* | 1 | 1 | 1 | 0 | -> 0x0E */
325 /* | 1 | 1 | 1 | 1 | -> 0x0F */
326 /* +------+-----+------+-----+ */
328 typedef enum _WpaMixPairCipher
{
329 MIX_CIPHER_NOTUSE
= 0x00,
330 WPA_NONE_WPA2_TKIPAES
= 0x03, /* WPA2-TKIPAES */
331 WPA_AES_WPA2_TKIP
= 0x06,
332 WPA_AES_WPA2_TKIPAES
= 0x07,
333 WPA_TKIP_WPA2_AES
= 0x09,
334 WPA_TKIP_WPA2_TKIPAES
= 0x0B,
335 WPA_TKIPAES_WPA2_NONE
= 0x0C, /* WPA-TKIPAES */
336 WPA_TKIPAES_WPA2_AES
= 0x0D,
337 WPA_TKIPAES_WPA2_TKIP
= 0x0E,
338 WPA_TKIPAES_WPA2_TKIPAES
= 0x0F,
339 } WPA_MIX_PAIR_CIPHER
;
341 struct PACKED rt_rsn_ie_header
{
344 u16 Version
; /* Little endian format */
347 /* Cipher suite selector types */
348 struct PACKED rt_cipher_suite_struct
{
353 /* Authentication and Key Management suite selector */
354 struct PACKED rt_akm_suite
{
360 struct PACKED rt_rsn_capability
{
362 u16 GTKSAReplayCnt
:2;
363 u16 PTKSAReplayCnt
:2;
368 /*========================================
369 The prototype is defined in cmm_wpa.c
370 ========================================*/
371 BOOLEAN
WpaMsgTypeSubst(u8 EAPType
, int * MsgType
);
377 u8
* data
, int data_len
, u8
* output
, int len
);
379 int PasswordHash(char *password
,
380 unsigned char *ssid
, int ssidlength
, unsigned char *output
);
382 u8
*GetSuiteFromRSNIE(u8
*rsnie
,
383 u32 rsnie_len
, u8 type
, u8
* count
);
385 void WpaShowAllsuite(u8
*rsnie
, u32 rsnie_len
);
387 void RTMPInsertRSNIE(u8
*pFrameBuf
,
388 unsigned long *pFrameLen
,
391 u8
*pmkid_ptr
, u8 pmkid_len
);