]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/staging/rt2860/wpa.h
Staging: rt2860: add RT3090 chipset support
[net-next-2.6.git] / drivers / staging / rt2860 / wpa.h
CommitLineData
91980990
GKH
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
91980990
GKH
70
71#define LEN_MSG1_2WAY 0x7f
72#define MAX_LEN_OF_EAP_HS 256
73
74#define LEN_MASTER_KEY 32
75
76// EAPOL EK, MK
77#define LEN_EAP_EK 16
78#define LEN_EAP_MICK 16
79#define LEN_EAP_KEY ((LEN_EAP_EK)+(LEN_EAP_MICK))
80// TKIP key related
81#define LEN_PMKID 16
82#define LEN_TKIP_EK 16
83#define LEN_TKIP_RXMICK 8
84#define LEN_TKIP_TXMICK 8
85#define LEN_AES_EK 16
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))
ca97b838
BZ
92#define MIN_LEN_OF_GTK 5
93#define LEN_PMK 32
94#define LEN_PMK_NAME 16
95#define LEN_NONCE 32
91980990
GKH
96
97// RSN IE Length definition
ca97b838 98#define MAX_LEN_OF_RSNIE 255
91980990
GKH
99#define MIN_LEN_OF_RSNIE 8
100
ca97b838
BZ
101#define KEY_LIFETIME 3600
102
91980990
GKH
103//EAP Packet Type
104#define EAPPacket 0
105#define EAPOLStart 1
106#define EAPOLLogoff 2
107#define EAPOLKey 3
108#define EAPOLASFAlert 4
109#define EAPTtypeMax 5
110
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
118
119#define PAIRWISEKEY 1
120#define GROUPKEY 0
121
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
126
ca97b838
BZ
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
133
134#define ENQUEUE_EAPOL_START_TIMER 200 // 200 ms
135
136// group rekey interval
137#define TIME_REKEY 0
138#define PKT_REKEY 1
139#define DISABLE_REKEY 2
140#define MAX_REKEY 2
141
142#define MAX_REKEY_INTER 0x3ffffff
143//#endif // CONFIG_AP_SUPPORT //
144
145#define GROUP_SUITE 0
146#define PAIRWISE_SUITE 1
147#define AKM_SUITE 2
148#define PMKID_LIST 3
149
91980990
GKH
150
151#define EAPOL_START_DISABLE 0
152#define EAPOL_START_PSK 1
153#define EAPOL_START_1X 2
154
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)
159
ca97b838 160#ifndef ROUND_UP
91980990
GKH
161#define ROUND_UP(__x, __y) \
162 (((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1)))
ca97b838
BZ
163#endif
164
165#define SET_UINT16_TO_ARRARY(_V, _LEN) \
166{ \
167 _V[0] = (_LEN & 0xFF00) >> 8; \
168 _V[1] = (_LEN & 0xFF); \
169}
170
171#define INC_UINT16_TO_ARRARY(_V, _LEN) \
172{ \
173 UINT16 var_len; \
174 \
175 var_len = (_V[0]<<8) | (_V[1]); \
176 var_len += _LEN; \
177 \
178 _V[0] = (var_len & 0xFF00) >> 8; \
179 _V[1] = (var_len & 0xFF); \
180}
181
182#define CONV_ARRARY_TO_UINT16(_V) ((_V[0]<<8) | (_V[1]))
183
91980990
GKH
184
185#define ADD_ONE_To_64BIT_VAR(_V) \
186{ \
187 UCHAR cnt = LEN_KEY_DESC_REPLAY; \
188 do \
189 { \
190 cnt--; \
191 _V[cnt]++; \
192 if (cnt == 0) \
193 break; \
194 }while (_V[cnt] == 0); \
195}
196
197#define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
198
199// EAPOL Key Information definition within Key descriptor format
200typedef struct PACKED _KEY_INFO
201{
91980990
GKH
202 UCHAR KeyMic:1;
203 UCHAR Secure:1;
204 UCHAR Error:1;
205 UCHAR Request:1;
206 UCHAR EKD_DL:1; // EKD for AP; DL for STA
207 UCHAR Rsvd:3;
208 UCHAR KeyDescVer:3;
209 UCHAR KeyType:1;
210 UCHAR KeyIndex:2;
211 UCHAR Install:1;
212 UCHAR KeyAck:1;
91980990
GKH
213} KEY_INFO, *PKEY_INFO;
214
215// EAPOL Key descriptor format
216typedef struct PACKED _KEY_DESCRIPTER
217{
218 UCHAR Type;
219 KEY_INFO KeyInfo;
220 UCHAR KeyLength[2];
221 UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY];
222 UCHAR KeyNonce[LEN_KEY_DESC_NONCE];
223 UCHAR KeyIv[LEN_KEY_DESC_IV];
224 UCHAR KeyRsc[LEN_KEY_DESC_RSC];
225 UCHAR KeyId[LEN_KEY_DESC_ID];
226 UCHAR KeyMic[LEN_KEY_DESC_MIC];
227 UCHAR KeyDataLen[2];
228 UCHAR KeyData[MAX_LEN_OF_RSNIE];
229} KEY_DESCRIPTER, *PKEY_DESCRIPTER;
230
231typedef struct PACKED _EAPOL_PACKET
232{
233 UCHAR ProVer;
234 UCHAR ProType;
235 UCHAR Body_Len[2];
236 KEY_DESCRIPTER KeyDesc;
237} EAPOL_PACKET, *PEAPOL_PACKET;
238
239//802.11i D10 page 83
240typedef struct PACKED _GTK_ENCAP
241{
91980990
GKH
242 UCHAR Kid:2;
243 UCHAR tx:1;
244 UCHAR rsv:5;
245 UCHAR rsv1;
91980990
GKH
246 UCHAR GTK[TKIP_GTK_LENGTH];
247} GTK_ENCAP, *PGTK_ENCAP;
248
249typedef struct PACKED _KDE_ENCAP
250{
251 UCHAR Type;
252 UCHAR Len;
253 UCHAR OUI[3];
254 UCHAR DataType;
255 GTK_ENCAP GTKEncap;
256} KDE_ENCAP, *PKDE_ENCAP;
257
258// For WPA1
259typedef struct PACKED _RSNIE {
260 UCHAR oui[4];
261 USHORT version;
262 UCHAR mcast[4];
263 USHORT ucount;
264 struct PACKED {
265 UCHAR oui[4];
266 }ucast[1];
267} RSNIE, *PRSNIE;
268
269// For WPA2
270typedef struct PACKED _RSNIE2 {
271 USHORT version;
272 UCHAR mcast[4];
273 USHORT ucount;
274 struct PACKED {
275 UCHAR oui[4];
276 }ucast[1];
277} RSNIE2, *PRSNIE2;
278
279// AKM Suite
280typedef struct PACKED _RSNIE_AUTH {
281 USHORT acount;
282 struct PACKED {
283 UCHAR oui[4];
284 }auth[1];
285} RSNIE_AUTH,*PRSNIE_AUTH;
286
287typedef union PACKED _RSN_CAPABILITIES {
288 struct PACKED {
91980990
GKH
289 USHORT PreAuth:1;
290 USHORT No_Pairwise:1;
291 USHORT PTKSA_R_Counter:2;
292 USHORT GTKSA_R_Counter:2;
293 USHORT Rsvd:10;
91980990
GKH
294 } field;
295 USHORT word;
296} RSN_CAPABILITIES, *PRSN_CAPABILITIES;
297
298typedef struct PACKED _EAP_HDR {
299 UCHAR ProVer;
300 UCHAR ProType;
301 UCHAR Body_Len[2];
302 UCHAR code;
303 UCHAR identifier;
304 UCHAR length[2]; // including code and identifier, followed by length-2 octets of data
305} EAP_HDR, *PEAP_HDR;
306
307// For supplicant state machine states. 802.11i Draft 4.1, p. 97
308// We simplified it
309typedef enum _WpaState
310{
311 SS_NOTUSE, // 0
312 SS_START, // 1
313 SS_WAIT_MSG_3, // 2
314 SS_WAIT_GROUP, // 3
315 SS_FINISH, // 4
316 SS_KEYUPDATE, // 5
317} WPA_STATE;
318
319//
320// The definition of the cipher combination
321//
322// bit3 bit2 bit1 bit0
323// +------------+------------+
324// | WPA | WPA2 |
325// +------+-----+------+-----+
326// | TKIP | AES | TKIP | AES |
327// | 0 | 1 | 1 | 0 | -> 0x06
328// | 0 | 1 | 1 | 1 | -> 0x07
329// | 1 | 0 | 0 | 1 | -> 0x09
330// | 1 | 0 | 1 | 1 | -> 0x0B
331// | 1 | 1 | 0 | 1 | -> 0x0D
332// | 1 | 1 | 1 | 0 | -> 0x0E
333// | 1 | 1 | 1 | 1 | -> 0x0F
334// +------+-----+------+-----+
335//
336typedef enum _WpaMixPairCipher
337{
338 MIX_CIPHER_NOTUSE = 0x00,
339 WPA_NONE_WPA2_TKIPAES = 0x03, // WPA2-TKIPAES
340 WPA_AES_WPA2_TKIP = 0x06,
341 WPA_AES_WPA2_TKIPAES = 0x07,
342 WPA_TKIP_WPA2_AES = 0x09,
343 WPA_TKIP_WPA2_TKIPAES = 0x0B,
344 WPA_TKIPAES_WPA2_NONE = 0x0C, // WPA-TKIPAES
345 WPA_TKIPAES_WPA2_AES = 0x0D,
346 WPA_TKIPAES_WPA2_TKIP = 0x0E,
347 WPA_TKIPAES_WPA2_TKIPAES = 0x0F,
348} WPA_MIX_PAIR_CIPHER;
349
350typedef struct PACKED _RSN_IE_HEADER_STRUCT {
351 UCHAR Eid;
352 UCHAR Length;
353 USHORT Version; // Little endian format
354} RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT;
355
356// Cipher suite selector types
357typedef struct PACKED _CIPHER_SUITE_STRUCT {
358 UCHAR Oui[3];
359 UCHAR Type;
360} CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT;
361
362// Authentication and Key Management suite selector
363typedef struct PACKED _AKM_SUITE_STRUCT {
364 UCHAR Oui[3];
365 UCHAR Type;
366} AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT;
367
368// RSN capability
369typedef struct PACKED _RSN_CAPABILITY {
370 USHORT Rsv:10;
371 USHORT GTKSAReplayCnt:2;
372 USHORT PTKSAReplayCnt:2;
373 USHORT NoPairwise:1;
374 USHORT PreAuth:1;
375} RSN_CAPABILITY, *PRSN_CAPABILITY;
376
ca97b838
BZ
377
378/*========================================
379 The prototype is defined in cmm_wpa.c
380 ========================================*/
381BOOLEAN WpaMsgTypeSubst(
382 IN UCHAR EAPType,
383 OUT INT *MsgType);
384
385VOID PRF(
386 IN UCHAR *key,
387 IN INT key_len,
388 IN UCHAR *prefix,
389 IN INT prefix_len,
390 IN UCHAR *data,
391 IN INT data_len,
392 OUT UCHAR *output,
393 IN INT len);
394
395int PasswordHash(
396 char *password,
397 unsigned char *ssid,
398 int ssidlength,
399 unsigned char *output);
400
401PUINT8 GetSuiteFromRSNIE(
402 IN PUINT8 rsnie,
403 IN UINT rsnie_len,
404 IN UINT8 type,
405 OUT UINT8 *count);
406
407VOID WpaShowAllsuite(
408 IN PUINT8 rsnie,
409 IN UINT rsnie_len);
410
411VOID RTMPInsertRSNIE(
412 IN PUCHAR pFrameBuf,
413 OUT PULONG pFrameLen,
414 IN PUINT8 rsnie_ptr,
415 IN UINT8 rsnie_len,
416 IN PUINT8 pmkid_ptr,
417 IN UINT8 pmkid_len);
418
419
91980990 420#endif