qemu/pc-bios/optionrom/signrom.sh
Alexander Graf c66b57fc14 Fix checksum writing in signboot.sh
The printf command takes an octal value after \, so we have to convert
our decimal representation to octal first and then write it.

This unbreaks extboot signing. Multiboot wasn't affected yet because
the checksum was < 8.

Spotted and first patch by Glauber Costa <glommer@redhat.com>.
Printf idea by Paolo Bonzini <bonzini@gnu.org>.

Signed-off-by: Alexander Graf <agraf@suse.de>
CC: Glauber Costa <glommer@redhat.com>
CC: Paolo Bonzini <bonzini@gnu.org>
CC: Jan Ondrej <ondrejj@salstar.sk>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Message-Id:
2009-08-10 13:05:30 -05:00

47 lines
1.3 KiB
Bash
Executable File

#!/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 <agraf@suse.de>
#
# 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 "$1"`
for i in ${nums}; do
# add each byte's value to sum
sum=`expr $sum + $i`
done
sum=$(( $sum % 256 ))
sum=$(( 256 - $sum ))
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