#!/usr/bin/env python
# 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, 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] = "RK32"
    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 [--enable-rc4] [--enable-align] [--to=out] --from=in"

if __name__ == '__main__':
  rc4_flag = align_flag = False
  to_file = "IDBlock.bin"

  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 == "--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(from_file, to_file, rc4_flag, align_flag)
