def decode(self, data): packet = struct.unpack('<b32s20s20sbb', data) self.command = packet[0] self.srp_A = bin_to_int(packet[1]) self.srp_M1 = bin_to_int(packet[2]) #self.srp_A = int(binascii.hexlify(packet[1]), 16) #self.srp_M1 = int(binascii.hexlify(packet[2]), 16) self.crc = packet[3] self.number_of_keys = packet[4]
def calcSaltVerify(self): self.s = binascii.unhexlify("%x" % 80214272189838780128605308367486581597145816548177813688284808124909330286083)[::-1] #self.s = os.urandom(64) sha = hashlib.sha1() sha.update(self.s) # reverse salt sha.update(self.passwordHash) x = bin_to_int(sha.digest()) self.v = pow(self.g, x, self.N)
def calcM2(self): sha = hashlib.sha1() sha.update(int_to_bin(self.A)) sha.update(int_to_bin(self.B)) u = bin_to_int(sha.digest()) self.S = pow(self.A * pow(self.v, u, self.N), self.b, self.N) t = int_to_bin(self.S) t1 = list() for i in range(0, 32, 2): t1.append(t[i]) sha = hashlib.sha1() sha.update("".join(t1)) vK = list(range(0, 40)) # fill even vK entries [0], [2] etc. for i in range(0, 20): vK[i * 2] = sha.digest()[i] for i in range(0, 16): t1[i] = t[i * 2 + 1] sha = hashlib.sha1() sha.update("".join(t1)) # fill uneven vK entries [1], [3] etc. for i in range(0, 20): vK[i * 2 + 1] = sha.digest()[i] self.K = bin_to_int("".join(vK)) sha = hashlib.sha1() sha.update(int_to_bin(self.N)) N_sha = sha.digest() sha = hashlib.sha1() sha.update(int_to_bin(self.g)) g_sha = sha.digest() hash = list() for i in range(0, 20): hash.append(int_to_bin(bin_to_int(N_sha[i]) ^ bin_to_int(g_sha[i]))) t3 = "".join(hash) sha = hashlib.sha1() sha.update(self.username) t4 = sha.digest() # calculated M1 sha = hashlib.sha1() sha.update(t3) sha.update(t4) sha.update(self.s) sha.update(int_to_bin(self.A)) sha.update(int_to_bin(self.B)) sha.update(int_to_bin(self.K)) M = sha.digest() if bin_to_int(M) == self.M1: print "Password correct" # calculate M2 sha = hashlib.sha1() sha.update(int_to_bin(self.A)) sha.update(M) sha.update(int_to_bin(self.K)) self.M2 = sha.digest()