LCOV - code coverage report
Current view: top level - x509 - x509_vfy.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 426 1048 40.6 %
Date: 2014-08-02 Functions: 38 72 52.8 %
Branches: 238 815 29.2 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/x509/x509_vfy.c */
       2                 :            : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3                 :            :  * All rights reserved.
       4                 :            :  *
       5                 :            :  * This package is an SSL implementation written
       6                 :            :  * by Eric Young (eay@cryptsoft.com).
       7                 :            :  * The implementation was written so as to conform with Netscapes SSL.
       8                 :            :  * 
       9                 :            :  * This library is free for commercial and non-commercial use as long as
      10                 :            :  * the following conditions are aheared to.  The following conditions
      11                 :            :  * apply to all code found in this distribution, be it the RC4, RSA,
      12                 :            :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13                 :            :  * included with this distribution is covered by the same copyright terms
      14                 :            :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15                 :            :  * 
      16                 :            :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17                 :            :  * the code are not to be removed.
      18                 :            :  * If this package is used in a product, Eric Young should be given attribution
      19                 :            :  * as the author of the parts of the library used.
      20                 :            :  * This can be in the form of a textual message at program startup or
      21                 :            :  * in documentation (online or textual) provided with the package.
      22                 :            :  * 
      23                 :            :  * Redistribution and use in source and binary forms, with or without
      24                 :            :  * modification, are permitted provided that the following conditions
      25                 :            :  * are met:
      26                 :            :  * 1. Redistributions of source code must retain the copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer.
      28                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      29                 :            :  *    notice, this list of conditions and the following disclaimer in the
      30                 :            :  *    documentation and/or other materials provided with the distribution.
      31                 :            :  * 3. All advertising materials mentioning features or use of this software
      32                 :            :  *    must display the following acknowledgement:
      33                 :            :  *    "This product includes cryptographic software written by
      34                 :            :  *     Eric Young (eay@cryptsoft.com)"
      35                 :            :  *    The word 'cryptographic' can be left out if the rouines from the library
      36                 :            :  *    being used are not cryptographic related :-).
      37                 :            :  * 4. If you include any Windows specific code (or a derivative thereof) from 
      38                 :            :  *    the apps directory (application code) you must include an acknowledgement:
      39                 :            :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40                 :            :  * 
      41                 :            :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51                 :            :  * SUCH DAMAGE.
      52                 :            :  * 
      53                 :            :  * The licence and distribution terms for any publically available version or
      54                 :            :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55                 :            :  * copied and put under another distribution licence
      56                 :            :  * [including the GNU Public Licence.]
      57                 :            :  */
      58                 :            : 
      59                 :            : #include <stdio.h>
      60                 :            : #include <time.h>
      61                 :            : #include <errno.h>
      62                 :            : 
      63                 :            : #include "cryptlib.h"
      64                 :            : #include <openssl/crypto.h>
      65                 :            : #include <openssl/lhash.h>
      66                 :            : #include <openssl/buffer.h>
      67                 :            : #include <openssl/evp.h>
      68                 :            : #include <openssl/asn1.h>
      69                 :            : #include <openssl/x509.h>
      70                 :            : #include <openssl/x509v3.h>
      71                 :            : #include <openssl/objects.h>
      72                 :            : #include "x509_lcl.h"
      73                 :            : 
      74                 :            : /* CRL score values */
      75                 :            : 
      76                 :            : /* No unhandled critical extensions */
      77                 :            : 
      78                 :            : #define CRL_SCORE_NOCRITICAL    0x100
      79                 :            : 
      80                 :            : /* certificate is within CRL scope */
      81                 :            : 
      82                 :            : #define CRL_SCORE_SCOPE         0x080
      83                 :            : 
      84                 :            : /* CRL times valid */
      85                 :            : 
      86                 :            : #define CRL_SCORE_TIME          0x040
      87                 :            : 
      88                 :            : /* Issuer name matches certificate */
      89                 :            : 
      90                 :            : #define CRL_SCORE_ISSUER_NAME   0x020
      91                 :            : 
      92                 :            : /* If this score or above CRL is probably valid */
      93                 :            : 
      94                 :            : #define CRL_SCORE_VALID (CRL_SCORE_NOCRITICAL|CRL_SCORE_TIME|CRL_SCORE_SCOPE)
      95                 :            : 
      96                 :            : /* CRL issuer is certificate issuer */
      97                 :            : 
      98                 :            : #define CRL_SCORE_ISSUER_CERT   0x018
      99                 :            : 
     100                 :            : /* CRL issuer is on certificate path */
     101                 :            : 
     102                 :            : #define CRL_SCORE_SAME_PATH     0x008
     103                 :            : 
     104                 :            : /* CRL issuer matches CRL AKID */
     105                 :            : 
     106                 :            : #define CRL_SCORE_AKID          0x004
     107                 :            : 
     108                 :            : /* Have a delta CRL with valid times */
     109                 :            : 
     110                 :            : #define CRL_SCORE_TIME_DELTA    0x002
     111                 :            : 
     112                 :            : static int null_callback(int ok,X509_STORE_CTX *e);
     113                 :            : static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
     114                 :            : static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x);
     115                 :            : static int check_chain_extensions(X509_STORE_CTX *ctx);
     116                 :            : static int check_name_constraints(X509_STORE_CTX *ctx);
     117                 :            : static int check_id(X509_STORE_CTX *ctx);
     118                 :            : static int check_trust(X509_STORE_CTX *ctx);
     119                 :            : static int check_revocation(X509_STORE_CTX *ctx);
     120                 :            : static int check_cert(X509_STORE_CTX *ctx);
     121                 :            : static int check_policy(X509_STORE_CTX *ctx);
     122                 :            : 
     123                 :            : static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer,
     124                 :            :                         unsigned int *preasons,
     125                 :            :                         X509_CRL *crl, X509 *x);
     126                 :            : static int get_crl_delta(X509_STORE_CTX *ctx,
     127                 :            :                                 X509_CRL **pcrl, X509_CRL **pdcrl, X509 *x);
     128                 :            : static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pcrl_score,
     129                 :            :                         X509_CRL *base, STACK_OF(X509_CRL) *crls);
     130                 :            : static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl,
     131                 :            :                                 X509 **pissuer, int *pcrl_score);
     132                 :            : static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score,
     133                 :            :                                 unsigned int *preasons);
     134                 :            : static int check_crl_path(X509_STORE_CTX *ctx, X509 *x);
     135                 :            : static int check_crl_chain(X509_STORE_CTX *ctx,
     136                 :            :                         STACK_OF(X509) *cert_path,
     137                 :            :                         STACK_OF(X509) *crl_path);
     138                 :            : 
     139                 :            : static int internal_verify(X509_STORE_CTX *ctx);
     140                 :            : const char X509_version[]="X.509" OPENSSL_VERSION_PTEXT;
     141                 :            : 
     142                 :            : 
     143                 :       2004 : static int null_callback(int ok, X509_STORE_CTX *e)
     144                 :            :         {
     145                 :       2004 :         return ok;
     146                 :            :         }
     147                 :            : 
     148                 :            : #if 0
     149                 :            : static int x509_subject_cmp(X509 **a, X509 **b)
     150                 :            :         {
     151                 :            :         return X509_subject_name_cmp(*a,*b);
     152                 :            :         }
     153                 :            : #endif
     154                 :            : /* Return 1 is a certificate is self signed */
     155                 :      12192 : static int cert_self_signed(X509 *x)
     156                 :            :         {
     157                 :      12192 :         X509_check_purpose(x, -1, 0);
     158         [ +  + ]:      12192 :         if (x->ex_flags & EXFLAG_SS)
     159                 :            :                 return 1;
     160                 :            :         else
     161                 :      10587 :                 return 0;
     162                 :            :         }
     163                 :            : 
     164                 :            : /* Given a certificate try and find an exact match in the store */
     165                 :            : 
     166                 :          8 : static X509 *lookup_cert_match(X509_STORE_CTX *ctx, X509 *x)
     167                 :            :         {
     168                 :            :         STACK_OF(X509) *certs;
     169                 :          8 :         X509 *xtmp = NULL;
     170                 :            :         int i;
     171                 :            :         /* Lookup all certs with matching subject name */
     172                 :          8 :         certs = ctx->lookup_certs(ctx, X509_get_subject_name(x));
     173         [ +  + ]:          8 :         if (certs == NULL)
     174                 :            :                 return NULL;
     175                 :            :         /* Look for exact match */
     176         [ +  - ]:          5 :         for (i = 0; i < sk_X509_num(certs); i++)
     177                 :            :                 {
     178                 :          5 :                 xtmp = sk_X509_value(certs, i);
     179         [ -  + ]:          5 :                 if (!X509_cmp(xtmp, x))
     180                 :            :                         break;
     181                 :            :                 }
     182         [ +  - ]:          5 :         if (i < sk_X509_num(certs))
     183                 :          5 :                 CRYPTO_add(&xtmp->references,1,CRYPTO_LOCK_X509);
     184                 :            :         else
     185                 :            :                 xtmp = NULL;
     186                 :          5 :         sk_X509_pop_free(certs, X509_free);
     187                 :          5 :         return xtmp;
     188                 :            :         }
     189                 :            : 
     190                 :       2353 : int X509_verify_cert(X509_STORE_CTX *ctx)
     191                 :            :         {
     192                 :       2353 :         X509 *x,*xtmp,*chain_ss=NULL;
     193                 :       2353 :         int bad_chain = 0;
     194                 :       2353 :         X509_VERIFY_PARAM *param = ctx->param;
     195                 :       2353 :         int depth,i,ok=0;
     196                 :            :         int num;
     197                 :            :         int (*cb)(int xok,X509_STORE_CTX *xctx);
     198                 :       2353 :         STACK_OF(X509) *sktmp=NULL;
     199         [ -  + ]:       2353 :         if (ctx->cert == NULL)
     200                 :            :                 {
     201                 :          0 :                 X509err(X509_F_X509_VERIFY_CERT,X509_R_NO_CERT_SET_FOR_US_TO_VERIFY);
     202                 :          0 :                 return -1;
     203                 :            :                 }
     204                 :            : 
     205                 :       2353 :         cb=ctx->verify_cb;
     206                 :            : 
     207                 :            :         /* first we make sure the chain we are going to build is
     208                 :            :          * present and that the first entry is in place */
     209         [ +  - ]:       2353 :         if (ctx->chain == NULL)
     210                 :            :                 {
     211   [ +  -  -  + ]:       4706 :                 if (    ((ctx->chain=sk_X509_new_null()) == NULL) ||
     212                 :       2353 :                         (!sk_X509_push(ctx->chain,ctx->cert)))
     213                 :            :                         {
     214                 :          0 :                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
     215                 :          0 :                         goto end;
     216                 :            :                         }
     217                 :       2353 :                 CRYPTO_add(&ctx->cert->references,1,CRYPTO_LOCK_X509);
     218                 :       2353 :                 ctx->last_untrusted=1;
     219                 :            :                 }
     220                 :            : 
     221                 :            :         /* We use a temporary STACK so we can chop and hack at it */
     222         [ +  + ]:       2353 :         if (ctx->untrusted != NULL
     223         [ -  + ]:       1301 :             && (sktmp=sk_X509_dup(ctx->untrusted)) == NULL)
     224                 :            :                 {
     225                 :          0 :                 X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
     226                 :          0 :                 goto end;
     227                 :            :                 }
     228                 :            : 
     229                 :       2353 :         num=sk_X509_num(ctx->chain);
     230                 :       2353 :         x=sk_X509_value(ctx->chain,num-1);
     231                 :       2353 :         depth=param->depth;
     232                 :            : 
     233                 :            : 
     234                 :            :         for (;;)
     235                 :            :                 {
     236                 :            :                 /* If we have enough, we break */
     237         [ +  - ]:       2859 :                 if (depth < num) break; /* FIXME: If this happens, we should take
     238                 :            :                                          * note of it and, if appropriate, use the
     239                 :            :                                          * X509_V_ERR_CERT_CHAIN_TOO_LONG error
     240                 :            :                                          * code later.
     241                 :            :                                          */
     242                 :            : 
     243                 :            :                 /* If we are self signed, we break */
     244         [ +  + ]:       2859 :                 if (cert_self_signed(x))
     245                 :            :                         break;
     246                 :            :                 /* If asked see if we can find issuer in trusted store first */
     247         [ -  + ]:       2629 :                 if (ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST)
     248                 :            :                         {
     249                 :          0 :                         ok = ctx->get_issuer(&xtmp, ctx, x);
     250         [ #  # ]:          0 :                         if (ok < 0)
     251                 :            :                                 return ok;
     252                 :            :                         /* If successful for now free up cert so it
     253                 :            :                          * will be picked up again later.
     254                 :            :                          */
     255         [ #  # ]:          0 :                         if (ok > 0)
     256                 :            :                                 {
     257                 :          0 :                                 X509_free(xtmp);
     258                 :          0 :                                 break;
     259                 :            :                                 }
     260                 :            :                         }
     261                 :            : 
     262                 :            :                 /* If we were passed a cert chain, use it first */
     263         [ +  + ]:       2629 :                 if (ctx->untrusted != NULL)
     264                 :            :                         {
     265                 :       1584 :                         xtmp=find_issuer(ctx, sktmp,x);
     266         [ +  + ]:       1584 :                         if (xtmp != NULL)
     267                 :            :                                 {
     268         [ -  + ]:        506 :                                 if (!sk_X509_push(ctx->chain,xtmp))
     269                 :            :                                         {
     270                 :          0 :                                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
     271                 :          0 :                                         goto end;
     272                 :            :                                         }
     273                 :        506 :                                 CRYPTO_add(&xtmp->references,1,CRYPTO_LOCK_X509);
     274                 :        506 :                                 (void)sk_X509_delete_ptr(sktmp,xtmp);
     275                 :        506 :                                 ctx->last_untrusted++;
     276                 :        506 :                                 x=xtmp;
     277                 :        506 :                                 num++;
     278                 :            :                                 /* reparse the full chain for
     279                 :            :                                  * the next one */
     280                 :        506 :                                 continue;
     281                 :            :                                 }
     282                 :            :                         }
     283                 :            :                 break;
     284                 :        506 :                 }
     285                 :            : 
     286                 :            :         /* at this point, chain should contain a list of untrusted
     287                 :            :          * certificates.  We now need to add at least one trusted one,
     288                 :            :          * if possible, otherwise we complain. */
     289                 :            : 
     290                 :            :         /* Examine last certificate in chain and see if it
     291                 :            :          * is self signed.
     292                 :            :          */
     293                 :            : 
     294                 :       2353 :         i=sk_X509_num(ctx->chain);
     295                 :       2353 :         x=sk_X509_value(ctx->chain,i-1);
     296         [ +  + ]:       2353 :         if (cert_self_signed(x))
     297                 :            :                 {
     298                 :            :                 /* we have a self signed certificate */
     299         [ +  + ]:        230 :                 if (sk_X509_num(ctx->chain) == 1)
     300                 :            :                         {
     301                 :            :                         /* We have a single self signed certificate: see if
     302                 :            :                          * we can find it in the store. We must have an exact
     303                 :            :                          * match to avoid possible impersonation.
     304                 :            :                          */
     305                 :          7 :                         ok = ctx->get_issuer(&xtmp, ctx, x);
     306 [ +  - ][ -  + ]:          7 :                         if ((ok <= 0) || X509_cmp(x, xtmp)) 
     307                 :            :                                 {
     308                 :          0 :                                 ctx->error=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
     309                 :          0 :                                 ctx->current_cert=x;
     310                 :          0 :                                 ctx->error_depth=i-1;
     311         [ #  # ]:          0 :                                 if (ok == 1) X509_free(xtmp);
     312                 :          0 :                                 bad_chain = 1;
     313                 :          0 :                                 ok=cb(0,ctx);
     314         [ #  # ]:          0 :                                 if (!ok) goto end;
     315                 :            :                                 }
     316                 :            :                         else 
     317                 :            :                                 {
     318                 :            :                                 /* We have a match: replace certificate with store version
     319                 :            :                                  * so we get any trust settings.
     320                 :            :                                  */
     321                 :          7 :                                 X509_free(x);
     322                 :          7 :                                 x = xtmp;
     323                 :          7 :                                 (void)sk_X509_set(ctx->chain, i - 1, x);
     324                 :          7 :                                 ctx->last_untrusted=0;
     325                 :            :                                 }
     326                 :            :                         }
     327                 :            :                 else
     328                 :            :                         {
     329                 :            :                         /* extract and save self signed certificate for later use */
     330                 :        223 :                         chain_ss=sk_X509_pop(ctx->chain);
     331                 :        223 :                         ctx->last_untrusted--;
     332                 :        223 :                         num--;
     333                 :       2353 :                         x=sk_X509_value(ctx->chain,num-1);
     334                 :            :                         }
     335                 :            :                 }
     336                 :            : 
     337                 :            :         /* We now lookup certs from the certificate store */
     338                 :            :         for (;;)
     339                 :            :                 {
     340                 :            :                 /* If we have enough, we break */
     341         [ +  - ]:       3541 :                 if (depth < num) break;
     342                 :            : 
     343                 :            :                 /* If we are self signed, we break */
     344         [ +  + ]:       3541 :                 if (cert_self_signed(x))
     345                 :            :                         break;
     346                 :            : 
     347                 :       2832 :                 ok = ctx->get_issuer(&xtmp, ctx, x);
     348                 :            : 
     349         [ +  - ]:       2832 :                 if (ok < 0) return ok;
     350         [ +  + ]:       2832 :                 if (ok == 0) break;
     351                 :            : 
     352                 :       1188 :                 x = xtmp;
     353         [ -  + ]:       1188 :                 if (!sk_X509_push(ctx->chain,x))
     354                 :            :                         {
     355                 :          0 :                         X509_free(xtmp);
     356                 :          0 :                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
     357                 :          0 :                         return 0;
     358                 :            :                         }
     359                 :       1188 :                 num++;
     360                 :       1188 :                 }
     361                 :            : 
     362                 :            :         /* we now have our chain, lets check it... */
     363                 :            : 
     364                 :       2353 :         i = check_trust(ctx);
     365                 :            : 
     366                 :            :         /* If explicitly rejected error */
     367         [ +  - ]:       2353 :         if (i == X509_TRUST_REJECTED)
     368                 :            :                 goto end;
     369                 :            :         /* If not explicitly trusted then indicate error unless it's
     370                 :            :          * a single self signed certificate in which case we've indicated
     371                 :            :          * an error already and set bad_chain == 1
     372                 :            :          */
     373         [ +  + ]:       2353 :         if (i != X509_TRUST_TRUSTED && !bad_chain)
     374                 :            :                 {
     375 [ -  + ][ #  # ]:       1635 :                 if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss))
     376                 :            :                         {
     377         [ +  - ]:       1635 :                         if (ctx->last_untrusted >= num)
     378                 :       1635 :                                 ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
     379                 :            :                         else
     380                 :          0 :                                 ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
     381                 :       1635 :                         ctx->current_cert=x;
     382                 :            :                         }
     383                 :            :                 else
     384                 :            :                         {
     385                 :            : 
     386                 :          0 :                         sk_X509_push(ctx->chain,chain_ss);
     387                 :          0 :                         num++;
     388                 :          0 :                         ctx->last_untrusted=num;
     389                 :          0 :                         ctx->current_cert=chain_ss;
     390                 :          0 :                         ctx->error=X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
     391                 :          0 :                         chain_ss=NULL;
     392                 :            :                         }
     393                 :            : 
     394                 :       1635 :                 ctx->error_depth=num-1;
     395                 :       1635 :                 bad_chain = 1;
     396                 :       1635 :                 ok=cb(0,ctx);
     397         [ -  + ]:       1635 :                 if (!ok) goto end;
     398                 :            :                 }
     399                 :            : 
     400                 :            :         /* We have the chain complete: now we need to check its purpose */
     401                 :        718 :         ok = check_chain_extensions(ctx);
     402                 :            : 
     403         [ +  + ]:        718 :         if (!ok) goto end;
     404                 :            : 
     405                 :            :         /* Check name constraints */
     406                 :            : 
     407                 :        436 :         ok = check_name_constraints(ctx);
     408                 :            :         
     409         [ +  - ]:        436 :         if (!ok) goto end;
     410                 :            : 
     411                 :        436 :         ok = check_id(ctx);
     412                 :            : 
     413         [ +  - ]:        436 :         if (!ok) goto end;
     414                 :            : 
     415                 :            :         /* We may as well copy down any DSA parameters that are required */
     416                 :        436 :         X509_get_pubkey_parameters(NULL,ctx->chain);
     417                 :            : 
     418                 :            :         /* Check revocation status: we do this after copying parameters
     419                 :            :          * because they may be needed for CRL signature verification.
     420                 :            :          */
     421                 :            : 
     422                 :        436 :         ok = ctx->check_revocation(ctx);
     423         [ +  - ]:        436 :         if(!ok) goto end;
     424                 :            : 
     425                 :        436 :         i = X509_chain_check_suiteb(&ctx->error_depth, NULL, ctx->chain,
     426                 :        436 :                                                         ctx->param->flags);
     427         [ -  + ]:        436 :         if (i != X509_V_OK)
     428                 :            :                 {
     429                 :          0 :                 ctx->error = i;
     430                 :          0 :                 ctx->current_cert = sk_X509_value(ctx->chain, ctx->error_depth);
     431                 :          0 :                 ok = cb(0, ctx);
     432         [ #  # ]:          0 :                 if (!ok)
     433                 :            :                         goto end;
     434                 :            :                 }
     435                 :            : 
     436                 :            :         /* At this point, we have a chain and need to verify it */
     437         [ +  - ]:        436 :         if (ctx->verify != NULL)
     438                 :        436 :                 ok=ctx->verify(ctx);
     439                 :            :         else
     440                 :          0 :                 ok=internal_verify(ctx);
     441         [ +  + ]:        436 :         if(!ok) goto end;
     442                 :            : 
     443                 :            : #ifndef OPENSSL_NO_RFC3779
     444                 :            :         /* RFC 3779 path validation, now that CRL check has been done */
     445                 :            :         ok = v3_asid_validate_path(ctx);
     446                 :            :         if (!ok) goto end;
     447                 :            :         ok = v3_addr_validate_path(ctx);
     448                 :            :         if (!ok) goto end;
     449                 :            : #endif
     450                 :            : 
     451                 :            :         /* If we get this far evaluate policies */
     452 [ +  - ][ -  + ]:        430 :         if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK))
     453                 :          0 :                 ok = ctx->check_policy(ctx);
     454         [ -  + ]:        430 :         if(!ok) goto end;
     455                 :            :         if (0)
     456                 :            :                 {
     457                 :            : end:
     458                 :       1923 :                 X509_get_pubkey_parameters(NULL,ctx->chain);
     459                 :            :                 }
     460         [ +  + ]:       2353 :         if (sktmp != NULL) sk_X509_free(sktmp);
     461         [ +  + ]:       2353 :         if (chain_ss != NULL) X509_free(chain_ss);
     462                 :       2353 :         return ok;
     463                 :            :         }
     464                 :            : 
     465                 :            : 
     466                 :            : /* Given a STACK_OF(X509) find the issuer of cert (if any)
     467                 :            :  */
     468                 :            : 
     469                 :       1584 : static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x)
     470                 :            : {
     471                 :            :         int i;
     472                 :       1584 :         X509 *issuer, *rv = NULL;;
     473         [ +  + ]:       3337 :         for (i = 0; i < sk_X509_num(sk); i++)
     474                 :            :                 {
     475                 :       2259 :                 issuer = sk_X509_value(sk, i);
     476         [ +  + ]:       2259 :                 if (ctx->check_issued(ctx, x, issuer))
     477                 :            :                         {
     478                 :        506 :                         rv = issuer;
     479         [ -  + ]:        506 :                         if (x509_check_cert_time(ctx, rv, 1))
     480                 :            :                                 break;
     481                 :            :                         }
     482                 :            :                 }
     483                 :       1584 :         return rv;
     484                 :            : }
     485                 :            : 
     486                 :            : /* Given a possible certificate and issuer check them */
     487                 :            : 
     488                 :       3894 : static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer)
     489                 :            : {
     490                 :            :         int ret;
     491         [ +  + ]:       3894 :         if (x == issuer)
     492                 :       1734 :                 return cert_self_signed(x);
     493                 :       2160 :         ret = X509_check_issued(issuer, x);
     494         [ +  + ]:       2160 :         if (ret == X509_V_OK)
     495                 :            :                 {
     496                 :            :                 int i;
     497                 :            :                 X509 *ch;
     498                 :            :                 /* Special case: single self signed certificate */
     499 [ +  + ][ -  + ]:       1705 :                 if (cert_self_signed(x) && sk_X509_num(ctx->chain) == 1)
     500                 :            :                         return 1;
     501         [ +  + ]:       4658 :                 for (i = 0; i < sk_X509_num(ctx->chain); i++)
     502                 :            :                         {
     503                 :       2962 :                         ch = sk_X509_value(ctx->chain, i);
     504 [ +  - ][ +  - ]:       2962 :                         if (ch == issuer || !X509_cmp(ch, issuer))
     505                 :            :                                 {
     506                 :            :                                 ret = X509_V_ERR_PATH_LOOP;
     507                 :            :                                 break;
     508                 :            :                                 }
     509                 :            :                         }
     510                 :            :                 }
     511                 :            : 
     512         [ +  + ]:       2151 :         if (ret == X509_V_OK)
     513                 :            :                 return 1;
     514                 :            :         /* If we haven't asked for issuer errors don't set ctx */
     515         [ -  + ]:        455 :         if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK))
     516                 :            :                 return 0;
     517                 :            : 
     518                 :          0 :         ctx->error = ret;
     519                 :          0 :         ctx->current_cert = x;
     520                 :          0 :         ctx->current_issuer = issuer;
     521                 :          0 :         return ctx->verify_cb(0, ctx);
     522                 :            :         return 0;
     523                 :            : }
     524                 :            : 
     525                 :            : /* Alternative lookup method: look from a STACK stored in other_ctx */
     526                 :            : 
     527                 :          0 : static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
     528                 :            : {
     529                 :          0 :         *issuer = find_issuer(ctx, ctx->other_ctx, x);
     530         [ #  # ]:          0 :         if (*issuer)
     531                 :            :                 {
     532                 :          0 :                 CRYPTO_add(&(*issuer)->references,1,CRYPTO_LOCK_X509);
     533                 :          0 :                 return 1;
     534                 :            :                 }
     535                 :            :         else
     536                 :            :                 return 0;
     537                 :            : }
     538                 :            :         
     539                 :            : 
     540                 :            : /* Check a certificate chains extensions for consistency
     541                 :            :  * with the supplied purpose
     542                 :            :  */
     543                 :            : 
     544                 :        718 : static int check_chain_extensions(X509_STORE_CTX *ctx)
     545                 :            : {
     546                 :            : #ifdef OPENSSL_NO_CHAIN_VERIFY
     547                 :            :         return 1;
     548                 :            : #else
     549                 :        718 :         int i, ok=0, must_be_ca, plen = 0;
     550                 :            :         X509 *x;
     551                 :            :         int (*cb)(int xok,X509_STORE_CTX *xctx);
     552                 :        718 :         int proxy_path_length = 0;
     553                 :            :         int purpose;
     554                 :            :         int allow_proxy_certs;
     555                 :        718 :         cb=ctx->verify_cb;
     556                 :            : 
     557                 :            :         /* must_be_ca can have 1 of 3 values:
     558                 :            :            -1: we accept both CA and non-CA certificates, to allow direct
     559                 :            :                use of self-signed certificates (which are marked as CA).
     560                 :            :            0:  we only accept non-CA certificates.  This is currently not
     561                 :            :                used, but the possibility is present for future extensions.
     562                 :            :            1:  we only accept CA certificates.  This is currently used for
     563                 :            :                all certificates in the chain except the leaf certificate.
     564                 :            :         */
     565                 :        718 :         must_be_ca = -1;
     566                 :            : 
     567                 :            :         /* CRL path validation */
     568         [ +  - ]:        718 :         if (ctx->parent)
     569                 :            :                 {
     570                 :            :                 allow_proxy_certs = 0;
     571                 :            :                 purpose = X509_PURPOSE_CRL_SIGN;
     572                 :            :                 }
     573                 :            :         else
     574                 :            :                 {
     575                 :        718 :                 allow_proxy_certs =
     576                 :        718 :                         !!(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS);
     577                 :            :                 /* A hack to keep people who don't want to modify their
     578                 :            :                    software happy */
     579         [ -  + ]:        718 :                 if (getenv("OPENSSL_ALLOW_PROXY_CERTS"))
     580                 :          0 :                         allow_proxy_certs = 1;
     581                 :        718 :                 purpose = ctx->param->purpose;
     582                 :            :                 }
     583                 :            : 
     584                 :            :         /* Check all untrusted certificates */
     585         [ +  + ]:       1366 :         for (i = 0; i < ctx->last_untrusted; i++)
     586                 :            :                 {
     587                 :            :                 int ret;
     588                 :        930 :                 x = sk_X509_value(ctx->chain, i);
     589         [ +  - ]:        930 :                 if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
     590         [ -  + ]:        930 :                         && (x->ex_flags & EXFLAG_CRITICAL))
     591                 :            :                         {
     592                 :          0 :                         ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION;
     593                 :          0 :                         ctx->error_depth = i;
     594                 :          0 :                         ctx->current_cert = x;
     595                 :          0 :                         ok=cb(0,ctx);
     596         [ #  # ]:          0 :                         if (!ok) goto end;
     597                 :            :                         }
     598 [ +  + ][ +  + ]:        930 :                 if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY))
     599                 :            :                         {
     600                 :        282 :                         ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED;
     601                 :        282 :                         ctx->error_depth = i;
     602                 :        282 :                         ctx->current_cert = x;
     603                 :        282 :                         ok=cb(0,ctx);
     604         [ -  + ]:        282 :                         if (!ok) goto end;
     605                 :            :                         }
     606                 :        648 :                 ret = X509_check_ca(x);
     607      [ +  +  - ]:        648 :                 switch(must_be_ca)
     608                 :            :                         {
     609                 :            :                 case -1:
     610         [ -  + ]:        424 :                         if ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
     611         [ #  # ]:          0 :                                 && (ret != 1) && (ret != 0))
     612                 :            :                                 {
     613                 :          0 :                                 ret = 0;
     614                 :          0 :                                 ctx->error = X509_V_ERR_INVALID_CA;
     615                 :            :                                 }
     616                 :            :                         else
     617                 :            :                                 ret = 1;
     618                 :            :                         break;
     619                 :            :                 case 0:
     620         [ -  + ]:        224 :                         if (ret != 0)
     621                 :            :                                 {
     622                 :          0 :                                 ret = 0;
     623                 :          0 :                                 ctx->error = X509_V_ERR_INVALID_NON_CA;
     624                 :            :                                 }
     625                 :            :                         else
     626                 :            :                                 ret = 1;
     627                 :            :                         break;
     628                 :            :                 default:
     629         [ #  # ]:          0 :                         if ((ret == 0)
     630         [ #  # ]:          0 :                                 || ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
     631         [ #  # ]:          0 :                                         && (ret != 1)))
     632                 :            :                                 {
     633                 :          0 :                                 ret = 0;
     634                 :          0 :                                 ctx->error = X509_V_ERR_INVALID_CA;
     635                 :            :                                 }
     636                 :            :                         else
     637                 :            :                                 ret = 1;
     638                 :            :                         break;
     639                 :            :                         }
     640         [ -  + ]:        648 :                 if (ret == 0)
     641                 :            :                         {
     642                 :          0 :                         ctx->error_depth = i;
     643                 :          0 :                         ctx->current_cert = x;
     644                 :          0 :                         ok=cb(0,ctx);
     645         [ #  # ]:          0 :                         if (!ok) goto end;
     646                 :            :                         }
     647         [ +  + ]:        648 :                 if (ctx->param->purpose > 0)
     648                 :            :                         {
     649                 :        622 :                         ret = X509_check_purpose(x, purpose, must_be_ca > 0);
     650         [ +  - ]:        622 :                         if ((ret == 0)
     651         [ -  + ]:        622 :                                 || ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
     652         [ #  # ]:          0 :                                         && (ret != 1)))
     653                 :            :                                 {
     654                 :          0 :                                 ctx->error = X509_V_ERR_INVALID_PURPOSE;
     655                 :          0 :                                 ctx->error_depth = i;
     656                 :          0 :                                 ctx->current_cert = x;
     657                 :          0 :                                 ok=cb(0,ctx);
     658         [ #  # ]:          0 :                                 if (!ok) goto end;
     659                 :            :                                 }
     660                 :            :                         }
     661                 :            :                 /* Check pathlen if not self issued */
     662 [ +  + ][ +  - ]:        648 :                 if ((i > 1) && !(x->ex_flags & EXFLAG_SI)
     663         [ -  + ]:         64 :                            && (x->ex_pathlen != -1)
     664         [ #  # ]:          0 :                            && (plen > (x->ex_pathlen + proxy_path_length + 1)))
     665                 :            :                         {
     666                 :          0 :                         ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
     667                 :          0 :                         ctx->error_depth = i;
     668                 :          0 :                         ctx->current_cert = x;
     669                 :          0 :                         ok=cb(0,ctx);
     670         [ #  # ]:          0 :                         if (!ok) goto end;
     671                 :            :                         }
     672                 :            :                 /* Increment path length if not self issued */
     673         [ +  - ]:        648 :                 if (!(x->ex_flags & EXFLAG_SI))
     674                 :        648 :                         plen++;
     675                 :            :                 /* If this certificate is a proxy certificate, the next
     676                 :            :                    certificate must be another proxy certificate or a EE
     677                 :            :                    certificate.  If not, the next certificate must be a
     678                 :            :                    CA certificate.  */
     679         [ +  + ]:        648 :                 if (x->ex_flags & EXFLAG_PROXY)
     680                 :            :                         {
     681 [ +  - ][ -  + ]:        326 :                         if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen)
     682                 :            :                                 {
     683                 :          0 :                                 ctx->error =
     684                 :            :                                         X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
     685                 :          0 :                                 ctx->error_depth = i;
     686                 :          0 :                                 ctx->current_cert = x;
     687                 :          0 :                                 ok=cb(0,ctx);
     688         [ #  # ]:          0 :                                 if (!ok) goto end;
     689                 :            :                                 }
     690                 :        326 :                         proxy_path_length++;
     691                 :        326 :                         must_be_ca = 0;
     692                 :            :                         }
     693                 :            :                 else
     694                 :            :                         must_be_ca = 1;
     695                 :            :                 }
     696                 :            :         ok = 1;
     697                 :            :  end:
     698                 :        718 :         return ok;
     699                 :            : #endif
     700                 :            : }
     701                 :            : 
     702                 :        436 : static int check_name_constraints(X509_STORE_CTX *ctx)
     703                 :            :         {
     704                 :            :         X509 *x;
     705                 :            :         int i, j, rv;
     706                 :            :         /* Check name constraints for all certificates */
     707         [ +  + ]:       1666 :         for (i = sk_X509_num(ctx->chain) - 1; i >= 0; i--)
     708                 :            :                 {
     709                 :       1230 :                 x = sk_X509_value(ctx->chain, i);
     710                 :            :                 /* Ignore self issued certs unless last in chain */
     711 [ +  + ][ +  + ]:       1230 :                 if (i && (x->ex_flags & EXFLAG_SI))
     712                 :        420 :                         continue;
     713                 :            :                 /* Check against constraints for all certificates higher in
     714                 :            :                  * chain including trust anchor. Trust anchor not strictly
     715                 :            :                  * speaking needed but if it includes constraints it is to be
     716                 :            :                  * assumed it expects them to be obeyed.
     717                 :            :                  */
     718         [ +  + ]:       2082 :                 for (j = sk_X509_num(ctx->chain) - 1; j > i; j--)
     719                 :            :                         {
     720                 :       1272 :                         NAME_CONSTRAINTS *nc = sk_X509_value(ctx->chain, j)->nc;
     721         [ -  + ]:       1272 :                         if (nc)
     722                 :            :                                 {
     723                 :          0 :                                 rv = NAME_CONSTRAINTS_check(x, nc);
     724         [ #  # ]:          0 :                                 if (rv != X509_V_OK)
     725                 :            :                                         {
     726                 :          0 :                                         ctx->error = rv;
     727                 :          0 :                                         ctx->error_depth = i;
     728                 :          0 :                                         ctx->current_cert = x;
     729         [ #  # ]:          0 :                                         if (!ctx->verify_cb(0,ctx))
     730                 :            :                                                 return 0;
     731                 :            :                                         }
     732                 :            :                                 }
     733                 :            :                         }
     734                 :            :                 }
     735                 :            :         return 1;
     736                 :            :         }
     737                 :            : 
     738                 :          0 : static int check_id_error(X509_STORE_CTX *ctx, int errcode)
     739                 :            :         {
     740                 :          0 :         ctx->error = errcode;
     741                 :          0 :         ctx->current_cert = ctx->cert;
     742                 :          0 :         ctx->error_depth = 0;
     743                 :          0 :         return ctx->verify_cb(0, ctx);
     744                 :            :         }
     745                 :            : 
     746                 :          0 : static int check_hosts(X509 *x, X509_VERIFY_PARAM_ID *id)
     747                 :            :         {
     748                 :            :         int i;
     749                 :          0 :         int n = sk_OPENSSL_STRING_num(id->hosts);
     750                 :            :         char *name;
     751                 :            : 
     752         [ #  # ]:          0 :         for (i = 0; i < n; ++i)
     753                 :            :                 {
     754                 :          0 :                 name = sk_OPENSSL_STRING_value(id->hosts, i);
     755         [ #  # ]:          0 :                 if (X509_check_host(x, name, 0, id->hostflags,
     756                 :            :                                     &id->peername) > 0)
     757                 :            :                         return 1;
     758                 :            :                 }
     759                 :          0 :         return n == 0;
     760                 :            :         }
     761                 :            : 
     762                 :        436 : static int check_id(X509_STORE_CTX *ctx)
     763                 :            :         {
     764                 :        436 :         X509_VERIFY_PARAM *vpm = ctx->param;
     765                 :        436 :         X509_VERIFY_PARAM_ID *id = vpm->id;
     766                 :        436 :         X509 *x = ctx->cert;
     767 [ -  + ][ #  # ]:        436 :         if (id->hosts && check_hosts(x, id) <= 0)
     768                 :            :                 {
     769         [ #  # ]:          0 :                 if (!check_id_error(ctx, X509_V_ERR_HOSTNAME_MISMATCH))
     770                 :            :                         return 0;
     771                 :            :                 }
     772 [ -  + ][ #  # ]:        436 :         if (id->email && X509_check_email(x, id->email, id->emaillen, 0) <= 0)
     773                 :            :                 {
     774         [ #  # ]:          0 :                 if (!check_id_error(ctx, X509_V_ERR_EMAIL_MISMATCH))
     775                 :            :                         return 0;
     776                 :            :                 }
     777 [ -  + ][ #  # ]:        436 :         if (id->ip && X509_check_ip(x, id->ip, id->iplen, 0) <= 0)
     778                 :            :                 {
     779         [ #  # ]:          0 :                 if (!check_id_error(ctx, X509_V_ERR_IP_ADDRESS_MISMATCH))
     780                 :            :                         return 0;
     781                 :            :                 }
     782                 :            :         return 1;
     783                 :            :         }
     784                 :            : 
     785                 :       2353 : static int check_trust(X509_STORE_CTX *ctx)
     786                 :            : {
     787                 :            :         int i, ok;
     788                 :       2353 :         X509 *x = NULL;
     789                 :            :         int (*cb)(int xok,X509_STORE_CTX *xctx);
     790                 :       2353 :         cb=ctx->verify_cb;
     791                 :            :         /* Check all trusted certificates in chain */
     792         [ +  + ]:       2839 :         for (i = ctx->last_untrusted; i < sk_X509_num(ctx->chain); i++)
     793                 :            :                 {
     794                 :       1195 :                 x = sk_X509_value(ctx->chain, i);
     795                 :       1195 :                 ok = X509_check_trust(x, ctx->param->trust, 0);
     796                 :            :                 /* If explicitly trusted return trusted */
     797         [ +  + ]:       1195 :                 if (ok == X509_TRUST_TRUSTED)
     798                 :            :                         return X509_TRUST_TRUSTED;
     799                 :            :                 /* If explicitly rejected notify callback and reject if
     800                 :            :                  * not overridden.
     801                 :            :                  */
     802         [ -  + ]:        486 :                 if (ok == X509_TRUST_REJECTED)
     803                 :            :                         {
     804                 :          0 :                         ctx->error_depth = i;
     805                 :          0 :                         ctx->current_cert = x;
     806                 :          0 :                         ctx->error = X509_V_ERR_CERT_REJECTED;
     807                 :          0 :                         ok = cb(0, ctx);
     808         [ #  # ]:          0 :                         if (!ok)
     809                 :            :                                 return X509_TRUST_REJECTED;
     810                 :            :                         }
     811                 :            :                 }
     812                 :            :         /* If we accept partial chains and have at least one trusted
     813                 :            :          * certificate return success.
     814                 :            :          */
     815         [ +  + ]:       1644 :         if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN)
     816                 :            :                 {
     817                 :            :                 X509 *mx;
     818         [ +  + ]:         12 :                 if (ctx->last_untrusted < sk_X509_num(ctx->chain))
     819                 :            :                         return X509_TRUST_TRUSTED;
     820                 :          8 :                 x = sk_X509_value(ctx->chain, 0);
     821                 :          8 :                 mx = lookup_cert_match(ctx, x);
     822         [ +  + ]:          8 :                 if (mx)
     823                 :            :                         {
     824                 :          5 :                         (void)sk_X509_set(ctx->chain, 0, mx);
     825                 :          5 :                         X509_free(x);
     826                 :          5 :                         ctx->last_untrusted = 0;
     827                 :          5 :                         return X509_TRUST_TRUSTED;
     828                 :            :                         }
     829                 :            :                 }
     830                 :            : 
     831                 :            :         /* If no trusted certs in chain at all return untrusted and
     832                 :            :          * allow standard (no issuer cert) etc errors to be indicated.
     833                 :            :          */
     834                 :            :         return X509_TRUST_UNTRUSTED;
     835                 :            : }
     836                 :            : 
     837                 :        436 : static int check_revocation(X509_STORE_CTX *ctx)
     838                 :            :         {
     839                 :            :         int i, last, ok;
     840         [ -  + ]:        436 :         if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK))
     841                 :            :                 return 1;
     842         [ #  # ]:          0 :         if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL)
     843                 :          0 :                 last = sk_X509_num(ctx->chain) - 1;
     844                 :            :         else
     845                 :            :                 {
     846                 :            :                 /* If checking CRL paths this isn't the EE certificate */
     847         [ #  # ]:          0 :                 if (ctx->parent)
     848                 :            :                         return 1;
     849                 :            :                 last = 0;
     850                 :            :                 }
     851         [ #  # ]:          0 :         for(i = 0; i <= last; i++)
     852                 :            :                 {
     853                 :          0 :                 ctx->error_depth = i;
     854                 :          0 :                 ok = check_cert(ctx);
     855         [ #  # ]:          0 :                 if (!ok) return ok;
     856                 :            :                 }
     857                 :            :         return 1;
     858                 :            :         }
     859                 :            : 
     860                 :          0 : static int check_cert(X509_STORE_CTX *ctx)
     861                 :            :         {
     862                 :          0 :         X509_CRL *crl = NULL, *dcrl = NULL;
     863                 :            :         X509 *x;
     864                 :            :         int ok, cnum;
     865                 :            :         unsigned int last_reasons;
     866                 :          0 :         cnum = ctx->error_depth;
     867                 :          0 :         x = sk_X509_value(ctx->chain, cnum);
     868                 :          0 :         ctx->current_cert = x;
     869                 :          0 :         ctx->current_issuer = NULL;
     870                 :          0 :         ctx->current_crl_score = 0;
     871                 :          0 :         ctx->current_reasons = 0;
     872         [ #  # ]:          0 :         while (ctx->current_reasons != CRLDP_ALL_REASONS)
     873                 :            :                 {
     874                 :          0 :                 last_reasons = ctx->current_reasons;
     875                 :            :                 /* Try to retrieve relevant CRL */
     876         [ #  # ]:          0 :                 if (ctx->get_crl)
     877                 :          0 :                         ok = ctx->get_crl(ctx, &crl, x);
     878                 :            :                 else
     879                 :          0 :                         ok = get_crl_delta(ctx, &crl, &dcrl, x);
     880                 :            :                 /* If error looking up CRL, nothing we can do except
     881                 :            :                  * notify callback
     882                 :            :                  */
     883         [ #  # ]:          0 :                 if(!ok)
     884                 :            :                         {
     885                 :          0 :                         ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
     886                 :          0 :                         ok = ctx->verify_cb(0, ctx);
     887                 :          0 :                         goto err;
     888                 :            :                         }
     889                 :          0 :                 ctx->current_crl = crl;
     890                 :          0 :                 ok = ctx->check_crl(ctx, crl);
     891         [ #  # ]:          0 :                 if (!ok)
     892                 :            :                         goto err;
     893                 :            : 
     894         [ #  # ]:          0 :                 if (dcrl)
     895                 :            :                         {
     896                 :          0 :                         ok = ctx->check_crl(ctx, dcrl);
     897         [ #  # ]:          0 :                         if (!ok)
     898                 :            :                                 goto err;
     899                 :          0 :                         ok = ctx->cert_crl(ctx, dcrl, x);
     900         [ #  # ]:          0 :                         if (!ok)
     901                 :            :                                 goto err;
     902                 :            :                         }
     903                 :            :                 else
     904                 :            :                         ok = 1;
     905                 :            : 
     906                 :            :                 /* Don't look in full CRL if delta reason is removefromCRL */
     907         [ #  # ]:          0 :                 if (ok != 2)
     908                 :            :                         {
     909                 :          0 :                         ok = ctx->cert_crl(ctx, crl, x);
     910         [ #  # ]:          0 :                         if (!ok)
     911                 :            :                                 goto err;
     912                 :            :                         }
     913                 :            : 
     914                 :          0 :                 X509_CRL_free(crl);
     915                 :          0 :                 X509_CRL_free(dcrl);
     916                 :          0 :                 crl = NULL;
     917                 :          0 :                 dcrl = NULL;
     918                 :            :                 /* If reasons not updated we wont get anywhere by
     919                 :            :                  * another iteration, so exit loop.
     920                 :            :                  */
     921         [ #  # ]:          0 :                 if (last_reasons == ctx->current_reasons)
     922                 :            :                         {
     923                 :          0 :                         ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
     924                 :          0 :                         ok = ctx->verify_cb(0, ctx);
     925                 :          0 :                         goto err;
     926                 :            :                         }
     927                 :            :                 }
     928                 :            :         err:
     929                 :          0 :         X509_CRL_free(crl);
     930                 :          0 :         X509_CRL_free(dcrl);
     931                 :            : 
     932                 :          0 :         ctx->current_crl = NULL;
     933                 :          0 :         return ok;
     934                 :            : 
     935                 :            :         }
     936                 :            : 
     937                 :            : /* Check CRL times against values in X509_STORE_CTX */
     938                 :            : 
     939                 :          0 : static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify)
     940                 :            :         {
     941                 :            :         time_t *ptime;
     942                 :            :         int i;
     943         [ #  # ]:          0 :         if (notify)
     944                 :          0 :                 ctx->current_crl = crl;
     945         [ #  # ]:          0 :         if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
     946                 :          0 :                 ptime = &ctx->param->check_time;
     947                 :            :         else
     948                 :            :                 ptime = NULL;
     949                 :            : 
     950                 :          0 :         i=X509_cmp_time(X509_CRL_get_lastUpdate(crl), ptime);
     951         [ #  # ]:          0 :         if (i == 0)
     952                 :            :                 {
     953         [ #  # ]:          0 :                 if (!notify)
     954                 :            :                         return 0;
     955                 :          0 :                 ctx->error=X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD;
     956         [ #  # ]:          0 :                 if (!ctx->verify_cb(0, ctx))
     957                 :            :                         return 0;
     958                 :            :                 }
     959                 :            : 
     960         [ #  # ]:          0 :         if (i > 0)
     961                 :            :                 {
     962         [ #  # ]:          0 :                 if (!notify)
     963                 :            :                         return 0;
     964                 :          0 :                 ctx->error=X509_V_ERR_CRL_NOT_YET_VALID;
     965         [ #  # ]:          0 :                 if (!ctx->verify_cb(0, ctx))
     966                 :            :                         return 0;
     967                 :            :                 }
     968                 :            : 
     969         [ #  # ]:          0 :         if(X509_CRL_get_nextUpdate(crl))
     970                 :            :                 {
     971                 :          0 :                 i=X509_cmp_time(X509_CRL_get_nextUpdate(crl), ptime);
     972                 :            : 
     973         [ #  # ]:          0 :                 if (i == 0)
     974                 :            :                         {
     975         [ #  # ]:          0 :                         if (!notify)
     976                 :            :                                 return 0;
     977                 :          0 :                         ctx->error=X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD;
     978         [ #  # ]:          0 :                         if (!ctx->verify_cb(0, ctx))
     979                 :            :                                 return 0;
     980                 :            :                         }
     981                 :            :                 /* Ignore expiry of base CRL is delta is valid */
     982 [ #  # ][ #  # ]:          0 :                 if ((i < 0) && !(ctx->current_crl_score & CRL_SCORE_TIME_DELTA))
     983                 :            :                         {
     984         [ #  # ]:          0 :                         if (!notify)
     985                 :            :                                 return 0;
     986                 :          0 :                         ctx->error=X509_V_ERR_CRL_HAS_EXPIRED;
     987         [ #  # ]:          0 :                         if (!ctx->verify_cb(0, ctx))
     988                 :            :                                 return 0;
     989                 :            :                         }
     990                 :            :                 }
     991                 :            : 
     992         [ #  # ]:          0 :         if (notify)
     993                 :          0 :                 ctx->current_crl = NULL;
     994                 :            : 
     995                 :            :         return 1;
     996                 :            :         }
     997                 :            : 
     998                 :          0 : static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509_CRL **pdcrl,
     999                 :            :                         X509 **pissuer, int *pscore, unsigned int *preasons,
    1000                 :            :                         STACK_OF(X509_CRL) *crls)
    1001                 :            :         {
    1002                 :          0 :         int i, crl_score, best_score = *pscore;
    1003                 :          0 :         unsigned int reasons, best_reasons = 0;
    1004                 :          0 :         X509 *x = ctx->current_cert;
    1005                 :          0 :         X509_CRL *crl, *best_crl = NULL;
    1006                 :          0 :         X509 *crl_issuer = NULL, *best_crl_issuer = NULL;
    1007                 :            : 
    1008         [ #  # ]:          0 :         for (i = 0; i < sk_X509_CRL_num(crls); i++)
    1009                 :            :                 {
    1010                 :          0 :                 crl = sk_X509_CRL_value(crls, i);
    1011                 :          0 :                 reasons = *preasons;
    1012                 :          0 :                 crl_score = get_crl_score(ctx, &crl_issuer, &reasons, crl, x);
    1013                 :            : 
    1014         [ #  # ]:          0 :                 if (crl_score > best_score)
    1015                 :            :                         {
    1016                 :          0 :                         best_crl = crl;
    1017                 :          0 :                         best_crl_issuer = crl_issuer;
    1018                 :          0 :                         best_score = crl_score;
    1019                 :          0 :                         best_reasons = reasons;
    1020                 :            :                         }
    1021                 :            :                 }
    1022                 :            : 
    1023         [ #  # ]:          0 :         if (best_crl)
    1024                 :            :                 {
    1025         [ #  # ]:          0 :                 if (*pcrl)
    1026                 :          0 :                         X509_CRL_free(*pcrl);
    1027                 :          0 :                 *pcrl = best_crl;
    1028                 :          0 :                 *pissuer = best_crl_issuer;
    1029                 :          0 :                 *pscore = best_score;
    1030                 :          0 :                 *preasons = best_reasons;
    1031                 :          0 :                 CRYPTO_add(&best_crl->references, 1, CRYPTO_LOCK_X509_CRL);
    1032         [ #  # ]:          0 :                 if (*pdcrl)
    1033                 :            :                         {
    1034                 :          0 :                         X509_CRL_free(*pdcrl);
    1035                 :          0 :                         *pdcrl = NULL;
    1036                 :            :                         }
    1037                 :          0 :                 get_delta_sk(ctx, pdcrl, pscore, best_crl, crls);
    1038                 :            :                 }
    1039                 :            : 
    1040         [ #  # ]:          0 :         if (best_score >= CRL_SCORE_VALID)
    1041                 :            :                 return 1;
    1042                 :            : 
    1043                 :          0 :         return 0;
    1044                 :            :         }
    1045                 :            : 
    1046                 :            : /* Compare two CRL extensions for delta checking purposes. They should be
    1047                 :            :  * both present or both absent. If both present all fields must be identical.
    1048                 :            :  */
    1049                 :            : 
    1050                 :          0 : static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid)
    1051                 :            :         {
    1052                 :            :         ASN1_OCTET_STRING *exta, *extb;
    1053                 :            :         int i;
    1054                 :          0 :         i = X509_CRL_get_ext_by_NID(a, nid, -1);
    1055         [ #  # ]:          0 :         if (i >= 0)
    1056                 :            :                 {
    1057                 :            :                 /* Can't have multiple occurrences */
    1058         [ #  # ]:          0 :                 if (X509_CRL_get_ext_by_NID(a, nid, i) != -1)
    1059                 :            :                         return 0;
    1060                 :          0 :                 exta = X509_EXTENSION_get_data(X509_CRL_get_ext(a, i));
    1061                 :            :                 }
    1062                 :            :         else
    1063                 :            :                 exta = NULL;
    1064                 :            : 
    1065                 :          0 :         i = X509_CRL_get_ext_by_NID(b, nid, -1);
    1066                 :            : 
    1067         [ #  # ]:          0 :         if (i >= 0)
    1068                 :            :                 {
    1069                 :            : 
    1070         [ #  # ]:          0 :                 if (X509_CRL_get_ext_by_NID(b, nid, i) != -1)
    1071                 :            :                         return 0;
    1072                 :          0 :                 extb = X509_EXTENSION_get_data(X509_CRL_get_ext(b, i));
    1073                 :            :                 }
    1074                 :            :         else
    1075                 :            :                 extb = NULL;
    1076                 :            : 
    1077         [ #  # ]:          0 :         if (!exta && !extb)
    1078                 :            :                 return 1;
    1079                 :            : 
    1080         [ #  # ]:          0 :         if (!exta || !extb)
    1081                 :            :                 return 0;
    1082                 :            : 
    1083                 :            : 
    1084         [ #  # ]:          0 :         if (ASN1_OCTET_STRING_cmp(exta, extb))
    1085                 :            :                 return 0;
    1086                 :            : 
    1087                 :          0 :         return 1;
    1088                 :            :         }
    1089                 :            : 
    1090                 :            : /* See if a base and delta are compatible */
    1091                 :            : 
    1092                 :          0 : static int check_delta_base(X509_CRL *delta, X509_CRL *base)
    1093                 :            :         {
    1094                 :            :         /* Delta CRL must be a delta */
    1095         [ #  # ]:          0 :         if (!delta->base_crl_number)
    1096                 :            :                         return 0;
    1097                 :            :         /* Base must have a CRL number */
    1098         [ #  # ]:          0 :         if (!base->crl_number)
    1099                 :            :                         return 0;
    1100                 :            :         /* Issuer names must match */
    1101         [ #  # ]:          0 :         if (X509_NAME_cmp(X509_CRL_get_issuer(base),
    1102                 :          0 :                                 X509_CRL_get_issuer(delta)))
    1103                 :            :                 return 0;
    1104                 :            :         /* AKID and IDP must match */
    1105         [ #  # ]:          0 :         if (!crl_extension_match(delta, base, NID_authority_key_identifier))
    1106                 :            :                         return 0;
    1107         [ #  # ]:          0 :         if (!crl_extension_match(delta, base, NID_issuing_distribution_point))
    1108                 :            :                         return 0;
    1109                 :            :         /* Delta CRL base number must not exceed Full CRL number. */
    1110         [ #  # ]:          0 :         if (ASN1_INTEGER_cmp(delta->base_crl_number, base->crl_number) > 0)
    1111                 :            :                         return 0;
    1112                 :            :         /* Delta CRL number must exceed full CRL number */
    1113         [ #  # ]:          0 :         if (ASN1_INTEGER_cmp(delta->crl_number, base->crl_number) > 0)
    1114                 :            :                         return 1;
    1115                 :          0 :         return 0;
    1116                 :            :         }
    1117                 :            : 
    1118                 :            : /* For a given base CRL find a delta... maybe extend to delta scoring
    1119                 :            :  * or retrieve a chain of deltas...
    1120                 :            :  */
    1121                 :            : 
    1122                 :          0 : static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pscore,
    1123                 :            :                         X509_CRL *base, STACK_OF(X509_CRL) *crls)
    1124                 :            :         {
    1125                 :            :         X509_CRL *delta;
    1126                 :            :         int i;
    1127         [ #  # ]:          0 :         if (!(ctx->param->flags & X509_V_FLAG_USE_DELTAS))
    1128                 :            :                 return;
    1129         [ #  # ]:          0 :         if (!((ctx->current_cert->ex_flags | base->flags) & EXFLAG_FRESHEST))
    1130                 :            :                 return;
    1131         [ #  # ]:          0 :         for (i = 0; i < sk_X509_CRL_num(crls); i++)
    1132                 :            :                 {
    1133                 :          0 :                 delta = sk_X509_CRL_value(crls, i);
    1134         [ #  # ]:          0 :                 if (check_delta_base(delta, base))
    1135                 :            :                         {
    1136         [ #  # ]:          0 :                         if (check_crl_time(ctx, delta, 0))
    1137                 :          0 :                                 *pscore |= CRL_SCORE_TIME_DELTA;
    1138                 :          0 :                         CRYPTO_add(&delta->references, 1, CRYPTO_LOCK_X509_CRL);
    1139                 :          0 :                         *dcrl = delta;
    1140                 :          0 :                         return;
    1141                 :            :                         }
    1142                 :            :                 }
    1143                 :          0 :         *dcrl = NULL;
    1144                 :            :         }
    1145                 :            : 
    1146                 :            : /* For a given CRL return how suitable it is for the supplied certificate 'x'.
    1147                 :            :  * The return value is a mask of several criteria.
    1148                 :            :  * If the issuer is not the certificate issuer this is returned in *pissuer.
    1149                 :            :  * The reasons mask is also used to determine if the CRL is suitable: if
    1150                 :            :  * no new reasons the CRL is rejected, otherwise reasons is updated.
    1151                 :            :  */
    1152                 :            : 
    1153                 :          0 : static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer,
    1154                 :            :                         unsigned int *preasons,
    1155                 :          0 :                         X509_CRL *crl, X509 *x)
    1156                 :            :         {
    1157                 :            : 
    1158                 :          0 :         int crl_score = 0;
    1159                 :          0 :         unsigned int tmp_reasons = *preasons, crl_reasons;
    1160                 :            : 
    1161                 :            :         /* First see if we can reject CRL straight away */
    1162                 :            : 
    1163                 :            :         /* Invalid IDP cannot be processed */
    1164         [ #  # ]:          0 :         if (crl->idp_flags & IDP_INVALID)
    1165                 :            :                 return 0;
    1166                 :            :         /* Reason codes or indirect CRLs need extended CRL support */
    1167         [ #  # ]:          0 :         if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT))
    1168                 :            :                 {
    1169         [ #  # ]:          0 :                 if (crl->idp_flags & (IDP_INDIRECT | IDP_REASONS))
    1170                 :            :                         return 0;
    1171                 :            :                 }
    1172         [ #  # ]:          0 :         else if (crl->idp_flags & IDP_REASONS)
    1173                 :            :                 {
    1174                 :            :                 /* If no new reasons reject */
    1175         [ #  # ]:          0 :                 if (!(crl->idp_reasons & ~tmp_reasons))
    1176                 :            :                         return 0;
    1177                 :            :                 }
    1178                 :            :         /* Don't process deltas at this stage */
    1179         [ #  # ]:          0 :         else if (crl->base_crl_number)
    1180                 :            :                 return 0;
    1181                 :            :         /* If issuer name doesn't match certificate need indirect CRL */
    1182         [ #  # ]:          0 :         if (X509_NAME_cmp(X509_get_issuer_name(x), X509_CRL_get_issuer(crl)))
    1183                 :            :                 {
    1184         [ #  # ]:          0 :                 if (!(crl->idp_flags & IDP_INDIRECT))
    1185                 :            :                         return 0;
    1186                 :            :                 }
    1187                 :            :         else
    1188                 :          0 :                 crl_score |= CRL_SCORE_ISSUER_NAME;
    1189                 :            : 
    1190         [ #  # ]:          0 :         if (!(crl->flags & EXFLAG_CRITICAL))
    1191                 :          0 :                 crl_score |= CRL_SCORE_NOCRITICAL;
    1192                 :            : 
    1193                 :            :         /* Check expiry */
    1194         [ #  # ]:          0 :         if (check_crl_time(ctx, crl, 0))
    1195                 :          0 :                 crl_score |= CRL_SCORE_TIME;
    1196                 :            : 
    1197                 :            :         /* Check authority key ID and locate certificate issuer */
    1198                 :          0 :         crl_akid_check(ctx, crl, pissuer, &crl_score);
    1199                 :            : 
    1200                 :            :         /* If we can't locate certificate issuer at this point forget it */
    1201                 :            : 
    1202         [ #  # ]:          0 :         if (!(crl_score & CRL_SCORE_AKID))
    1203                 :            :                 return 0;
    1204                 :            : 
    1205                 :            :         /* Check cert for matching CRL distribution points */
    1206                 :            : 
    1207         [ #  # ]:          0 :         if (crl_crldp_check(x, crl, crl_score, &crl_reasons))
    1208                 :            :                 {
    1209                 :            :                 /* If no new reasons reject */
    1210         [ #  # ]:          0 :                 if (!(crl_reasons & ~tmp_reasons))
    1211                 :            :                         return 0;
    1212                 :          0 :                 tmp_reasons |= crl_reasons;
    1213                 :          0 :                 crl_score |= CRL_SCORE_SCOPE;
    1214                 :            :                 }
    1215                 :            : 
    1216                 :          0 :         *preasons = tmp_reasons;
    1217                 :            : 
    1218                 :          0 :         return crl_score;
    1219                 :            : 
    1220                 :            :         }
    1221                 :            : 
    1222                 :          0 : static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl,
    1223                 :            :                                 X509 **pissuer, int *pcrl_score)
    1224                 :            :         {
    1225                 :          0 :         X509 *crl_issuer = NULL;
    1226                 :          0 :         X509_NAME *cnm = X509_CRL_get_issuer(crl);
    1227                 :          0 :         int cidx = ctx->error_depth;
    1228                 :            :         int i;
    1229                 :            : 
    1230         [ #  # ]:          0 :         if (cidx != sk_X509_num(ctx->chain) - 1)
    1231                 :          0 :                 cidx++;
    1232                 :            : 
    1233                 :          0 :         crl_issuer = sk_X509_value(ctx->chain, cidx);
    1234                 :            : 
    1235         [ #  # ]:          0 :         if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK)
    1236                 :            :                 {
    1237         [ #  # ]:          0 :                 if (*pcrl_score & CRL_SCORE_ISSUER_NAME)
    1238                 :            :                         {
    1239                 :          0 :                         *pcrl_score |= CRL_SCORE_AKID|CRL_SCORE_ISSUER_CERT;
    1240                 :          0 :                         *pissuer = crl_issuer;
    1241                 :            :                         return;
    1242                 :            :                         }
    1243                 :            :                 }
    1244                 :            : 
    1245         [ #  # ]:          0 :         for (cidx++; cidx < sk_X509_num(ctx->chain); cidx++)
    1246                 :            :                 {
    1247                 :          0 :                 crl_issuer = sk_X509_value(ctx->chain, cidx);
    1248         [ #  # ]:          0 :                 if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))
    1249                 :          0 :                         continue;
    1250         [ #  # ]:          0 :                 if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK)
    1251                 :            :                         {
    1252                 :          0 :                         *pcrl_score |= CRL_SCORE_AKID|CRL_SCORE_SAME_PATH;
    1253                 :          0 :                         *pissuer = crl_issuer;
    1254                 :            :                         return;
    1255                 :            :                         }
    1256                 :            :                 }
    1257                 :            : 
    1258                 :            :         /* Anything else needs extended CRL support */
    1259                 :            : 
    1260         [ #  # ]:          0 :         if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT))
    1261                 :            :                 return;
    1262                 :            : 
    1263                 :            :         /* Otherwise the CRL issuer is not on the path. Look for it in the
    1264                 :            :          * set of untrusted certificates.
    1265                 :            :          */
    1266         [ #  # ]:          0 :         for (i = 0; i < sk_X509_num(ctx->untrusted); i++)
    1267                 :            :                 {
    1268                 :          0 :                 crl_issuer = sk_X509_value(ctx->untrusted, i);
    1269         [ #  # ]:          0 :                 if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))
    1270                 :          0 :                         continue;
    1271         [ #  # ]:          0 :                 if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK)
    1272                 :            :                         {
    1273                 :          0 :                         *pissuer = crl_issuer;
    1274                 :          0 :                         *pcrl_score |= CRL_SCORE_AKID;
    1275                 :            :                         return;
    1276                 :            :                         }
    1277                 :            :                 }
    1278                 :            :         }
    1279                 :            : 
    1280                 :            : /* Check the path of a CRL issuer certificate. This creates a new
    1281                 :            :  * X509_STORE_CTX and populates it with most of the parameters from the
    1282                 :            :  * parent. This could be optimised somewhat since a lot of path checking
    1283                 :            :  * will be duplicated by the parent, but this will rarely be used in 
    1284                 :            :  * practice.
    1285                 :            :  */
    1286                 :            : 
    1287                 :          0 : static int check_crl_path(X509_STORE_CTX *ctx, X509 *x)
    1288                 :            :         {
    1289                 :            :         X509_STORE_CTX crl_ctx;
    1290                 :            :         int ret;
    1291                 :            :         /* Don't allow recursive CRL path validation */
    1292         [ #  # ]:          0 :         if (ctx->parent)
    1293                 :            :                 return 0;
    1294         [ #  # ]:          0 :         if (!X509_STORE_CTX_init(&crl_ctx, ctx->ctx, x, ctx->untrusted))
    1295                 :            :                 return -1;
    1296                 :            : 
    1297                 :          0 :         crl_ctx.crls = ctx->crls;
    1298                 :            :         /* Copy verify params across */
    1299                 :          0 :         X509_STORE_CTX_set0_param(&crl_ctx, ctx->param);
    1300                 :            : 
    1301                 :          0 :         crl_ctx.parent = ctx;
    1302                 :          0 :         crl_ctx.verify_cb = ctx->verify_cb;
    1303                 :            : 
    1304                 :            :         /* Verify CRL issuer */
    1305                 :          0 :         ret = X509_verify_cert(&crl_ctx);
    1306                 :            : 
    1307         [ #  # ]:          0 :         if (ret <= 0)
    1308                 :            :                 goto err;
    1309                 :            : 
    1310                 :            :         /* Check chain is acceptable */
    1311                 :            : 
    1312                 :          0 :         ret = check_crl_chain(ctx, ctx->chain, crl_ctx.chain);
    1313                 :            :         err:
    1314                 :          0 :         X509_STORE_CTX_cleanup(&crl_ctx);
    1315                 :          0 :         return ret;
    1316                 :            :         }
    1317                 :            : 
    1318                 :            : /* RFC3280 says nothing about the relationship between CRL path
    1319                 :            :  * and certificate path, which could lead to situations where a
    1320                 :            :  * certificate could be revoked or validated by a CA not authorised
    1321                 :            :  * to do so. RFC5280 is more strict and states that the two paths must
    1322                 :            :  * end in the same trust anchor, though some discussions remain...
    1323                 :            :  * until this is resolved we use the RFC5280 version
    1324                 :            :  */
    1325                 :            : 
    1326                 :          0 : static int check_crl_chain(X509_STORE_CTX *ctx,
    1327                 :            :                         STACK_OF(X509) *cert_path,
    1328                 :            :                         STACK_OF(X509) *crl_path)
    1329                 :            :         {
    1330                 :            :         X509 *cert_ta, *crl_ta;
    1331                 :          0 :         cert_ta = sk_X509_value(cert_path, sk_X509_num(cert_path) - 1);
    1332                 :          0 :         crl_ta = sk_X509_value(crl_path, sk_X509_num(crl_path) - 1);
    1333         [ #  # ]:          0 :         if (!X509_cmp(cert_ta, crl_ta))
    1334                 :            :                 return 1;
    1335                 :            :         return 0;
    1336                 :            :         }
    1337                 :            : 
    1338                 :            : /* Check for match between two dist point names: three separate cases.
    1339                 :            :  * 1. Both are relative names and compare X509_NAME types.
    1340                 :            :  * 2. One full, one relative. Compare X509_NAME to GENERAL_NAMES.
    1341                 :            :  * 3. Both are full names and compare two GENERAL_NAMES.
    1342                 :            :  * 4. One is NULL: automatic match.
    1343                 :            :  */
    1344                 :            : 
    1345                 :            : 
    1346                 :          0 : static int idp_check_dp(DIST_POINT_NAME *a, DIST_POINT_NAME *b)
    1347                 :            :         {
    1348                 :          0 :         X509_NAME *nm = NULL;
    1349                 :          0 :         GENERAL_NAMES *gens = NULL;
    1350                 :            :         GENERAL_NAME *gena, *genb;
    1351                 :            :         int i, j;
    1352         [ #  # ]:          0 :         if (!a || !b)
    1353                 :            :                 return 1;
    1354         [ #  # ]:          0 :         if (a->type == 1)
    1355                 :            :                 {
    1356         [ #  # ]:          0 :                 if (!a->dpname)
    1357                 :            :                         return 0;
    1358                 :            :                 /* Case 1: two X509_NAME */
    1359         [ #  # ]:          0 :                 if (b->type == 1)
    1360                 :            :                         {
    1361         [ #  # ]:          0 :                         if (!b->dpname)
    1362                 :            :                                 return 0;
    1363         [ #  # ]:          0 :                         if (!X509_NAME_cmp(a->dpname, b->dpname))
    1364                 :            :                                 return 1;
    1365                 :            :                         else
    1366                 :          0 :                                 return 0;
    1367                 :            :                         }
    1368                 :            :                 /* Case 2: set name and GENERAL_NAMES appropriately */
    1369                 :          0 :                 nm = a->dpname;
    1370                 :          0 :                 gens = b->name.fullname;
    1371                 :            :                 }
    1372         [ #  # ]:          0 :         else if (b->type == 1)
    1373                 :            :                 {
    1374         [ #  # ]:          0 :                 if (!b->dpname)
    1375                 :            :                         return 0;
    1376                 :            :                 /* Case 2: set name and GENERAL_NAMES appropriately */
    1377                 :          0 :                 gens = a->name.fullname;
    1378                 :          0 :                 nm = b->dpname;
    1379                 :            :                 }
    1380                 :            : 
    1381                 :            :         /* Handle case 2 with one GENERAL_NAMES and one X509_NAME */
    1382         [ #  # ]:          0 :         if (nm)
    1383                 :            :                 {
    1384         [ #  # ]:          0 :                 for (i = 0; i < sk_GENERAL_NAME_num(gens); i++)
    1385                 :            :                         {
    1386                 :          0 :                         gena = sk_GENERAL_NAME_value(gens, i);  
    1387         [ #  # ]:          0 :                         if (gena->type != GEN_DIRNAME)
    1388                 :          0 :                                 continue;
    1389         [ #  # ]:          0 :                         if (!X509_NAME_cmp(nm, gena->d.directoryName))
    1390                 :            :                                 return 1;
    1391                 :            :                         }
    1392                 :            :                 return 0;
    1393                 :            :                 }
    1394                 :            : 
    1395                 :            :         /* Else case 3: two GENERAL_NAMES */
    1396                 :            : 
    1397         [ #  # ]:          0 :         for (i = 0; i < sk_GENERAL_NAME_num(a->name.fullname); i++)
    1398                 :            :                 {
    1399                 :          0 :                 gena = sk_GENERAL_NAME_value(a->name.fullname, i);
    1400         [ #  # ]:          0 :                 for (j = 0; j < sk_GENERAL_NAME_num(b->name.fullname); j++)
    1401                 :            :                         {
    1402                 :          0 :                         genb = sk_GENERAL_NAME_value(b->name.fullname, j);
    1403         [ #  # ]:          0 :                         if (!GENERAL_NAME_cmp(gena, genb))
    1404                 :            :                                 return 1;
    1405                 :            :                         }
    1406                 :            :                 }
    1407                 :            : 
    1408                 :            :         return 0;
    1409                 :            : 
    1410                 :            :         }
    1411                 :            : 
    1412                 :          0 : static int crldp_check_crlissuer(DIST_POINT *dp, X509_CRL *crl, int crl_score)
    1413                 :            :         {
    1414                 :            :         int i;
    1415                 :          0 :         X509_NAME *nm = X509_CRL_get_issuer(crl);
    1416                 :            :         /* If no CRLissuer return is successful iff don't need a match */
    1417         [ #  # ]:          0 :         if (!dp->CRLissuer)
    1418                 :          0 :                 return !!(crl_score & CRL_SCORE_ISSUER_NAME);
    1419         [ #  # ]:          0 :         for (i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++)
    1420                 :            :                 {
    1421                 :          0 :                 GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i);
    1422         [ #  # ]:          0 :                 if (gen->type != GEN_DIRNAME)
    1423                 :          0 :                         continue;
    1424         [ #  # ]:          0 :                 if (!X509_NAME_cmp(gen->d.directoryName, nm))
    1425                 :            :                         return 1;
    1426                 :            :                 }
    1427                 :            :         return 0;
    1428                 :            :         }
    1429                 :            : 
    1430                 :            : /* Check CRLDP and IDP */
    1431                 :            : 
    1432                 :          0 : static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score,
    1433                 :            :                                 unsigned int *preasons)
    1434                 :            :         {
    1435                 :            :         int i;
    1436         [ #  # ]:          0 :         if (crl->idp_flags & IDP_ONLYATTR)
    1437                 :            :                 return 0;
    1438         [ #  # ]:          0 :         if (x->ex_flags & EXFLAG_CA)
    1439                 :            :                 {
    1440         [ #  # ]:          0 :                 if (crl->idp_flags & IDP_ONLYUSER)
    1441                 :            :                         return 0;
    1442                 :            :                 }
    1443                 :            :         else
    1444                 :            :                 {
    1445         [ #  # ]:          0 :                 if (crl->idp_flags & IDP_ONLYCA)
    1446                 :            :                         return 0;
    1447                 :            :                 }
    1448                 :          0 :         *preasons = crl->idp_reasons;
    1449         [ #  # ]:          0 :         for (i = 0; i < sk_DIST_POINT_num(x->crldp); i++)
    1450                 :            :                 {
    1451                 :          0 :                 DIST_POINT *dp = sk_DIST_POINT_value(x->crldp, i);
    1452         [ #  # ]:          0 :                 if (crldp_check_crlissuer(dp, crl, crl_score))
    1453                 :            :                         {
    1454   [ #  #  #  # ]:          0 :                         if (!crl->idp ||
    1455                 :          0 :                              idp_check_dp(dp->distpoint, crl->idp->distpoint))
    1456                 :            :                                 {
    1457                 :          0 :                                 *preasons &= dp->dp_reasons;
    1458                 :            :                                 return 1;
    1459                 :            :                                 }
    1460                 :            :                         }
    1461                 :            :                 }
    1462 [ #  # ][ #  # ]:          0 :         if ((!crl->idp || !crl->idp->distpoint) && (crl_score & CRL_SCORE_ISSUER_NAME))
                 [ #  # ]
    1463                 :            :                 return 1;
    1464                 :            :         return 0;
    1465                 :            :         }
    1466                 :            : 
    1467                 :            : /* Retrieve CRL corresponding to current certificate.
    1468                 :            :  * If deltas enabled try to find a delta CRL too
    1469                 :            :  */
    1470                 :            :         
    1471                 :          0 : static int get_crl_delta(X509_STORE_CTX *ctx,
    1472                 :            :                                 X509_CRL **pcrl, X509_CRL **pdcrl, X509 *x)
    1473                 :            :         {
    1474                 :            :         int ok;
    1475                 :          0 :         X509 *issuer = NULL;
    1476                 :          0 :         int crl_score = 0;
    1477                 :            :         unsigned int reasons;
    1478                 :          0 :         X509_CRL *crl = NULL, *dcrl = NULL;
    1479                 :            :         STACK_OF(X509_CRL) *skcrl;
    1480                 :          0 :         X509_NAME *nm = X509_get_issuer_name(x);
    1481                 :          0 :         reasons = ctx->current_reasons;
    1482                 :          0 :         ok = get_crl_sk(ctx, &crl, &dcrl, 
    1483                 :            :                                 &issuer, &crl_score, &reasons, ctx->crls);
    1484                 :            : 
    1485         [ #  # ]:          0 :         if (ok)
    1486                 :            :                 goto done;
    1487                 :            : 
    1488                 :            :         /* Lookup CRLs from store */
    1489                 :            : 
    1490                 :          0 :         skcrl = ctx->lookup_crls(ctx, nm);
    1491                 :            : 
    1492                 :            :         /* If no CRLs found and a near match from get_crl_sk use that */
    1493 [ #  # ][ #  # ]:          0 :         if (!skcrl && crl)
    1494                 :            :                 goto done;
    1495                 :            : 
    1496                 :          0 :         get_crl_sk(ctx, &crl, &dcrl, &issuer, &crl_score, &reasons, skcrl);
    1497                 :            : 
    1498                 :          0 :         sk_X509_CRL_pop_free(skcrl, X509_CRL_free);
    1499                 :            : 
    1500                 :            :         done:
    1501                 :            : 
    1502                 :            :         /* If we got any kind of CRL use it and return success */
    1503         [ #  # ]:          0 :         if (crl)
    1504                 :            :                 {
    1505                 :          0 :                 ctx->current_issuer = issuer;
    1506                 :          0 :                 ctx->current_crl_score = crl_score;
    1507                 :          0 :                 ctx->current_reasons = reasons;
    1508                 :          0 :                 *pcrl = crl;
    1509                 :          0 :                 *pdcrl = dcrl;
    1510                 :          0 :                 return 1;
    1511                 :            :                 }
    1512                 :            : 
    1513                 :            :         return 0;
    1514                 :            :         }
    1515                 :            : 
    1516                 :            : /* Check CRL validity */
    1517                 :          0 : static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl)
    1518                 :            :         {
    1519                 :          0 :         X509 *issuer = NULL;
    1520                 :          0 :         EVP_PKEY *ikey = NULL;
    1521                 :          0 :         int ok = 0, chnum, cnum;
    1522                 :          0 :         cnum = ctx->error_depth;
    1523                 :          0 :         chnum = sk_X509_num(ctx->chain) - 1;
    1524                 :            :         /* if we have an alternative CRL issuer cert use that */
    1525         [ #  # ]:          0 :         if (ctx->current_issuer)
    1526                 :            :                 issuer = ctx->current_issuer;
    1527                 :            : 
    1528                 :            :         /* Else find CRL issuer: if not last certificate then issuer
    1529                 :            :          * is next certificate in chain.
    1530                 :            :          */
    1531         [ #  # ]:          0 :         else if (cnum < chnum)
    1532                 :          0 :                 issuer = sk_X509_value(ctx->chain, cnum + 1);
    1533                 :            :         else
    1534                 :            :                 {
    1535                 :          0 :                 issuer = sk_X509_value(ctx->chain, chnum);
    1536                 :            :                 /* If not self signed, can't check signature */
    1537         [ #  # ]:          0 :                 if(!ctx->check_issued(ctx, issuer, issuer))
    1538                 :            :                         {
    1539                 :          0 :                         ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
    1540                 :          0 :                         ok = ctx->verify_cb(0, ctx);
    1541         [ #  # ]:          0 :                         if(!ok) goto err;
    1542                 :            :                         }
    1543                 :            :                 }
    1544                 :            : 
    1545         [ #  # ]:          0 :         if(issuer)
    1546                 :            :                 {
    1547                 :            :                 /* Skip most tests for deltas because they have already
    1548                 :            :                  * been done
    1549                 :            :                  */
    1550         [ #  # ]:          0 :                 if (!crl->base_crl_number)
    1551                 :            :                         {
    1552                 :            :                         /* Check for cRLSign bit if keyUsage present */
    1553 [ #  # ][ #  # ]:          0 :                         if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
    1554                 :          0 :                                 !(issuer->ex_kusage & KU_CRL_SIGN))
    1555                 :            :                                 {
    1556                 :          0 :                                 ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
    1557                 :          0 :                                 ok = ctx->verify_cb(0, ctx);
    1558         [ #  # ]:          0 :                                 if(!ok) goto err;
    1559                 :            :                                 }
    1560                 :            : 
    1561         [ #  # ]:          0 :                         if (!(ctx->current_crl_score & CRL_SCORE_SCOPE))
    1562                 :            :                                 {
    1563                 :          0 :                                 ctx->error = X509_V_ERR_DIFFERENT_CRL_SCOPE;
    1564                 :          0 :                                 ok = ctx->verify_cb(0, ctx);
    1565         [ #  # ]:          0 :                                 if(!ok) goto err;
    1566                 :            :                                 }
    1567                 :            : 
    1568         [ #  # ]:          0 :                         if (!(ctx->current_crl_score & CRL_SCORE_SAME_PATH))
    1569                 :            :                                 {
    1570         [ #  # ]:          0 :                                 if (check_crl_path(ctx, ctx->current_issuer) <= 0)
    1571                 :            :                                         {
    1572                 :          0 :                                         ctx->error = X509_V_ERR_CRL_PATH_VALIDATION_ERROR;
    1573                 :          0 :                                         ok = ctx->verify_cb(0, ctx);
    1574         [ #  # ]:          0 :                                         if(!ok) goto err;
    1575                 :            :                                         }
    1576                 :            :                                 }
    1577                 :            : 
    1578         [ #  # ]:          0 :                         if (crl->idp_flags & IDP_INVALID)
    1579                 :            :                                 {
    1580                 :          0 :                                 ctx->error = X509_V_ERR_INVALID_EXTENSION;
    1581                 :          0 :                                 ok = ctx->verify_cb(0, ctx);
    1582         [ #  # ]:          0 :                                 if(!ok) goto err;
    1583                 :            :                                 }
    1584                 :            : 
    1585                 :            : 
    1586                 :            :                         }
    1587                 :            : 
    1588         [ #  # ]:          0 :                 if (!(ctx->current_crl_score & CRL_SCORE_TIME))
    1589                 :            :                         {
    1590                 :          0 :                         ok = check_crl_time(ctx, crl, 1);
    1591         [ #  # ]:          0 :                         if (!ok)
    1592                 :            :                                 goto err;
    1593                 :            :                         }
    1594                 :            : 
    1595                 :            :                 /* Attempt to get issuer certificate public key */
    1596                 :          0 :                 ikey = X509_get_pubkey(issuer);
    1597                 :            : 
    1598         [ #  # ]:          0 :                 if(!ikey)
    1599                 :            :                         {
    1600                 :          0 :                         ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
    1601                 :          0 :                         ok = ctx->verify_cb(0, ctx);
    1602         [ #  # ]:          0 :                         if (!ok) goto err;
    1603                 :            :                         }
    1604                 :            :                 else
    1605                 :            :                         {
    1606                 :            :                         int rv;
    1607                 :          0 :                         rv = X509_CRL_check_suiteb(crl, ikey, ctx->param->flags);
    1608         [ #  # ]:          0 :                         if (rv != X509_V_OK)
    1609                 :            :                                 {
    1610                 :          0 :                                 ctx->error=rv;
    1611                 :          0 :                                 ok = ctx->verify_cb(0, ctx);
    1612         [ #  # ]:          0 :                                 if (!ok)
    1613                 :            :                                         goto err;
    1614                 :            :                                 }
    1615                 :            :                         /* Verify CRL signature */
    1616         [ #  # ]:          0 :                         if(X509_CRL_verify(crl, ikey) <= 0)
    1617                 :            :                                 {
    1618                 :          0 :                                 ctx->error=X509_V_ERR_CRL_SIGNATURE_FAILURE;
    1619                 :          0 :                                 ok = ctx->verify_cb(0, ctx);
    1620         [ #  # ]:          0 :                                 if (!ok) goto err;
    1621                 :            :                                 }
    1622                 :            :                         }
    1623                 :            :                 }
    1624                 :            : 
    1625                 :            :         ok = 1;
    1626                 :            : 
    1627                 :            :         err:
    1628                 :          0 :         EVP_PKEY_free(ikey);
    1629                 :          0 :         return ok;
    1630                 :            :         }
    1631                 :            : 
    1632                 :            : /* Check certificate against CRL */
    1633                 :          0 : static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x)
    1634                 :            :         {
    1635                 :            :         int ok;
    1636                 :            :         X509_REVOKED *rev;
    1637                 :            :         /* The rules changed for this... previously if a CRL contained
    1638                 :            :          * unhandled critical extensions it could still be used to indicate
    1639                 :            :          * a certificate was revoked. This has since been changed since 
    1640                 :            :          * critical extension can change the meaning of CRL entries.
    1641                 :            :          */
    1642         [ #  # ]:          0 :         if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
    1643         [ #  # ]:          0 :                 && (crl->flags & EXFLAG_CRITICAL))
    1644                 :            :                 {
    1645                 :          0 :                 ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
    1646                 :          0 :                 ok = ctx->verify_cb(0, ctx);
    1647         [ #  # ]:          0 :                 if(!ok)
    1648                 :            :                         return 0;
    1649                 :            :                 }
    1650                 :            :         /* Look for serial number of certificate in CRL
    1651                 :            :          * If found make sure reason is not removeFromCRL.
    1652                 :            :          */
    1653         [ #  # ]:          0 :         if (X509_CRL_get0_by_cert(crl, &rev, x))
    1654                 :            :                 {
    1655         [ #  # ]:          0 :                 if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
    1656                 :            :                         return 2;
    1657                 :          0 :                 ctx->error = X509_V_ERR_CERT_REVOKED;
    1658                 :          0 :                 ok = ctx->verify_cb(0, ctx);
    1659         [ #  # ]:          0 :                 if (!ok)
    1660                 :            :                         return 0;
    1661                 :            :                 }
    1662                 :            : 
    1663                 :            :         return 1;
    1664                 :            :         }
    1665                 :            : 
    1666                 :          0 : static int check_policy(X509_STORE_CTX *ctx)
    1667                 :            :         {
    1668                 :            :         int ret;
    1669         [ #  # ]:          0 :         if (ctx->parent)
    1670                 :            :                 return 1;
    1671                 :          0 :         ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
    1672                 :          0 :                                 ctx->param->policies, ctx->param->flags);
    1673         [ #  # ]:          0 :         if (ret == 0)
    1674                 :            :                 {
    1675                 :          0 :                 X509err(X509_F_CHECK_POLICY,ERR_R_MALLOC_FAILURE);
    1676                 :          0 :                 return 0;
    1677                 :            :                 }
    1678                 :            :         /* Invalid or inconsistent extensions */
    1679         [ #  # ]:          0 :         if (ret == -1)
    1680                 :            :                 {
    1681                 :            :                 /* Locate certificates with bad extensions and notify
    1682                 :            :                  * callback.
    1683                 :            :                  */
    1684                 :            :                 X509 *x;
    1685                 :            :                 int i;
    1686         [ #  # ]:          0 :                 for (i = 1; i < sk_X509_num(ctx->chain); i++)
    1687                 :            :                         {
    1688                 :          0 :                         x = sk_X509_value(ctx->chain, i);
    1689         [ #  # ]:          0 :                         if (!(x->ex_flags & EXFLAG_INVALID_POLICY))
    1690                 :          0 :                                 continue;
    1691                 :          0 :                         ctx->current_cert = x;
    1692                 :          0 :                         ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION;
    1693         [ #  # ]:          0 :                         if(!ctx->verify_cb(0, ctx))
    1694                 :            :                                 return 0;
    1695                 :            :                         }
    1696                 :            :                 return 1;
    1697                 :            :                 }
    1698         [ #  # ]:          0 :         if (ret == -2)
    1699                 :            :                 {
    1700                 :          0 :                 ctx->current_cert = NULL;
    1701                 :          0 :                 ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY;
    1702                 :          0 :                 return ctx->verify_cb(0, ctx);
    1703                 :            :                 }
    1704                 :            : 
    1705         [ #  # ]:          0 :         if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY)
    1706                 :            :                 {
    1707                 :          0 :                 ctx->current_cert = NULL;
    1708                 :          0 :                 ctx->error = X509_V_OK;
    1709         [ #  # ]:          0 :                 if (!ctx->verify_cb(2, ctx))
    1710                 :            :                         return 0;
    1711                 :            :                 }
    1712                 :            : 
    1713                 :            :         return 1;
    1714                 :            :         }
    1715                 :            : 
    1716                 :       2929 : int x509_check_cert_time(X509_STORE_CTX *ctx, X509 *x, int quiet)
    1717                 :            :         {
    1718                 :            :         time_t *ptime;
    1719                 :            :         int i;
    1720                 :            : 
    1721         [ +  + ]:       2929 :         if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
    1722                 :         43 :                 ptime = &ctx->param->check_time;
    1723                 :            :         else
    1724                 :            :                 ptime = NULL;
    1725                 :            : 
    1726                 :       2929 :         i=X509_cmp_time(X509_get_notBefore(x), ptime);
    1727         [ -  + ]:       2929 :         if (i == 0)
    1728                 :            :                 {
    1729         [ #  # ]:          0 :                 if (quiet)
    1730                 :            :                         return 0;
    1731                 :          0 :                 ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
    1732                 :          0 :                 ctx->current_cert=x;
    1733         [ #  # ]:          0 :                 if (!ctx->verify_cb(0, ctx))
    1734                 :            :                         return 0;
    1735                 :            :                 }
    1736                 :            : 
    1737         [ -  + ]:       2929 :         if (i > 0)
    1738                 :            :                 {
    1739         [ #  # ]:          0 :                 if (quiet)
    1740                 :            :                         return 0;
    1741                 :          0 :                 ctx->error=X509_V_ERR_CERT_NOT_YET_VALID;
    1742                 :          0 :                 ctx->current_cert=x;
    1743         [ #  # ]:          0 :                 if (!ctx->verify_cb(0, ctx))
    1744                 :            :                         return 0;
    1745                 :            :                 }
    1746                 :            : 
    1747                 :       2929 :         i=X509_cmp_time(X509_get_notAfter(x), ptime);
    1748         [ -  + ]:       2929 :         if (i == 0)
    1749                 :            :                 {
    1750         [ #  # ]:          0 :                 if (quiet)
    1751                 :            :                         return 0;
    1752                 :          0 :                 ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
    1753                 :          0 :                 ctx->current_cert=x;
    1754         [ #  # ]:          0 :                 if (!ctx->verify_cb(0, ctx))
    1755                 :            :                         return 0;
    1756                 :            :                 }
    1757                 :            : 
    1758         [ +  + ]:       2929 :         if (i < 0)
    1759                 :            :                 {
    1760         [ +  + ]:         14 :                 if (quiet)
    1761                 :            :                         return 0;
    1762                 :          6 :                 ctx->error=X509_V_ERR_CERT_HAS_EXPIRED;
    1763                 :          6 :                 ctx->current_cert=x;
    1764         [ +  - ]:          6 :                 if (!ctx->verify_cb(0, ctx))
    1765                 :            :                         return 0;
    1766                 :            :                 }
    1767                 :            : 
    1768                 :            :         return 1;
    1769                 :            :         }
    1770                 :            : 
    1771                 :        436 : static int internal_verify(X509_STORE_CTX *ctx)
    1772                 :            :         {
    1773                 :        436 :         int ok=0,n;
    1774                 :            :         X509 *xs,*xi;
    1775                 :        436 :         EVP_PKEY *pkey=NULL;
    1776                 :            :         int (*cb)(int xok,X509_STORE_CTX *xctx);
    1777                 :            : 
    1778                 :        436 :         cb=ctx->verify_cb;
    1779                 :            : 
    1780                 :        436 :         n=sk_X509_num(ctx->chain);
    1781                 :        436 :         ctx->error_depth=n-1;
    1782                 :        436 :         n--;
    1783                 :        436 :         xi=sk_X509_value(ctx->chain,n);
    1784                 :            : 
    1785         [ +  + ]:        436 :         if (ctx->check_issued(ctx, xi, xi))
    1786                 :            :                 xs=xi;
    1787                 :            :         else
    1788                 :            :                 {
    1789         [ -  + ]:          9 :                 if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN)
    1790                 :            :                         {
    1791                 :            :                         xs = xi;
    1792                 :            :                         goto check_cert;
    1793                 :            :                         }
    1794         [ #  # ]:          0 :                 if (n <= 0)
    1795                 :            :                         {
    1796                 :          0 :                         ctx->error=X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
    1797                 :          0 :                         ctx->current_cert=xi;
    1798                 :          0 :                         ok=cb(0,ctx);
    1799                 :          0 :                         goto end;
    1800                 :            :                         }
    1801                 :            :                 else
    1802                 :            :                         {
    1803                 :          0 :                         n--;
    1804                 :          0 :                         ctx->error_depth=n;
    1805                 :          0 :                         xs=sk_X509_value(ctx->chain,n);
    1806                 :            :                         }
    1807                 :            :                 }
    1808                 :            : 
    1809                 :            : /*      ctx->error=0;  not needed */
    1810         [ +  + ]:       1651 :         while (n >= 0)
    1811                 :            :                 {
    1812                 :       1221 :                 ctx->error_depth=n;
    1813                 :            : 
    1814                 :            :                 /* Skip signature check for self signed certificates unless
    1815                 :            :                  * explicitly asked for. It doesn't add any security and
    1816                 :            :                  * just wastes time.
    1817                 :            :                  */
    1818 [ +  + ][ +  + ]:       1221 :                 if (!xs->valid && (xs != xi || (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE)))
                 [ -  + ]
    1819                 :            :                         {
    1820         [ -  + ]:        794 :                         if ((pkey=X509_get_pubkey(xi)) == NULL)
    1821                 :            :                                 {
    1822                 :          0 :                                 ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
    1823                 :          0 :                                 ctx->current_cert=xi;
    1824                 :          0 :                                 ok=(*cb)(0,ctx);
    1825         [ #  # ]:          0 :                                 if (!ok) goto end;
    1826                 :            :                                 }
    1827         [ +  + ]:        794 :                         else if (X509_verify(xs,pkey) <= 0)
    1828                 :            :                                 {
    1829                 :          6 :                                 ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
    1830                 :          6 :                                 ctx->current_cert=xs;
    1831                 :          6 :                                 ok=(*cb)(0,ctx);
    1832         [ +  - ]:          6 :                                 if (!ok)
    1833                 :            :                                         {
    1834                 :          6 :                                         EVP_PKEY_free(pkey);
    1835                 :          6 :                                         goto end;
    1836                 :            :                                         }
    1837                 :            :                                 }
    1838                 :        788 :                         EVP_PKEY_free(pkey);
    1839                 :        788 :                         pkey=NULL;
    1840                 :            :                         }
    1841                 :            : 
    1842                 :       1215 :                 xs->valid = 1;
    1843                 :            : 
    1844                 :            :                 check_cert:
    1845                 :       1224 :                 ok = x509_check_cert_time(ctx, xs, 0);
    1846         [ +  - ]:       1224 :                 if (!ok)
    1847                 :            :                         goto end;
    1848                 :            : 
    1849                 :            :                 /* The last error (if any) is still in the error value */
    1850                 :       1224 :                 ctx->current_issuer=xi;
    1851                 :       1224 :                 ctx->current_cert=xs;
    1852                 :       1224 :                 ok=(*cb)(1,ctx);
    1853         [ +  - ]:       1224 :                 if (!ok) goto end;
    1854                 :            : 
    1855                 :       1224 :                 n--;
    1856         [ +  + ]:       1224 :                 if (n >= 0)
    1857                 :            :                         {
    1858                 :        794 :                         xi=xs;
    1859                 :        794 :                         xs=sk_X509_value(ctx->chain,n);
    1860                 :            :                         }
    1861                 :            :                 }
    1862                 :            :         ok=1;
    1863                 :            : end:
    1864                 :        436 :         return ok;
    1865                 :            :         }
    1866                 :            : 
    1867                 :          0 : int X509_cmp_current_time(const ASN1_TIME *ctm)
    1868                 :            : {
    1869                 :          0 :         return X509_cmp_time(ctm, NULL);
    1870                 :            : }
    1871                 :            : 
    1872                 :       5858 : int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)
    1873                 :            :         {
    1874                 :            :         char *str;
    1875                 :            :         ASN1_TIME atm;
    1876                 :            :         long offset;
    1877                 :            :         char buff1[24],buff2[24],*p;
    1878                 :            :         int i,j;
    1879                 :            : 
    1880                 :       5858 :         p=buff1;
    1881                 :       5858 :         i=ctm->length;
    1882                 :       5858 :         str=(char *)ctm->data;
    1883         [ +  - ]:       5858 :         if (ctm->type == V_ASN1_UTCTIME)
    1884                 :            :                 {
    1885         [ +  - ]:       5858 :                 if ((i < 11) || (i > 17)) return 0;
    1886                 :            :                 memcpy(p,str,10);
    1887                 :       5858 :                 p+=10;
    1888                 :       5858 :                 str+=10;
    1889                 :            :                 }
    1890                 :            :         else
    1891                 :            :                 {
    1892         [ #  # ]:          0 :                 if (i < 13) return 0;
    1893                 :            :                 memcpy(p,str,12);
    1894                 :          0 :                 p+=12;
    1895                 :          0 :                 str+=12;
    1896                 :            :                 }
    1897                 :            : 
    1898 [ +  - ][ -  + ]:       5858 :         if ((*str == 'Z') || (*str == '-') || (*str == '+'))
    1899                 :          0 :                 { *(p++)='0'; *(p++)='0'; }
    1900                 :            :         else
    1901                 :            :                 { 
    1902                 :       5858 :                 *(p++)= *(str++);
    1903                 :       5858 :                 *(p++)= *(str++);
    1904                 :            :                 /* Skip any fractional seconds... */
    1905         [ -  + ]:       5858 :                 if (*str == '.')
    1906                 :            :                         {
    1907                 :          0 :                         str++;
    1908         [ #  # ]:          0 :                         while ((*str >= '0') && (*str <= '9')) str++;
    1909                 :            :                         }
    1910                 :            :                 
    1911                 :            :                 }
    1912                 :       5858 :         *(p++)='Z';
    1913                 :       5858 :         *(p++)='\0';
    1914                 :            : 
    1915         [ -  + ]:       5858 :         if (*str == 'Z')
    1916                 :            :                 offset=0;
    1917                 :            :         else
    1918                 :            :                 {
    1919         [ #  # ]:          0 :                 if ((*str != '+') && (*str != '-'))
    1920                 :            :                         return 0;
    1921                 :          0 :                 offset=((str[1]-'0')*10+(str[2]-'0'))*60;
    1922                 :          0 :                 offset+=(str[3]-'0')*10+(str[4]-'0');
    1923         [ #  # ]:          0 :                 if (*str == '-')
    1924                 :          0 :                         offset= -offset;
    1925                 :            :                 }
    1926                 :       5858 :         atm.type=ctm->type;
    1927                 :       5858 :         atm.flags = 0;
    1928                 :       5858 :         atm.length=sizeof(buff2);
    1929                 :       5858 :         atm.data=(unsigned char *)buff2;
    1930                 :            : 
    1931         [ +  - ]:       5858 :         if (X509_time_adj(&atm, offset*60, cmp_time) == NULL)
    1932                 :            :                 return 0;
    1933                 :            : 
    1934         [ +  - ]:       5858 :         if (ctm->type == V_ASN1_UTCTIME)
    1935                 :            :                 {
    1936                 :       5858 :                 i=(buff1[0]-'0')*10+(buff1[1]-'0');
    1937         [ +  + ]:       5858 :                 if (i < 50) i+=100; /* cf. RFC 2459 */
    1938                 :       5858 :                 j=(buff2[0]-'0')*10+(buff2[1]-'0');
    1939         [ +  - ]:       5858 :                 if (j < 50) j+=100;
    1940                 :            : 
    1941         [ +  + ]:       5858 :                 if (i < j) return -1;
    1942         [ +  + ]:       5533 :                 if (i > j) return 1;
    1943                 :            :                 }
    1944                 :       5231 :         i=strcmp(buff1,buff2);
    1945         [ +  + ]:       5231 :         if (i == 0) /* wait a second then return younger :-) */
    1946                 :            :                 return -1;
    1947                 :            :         else
    1948                 :       5193 :                 return i;
    1949                 :            :         }
    1950                 :            : 
    1951                 :         87 : ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj)
    1952                 :            : {
    1953                 :         87 :         return X509_time_adj(s, adj, NULL);
    1954                 :            : }
    1955                 :            : 
    1956                 :       5945 : ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, time_t *in_tm)
    1957                 :            :         {
    1958                 :       5945 :         return X509_time_adj_ex(s, 0, offset_sec, in_tm);
    1959                 :            :         }
    1960                 :            : 
    1961                 :       5959 : ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s,
    1962                 :            :                                 int offset_day, long offset_sec, time_t *in_tm)
    1963                 :            :         {
    1964                 :            :         time_t t;
    1965                 :            : 
    1966         [ +  + ]:       5959 :         if (in_tm) t = *in_tm;
    1967                 :       5873 :         else time(&t);
    1968                 :            : 
    1969 [ +  + ][ +  + ]:       5959 :         if (s && !(s->flags & ASN1_STRING_FLAG_MSTRING))
    1970                 :            :                 {
    1971         [ +  - ]:       5858 :                 if (s->type == V_ASN1_UTCTIME)
    1972                 :       5858 :                         return ASN1_UTCTIME_adj(s,t, offset_day, offset_sec);
    1973         [ #  # ]:          0 :                 if (s->type == V_ASN1_GENERALIZEDTIME)
    1974                 :          0 :                         return ASN1_GENERALIZEDTIME_adj(s, t, offset_day,
    1975                 :            :                                                                 offset_sec);
    1976                 :            :                 }
    1977                 :        101 :         return ASN1_TIME_adj(s, t, offset_day, offset_sec);
    1978                 :            :         }
    1979                 :            : 
    1980                 :       2359 : int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain)
    1981                 :            :         {
    1982                 :       2359 :         EVP_PKEY *ktmp=NULL,*ktmp2;
    1983                 :            :         int i,j;
    1984                 :            : 
    1985 [ -  + ][ #  # ]:       2359 :         if ((pkey != NULL) && !EVP_PKEY_missing_parameters(pkey)) return 1;
    1986                 :            : 
    1987         [ +  - ]:       2360 :         for (i=0; i<sk_X509_num(chain); i++)
    1988                 :            :                 {
    1989                 :       2360 :                 ktmp=X509_get_pubkey(sk_X509_value(chain,i));
    1990         [ -  + ]:       2360 :                 if (ktmp == NULL)
    1991                 :            :                         {
    1992                 :          0 :                         X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY);
    1993                 :          0 :                         return 0;
    1994                 :            :                         }
    1995         [ +  + ]:       2360 :                 if (!EVP_PKEY_missing_parameters(ktmp))
    1996                 :            :                         break;
    1997                 :            :                 else
    1998                 :            :                         {
    1999                 :          1 :                         EVP_PKEY_free(ktmp);
    2000                 :          1 :                         ktmp=NULL;
    2001                 :            :                         }
    2002                 :            :                 }
    2003         [ -  + ]:       2359 :         if (ktmp == NULL)
    2004                 :            :                 {
    2005                 :          0 :                 X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN);
    2006                 :          0 :                 return 0;
    2007                 :            :                 }
    2008                 :            : 
    2009                 :            :         /* first, populate the other certs */
    2010         [ +  + ]:       2360 :         for (j=i-1; j >= 0; j--)
    2011                 :            :                 {
    2012                 :          1 :                 ktmp2=X509_get_pubkey(sk_X509_value(chain,j));
    2013                 :          1 :                 EVP_PKEY_copy_parameters(ktmp2,ktmp);
    2014                 :          1 :                 EVP_PKEY_free(ktmp2);
    2015                 :            :                 }
    2016                 :            :         
    2017         [ -  + ]:       2359 :         if (pkey != NULL) EVP_PKEY_copy_parameters(pkey,ktmp);
    2018                 :       2359 :         EVP_PKEY_free(ktmp);
    2019                 :       2359 :         return 1;
    2020                 :            :         }
    2021                 :            : 
    2022                 :            : /* Make a delta CRL as the diff between two full CRLs */
    2023                 :            : 
    2024                 :          0 : X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer,
    2025                 :            :                         EVP_PKEY *skey, const EVP_MD *md, unsigned int flags)
    2026                 :            :         {
    2027                 :          0 :         X509_CRL *crl = NULL;
    2028                 :            :         int i;
    2029                 :          0 :         STACK_OF(X509_REVOKED) *revs = NULL;
    2030                 :            :         /* CRLs can't be delta already */
    2031 [ #  # ][ #  # ]:          0 :         if (base->base_crl_number || newer->base_crl_number)
    2032                 :            :                         {
    2033                 :          0 :                         X509err(X509_F_X509_CRL_DIFF, X509_R_CRL_ALREADY_DELTA);
    2034                 :          0 :                         return NULL;
    2035                 :            :                         }
    2036                 :            :         /* Base and new CRL must have a CRL number */
    2037 [ #  # ][ #  # ]:          0 :         if (!base->crl_number || !newer->crl_number)
    2038                 :            :                         {
    2039                 :          0 :                         X509err(X509_F_X509_CRL_DIFF, X509_R_NO_CRL_NUMBER);
    2040                 :          0 :                         return NULL;
    2041                 :            :                         }
    2042                 :            :         /* Issuer names must match */
    2043         [ #  # ]:          0 :         if (X509_NAME_cmp(X509_CRL_get_issuer(base),
    2044                 :          0 :                                 X509_CRL_get_issuer(newer)))
    2045                 :            :                         {
    2046                 :          0 :                         X509err(X509_F_X509_CRL_DIFF, X509_R_ISSUER_MISMATCH);
    2047                 :          0 :                         return NULL;
    2048                 :            :                         }
    2049                 :            :         /* AKID and IDP must match */
    2050         [ #  # ]:          0 :         if (!crl_extension_match(base, newer, NID_authority_key_identifier))
    2051                 :            :                         {
    2052                 :          0 :                         X509err(X509_F_X509_CRL_DIFF, X509_R_AKID_MISMATCH);
    2053                 :          0 :                         return NULL;
    2054                 :            :                         }
    2055         [ #  # ]:          0 :         if (!crl_extension_match(base, newer, NID_issuing_distribution_point))
    2056                 :            :                         {
    2057                 :          0 :                         X509err(X509_F_X509_CRL_DIFF, X509_R_IDP_MISMATCH);
    2058                 :          0 :                         return NULL;
    2059                 :            :                         }
    2060                 :            :         /* Newer CRL number must exceed full CRL number */
    2061         [ #  # ]:          0 :         if (ASN1_INTEGER_cmp(newer->crl_number, base->crl_number) <= 0)
    2062                 :            :                         {
    2063                 :          0 :                         X509err(X509_F_X509_CRL_DIFF, X509_R_NEWER_CRL_NOT_NEWER);
    2064                 :          0 :                         return NULL;
    2065                 :            :                         }
    2066                 :            :         /* CRLs must verify */
    2067         [ #  # ]:          0 :         if (skey && (X509_CRL_verify(base, skey) <= 0 ||
           [ #  #  #  # ]
    2068                 :          0 :                         X509_CRL_verify(newer, skey) <= 0))
    2069                 :            :                 {
    2070                 :          0 :                 X509err(X509_F_X509_CRL_DIFF, X509_R_CRL_VERIFY_FAILURE);
    2071                 :          0 :                 return NULL;
    2072                 :            :                 }
    2073                 :            :         /* Create new CRL */
    2074                 :          0 :         crl = X509_CRL_new();
    2075 [ #  # ][ #  # ]:          0 :         if (!crl || !X509_CRL_set_version(crl, 1))
    2076                 :            :                 goto memerr;
    2077                 :            :         /* Set issuer name */
    2078         [ #  # ]:          0 :         if (!X509_CRL_set_issuer_name(crl, X509_CRL_get_issuer(newer)))
    2079                 :            :                 goto memerr;
    2080                 :            : 
    2081         [ #  # ]:          0 :         if (!X509_CRL_set_lastUpdate(crl, X509_CRL_get_lastUpdate(newer)))
    2082                 :            :                 goto memerr;
    2083         [ #  # ]:          0 :         if (!X509_CRL_set_nextUpdate(crl, X509_CRL_get_nextUpdate(newer)))
    2084                 :            :                 goto memerr;
    2085                 :            : 
    2086                 :            :         /* Set base CRL number: must be critical */
    2087                 :            : 
    2088         [ #  # ]:          0 :         if (!X509_CRL_add1_ext_i2d(crl, NID_delta_crl, base->crl_number, 1, 0))
    2089                 :            :                 goto memerr;
    2090                 :            : 
    2091                 :            :         /* Copy extensions across from newest CRL to delta: this will set
    2092                 :            :          * CRL number to correct value too.
    2093                 :            :          */
    2094                 :            : 
    2095         [ #  # ]:          0 :         for (i = 0; i < X509_CRL_get_ext_count(newer); i++)
    2096                 :            :                 {
    2097                 :            :                 X509_EXTENSION *ext;
    2098                 :          0 :                 ext = X509_CRL_get_ext(newer, i);
    2099         [ #  # ]:          0 :                 if (!X509_CRL_add_ext(crl, ext, -1))
    2100                 :            :                         goto memerr;
    2101                 :            :                 }
    2102                 :            : 
    2103                 :            :         /* Go through revoked entries, copying as needed */
    2104                 :            : 
    2105                 :          0 :         revs = X509_CRL_get_REVOKED(newer);
    2106                 :            : 
    2107         [ #  # ]:          0 :         for (i = 0; i < sk_X509_REVOKED_num(revs); i++)
    2108                 :            :                 {
    2109                 :            :                 X509_REVOKED *rvn, *rvtmp;
    2110                 :          0 :                 rvn = sk_X509_REVOKED_value(revs, i);
    2111                 :            :                 /* Add only if not also in base.
    2112                 :            :                  * TODO: need something cleverer here for some more complex
    2113                 :            :                  * CRLs covering multiple CAs.
    2114                 :            :                  */
    2115         [ #  # ]:          0 :                 if (!X509_CRL_get0_by_serial(base, &rvtmp, rvn->serialNumber))
    2116                 :            :                         {
    2117                 :          0 :                         rvtmp = X509_REVOKED_dup(rvn);
    2118         [ #  # ]:          0 :                         if (!rvtmp)
    2119                 :            :                                 goto memerr;
    2120         [ #  # ]:          0 :                         if (!X509_CRL_add0_revoked(crl, rvtmp))
    2121                 :            :                                 {
    2122                 :          0 :                                 X509_REVOKED_free(rvtmp);
    2123                 :          0 :                                 goto memerr;
    2124                 :            :                                 }
    2125                 :            :                         }
    2126                 :            :                 }
    2127                 :            :         /* TODO: optionally prune deleted entries */
    2128                 :            : 
    2129 [ #  # ][ #  # ]:          0 :         if (skey && md && !X509_CRL_sign(crl, skey, md))
    2130                 :            :                 goto memerr;
    2131                 :            :         
    2132                 :          0 :         return crl;
    2133                 :            : 
    2134                 :            :         memerr:
    2135                 :          0 :         X509err(X509_F_X509_CRL_DIFF, ERR_R_MALLOC_FAILURE);
    2136         [ #  # ]:          0 :         if (crl)
    2137                 :          0 :                 X509_CRL_free(crl);
    2138                 :            :         return NULL;
    2139                 :            :         }
    2140                 :            : 
    2141                 :       1117 : int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
    2142                 :            :              CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
    2143                 :            :         {
    2144                 :            :         /* This function is (usually) called only once, by
    2145                 :            :          * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c). */
    2146                 :       1117 :         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, argl, argp,
    2147                 :            :                         new_func, dup_func, free_func);
    2148                 :            :         }
    2149                 :            : 
    2150                 :       1474 : int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data)
    2151                 :            :         {
    2152                 :       1474 :         return CRYPTO_set_ex_data(&ctx->ex_data,idx,data);
    2153                 :            :         }
    2154                 :            : 
    2155                 :        370 : void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx)
    2156                 :            :         {
    2157                 :        370 :         return CRYPTO_get_ex_data(&ctx->ex_data,idx);
    2158                 :            :         }
    2159                 :            : 
    2160                 :        198 : int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx)
    2161                 :            :         {
    2162                 :        198 :         return ctx->error;
    2163                 :            :         }
    2164                 :            : 
    2165                 :          0 : void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err)
    2166                 :            :         {
    2167                 :          0 :         ctx->error=err;
    2168                 :          0 :         }
    2169                 :            : 
    2170                 :          8 : int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx)
    2171                 :            :         {
    2172                 :          8 :         return ctx->error_depth;
    2173                 :            :         }
    2174                 :            : 
    2175                 :         19 : X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx)
    2176                 :            :         {
    2177                 :         19 :         return ctx->current_cert;
    2178                 :            :         }
    2179                 :            : 
    2180                 :          0 : STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx)
    2181                 :            :         {
    2182                 :          0 :         return ctx->chain;
    2183                 :            :         }
    2184                 :            : 
    2185                 :         33 : STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx)
    2186                 :            :         {
    2187         [ +  - ]:         33 :         if (!ctx->chain)
    2188                 :            :                 return NULL;
    2189                 :         33 :         return X509_chain_up_ref(ctx->chain);
    2190                 :            :         }
    2191                 :            : 
    2192                 :          0 : X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx)
    2193                 :            :         {
    2194                 :          0 :         return ctx->current_issuer;
    2195                 :            :         }
    2196                 :            : 
    2197                 :          0 : X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx)
    2198                 :            :         {
    2199                 :          0 :         return ctx->current_crl;
    2200                 :            :         }
    2201                 :            : 
    2202                 :          8 : X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx)
    2203                 :            :         {
    2204                 :          8 :         return ctx->parent;
    2205                 :            :         }
    2206                 :            : 
    2207                 :          5 : void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x)
    2208                 :            :         {
    2209                 :          5 :         ctx->cert=x;
    2210                 :          5 :         }
    2211                 :            : 
    2212                 :          0 : void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
    2213                 :            :         {
    2214                 :          0 :         ctx->untrusted=sk;
    2215                 :          0 :         }
    2216                 :            : 
    2217                 :         24 : void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk)
    2218                 :            :         {
    2219                 :         24 :         ctx->crls=sk;
    2220                 :         24 :         }
    2221                 :            : 
    2222                 :         33 : int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose)
    2223                 :            :         {
    2224                 :         33 :         return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0);
    2225                 :            :         }
    2226                 :            : 
    2227                 :          0 : int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust)
    2228                 :            :         {
    2229                 :          0 :         return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
    2230                 :            :         }
    2231                 :            : 
    2232                 :            : /* This function is used to set the X509_STORE_CTX purpose and trust
    2233                 :            :  * values. This is intended to be used when another structure has its
    2234                 :            :  * own trust and purpose values which (if set) will be inherited by
    2235                 :            :  * the ctx. If they aren't set then we will usually have a default
    2236                 :            :  * purpose in mind which should then be used to set the trust value.
    2237                 :            :  * An example of this is SSL use: an SSL structure will have its own
    2238                 :            :  * purpose and trust settings which the application can set: if they
    2239                 :            :  * aren't set then we use the default of SSL client/server.
    2240                 :            :  */
    2241                 :            : 
    2242                 :         33 : int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
    2243                 :            :                                 int purpose, int trust)
    2244                 :            : {
    2245                 :            :         int idx;
    2246                 :            :         /* If purpose not set use default */
    2247         [ -  + ]:         33 :         if (!purpose) purpose = def_purpose;
    2248                 :            :         /* If we have a purpose then check it is valid */
    2249         [ +  - ]:         33 :         if (purpose)
    2250                 :            :                 {
    2251                 :            :                 X509_PURPOSE *ptmp;
    2252                 :         33 :                 idx = X509_PURPOSE_get_by_id(purpose);
    2253         [ -  + ]:         33 :                 if (idx == -1)
    2254                 :            :                         {
    2255                 :          0 :                         X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
    2256                 :            :                                                 X509_R_UNKNOWN_PURPOSE_ID);
    2257                 :          0 :                         return 0;
    2258                 :            :                         }
    2259                 :         33 :                 ptmp = X509_PURPOSE_get0(idx);
    2260         [ -  + ]:         33 :                 if (ptmp->trust == X509_TRUST_DEFAULT)
    2261                 :            :                         {
    2262                 :          0 :                         idx = X509_PURPOSE_get_by_id(def_purpose);
    2263         [ #  # ]:          0 :                         if (idx == -1)
    2264                 :            :                                 {
    2265                 :          0 :                                 X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
    2266                 :            :                                                 X509_R_UNKNOWN_PURPOSE_ID);
    2267                 :          0 :                                 return 0;
    2268                 :            :                                 }
    2269                 :          0 :                         ptmp = X509_PURPOSE_get0(idx);
    2270                 :            :                         }
    2271                 :            :                 /* If trust not set then get from purpose default */
    2272         [ +  - ]:         33 :                 if (!trust) trust = ptmp->trust;
    2273                 :            :                 }
    2274         [ +  - ]:         33 :         if (trust)
    2275                 :            :                 {
    2276                 :         33 :                 idx = X509_TRUST_get_by_id(trust);
    2277         [ -  + ]:         33 :                 if (idx == -1)
    2278                 :            :                         {
    2279                 :          0 :                         X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
    2280                 :            :                                                 X509_R_UNKNOWN_TRUST_ID);
    2281                 :          0 :                         return 0;
    2282                 :            :                         }
    2283                 :            :                 }
    2284                 :            : 
    2285 [ +  - ][ +  - ]:         33 :         if (purpose && !ctx->param->purpose) ctx->param->purpose = purpose;
    2286 [ +  - ][ +  - ]:         33 :         if (trust && !ctx->param->trust) ctx->param->trust = trust;
    2287                 :            :         return 1;
    2288                 :            : }
    2289                 :            : 
    2290                 :          9 : X509_STORE_CTX *X509_STORE_CTX_new(void)
    2291                 :            : {
    2292                 :            :         X509_STORE_CTX *ctx;
    2293                 :          9 :         ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX));
    2294         [ -  + ]:          9 :         if (!ctx)
    2295                 :            :                 {
    2296                 :          0 :                 X509err(X509_F_X509_STORE_CTX_NEW,ERR_R_MALLOC_FAILURE);
    2297                 :          0 :                 return NULL;
    2298                 :            :                 }
    2299                 :            :         memset(ctx, 0, sizeof(X509_STORE_CTX));
    2300                 :          9 :         return ctx;
    2301                 :            : }
    2302                 :            : 
    2303                 :          9 : void X509_STORE_CTX_free(X509_STORE_CTX *ctx)
    2304                 :            : {
    2305                 :          9 :         X509_STORE_CTX_cleanup(ctx);
    2306                 :          9 :         OPENSSL_free(ctx);
    2307                 :          9 : }
    2308                 :            : 
    2309                 :       2380 : int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509,
    2310                 :            :              STACK_OF(X509) *chain)
    2311                 :            :         {
    2312                 :       2380 :         int ret = 1;
    2313                 :       2380 :         ctx->ctx=store;
    2314                 :       2380 :         ctx->current_method=0;
    2315                 :       2380 :         ctx->cert=x509;
    2316                 :       2380 :         ctx->untrusted=chain;
    2317                 :       2380 :         ctx->crls = NULL;
    2318                 :       2380 :         ctx->last_untrusted=0;
    2319                 :       2380 :         ctx->other_ctx=NULL;
    2320                 :       2380 :         ctx->valid=0;
    2321                 :       2380 :         ctx->chain=NULL;
    2322                 :       2380 :         ctx->error=0;
    2323                 :       2380 :         ctx->explicit_policy=0;
    2324                 :       2380 :         ctx->error_depth=0;
    2325                 :       2380 :         ctx->current_cert=NULL;
    2326                 :       2380 :         ctx->current_issuer=NULL;
    2327                 :       2380 :         ctx->current_crl=NULL;
    2328                 :       2380 :         ctx->current_crl_score=0;
    2329                 :       2380 :         ctx->current_reasons=0;
    2330                 :       2380 :         ctx->tree = NULL;
    2331                 :       2380 :         ctx->parent = NULL;
    2332                 :            : 
    2333                 :       2380 :         ctx->param = X509_VERIFY_PARAM_new();
    2334                 :            : 
    2335         [ -  + ]:       2380 :         if (!ctx->param)
    2336                 :            :                 {
    2337                 :          0 :                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
    2338                 :          0 :                 return 0;
    2339                 :            :                 }
    2340                 :            : 
    2341                 :            :         /* Inherit callbacks and flags from X509_STORE if not set
    2342                 :            :          * use defaults.
    2343                 :            :          */
    2344                 :            : 
    2345                 :            : 
    2346         [ +  - ]:       2380 :         if (store)
    2347                 :       2380 :                 ret = X509_VERIFY_PARAM_inherit(ctx->param, store->param);
    2348                 :            :         else
    2349                 :          0 :                 ctx->param->inh_flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE;
    2350                 :            : 
    2351         [ +  - ]:       2380 :         if (store)
    2352                 :            :                 {
    2353                 :       2380 :                 ctx->verify_cb = store->verify_cb;
    2354                 :       2380 :                 ctx->cleanup = store->cleanup;
    2355                 :            :                 }
    2356                 :            :         else
    2357                 :          0 :                 ctx->cleanup = 0;
    2358                 :            : 
    2359         [ +  - ]:       2380 :         if (ret)
    2360                 :       2380 :                 ret = X509_VERIFY_PARAM_inherit(ctx->param,
    2361                 :            :                                         X509_VERIFY_PARAM_lookup("default"));
    2362                 :            : 
    2363         [ -  + ]:       2380 :         if (ret == 0)
    2364                 :            :                 {
    2365                 :          0 :                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
    2366                 :          0 :                 return 0;
    2367                 :            :                 }
    2368                 :            : 
    2369 [ +  - ][ -  + ]:       2380 :         if (store && store->check_issued)
    2370                 :          0 :                 ctx->check_issued = store->check_issued;
    2371                 :            :         else
    2372                 :       2380 :                 ctx->check_issued = check_issued;
    2373                 :            : 
    2374 [ +  - ][ -  + ]:       2380 :         if (store && store->get_issuer)
    2375                 :          0 :                 ctx->get_issuer = store->get_issuer;
    2376                 :            :         else
    2377                 :       2380 :                 ctx->get_issuer = X509_STORE_CTX_get1_issuer;
    2378                 :            : 
    2379 [ +  - ][ +  + ]:       2380 :         if (store && store->verify_cb)
    2380                 :        108 :                 ctx->verify_cb = store->verify_cb;
    2381                 :            :         else
    2382                 :       2272 :                 ctx->verify_cb = null_callback;
    2383                 :            : 
    2384 [ +  - ][ -  + ]:       2380 :         if (store && store->verify)
    2385                 :          0 :                 ctx->verify = store->verify;
    2386                 :            :         else
    2387                 :       2380 :                 ctx->verify = internal_verify;
    2388                 :            : 
    2389 [ +  - ][ -  + ]:       2380 :         if (store && store->check_revocation)
    2390                 :          0 :                 ctx->check_revocation = store->check_revocation;
    2391                 :            :         else
    2392                 :       2380 :                 ctx->check_revocation = check_revocation;
    2393                 :            : 
    2394 [ +  - ][ -  + ]:       2380 :         if (store && store->get_crl)
    2395                 :          0 :                 ctx->get_crl = store->get_crl;
    2396                 :            :         else
    2397                 :       2380 :                 ctx->get_crl = NULL;
    2398                 :            : 
    2399 [ +  - ][ -  + ]:       2380 :         if (store && store->check_crl)
    2400                 :          0 :                 ctx->check_crl = store->check_crl;
    2401                 :            :         else
    2402                 :       2380 :                 ctx->check_crl = check_crl;
    2403                 :            : 
    2404 [ +  - ][ -  + ]:       2380 :         if (store && store->cert_crl)
    2405                 :          0 :                 ctx->cert_crl = store->cert_crl;
    2406                 :            :         else
    2407                 :       2380 :                 ctx->cert_crl = cert_crl;
    2408                 :            : 
    2409 [ +  - ][ -  + ]:       2380 :         if (store && store->lookup_certs)
    2410                 :          0 :                 ctx->lookup_certs = store->lookup_certs;
    2411                 :            :         else
    2412                 :       2380 :                 ctx->lookup_certs = X509_STORE_get1_certs;
    2413                 :            : 
    2414 [ +  - ][ -  + ]:       2380 :         if (store && store->lookup_crls)
    2415                 :          0 :                 ctx->lookup_crls = store->lookup_crls;
    2416                 :            :         else
    2417                 :       2380 :                 ctx->lookup_crls = X509_STORE_get1_crls;
    2418                 :            : 
    2419                 :       2380 :         ctx->check_policy = check_policy;
    2420                 :            : 
    2421                 :            : 
    2422                 :            :         /* This memset() can't make any sense anyway, so it's removed. As
    2423                 :            :          * X509_STORE_CTX_cleanup does a proper "free" on the ex_data, we put a
    2424                 :            :          * corresponding "new" here and remove this bogus initialisation. */
    2425                 :            :         /* memset(&(ctx->ex_data),0,sizeof(CRYPTO_EX_DATA)); */
    2426         [ -  + ]:       2380 :         if(!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx,
    2427                 :            :                                 &(ctx->ex_data)))
    2428                 :            :                 {
    2429                 :          0 :                 OPENSSL_free(ctx);
    2430                 :          0 :                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
    2431                 :          0 :                 return 0;
    2432                 :            :                 }
    2433                 :            :         return 1;
    2434                 :            :         }
    2435                 :            : 
    2436                 :            : /* Set alternative lookup method: just a STACK of trusted certificates.
    2437                 :            :  * This avoids X509_STORE nastiness where it isn't needed.
    2438                 :            :  */
    2439                 :            : 
    2440                 :          0 : void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
    2441                 :            : {
    2442                 :          0 :         ctx->other_ctx = sk;
    2443                 :          0 :         ctx->get_issuer = get_issuer_sk;
    2444                 :          0 : }
    2445                 :            : 
    2446                 :       2380 : void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx)
    2447                 :            :         {
    2448         [ -  + ]:       2380 :         if (ctx->cleanup) ctx->cleanup(ctx);
    2449         [ +  - ]:       2380 :         if (ctx->param != NULL)
    2450                 :            :                 {
    2451         [ +  - ]:       2380 :                 if (ctx->parent == NULL)
    2452                 :       2380 :                         X509_VERIFY_PARAM_free(ctx->param);
    2453                 :       2380 :                 ctx->param=NULL;
    2454                 :            :                 }
    2455         [ -  + ]:       2380 :         if (ctx->tree != NULL)
    2456                 :            :                 {
    2457                 :          0 :                 X509_policy_tree_free(ctx->tree);
    2458                 :          0 :                 ctx->tree=NULL;
    2459                 :            :                 }
    2460         [ +  + ]:       2380 :         if (ctx->chain != NULL)
    2461                 :            :                 {
    2462                 :       2353 :                 sk_X509_pop_free(ctx->chain,X509_free);
    2463                 :       2353 :                 ctx->chain=NULL;
    2464                 :            :                 }
    2465                 :       2380 :         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx, &(ctx->ex_data));
    2466                 :       2380 :         memset(&ctx->ex_data,0,sizeof(CRYPTO_EX_DATA));
    2467                 :       2380 :         }
    2468                 :            : 
    2469                 :          0 : void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth)
    2470                 :            :         {
    2471                 :          0 :         X509_VERIFY_PARAM_set_depth(ctx->param, depth);
    2472                 :          0 :         }
    2473                 :            : 
    2474                 :       1479 : void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags)
    2475                 :            :         {
    2476                 :       1479 :         X509_VERIFY_PARAM_set_flags(ctx->param, flags);
    2477                 :       1479 :         }
    2478                 :            : 
    2479                 :          0 : void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t)
    2480                 :            :         {
    2481                 :          0 :         X509_VERIFY_PARAM_set_time(ctx->param, t);
    2482                 :          0 :         }
    2483                 :            : 
    2484                 :        308 : void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
    2485                 :            :                                   int (*verify_cb)(int, X509_STORE_CTX *))
    2486                 :            :         {
    2487                 :        308 :         ctx->verify_cb=verify_cb;
    2488                 :        308 :         }
    2489                 :            : 
    2490                 :          0 : X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx)
    2491                 :            :         {
    2492                 :          0 :         return ctx->tree;
    2493                 :            :         }
    2494                 :            : 
    2495                 :          0 : int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx)
    2496                 :            :         {
    2497                 :          0 :         return ctx->explicit_policy;
    2498                 :            :         }
    2499                 :            : 
    2500                 :       1297 : int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name)
    2501                 :            :         {
    2502                 :            :         const X509_VERIFY_PARAM *param;
    2503                 :       1297 :         param = X509_VERIFY_PARAM_lookup(name);
    2504         [ +  - ]:       1297 :         if (!param)
    2505                 :            :                 return 0;
    2506                 :       1297 :         return X509_VERIFY_PARAM_inherit(ctx->param, param);
    2507                 :            :         }
    2508                 :            : 
    2509                 :       1212 : X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx)
    2510                 :            :         {
    2511                 :       1212 :         return ctx->param;
    2512                 :            :         }
    2513                 :            : 
    2514                 :          0 : void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param)
    2515                 :            :         {
    2516         [ #  # ]:          0 :         if (ctx->param)
    2517                 :          0 :                 X509_VERIFY_PARAM_free(ctx->param);
    2518                 :          0 :         ctx->param = param;
    2519                 :          0 :         }
    2520                 :            : 
    2521                 :            : IMPLEMENT_STACK_OF(X509)
    2522                 :            : IMPLEMENT_ASN1_SET_OF(X509)
    2523                 :            : 
    2524                 :            : IMPLEMENT_STACK_OF(X509_NAME)
    2525                 :            : 
    2526                 :            : IMPLEMENT_STACK_OF(X509_ATTRIBUTE)
    2527                 :            : IMPLEMENT_ASN1_SET_OF(X509_ATTRIBUTE)

Generated by: LCOV version 1.9