From: Lukas Wunner <lukas@wunner.de>
To: Fan Wu <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: Sat, 13 Sep 2025 06:38:19 +0200 [thread overview]
Message-ID: <aMT1O9PPhLHT-MZJ@wunner.de> (raw)
In-Reply-To: <CAKtyLkExV9dqMWa5j9O5n8oTHXh8McwVbjjCm6L9L=eFsH3HNw@mail.gmail.com>
On Fri, Sep 12, 2025 at 02:14:49PM -0700, Fan Wu wrote:
> On Fri, Sep 12, 2025 at 6:14 AM Lukas Wunner <lukas@wunner.de> wrote:
> > On Thu, Sep 11, 2025 at 10:53:56PM +0000, wufan@kernel.org wrote:
> > > +++ 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.
>
> Actually, we need to be careful here. OpenSSL produces
> BasicConstraints with CA:FALSE as just an empty SEQUENCE:
>
> 06 03 55 1d 13 | 01 01 ff | 04 02 | 30 00
> [----OID------] [critical] [OCTET] [empty SEQ]
I see, thanks for the explanation.
This behavior of OpenSSL doesn't seem spec-compliant, or is it?
RFC 5280 sec 4.2.1.9 says the pathLenConstraint is optional,
but the cA boolean is not optional. Is there a rule that booleans
need not be rendered if they are false?
BTW, I note that X.690 sec 11.1 says that for DER encoding,
all bits of a "true" boolean must be set, hence the 0xff value.
But I'm fine with your more permissive approach which checks for
a non-zero value, hence also allows BER encoding per X.690 sec 8.2.2.
Thanks!
Lukas
next prev parent reply other threads:[~2025-09-13 4:38 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
2025-09-12 21:14 ` Fan Wu
2025-09-13 4:38 ` Lukas Wunner [this message]
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=aMT1O9PPhLHT-MZJ@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.