Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118253
  • 博文数量: 69
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 678
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-05 16:46
个人简介

做一个技术的狂热追求者

文章分类

全部博文(69)

文章存档

2019年(1)

2017年(3)

2016年(4)

2015年(42)

2014年(18)

2013年(1)

我的朋友

分类: 其他平台

2015-06-04 17:00:51

wireshark中的处理如下:

点击(此处)折叠或打开

  1. #define IS_TKIP(tvb, hdr_len) (tvb_get_guint8(tvb, hdr_len + 1) == \
  2.   ((tvb_get_guint8(tvb, hdr_len) | 0x20) & 0x7f))
  3. #define IS_CCMP(tvb, hdr_len) (tvb_get_guint8(tvb, hdr_len + 2) == 0)

点击(此处)折叠或打开

  1.           if (IS_TKIP(tvb, hdr_len)) {
  2.             algorithm=PROTECTION_ALG_TKIP;
  3.             wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
  4.                 ett_wep_parameters, NULL, "TKIP parameters");
  5.           } else if (IS_CCMP(tvb, hdr_len)) {
  6.             algorithm=PROTECTION_ALG_CCMP;
  7.             wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
  8.                 ett_wep_parameters, NULL, "CCMP parameters");
  9.           } else
  10.             wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
  11.                 ett_wep_parameters, NULL, "TKIP/CCMP parameters");


也就是说wireshark存在不确定的情况,按照协议上看是无法确定出来,我还在困惑这个问题,现在清楚了!

// 路由器的实现是什么样子的
    ivp[0] = k->wk_keytsc >> 8; /* TSC1 */
    ivp[1] = (ivp[0] | 0x20) & 0x7f; /* WEP seed */
    ivp[2] = k->wk_keytsc >> 0; /* TSC0 */
    ivp[3] = keyid | IEEE80211_WEP_EXTIV; /* KeyID | ExtID */
    ivp[4] = k->wk_keytsc >> 16; /* TSC2 */
    ivp[5] = k->wk_keytsc >> 24; /* TSC3 */
    ivp[6] = k->wk_keytsc >> 32; /* TSC4 */
    ivp[7] = k->wk_keytsc >> 40; /* TSC5 */

xxxx_crypt_tkip.c中的实现是如上,也就符合wireshark的判断

// 再看一下内核无线网卡驱动的代码

点击(此处)折叠或打开

  1. static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
  2.              u16 IV16)
  3. {
  4.     /* Make temporary area overlap WEP seed so that the final copy can be
  5.      * avoided on little endian hosts. */
  6.     u16 *PPK = (u16 *) &WEPSeed[4];

  7.     /* Step 1 - make copy of TTAK and bring in TSC */
  8.     PPK[0] = TTAK[0];
  9.     PPK[1] = TTAK[1];
  10.     PPK[2] = TTAK[2];
  11.     PPK[3] = TTAK[3];
  12.     PPK[4] = TTAK[4];
  13.     PPK[5] = TTAK[4] + IV16;

  14.     /* Step 2 - 96-bit bijective mixing using S-box */
  15.     PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) &TK[0]));
  16.     PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) &TK[2]));
  17.     PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) &TK[4]));
  18.     PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) &TK[6]));
  19.     PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) &TK[8]));
  20.     PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) &TK[10]));

  21.     PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) &TK[12]));
  22.     PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) &TK[14]));
  23.     PPK[2] += RotR1(PPK[1]);
  24.     PPK[3] += RotR1(PPK[2]);
  25.     PPK[4] += RotR1(PPK[3]);
  26.     PPK[5] += RotR1(PPK[4]);

  27.     /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
  28.      * WEPSeed[0..2] is transmitted as WEP IV */
  29.     WEPSeed[0] = Hi8(IV16);
  30.     WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
  31.     WEPSeed[2] = Lo8(IV16);
  32.     WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) &TK[0])) >> 1);

  33. #ifdef __BIG_ENDIAN
  34.     {
  35.         int i;
  36.         for (i = 0; i < 6; i++)
  37.             PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
  38.     }
  39. #endif
  40. }



在内核代码中出现多处tkip_mixing_phase2函数:tkip.c/ieee80211_crypt_tkip.c/lib80211_crypt_tkip.c,只有tkip.c实现不满足以上的算法。
后来看了下代码,结果也实现了,隐藏在下面的函数里

点击(此处)折叠或打开

  1. static u8 *write_tkip_iv(u8 *pos, u16 iv16)
  2. {
  3.     *pos++ = iv16 >> 8;
  4.     *pos++ = ((iv16 >> 8) | 0x20) & 0x7f;
  5.     *pos++ = iv16 & 0xFF;
  6.     return pos;
  7. }
看这样暂时放心使用,有时间在看看协议去,验证下windows平台

阅读(1548) | 评论(0) | 转发(0) |
0

上一篇:display --- unknown

下一篇:svn操作

给主人留下些什么吧!~~