Apply self-imposed path length also to root CAs
authorViktor Dukhovni <openssl-users@dukhovni.org>
Mon, 8 Oct 2018 16:05:14 +0000 (12:05 -0400)
committerViktor Dukhovni <openssl-users@dukhovni.org>
Thu, 18 Oct 2018 04:43:52 +0000 (00:43 -0400)
Also, some readers of the code find starting the count at 1 for EE
cert confusing (since RFC5280 counts only non-self-issued intermediate
CAs, but we also counted the leaf).  Therefore, never count the EE
cert, and adjust the path length comparison accordinly.  This may
be more clear to the reader.

Reviewed-by: Matt Caswell <matt@openssl.org>
(cherry picked from commit dc5831da59e9bfad61ba425d886a0b06ac160cd6)

crypto/x509/x509_vfy.c

index 1a1a65d9cf3e1783040780a019fe6820e422916f..da778d47b1cc1e6ae54702139f24a9ff2687589a 100644 (file)
@@ -694,10 +694,9 @@ static int check_chain_extensions(X509_STORE_CTX *ctx)
                     goto end;
             }
         }
-        /* Check pathlen if not self issued */
-        if ((i > 1) && !(x->ex_flags & EXFLAG_SI)
-            && (x->ex_pathlen != -1)
-            && (plen > (x->ex_pathlen + proxy_path_length + 1))) {
+        /* Check pathlen */
+        if ((i > 1) && (x->ex_pathlen != -1)
+            && (plen > (x->ex_pathlen + proxy_path_length))) {
             ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
             ctx->error_depth = i;
             ctx->current_cert = x;
@@ -706,7 +705,7 @@ static int check_chain_extensions(X509_STORE_CTX *ctx)
                 goto end;
         }
         /* Increment path length if not a self issued intermediate CA */
-        if (i == 0 || (x->ex_flags & EXFLAG_SI) == 0)
+        if (i > 0 && (x->ex_flags & EXFLAG_SI) == 0)
             plen++;
         /*
          * If this certificate is a proxy certificate, the next certificate