signrom: Rewrite as python script
PATCH v2 1/1 signrom: Rewrite as python script
Now that we have a hard dependency on python anyway, we can replace the slow shell script to calculate the option ROM checksum with a fast AND portable python version. Tested both with python 2.7 and 3.1.
---
Changes in v2:
- Switch to GPLv2+.
The tool replaces an inefficient GPLv2+ implementation, so want to avoid any license "regression". As it is self-contained, it doesn't affect the QEMU core license anyway (which least common denominator remains GPLv2).
pc-bios/optionrom/Makefile | 2 +- scripts/signrom.py | 40 +++++++++++++++++++++++++++++++++++++++ scripts/signrom.sh | 45 -------------------------------------------- 3 files changed, 41 insertions(+), 46 deletions(-) create mode 100644 scripts/signrom.py delete mode 100755 scripts/signrom.sh
pc-bios/optionrom/Makefile +1 -1
@@ -26,7 +26,7 @@ build-all: multiboot.bin linuxboot.bin kvmvapic.bin $(call quiet-command,$(OBJCOPY) -O binary -j .text $< $@," Building $(TARGET_DIR)$@") %.bin: %.raw - $(call quiet-command,$(SHELL) $(SRC_PATH)/scripts/signrom.sh $< $@," Signing $(TARGET_DIR)$@") + $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/signrom.py $< $@," Signing $(TARGET_DIR)$@") clean: rm -f *.o *.d *.raw *.img *.bin *~
scripts/signrom.py new file +40 -0
@@ -0,0 +1,40 @@ +# +# Option ROM signing utility +# +# Authors: +# Jan Kiszka <[email protected]> +# +# This work is licensed under the terms of the GNU GPL, version 2 or later. +# See the COPYING file in the top-level directory. + +import sys +import struct + +if len(sys.argv) < 3: + print('usage: signrom.py input output') + sys.exit(1) + +fin = open(sys.argv[1], 'rb') +fout = open(sys.argv[2], 'wb') + +fin.seek(2) +size = ord(fin.read(1)) * 512 - 1 + +fin.seek(0) +data = fin.read(size) +fout.write(data) + +checksum = 0 +for b in data: + # catch Python 2 vs. 3 differences + if isinstance(b, int): + checksum += b + else: + checksum += ord(b) +checksum = (256 - checksum) % 256 + +# Python 3 no longer allows chr(checksum) +fout.write(struct.pack('B', checksum)) + +fin.close() +fout.close()
scripts/signrom.sh deleted +0 -45
45 lines not on this page · raw message
Signature · 1 line
1.7.3.4
Quoted 5 lines · Jan Kiszka
Now that we have a hard dependency on python anyway, we can replace the slow shell script to calculate the option ROM checksum with a fast AND portable python version. Tested both with python 2.7 and 3.1.
Signed-off-by Jan Kiszka <[email protected]>
Quoted 9 lines
---
Changes in v2:
- Switch to GPLv2+.
The tool replaces an inefficient GPLv2+ implementation, so want to avoid any license "regression". As it is self-contained, it doesn't affect the QEMU core license anyway (which least common denominator remains GPLv2).
Ping?
Quoted 117 lines
pc-bios/optionrom/Makefile | 2 +- scripts/signrom.py | 40 +++++++++++++++++++++++++++++++++++++++ scripts/signrom.sh | 45 -------------------------------------------- 3 files changed, 41 insertions(+), 46 deletions(-) create mode 100644 scripts/signrom.py delete mode 100755 scripts/signrom.shpc-bios/optionrom/Makefile +1
-1@@ -26,7 +26,7 @@ build-all: multiboot.bin linuxboot.bin kvmvapic.bin $(call quiet-command,$(OBJCOPY) -O binary -j .text $< $@," Building $(TARGET_DIR)$@") %.bin: %.raw - $(call quiet-command,$(SHELL) $(SRC_PATH)/scripts/signrom.sh $< $@," Signing $(TARGET_DIR)$@") + $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/signrom.py $< $@," Signing $(TARGET_DIR)$@") clean: rm -f *.o *.d *.raw *.img *.bin *~scripts/signrom.py new file +40
-0@@ -0,0 +1,40 @@ +# +# Option ROM signing utility +# +# Authors: +# Jan Kiszka <[email protected]> +# +# This work is licensed under the terms of the GNU GPL, version 2 or later. +# See the COPYING file in the top-level directory. + +import sys +import struct + +if len(sys.argv) < 3: + print('usage: signrom.py input output') + sys.exit(1) + +fin = open(sys.argv[1], 'rb') +fout = open(sys.argv[2], 'wb') + +fin.seek(2) +size = ord(fin.read(1)) * 512 - 1 + +fin.seek(0) +data = fin.read(size) +fout.write(data) + +checksum = 0 +for b in data: + # catch Python 2 vs. 3 differences + if isinstance(b, int): + checksum += b + else: + checksum += ord(b) +checksum = (256 - checksum) % 256 + +# Python 3 no longer allows chr(checksum) +fout.write(struct.pack('B', checksum)) + +fin.close() +fout.close()scripts/signrom.sh deleted +0
-45@@ -1,45 +0,0 @@ -#!/bin/sh - -# Option ROM Signing utility -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see <http://www.gnu.org/licenses/>. -# -# Copyright Novell Inc, 2009 -# Authors: Alexander Graf <[email protected]> -# -# Syntax: signrom.sh <input> <output> - -# did we get proper arguments? -test "$1" -a "$2" || exit 1 - -sum=0 - -# find out the file size -x=`dd if="$1" bs=1 count=1 skip=2 2>/dev/null | od -t u1 -A n` -#size=`expr $x \* 512 - 1` -size=$(( $x * 512 - 1 )) - -# now get the checksum -nums=`od -A n -t u1 -v -N $size "$1"` -for i in ${nums}; do - # add each byte's value to sum - sum=`expr \( $sum + $i \) % 256` -done - -sum=$(( (256 - $sum) % 256 )) -sum_octal=$( printf "%o" $sum ) - -# and write the output file -cp "$1" "$2" -printf "\\$sum_octal" | dd of="$2" bs=1 count=1 seek=$size conv=notrunc 2>/dev/null
Signature · 2 lines
Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux