import os
import ctypes
import random
flash_range = [64*7, 1024*8]
xtea_key = [0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF]
xtea_rounds = 32
def main():
print 'XTEA Cypher.\nMem range = 0x%04X .. 0x%04X\n' % tuple(flash_range)
hexfiles = [f for f in os.listdir('.') if f[-4:].lower() == '.hex']
for hexfile in hexfiles:
print hexfile
flash = randflash(flash_range[0], flash_range[1])
data = read_hexfile(hexfile)
filldata(flash, data)
coded = encode(flash)
dump(coded, hexfile)
def dump(coded, hexfile):
xtea_file = hexfile[:-4] + '.cyp'
data = []
for line in coded:
data.append(':%04X %02X%02X%02X%02X%02X%02X%02X%02X %02X\n' % ((line[0],) + tuple(line[1:]) + (256-checksum(line),)))
fo = open(xtea_file, 'wt')
fo.write(''.join(data))
fo.close()
def filldata(flash, data):
for line in data:
addr = line[0]
for i in range(1, len(line)):
if addr < flash_range[0] or addr > flash_range[1]:
continue
flash[addr - flash_range[0]] = line[i]
addr += 1
def encode(flash):
xtea = []
addr = flash_range[0]
for j in range(0, len(flash), 8):
xtea.append([addr] + xtea_encode(flash[j:j+8]))
addr += 8
return xtea
def xtea_encode(data):
global xtea_key
XTEA_DELTA = 0x9E3779B9
data0 = data[0] + (data[1]<<8) + (data[2]<<16) + (data[3]<<24)
data1 = data[4] + (data[5]<<8) + (data[6]<<16) + (data[7]<<24)
suma = 0
rounds = xtea_rounds
while(rounds):
data0 += (((data1<<4) ^ (data1>>5)) + data1) ^ (suma + xtea_key[suma & 3])
data0 = uint32(data0)
suma = uint32(suma + XTEA_DELTA)
data1 += (((data0<<4) ^ (data0>>5)) + data0) ^ (suma + xtea_key[(suma>>11) & 3])
data1 = uint32(data1)
rounds -= 1
data[0] = int(data0 & 0xFF)
data[1] = int((data0>>8) & 0xFF)
data[2] = int((data0>>16) & 0xFF)
data[3] = int((data0>>24) & 0xFF)
data[4] = int(data1 & 0xFF)
data[5] = int((data1>>8) & 0xFF)
data[6] = int((data1>>16)& 0xFF)
data[7] = int((data1>>24)& 0xFF)
return data
def uint32(data):
return ctypes.c_uint32(data).value
def randflash(addr_init, addr_end):
random.seed(1)
length = int((addr_end - addr_init + 7) / 8) * 8
return [random.randint(0, 255) for i in range(length)]
def read_hexfile(filename):
data = []
f = open(filename, 'rt')
for line in f:
hexdata(data, line)
f.close()
return data
def hexdata(data, line):
DATA = 0
if line[0] != ':':
return
line = line.strip()
tam = int(line[1:1+2], 16)
addr = int(line[3:3+4], 16)
typ = int(line[7:7+2], 16)
byte = []
for i in range(tam):
byte.append(int(line[9+i*2:9+i*2+2], 16))
if checksum(line) == 0 and typ == DATA:
data.append([addr] + byte)
def checksum(line):
checksum = 0
if type(line) == type('text'):
for i in range(1, len(line), 2):
checksum += int(line[i:i+2], 16)
checksum = checksum % 256
if type(line) == type(['list']):
for i in line:
checksum += i
checksum = checksum % 256
return checksum
main()