qemu/scripts/signrom.py
<<
>>
Prefs
   1#
   2# Option ROM signing utility
   3#
   4# Authors:
   5#  Jan Kiszka <jan.kiszka@siemens.com>
   6#
   7# This work is licensed under the terms of the GNU GPL, version 2 or later.
   8# See the COPYING file in the top-level directory.
   9
  10import sys
  11import struct
  12
  13if len(sys.argv) < 3:
  14    print('usage: signrom.py input output')
  15    sys.exit(1)
  16
  17fin = open(sys.argv[1], 'rb')
  18fout = open(sys.argv[2], 'wb')
  19
  20magic = fin.read(2)
  21if magic != '\x55\xaa':
  22    sys.exit("%s: option ROM does not begin with magic 55 aa" % sys.argv[1])
  23
  24size_byte = ord(fin.read(1))
  25fin.seek(0)
  26
  27if size_byte == 0:
  28    # If the caller left the size field blank then we will fill it in,
  29    # also rounding the whole input to a multiple of 512 bytes.
  30    data = fin.read()
  31    # +1 because we need a byte to store the checksum.
  32    size = len(data) + 1
  33    # Round up to next multiple of 512.
  34    size += 511
  35    size -= size % 512
  36    if size >= 65536:
  37        sys.exit("%s: option ROM size too large" % sys.argv[1])
  38    # size-1 because a final byte is added below to store the checksum.
  39    data = data.ljust(size-1, '\0')
  40    data = data[:2] + chr(size/512) + data[3:]
  41else:
  42    # Otherwise the input file specifies the size so use it.
  43    # -1 because we overwrite the last byte of the file with the checksum.
  44    size = size_byte * 512 - 1
  45    data = fin.read(size)
  46
  47fout.write(data)
  48
  49checksum = 0
  50for b in data:
  51    # catch Python 2 vs. 3 differences
  52    if isinstance(b, int):
  53        checksum += b
  54    else:
  55        checksum += ord(b)
  56checksum = (256 - checksum) % 256
  57
  58# Python 3 no longer allows chr(checksum)
  59fout.write(struct.pack('B', checksum))
  60
  61fin.close()
  62fout.close()
  63