linux/drivers/staging/rtl8188eu/include/rtw_security.h
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12 * more details.
  13 *
  14 ******************************************************************************/
  15#ifndef __RTW_SECURITY_H_
  16#define __RTW_SECURITY_H_
  17
  18#include <osdep_service.h>
  19#include <drv_types.h>
  20
  21#define _NO_PRIVACY_                    0x0
  22#define _WEP40_                         0x1
  23#define _TKIP_                          0x2
  24#define _TKIP_WTMIC_                    0x3
  25#define _AES_                           0x4
  26#define _WEP104_                        0x5
  27#define _WEP_WPA_MIXED_                 0x07  /*  WEP + WPA */
  28#define _SMS4_                          0x06
  29
  30#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
  31
  32#define _WPA_IE_ID_     0xdd
  33#define _WPA2_IE_ID_    0x30
  34
  35#define SHA256_MAC_LEN 32
  36#define AES_BLOCK_SIZE 16
  37#define AES_PRIV_SIZE (4 * 44)
  38
  39enum {
  40        ENCRYP_PROTOCOL_OPENSYS,   /* open system */
  41        ENCRYP_PROTOCOL_WEP,       /* WEP */
  42        ENCRYP_PROTOCOL_WPA,       /* WPA */
  43        ENCRYP_PROTOCOL_WPA2,      /* WPA2 */
  44        ENCRYP_PROTOCOL_WAPI,      /* WAPI: Not support in this version */
  45        ENCRYP_PROTOCOL_MAX
  46};
  47
  48
  49#ifndef Ndis802_11AuthModeWPA2
  50#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
  51#endif
  52
  53#ifndef Ndis802_11AuthModeWPA2PSK
  54#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
  55#endif
  56
  57union pn48      {
  58        u64     val;
  59
  60#ifdef __LITTLE_ENDIAN
  61        struct {
  62                u8 TSC0;
  63                u8 TSC1;
  64                u8 TSC2;
  65                u8 TSC3;
  66                u8 TSC4;
  67                u8 TSC5;
  68                u8 TSC6;
  69                u8 TSC7;
  70        } _byte_;
  71
  72#elif defined(__BIG_ENDIAN)
  73
  74        struct {
  75                u8 TSC7;
  76                u8 TSC6;
  77                u8 TSC5;
  78                u8 TSC4;
  79                u8 TSC3;
  80                u8 TSC2;
  81                u8 TSC1;
  82                u8 TSC0;
  83        } _byte_;
  84#endif
  85};
  86
  87union Keytype {
  88        u8   skey[16];
  89        u32    lkey[4];
  90};
  91
  92struct rt_pmkid_list {
  93        u8      bUsed;
  94        u8      Bssid[6];
  95        u8      PMKID[16];
  96        u8      SsidBuf[33];
  97        u8      *ssid_octet;
  98        u16     ssid_length;
  99};
 100
 101struct security_priv {
 102        u32       dot11AuthAlgrthm;     /*  802.11 auth, could be open,
 103                                         * shared, 8021x and authswitch
 104                                         */
 105        u32       dot11PrivacyAlgrthm;  /*  This specify the privacy for
 106                                         * shared auth. algorithm.
 107                                         */
 108        /* WEP */
 109        u32       dot11PrivacyKeyIndex; /*  this is only valid for legendary
 110                                         * wep, 0~3 for key id.(tx key index)
 111                                         */
 112        union Keytype dot11DefKey[4];   /*  this is only valid for def. key */
 113        u32     dot11DefKeylen[4];
 114        u32 dot118021XGrpPrivacy;       /*  This specify the privacy algthm.
 115                                         * used for Grp key
 116                                         */
 117        u32     dot118021XGrpKeyid;     /*  key id used for Grp Key
 118                                         * ( tx key index)
 119                                         */
 120        union Keytype   dot118021XGrpKey[4];    /*  802.1x Group Key,
 121                                                 * for inx0 and inx1
 122                                                 */
 123        union Keytype   dot118021XGrptxmickey[4];
 124        union Keytype   dot118021XGrprxmickey[4];
 125        union pn48      dot11Grptxpn;           /* PN48 used for Grp Key xmit.*/
 126        union pn48      dot11Grprxpn;           /* PN48 used for Grp Key recv.*/
 127#ifdef CONFIG_88EU_AP_MODE
 128        /* extend security capabilities for AP_MODE */
 129        unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
 130        unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
 131        unsigned int wpa_group_cipher;
 132        unsigned int wpa2_group_cipher;
 133        unsigned int wpa_pairwise_cipher;
 134        unsigned int wpa2_pairwise_cipher;
 135#endif
 136        u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
 137        int wps_ie_len;
 138        u8      binstallGrpkey;
 139        u8      busetkipkey;
 140        u8      bcheck_grpkey;
 141        u8      bgrpkey_handshake;
 142        s32     hw_decrypted;/* if the rx packets is hw_decrypted==false,i
 143                              * it means the hw has not been ready.
 144                              */
 145
 146        /* keeps the auth_type & enc_status from upper layer
 147         * ioctl(wpa_supplicant or wzc)
 148         */
 149        u32 ndisauthtype;       /*  NDIS_802_11_AUTHENTICATION_MODE */
 150        u32 ndisencryptstatus;  /*  NDIS_802_11_ENCRYPTION_STATUS */
 151        struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
 152        struct ndis_802_11_wep ndiswep;
 153        u8 assoc_info[600];
 154        u8 szofcapability[256]; /* for wpa2 usage */
 155        u8 oidassociation[512]; /* for wpa/wpa2 usage */
 156        u8 authenticator_ie[256];  /* store ap security information element */
 157        u8 supplicant_ie[256];  /* store sta security information element */
 158
 159        /* for tkip countermeasure */
 160        u32 last_mic_err_time;
 161        u8      btkip_countermeasure;
 162        u8      btkip_wait_report;
 163        u32 btkip_countermeasure_time;
 164
 165        /*  */
 166        /*  For WPA2 Pre-Authentication. */
 167        /*  */
 168        struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE];
 169        u8      PMKIDIndex;
 170        u8 bWepDefaultKeyIdxSet;
 171};
 172
 173#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)          \
 174do {                                                                    \
 175        switch (psecuritypriv->dot11AuthAlgrthm) {                      \
 176        case dot11AuthAlgrthm_Open:                                     \
 177        case dot11AuthAlgrthm_Shared:                                   \
 178        case dot11AuthAlgrthm_Auto:                                     \
 179                encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;    \
 180                break;                                                  \
 181        case dot11AuthAlgrthm_8021X:                                    \
 182                if (bmcst)                                              \
 183                        encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
 184                else                                                    \
 185                        encry_algo = (u8)psta->dot118021XPrivacy;       \
 186                break;                                                  \
 187        case dot11AuthAlgrthm_WAPI:                                     \
 188                encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;    \
 189                break;                                                  \
 190        }                                                               \
 191} while (0)
 192
 193#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt)                        \
 194do {                                                                    \
 195        switch (encrypt) {                                              \
 196        case _WEP40_:                                                   \
 197        case _WEP104_:                                                  \
 198                iv_len = 4;                                             \
 199                icv_len = 4;                                            \
 200                break;                                                  \
 201        case _TKIP_:                                                    \
 202                iv_len = 8;                                             \
 203                icv_len = 4;                                            \
 204                break;                                                  \
 205        case _AES_:                                                     \
 206                iv_len = 8;                                             \
 207                icv_len = 8;                                            \
 208                break;                                                  \
 209        case _SMS4_:                                                    \
 210                iv_len = 18;                                            \
 211                icv_len = 16;                                           \
 212                break;                                                  \
 213        default:                                                        \
 214                iv_len = 0;                                             \
 215                icv_len = 0;                                            \
 216                break;                                                  \
 217        }                                                               \
 218} while (0)
 219
 220
 221#define GET_TKIP_PN(iv, dot11txpn)                                      \
 222do {                                                                    \
 223        dot11txpn._byte_.TSC0 = iv[2];                                  \
 224        dot11txpn._byte_.TSC1 = iv[0];                                  \
 225        dot11txpn._byte_.TSC2 = iv[4];                                  \
 226        dot11txpn._byte_.TSC3 = iv[5];                                  \
 227        dot11txpn._byte_.TSC4 = iv[6];                                  \
 228        dot11txpn._byte_.TSC5 = iv[7];                                  \
 229} while (0)
 230
 231
 232#define ROL32(A, n)     (((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
 233#define ROR32(A, n)     ROL32((A), 32-(n))
 234
 235struct mic_data {
 236        u32  K0, K1;         /*  Key */
 237        u32  L, R;           /*  Current state */
 238        u32  M;              /*  Message accumulator (single word) */
 239        u32  nBytesInM;      /*  # bytes in M */
 240};
 241
 242extern const u32 Te0[256];
 243extern const u32 Td0[256];
 244extern const u32 Td1[256];
 245extern const u32 Td2[256];
 246extern const u32 Td3[256];
 247extern const u32 Td4[256];
 248extern const u32 rcon[10];
 249extern const u8 Td4s[256];
 250extern const u8 rcons[10];
 251
 252#define RCON(i) (rcons[(i)] << 24)
 253
 254static inline u32 rotr(u32 val, int bits)
 255{
 256        return (val >> bits) | (val << (32 - bits));
 257}
 258
 259#define TE0(i) Te0[((i) >> 24) & 0xff]
 260#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
 261#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
 262#define TE3(i) rotr(Te0[(i) & 0xff], 24)
 263
 264/* ===== start - public domain SHA256 implementation ===== */
 265
 266/* This is based on SHA256 implementation in LibTomCrypt that was released into
 267 * public domain by Tom St Denis.
 268 */
 269
 270/* the K array */
 271static const unsigned long K[64] = {
 272        0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
 273        0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
 274        0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
 275        0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
 276        0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
 277        0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
 278        0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
 279        0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
 280        0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
 281        0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
 282        0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
 283        0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
 284        0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
 285};
 286
 287/* Various logical functions */
 288#define RORc(x, y) \
 289        (((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y)&31)) | \
 290         ((unsigned long)(x) << (unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
 291#define Ch(x, y, z)       (z ^ (x & (y ^ z)))
 292#define Maj(x, y, z)      (((x | y) & z) | (x & y))
 293#define S(x, n)         RORc((x), (n))
 294#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
 295#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
 296#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
 297#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
 298#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
 299
 300void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key);
 301void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b);
 302void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
 303void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst);
 304void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len,
 305                        u8 *Miccode, u8   priority);
 306u32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe);
 307u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe);
 308void rtw_wep_encrypt(struct adapter *padapter, u8  *pxmitframe);
 309u32 rtw_aes_decrypt(struct adapter *padapter, u8  *precvframe);
 310u32 rtw_tkip_decrypt(struct adapter *padapter, u8  *precvframe);
 311int rtw_wep_decrypt(struct adapter *padapter, u8  *precvframe);
 312
 313#endif  /* __RTL871X_SECURITY_H_ */
 314