[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