docs: def gen_TKIP_RC4_key(TSC, TA, TK):
      """Implement TKIP WEPSeed generation
      TSC: packet IV
      TA: target addr bytes
      TK: temporal key
      """
  
      assert len(TSC) == 6
      assert len(TA) == 6
      assert len(TK) == 16
      assert all(isinstance(x, six.integer_types) for x in TSC + TA + TK)
  
      # Phase 1
      # 802.11i p.54
  
      # Phase 1 - Step 1
      TTAK = []
      TTAK.append(_MK16(TSC[3], TSC[2]))
      TTAK.append(_MK16(TSC[5], TSC[4]))
      TTAK.append(_MK16(TA[1], TA[0]))
      TTAK.append(_MK16(TA[3], TA[2]))
      TTAK.append(_MK16(TA[5], TA[4]))
  
      # Phase 1 - Step 2
      for i in range(PHASE1_LOOP_CNT):
          j = 2 * (i & 1)
          TTAK[0] = _CAST16(TTAK[0] + _SBOX16(TTAK[4] ^ _MK16(TK[1 + j], TK[0 + j])))  # noqa: E501
          TTAK[1] = _CAST16(TTAK[1] + _SBOX16(TTAK[0] ^ _MK16(TK[5 + j], TK[4 + j])))  # noqa: E501
          TTAK[2] = _CAST16(TTAK[2] + _SBOX16(TTAK[1] ^ _MK16(TK[9 + j], TK[8 + j])))  # noqa: E501
          TTAK[3] = _CAST16(TTAK[3] + _SBOX16(TTAK[2] ^ _MK16(TK[13 + j], TK[12 + j])))  # noqa: E501
          TTAK[4] = _CAST16(TTAK[4] + _SBOX16(TTAK[3] ^ _MK16(TK[1 + j], TK[0 + j])) + i)  # noqa: E501
  
      # Phase 2
      # 802.11i p.56
  
      # Phase 2 - Step 1
      PPK = list(TTAK)
      PPK.append(_CAST16(TTAK[4] + _MK16(TSC[1], TSC[0])))
  
      # Phase 2 - Step 2
      PPK[0] = _CAST16(PPK[0] + _SBOX16(PPK[5] ^ _MK16(TK[1], TK[0])))
      PPK[1] = _CAST16(PPK[1] + _SBOX16(PPK[0] ^ _MK16(TK[3], TK[2])))
      PPK[2] = _CAST16(PPK[2] + _SBOX16(PPK[1] ^ _MK16(TK[5], TK[4])))
      PPK[3] = _CAST16(PPK[3] + _SBOX16(PPK[2] ^ _MK16(TK[7], TK[6])))
      PPK[4] = _CAST16(PPK[4] + _SBOX16(PPK[3] ^ _MK16(TK[9], TK[8])))
      PPK[5] = _CAST16(PPK[5] + _SBOX16(PPK[4] ^ _MK16(TK[11], TK[10])))
  
      PPK[0] = _CAST16(PPK[0] + _RotR1(PPK[5] ^ _MK16(TK[13], TK[12])))
      PPK[1] = _CAST16(PPK[1] + _RotR1(PPK[0] ^ _MK16(TK[15], TK[14])))
      PPK[2] = _CAST16(PPK[2] + _RotR1(PPK[1]))
      PPK[3] = _CAST16(PPK[3] + _RotR1(PPK[2]))
      PPK[4] = _CAST16(PPK[4] + _RotR1(PPK[3]))
      PPK[5] = _CAST16(PPK[5] + _RotR1(PPK[4]))
  
      # Phase 2 - Step 3
      WEPSeed = []
      WEPSeed.append(TSC[1])
      WEPSeed.append((TSC[1] | 0x20) & 0x7f)
      WEPSeed.append(TSC[0])
      WEPSeed.append(((PPK[5] ^ _MK16(TK[1], TK[0])) >> 1) & 0xFF)
      for i in range(6):
          WEPSeed.append(PPK[i] & 0xFF)
          WEPSeed.append(PPK[i] >> 8)
  
      assert len(WEPSeed) == 16
  
      return b"".join(chb(x) for x in WEPSeed)