From: Lukas Wunner <lukas@wunner.de>
To: wufan@kernel.org
Cc: dhowells@redhat.com, ignat@cloudflare.com,
herbert@gondor.apana.org.au, davem@davemloft.net,
jarkko@kernel.org, zohar@linux.ibm.com, eric.snowberg@oracle.com,
keyrings@vger.kernel.org, linux-crypto@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] KEYS: X.509: Fix Basic Constraints CA flag parsing
Date: Fri, 12 Sep 2025 15:14:06 +0200 [thread overview]
Message-ID: <aMQcnoETIt4t4Tqz@wunner.de> (raw)
In-Reply-To: <20250911225356.2678-1-wufan@kernel.org>
On Thu, Sep 11, 2025 at 10:53:56PM +0000, wufan@kernel.org wrote:
> Fix the X.509 Basic Constraints CA flag parsing to correctly handle
> the ASN.1 DER encoded structure. The parser was incorrectly treating
> the length field as the boolean value.
>
> According to ITU-T X.690 section 8.2, a BOOLEAN is encoded as:
>
> Tag (0x01), Length (0x01), Value (0x00 for FALSE, non-zero for TRUE)
>
> The basicConstraints extension with CA:TRUE is encoded as:
>
> SEQUENCE (0x30) | Length | BOOLEAN (0x01) | Length (0x01) | Value (0xFF)
> ^-- v[2] ^-- v[3] ^-- v[4]
>
> The parser was checking v[3] (the length field, always 0x01) instead
> of v[4] (the actual boolean value, 0xFF for TRUE).
Excellent catch! How did you find it?
> +++ b/crypto/asymmetric_keys/x509_cert_parser.c
> @@ -623,7 +625,7 @@ int x509_process_extension(void *context, size_t hdrlen,
> if (v[0] != (ASN1_CONS_BIT | ASN1_SEQ))
> return -EBADMSG;
> if (vlen < 2)
> return -EBADMSG;
> if (v[1] != vlen - 2)
> return -EBADMSG;
> - if (vlen >= 4 && v[1] != 0 && v[2] == ASN1_BOOL && v[3] == 1)
> + if (vlen >= 5 && v[1] != 0 && v[2] == ASN1_BOOL && v[3] == 1 && v[4] != 0)
> ctx->cert->pub->key_eflags |= 1 << KEY_EFLAG_CA;
> return 0;
> }
Your patch is correct, however the conditions ...
vlen >= 5 && v[1] != 0 && v[2] == ASN1_BOOL && v[3] == 1
... all check well-formedness of the BasicConstraints object,
so it seems if any of those checks fails, -EBADMSG should be returned.
The check "if (vlen < 2)" could be changed to "if (vlen < 5)" because
5 bytes seems to be the minimum size of a well-formed BasicConstraints
object. Then the "vlen >= 5" and "v[1] != 0" checks can be dropped.
Up to you whether to respin this patch or make those changes in
a separate patch on top. And up to Herbert whether to take this
patch as is or wait for a respin.
Reviewed-by: Lukas Wunner <lukas@wunner.de>
I note that parsing the v[] array is quite error-prone and it
might have been better to either declare a packed struct for the
BasicConstraints object with human-readable member names,
or create a separate ASN.1 module for it.
Thanks,
Lukas
next prev parent reply other threads:[~2025-09-12 13:14 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-11 22:53 [PATCH] KEYS: X.509: Fix Basic Constraints CA flag parsing wufan
2025-09-12 13:14 ` Lukas Wunner [this message]
2025-09-12 21:14 ` Fan Wu
2025-09-13 4:38 ` Lukas Wunner
2025-09-13 5:37 ` Fan Wu
2025-09-15 21:15 ` [PATCH v2] " wufan
2025-09-16 14:52 ` Lukas Wunner
2025-09-28 3:56 ` Herbert Xu
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=aMQcnoETIt4t4Tqz@wunner.de \
--to=lukas@wunner.de \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=eric.snowberg@oracle.com \
--cc=herbert@gondor.apana.org.au \
--cc=ignat@cloudflare.com \
--cc=jarkko@kernel.org \
--cc=keyrings@vger.kernel.org \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=wufan@kernel.org \
--cc=zohar@linux.ibm.com \
/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.