[RFC PATCH v3 8/8] tools: gen_pre_load_header.sh: initial import

Philippe Reynes philippe.reynes at softathome.com
Wed Nov 17 18:52:15 CET 2021


This commit adds a script gen_pre_load_header.sh
that generate the header used by the image pre-load
stage.

Signed-off-by: Philippe Reynes <philippe.reynes at softathome.com>
---
 tools/gen_pre_load_header.sh | 174 +++++++++++++++++++++++++++++++++++
 1 file changed, 174 insertions(+)
 create mode 100755 tools/gen_pre_load_header.sh

diff --git a/tools/gen_pre_load_header.sh b/tools/gen_pre_load_header.sh
new file mode 100755
index 0000000000..8256fa80ee
--- /dev/null
+++ b/tools/gen_pre_load_header.sh
@@ -0,0 +1,174 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+
+#
+# default value
+#
+size='4096'
+algo='sha256,rsa2048'
+padding='pkcs-1.5'
+key=''
+verbose='false'
+input=''
+output=''
+
+usage() {
+	printf "Usage: $0 -a <algo> -k <key> [-p <padding>] [-s <size>] [-v] -i <input> -o <output>\n"
+}
+
+#
+# parse arguments
+#
+while getopts 'a:hi:k:o:p:s:v' flag; do
+	case "${flag}" in
+		a) algo="${OPTARG}" ;;
+		h) usage
+		   exit 0 ;;
+		i) input="${OPTARG}" ;;
+		k) key="${OPTARG}" ;;
+		o) output="${OPTARG}" ;;
+		p) padding="${OPTARG}" ;;
+		s) size="${OPTARG}" ;;
+		v) verbose='true' ;;
+		*) usage
+		   exit 1 ;;
+	esac
+done
+
+#
+# check that mandatory arguments are provided
+#
+if [ -z "$key" -o -z "$input" -o -z "$output" ]
+then
+	usage
+	exit 0
+fi
+
+hash=$(echo $algo | cut -d',' -f1)
+sign=$(echo $algo | cut -d',' -f2)
+
+echo "status:"
+echo "size    = $size"
+echo "algo    = $algo"
+echo "hash    = $hash"
+echo "sign    = $sign"
+echo "padding = $padding"
+echo "key     = $key"
+echo "verbose = $verbose"
+
+#
+# check if input file exist
+#
+if [ ! -f "$input" ]
+then
+	echo "Error: file '$input' doesn't exist"
+	exit 1
+fi
+
+#
+# check if output is not empty
+#
+if [ -z "$output" ]
+then
+	echo "Error: output is empty"
+	exit 1
+fi
+
+#
+# check that size is bigger than 0
+#
+if [ $size -le 0 ]
+then
+	echo "Error: $size lower than 0"
+	exit 1
+fi
+
+#
+# check if the key file exist
+#
+if [ ! -f "$key" ]
+then
+	echo "Error: file $key doesn't exist\n"
+	exit 1
+fi
+
+#
+# check if the hash is valid and supported
+#
+print_supported_hash() {
+	echo "Supported hash:"
+	echo "- sha1"
+	echo "- sha256"
+	echo "- sha384"
+	echo "- sha512"
+}
+
+case "$hash" in
+	"sha1") hashOption="-sha1" ;;
+	"sha256") hashOption="-sha256" ;;
+	"sha384") hashOption="-sha384" ;;
+	"sha512") hashOption="-sha512" ;;
+	*) echo "Error: $hash is an invalid hash"
+	   print_supported_hash
+	   exit 1;;
+esac
+
+#
+# check if the sign is valid and supported
+#
+print_supported_sign() {
+	echo "Supported sign:"
+	echo "- rsa1024"
+	echo "- rsa2048"
+	echo "- rsa4096"
+}
+
+case "$sign" in
+	"rsa1024") ;;
+	"rsa2048") ;;
+	"rsa4096") ;;
+	*) echo "Error: $sign is an invalid signature type"
+	   print_supported_sign
+	   exit 1;;
+esac
+
+#
+# check if the padding is valid and supported
+#
+print_supported_padding() {
+	echo "Supported padding:"
+	echo "- pkcs-1.5"
+	echo "- pss"
+}
+
+case "$padding" in
+	"pkcs-1.5") optionPadding='' ;;
+	"pss") optionPadding='-sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-2' ;;
+	*) echo "Error: $padding is an invalid padding"
+	   print_supported_padding
+	   exit 1;;
+esac
+
+
+#
+# generate the sigature
+#
+sig=$(openssl dgst $optionHash -sign $key $optionPadding $input | xxd -p)
+
+#
+# generate the header
+#
+# 0 = magic
+# 4 = image size
+# 8 = signature
+#
+h=$(printf "%08x" 0x55425348)
+i=$(stat --printf="%s" $input)
+i=$(printf "%08x" $i)
+
+echo "$h$i$sig" | xxd -r -p > $output
+
+#
+# fill the header with '\0'  to reach the expected size
+#
+truncate -s $size $output
-- 
2.17.1



More information about the U-Boot mailing list