From: joeyli <jlee@suse.com>
To: rusty@rustcorp.com.au, dhowells@redhat.com
Cc: linux-kernel@vger.kernel.org, Josh Boyer <jwboyer@redhat.com>,
Randy Dunlap <rdunlap@xenotime.net>,
Herbert Xu <herbert@gondor.hengli.com.au>,
"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH v2] X.509: Support parse long form of length octets in Authority Key Identifier
Date: Fri, 29 Mar 2013 16:51:21 +0800 [thread overview]
Message-ID: <1364547081.8186.187.camel@linux-s257.site> (raw)
In-Reply-To: <1363246469-31787-1-git-send-email-jlee@suse.com>
於 四,2013-03-14 於 15:34 +0800,Lee, Chun-Yi 提到:
> From: Chun-Yi Lee <jlee@suse.com>
>
> Per X.509 spec in 4.2.1.1 section, the structure of Authority Key
> Identifier Extension is:
>
> AuthorityKeyIdentifier ::= SEQUENCE {
> keyIdentifier [0] KeyIdentifier OPTIONAL,
> authorityCertIssuer [1] GeneralNames OPTIONAL,
> authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL }
>
> KeyIdentifier ::= OCTET STRING
>
> When a certificate also provides
> authorityCertIssuer and authorityCertSerialNumber then the length of
> AuthorityKeyIdentifier SEQUENCE is likely to long form format.
> e.g.
> The example certificate demos/tunala/A-server.pem in openssl source:
>
> X509v3 Authority Key Identifier:
> keyid:49:FB:45:72:12:C4:CC:E1:45:A1:D3:08:9E:95:C4:2C:6D:55:3F:17
> DirName:/C=NZ/L=Wellington/O=Really Irresponsible Authorisation Authority (RIAA)/OU=Cert-stamping/CN=Jackov al-Trades/emailAddress=none@fake.domain
> serial:00
>
> Current parsing rule of OID_authorityKeyIdentifier only take care the
> short form format, it causes load certificate to modsign_keyring fail:
>
> [ 12.061147] X.509: Extension: 47
> [ 12.075121] MODSIGN: Problem loading in-kernel X.509 certificate (-74)
>
> So, this patch add the parsing rule for support long form format against
> Authority Key Identifier.
>
> v2:
> - Removed comma from author's name.
> - Moved 'Short Form length' comment inside the if-body.
> - Changed the type of sub to size_t.
> - Use ASN1_INDEFINITE_LENGTH rather than writing 0x80 and 127.
> - Moved the key_len's value assignment before alter v.
> - Fixed the typo of octets.
> - Add 2 to v before entering the loop for calculate the length.
> - Removed the comment of check vlen.
>
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: Josh Boyer <jwboyer@redhat.com>
> Cc: Randy Dunlap <rdunlap@xenotime.net>
> Cc: Herbert Xu <herbert@gondor.apana.org.au>
> Cc: "David S. Miller" <davem@davemloft.net>
> Acked-by: David Howells <dhowells@redhat.com>
> Signed-off-by: Chun-Yi Lee <jlee@suse.com>
> ---
> crypto/asymmetric_keys/x509_cert_parser.c | 55 ++++++++++++++++++++++++----
> 1 files changed, 47 insertions(+), 8 deletions(-)
>
> diff --git a/crypto/asymmetric_keys/x509_cert_parser.c b/crypto/asymmetric_keys/x509_cert_parser.c
> index 7fabc4c..59ab6d2 100644
> --- a/crypto/asymmetric_keys/x509_cert_parser.c
> +++ b/crypto/asymmetric_keys/x509_cert_parser.c
> @@ -373,6 +373,9 @@ int rsa_extract_mpi(void *context, size_t hdrlen,
> return 0;
> }
>
> +/* The keyIdentifier in AuthorityKeyIdentifier SEQUENCE is tag(CONT,PRIM,0) */
> +#define SEQ_TAG_KEYID (ASN1_CONT << 6)
> +
> /*
> * Process certificate extensions that are used to qualify the certificate.
> */
> @@ -407,21 +410,57 @@ int x509_process_extension(void *context, size_t hdrlen,
> }
>
> if (ctx->last_oid == OID_authorityKeyIdentifier) {
> + size_t key_len;
> +
> /* Get hold of the CA key fingerprint */
> if (vlen < 5)
> return -EBADMSG;
> - if (v[0] != (ASN1_SEQ | (ASN1_CONS << 5)) ||
> - v[1] != vlen - 2 ||
> - v[2] != (ASN1_CONT << 6) ||
> - v[3] != vlen - 4)
> +
> + /* Authority Key Identifier must be a Constructed SEQUENCE */
> + if (v[0] != (ASN1_SEQ | (ASN1_CONS << 5)))
> return -EBADMSG;
> - v += 4;
> - vlen -= 4;
>
> - f = kmalloc(vlen * 2 + 1, GFP_KERNEL);
> + /* Authority Key Identifier is not indefinite length */
> + if (unlikely(vlen == ASN1_INDEFINITE_LENGTH))
> + return -EBADMSG;
> +
> + if (vlen < ASN1_INDEFINITE_LENGTH) {
> + /* Short Form length */
> + if (v[1] != vlen - 2 ||
> + v[2] != SEQ_TAG_KEYID ||
> + v[3] != vlen - 4)
In "Short Form length" case, there still possible have
authorityCertIssuer and authorityCertSerialNumber
in AuthorityKeyIdentifier sequence. In the case, the v[3], length of
keyIdentifier doesn't equal to "vlen - 4".
So, we should change the size check to "v[3] > vlen - 4" for cover
this situation.
I will send out the version 3 patch.
Thanks a lot!
Joey Lee
> + return -EBADMSG;
> +
> + key_len = v[3];
> + v += 4;
> + } else {
> + /* Long Form length */
> + size_t seq_len = 0;
> + size_t sub = v[1] - ASN1_INDEFINITE_LENGTH;
> +
> + if (sub > 2)
> + return -EBADMSG;
> +
> + /* calculate the length from subsequent octets */
> + v += 2;
> + for (i = 0; i < sub; i++) {
> + seq_len <<= 8;
> + seq_len |= v[i];
> + }
> +
> + if (seq_len != vlen - 2 - sub ||
> + v[sub] != SEQ_TAG_KEYID ||
> + v[sub + 1] > vlen - 4 - sub)
> + return -EBADMSG;
> +
> + key_len = v[sub + 1];
> + v += (sub + 2);
> + }
> +
> + f = kmalloc(key_len * 2 + 1, GFP_KERNEL);
> if (!f)
> return -ENOMEM;
> - for (i = 0; i < vlen; i++)
> + for (i = 0; i < key_len; i++)
> sprintf(f + i * 2, "%02x", v[i]);
> pr_debug("authority %s\n", f);
> ctx->cert->authority = f;
next prev parent reply other threads:[~2013-03-29 8:52 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-14 7:34 [PATCH v2] X.509: Support parse long form of length octets in Authority Key Identifier Lee, Chun-Yi
2013-03-26 4:44 ` joeyli
2013-03-29 8:51 ` joeyli [this message]
-- strict thread matches above, loose matches on Subject: below --
2013-02-20 6:17 Chun-Yi Lee
2013-02-20 12:49 ` David Howells
2013-02-21 3:33 ` joeyli
2013-02-21 5:05 ` Rusty Russell
2013-02-21 10:07 ` joeyli
2013-02-14 13:29 Lee, Chun-Yi
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=1364547081.8186.187.camel@linux-s257.site \
--to=jlee@suse.com \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=herbert@gondor.hengli.com.au \
--cc=jwboyer@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rdunlap@xenotime.net \
--cc=rusty@rustcorp.com.au \
/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.