U-Boot can sign FIT images with ECDSA on the host but on most boards it
cannot verify them. ECDSA verification is dispatched through a
UCLASS_ECDSA driver and the only implementations in tree are backed by
hardware or firmware such as STM32MP ROM API. 
On any other platform enabling CONFIG_ECDSA_VERIFY builds the
crypto_algo entries but ecdsa_verify() fails with -ENODEV because
uclass_first_device_err() finds no device.

This series adds a software UCLASS_ECDSA driver built on the MbedTLS ECP
library which is already vendored in tree but currently reachable only
from the TLS bundle.

Testing:
 - 33 tests pass on sandbox (30 existing RSA vboot cases, 2 new ECDSA
   cases, and the host-side test_fit_ecdsa)
 - the new tests cover, for each curve, a valid signature that verifies
   and boots, a tampered signature that is rejected, and a valid
   signature checked against a different public key that is rejected
 - I confirmed the tests actually catch a broken driver by making
   verify() return 0 unconditionally: both fail and pass again once
   reverted
 - no regressions: a baseline build of the same test selection gives an
   identical pass/fail/error count, plus the two new tests
 - each patch builds individually, so the series bisects
 - a MBEDTLS_LIB_TLS build was checked by hand, since no defconfig
   enables it and CI would not catch a break there

Open points I would appreciate opinions on:

 - No SPL support. It would need SPL_ECDSA_VERIFY_MBEDTLS and
   SPL_MBEDTLS_LIB_ECDSA, and the size cost matters far more there, so I
   left it out of this series rather than guess at what is acceptable.

 - ecdsa_verify() uses uclass_first_device_err() so on a board with
   both a hardware engine and this software driver the choice is
   arbitrary bind order. No board is in that position today, but the
   selection probably wants to be explicit before one is.

Ayoub Zaki (7):
  lib: ecdsa: read private keys from '<name>.key' like RSA
  mbedtls: factor out shared bignum and ASN.1 objects
  mbedtls: add ECDSA library module
  lib: ecdsa: add software ECDSA verification using MbedTLS
  test: vboot: add ECDSA verified boot tests
  doc: fit: document ECDSA key creation and verification
  MAINTAINERS: add an entry for lib/ecdsa

 MAINTAINERS                                   |   7 +
 configs/sandbox_defconfig                     |   2 +
 doc/usage/fit/signature.rst                   |  38 +++++
 lib/ecdsa/Kconfig                             |  12 ++
 lib/ecdsa/Makefile                            |   1 +
 lib/ecdsa/ecdsa-libcrypto.c                   |   2 +-
 lib/ecdsa/ecdsa-mbedtls.c                     | 141 +++++++++++++++++
 lib/mbedtls/Kconfig                           |  45 ++++++
 lib/mbedtls/Makefile                          |  29 ++--
 lib/mbedtls/mbedtls_def_config.h              |  19 +++
 test/py/tests/test_vboot_ecdsa.py             | 148 ++++++++++++++++++
 test/py/tests/vboot/sign-configs-ecdsa256.its |  45 ++++++
 test/py/tests/vboot/sign-configs-ecdsa384.its |  45 ++++++
 test/py/tests/vboot/sign-images-ecdsa256.its  |  42 +++++
 test/py/tests/vboot/sign-images-ecdsa384.its  |  42 +++++
 15 files changed, 606 insertions(+), 12 deletions(-)
 create mode 100644 lib/ecdsa/ecdsa-mbedtls.c
 create mode 100644 test/py/tests/test_vboot_ecdsa.py
 create mode 100644 test/py/tests/vboot/sign-configs-ecdsa256.its
 create mode 100644 test/py/tests/vboot/sign-configs-ecdsa384.its
 create mode 100644 test/py/tests/vboot/sign-images-ecdsa256.its
 create mode 100644 test/py/tests/vboot/sign-images-ecdsa384.its

-- 
2.43.0

Reply via email to