From: Akashi Takahiro <takahiro.akashi@linaro.org>
To: u-boot@lists.denx.de
Subject: [PATCH 5/8] efi_loader: Make the pkcs7 header parsing function an extern
Date: Fri, 8 May 2020 09:51:24 +0900 [thread overview]
Message-ID: <20200508005124.GC31466@laputa> (raw)
In-Reply-To: <CADg8p96NLD2AteN6uf=wjYpxc+4X_hABO4xsdC3urPTi14K3XA@mail.gmail.com>
On Thu, May 07, 2020 at 04:48:30PM +0530, Sughosh Ganu wrote:
> On Thu, 7 May 2020 at 13:04, Akashi Takahiro <takahiro.akashi@linaro.org>
> wrote:
>
> > On Thu, Apr 30, 2020 at 11:06:27PM +0530, Sughosh Ganu wrote:
> > > The pkcs7 header parsing functionality is pretty generic, and can be
> > > used by other features like capsule authentication. Make the function
> > > as an extern, also changing it's name to efi_parse_pkcs7_header.
> >
> > The patch itself is fine to me, but is "pkcs7 header" a common term?
> >
>
> I haven't come across it in any other code base. I used it since in the
> concept of a capsule, the signature is prepended to the capsule payload. If
> you can think of a better name, please suggest so. I will change it in the
> next version.
Simply, efi_parse_pkcs7_signature()?
In addition, please update the function description, which still
mentions "variable."
-Takahiro Akashi
> -sughosh
>
>
> >
> > -Takahiro Akashi
> >
> > >
> > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > ---
> > > include/efi_loader.h | 2 +
> > > lib/efi_loader/efi_signature.c | 78 ++++++++++++++++++++++++++++++++
> > > lib/efi_loader/efi_variable.c | 82 +---------------------------------
> > > 3 files changed, 82 insertions(+), 80 deletions(-)
> > >
> > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > index b7638d5825..8d923451ce 100644
> > > --- a/include/efi_loader.h
> > > +++ b/include/efi_loader.h
> > > @@ -781,6 +781,8 @@ bool efi_secure_boot_enabled(void);
> > >
> > > bool efi_image_parse(void *efi, size_t len, struct efi_image_regions
> > **regp,
> > > WIN_CERTIFICATE **auth, size_t *auth_len);
> > > +struct pkcs7_message *efi_parse_pkcs7_header(const void *buf, size_t
> > buflen);
> > > +
> > > #endif /* CONFIG_EFI_SECURE_BOOT */
> > >
> > > #ifdef CONFIG_EFI_HAVE_CAPSULE_SUPPORT
> > > diff --git a/lib/efi_loader/efi_signature.c
> > b/lib/efi_loader/efi_signature.c
> > > index bf6f39aab2..9897f5418e 100644
> > > --- a/lib/efi_loader/efi_signature.c
> > > +++ b/lib/efi_loader/efi_signature.c
> > > @@ -25,6 +25,84 @@ const efi_guid_t efi_guid_cert_x509_sha256 =
> > EFI_CERT_X509_SHA256_GUID;
> > >
> > > #ifdef CONFIG_EFI_SECURE_BOOT
> > >
> > > +static u8 pkcs7_hdr[] = {
> > > + /* SEQUENCE */
> > > + 0x30, 0x82, 0x05, 0xc7,
> > > + /* OID: pkcs7-signedData */
> > > + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02,
> > > + /* Context Structured? */
> > > + 0xa0, 0x82, 0x05, 0xb8,
> > > +};
> > > +
> > > +/**
> > > + * efi_parse_pkcs7_header - parse a signature in variable
> > > + * @buf: Pointer to the payload's value
> > > + * @buflen: Length of @buf
> > > + *
> > > + * Parse a signature embedded in variable's value and instantiate
> > > + * a pkcs7_message structure. Since pkcs7_parse_message() accepts only
> > > + * pkcs7's signedData, some header needed be prepended for correctly
> > > + * parsing authentication data, particularly for variable's.
> > > + *
> > > + * Return: Pointer to pkcs7_message structure on success, NULL on
> > error
> > > + */
> > > +struct pkcs7_message *efi_parse_pkcs7_header(const void *buf, size_t
> > buflen)
> > > +{
> > > + u8 *ebuf;
> > > + size_t ebuflen, len;
> > > + struct pkcs7_message *msg;
> > > +
> > > + /*
> > > + * This is the best assumption to check if the binary is
> > > + * already in a form of pkcs7's signedData.
> > > + */
> > > + if (buflen > sizeof(pkcs7_hdr) &&
> > > + !memcmp(&((u8 *)buf)[4], &pkcs7_hdr[4], 11)) {
> > > + msg = pkcs7_parse_message(buf, buflen);
> > > + goto out;
> > > + }
> > > +
> > > + /*
> > > + * Otherwise, we should add a dummy prefix sequence for pkcs7
> > > + * message parser to be able to process.
> > > + * NOTE: EDK2 also uses similar hack in WrapPkcs7Data()
> > > + * in CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyCommon.c
> > > + * TODO:
> > > + * The header should be composed in a more refined manner.
> > > + */
> > > + debug("Makeshift prefix added to authentication data\n");
> > > + ebuflen = sizeof(pkcs7_hdr) + buflen;
> > > + if (ebuflen <= 0x7f) {
> > > + debug("Data is too short\n");
> > > + return NULL;
> > > + }
> > > +
> > > + ebuf = malloc(ebuflen);
> > > + if (!ebuf) {
> > > + debug("Out of memory\n");
> > > + return NULL;
> > > + }
> > > +
> > > + memcpy(ebuf, pkcs7_hdr, sizeof(pkcs7_hdr));
> > > + memcpy(ebuf + sizeof(pkcs7_hdr), buf, buflen);
> > > + len = ebuflen - 4;
> > > + ebuf[2] = (len >> 8) & 0xff;
> > > + ebuf[3] = len & 0xff;
> > > + len = ebuflen - 0x13;
> > > + ebuf[0x11] = (len >> 8) & 0xff;
> > > + ebuf[0x12] = len & 0xff;
> > > +
> > > + msg = pkcs7_parse_message(ebuf, ebuflen);
> > > +
> > > + free(ebuf);
> > > +
> > > +out:
> > > + if (IS_ERR(msg))
> > > + return NULL;
> > > +
> > > + return msg;
> > > +}
> > > +
> > > /**
> > > * efi_hash_regions - calculate a hash value
> > > * @regs: List of regions
> > > diff --git a/lib/efi_loader/efi_variable.c
> > b/lib/efi_loader/efi_variable.c
> > > index 6c2dd82306..be34a2cadd 100644
> > > --- a/lib/efi_loader/efi_variable.c
> > > +++ b/lib/efi_loader/efi_variable.c
> > > @@ -415,85 +415,7 @@ bool efi_secure_boot_enabled(void)
> > > return efi_secure_boot;
> > > }
> > >
> > > -#ifdef CONFIG_EFI_SECURE_BOOT
> > > -static u8 pkcs7_hdr[] = {
> > > - /* SEQUENCE */
> > > - 0x30, 0x82, 0x05, 0xc7,
> > > - /* OID: pkcs7-signedData */
> > > - 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02,
> > > - /* Context Structured? */
> > > - 0xa0, 0x82, 0x05, 0xb8,
> > > -};
> > > -
> > > -/**
> > > - * efi_variable_parse_signature - parse a signature in variable
> > > - * @buf: Pointer to variable's value
> > > - * @buflen: Length of @buf
> > > - *
> > > - * Parse a signature embedded in variable's value and instantiate
> > > - * a pkcs7_message structure. Since pkcs7_parse_message() accepts only
> > > - * pkcs7's signedData, some header needed be prepended for correctly
> > > - * parsing authentication data, particularly for variable's.
> > > - *
> > > - * Return: Pointer to pkcs7_message structure on success, NULL on
> > error
> > > - */
> > > -static struct pkcs7_message *efi_variable_parse_signature(const void
> > *buf,
> > > - size_t buflen)
> > > -{
> > > - u8 *ebuf;
> > > - size_t ebuflen, len;
> > > - struct pkcs7_message *msg;
> > > -
> > > - /*
> > > - * This is the best assumption to check if the binary is
> > > - * already in a form of pkcs7's signedData.
> > > - */
> > > - if (buflen > sizeof(pkcs7_hdr) &&
> > > - !memcmp(&((u8 *)buf)[4], &pkcs7_hdr[4], 11)) {
> > > - msg = pkcs7_parse_message(buf, buflen);
> > > - goto out;
> > > - }
> > > -
> > > - /*
> > > - * Otherwise, we should add a dummy prefix sequence for pkcs7
> > > - * message parser to be able to process.
> > > - * NOTE: EDK2 also uses similar hack in WrapPkcs7Data()
> > > - * in CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyCommon.c
> > > - * TODO:
> > > - * The header should be composed in a more refined manner.
> > > - */
> > > - debug("Makeshift prefix added to authentication data\n");
> > > - ebuflen = sizeof(pkcs7_hdr) + buflen;
> > > - if (ebuflen <= 0x7f) {
> > > - debug("Data is too short\n");
> > > - return NULL;
> > > - }
> > > -
> > > - ebuf = malloc(ebuflen);
> > > - if (!ebuf) {
> > > - debug("Out of memory\n");
> > > - return NULL;
> > > - }
> > > -
> > > - memcpy(ebuf, pkcs7_hdr, sizeof(pkcs7_hdr));
> > > - memcpy(ebuf + sizeof(pkcs7_hdr), buf, buflen);
> > > - len = ebuflen - 4;
> > > - ebuf[2] = (len >> 8) & 0xff;
> > > - ebuf[3] = len & 0xff;
> > > - len = ebuflen - 0x13;
> > > - ebuf[0x11] = (len >> 8) & 0xff;
> > > - ebuf[0x12] = len & 0xff;
> > > -
> > > - msg = pkcs7_parse_message(ebuf, ebuflen);
> > > -
> > > - free(ebuf);
> > > -
> > > -out:
> > > - if (IS_ERR(msg))
> > > - return NULL;
> > > -
> > > - return msg;
> > > -}
> > > +#ifdef CONFIG_SECURE_BOOT
> > >
> > > /**
> > > * efi_variable_authenticate - authenticate a variable
> > > @@ -591,7 +513,7 @@ static efi_status_t efi_variable_authenticate(u16
> > *variable,
> > > /* variable's signature list */
> > > if (auth->auth_info.hdr.dwLength < sizeof(auth->auth_info))
> > > goto err;
> > > - var_sig = efi_variable_parse_signature(auth->auth_info.cert_data,
> > > + var_sig = efi_parse_pkcs7_header(auth->auth_info.cert_data,
> > > auth->auth_info.hdr.dwLength
> > > -
> > sizeof(auth->auth_info));
> > > if (IS_ERR(var_sig)) {
> > > --
> > > 2.17.1
> > >
> >
next prev parent reply other threads:[~2020-05-08 0:51 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-30 17:36 [PATCH 0/8] qemu: arm64: Add support for uefi firmware management protocol routines Sughosh Ganu
2020-04-30 17:36 ` [PATCH 1/8] semihosting: Change semihosting file operation functions into global symbols Sughosh Ganu
2020-05-11 3:05 ` Akashi Takahiro
2020-05-18 16:34 ` Heinrich Schuchardt
2020-04-30 17:36 ` [PATCH 2/8] semihosting: Add support for writing to a file Sughosh Ganu
2020-05-18 17:04 ` Heinrich Schuchardt
2020-04-30 17:36 ` [PATCH 3/8] qemu: arm64: Add support for efi firmware management protocol routines Sughosh Ganu
2020-04-30 18:39 ` Heinrich Schuchardt
2020-04-30 19:13 ` Sughosh Ganu
2020-05-01 9:33 ` Heinrich Schuchardt
2020-05-05 11:15 ` Grant Likely
2020-05-05 17:04 ` Heinrich Schuchardt
2020-05-05 17:23 ` Grant Likely
2020-05-05 17:57 ` Heinrich Schuchardt
2020-05-06 15:04 ` Grant Likely
2020-05-09 10:04 ` Heinrich Schuchardt
2020-05-10 11:59 ` Sughosh Ganu
2020-05-18 17:14 ` Grant Likely
2020-05-07 2:33 ` Akashi Takahiro
2020-05-07 20:47 ` Heinrich Schuchardt
2020-05-07 23:36 ` Akashi Takahiro
2020-04-30 17:36 ` [PATCH 4/8] efi_loader: Allow parsing of miscellaneous signature database variables Sughosh Ganu
2020-04-30 17:36 ` [PATCH 5/8] efi_loader: Make the pkcs7 header parsing function an extern Sughosh Ganu
2020-05-07 7:34 ` Akashi Takahiro
2020-05-07 11:18 ` Sughosh Ganu
2020-05-08 0:51 ` Akashi Takahiro [this message]
2020-05-10 11:20 ` Sughosh Ganu
2020-04-30 17:36 ` [PATCH 6/8] efi: capsule: Add support for uefi capsule authentication Sughosh Ganu
2020-05-07 8:19 ` Akashi Takahiro
2020-05-07 11:50 ` Sughosh Ganu
2020-05-08 0:42 ` Akashi Takahiro
2020-05-10 11:26 ` Sughosh Ganu
2020-05-11 2:45 ` Akashi Takahiro
2020-04-30 17:36 ` [PATCH 7/8] qemu: arm64: " Sughosh Ganu
2020-04-30 17:36 ` [PATCH 8/8] qemu: arm64: Add documentation for capsule update Sughosh Ganu
2020-04-30 18:37 ` Heinrich Schuchardt
2020-04-30 19:08 ` Sughosh Ganu
2020-04-30 19:27 ` Tom Rini
2020-05-01 5:47 ` Sughosh Ganu
2020-05-07 2:10 ` Akashi Takahiro
2020-05-07 20:52 ` Heinrich Schuchardt
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=20200508005124.GC31466@laputa \
--to=takahiro.akashi@linaro.org \
--cc=u-boot@lists.denx.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.