rtw_security.h revision 364e30ebd2dbaccba430c603da03e68746eb932a
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
22364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _NO_PRIVACY_		0x0
23364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _WEP40_			0x1
24364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _TKIP_			0x2
25364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _TKIP_WTMIC_		0x3
26364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _AES_			0x4
27364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _WEP104_		0x5
28364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _WEP_WPA_MIXED_	0x07  /*  WEP + WPA */
29364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _SMS4_			0x06
30364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
31364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
32364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
33364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _WPA_IE_ID_	0xdd
34364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define _WPA2_IE_ID_	0x30
35364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
36364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define SHA256_MAC_LEN 32
37364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define AES_BLOCK_SIZE 16
38364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define AES_PRIV_SIZE (4 * 44)
39364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
40364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerenum ENCRYP_PROTOCOL {
41364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_OPENSYS,   /* open system */
42364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WEP,       /* WEP */
43364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WPA,       /* WPA */
44364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_WPA2,      /* WPA2 */
45364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	ENCRYP_PROTOCOL_MAX
46364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
47364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
48364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef Ndis802_11AuthModeWPA2
49364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
50364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
51364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
52364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef Ndis802_11AuthModeWPA2PSK
53364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
54364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
55364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
56364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerunion pn48 {
57364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u64	val;
58364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
59364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifdef __LITTLE_ENDIAN
60364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
61364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct {
62364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC0;
63364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC1;
64364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC2;
65364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC3;
66364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC4;
67364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC5;
68364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC6;
69364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC7;
70364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} _byte_;
71364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
72364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#elif defined(__BIG_ENDIAN)
73364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
74364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct {
75364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC7;
76364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC6;
77364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC5;
78364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC4;
79364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC3;
80364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC2;
81364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC1;
82364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 TSC0;
83364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} _byte_;
84364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#else
85364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#error Need BIG or LITTLE endian
86364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
87364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
88364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
89364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
90364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
91364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerunion Keytype {
92364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8   skey[16];
93364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32    lkey[4];
94364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
95364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
96364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
97364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct rt_pmkid_list {
98364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	bUsed;
99364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	Bssid[6];
100364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	PMKID[16];
101364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	SsidBuf[33];
102364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	*ssid_octet;
103364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u16	ssid_length;
104364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
105364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
106364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct security_priv {
107364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11AuthAlgrthm;	/*  802.11 auth, could be open, shared,
108364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * 8021x and authswitch */
109364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11PrivacyAlgrthm;	/* This specifies the privacy for
110364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * shared auth. algorithm.
111364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
112364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* WEP */
113364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	  dot11PrivacyKeyIndex;	/*  this is only valid for legendary
114364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * wep, 0~3 for key id. (tx key index)
115364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
116364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype dot11DefKey[4];	/*  this is only valid for def. key */
117364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	dot11DefKeylen[4];
118364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
119364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 dot118021XGrpPrivacy;	/* specify the privacy algthm.
120364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * used for Grp key
121364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
122364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32	dot118021XGrpKeyid;	/*  key id used for Grp Key
123364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 * (tx key index)
124364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger					 */
125364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrpKey[4];/* 802.1x Grp Key, inx0 and inx1 */
126364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrptxmickey[4];
127364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union Keytype	dot118021XGrprxmickey[4];
128364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union pn48	dot11Grptxpn;		/* PN48 used for Grp Key xmit.*/
129364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	union pn48	dot11Grprxpn;		/* PN48 used for Grp Key recv.*/
130364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
131364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifdef CONFIG_8723AU_AP_MODE
132364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* extend security capabilities for AP_MODE */
133364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
134364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
135364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_group_cipher;
136364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa2_group_cipher;
137364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa_pairwise_cipher;
138364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned int wpa2_pairwise_cipher;
139364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
140364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
141364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
142364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	int wps_ie_len;
143364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	binstallGrpkey;
144364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	busetkipkey;
145364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	bcheck_grpkey;
146364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	bgrpkey_handshake;
147364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	s32	hw_decrypted;
148364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 ndisauthtype;	/*  enum ndis_802_11_auth_mode */
149364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 ndisencryptstatus;	/*  NDIS_802_11_ENCRYPTION_STATUS */
150364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
151364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct ndis_802_11_wep ndiswep;
152364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 assoc_info[600];
153364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 szofcapability[256]; /* for wpa2 usage */
154364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 oidassociation[512]; /* for wpa/wpa2 usage */
155364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 authenticator_ie[256];  /* store ap security information element */
156364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 supplicant_ie[256];  /* store sta security information element */
157364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
158364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/* for tkip countermeasure */
159364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned long last_mic_err_time;
160364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	btkip_countermeasure;
161364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8	btkip_wait_report;
162364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	unsigned long btkip_countermeasure_time;
163364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
164364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	/*  For WPA2 Pre-Authentication. */
165364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE];
166364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 PMKIDIndex;
167364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 bWepDefaultKeyIdxSet;
168364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
169364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
170364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct sha256_state {
171364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u64 length;
172364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32 state[8], curlen;
173364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u8 buf[64];
174364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
175364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
176364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\
177364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerdo {\
178364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	switch (psecuritypriv->dot11AuthAlgrthm) {\
179364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_Open:\
180364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_Shared:\
181364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_Auto:\
182364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\
183364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		break;\
184364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	case dot11AuthAlgrthm_8021X:\
185364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		if (bmcst)\
186364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
187364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		else\
188364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			encry_algo = (u8)psta->dot118021XPrivacy;\
189364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		break;\
190364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	}	\
191364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} while (0)
192364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
193364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define GET_TKIP_PN(iv, dot11txpn)\
194364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerdo {\
195364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC0 = iv[2];\
196364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC1 = iv[0];\
197364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC2 = iv[4];\
198364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC3 = iv[5];\
199364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC4 = iv[6];\
200364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	dot11txpn._byte_.TSC5 = iv[7];\
201364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger} while (0)
202364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
203364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define ROL32(A, n)  (((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
204364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define ROR32(A, n)  ROL32((A), 32-(n))
205364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
206364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstruct mic_data {
207364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32  K0, K1;         /*  Key */
208364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32  L, R;           /*  Current state */
209364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32  M;              /*  Message accumulator (single word) */
210364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	u32     nBytesInM;      /*  # bytes in M */
211364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
212364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
213364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te0[256];
214364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te1[256];
215364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te2[256];
216364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te3[256];
217364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Te4[256];
218364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td0[256];
219364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td1[256];
220364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td2[256];
221364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td3[256];
222364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 Td4[256];
223364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u32 rcon[10];
224364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u8 Td4s[256];
225364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerextern const u8 rcons[10];
226364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
227364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define RCON(i) (rcons[(i)] << 24)
228364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
229364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstatic inline u32 rotr(u32 val, int bits)
230364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger{
231364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	return (val >> bits) | (val << (32 - bits));
232364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger}
233364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
234364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE0(i) Te0[((i) >> 24) & 0xff]
235364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
236364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
237364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE3(i) rotr(Te0[(i) & 0xff], 24)
238364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
239364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
240364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
241364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
242364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
243364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
244364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
245364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
246364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
247364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
248364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD0(i) Td0[((i) >> 24) & 0xff]
249364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
250364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
251364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD3(i) rotr(Td0[(i) & 0xff], 24)
252364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
253364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
254364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
255364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD44(i) (Td4s[(i) & 0xff])
256364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD0_(i) Td0[(i) & 0xff]
257364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD1_(i) rotr(Td0[(i) & 0xff], 8)
258364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD2_(i) rotr(Td0[(i) & 0xff], 16)
259364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define TD3_(i) rotr(Td0[(i) & 0xff], 24)
260364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
261364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
262364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
263364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
264364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define PUTU32(ct, st) { \
265364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
266364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
267364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
268364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
269364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			 (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
270364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
271364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_PUT_LE16(a, val)			\
272364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	do {					\
273364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[1] = ((u16) (val)) >> 8;	\
274364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[0] = ((u16) (val)) & 0xff;	\
275364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	} while (0)
276364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
277364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_PUT_BE32(a, val)					\
278364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	do {							\
279364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
280364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
281364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
282364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[3] = (u8) (((u32) (val)) & 0xff);		\
283364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	} while (0)
284364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
285364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define WPA_PUT_BE64(a, val)				\
286364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	do {						\
287364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[0] = (u8) (((u64) (val)) >> 56);	\
288364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[1] = (u8) (((u64) (val)) >> 48);	\
289364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[2] = (u8) (((u64) (val)) >> 40);	\
290364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[3] = (u8) (((u64) (val)) >> 32);	\
291364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[4] = (u8) (((u64) (val)) >> 24);	\
292364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[5] = (u8) (((u64) (val)) >> 16);	\
293364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[6] = (u8) (((u64) (val)) >> 8);	\
294364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		(a)[7] = (u8) (((u64) (val)) & 0xff);	\
295364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	} while (0)
296364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
297364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* ===== start - public domain SHA256 implementation ===== */
298364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
299364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* This is based on SHA256 implementation in LibTomCrypt that was released into
300364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger * public domain by Tom St Denis. */
301364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
302364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* the K array */
303364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingerstatic const unsigned long K[64] = {
304364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
305364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
306364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
307364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
308364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
309364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
310364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
311364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
312364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
313364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
314364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
315364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
316364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
317364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger};
318364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
319364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger/* Various logical functions */
320364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define RORc(x, y) \
321364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger(((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
322364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger((unsigned long)(x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
323364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Ch(x, y, z)     (z ^ (x & (y ^ z)))
324364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Maj(x, y, z)    (((x | y) & z) | (x & y))
325364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define S(x, n)         RORc((x), (n))
326364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
327364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
328364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
329364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
330364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
331364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#ifndef MIN
332364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#define MIN(x, y) (((x) < (y)) ? (x) : (y))
333364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif
334364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
335364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secmicsetkey23a(struct mic_data *pmicdata, u8 *key);
336364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secmicappend23abyte23a(struct mic_data *pmicdata, u8 b);
337364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secmicappend23a(struct mic_data *pmicdata, u8 *src, u32 nbBytes);
338364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_secgetmic23a(struct mic_data *pmicdata, u8 *dst);
339364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
340364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_seccalctkipmic23a(u8 *key, u8 *header, u8 *data, u32 data_len,
341364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger			u8 *Miccode, u8 priorityi);
342364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
343364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingeru32 rtw_aes_encrypt23a(struct rtw_adapter *padapter,
344364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		    struct xmit_frame *pxmitframe);
345364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingeru32 rtw_tkip_encrypt23a(struct rtw_adapter *padapter,
346364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		     struct xmit_frame *pxmitframe);
347364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_wep_encrypt23a(struct rtw_adapter *padapter,
348364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		     struct xmit_frame *pxmitframe);
349364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingeru32 rtw_aes_decrypt23a(struct rtw_adapter *padapter,
350364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		    struct recv_frame *precvframe);
351364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingeru32 rtw_tkip_decrypt23a(struct rtw_adapter *padapter,
352364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger		     struct recv_frame *precvframe);
353364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_wep_decrypt23a(struct rtw_adapter *padapter, struct recv_frame *precvframe);
354364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
355364e30ebd2dbaccba430c603da03e68746eb932aLarry Fingervoid rtw_use_tkipkey_handler23a(void *FunctionContext);
356364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger
357364e30ebd2dbaccba430c603da03e68746eb932aLarry Finger#endif	/* __RTL871X_SECURITY_H_ */
358