xref: /openbmc/qemu/scripts/signrom.py (revision 81f49aba)
1*b38c2458SPaolo Bonzini#!/usr/bin/env python3
2*b38c2458SPaolo Bonzini
30d6b9cc7SJan Kiszka#
40d6b9cc7SJan Kiszka# Option ROM signing utility
50d6b9cc7SJan Kiszka#
60d6b9cc7SJan Kiszka# Authors:
70d6b9cc7SJan Kiszka#  Jan Kiszka <jan.kiszka@siemens.com>
80d6b9cc7SJan Kiszka#
90d6b9cc7SJan Kiszka# This work is licensed under the terms of the GNU GPL, version 2 or later.
100d6b9cc7SJan Kiszka# See the COPYING file in the top-level directory.
110d6b9cc7SJan Kiszka
120d6b9cc7SJan Kiszkaimport sys
130d6b9cc7SJan Kiszkaimport struct
140d6b9cc7SJan Kiszka
150d6b9cc7SJan Kiszkaif len(sys.argv) < 3:
160d6b9cc7SJan Kiszka    print('usage: signrom.py input output')
170d6b9cc7SJan Kiszka    sys.exit(1)
180d6b9cc7SJan Kiszka
190d6b9cc7SJan Kiszkafin = open(sys.argv[1], 'rb')
200d6b9cc7SJan Kiszkafout = open(sys.argv[2], 'wb')
210d6b9cc7SJan Kiszka
22fd28938bSRichard W.M. Jonesmagic = fin.read(2)
2331d8f92eSDaniel P. Berrangeif magic != b'\x55\xaa':
24fd28938bSRichard W.M. Jones    sys.exit("%s: option ROM does not begin with magic 55 aa" % sys.argv[1])
25fd28938bSRichard W.M. Jones
266f71b779SRichard W.M. Jonessize_byte = ord(fin.read(1))
270d6b9cc7SJan Kiszkafin.seek(0)
286f71b779SRichard W.M. Jonesdata = fin.read()
297f256924SPaolo Bonzini
307f256924SPaolo Bonzinisize = size_byte * 512
317f256924SPaolo Bonziniif len(data) > size:
327f256924SPaolo Bonzini    sys.stderr.write('error: ROM is too large (%d > %d)\n' % (len(data), size))
337f256924SPaolo Bonzini    sys.exit(1)
347f256924SPaolo Bonzinielif len(data) < size:
357f256924SPaolo Bonzini    # Add padding if necessary, rounding the whole input to a multiple of
367f256924SPaolo Bonzini    # 512 bytes according to the third byte of the input.
376f71b779SRichard W.M. Jones    # size-1 because a final byte is added below to store the checksum.
3831d8f92eSDaniel P. Berrange    data = data.ljust(size-1, b'\0')
396f71b779SRichard W.M. Joneselse:
407f256924SPaolo Bonzini    if ord(data[-1:]) != 0:
417f256924SPaolo Bonzini        sys.stderr.write('WARNING: ROM includes nonzero checksum\n')
427f256924SPaolo Bonzini    data = data[:size-1]
436f71b779SRichard W.M. Jones
440d6b9cc7SJan Kiszkafout.write(data)
450d6b9cc7SJan Kiszka
460d6b9cc7SJan Kiszkachecksum = 0
470d6b9cc7SJan Kiszkafor b in data:
48*b38c2458SPaolo Bonzini    checksum = (checksum - b) & 255
490d6b9cc7SJan Kiszka
500d6b9cc7SJan Kiszkafout.write(struct.pack('B', checksum))
510d6b9cc7SJan Kiszka
520d6b9cc7SJan Kiszkafin.close()
530d6b9cc7SJan Kiszkafout.close()
54