c66b57fc14
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:
47 lines
1.3 KiB
Bash
Executable File
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
|