Implement TKIP WEPSeed generation TSC: packet IV TA: target addr bytes TK: temporal key
(TSC, TA, TK)
| 148 | |
| 149 | |
| 150 | def gen_TKIP_RC4_key(TSC, TA, TK): |
| 151 | """Implement TKIP WEPSeed generation |
| 152 | TSC: packet IV |
| 153 | TA: target addr bytes |
| 154 | TK: temporal key |
| 155 | """ |
| 156 | |
| 157 | assert len(TSC) == 6 |
| 158 | assert len(TA) == 6 |
| 159 | assert len(TK) == 16 |
| 160 | assert all(isinstance(x, int) for x in TSC + TA + TK) |
| 161 | |
| 162 | # Phase 1 |
| 163 | # 802.11i p.54 |
| 164 | |
| 165 | # Phase 1 - Step 1 |
| 166 | TTAK = [] |
| 167 | TTAK.append(_MK16(TSC[3], TSC[2])) |
| 168 | TTAK.append(_MK16(TSC[5], TSC[4])) |
| 169 | TTAK.append(_MK16(TA[1], TA[0])) |
| 170 | TTAK.append(_MK16(TA[3], TA[2])) |
| 171 | TTAK.append(_MK16(TA[5], TA[4])) |
| 172 | |
| 173 | # Phase 1 - Step 2 |
| 174 | for i in range(PHASE1_LOOP_CNT): |
| 175 | j = 2 * (i & 1) |
| 176 | TTAK[0] = _CAST16(TTAK[0] + _SBOX16(TTAK[4] ^ _MK16(TK[1 + j], TK[0 + j]))) # noqa: E501 |
| 177 | TTAK[1] = _CAST16(TTAK[1] + _SBOX16(TTAK[0] ^ _MK16(TK[5 + j], TK[4 + j]))) # noqa: E501 |
| 178 | TTAK[2] = _CAST16(TTAK[2] + _SBOX16(TTAK[1] ^ _MK16(TK[9 + j], TK[8 + j]))) # noqa: E501 |
| 179 | TTAK[3] = _CAST16(TTAK[3] + _SBOX16(TTAK[2] ^ _MK16(TK[13 + j], TK[12 + j]))) # noqa: E501 |
| 180 | TTAK[4] = _CAST16(TTAK[4] + _SBOX16(TTAK[3] ^ _MK16(TK[1 + j], TK[0 + j])) + i) # noqa: E501 |
| 181 | |
| 182 | # Phase 2 |
| 183 | # 802.11i p.56 |
| 184 | |
| 185 | # Phase 2 - Step 1 |
| 186 | PPK = list(TTAK) |
| 187 | PPK.append(_CAST16(TTAK[4] + _MK16(TSC[1], TSC[0]))) |
| 188 | |
| 189 | # Phase 2 - Step 2 |
| 190 | PPK[0] = _CAST16(PPK[0] + _SBOX16(PPK[5] ^ _MK16(TK[1], TK[0]))) |
| 191 | PPK[1] = _CAST16(PPK[1] + _SBOX16(PPK[0] ^ _MK16(TK[3], TK[2]))) |
| 192 | PPK[2] = _CAST16(PPK[2] + _SBOX16(PPK[1] ^ _MK16(TK[5], TK[4]))) |
| 193 | PPK[3] = _CAST16(PPK[3] + _SBOX16(PPK[2] ^ _MK16(TK[7], TK[6]))) |
| 194 | PPK[4] = _CAST16(PPK[4] + _SBOX16(PPK[3] ^ _MK16(TK[9], TK[8]))) |
| 195 | PPK[5] = _CAST16(PPK[5] + _SBOX16(PPK[4] ^ _MK16(TK[11], TK[10]))) |
| 196 | |
| 197 | PPK[0] = _CAST16(PPK[0] + _RotR1(PPK[5] ^ _MK16(TK[13], TK[12]))) |
| 198 | PPK[1] = _CAST16(PPK[1] + _RotR1(PPK[0] ^ _MK16(TK[15], TK[14]))) |
| 199 | PPK[2] = _CAST16(PPK[2] + _RotR1(PPK[1])) |
| 200 | PPK[3] = _CAST16(PPK[3] + _RotR1(PPK[2])) |
| 201 | PPK[4] = _CAST16(PPK[4] + _RotR1(PPK[3])) |
| 202 | PPK[5] = _CAST16(PPK[5] + _RotR1(PPK[4])) |
| 203 | |
| 204 | # Phase 2 - Step 3 |
| 205 | WEPSeed = [] |
| 206 | WEPSeed.append(TSC[1]) |
| 207 | WEPSeed.append((TSC[1] | 0x20) & 0x7f) |