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
36
Justin P. Mattock 11/07/2010 Fix a typo
42
/* EAPOL Key descriptor frame format related length */
43
#define LEN_KEY_DESC_NONCE 32
44
#define LEN_KEY_DESC_IV 16
45
#define LEN_KEY_DESC_RSC 8
46
#define LEN_KEY_DESC_ID 8
47
#define LEN_KEY_DESC_REPLAY 8
48
#define LEN_KEY_DESC_MIC 16
50
/* The length is the EAPoL-Key frame except key data field. */
51
/* Please refer to 802.11i-2004 ,Figure 43u in p.78 */
52
#define LEN_EAPOL_KEY_MSG (sizeof(struct rt_key_descripter) - MAX_LEN_OF_RSNIE)
55
#define EAP_CODE_REQUEST 1
56
#define EAP_CODE_RESPONSE 2
57
#define EAP_CODE_SUCCESS 3
58
#define EAP_CODE_FAILURE 4
60
/* EAPOL frame Protocol Version */
64
/* EAPOL-KEY Descriptor Type */
65
#define WPA1_KEY_DESC 0xfe
66
#define WPA2_KEY_DESC 0x02
68
/* Key Descriptor Version of Key Information */
69
#define DESC_TYPE_TKIP 1
70
#define DESC_TYPE_AES 2
72
#define LEN_MSG1_2WAY 0x7f
73
#define MAX_LEN_OF_EAP_HS 256
75
#define LEN_MASTER_KEY 32
79
#define LEN_EAP_MICK 16
80
#define LEN_EAP_KEY ((LEN_EAP_EK)+(LEN_EAP_MICK))
81
/* TKIP key related */
83
#define LEN_TKIP_EK 16
84
#define LEN_TKIP_RXMICK 8
85
#define LEN_TKIP_TXMICK 8
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
#define MIN_LEN_OF_GTK 5
95
#define LEN_PMK_NAME 16
98
/* RSN IE Length definition */
99
#define MAX_LEN_OF_RSNIE 255
100
#define MIN_LEN_OF_RSNIE 8
102
#define KEY_LIFETIME 3600
107
#define EAPOLLogoff 2
109
#define EAPOLASFAlert 4
110
#define EAPTtypeMax 5
112
#define EAPOL_MSG_INVALID 0
113
#define EAPOL_PAIR_MSG_1 1
114
#define EAPOL_PAIR_MSG_2 2
115
#define EAPOL_PAIR_MSG_3 3
116
#define EAPOL_PAIR_MSG_4 4
117
#define EAPOL_GROUP_MSG_1 5
118
#define EAPOL_GROUP_MSG_2 6
120
#define PAIRWISEKEY 1
123
/* Retry timer counter initial value */
124
#define PEER_MSG1_RETRY_TIMER_CTR 0
125
#define PEER_MSG3_RETRY_TIMER_CTR 10
126
#define GROUP_MSG1_RETRY_TIMER_CTR 20
128
/*#ifdef CONFIG_AP_SUPPORT */
129
/* WPA mechanism retry timer interval */
130
#define PEER_MSG1_RETRY_EXEC_INTV 1000 /* 1 sec */
131
#define PEER_MSG3_RETRY_EXEC_INTV 3000 /* 3 sec */
132
#define GROUP_KEY_UPDATE_EXEC_INTV 1000 /* 1 sec */
133
#define PEER_GROUP_KEY_UPDATE_INIV 2000 /* 2 sec */
135
#define ENQUEUE_EAPOL_START_TIMER 200 /* 200 ms */
137
/* group rekey interval */
140
#define DISABLE_REKEY 2
143
#define MAX_REKEY_INTER 0x3ffffff
144
/*#endif // CONFIG_AP_SUPPORT // */
146
#define GROUP_SUITE 0
147
#define PAIRWISE_SUITE 1
151
#define EAPOL_START_DISABLE 0
152
#define EAPOL_START_PSK 1
153
#define EAPOL_START_1X 2
155
#define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0)
156
#define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0)
157
#define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0)
158
#define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0)
161
#define ROUND_UP(__x, __y) \
162
(((unsigned long)((__x)+((__y)-1))) & ((unsigned long)~((__y)-1)))
165
#define SET_u16_TO_ARRARY(_V, _LEN) \
167
_V[0] = (_LEN & 0xFF00) >> 8; \
168
_V[1] = (_LEN & 0xFF); \
171
#define INC_u16_TO_ARRARY(_V, _LEN) \
175
var_len = (_V[0]<<8) | (_V[1]); \
178
_V[0] = (var_len & 0xFF00) >> 8; \
179
_V[1] = (var_len & 0xFF); \
182
#define CONV_ARRARY_TO_u16(_V) ((_V[0]<<8) | (_V[1]))
184
#define ADD_ONE_To_64BIT_VAR(_V) \
186
u8 cnt = LEN_KEY_DESC_REPLAY; \
193
}while (_V[cnt] == 0); \
196
#define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
198
/* EAPOL Key Information definition within Key descriptor format */
199
struct PACKED rt_key_info {
204
u8 EKD_DL:1; /* EKD for AP; DL for STA */
213
/* EAPOL Key descriptor format */
214
struct PACKED rt_key_descripter {
216
struct rt_key_info KeyInfo;
218
u8 ReplayCounter[LEN_KEY_DESC_REPLAY];
219
u8 KeyNonce[LEN_KEY_DESC_NONCE];
220
u8 KeyIv[LEN_KEY_DESC_IV];
221
u8 KeyRsc[LEN_KEY_DESC_RSC];
222
u8 KeyId[LEN_KEY_DESC_ID];
223
u8 KeyMic[LEN_KEY_DESC_MIC];
225
u8 KeyData[MAX_LEN_OF_RSNIE];
228
struct PACKED rt_eapol_packet {
232
struct rt_key_descripter KeyDesc;
235
/*802.11i D10 page 83 */
236
struct PACKED rt_gtk_encap {
241
u8 GTK[TKIP_GTK_LENGTH];
244
struct PACKED rt_kde_encap {
249
struct rt_gtk_encap GTKEncap;
253
struct PACKED rt_rsnie {
264
struct PACKED rt_rsnie2 {
274
struct PACKED rt_rsnie_auth {
281
typedef union PACKED _RSN_CAPABILITIES {
285
u16 PTKSA_R_Counter:2;
286
u16 GTKSA_R_Counter:2;
290
} RSN_CAPABILITIES, *PRSN_CAPABILITIES;
292
struct PACKED rt_eap_hdr {
298
u8 length[2]; /* including code and identifier, followed by length-2 octets of data */
301
/* For supplicant state machine states. 802.11i Draft 4.1, p. 97 */
302
/* We simplified it */
303
typedef enum _WpaState {
306
SS_WAIT_MSG_3, /* 2 */
307
SS_WAIT_GROUP, /* 3 */
309
SS_KEYUPDATE, /* 5 */
313
/* The definition of the cipher combination */
315
/* bit3 bit2 bit1 bit0 */
316
/* +------------+------------+ */
318
/* +------+-----+------+-----+ */
319
/* | TKIP | AES | TKIP | AES | */
320
/* | 0 | 1 | 1 | 0 | -> 0x06 */
321
/* | 0 | 1 | 1 | 1 | -> 0x07 */
322
/* | 1 | 0 | 0 | 1 | -> 0x09 */
323
/* | 1 | 0 | 1 | 1 | -> 0x0B */
324
/* | 1 | 1 | 0 | 1 | -> 0x0D */
325
/* | 1 | 1 | 1 | 0 | -> 0x0E */
326
/* | 1 | 1 | 1 | 1 | -> 0x0F */
327
/* +------+-----+------+-----+ */
329
typedef enum _WpaMixPairCipher {
330
MIX_CIPHER_NOTUSE = 0x00,
331
WPA_NONE_WPA2_TKIPAES = 0x03, /* WPA2-TKIPAES */
332
WPA_AES_WPA2_TKIP = 0x06,
333
WPA_AES_WPA2_TKIPAES = 0x07,
334
WPA_TKIP_WPA2_AES = 0x09,
335
WPA_TKIP_WPA2_TKIPAES = 0x0B,
336
WPA_TKIPAES_WPA2_NONE = 0x0C, /* WPA-TKIPAES */
337
WPA_TKIPAES_WPA2_AES = 0x0D,
338
WPA_TKIPAES_WPA2_TKIP = 0x0E,
339
WPA_TKIPAES_WPA2_TKIPAES = 0x0F,
340
} WPA_MIX_PAIR_CIPHER;
342
struct PACKED rt_rsn_ie_header {
345
u16 Version; /* Little endian format */
348
/* Cipher suite selector types */
349
struct PACKED rt_cipher_suite_struct {
354
/* Authentication and Key Management suite selector */
355
struct PACKED rt_akm_suite {
361
struct PACKED rt_rsn_capability {
363
u16 GTKSAReplayCnt:2;
364
u16 PTKSAReplayCnt:2;
369
/*========================================
370
The prototype is defined in cmm_wpa.c
371
========================================*/
372
BOOLEAN WpaMsgTypeSubst(u8 EAPType, int * MsgType);
378
u8 * data, int data_len, u8 * output, int len);
380
int PasswordHash(char *password,
381
unsigned char *ssid, int ssidlength, unsigned char *output);
383
u8 *GetSuiteFromRSNIE(u8 *rsnie,
384
u32 rsnie_len, u8 type, u8 * count);
386
void WpaShowAllsuite(u8 *rsnie, u32 rsnie_len);
388
void RTMPInsertRSNIE(u8 *pFrameBuf,
389
unsigned long *pFrameLen,
392
u8 *pmkid_ptr, u8 pmkid_len);