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        u32       dot11PrivacyAlgrthm;  /*  This specify the privacy for
 105                                         * shared auth. algorithm. */
 106        /* WEP */
 107        u32       dot11PrivacyKeyIndex; /*  this is only valid for legendary
 108                                         * wep, 0~3 for key id.(tx key index) */
 109        union Keytype dot11DefKey[4];   /*  this is only valid for def. key */
 110        u32     dot11DefKeylen[4];
 111        u32 dot118021XGrpPrivacy;       /*  This specify the privacy algthm.
 112                                         * used for Grp key */
 113        u32     dot118021XGrpKeyid;     /*  key id used for Grp Key
 114                                         * ( tx key index) */
 115        union Keytype   dot118021XGrpKey[4];    /*  802.1x Group Key,
 116                                                 * for inx0 and inx1 */
 117        union Keytype   dot118021XGrptxmickey[4];
 118        union Keytype   dot118021XGrprxmickey[4];
 119        union pn48      dot11Grptxpn;           /* PN48 used for Grp Key xmit.*/
 120        union pn48      dot11Grprxpn;           /* PN48 used for Grp Key recv.*/
 121#ifdef CONFIG_88EU_AP_MODE
 122        /* extend security capabilities for AP_MODE */
 123        unsigned int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
 124        unsigned int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
 125        unsigned int wpa_group_cipher;
 126        unsigned int wpa2_group_cipher;
 127        unsigned int wpa_pairwise_cipher;
 128        unsigned int wpa2_pairwise_cipher;
 129#endif
 130        u8 wps_ie[MAX_WPS_IE_LEN];/* added in assoc req */
 131        int wps_ie_len;
 132        u8      binstallGrpkey;
 133        u8      busetkipkey;
 134        u8      bcheck_grpkey;
 135        u8      bgrpkey_handshake;
 136        s32     sw_encrypt;/* from registry_priv */
 137        s32     sw_decrypt;/* from registry_priv */
 138        s32     hw_decrypted;/* if the rx packets is hw_decrypted==false,i
 139                              * it means the hw has not been ready. */
 140
 141        /* keeps the auth_type & enc_status from upper layer
 142         * ioctl(wpa_supplicant or wzc) */
 143        u32 ndisauthtype;       /*  NDIS_802_11_AUTHENTICATION_MODE */
 144        u32 ndisencryptstatus;  /*  NDIS_802_11_ENCRYPTION_STATUS */
 145        struct wlan_bssid_ex sec_bss;  /* for joinbss (h2c buffer) usage */
 146        struct ndis_802_11_wep ndiswep;
 147        u8 assoc_info[600];
 148        u8 szofcapability[256]; /* for wpa2 usage */
 149        u8 oidassociation[512]; /* for wpa/wpa2 usage */
 150        u8 authenticator_ie[256];  /* store ap security information element */
 151        u8 supplicant_ie[256];  /* store sta security information element */
 152
 153        /* for tkip countermeasure */
 154        u32 last_mic_err_time;
 155        u8      btkip_countermeasure;
 156        u8      btkip_wait_report;
 157        u32 btkip_countermeasure_time;
 158
 159        /*  */
 160        /*  For WPA2 Pre-Authentication. */
 161        /*  */
 162        struct rt_pmkid_list PMKIDList[NUM_PMKID_CACHE];
 163        u8      PMKIDIndex;
 164        u8 bWepDefaultKeyIdxSet;
 165};
 166
 167#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)          \
 168do {                                                                    \
 169        switch (psecuritypriv->dot11AuthAlgrthm) {                      \
 170        case dot11AuthAlgrthm_Open:                                     \
 171        case dot11AuthAlgrthm_Shared:                                   \
 172        case dot11AuthAlgrthm_Auto:                                     \
 173                encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;    \
 174                break;                                                  \
 175        case dot11AuthAlgrthm_8021X:                                    \
 176                if (bmcst)                                              \
 177                        encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
 178                else                                                    \
 179                        encry_algo = (u8)psta->dot118021XPrivacy;       \
 180                break;                                                  \
 181        case dot11AuthAlgrthm_WAPI:                                     \
 182                encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;    \
 183                break;                                                  \
 184        }                                                               \
 185} while (0)
 186
 187#define SET_ICE_IV_LEN(iv_len, icv_len, encrypt)                        \
 188do {                                                                    \
 189        switch (encrypt) {                                              \
 190        case _WEP40_:                                                   \
 191        case _WEP104_:                                                  \
 192                iv_len = 4;                                             \
 193                icv_len = 4;                                            \
 194                break;                                                  \
 195        case _TKIP_:                                                    \
 196                iv_len = 8;                                             \
 197                icv_len = 4;                                            \
 198                break;                                                  \
 199        case _AES_:                                                     \
 200                iv_len = 8;                                             \
 201                icv_len = 8;                                            \
 202                break;                                                  \
 203        case _SMS4_:                                                    \
 204                iv_len = 18;                                            \
 205                icv_len = 16;                                           \
 206                break;                                                  \
 207        default:                                                        \
 208                iv_len = 0;                                             \
 209                icv_len = 0;                                            \
 210                break;                                                  \
 211        }                                                               \
 212} while (0)
 213
 214
 215#define GET_TKIP_PN(iv, dot11txpn)                                      \
 216do {                                                                    \
 217        dot11txpn._byte_.TSC0 = iv[2];                                  \
 218        dot11txpn._byte_.TSC1 = iv[0];                                  \
 219        dot11txpn._byte_.TSC2 = iv[4];                                  \
 220        dot11txpn._byte_.TSC3 = iv[5];                                  \
 221        dot11txpn._byte_.TSC4 = iv[6];                                  \
 222        dot11txpn._byte_.TSC5 = iv[7];                                  \
 223} while (0)
 224
 225
 226#define ROL32(A, n)     (((A) << (n)) | (((A)>>(32-(n)))  & ((1UL << (n)) - 1)))
 227#define ROR32(A, n)     ROL32((A), 32-(n))
 228
 229struct mic_data {
 230        u32  K0, K1;         /*  Key */
 231        u32  L, R;           /*  Current state */
 232        u32  M;              /*  Message accumulator (single word) */
 233        u32  nBytesInM;      /*  # bytes in M */
 234};
 235
 236extern const u32 Te0[256];
 237extern const u32 Td0[256];
 238extern const u32 Td1[256];
 239extern const u32 Td2[256];
 240extern const u32 Td3[256];
 241extern const u32 Td4[256];
 242extern const u32 rcon[10];
 243extern const u8 Td4s[256];
 244extern const u8 rcons[10];
 245
 246#define RCON(i) (rcons[(i)] << 24)
 247
 248static inline u32 rotr(u32 val, int bits)
 249{
 250        return (val >> bits) | (val << (32 - bits));
 251}
 252
 253#define TE0(i) Te0[((i) >> 24) & 0xff]
 254#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
 255#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
 256#define TE3(i) rotr(Te0[(i) & 0xff], 24)
 257
 258#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
 259                        ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
 260
 261#define PUTU32(ct, st) { \
 262(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
 263(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
 264
 265#define WPA_GET_BE32(a) ((((u32)(a)[0]) << 24) | (((u32)(a)[1]) << 16) | \
 266                         (((u32)(a)[2]) << 8) | ((u32)(a)[3]))
 267
 268#define WPA_PUT_LE16(a, val)                    \
 269        do {                                    \
 270                (a)[1] = ((u16)(val)) >> 8;     \
 271                (a)[0] = ((u16)(val)) & 0xff;   \
 272        } while (0)
 273
 274#define WPA_PUT_BE32(a, val)                                    \
 275        do {                                                    \
 276                (a)[0] = (u8)((((u32)(val)) >> 24) & 0xff);     \
 277                (a)[1] = (u8)((((u32)(val)) >> 16) & 0xff);     \
 278                (a)[2] = (u8)((((u32)(val)) >> 8) & 0xff);      \
 279                (a)[3] = (u8)(((u32)(val)) & 0xff);             \
 280        } while (0)
 281
 282#define WPA_PUT_BE64(a, val)                            \
 283        do {                                            \
 284                (a)[0] = (u8)(((u64)(val)) >> 56);      \
 285                (a)[1] = (u8)(((u64)(val)) >> 48);      \
 286                (a)[2] = (u8)(((u64)(val)) >> 40);      \
 287                (a)[3] = (u8)(((u64)(val)) >> 32);      \
 288                (a)[4] = (u8)(((u64)(val)) >> 24);      \
 289                (a)[5] = (u8)(((u64)(val)) >> 16);      \
 290                (a)[6] = (u8)(((u64)(val)) >> 8);       \
 291                (a)[7] = (u8)(((u64)(val)) & 0xff);     \
 292        } while (0)
 293
 294/* ===== start - public domain SHA256 implementation ===== */
 295
 296/* This is based on SHA256 implementation in LibTomCrypt that was released into
 297 * public domain by Tom St Denis. */
 298
 299/* the K array */
 300static const unsigned long K[64] = {
 301        0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
 302        0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
 303        0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
 304        0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
 305        0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
 306        0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
 307        0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
 308        0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
 309        0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
 310        0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
 311        0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
 312        0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
 313        0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
 314};
 315
 316/* Various logical functions */
 317#define RORc(x, y) \
 318        (((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y)&31)) | \
 319         ((unsigned long)(x) << (unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
 320#define Ch(x, y, z)       (z ^ (x & (y ^ z)))
 321#define Maj(x, y, z)      (((x | y) & z) | (x & y))
 322#define S(x, n)         RORc((x), (n))
 323#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
 324#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
 325#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
 326#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
 327#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
 328
 329void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key);
 330void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b);
 331void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
 332void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst);
 333void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len,
 334                        u8 *Miccode, u8   priority);
 335u32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe);
 336u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe);
 337void rtw_wep_encrypt(struct adapter *padapter, u8  *pxmitframe);
 338u32 rtw_aes_decrypt(struct adapter *padapter, u8  *precvframe);
 339u32 rtw_tkip_decrypt(struct adapter *padapter, u8  *precvframe);
 340void rtw_wep_decrypt(struct adapter *padapter, u8  *precvframe);
 341
 342#endif  /* __RTL871X_SECURITY_H_ */
 343