From: Michael Tretter <m.tretter@pengutronix.de>
To: Sascha Hauer <s.hauer@pengutronix.de>,
BAREBOX <barebox@lists.infradead.org>
Cc: Michael Tretter <m.tretter@pengutronix.de>
Subject: [PATCH RFC 1/3] scripts: rockchip: add script to calculate key hash
Date: Mon, 05 Jan 2026 15:32:31 +0100 [thread overview]
Message-ID: <20260105-rockchip-secure-boot-v1-1-eaf5053a7d7e@pengutronix.de> (raw)
In-Reply-To: <20260105-rockchip-secure-boot-v1-0-eaf5053a7d7e@pengutronix.de>
The script calculates the key hash that needs to be written to the fuses
of a Rockchip rk3588 SoC to enable secure boot.
Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
---
scripts/rk-otp.sh | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/scripts/rk-otp.sh b/scripts/rk-otp.sh
new file mode 100755
index 000000000000..f059f74aa563
--- /dev/null
+++ b/scripts/rk-otp.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# rk-otp.sh - Print the key hash that needs to be written to the OTP of a
+# Rockchip SoC to enable secure boot.
+
+set -e
+
+if [ "$#" -lt "1" ]; then
+ echo "Usage: $0 [FILE]>"
+ exit 1
+fi
+
+FILE=$1
+
+# Pad INPUT to SIZE bytes and reverse byte order
+pad_reverse () {
+ SIZE=$1
+ INPUT=$2
+
+ # A byte consists of two hex values
+ SIZE=$((SIZE * 2))
+
+ # Pad using sed since numbers are too large
+ PAD=$(printf "%0${SIZE}x" 0 | sed -nE "s/0{${#INPUT}}$/${INPUT}/p")
+
+ # TODO Replace bashism with POSIX sh
+ REVERSE=""
+ for (( i = 0; i < SIZE; i += 2 )); do
+ REVERSE+="${PAD:${SIZE} - 2 - $i:2}"
+ done
+
+ echo "$REVERSE"
+}
+
+rkss_read () {
+ RKSS=$1
+
+ # Extract the public key from the image
+ xxd -ps -s 512 -l 560 "$RKSS"
+}
+
+pem_read () {
+ PEM=$1
+
+ KEY=$(openssl rsa -in "$PEM" -pubin -modulus -text -noout)
+ # Extract size of key in bits
+ KEY_SIZE=$(echo "$KEY" | sed -nE 's/Public-Key: \(([0-9]+) bit\)/\1/p')
+
+ # Extract modulus as hex value
+ MODULUS=$(echo "$KEY" | sed -nE 's/Modulus=([0-9ABCDEF]+)/\1/p')
+ # Extract exponent and convert it to hex value
+ EXPONENT=$(echo "$KEY" | sed -nE 's/Exponent: ([0-9]+) (.*)/obase=16;\1/p' | BC_LINE_LENGTH=0 bc)
+ # Calculate acceleration factor as hex value
+ NP=$(echo "ibase=16;modulus=$MODULUS;ibase=A;obase=16;2 ^ ($KEY_SIZE + 132) / modulus" | BC_LINE_LENGTH=0 bc)
+
+ # Build the public key with padding in reverse byte order
+ pad_reverse 512 "$MODULUS"
+ pad_reverse 16 "$EXPONENT"
+ pad_reverse 32 "$NP"
+}
+
+if [ "$(head -c 4 "$FILE")" = "RKSS" ]; then
+ KEYHEX=$(rkss_read "$FILE")
+else
+ KEYHEX=$(pem_read "$FILE")
+fi
+
+# Convert hex format of public key to binary and calculate sha256 as hex
+echo "$KEYHEX" | xxd -r -p | sha256sum | sed -nE 's/([0-9abcdef]+).*/\1/p'
--
2.47.3
next prev parent reply other threads:[~2026-01-05 14:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-05 14:32 [PATCH RFC 0/3] ARM: rockchip: add rockchip secure boot Michael Tretter
2026-01-05 14:32 ` Michael Tretter [this message]
2026-01-05 14:32 ` [PATCH RFC 2/3] tee: drivers: add driver for Rockchip Secure Boot PTA Michael Tretter
2026-01-05 14:32 ` [PATCH RFC 3/3] commands: implement rksecure command Michael Tretter
2026-01-06 7:33 ` [PATCH RFC 0/3] ARM: rockchip: add rockchip secure boot Sascha Hauer
2026-01-06 13:18 ` Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260105-rockchip-secure-boot-v1-1-eaf5053a7d7e@pengutronix.de \
--to=m.tretter@pengutronix.de \
--cc=barebox@lists.infradead.org \
--cc=s.hauer@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox