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
 167struct sha256_state {
 168        u64 length;
 169        u32 state[8], curlen;
 170        u8 buf[64];
 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#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
 265                        ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
 266
 267#define PUTU32(ct, st) { \
 268(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
 269(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
 270
 271#define WPA_GET_BE32(a) ((((u32)(a)[0]) << 24) | (((u32)(a)[1]) << 16) | \
 272                         (((u32)(a)[2]) << 8) | ((u32)(a)[3]))
 273
 274#define WPA_PUT_LE16(a, val)                    \
 275        do {                                    \
 276                (a)[1] = ((u16)(val)) >> 8;     \
 277                (a)[0] = ((u16)(val)) & 0xff;   \
 278        } while (0)
 279
 280#define WPA_PUT_BE32(a, val)                                    \
 281        do {                                                    \
 282                (a)[0] = (u8)((((u32)(val)) >> 24) & 0xff);     \
 283                (a)[1] = (u8)((((u32)(val)) >> 16) & 0xff);     \
 284                (a)[2] = (u8)((((u32)(val)) >> 8) & 0xff);      \
 285                (a)[3] = (u8)(((u32)(val)) & 0xff);             \
 286        } while (0)
 287
 288#define WPA_PUT_BE64(a, val)                            \
 289        do {                                            \
 290                (a)[0] = (u8)(((u64)(val)) >> 56);      \
 291                (a)[1] = (u8)(((u64)(val)) >> 48);      \
 292                (a)[2] = (u8)(((u64)(val)) >> 40);      \
 293                (a)[3] = (u8)(((u64)(val)) >> 32);      \
 294                (a)[4] = (u8)(((u64)(val)) >> 24);      \
 295                (a)[5] = (u8)(((u64)(val)) >> 16);      \
 296                (a)[6] = (u8)(((u64)(val)) >> 8);       \
 297                (a)[7] = (u8)(((u64)(val)) & 0xff);     \
 298        } while (0)
 299
 300/* ===== start - public domain SHA256 implementation ===== */
 301
 302/* This is based on SHA256 implementation in LibTomCrypt that was released into
 303 * public domain by Tom St Denis. */
 304
 305/* the K array */
 306static const unsigned long K[64] = {
 307        0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
 308        0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
 309        0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
 310        0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
 311        0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
 312        0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
 313        0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
 314        0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
 315        0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
 316        0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
 317        0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
 318        0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
 319        0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
 320};
 321
 322/* Various logical functions */
 323#define RORc(x, y) \
 324        (((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y)&31)) | \
 325         ((unsigned long)(x) << (unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
 326#define Ch(x, y, z)       (z ^ (x & (y ^ z)))
 327#define Maj(x, y, z)      (((x | y) & z) | (x & y))
 328#define S(x, n)         RORc((x), (n))
 329#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
 330#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
 331#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
 332#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
 333#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
 334
 335void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key);
 336void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b);
 337void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes);
 338void rtw_secgetmic(struct mic_data *pmicdata, u8 *dst);
 339void rtw_seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len,
 340                        u8 *Miccode, u8   priority);
 341u32 rtw_aes_encrypt(struct adapter *padapter, u8 *pxmitframe);
 342u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe);
 343void rtw_wep_encrypt(struct adapter *padapter, u8  *pxmitframe);
 344u32 rtw_aes_decrypt(struct adapter *padapter, u8  *precvframe);
 345u32 rtw_tkip_decrypt(struct adapter *padapter, u8  *precvframe);
 346void rtw_wep_decrypt(struct adapter *padapter, u8  *precvframe);
 347
 348#endif  /* __RTL871X_SECURITY_H_ */
 349