From patchwork Tue Jan 24 08:53:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 137525 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B6D3EB6F65 for ; Tue, 24 Jan 2012 19:54:07 +1100 (EST) Received: from localhost ([::1]:54021 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rpc8e-0003WV-Mp for incoming@patchwork.ozlabs.org; Tue, 24 Jan 2012 03:54:00 -0500 Received: from eggs.gnu.org ([140.186.70.92]:34636) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rpc8W-0003WE-0S for qemu-devel@nongnu.org; Tue, 24 Jan 2012 03:53:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rpc8Q-0001aW-3i for qemu-devel@nongnu.org; Tue, 24 Jan 2012 03:53:51 -0500 Received: from thoth.sbs.de ([192.35.17.2]:28611) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rpc8P-0001aS-Q2 for qemu-devel@nongnu.org; Tue, 24 Jan 2012 03:53:46 -0500 Received: from mail1.siemens.de (localhost [127.0.0.1]) by thoth.sbs.de (8.13.6/8.13.6) with ESMTP id q0O8rcrg025554; Tue, 24 Jan 2012 09:53:38 +0100 Received: from mchn199C.mchp.siemens.de ([139.22.45.21]) by mail1.siemens.de (8.13.6/8.13.6) with SMTP id q0O8ratL003825; Tue, 24 Jan 2012 09:53:37 +0100 Message-ID: <4F1E7190.6030608@siemens.com> Date: Tue, 24 Jan 2012 09:53:36 +0100 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: Anthony Liguori , qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Received-From: 192.35.17.2 Cc: Stefan Weil , Christoph Egger , Alexander Graf , Paolo Bonzini Subject: [Qemu-devel] [PATCH] signrom: Rewrite as python script X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- Getting v2 vs. v3 running wasn't straightforward, but a python expert kindly supported me. 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 diff --git a/pc-bios/optionrom/Makefile b/pc-bios/optionrom/Makefile index 3edde85..403c0b1 100644 --- a/pc-bios/optionrom/Makefile +++ b/pc-bios/optionrom/Makefile @@ -25,7 +25,7 @@ build-all: multiboot.bin linuxboot.bin $(call quiet-command,$(OBJCOPY) -O binary -j .text $< $@; rm -f $<," Building $(TARGET_DIR)$@") %.bin: %.raw - $(call quiet-command,$(SHELL) $(SRC_PATH)/scripts/signrom.sh $< $@; rm -f $<," Signing $(TARGET_DIR)$@") + $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/signrom.py $< $@; rm -f $<," Signing $(TARGET_DIR)$@") clean: rm -f *.o *.d *.raw *.img *.bin *~ diff --git a/scripts/signrom.py b/scripts/signrom.py new file mode 100644 index 0000000..8c6d4fd --- /dev/null +++ b/scripts/signrom.py @@ -0,0 +1,40 @@ +# +# Option ROM Signing utility +# +# Authors: +# Jan Kiszka +# +# This work is licensed under the terms of the GNU GPLv2. +# 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() diff --git a/scripts/signrom.sh b/scripts/signrom.sh deleted file mode 100755 index 9dc5c63..0000000 --- a/scripts/signrom.sh +++ /dev/null @@ -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 . -# -# Copyright Novell Inc, 2009 -# Authors: Alexander Graf -# -# Syntax: signrom.sh - -# 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