rtw_security.h revision 9e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2ae
1364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/******************************************************************************
2364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger *
3364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger *
5364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * This program is free software; you can redistribute it and/or modify it
6364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * under the terms of version 2 of the GNU General Public License as
7364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * published by the Free Software Foundation.
8364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger *
9364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
10364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * more details.
13364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger *
14364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger ******************************************************************************/
15364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef __RTW_SECURITY_H_
16364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define __RTW_SECURITY_H_
17364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
18364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#include <osdep_service.h>
19364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#include <drv_types.h>
20364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
21364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
229e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2aeJes Sorensen#define is_wep_enc(alg) (alg == WLAN_CIPHER_SUITE_WEP40 || \
239e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2aeJes Sorensen			 alg == WLAN_CIPHER_SUITE_WEP104)
24364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
25364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _WPA2_IE_ID_	0x30
26364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
27364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define SHA256_MAC_LEN 32
28364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define AES_BLOCK_SIZE 16
29364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define AES_PRIV_SIZE (4 * 44)
30364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
31364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerenum ENCRYP_PROTOCOL {
32364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_OPENSYS,   /* open system */
33364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WEP,       /* WEP */
34364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WPA,       /* WPA */
35364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WPA2,      /* WPA2 */
36364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_MAX
37364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
38364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
39364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef Ndis802_11AuthModeWPA2
40364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
41364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
42364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
43364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef Ndis802_11AuthModeWPA2PSK
44364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
45364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
46364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
47364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerunion pn48 {
48364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u64	val;
49364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
50364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifdef __LITTLE_ENDIAN
51364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
52364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct {
53364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC0;
54364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC1;
55364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC2;
56364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC3;
57364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC4;
58364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC5;
59364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC6;
60364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC7;
61364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} _byte_;
62364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
63364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#elif defined(__BIG_ENDIAN)
64364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
65364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct {
66364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC7;
67364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC6;
68364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC5;
69364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC4;
70364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC3;
71364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC2;
72364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC1;
73364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC0;
74364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} _byte_;
75364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#else
76364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#error Need BIG or LITTLE endian
77364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
78364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
79364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
80364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
81364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
82364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerunion Keytype {
83364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8   skey[16];
84364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32    lkey[4];
85364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
86364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
87364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
88364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct rt_pmkid_list {
89364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	bUsed;
90364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	Bssid[6];
91364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	PMKID[16];
92364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	SsidBuf[33];
93364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	*ssid_octet;
94364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u16	ssid_length;
95364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
96364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
97364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct security_priv {
98364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11AuthAlgrthm;	/*  802.11 auth, could be open, shared,
99364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * 8021x and authswitch */
100364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11PrivacyAlgrthm;	/* This specifies the privacy for
101364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * shared auth. algorithm.
102364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
103364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* WEP */
104364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11PrivacyKeyIndex;	/*  this is only valid for legendary
105364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * wep, 0~3 for key id. (tx key index)
106364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
107364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype dot11DefKey[4];	/*  this is only valid for def. key */
108364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	dot11DefKeylen[4];
109364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
110364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 dot118021XGrpPrivacy;	/* specify the privacy algthm.
111364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * used for Grp key
112364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
113364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	dot118021XGrpKeyid;	/*  key id used for Grp Key
114364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * (tx key index)
115364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
116364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrpKey[4];/* 802.1x Grp Key, inx0 and inx1 */
117364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrptxmickey[4];
118364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrprxmickey[4];
119364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union pn48	dot11Grptxpn;		/* PN48 used for Grp Key xmit.*/
120364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union pn48	dot11Grprxpn;		/* PN48 used for Grp Key recv.*/
121364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
122364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifdef CONFIG_8723AU_AP_MODE
123364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* extend security capabilities for AP_MODE */
124364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
125364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
126364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_group_cipher;
127364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa2_group_cipher;
128364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_pairwise_cipher;
129364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa2_pairwise_cipher;
130364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
131364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
132364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
133364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	int wps_ie_len;
1349216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int binstallGrpkey:1;
1359216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int busetkipkey:1;
1369216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int bcheck_grpkey:1;
1379216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int hw_decrypted:1;
138364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 ndisauthtype;	/*  enum ndis_802_11_auth_mode */
139364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 ndisencryptstatus;	/*  NDIS_802_11_ENCRYPTION_STATUS */
140364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
141364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct ndis_802_11_wep ndiswep;
142364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 assoc_info[600];
143364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 szofcapability[256]; /* for wpa2 usage */
144364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 oidassociation[512]; /* for wpa/wpa2 usage */
145364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 authenticator_ie[256];  /* store ap security information element */
146364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 supplicant_ie[256];  /* store sta security information element */
147364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
148364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* for tkip countermeasure */
149364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned long last_mic_err_time;
150364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	btkip_countermeasure;
151364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	btkip_wait_report;
152364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned long btkip_countermeasure_time;
153364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
154364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/*  For WPA2 Pre-Authentication. */
155364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE];
156364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 PMKIDIndex;
157364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 bWepDefaultKeyIdxSet;
158364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
159364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
160364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct sha256_state {
161364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u64 length;
162364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 state[8], curlen;
163364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 buf[64];
164364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
165364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
166364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\
167364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerdo {\
168364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	switch (psecuritypriv->dot11AuthAlgrthm) {\
169364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_Open:\
170364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_Shared:\
171364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_Auto:\
1727989bcf3e21683f413dd1488718166d3ff474bf3Jes Sorensen		encry_algo = psecuritypriv->dot11PrivacyAlgrthm;\
173364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		break;\
174364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_8021X:\
175364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		if (bmcst)\
1767989bcf3e21683f413dd1488718166d3ff474bf3Jes Sorensen			encry_algo = psecuritypriv->dot118021XGrpPrivacy;\
177364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		else\
1787989bcf3e21683f413dd1488718166d3ff474bf3Jes Sorensen			encry_algo = psta->dot118021XPrivacy;\
179364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		break;\
180364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	}	\
181364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} while (0)
182364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
183364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define GET_TKIP_PN(iv, dot11txpn)\
184364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerdo {\
185364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC0 = iv[2];\
186364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC1 = iv[0];\
187364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC2 = iv[4];\
188364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC3 = iv[5];\
189364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC4 = iv[6];\
190364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC5 = iv[7];\
191364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} while (0)
192364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
193364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define ROL32(A, n)  (((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
194364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define ROR32(A, n)  ROL32((A), 32-(n))
195364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
196364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct mic_data {
197364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32  K0, K1;         /*  Key */
198364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32  L, R;           /*  Current state */
199364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32  M;              /*  Message accumulator (single word) */
200364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32     nBytesInM;      /*  # bytes in M */
201364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
202364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
203364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te0[256];
204364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te1[256];
205364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te2[256];
206364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te3[256];
207364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te4[256];
208364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td0[256];
209364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td1[256];
210364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td2[256];
211364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td3[256];
212364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td4[256];
213364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 rcon[10];
214364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u8 Td4s[256];
215364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u8 rcons[10];
216364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
217364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define RCON(i) (rcons[(i)] << 24)
218364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
219364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstatic inline u32 rotr(u32 val, int bits)
220364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger{
221364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	return (val >> bits) | (val << (32 - bits));
222364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger}
223364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
224364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE0(i) Te0[((i) >> 24) & 0xff]
225364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
226364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
227364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE3(i) rotr(Te0[(i) & 0xff], 24)
228364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
229364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
230364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
231364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
232364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
233364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
234364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
235364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
236364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
237364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
238364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD0(i) Td0[((i) >> 24) & 0xff]
239364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
240364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
241364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD3(i) rotr(Td0[(i) & 0xff], 24)
242364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
243364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
244364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
245364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD44(i) (Td4s[(i) & 0xff])
246364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD0_(i) Td0[(i) & 0xff]
247364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD1_(i) rotr(Td0[(i) & 0xff], 8)
248364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD2_(i) rotr(Td0[(i) & 0xff], 16)
249364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD3_(i) rotr(Td0[(i) & 0xff], 24)
250364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
251364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
252364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
253364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
254364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define PUTU32(ct, st) { \
255364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
256364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
257364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
258364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
259364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			 (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
260364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
261364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_PUT_LE16(a, val)			\
262364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	do {					\
263364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[1] = ((u16) (val)) >> 8;	\
264364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[0] = ((u16) (val)) & 0xff;	\
265364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	} while (0)
266364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
267364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_PUT_BE32(a, val)					\
268364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	do {							\
269364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
270364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
271364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
272364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[3] = (u8) (((u32) (val)) & 0xff);		\
273364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	} while (0)
274364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
275364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_PUT_BE64(a, val)				\
276364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	do {						\
277364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[0] = (u8) (((u64) (val)) >> 56);	\
278364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[1] = (u8) (((u64) (val)) >> 48);	\
279364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[2] = (u8) (((u64) (val)) >> 40);	\
280364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[3] = (u8) (((u64) (val)) >> 32);	\
281364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[4] = (u8) (((u64) (val)) >> 24);	\
282364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[5] = (u8) (((u64) (val)) >> 16);	\
283364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[6] = (u8) (((u64) (val)) >> 8);	\
284364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[7] = (u8) (((u64) (val)) & 0xff);	\
285364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	} while (0)
286364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
287364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* ===== start - public domain SHA256 implementation ===== */
288364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
289364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* This is based on SHA256 implementation in LibTomCrypt that was released into
290364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * public domain by Tom St Denis. */
291364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
292364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* the K array */
293364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstatic const unsigned long K[64] = {
294364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
295364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
296364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
297364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
298364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
299364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
300364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
301364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
302364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
303364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
304364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
305364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
306364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
307364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
308364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
309364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secmicsetkey23a(struct mic_data *pmicdata, u8 *key);
310364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secmicappend23abyte23a(struct mic_data *pmicdata, u8 b);
311364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secmicappend23a(struct mic_data *pmicdata, u8 *src, u32 nbBytes);
312364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secgetmic23a(struct mic_data *pmicdata, u8 *dst);
313364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
314364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_seccalctkipmic23a(u8 *key, u8 *header, u8 *data, u32 data_len,
315364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			u8 *Miccode, u8 priorityi);
316364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
31775f3f039563c85e6dc89e937e253051a07336348Jes Sorensenint rtw_aes_encrypt23a(struct rtw_adapter *padapter,
318364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		    struct xmit_frame *pxmitframe);
31975f3f039563c85e6dc89e937e253051a07336348Jes Sorensenint rtw_tkip_encrypt23a(struct rtw_adapter *padapter,
320364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		     struct xmit_frame *pxmitframe);
321364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_wep_encrypt23a(struct rtw_adapter *padapter,
322364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		     struct xmit_frame *pxmitframe);
32375f3f039563c85e6dc89e937e253051a07336348Jes Sorensenint rtw_aes_decrypt23a(struct rtw_adapter *padapter,
324364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		    struct recv_frame *precvframe);
32575f3f039563c85e6dc89e937e253051a07336348Jes Sorensenint rtw_tkip_decrypt23a(struct rtw_adapter *padapter,
326364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		     struct recv_frame *precvframe);
327364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_wep_decrypt23a(struct rtw_adapter *padapter, struct recv_frame *precvframe);
328364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
329364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_use_tkipkey_handler23a(void *FunctionContext);
330364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
331364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif	/* __RTL871X_SECURITY_H_ */
332