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