#!/usr/bin/env python2 # Copyright (c) 2014 Google Inc. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import struct import sys from io import SEEK_SET, SEEK_END class IDBTool: def __init__(self): print "Initialize IDBTool" def p_rc4(self, buf, length): key = (124,78,3,4,85,5,9,7,45,44,123,56,23,13,23,17) K = key * 16 S = [i for i in range(256)] j = 0 for i in range(256): j = (j + S[i] + K[i]) % 256 temp = S[i]; S[i] = S[j]; S[j] = temp; i = j = k = 0 for x in range(length): i = (i+1) % 256 j = (j + S[i]) % 256 temp = S[i]; S[i] = S[j]; S[j] = temp k = (S[i] + S[j]) % 256 buf[x] = struct.pack('B', ord(buf[x]) ^ S[k]) def makeIDB(self, chip, from_file, to_file, rc4_flag = False, align_flag = False): try: fin = open(from_file, 'rb') except: sys.exit("Failed to open file : " + from_file) try: fin.seek(0, SEEK_END) if (fin.tell() > 4 * 1024 * 1024): sys.exit("Input file is more than 4MB") fin.seek(0) data = fin.read() finally: fin.close() data_len = len(data) SECTOR_SIZE = 512 PAGE_ALIGN = 4 sectors = (data_len + 4 - 1) / SECTOR_SIZE + 1 pages = (sectors - 1) / PAGE_ALIGN + 1 sectors = pages * PAGE_ALIGN; buf = [B'\0'] * sectors * SECTOR_SIZE buf[:4] = chip buf[4 : 4+data_len] = data idblock = [B'\0'] * 4 * SECTOR_SIZE blank = [B'\0'] * 4 * SECTOR_SIZE idblock[:4] = ['\x55', '\xAA', '\xF0', '\x0F'] if (not rc4_flag): idblock[8:12] = struct.pack("<I", 1) else: for i in range(sectors): list_tmp = buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] self.p_rc4(list_tmp, SECTOR_SIZE) buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] = list_tmp idblock[12:16] = struct.pack("<HH", 4, 4); idblock[506:510] = struct.pack("<HH", sectors, sectors); self.p_rc4(idblock, SECTOR_SIZE) try: fout = open(to_file, "wb+") except: sys.exit("Failed to open output file : " + to_file) try: if (align_flag): fout.write(''.join(idblock)) fout.write(''.join(blank)) for s in xrange(0, sectors * SECTOR_SIZE, PAGE_ALIGN * SECTOR_SIZE): fout.write(''.join(buf[s : s + PAGE_ALIGN * SECTOR_SIZE])) fout.write(''.join(blank)) else: fout.write(''.join(idblock)) fout.write(''.join(buf)) fout.flush() except: sys.exit("Failed to write data to : " + to_file) finally: fout.close() print "DONE" def usage(): print "Usage: make_idb.py [--chip=RKXX] [--enable-rc4] [--enable-align] [--to=out] --from=in" print " --chip: default is RK32" if __name__ == '__main__': rc4_flag = align_flag = False to_file = "IDBlock.bin" chip = "RK32" for para in sys.argv[1:]: if (para == "--enable-rc4"): rc4_flag = True elif (para == "--enable-align"): align_flag = True elif (para.startswith("--to=")): to_file = para.split('=')[1] elif (para.startswith("--from=")): from_file = para.split('=')[1] elif (para.startswith("--chip=")): chip = para.split('=')[1] elif (para == "--help" or para == "-h"): usage() sys.exit() else: usage() sys.exit() if ('from_file' not in vars() or to_file == ''): usage() sys.exit() idbtool = IDBTool() idbtool.makeIDB(chip, from_file, to_file, rc4_flag, align_flag)