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>
20e0827909a27c5d90bf88f714e108de9419fd8b29Jes Sorensen#include <net/lib80211.h>
21364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
22364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
239e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2aeJes Sorensen#define is_wep_enc(alg) (alg == WLAN_CIPHER_SUITE_WEP40 || \
249e3d6df2df8dbc4c2c5fb733dc494dfc82e0e2aeJes Sorensen			 alg == WLAN_CIPHER_SUITE_WEP104)
25364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
26364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define SHA256_MAC_LEN 32
27364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define AES_BLOCK_SIZE 16
28364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define AES_PRIV_SIZE (4 * 44)
29364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
30364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerenum ENCRYP_PROTOCOL {
31364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_OPENSYS,   /* open system */
32364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WEP,       /* WEP */
33364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WPA,       /* WPA */
34364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WPA2,      /* WPA2 */
35364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_MAX
36364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
37364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
38364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef Ndis802_11AuthModeWPA2
39364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
40364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
41364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
42364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef Ndis802_11AuthModeWPA2PSK
43364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
44364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
45364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
46364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerunion pn48 {
47364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u64	val;
48364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
49364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifdef __LITTLE_ENDIAN
50364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
51364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct {
52364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC0;
53364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC1;
54364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC2;
55364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC3;
56364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC4;
57364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC5;
58364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC6;
59364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC7;
60364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} _byte_;
61364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
62364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#elif defined(__BIG_ENDIAN)
63364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
64364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct {
65364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC7;
66364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC6;
67364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC5;
68364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC4;
69364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC3;
70364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC2;
71364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC1;
72364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC0;
73364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} _byte_;
74364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#else
75364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#error Need BIG or LITTLE endian
76364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
77364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
78364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
79364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
80364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
81364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerunion Keytype {
82364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8   skey[16];
83364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32    lkey[4];
84364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
85364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
86e0827909a27c5d90bf88f714e108de9419fd8b29Jes Sorensenstruct rtw_wep_key {
87e0827909a27c5d90bf88f714e108de9419fd8b29Jes Sorensen	u8 key[WLAN_KEY_LEN_WEP104 + 1]; /* 14 */
88e0827909a27c5d90bf88f714e108de9419fd8b29Jes Sorensen	u16 keylen;
89e0827909a27c5d90bf88f714e108de9419fd8b29Jes Sorensen};
90364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
91364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct rt_pmkid_list {
92364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	bUsed;
93364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	Bssid[6];
94364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	PMKID[16];
95364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	SsidBuf[33];
96364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	*ssid_octet;
97364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u16	ssid_length;
98364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
99364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
100364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct security_priv {
101364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11AuthAlgrthm;	/*  802.11 auth, could be open, shared,
102364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * 8021x and authswitch */
103364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11PrivacyAlgrthm;	/* This specifies the privacy for
104364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * shared auth. algorithm.
105364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
106364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* WEP */
107364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11PrivacyKeyIndex;	/*  this is only valid for legendary
108364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * wep, 0~3 for key id. (tx key index)
109364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
110e0827909a27c5d90bf88f714e108de9419fd8b29Jes Sorensen	struct rtw_wep_key wep_key[NUM_WEP_KEYS];
111364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
112364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 dot118021XGrpPrivacy;	/* specify the privacy algthm.
113364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * used for Grp key
114364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
115364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	dot118021XGrpKeyid;	/*  key id used for Grp Key
116364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * (tx key index)
117364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
118364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrpKey[4];/* 802.1x Grp Key, inx0 and inx1 */
119364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrptxmickey[4];
120364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrprxmickey[4];
121364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union pn48	dot11Grptxpn;		/* PN48 used for Grp Key xmit.*/
122364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union pn48	dot11Grprxpn;		/* PN48 used for Grp Key recv.*/
123364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
124364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifdef CONFIG_8723AU_AP_MODE
125364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* extend security capabilities for AP_MODE */
126364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
127364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
128364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_group_cipher;
129364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa2_group_cipher;
130364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_pairwise_cipher;
131364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa2_pairwise_cipher;
132364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
133364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
134364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
135364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	int wps_ie_len;
1369216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int binstallGrpkey:1;
1379216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int busetkipkey:1;
1389216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int bcheck_grpkey:1;
1399216c517fb0192d1828169d8af2bac59ee8e3173Jes Sorensen	unsigned int hw_decrypted:1;
140364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 ndisauthtype;	/*  enum ndis_802_11_auth_mode */
141364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 ndisencryptstatus;	/*  NDIS_802_11_ENCRYPTION_STATUS */
142364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
143364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 assoc_info[600];
144364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 szofcapability[256]; /* for wpa2 usage */
145364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 oidassociation[512]; /* for wpa/wpa2 usage */
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