def getTTAK(self): ''' calcola i ttak a partire da tk,ta e tsc. L'algoritmo è descritto a pagina 177 della rfc ''' # prendo i valori di input separati in byte ta0,ta1,ta2,ta3,ta4,ta5 = self.attributeSplitter.getSplittedTA() tk0,tk1,tk2,tk3,tk4,tk5,tk6,tk7,tk8,tk9,tk10,tk11,tk12,tk13,tk14,tk15 = self.attributeSplitter.getSplittedTK() tk_tuple = (tk0,tk1,tk2,tk3,tk4,tk5,tk6,tk7,tk8,tk9,tk10,tk11,tk12,tk13,tk14,tk15) tsc0,tsc1,tsc2,tsc3,tsc4,tsc5 = self.attributeSplitter.getSplittedTSC() '''step_1''' # inizializzo i ttak ttak0 = mk16(tsc3,tsc2) ttak1 = mk16(tsc5,tsc4) ttak2 = mk16(ta1,ta0) ttak3 = mk16(ta3,ta2) ttak4 = mk16(ta5,ta4) '''step_2''' # mescolo i ttak for i in range(8): j = 2*(i & 1) # tutte le operazioni devono essere eseguite in modulo 2^16 per non andare out of bound ttak0 = (ttak0 + S(ttak4 ^ mk16(tk_tuple[1+j],tk_tuple[0+j]))) & 0xffff ttak1 = (ttak1 + S(ttak0 ^ mk16(tk_tuple[5+j],tk_tuple[4+j]))) & 0xffff ttak2 = (ttak2 + S(ttak1 ^ mk16(tk_tuple[9+j],tk_tuple[8+j]))) & 0xffff ttak3 = (ttak3 + S(ttak2 ^ mk16(tk_tuple[13+j],tk_tuple[12+j]))) & 0xffff ttak4 = (ttak4 + S(ttak3 ^ mk16(tk_tuple[1+j],tk_tuple[0+j]))) & 0xffff ttak4 = (ttak4 + i) & 0xffff # ritorno la tupla contenente i ttak return ttak0,ttak1,ttak2,ttak3,ttak4
def getWEPSeed(self): ''' calcola il WEPSeed da ttak,tk e tsc. L'algoritmo è descritto a pagina 178 della rfc wepSeed è una tupla ''' # prendo i valori di input separati in byte tk0,tk1,tk2,tk3,tk4,tk5,tk6,tk7,tk8,tk9,tk10,tk11,tk12,tk13,tk14,tk15 = self.attributeSplitter.getSplittedTK() tk_tuple = (tk0,tk1,tk2,tk3,tk4,tk5,tk6,tk7,tk8,tk9,tk10,tk11,tk12,tk13,tk14,tk15) tsc0,tsc1,tsc2,tsc3,tsc4,tsc5 = self.attributeSplitter.getSplittedTSC() # ttak è già una tupla e quindi non dev'essere splittato '''step_1''' ppk0 = self.ttak[0] ppk1 = self.ttak[1] ppk2 = self.ttak[2] ppk3 = self.ttak[3] ppk4 = self.ttak[4] ppk5 = (self.ttak[4] + mk16(tsc1,tsc0)) & 0xffff '''step_2''' ppk0 = (ppk0 + S(ppk5 ^ mk16(tk1,tk0))) & 0xffff ppk1 = (ppk1 + S(ppk0 ^ mk16(tk3,tk2))) & 0xffff ppk2 = (ppk2 + S(ppk1 ^ mk16(tk5,tk4))) & 0xffff ppk3 = (ppk3 + S(ppk2 ^ mk16(tk7,tk6))) & 0xffff ppk4 = (ppk4 + S(ppk3 ^ mk16(tk9,tk8))) & 0xffff ppk5 = (ppk5 + S(ppk4 ^ mk16(tk11,tk10))) & 0xffff ppk0 = (ppk0 + self.rotR1(ppk5 ^ mk16(tk13,tk12))) & 0xffff ppk1 = (ppk1 + self.rotR1(ppk0 ^ mk16(tk15,tk14))) & 0xffff ppk2 = (ppk2 + self.rotR1(ppk1)) & 0xffff ppk3 = (ppk3 + self.rotR1(ppk2)) & 0xffff ppk4 = (ppk4 + self.rotR1(ppk3)) & 0xffff ppk5 = (ppk5 + self.rotR1(ppk4)) & 0xffff ppk_tuple = (ppk0,ppk1,ppk2,ppk3,ppk4,ppk5) '''step3''' wepSeed=[] wepSeed.append(tsc1) wepSeed.append((tsc1 | 0x20) & 0x7F) wepSeed.append(tsc0) wepSeed.append(low8((ppk5 ^ mk16(tk1,tk0))>>1)) #wepSeed_tuple = (wepSeed0,wepSeed1,wepSeed2,wepSeed3,wepSeed4,wepSeed5) for i in range(6): wepSeed.append(low8(ppk_tuple[i])) wepSeed.append(high8(ppk_tuple[i])) return tuple(wepSeed)
def test_mk16_3(self): """ testo la funzione mk16 per due valori """ a = 0x1F b = 0x02 processedResult = mk16(a, b) expectedResult = 0x1F02 self.assertEqual(processedResult, expectedResult)
def test_mk16_2(self): """ testo la funzione mk16 per due valori """ a = 0xAA b = 0x00 processedResult = mk16(a, b) expectedResult = 0xAA00 self.assertEqual(processedResult, expectedResult)