00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <linux/kernel.h>
00010 #include <linux/bitops.h>
00011 #include <linux/types.h>
00012 #include <linux/netdevice.h>
00013 #include <linux/export.h>
00014 #include <asm/unaligned.h>
00015
00016 #include <net/mac80211.h>
00017 #include "driver-ops.h"
00018 #include "key.h"
00019 #include "tkip.h"
00020 #include "wep.h"
00021
00022 #define PHASE1_LOOP_COUNT 8
00023
00024
00025
00026
00027
00028 static const u16 tkip_sbox[256] =
00029 {
00030 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
00031 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
00032 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
00033 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
00034 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
00035 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
00036 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
00037 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
00038 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
00039 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
00040 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
00041 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
00042 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
00043 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
00044 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
00045 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
00046 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
00047 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
00048 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
00049 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
00050 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
00051 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
00052 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
00053 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
00054 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
00055 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
00056 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
00057 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
00058 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
00059 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
00060 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
00061 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
00062 };
00063
00064 static u16 tkipS(u16 val)
00065 {
00066 return tkip_sbox[val & 0xff] ^ swab16(tkip_sbox[val >> 8]);
00067 }
00068
00069 static u8 *write_tkip_iv(u8 *pos, u16 iv16)
00070 {
00071 *pos++ = iv16 >> 8;
00072 *pos++ = ((iv16 >> 8) | 0x20) & 0x7f;
00073 *pos++ = iv16 & 0xFF;
00074 return pos;
00075 }
00076
00077
00078
00079
00080
00081
00082
00083
00084 static void tkip_mixing_phase1(const u8 *tk, struct tkip_ctx *ctx,
00085 const u8 *ta, u32 tsc_IV32)
00086 {
00087 int i, j;
00088 u16 *p1k = ctx->p1k;
00089
00090 p1k[0] = tsc_IV32 & 0xFFFF;
00091 p1k[1] = tsc_IV32 >> 16;
00092 p1k[2] = get_unaligned_le16(ta + 0);
00093 p1k[3] = get_unaligned_le16(ta + 2);
00094 p1k[4] = get_unaligned_le16(ta + 4);
00095
00096 for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
00097 j = 2 * (i & 1);
00098 p1k[0] += tkipS(p1k[4] ^ get_unaligned_le16(tk + 0 + j));
00099 p1k[1] += tkipS(p1k[0] ^ get_unaligned_le16(tk + 4 + j));
00100 p1k[2] += tkipS(p1k[1] ^ get_unaligned_le16(tk + 8 + j));
00101 p1k[3] += tkipS(p1k[2] ^ get_unaligned_le16(tk + 12 + j));
00102 p1k[4] += tkipS(p1k[3] ^ get_unaligned_le16(tk + 0 + j)) + i;
00103 }
00104 ctx->state = TKIP_STATE_PHASE1_DONE;
00105 ctx->p1k_iv32 = tsc_IV32;
00106 }
00107
00108 static void tkip_mixing_phase2(const u8 *tk, struct tkip_ctx *ctx,
00109 u16 tsc_IV16, u8 *rc4key)
00110 {
00111 u16 ppk[6];
00112 const u16 *p1k = ctx->p1k;
00113 int i;
00114
00115 ppk[0] = p1k[0];
00116 ppk[1] = p1k[1];
00117 ppk[2] = p1k[2];
00118 ppk[3] = p1k[3];
00119 ppk[4] = p1k[4];
00120 ppk[5] = p1k[4] + tsc_IV16;
00121
00122 ppk[0] += tkipS(ppk[5] ^ get_unaligned_le16(tk + 0));
00123 ppk[1] += tkipS(ppk[0] ^ get_unaligned_le16(tk + 2));
00124 ppk[2] += tkipS(ppk[1] ^ get_unaligned_le16(tk + 4));
00125 ppk[3] += tkipS(ppk[2] ^ get_unaligned_le16(tk + 6));
00126 ppk[4] += tkipS(ppk[3] ^ get_unaligned_le16(tk + 8));
00127 ppk[5] += tkipS(ppk[4] ^ get_unaligned_le16(tk + 10));
00128 ppk[0] += ror16(ppk[5] ^ get_unaligned_le16(tk + 12), 1);
00129 ppk[1] += ror16(ppk[0] ^ get_unaligned_le16(tk + 14), 1);
00130 ppk[2] += ror16(ppk[1], 1);
00131 ppk[3] += ror16(ppk[2], 1);
00132 ppk[4] += ror16(ppk[3], 1);
00133 ppk[5] += ror16(ppk[4], 1);
00134
00135 rc4key = write_tkip_iv(rc4key, tsc_IV16);
00136 *rc4key++ = ((ppk[5] ^ get_unaligned_le16(tk)) >> 1) & 0xFF;
00137
00138 for (i = 0; i < 6; i++)
00139 put_unaligned_le16(ppk[i], rc4key + 2 * i);
00140 }
00141
00142
00143
00144
00145 u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key)
00146 {
00147 lockdep_assert_held(&key->u.tkip.txlock);
00148
00149 pos = write_tkip_iv(pos, key->u.tkip.tx.iv16);
00150 *pos++ = (key->conf.keyidx << 6) | (1 << 5) ;
00151 put_unaligned_le32(key->u.tkip.tx.iv32, pos);
00152 return pos + 4;
00153 }
00154
00155 static void ieee80211_compute_tkip_p1k(struct ieee80211_key *key, u32 iv32)
00156 {
00157 struct ieee80211_sub_if_data *sdata = key->sdata;
00158 struct tkip_ctx *ctx = &key->u.tkip.tx;
00159 const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
00160
00161 lockdep_assert_held(&key->u.tkip.txlock);
00162
00163
00164
00165
00166
00167
00168
00169
00170 if (ctx->p1k_iv32 != iv32 || ctx->state == TKIP_STATE_NOT_INIT)
00171 tkip_mixing_phase1(tk, ctx, sdata->vif.addr, iv32);
00172 }
00173
00174 void ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *keyconf,
00175 u32 iv32, u16 *p1k)
00176 {
00177 struct ieee80211_key *key = (struct ieee80211_key *)
00178 container_of(keyconf, struct ieee80211_key, conf);
00179 struct tkip_ctx *ctx = &key->u.tkip.tx;
00180 unsigned long flags;
00181
00182 spin_lock_irqsave(&key->u.tkip.txlock, flags);
00183 ieee80211_compute_tkip_p1k(key, iv32);
00184 memcpy(p1k, ctx->p1k, sizeof(ctx->p1k));
00185 spin_unlock_irqrestore(&key->u.tkip.txlock, flags);
00186 }
00187 EXPORT_SYMBOL(ieee80211_get_tkip_p1k_iv);
00188
00189 void ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf *keyconf,
00190 const u8 *ta, u32 iv32, u16 *p1k)
00191 {
00192 const u8 *tk = &keyconf->key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
00193 struct tkip_ctx ctx;
00194
00195 tkip_mixing_phase1(tk, &ctx, ta, iv32);
00196 memcpy(p1k, ctx.p1k, sizeof(ctx.p1k));
00197 }
00198 EXPORT_SYMBOL(ieee80211_get_tkip_rx_p1k);
00199
00200 void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
00201 struct sk_buff *skb, u8 *p2k)
00202 {
00203 struct ieee80211_key *key = (struct ieee80211_key *)
00204 container_of(keyconf, struct ieee80211_key, conf);
00205 const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
00206 struct tkip_ctx *ctx = &key->u.tkip.tx;
00207 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
00208 const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control);
00209 u32 iv32 = get_unaligned_le32(&data[4]);
00210 u16 iv16 = data[2] | (data[0] << 8);
00211 unsigned long flags;
00212
00213 spin_lock_irqsave(&key->u.tkip.txlock, flags);
00214 ieee80211_compute_tkip_p1k(key, iv32);
00215 tkip_mixing_phase2(tk, ctx, iv16, p2k);
00216 spin_unlock_irqrestore(&key->u.tkip.txlock, flags);
00217 }
00218 EXPORT_SYMBOL(ieee80211_get_tkip_p2k);
00219
00220
00221
00222
00223
00224
00225
00226
00227 int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm,
00228 struct ieee80211_key *key,
00229 struct sk_buff *skb,
00230 u8 *payload, size_t payload_len)
00231 {
00232 u8 rc4key[16];
00233
00234 ieee80211_get_tkip_p2k(&key->conf, skb, rc4key);
00235
00236 return ieee80211_wep_encrypt_data(tfm, rc4key, 16,
00237 payload, payload_len);
00238 }
00239
00240
00241
00242
00243
00244 int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,
00245 struct ieee80211_key *key,
00246 u8 *payload, size_t payload_len, u8 *ta,
00247 u8 *ra, int only_iv, int queue,
00248 u32 *out_iv32, u16 *out_iv16)
00249 {
00250 u32 iv32;
00251 u32 iv16;
00252 u8 rc4key[16], keyid, *pos = payload;
00253 int res;
00254 const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY];
00255
00256 if (payload_len < 12)
00257 return -1;
00258
00259 iv16 = (pos[0] << 8) | pos[2];
00260 keyid = pos[3];
00261 iv32 = get_unaligned_le32(pos + 4);
00262 pos += 8;
00263 #ifdef CONFIG_MAC80211_TKIP_DEBUG
00264 {
00265 int i;
00266 printk(KERN_DEBUG "TKIP decrypt: data(len=%zd)", payload_len);
00267 for (i = 0; i < payload_len; i++)
00268 printk(" %02x", payload[i]);
00269 printk("\n");
00270 printk(KERN_DEBUG "TKIP decrypt: iv16=%04x iv32=%08x\n",
00271 iv16, iv32);
00272 }
00273 #endif
00274
00275 if (!(keyid & (1 << 5)))
00276 return TKIP_DECRYPT_NO_EXT_IV;
00277
00278 if ((keyid >> 6) != key->conf.keyidx)
00279 return TKIP_DECRYPT_INVALID_KEYIDX;
00280
00281 if (key->u.tkip.rx[queue].state != TKIP_STATE_NOT_INIT &&
00282 (iv32 < key->u.tkip.rx[queue].iv32 ||
00283 (iv32 == key->u.tkip.rx[queue].iv32 &&
00284 iv16 <= key->u.tkip.rx[queue].iv16))) {
00285 #ifdef CONFIG_MAC80211_TKIP_DEBUG
00286 printk(KERN_DEBUG "TKIP replay detected for RX frame from "
00287 "%pM (RX IV (%04x,%02x) <= prev. IV (%04x,%02x)\n",
00288 ta,
00289 iv32, iv16, key->u.tkip.rx[queue].iv32,
00290 key->u.tkip.rx[queue].iv16);
00291 #endif
00292 return TKIP_DECRYPT_REPLAY;
00293 }
00294
00295 if (only_iv) {
00296 res = TKIP_DECRYPT_OK;
00297 key->u.tkip.rx[queue].state = TKIP_STATE_PHASE1_HW_UPLOADED;
00298 goto done;
00299 }
00300
00301 if (key->u.tkip.rx[queue].state == TKIP_STATE_NOT_INIT ||
00302 key->u.tkip.rx[queue].iv32 != iv32) {
00303
00304 tkip_mixing_phase1(tk, &key->u.tkip.rx[queue], ta, iv32);
00305 #ifdef CONFIG_MAC80211_TKIP_DEBUG
00306 {
00307 int i;
00308 u8 key_offset = NL80211_TKIP_DATA_OFFSET_ENCR_KEY;
00309 printk(KERN_DEBUG "TKIP decrypt: Phase1 TA=%pM"
00310 " TK=", ta);
00311 for (i = 0; i < 16; i++)
00312 printk("%02x ",
00313 key->conf.key[key_offset + i]);
00314 printk("\n");
00315 printk(KERN_DEBUG "TKIP decrypt: P1K=");
00316 for (i = 0; i < 5; i++)
00317 printk("%04x ", key->u.tkip.rx[queue].p1k[i]);
00318 printk("\n");
00319 }
00320 #endif
00321 }
00322 if (key->local->ops->update_tkip_key &&
00323 key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
00324 key->u.tkip.rx[queue].state != TKIP_STATE_PHASE1_HW_UPLOADED) {
00325 struct ieee80211_sub_if_data *sdata = key->sdata;
00326
00327 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
00328 sdata = container_of(key->sdata->bss,
00329 struct ieee80211_sub_if_data, u.ap);
00330 drv_update_tkip_key(key->local, sdata, &key->conf, key->sta,
00331 iv32, key->u.tkip.rx[queue].p1k);
00332 key->u.tkip.rx[queue].state = TKIP_STATE_PHASE1_HW_UPLOADED;
00333 }
00334
00335 tkip_mixing_phase2(tk, &key->u.tkip.rx[queue], iv16, rc4key);
00336 #ifdef CONFIG_MAC80211_TKIP_DEBUG
00337 {
00338 int i;
00339 printk(KERN_DEBUG "TKIP decrypt: Phase2 rc4key=");
00340 for (i = 0; i < 16; i++)
00341 printk("%02x ", rc4key[i]);
00342 printk("\n");
00343 }
00344 #endif
00345
00346 res = ieee80211_wep_decrypt_data(tfm, rc4key, 16, pos, payload_len - 12);
00347 done:
00348 if (res == TKIP_DECRYPT_OK) {
00349
00350
00351
00352
00353
00354
00355 *out_iv32 = iv32;
00356 *out_iv16 = iv16;
00357 }
00358
00359 return res;
00360 }