Exemplo n.º 1
0
	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]))
Exemplo n.º 2
0
	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)