def keysetup(self, key): sparefinalkeyindex = 4 sparefinalkey = bytearray(16) self.finalprng = key[0:16] rabbit = Rabbit() rabbit.keysetup(key) finalkeydata = rabbit.prng(4*6*4) for i in xrange(6): self.finalkey[i] = [] for j in xrange(4): index = i*16 + j*4 d = b_to_int(finalkeydata[index:index+4]) while 0xFFFFFFFA < d: # UNTESTED if sparefinalkeyindex == 4: print "..." sparefinalkey = rabbit.prng(16) sparefinalkeyindex = 0 k = bytearray(4) k[0] = sparefinalkey[4*sparefinalkeyindex] k[1] = 0 k[2] = 0 k[3] = 0 d = b_to_int2(k) sparefinalkeyindex += 1 self.finalkey[i].append(d) levelkeydata = rabbit.prng(8*28*4) for i in xrange(28): self.levelkey[i] = [] for j in xrange(4): index = 8*(4*i + j) self.levelkey[i].append(b_to_int64(levelkeydata[index:index+8]))
def finalize(self, iv): right = [[] for i in xrange(4)] buffermask = self.bitcount >> 7 counter = 0 level = 0 rightfilled = False print self.bitcount self.bitcount += 8 * self.bufferindex if self.bufferindex > 0: if self.bufferindex <= 8: while self.bufferindex < 8: self.buffer[self.bufferindex] = 0 self.bufferindex += 1 for i in xrange(4): right[i] = b_to_int(self.buffer[0:4]) else: while self.bufferindex < 16: self.buffer[self.bufferindex] = 0 self.bufferindex += 1 bufpart0 = b_to_int(self.buffer[0:4]) bufpart1 = b_to_int(self.buffer[4:8]) bufpart2 = b_to_int(self.buffer[8:12]) for i in xrange(4): lk = self.levelkey[0][i] t1 = (lk + bufpart0) & 0xFFFFFFFF t2 = ((lk >> 32) + bufpart1) & 0xFFFFFFFF right[i] = (t1 * t2) + bufpart2 print hex(right[i]) rightfilled = True # print i, ":", hex(y[0]), hex(y[1]), hex(y[2]), hex(y[3]) if buffermask == 0 and not self.bufferindex: for i in xrange(4): right[i] = 0 else: while not rightfilled: if buffermask & 1: for i in xrange(4): right[i] = self.treebuffer[level][counter+i] rightfilled = True level += 1 buffermask >>= 1 while buffermask: if buffermask & 1: for i in xrange(4): t1 = (self.levelkey[level+1][counter] & 0xFFFFFFFF) + (self.treebuffer[level][counter] & 0xFFFFFFFF) & 0xFFFFFFFF t2 = (self.levelkey[level+1][counter] & 0xFFFFFFFF00000000) + (self.treebuffer[level][counter] & 0xFFFFFFFF00000000) & 0xFFFFFFFF right[i] += t1 * t2 counter += 1 if counter >= 4: counter -= 4 level += 1 else: level += 1 buffermask >>= 1 mac = bytearray(16) for i in xrange(4): t = self.finalkey[0][i] * (right[i] & 0x07FFFFFF) t += self.finalkey[1][i] * ((right[i] >> 27) & 0x07FFFFFF) t += self.finalkey[2][i] * ((right[i] >> 54) | ((0x0001FFFF & self.bitcount) << 10)) t += self.finalkey[3][i] * ((self.bitcount >> 17) & 0x07FFFFFF) t += self.finalkey[4][i] * (self.bitcount >> 44) t += self.finalkey[5][i] low = t & 0xFFFFFFFF r = (low + (5 * (t >> 32))) & 0xFFFFFFFF if r < low or r > 0xFFFFFFFA: r -= 0xFFFFFFFB p = int_to_b(r & 0xFFFFFFFF) mac[4*i:4*i+4] = p r = Rabbit() r.keysetup(self.finalprng) r.ivsetup(iv) return r.encrypt(mac)