[PATCH v4] binman: x509_cert: add PKCS#11/HSM signing support
Simon Glass
sjg at chromium.org
Fri May 15 16:01:21 CEST 2026
Hi Sergio,
On 2026-05-13T17:56:34, Sergio Prado <sergio.prado at e-labworks.com> wrote:
> binman: x509_cert: add PKCS#11/HSM signing support
>
> Allow X509 certificates used for TI K3 secure boot to be signed via an
> HSM using the PKCS#11 standard, so that the private key never leaves
> the hardware token.
>
> A new make variable BINMAN_X509_KEY_URI is introduced. When set, it is
> forwarded to binman as the x509-key-uri entry argument, overriding the
> keyfile property at signing time:
>
> make BINMAN_X509_KEY_URI="pkcs11:token=mytk;object=mykey;type=private" \
> OPENSSL_CONF=/path/to/openssl.cnf
>
> The OpenSSL pkcs11 provider or engine and the PKCS#11 module must be
> configured externally via openssl.cnf. Two URI forms are supported on
> OpenSSL 3.x:
>
> - Provider path: pkcs11:token=...;object=...;type=private
> - Engine path: org.openssl.engine:pkcs11:pkcs11:token=...;...
>
> [...]
>
> Makefile | 1 +
> tools/binman/binman.rst | 50 +++++++++++++++
> tools/binman/etype/ti_secure.py | 5 ++
> tools/binman/etype/ti_secure_rom.py | 5 ++
> tools/binman/etype/x509_cert.py | 52 ++++++++++++++--
> tools/binman/ftest.py | 118 ++++++++++++++++++++++++++++++++++++
> 6 files changed, 226 insertions(+), 5 deletions(-)
Reviewed-by: Simon Glass <sjg at chromium.org>
Thoughts below
> diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
> @@ -6905,6 +6906,123 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
> + # Find the softhsm2 library path via p11-kit
> + p11_kit_config = configparser.ConfigParser()
> + p11_kit_config.read_string(tools.run('p11-kit', 'print-config'))
> + softhsm2_lib = p11_kit_config.get('softhsm2', 'module', fallback=None)
> + if softhsm2_lib is None:
> + self.skipTest('softhsm2 module not found in p11-kit config')
> +
> + # Find the OpenSSL pkcs11 provider module via the modules dir
> + # reported by 'openssl version -m'. This handles multiarch paths
> + # like /usr/lib/x86_64-linux-gnu/ossl-modules on Debian/Ubuntu,
> + # which OPENSSLDIR does not point at.
> + m = re.search(r'MODULESDIR: '([^']+)"',
> + tools.run('openssl', 'version', '-m'))
You construct the bintool instances above (openssl, softhsm2_util,
pkcs11_tool, p11_kit) but then call tools.run() directly. Commit
08bcf962c5f routed the existing eight call sites through
<bintool>.run_cmd(), at Quentin's suggestion. Can you do the same
here? - p11_kit.run_cmd('print-config'), openssl.run_cmd('version',
'-m'), and the softhsm2_util.run_cmd()/pkcs11_tool.run_cmd() calls
below.
> diff --git a/tools/binman/etype/x509_cert.py b/tools/binman/etype/x509_cert.py
> @@ -168,3 +198,15 @@ class Entry_x509_cert(Entry_collection):
> + @staticmethod
> + def _build_pkcs11_key(uri, pin):
> + """Append pin-value to a PKCS#11 URI when a PIN is provided.
> +
> + Uses '&' as separator if the URI already contains '?', else '?'.
> + Returns the URI unchanged when pin is None or empty.
> + """
> + if not pin:
> + return uri
> + sep = '&' if '?' in uri else '?'
> + return f'{uri}{sep}pin-value={pin}'
The PIN is concatenated raw, but RFC 7512 says the query component is
percent-encoded.Wouldn't it be better to use urllib.parse.quote() on
the PIN before appending? You could add a simple test for that.
> diff --git a/tools/binman/etype/x509_cert.py b/tools/binman/etype/x509_cert.py
> @@ -18,7 +18,25 @@ class Entry_x509_cert(Entry_collection):
> """An entry which contains an X509 certificate
>
> Properties / Entry arguments:
> - - content: List of phandles to entries to sign
> + - content: List of phandles to entries to sign.
> + - keyfile: Filename of the PEM key file used to sign the binary.
> + - x509-key-uri: URI of a key to use for signing instead of the PEM
...
> + - cert-ca: Common Name (CN) embedded in the certificate. Used when
> + generating a generic x509 certificate.
> + - cert-revision-int: Integer certificate revision number. Used when
> + generating a generic x509 certificate. Defaults to 0.
> + - sw-rev: Software revision number embedded in the certificate by
> + the sysfw/rom variants used by the TI K3 secure boot subclasses.
> + Defaults to 1.
Ideally this would go into a separate preparatory commit.
Regards,
Simon
More information about the U-Boot
mailing list