[PATCH v8 20/27] lib/crypto: Adapt PKCS7 parser to MbedTLS
Ilias Apalodimas
ilias.apalodimas at linaro.org
Wed Oct 9 11:19:59 CEST 2024
On Fri, 4 Oct 2024 at 01:02, Raymond Mao <raymond.mao at linaro.org> wrote:
>
> Previous patch has introduced MbedTLS porting layer for PKCS7 parser,
> here to adjust the header and makefiles accordingly.
>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
> Changes in v2
> - Move the porting layer to MbedTLS dir.
> Changes in v3
> - Update commit message.
> Changes in v4
> - Control building legacy library via '_LEGACY' Kconfig.
> Changes in v5
> - Correct header file include directories.
> Changes in v6
> - None.
> Changes in v7
> - None.
> Changes in v8
> - None
>
> include/crypto/pkcs7_parser.h | 56 +++++++++++++++++++++++++++++++++++
> lib/crypto/Makefile | 7 +++--
> 2 files changed, 60 insertions(+), 3 deletions(-)
>
> diff --git a/include/crypto/pkcs7_parser.h b/include/crypto/pkcs7_parser.h
> index 2c45cce5234..469c2711fa6 100644
> --- a/include/crypto/pkcs7_parser.h
> +++ b/include/crypto/pkcs7_parser.h
> @@ -11,6 +11,12 @@
> #include <linux/oid_registry.h>
> #include <crypto/pkcs7.h>
> #include <crypto/x509_parser.h>
> +#if CONFIG_IS_ENABLED(MBEDTLS_LIB_X509)
> +#include <mbedtls/pkcs7.h>
> +#include <library/x509_internal.h>
> +#include <mbedtls/asn1.h>
> +#include <mbedtls/oid.h>
> +#endif
> #include <linux/printk.h>
>
> #define kenter(FMT, ...) \
> @@ -18,7 +24,54 @@
> #define kleave(FMT, ...) \
> pr_devel("<== %s()"FMT"\n", __func__, ##__VA_ARGS__)
>
> +/* Backup the parsed MedTLS context that we need */
> +#if CONFIG_IS_ENABLED(MBEDTLS_LIB_X509)
> +struct pkcs7_mbedtls_ctx {
> + void *content_data;
> +};
> +
> +struct pkcs7_sinfo_mbedtls_ctx {
> + void *authattrs_data;
> + void *content_data_digest;
> +};
> +#endif
> +
> +/*
> + * MbedTLS integration Notes:
> + *
> + * MbedTLS PKCS#7 library does not originally support parsing MicroSoft
> + * Authentication Code which is used for verifying the PE image digest.
> + *
> + * 1. Authenticated Attributes (authenticatedAttributes)
> + * MbedTLS assumes unauthenticatedAttributes and authenticatedAttributes
> + * fields not exist.
> + * See MbedTLS function 'pkcs7_get_signer_info' for details.
> + *
> + * 2. MicroSoft Authentication Code (mscode)
> + * MbedTLS only supports Content Data type defined as 1.2.840.113549.1.7.1
> + * (MBEDTLS_OID_PKCS7_DATA, aka OID_data).
> + * 1.3.6.1.4.1.311.2.1.4 (MicroSoft Authentication Code, aka
> + * OID_msIndirectData) is not supported.
> + * See MbedTLS function 'pkcs7_get_content_info_type' for details.
> + *
> + * But the EFI loader assumes that a PKCS#7 message with an EFI image always
> + * contains MicroSoft Authentication Code as Content Data (msg->data is NOT
> + * NULL), see function 'efi_signature_verify'.
> + *
> + * MbedTLS patch "0002-support-MicroSoft-authentication-code-in-PKCS7-lib.patch"
> + * is to support both above features by parsing the Content Data and
> + * Authenticate Attributes from a given PKCS#7 message.
> + *
> + * Other fields we don't need to populate from MbedTLS, which are used
> + * internally by pkcs7_verify:
> + * 'signer', 'unsupported_crypto', 'blacklisted'
> + * 'sig->digest' is used internally by pkcs7_digest to calculate the hash of
> + * Content Data or Authenticate Attributes.
> + */
> struct pkcs7_signed_info {
> +#if CONFIG_IS_ENABLED(MBEDTLS_LIB_X509)
> + struct pkcs7_sinfo_mbedtls_ctx *mbedtls_ctx;
> +#endif
> struct pkcs7_signed_info *next;
> struct x509_certificate *signer; /* Signing certificate (in msg->certs) */
> unsigned index;
> @@ -55,6 +108,9 @@ struct pkcs7_signed_info {
> };
>
> struct pkcs7_message {
> +#if CONFIG_IS_ENABLED(MBEDTLS_LIB_X509)
> + struct pkcs7_mbedtls_ctx *mbedtls_ctx;
> +#endif
> struct x509_certificate *certs; /* Certificate list */
> struct x509_certificate *crl; /* Revocation list */
> struct pkcs7_signed_info *signed_infos;
> diff --git a/lib/crypto/Makefile b/lib/crypto/Makefile
> index 4302f197297..7129315393f 100644
> --- a/lib/crypto/Makefile
> +++ b/lib/crypto/Makefile
> @@ -50,15 +50,16 @@ $(obj)/x509_akid.asn1.o: $(obj)/x509_akid.asn1.c $(obj)/x509_akid.asn1.h
> # PKCS#7 message handling
> #
> obj-$(CONFIG_$(SPL_)PKCS7_MESSAGE_PARSER) += pkcs7_message.o
> -pkcs7_message-y := \
> +pkcs7_message-y := pkcs7_helper.o
> +pkcs7_message-$(CONFIG_$(SPL_)PKCS7_MESSAGE_PARSER_LEGACY) += \
> pkcs7.asn1.o \
> - pkcs7_helper.o \
> pkcs7_parser.o
> -obj-$(CONFIG_$(SPL_)PKCS7_VERIFY) += pkcs7_verify.o
>
> $(obj)/pkcs7_parser.o: $(obj)/pkcs7.asn1.h
> $(obj)/pkcs7.asn1.o: $(obj)/pkcs7.asn1.c $(obj)/pkcs7.asn1.h
>
> +obj-$(CONFIG_$(SPL_)PKCS7_VERIFY) += pkcs7_verify.o
> +
> #
> # Signed PE binary-wrapped key handling
> #
> --
> 2.25.1
>
Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
More information about the U-Boot
mailing list