Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[linux-2.6] / drivers / staging / rt2860 / wpa.h
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
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
151 typedef 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
181 typedef 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
196 typedef 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
205 typedef 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
221 typedef 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
231 typedef 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
242 typedef 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
252 typedef struct PACKED _RSNIE_AUTH {
253     USHORT acount;
254     struct PACKED {
255         UCHAR oui[4];
256     }auth[1];
257 } RSNIE_AUTH,*PRSNIE_AUTH;
258
259 typedef 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
278 typedef 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
289 typedef 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 //
316 typedef 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
330 typedef 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
337 typedef 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
343 typedef struct PACKED _AKM_SUITE_STRUCT {
344         UCHAR           Oui[3];
345         UCHAR           Type;
346 }       AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT;
347
348 // RSN capability
349 typedef 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