openssl/crypto/x509
Viktor Dukhovni bb6923945e Only CA certificates can be self-issued
At the bottom of https://tools.ietf.org/html/rfc5280#page-12 and
top of https://tools.ietf.org/html/rfc5280#page-13 (last paragraph
of above https://tools.ietf.org/html/rfc5280#section-3.3), we see:

   This specification covers two classes of certificates: CA
   certificates and end entity certificates.  CA certificates may be
   further divided into three classes: cross-certificates, self-issued
   certificates, and self-signed certificates.  Cross-certificates are
   CA certificates in which the issuer and subject are different
   entities.  Cross-certificates describe a trust relationship between
   the two CAs.  Self-issued certificates are CA certificates in which
   the issuer and subject are the same entity.  Self-issued certificates
   are generated to support changes in policy or operations.  Self-
   signed certificates are self-issued certificates where the digital
   signature may be verified by the public key bound into the
   certificate.  Self-signed certificates are used to convey a public
   key for use to begin certification paths.  End entity certificates
   are issued to subjects that are not authorized to issue certificates.

that the term "self-issued" is only applicable to CAs, not end-entity
certificates.  In https://tools.ietf.org/html/rfc5280#section-4.2.1.9
the description of path length constraints says:

   The pathLenConstraint field is meaningful only if the cA boolean is
   asserted and the key usage extension, if present, asserts the
   keyCertSign bit (Section 4.2.1.3).  In this case, it gives the
   maximum number of non-self-issued intermediate certificates that may
   follow this certificate in a valid certification path.  (Note: The
   last certificate in the certification path is not an intermediate
   certificate, and is not included in this limit.  Usually, the last
   certificate is an end entity certificate, but it can be a CA
   certificate.)

This makes it clear that exclusion of self-issued certificates from
the path length count applies only to some *intermediate* CA
certificates.  A leaf certificate whether it has identical issuer
and subject or whether it is a CA or not is never part of the
intermediate certificate count.  The handling of all leaf certificates
must be the same, in the case of our code to post-increment the
path count by 1, so that we ultimately reach a non-self-issued
intermediate it will be the first one (not zeroth) in the chain
of intermediates.

Reviewed-by: Matt Caswell <matt@openssl.org>
(cherry picked from commit ed422a2d01)
2018-10-18 00:10:03 -04:00
..
build.info Add APIs for custom X509_LOOKUP_METHOD creation 2018-05-30 15:45:48 +02:00
by_dir.c Use secure_getenv(3) when available. 2018-09-24 11:22:22 +10:00
by_file.c Use secure_getenv(3) when available. 2018-09-24 11:22:22 +10:00
t_crl.c Add padding spaces before printing signature algorithm for CRLs output 2017-11-16 01:19:55 +01:00
t_req.c Update copyright years on all files merged since Jan 1st 2018 2018-01-09 05:49:01 +01:00
t_x509.c Consistent formatting for sizeof(foo) 2017-12-07 19:11:49 -05:00
x509_att.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_cmp.c Update copyright year 2018-05-29 13:16:04 +01:00
x509_d2.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_def.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_err.c Add APIs for custom X509_LOOKUP_METHOD creation 2018-05-30 15:45:48 +02:00
x509_ext.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_lcl.h Update copyright year 2018-06-20 15:29:23 +01:00
x509_lu.c Harmonize use of sk_TYPE_find's return value. 2018-08-07 08:56:54 +02:00
x509_meth.c Avoid shadowing 'free' in X509_LOOKUP_met_set_free 2018-08-17 13:57:23 -05:00
x509_obj.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_r2x.c
x509_req.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_set.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_trs.c Update copyright year 2018-09-11 13:45:17 +01:00
x509_txt.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509_v3.c Update copyright year 2018-02-27 13:59:42 +00:00
x509_vfy.c Only CA certificates can be self-issued 2018-10-18 00:10:03 -04:00
x509_vpm.c Harmonize use of sk_TYPE_find's return value. 2018-08-07 08:56:54 +02:00
x509cset.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509name.c x509/x509name.c: fix potential crash in X509_NAME_get_text_by_OBJ. 2018-08-07 08:56:17 +02:00
x509rset.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509spki.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x509type.c Add support for RSA-PSS to X509_certificate_type() 2018-06-11 11:03:23 +01:00
x_all.c Use safestack.h exclusively internally. 2017-09-28 13:14:33 +10:00
x_attrib.c Remove parentheses of return. 2017-10-18 16:05:06 +01:00
x_crl.c Harmonize use of sk_TYPE_find's return value. 2018-08-07 08:56:54 +02:00
x_exten.c
x_name.c Restore check of |*xn| against |name| in X509_NAME_set 2018-05-20 09:48:58 +02:00
x_pubkey.c Update copyright year 2018-05-01 13:34:30 +01:00
x_req.c
x_x509.c Update copyright year 2018-05-01 13:34:30 +01:00
x_x509a.c