blob: 0134ae6097cf1eca20e3997739f9df1b8275c92b [file] [log] [blame]
Greg Kroah-Hartmanc55519f2008-12-17 17:04:23 -08001/*
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#define MIN_LEN_OF_GTK 5
94
95// RSN IE Length definition
96#define MAX_LEN_OF_RSNIE 90
97#define MIN_LEN_OF_RSNIE 8
98
99//EAP Packet Type
100#define EAPPacket 0
101#define EAPOLStart 1
102#define EAPOLLogoff 2
103#define EAPOLKey 3
104#define EAPOLASFAlert 4
105#define EAPTtypeMax 5
106
107#define EAPOL_MSG_INVALID 0
108#define EAPOL_PAIR_MSG_1 1
109#define EAPOL_PAIR_MSG_2 2
110#define EAPOL_PAIR_MSG_3 3
111#define EAPOL_PAIR_MSG_4 4
112#define EAPOL_GROUP_MSG_1 5
113#define EAPOL_GROUP_MSG_2 6
114
115#define PAIRWISEKEY 1
116#define GROUPKEY 0
117
118// Retry timer counter initial value
119#define PEER_MSG1_RETRY_TIMER_CTR 0
120#define PEER_MSG3_RETRY_TIMER_CTR 10
121#define GROUP_MSG1_RETRY_TIMER_CTR 20
122
123
124#define EAPOL_START_DISABLE 0
125#define EAPOL_START_PSK 1
126#define EAPOL_START_1X 2
127
128#define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0)
129#define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0)
130#define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0)
131#define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0)
132
133#define ROUND_UP(__x, __y) \
134 (((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1)))
135
136#define ADD_ONE_To_64BIT_VAR(_V) \
137{ \
138 UCHAR cnt = LEN_KEY_DESC_REPLAY; \
139 do \
140 { \
141 cnt--; \
142 _V[cnt]++; \
143 if (cnt == 0) \
144 break; \
145 }while (_V[cnt] == 0); \
146}
147
148#define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
149
150// EAPOL Key Information definition within Key descriptor format
151typedef struct PACKED _KEY_INFO
152{
153#ifdef RT_BIG_ENDIAN
154 UCHAR KeyAck:1;
155 UCHAR Install:1;
156 UCHAR KeyIndex:2;
157 UCHAR KeyType:1;
158 UCHAR KeyDescVer:3;
159 UCHAR Rsvd:3;
160 UCHAR EKD_DL:1; // EKD for AP; DL for STA
161 UCHAR Request:1;
162 UCHAR Error:1;
163 UCHAR Secure:1;
164 UCHAR KeyMic:1;
165#else
166 UCHAR KeyMic:1;
167 UCHAR Secure:1;
168 UCHAR Error:1;
169 UCHAR Request:1;
170 UCHAR EKD_DL:1; // EKD for AP; DL for STA
171 UCHAR Rsvd:3;
172 UCHAR KeyDescVer:3;
173 UCHAR KeyType:1;
174 UCHAR KeyIndex:2;
175 UCHAR Install:1;
176 UCHAR KeyAck:1;
177#endif
178} KEY_INFO, *PKEY_INFO;
179
180// EAPOL Key descriptor format
181typedef struct PACKED _KEY_DESCRIPTER
182{
183 UCHAR Type;
184 KEY_INFO KeyInfo;
185 UCHAR KeyLength[2];
186 UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY];
187 UCHAR KeyNonce[LEN_KEY_DESC_NONCE];
188 UCHAR KeyIv[LEN_KEY_DESC_IV];
189 UCHAR KeyRsc[LEN_KEY_DESC_RSC];
190 UCHAR KeyId[LEN_KEY_DESC_ID];
191 UCHAR KeyMic[LEN_KEY_DESC_MIC];
192 UCHAR KeyDataLen[2];
193 UCHAR KeyData[MAX_LEN_OF_RSNIE];
194} KEY_DESCRIPTER, *PKEY_DESCRIPTER;
195
196typedef struct PACKED _EAPOL_PACKET
197{
198 UCHAR ProVer;
199 UCHAR ProType;
200 UCHAR Body_Len[2];
201 KEY_DESCRIPTER KeyDesc;
202} EAPOL_PACKET, *PEAPOL_PACKET;
203
204//802.11i D10 page 83
205typedef struct PACKED _GTK_ENCAP
206{
207#ifndef RT_BIG_ENDIAN
208 UCHAR Kid:2;
209 UCHAR tx:1;
210 UCHAR rsv:5;
211 UCHAR rsv1;
212#else
213 UCHAR rsv:5;
214 UCHAR tx:1;
215 UCHAR Kid:2;
216 UCHAR rsv1;
217#endif
218 UCHAR GTK[TKIP_GTK_LENGTH];
219} GTK_ENCAP, *PGTK_ENCAP;
220
221typedef struct PACKED _KDE_ENCAP
222{
223 UCHAR Type;
224 UCHAR Len;
225 UCHAR OUI[3];
226 UCHAR DataType;
227 GTK_ENCAP GTKEncap;
228} KDE_ENCAP, *PKDE_ENCAP;
229
230// For WPA1
231typedef struct PACKED _RSNIE {
232 UCHAR oui[4];
233 USHORT version;
234 UCHAR mcast[4];
235 USHORT ucount;
236 struct PACKED {
237 UCHAR oui[4];
238 }ucast[1];
239} RSNIE, *PRSNIE;
240
241// For WPA2
242typedef struct PACKED _RSNIE2 {
243 USHORT version;
244 UCHAR mcast[4];
245 USHORT ucount;
246 struct PACKED {
247 UCHAR oui[4];
248 }ucast[1];
249} RSNIE2, *PRSNIE2;
250
251// AKM Suite
252typedef struct PACKED _RSNIE_AUTH {
253 USHORT acount;
254 struct PACKED {
255 UCHAR oui[4];
256 }auth[1];
257} RSNIE_AUTH,*PRSNIE_AUTH;
258
259typedef union PACKED _RSN_CAPABILITIES {
260 struct PACKED {
261#ifdef RT_BIG_ENDIAN
262 USHORT Rsvd:10;
263 USHORT GTKSA_R_Counter:2;
264 USHORT PTKSA_R_Counter:2;
265 USHORT No_Pairwise:1;
266 USHORT PreAuth:1;
267#else
268 USHORT PreAuth:1;
269 USHORT No_Pairwise:1;
270 USHORT PTKSA_R_Counter:2;
271 USHORT GTKSA_R_Counter:2;
272 USHORT Rsvd:10;
273#endif
274 } field;
275 USHORT word;
276} RSN_CAPABILITIES, *PRSN_CAPABILITIES;
277
278typedef struct PACKED _EAP_HDR {
279 UCHAR ProVer;
280 UCHAR ProType;
281 UCHAR Body_Len[2];
282 UCHAR code;
283 UCHAR identifier;
284 UCHAR length[2]; // including code and identifier, followed by length-2 octets of data
285} EAP_HDR, *PEAP_HDR;
286
287// For supplicant state machine states. 802.11i Draft 4.1, p. 97
288// We simplified it
289typedef enum _WpaState
290{
291 SS_NOTUSE, // 0
292 SS_START, // 1
293 SS_WAIT_MSG_3, // 2
294 SS_WAIT_GROUP, // 3
295 SS_FINISH, // 4
296 SS_KEYUPDATE, // 5
297} WPA_STATE;
298
299//
300// The definition of the cipher combination
301//
302// bit3 bit2 bit1 bit0
303// +------------+------------+
304// | WPA | WPA2 |
305// +------+-----+------+-----+
306// | TKIP | AES | TKIP | AES |
307// | 0 | 1 | 1 | 0 | -> 0x06
308// | 0 | 1 | 1 | 1 | -> 0x07
309// | 1 | 0 | 0 | 1 | -> 0x09
310// | 1 | 0 | 1 | 1 | -> 0x0B
311// | 1 | 1 | 0 | 1 | -> 0x0D
312// | 1 | 1 | 1 | 0 | -> 0x0E
313// | 1 | 1 | 1 | 1 | -> 0x0F
314// +------+-----+------+-----+
315//
316typedef enum _WpaMixPairCipher
317{
318 MIX_CIPHER_NOTUSE = 0x00,
319 WPA_NONE_WPA2_TKIPAES = 0x03, // WPA2-TKIPAES
320 WPA_AES_WPA2_TKIP = 0x06,
321 WPA_AES_WPA2_TKIPAES = 0x07,
322 WPA_TKIP_WPA2_AES = 0x09,
323 WPA_TKIP_WPA2_TKIPAES = 0x0B,
324 WPA_TKIPAES_WPA2_NONE = 0x0C, // WPA-TKIPAES
325 WPA_TKIPAES_WPA2_AES = 0x0D,
326 WPA_TKIPAES_WPA2_TKIP = 0x0E,
327 WPA_TKIPAES_WPA2_TKIPAES = 0x0F,
328} WPA_MIX_PAIR_CIPHER;
329
330typedef struct PACKED _RSN_IE_HEADER_STRUCT {
331 UCHAR Eid;
332 UCHAR Length;
333 USHORT Version; // Little endian format
334} RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT;
335
336// Cipher suite selector types
337typedef struct PACKED _CIPHER_SUITE_STRUCT {
338 UCHAR Oui[3];
339 UCHAR Type;
340} CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT;
341
342// Authentication and Key Management suite selector
343typedef struct PACKED _AKM_SUITE_STRUCT {
344 UCHAR Oui[3];
345 UCHAR Type;
346} AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT;
347
348// RSN capability
349typedef struct PACKED _RSN_CAPABILITY {
350 USHORT Rsv:10;
351 USHORT GTKSAReplayCnt:2;
352 USHORT PTKSAReplayCnt:2;
353 USHORT NoPairwise:1;
354 USHORT PreAuth:1;
355} RSN_CAPABILITY, *PRSN_CAPABILITY;
356
357#endif