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