x509_vfy.c 35.2 KB
Newer Older
1
/* crypto/x509/x509_vfy.c */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#include <stdio.h>
#include <time.h>
#include <errno.h>

#include "cryptlib.h"
A
Andy Polyakov 已提交
64
#include <openssl/crypto.h>
65 66 67 68 69
#include <openssl/lhash.h>
#include <openssl/buffer.h>
#include <openssl/evp.h>
#include <openssl/asn1.h>
#include <openssl/x509.h>
70
#include <openssl/x509v3.h>
71
#include <openssl/objects.h>
72 73

static int null_callback(int ok,X509_STORE_CTX *e);
74 75
static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x);
76
static int check_chain_extensions(X509_STORE_CTX *ctx);
77
static int check_trust(X509_STORE_CTX *ctx);
D
 
Dr. Stephen Henson 已提交
78 79
static int check_revocation(X509_STORE_CTX *ctx);
static int check_cert(X509_STORE_CTX *ctx);
80
static int check_policy(X509_STORE_CTX *ctx);
81
static int internal_verify(X509_STORE_CTX *ctx);
B
Ben Laurie 已提交
82
const char *X509_version="X.509" OPENSSL_VERSION_PTEXT;
B
Ben Laurie 已提交
83

84

U
Ulf Möller 已提交
85
static int null_callback(int ok, X509_STORE_CTX *e)
86
	{
87
	return ok;
88 89 90
	}

#if 0
U
Ulf Möller 已提交
91
static int x509_subject_cmp(X509 **a, X509 **b)
92
	{
93
	return X509_subject_name_cmp(*a,*b);
94 95 96
	}
#endif

U
Ulf Möller 已提交
97
int X509_verify_cert(X509_STORE_CTX *ctx)
98 99 100
	{
	X509 *x,*xtmp,*chain_ss=NULL;
	X509_NAME *xn;
101 102
	int bad_chain = 0;
	X509_VERIFY_PARAM *param = ctx->param;
103 104
	int depth,i,ok=0;
	int num;
105
	int (*cb)(int ok,X509_STORE_CTX *ctx);
B
Ben Laurie 已提交
106
	STACK_OF(X509) *sktmp=NULL;
107 108 109
	if (ctx->cert == NULL)
		{
		X509err(X509_F_X509_VERIFY_CERT,X509_R_NO_CERT_SET_FOR_US_TO_VERIFY);
110
		return -1;
111 112
		}

113
	cb=ctx->verify_cb;
114 115 116 117 118

	/* first we make sure the chain we are going to build is
	 * present and that the first entry is in place */
	if (ctx->chain == NULL)
		{
B
Ben Laurie 已提交
119 120
		if (	((ctx->chain=sk_X509_new_null()) == NULL) ||
			(!sk_X509_push(ctx->chain,ctx->cert)))
121 122 123 124 125 126 127 128
			{
			X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
			goto end;
			}
		CRYPTO_add(&ctx->cert->references,1,CRYPTO_LOCK_X509);
		ctx->last_untrusted=1;
		}

129
	/* We use a temporary STACK so we can chop and hack at it */
B
Ben Laurie 已提交
130 131
	if (ctx->untrusted != NULL
	    && (sktmp=sk_X509_dup(ctx->untrusted)) == NULL)
132 133 134 135 136
		{
		X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
		goto end;
		}

B
Ben Laurie 已提交
137 138
	num=sk_X509_num(ctx->chain);
	x=sk_X509_value(ctx->chain,num-1);
139
	depth=param->depth;
140 141 142 143 144


	for (;;)
		{
		/* If we have enough, we break */
B
Bodo Möller 已提交
145
		if (depth < num) break; /* FIXME: If this happens, we should take
B
Bodo Möller 已提交
146 147 148 149
		                         * note of it and, if appropriate, use the
		                         * X509_V_ERR_CERT_CHAIN_TOO_LONG error
		                         * code later.
		                         */
150 151 152

		/* If we are self signed, we break */
		xn=X509_get_issuer_name(x);
153
		if (ctx->check_issued(ctx, x,x)) break;
154 155 156 157

		/* If we were passed a cert chain, use it first */
		if (ctx->untrusted != NULL)
			{
158
			xtmp=find_issuer(ctx, sktmp,x);
159 160
			if (xtmp != NULL)
				{
B
Ben Laurie 已提交
161
				if (!sk_X509_push(ctx->chain,xtmp))
162 163 164 165 166
					{
					X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
					goto end;
					}
				CRYPTO_add(&xtmp->references,1,CRYPTO_LOCK_X509);
B
Ben Laurie 已提交
167
				sk_X509_delete_ptr(sktmp,xtmp);
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
				ctx->last_untrusted++;
				x=xtmp;
				num++;
				/* reparse the full chain for
				 * the next one */
				continue;
				}
			}
		break;
		}

	/* at this point, chain should contain a list of untrusted
	 * certificates.  We now need to add at least one trusted one,
	 * if possible, otherwise we complain. */

183 184 185 186
	/* Examine last certificate in chain and see if it
 	 * is self signed.
 	 */

B
Ben Laurie 已提交
187 188
	i=sk_X509_num(ctx->chain);
	x=sk_X509_value(ctx->chain,i-1);
189
	xn = X509_get_subject_name(x);
190
	if (ctx->check_issued(ctx, x, x))
191 192
		{
		/* we have a self signed certificate */
B
Ben Laurie 已提交
193
		if (sk_X509_num(ctx->chain) == 1)
194
			{
195 196 197 198
			/* We have a single self signed certificate: see if
			 * we can find it in the store. We must have an exact
			 * match to avoid possible impersonation.
			 */
199 200
			ok = ctx->get_issuer(&xtmp, ctx, x);
			if ((ok <= 0) || X509_cmp(x, xtmp)) 
201 202 203 204
				{
				ctx->error=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
				ctx->current_cert=x;
				ctx->error_depth=i-1;
205
				if (ok == 1) X509_free(xtmp);
206
				bad_chain = 1;
207 208 209 210 211 212 213 214 215
				ok=cb(0,ctx);
				if (!ok) goto end;
				}
			else 
				{
				/* We have a match: replace certificate with store version
				 * so we get any trust settings.
				 */
				X509_free(x);
216
				x = xtmp;
217 218 219
				sk_X509_set(ctx->chain, i - 1, x);
				ctx->last_untrusted=0;
				}
220 221 222
			}
		else
			{
223
			/* extract and save self signed certificate for later use */
B
Ben Laurie 已提交
224
			chain_ss=sk_X509_pop(ctx->chain);
225 226
			ctx->last_untrusted--;
			num--;
B
Ben Laurie 已提交
227
			x=sk_X509_value(ctx->chain,num-1);
228 229 230 231 232 233 234
			}
		}

	/* We now lookup certs from the certificate store */
	for (;;)
		{
		/* If we have enough, we break */
235
		if (depth < num) break;
236 237 238

		/* If we are self signed, we break */
		xn=X509_get_issuer_name(x);
239
		if (ctx->check_issued(ctx,x,x)) break;
240

241 242 243
		ok = ctx->get_issuer(&xtmp, ctx, x);

		if (ok < 0) return ok;
244
		if (ok == 0) break;
245 246 247

		x = xtmp;
		if (!sk_X509_push(ctx->chain,x))
248
			{
249
			X509_free(xtmp);
250
			X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
251
			return 0;
252 253 254 255 256 257
			}
		num++;
		}

	/* we now have our chain, lets check it... */
	xn=X509_get_issuer_name(x);
258 259 260

	/* Is last certificate looked up self signed? */
	if (!ctx->check_issued(ctx,x,x))
261
		{
262
		if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss))
263 264 265 266 267 268 269 270 271 272
			{
			if (ctx->last_untrusted >= num)
				ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
			else
				ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
			ctx->current_cert=x;
			}
		else
			{

B
Ben Laurie 已提交
273
			sk_X509_push(ctx->chain,chain_ss);
274 275 276 277 278 279 280 281
			num++;
			ctx->last_untrusted=num;
			ctx->current_cert=chain_ss;
			ctx->error=X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
			chain_ss=NULL;
			}

		ctx->error_depth=num-1;
282
		bad_chain = 1;
283 284 285 286
		ok=cb(0,ctx);
		if (!ok) goto end;
		}

287
	/* We have the chain complete: now we need to check its purpose */
288
	ok = check_chain_extensions(ctx);
289

290
	if (!ok) goto end;
291

292 293
	/* The chain extensions are OK: check trust */

294
	if (param->trust > 0) ok = check_trust(ctx);
295

296
	if (!ok) goto end;
297

298 299 300
	/* We may as well copy down any DSA parameters that are required */
	X509_get_pubkey_parameters(NULL,ctx->chain);

D
 
Dr. Stephen Henson 已提交
301 302 303 304 305 306 307
	/* Check revocation status: we do this after copying parameters
	 * because they may be needed for CRL signature verification.
	 */

	ok = ctx->check_revocation(ctx);
	if(!ok) goto end;

308
	/* At this point, we have a chain and need to verify it */
309 310
	if (ctx->verify != NULL)
		ok=ctx->verify(ctx);
311 312
	else
		ok=internal_verify(ctx);
313 314 315 316 317 318
	if(!ok) goto end;

	/* If we get this far evaluate policies */
	if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK))
		ok = ctx->check_policy(ctx);
	if(!ok) goto end;
319 320
	if (0)
		{
321
end:
322 323
		X509_get_pubkey_parameters(NULL,ctx->chain);
		}
B
Ben Laurie 已提交
324
	if (sktmp != NULL) sk_X509_free(sktmp);
325
	if (chain_ss != NULL) X509_free(chain_ss);
326
	return ok;
327 328
	}

329 330 331 332 333 334 335 336

/* Given a STACK_OF(X509) find the issuer of cert (if any)
 */

static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x)
{
	int i;
	X509 *issuer;
337
	for (i = 0; i < sk_X509_num(sk); i++)
338
		{
339
		issuer = sk_X509_value(sk, i);
340
		if (ctx->check_issued(ctx, x, issuer))
341 342
			return issuer;
		}
343 344 345 346 347 348 349 350 351
	return NULL;
}

/* Given a possible certificate and issuer check them */

static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer)
{
	int ret;
	ret = X509_check_issued(issuer, x);
352 353
	if (ret == X509_V_OK)
		return 1;
D
 
Dr. Stephen Henson 已提交
354
	/* If we haven't asked for issuer errors don't set ctx */
355
	if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK))
D
 
Dr. Stephen Henson 已提交
356 357 358 359 360
		return 0;

	ctx->error = ret;
	ctx->current_cert = x;
	ctx->current_issuer = issuer;
361
	return ctx->verify_cb(0, ctx);
362 363 364 365 366 367 368 369
	return 0;
}

/* Alternative lookup method: look from a STACK stored in other_ctx */

static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
{
	*issuer = find_issuer(ctx, ctx->other_ctx, x);
370 371
	if (*issuer)
		{
372 373
		CRYPTO_add(&(*issuer)->references,1,CRYPTO_LOCK_X509);
		return 1;
374 375 376
		}
	else
		return 0;
377 378 379
}
	

380 381 382 383
/* Check a certificate chains extensions for consistency
 * with the supplied purpose
 */

384
static int check_chain_extensions(X509_STORE_CTX *ctx)
385
{
386
#ifdef OPENSSL_NO_CHAIN_VERIFY
387 388
	return 1;
#else
389
	int i, ok=0, must_be_ca;
390
	X509 *x;
391
	int (*cb)(int ok,X509_STORE_CTX *ctx);
392
	int proxy_path_length = 0;
393
	cb=ctx->verify_cb;
394 395 396 397 398 399 400 401 402 403

	/* must_be_ca can have 1 of 3 values:
	   -1: we accept both CA and non-CA certificates, to allow direct
	       use of self-signed certificates (which are marked as CA).
	   0:  we only accept non-CA certificates.  This is currently not
	       used, but the possibility is present for future extensions.
	   1:  we only accept CA certificates.  This is currently used for
	       all certificates in the chain except the leaf certificate.
	*/
	must_be_ca = -1;
404
	/* Check all untrusted certificates */
405
	for (i = 0; i < ctx->last_untrusted; i++)
406
		{
407
		int ret;
408
		x = sk_X509_value(ctx->chain, i);
409
		if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
D
 
Dr. Stephen Henson 已提交
410 411 412 413 414 415 416 417
			&& (x->ex_flags & EXFLAG_CRITICAL))
			{
			ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION;
			ctx->error_depth = i;
			ctx->current_cert = x;
			ok=cb(0,ctx);
			if (!ok) goto end;
			}
418 419
		ret = X509_check_ca(x);
		switch(must_be_ca)
420
			{
421 422 423 424 425
		case -1:
			if ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
				&& (ret != 1) && (ret != 0))
				{
				ret = 0;
426
				ctx->error = X509_V_ERR_INVALID_CA;
427
				}
428
			else
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
				ret = 1;
			break;
		case 0:
			if (ret != 0)
				{
				ret = 0;
				ctx->error = X509_V_ERR_INVALID_NON_CA;
				}
			else
				ret = 1;
			break;
		default:
			if ((ret == 0)
				|| ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
					&& (ret != 1)))
				{
				ret = 0;
				ctx->error = X509_V_ERR_INVALID_CA;
				}
			else
				ret = 1;
			break;
			}
		if (ret == 0)
			{
454 455 456
			ctx->error_depth = i;
			ctx->current_cert = x;
			ok=cb(0,ctx);
457 458
			if (!ok) goto end;
			}
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
		if (ctx->param->purpose > 0)
			{
			ret = X509_check_purpose(x, ctx->param->purpose,
				must_be_ca > 0);
			if ((ret == 0)
				|| ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
					&& (ret != 1)))
				{
				ctx->error = X509_V_ERR_INVALID_PURPOSE;
				ctx->error_depth = i;
				ctx->current_cert = x;
				ok=cb(0,ctx);
				if (!ok) goto end;
				}
			}
474
		/* Check pathlen */
475
		if ((i > 1) && (x->ex_pathlen != -1)
476
			   && (i > (x->ex_pathlen + proxy_path_length + 1)))
477
			{
478 479 480 481
			ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
			ctx->error_depth = i;
			ctx->current_cert = x;
			ok=cb(0,ctx);
482 483
			if (!ok) goto end;
			}
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
		/* If this certificate is a proxy certificate, the next
		   certificate must be another proxy certificate or a EE
		   certificate.  If not, the next certificate must be a
		   CA certificate.  */
		if (x->ex_flags & EXFLAG_PROXY)
			{
			if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen)
				{
				ctx->error =
					X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
				ctx->error_depth = i;
				ctx->current_cert = x;
				ok=cb(0,ctx);
				if (!ok) goto end;
				}
			proxy_path_length++;
			must_be_ca = 0;
			}
		else
			must_be_ca = 1;
504 505
		}
	ok = 1;
506
 end:
507
	return ok;
508 509 510
#endif
}

511 512
static int check_trust(X509_STORE_CTX *ctx)
{
513
#ifdef OPENSSL_NO_CHAIN_VERIFY
514 515 516 517
	return 1;
#else
	int i, ok;
	X509 *x;
518
	int (*cb)(int ok,X509_STORE_CTX *ctx);
519
	cb=ctx->verify_cb;
520 521 522
/* For now just check the last certificate in the chain */
	i = sk_X509_num(ctx->chain) - 1;
	x = sk_X509_value(ctx->chain, i);
523
	ok = X509_check_trust(x, ctx->param->trust, 0);
524 525
	if (ok == X509_TRUST_TRUSTED)
		return 1;
D
 
Dr. Stephen Henson 已提交
526
	ctx->error_depth = i;
527
	ctx->current_cert = x;
528 529 530 531
	if (ok == X509_TRUST_REJECTED)
		ctx->error = X509_V_ERR_CERT_REJECTED;
	else
		ctx->error = X509_V_ERR_CERT_UNTRUSTED;
532
	ok = cb(0, ctx);
533
	return ok;
534 535 536
#endif
}

D
 
Dr. Stephen Henson 已提交
537 538 539
static int check_revocation(X509_STORE_CTX *ctx)
	{
	int i, last, ok;
540
	if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK))
D
 
Dr. Stephen Henson 已提交
541
		return 1;
542
	if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL)
D
 
Dr. Stephen Henson 已提交
543
		last = sk_X509_num(ctx->chain) - 1;
544 545
	else
		last = 0;
D
 
Dr. Stephen Henson 已提交
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
	for(i = 0; i <= last; i++)
		{
		ctx->error_depth = i;
		ok = check_cert(ctx);
		if (!ok) return ok;
		}
	return 1;
	}

static int check_cert(X509_STORE_CTX *ctx)
	{
	X509_CRL *crl = NULL;
	X509 *x;
	int ok, cnum;
	cnum = ctx->error_depth;
	x = sk_X509_value(ctx->chain, cnum);
	ctx->current_cert = x;
	/* Try to retrieve relevant CRL */
	ok = ctx->get_crl(ctx, &crl, x);
	/* If error looking up CRL, nothing we can do except
	 * notify callback
	 */
	if(!ok)
		{
		ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
571
		ok = ctx->verify_cb(0, ctx);
D
 
Dr. Stephen Henson 已提交
572 573 574 575 576 577 578 579 580 581 582 583 584
		goto err;
		}
	ctx->current_crl = crl;
	ok = ctx->check_crl(ctx, crl);
	if (!ok) goto err;
	ok = ctx->cert_crl(ctx, crl, x);
	err:
	ctx->current_crl = NULL;
	X509_CRL_free(crl);
	return ok;

	}

585 586 587 588 589 590 591
/* Check CRL times against values in X509_STORE_CTX */

static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify)
	{
	time_t *ptime;
	int i;
	ctx->current_crl = crl;
592 593
	if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
		ptime = &ctx->param->check_time;
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
	else
		ptime = NULL;

	i=X509_cmp_time(X509_CRL_get_lastUpdate(crl), ptime);
	if (i == 0)
		{
		ctx->error=X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD;
		if (!notify || !ctx->verify_cb(0, ctx))
			return 0;
		}

	if (i > 0)
		{
		ctx->error=X509_V_ERR_CRL_NOT_YET_VALID;
		if (!notify || !ctx->verify_cb(0, ctx))
			return 0;
		}

	if(X509_CRL_get_nextUpdate(crl))
		{
		i=X509_cmp_time(X509_CRL_get_nextUpdate(crl), ptime);

		if (i == 0)
			{
			ctx->error=X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD;
			if (!notify || !ctx->verify_cb(0, ctx))
				return 0;
			}

		if (i < 0)
			{
			ctx->error=X509_V_ERR_CRL_HAS_EXPIRED;
			if (!notify || !ctx->verify_cb(0, ctx))
				return 0;
			}
		}

	ctx->current_crl = NULL;

	return 1;
	}

/* Lookup CRLs from the supplied list. Look for matching isser name
 * and validity. If we can't find a valid CRL return the last one
 * with matching name. This gives more meaningful error codes. Otherwise
 * we'd get a CRL not found error if a CRL existed with matching name but
 * was invalid.
 */

static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl,
			X509_NAME *nm, STACK_OF(X509_CRL) *crls)
	{
	int i;
	X509_CRL *crl, *best_crl = NULL;
	for (i = 0; i < sk_X509_CRL_num(crls); i++)
		{
		crl = sk_X509_CRL_value(crls, i);
		if (X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
			continue;
		if (check_crl_time(ctx, crl, 0))
			{
			*pcrl = crl;
			CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509);
			return 1;
			}
		best_crl = crl;
		}
	if (best_crl)
		{
		*pcrl = best_crl;
		CRYPTO_add(&best_crl->references, 1, CRYPTO_LOCK_X509);
		}
		
	return 0;
	}

D
 
Dr. Stephen Henson 已提交
670 671 672
/* Retrieve CRL corresponding to certificate: currently just a
 * subject lookup: maybe use AKID later...
 */
673
static int get_crl(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509 *x)
D
 
Dr. Stephen Henson 已提交
674 675
	{
	int ok;
676
	X509_CRL *crl = NULL;
D
 
Dr. Stephen Henson 已提交
677
	X509_OBJECT xobj;
678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
	X509_NAME *nm;
	nm = X509_get_issuer_name(x);
	ok = get_crl_sk(ctx, &crl, nm, ctx->crls);
	if (ok)
		{
		*pcrl = crl;
		return 1;
		}

	ok = X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj);

	if (!ok)
		{
		/* If we got a near match from get_crl_sk use that */
		if (crl)
			{
			*pcrl = crl;
			return 1;
			}
		return 0;
		}

	*pcrl = xobj.data.crl;
	if (crl)
		X509_CRL_free(crl);
D
 
Dr. Stephen Henson 已提交
703 704 705 706 707 708 709 710
	return 1;
	}

/* Check CRL validity */
static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl)
	{
	X509 *issuer = NULL;
	EVP_PKEY *ikey = NULL;
711
	int ok = 0, chnum, cnum;
D
 
Dr. Stephen Henson 已提交
712 713 714 715 716 717 718 719 720 721 722 723 724 725
	cnum = ctx->error_depth;
	chnum = sk_X509_num(ctx->chain) - 1;
	/* Find CRL issuer: if not last certificate then issuer
	 * is next certificate in chain.
	 */
	if(cnum < chnum)
		issuer = sk_X509_value(ctx->chain, cnum + 1);
	else
		{
		issuer = sk_X509_value(ctx->chain, chnum);
		/* If not self signed, can't check signature */
		if(!ctx->check_issued(ctx, issuer, issuer))
			{
			ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
726
			ok = ctx->verify_cb(0, ctx);
D
 
Dr. Stephen Henson 已提交
727 728 729 730 731 732
			if(!ok) goto err;
			}
		}

	if(issuer)
		{
733 734 735 736 737 738 739 740
		/* Check for cRLSign bit if keyUsage present */
		if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
			!(issuer->ex_kusage & KU_CRL_SIGN))
			{
			ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
			ok = ctx->verify_cb(0, ctx);
			if(!ok) goto err;
			}
D
 
Dr. Stephen Henson 已提交
741 742 743 744 745 746 747

		/* Attempt to get issuer certificate public key */
		ikey = X509_get_pubkey(issuer);

		if(!ikey)
			{
			ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
748
			ok = ctx->verify_cb(0, ctx);
D
 
Dr. Stephen Henson 已提交
749 750 751 752 753 754 755 756
			if (!ok) goto err;
			}
		else
			{
			/* Verify CRL signature */
			if(X509_CRL_verify(crl, ikey) <= 0)
				{
				ctx->error=X509_V_ERR_CRL_SIGNATURE_FAILURE;
757
				ok = ctx->verify_cb(0, ctx);
D
 
Dr. Stephen Henson 已提交
758 759 760 761 762
				if (!ok) goto err;
				}
			}
		}

763 764
	if (!check_crl_time(ctx, crl, 1))
		goto err;
D
 
Dr. Stephen Henson 已提交
765 766 767 768 769 770 771 772 773 774 775 776 777

	ok = 1;

	err:
	EVP_PKEY_free(ikey);
	return ok;
	}

/* Check certificate against CRL */
static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x)
	{
	int idx, ok;
	X509_REVOKED rtmp;
778 779
	STACK_OF(X509_EXTENSION) *exts;
	X509_EXTENSION *ext;
D
 
Dr. Stephen Henson 已提交
780 781
	/* Look for serial number of certificate in CRL */
	rtmp.serialNumber = X509_get_serialNumber(x);
782 783 784 785 786 787 788 789 790
	/* Sort revoked into serial number order if not already sorted.
	 * Do this under a lock to avoid race condition.
 	 */
	if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked))
		{
		CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL);
		sk_X509_REVOKED_sort(crl->crl->revoked);
		CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL);
		}
D
 
Dr. Stephen Henson 已提交
791
	idx = sk_X509_REVOKED_find(crl->crl->revoked, &rtmp);
792
	/* If found assume revoked: want something cleverer than
D
 
Dr. Stephen Henson 已提交
793 794
	 * this to handle entry extensions in V2 CRLs.
	 */
795 796 797 798 799 800 801
	if(idx >= 0)
		{
		ctx->error = X509_V_ERR_CERT_REVOKED;
		ok = ctx->verify_cb(0, ctx);
		if (!ok) return 0;
		}

802
	if (ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826
		return 1;

	/* See if we have any critical CRL extensions: since we
	 * currently don't handle any CRL extensions the CRL must be
	 * rejected. 
	 * This code accesses the X509_CRL structure directly: applications
	 * shouldn't do this.
	 */

	exts = crl->crl->extensions;

	for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++)
		{
		ext = sk_X509_EXTENSION_value(exts, idx);
		if (ext->critical > 0)
			{
			ctx->error =
				X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
			ok = ctx->verify_cb(0, ctx);
			if(!ok) return 0;
			break;
			}
		}
	return 1;
D
 
Dr. Stephen Henson 已提交
827 828
	}

829 830 831
static int check_policy(X509_STORE_CTX *ctx)
	{
	int ret;
832
	ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
				ctx->param->policies, ctx->param->flags);
	if (ret == 0)
		{
		X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
		return 0;
		}
	/* Invalid or inconsistent extensions */
	if (ret == -1)
		{
		/* Locate certificates with bad extensions and notify
		 * callback.
		 */
		X509 *x;
		int i;
		for (i = 1; i < sk_X509_num(ctx->chain); i++)
			{
			x = sk_X509_value(ctx->chain, i);
			if (!(x->ex_flags & EXFLAG_INVALID_POLICY))
				continue;
			ctx->current_cert = x;
			ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION;
			ret = ctx->verify_cb(0, ctx);
			}
		return 1;
		}
	if (ret == -2)
		{
		ctx->current_cert = NULL;
		ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY;
		return ctx->verify_cb(0, ctx);
		}

	if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY)
		{
		ctx->current_cert = NULL;
		ctx->error = X509_V_OK;
		if (!ctx->verify_cb(2, ctx))
			return 0;
		}

	return 1;
	}

876 877 878 879 880
static int check_cert_time(X509_STORE_CTX *ctx, X509 *x)
	{
	time_t *ptime;
	int i;

881 882
	if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
		ptime = &ctx->param->check_time;
883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922
	else
		ptime = NULL;

	i=X509_cmp_time(X509_get_notBefore(x), ptime);
	if (i == 0)
		{
		ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
		ctx->current_cert=x;
		if (!ctx->verify_cb(0, ctx))
			return 0;
		}

	if (i > 0)
		{
		ctx->error=X509_V_ERR_CERT_NOT_YET_VALID;
		ctx->current_cert=x;
		if (!ctx->verify_cb(0, ctx))
			return 0;
		}

	i=X509_cmp_time(X509_get_notAfter(x), ptime);
	if (i == 0)
		{
		ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
		ctx->current_cert=x;
		if (!ctx->verify_cb(0, ctx))
			return 0;
		}

	if (i < 0)
		{
		ctx->error=X509_V_ERR_CERT_HAS_EXPIRED;
		ctx->current_cert=x;
		if (!ctx->verify_cb(0, ctx))
			return 0;
		}

	return 1;
	}

U
Ulf Möller 已提交
923
static int internal_verify(X509_STORE_CTX *ctx)
924
	{
925
	int ok=0,n;
926 927
	X509 *xs,*xi;
	EVP_PKEY *pkey=NULL;
928
	int (*cb)(int ok,X509_STORE_CTX *ctx);
929

930
	cb=ctx->verify_cb;
931

B
Ben Laurie 已提交
932
	n=sk_X509_num(ctx->chain);
933 934
	ctx->error_depth=n-1;
	n--;
B
Ben Laurie 已提交
935
	xi=sk_X509_value(ctx->chain,n);
936

D
Dr. Stephen Henson 已提交
937
	if (ctx->check_issued(ctx, xi, xi))
938 939 940 941 942 943 944 945 946 947 948 949 950 951
		xs=xi;
	else
		{
		if (n <= 0)
			{
			ctx->error=X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
			ctx->current_cert=xi;
			ok=cb(0,ctx);
			goto end;
			}
		else
			{
			n--;
			ctx->error_depth=n;
B
Ben Laurie 已提交
952
			xs=sk_X509_value(ctx->chain,n);
953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968
			}
		}

/*	ctx->error=0;  not needed */
	while (n >= 0)
		{
		ctx->error_depth=n;
		if (!xs->valid)
			{
			if ((pkey=X509_get_pubkey(xi)) == NULL)
				{
				ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
				ctx->current_cert=xi;
				ok=(*cb)(0,ctx);
				if (!ok) goto end;
				}
969
			else if (X509_verify(xs,pkey) <= 0)
B
Bodo Möller 已提交
970 971 972 973 974 975 976
				/* XXX  For the final trusted self-signed cert,
				 * this is a waste of time.  That check should
				 * optional so that e.g. 'openssl x509' can be
				 * used to detect invalid self-signatures, but
				 * we don't verify again and again in SSL
				 * handshakes and the like once the cert has
				 * been declared trusted. */
977 978 979 980
				{
				ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
				ctx->current_cert=xs;
				ok=(*cb)(0,ctx);
D
 
Dr. Stephen Henson 已提交
981 982 983 984 985
				if (!ok)
					{
					EVP_PKEY_free(pkey);
					goto end;
					}
986
				}
987
			EVP_PKEY_free(pkey);
988 989 990
			pkey=NULL;
			}

991
		xs->valid = 1;
992

993 994
		if (!check_cert_time(ctx, xs))
			goto end;
995 996

		/* The last error (if any) is still in the error value */
997
		ctx->current_issuer=xi;
998 999 1000 1001 1002 1003 1004 1005
		ctx->current_cert=xs;
		ok=(*cb)(1,ctx);
		if (!ok) goto end;

		n--;
		if (n >= 0)
			{
			xi=xs;
B
Ben Laurie 已提交
1006
			xs=sk_X509_value(ctx->chain,n);
1007 1008 1009 1010
			}
		}
	ok=1;
end:
1011
	return ok;
1012 1013
	}

1014
int X509_cmp_current_time(ASN1_TIME *ctm)
D
Dr. Stephen Henson 已提交
1015 1016 1017 1018 1019
{
	return X509_cmp_time(ctm, NULL);
}

int X509_cmp_time(ASN1_TIME *ctm, time_t *cmp_time)
1020 1021
	{
	char *str;
1022
	ASN1_TIME atm;
1023
	long offset;
1024 1025 1026 1027 1028 1029
	char buff1[24],buff2[24],*p;
	int i,j;

	p=buff1;
	i=ctm->length;
	str=(char *)ctm->data;
1030 1031
	if (ctm->type == V_ASN1_UTCTIME)
		{
1032
		if ((i < 11) || (i > 17)) return 0;
1033 1034 1035
		memcpy(p,str,10);
		p+=10;
		str+=10;
1036 1037 1038 1039
		}
	else
		{
		if (i < 13) return 0;
1040 1041 1042
		memcpy(p,str,12);
		p+=12;
		str+=12;
1043
		}
1044 1045 1046

	if ((*str == 'Z') || (*str == '-') || (*str == '+'))
		{ *(p++)='0'; *(p++)='0'; }
1047 1048 1049 1050 1051
	else
		{ 
		*(p++)= *(str++);
		*(p++)= *(str++);
		/* Skip any fractional seconds... */
1052
		if (*str == '.')
1053 1054
			{
			str++;
1055
			while ((*str >= '0') && (*str <= '9')) str++;
1056
			}
1057 1058
		
		}
1059 1060 1061 1062 1063 1064 1065 1066
	*(p++)='Z';
	*(p++)='\0';

	if (*str == 'Z')
		offset=0;
	else
		{
		if ((*str != '+') && (str[5] != '-'))
1067
			return 0;
1068 1069 1070
		offset=((str[1]-'0')*10+(str[2]-'0'))*60;
		offset+=(str[3]-'0')*10+(str[4]-'0');
		if (*str == '-')
1071
			offset= -offset;
1072
		}
1073
	atm.type=ctm->type;
1074 1075 1076
	atm.length=sizeof(buff2);
	atm.data=(unsigned char *)buff2;

1077 1078
	if (X509_time_adj(&atm,-offset*60, cmp_time) == NULL)
		return 0;
1079

1080
	if (ctm->type == V_ASN1_UTCTIME)
1081 1082 1083 1084 1085
		{
		i=(buff1[0]-'0')*10+(buff1[1]-'0');
		if (i < 50) i+=100; /* cf. RFC 2459 */
		j=(buff2[0]-'0')*10+(buff2[1]-'0');
		if (j < 50) j+=100;
1086

1087 1088
		if (i < j) return -1;
		if (i > j) return 1;
1089
		}
1090 1091
	i=strcmp(buff1,buff2);
	if (i == 0) /* wait a second then return younger :-) */
1092
		return -1;
1093
	else
1094
		return i;
1095 1096
	}

1097
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj)
D
Dr. Stephen Henson 已提交
1098 1099 1100 1101 1102
{
	return X509_time_adj(s, adj, NULL);
}

ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *in_tm)
1103 1104
	{
	time_t t;
1105
	int type = -1;
1106

1107
	if (in_tm) t = *in_tm;
D
Dr. Stephen Henson 已提交
1108 1109
	else time(&t);

1110
	t+=adj;
1111 1112 1113 1114
	if (s) type = s->type;
	if (type == V_ASN1_UTCTIME) return ASN1_UTCTIME_set(s,t);
	if (type == V_ASN1_GENERALIZEDTIME) return ASN1_GENERALIZEDTIME_set(s, t);
	return ASN1_TIME_set(s, t);
1115 1116
	}

B
Ben Laurie 已提交
1117
int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain)
1118 1119 1120 1121
	{
	EVP_PKEY *ktmp=NULL,*ktmp2;
	int i,j;

1122
	if ((pkey != NULL) && !EVP_PKEY_missing_parameters(pkey)) return 1;
1123

B
Ben Laurie 已提交
1124
	for (i=0; i<sk_X509_num(chain); i++)
1125
		{
B
Ben Laurie 已提交
1126
		ktmp=X509_get_pubkey(sk_X509_value(chain,i));
1127 1128 1129
		if (ktmp == NULL)
			{
			X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY);
1130
			return 0;
1131 1132 1133 1134 1135
			}
		if (!EVP_PKEY_missing_parameters(ktmp))
			break;
		else
			{
1136
			EVP_PKEY_free(ktmp);
1137 1138 1139 1140 1141 1142
			ktmp=NULL;
			}
		}
	if (ktmp == NULL)
		{
		X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN);
1143
		return 0;
1144 1145 1146 1147 1148
		}

	/* first, populate the other certs */
	for (j=i-1; j >= 0; j--)
		{
B
Ben Laurie 已提交
1149
		ktmp2=X509_get_pubkey(sk_X509_value(chain,j));
1150
		EVP_PKEY_copy_parameters(ktmp2,ktmp);
1151
		EVP_PKEY_free(ktmp2);
1152 1153
		}
	
1154 1155
	if (pkey != NULL) EVP_PKEY_copy_parameters(pkey,ktmp);
	EVP_PKEY_free(ktmp);
1156
	return 1;
1157 1158
	}

D
 
Dr. Stephen Henson 已提交
1159 1160
int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
B
Bodo Möller 已提交
1161 1162
	{
	/* This function is (usually) called only once, by
1163 1164 1165
	 * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c). */
	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, argl, argp,
			new_func, dup_func, free_func);
B
Bodo Möller 已提交
1166
	}
1167

U
Ulf Möller 已提交
1168
int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data)
1169
	{
1170
	return CRYPTO_set_ex_data(&ctx->ex_data,idx,data);
1171 1172
	}

U
Ulf Möller 已提交
1173
void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx)
1174
	{
1175
	return CRYPTO_get_ex_data(&ctx->ex_data,idx);
1176 1177
	}

U
Ulf Möller 已提交
1178
int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx)
1179
	{
1180
	return ctx->error;
1181 1182
	}

U
Ulf Möller 已提交
1183
void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err)
1184 1185 1186 1187
	{
	ctx->error=err;
	}

U
Ulf Möller 已提交
1188
int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx)
1189
	{
1190
	return ctx->error_depth;
1191 1192
	}

U
Ulf Möller 已提交
1193
X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx)
1194
	{
1195
	return ctx->current_cert;
1196 1197
	}

B
Ben Laurie 已提交
1198
STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx)
1199
	{
1200
	return ctx->chain;
1201 1202
	}

1203
STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx)
1204 1205 1206 1207
	{
	int i;
	X509 *x;
	STACK_OF(X509) *chain;
1208 1209
	if (!ctx->chain || !(chain = sk_X509_dup(ctx->chain))) return NULL;
	for (i = 0; i < sk_X509_num(chain); i++)
1210
		{
1211 1212
		x = sk_X509_value(chain, i);
		CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
1213
		}
1214
	return chain;
1215 1216
	}

U
Ulf Möller 已提交
1217
void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x)
1218 1219 1220 1221
	{
	ctx->cert=x;
	}

U
Ulf Möller 已提交
1222
void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
1223 1224 1225 1226
	{
	ctx->untrusted=sk;
	}

1227 1228 1229 1230 1231
void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk)
	{
	ctx->crls=sk;
	}

1232
int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose)
1233
	{
1234
	return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0);
1235 1236
	}

1237
int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust)
1238
	{
1239
	return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
1240 1241
	}

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
/* This function is used to set the X509_STORE_CTX purpose and trust
 * values. This is intended to be used when another structure has its
 * own trust and purpose values which (if set) will be inherited by
 * the ctx. If they aren't set then we will usually have a default
 * purpose in mind which should then be used to set the trust value.
 * An example of this is SSL use: an SSL structure will have its own
 * purpose and trust settings which the application can set: if they
 * aren't set then we use the default of SSL client/server.
 */

int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
				int purpose, int trust)
1254 1255
{
	int idx;
1256
	/* If purpose not set use default */
1257
	if (!purpose) purpose = def_purpose;
1258
	/* If we have a purpose then check it is valid */
1259 1260
	if (purpose)
		{
1261
		X509_PURPOSE *ptmp;
1262
		idx = X509_PURPOSE_get_by_id(purpose);
1263
		if (idx == -1)
1264
			{
1265 1266 1267
			X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
						X509_R_UNKNOWN_PURPOSE_ID);
			return 0;
1268
			}
1269
		ptmp = X509_PURPOSE_get0(idx);
1270
		if (ptmp->trust == X509_TRUST_DEFAULT)
1271
			{
1272
			idx = X509_PURPOSE_get_by_id(def_purpose);
1273
			if (idx == -1)
1274
				{
1275 1276 1277
				X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
						X509_R_UNKNOWN_PURPOSE_ID);
				return 0;
1278
				}
1279
			ptmp = X509_PURPOSE_get0(idx);
1280
			}
1281
		/* If trust not set then get from purpose default */
1282
		if (!trust) trust = ptmp->trust;
1283
		}
1284
	if (trust)
1285
		{
1286
		idx = X509_TRUST_get_by_id(trust);
1287
		if (idx == -1)
1288
			{
1289 1290 1291
			X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
						X509_R_UNKNOWN_TRUST_ID);
			return 0;
1292
			}
1293 1294
		}

1295 1296
	if (purpose && !ctx->param->purpose) ctx->param->purpose = purpose;
	if (trust && !ctx->param->trust) ctx->param->trust = trust;
1297 1298 1299
	return 1;
}

1300 1301 1302 1303
X509_STORE_CTX *X509_STORE_CTX_new(void)
{
	X509_STORE_CTX *ctx;
	ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX));
1304 1305 1306 1307 1308 1309
	if (!ctx)
		{
		X509err(X509_F_X509_STORE_CTX_NEW,ERR_R_MALLOC_FAILURE);
		return NULL;
		}
	memset(ctx, 0, sizeof(X509_STORE_CTX));
1310 1311 1312 1313 1314 1315 1316 1317 1318
	return ctx;
}

void X509_STORE_CTX_free(X509_STORE_CTX *ctx)
{
	X509_STORE_CTX_cleanup(ctx);
	OPENSSL_free(ctx);
}

1319
int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509,
1320 1321
	     STACK_OF(X509) *chain)
	{
1322
	int ret = 1;
1323 1324 1325 1326
	ctx->ctx=store;
	ctx->current_method=0;
	ctx->cert=x509;
	ctx->untrusted=chain;
1327
	ctx->crls = NULL;
1328
	ctx->last_untrusted=0;
1329
	ctx->other_ctx=NULL;
1330 1331 1332
	ctx->valid=0;
	ctx->chain=NULL;
	ctx->error=0;
1333
	ctx->explicit_policy=0;
1334
	ctx->error_depth=0;
1335 1336
	ctx->current_cert=NULL;
	ctx->current_issuer=NULL;
1337 1338 1339 1340 1341 1342 1343 1344 1345
	ctx->tree = NULL;

	ctx->param = X509_VERIFY_PARAM_new();

	if (!ctx->param)
		{
		X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
		return 0;
		}
1346 1347 1348 1349 1350 1351

	/* Inherit callbacks and flags from X509_STORE if not set
	 * use defaults.
	 */


1352 1353 1354 1355 1356
	if (store)
		ret = X509_VERIFY_PARAM_inherit(ctx->param, store->param);
	else
		ctx->param->flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE;

D
Dr. Stephen Henson 已提交
1357 1358
	if (store)
		{
1359
		ctx->verify_cb = store->verify_cb;
D
Dr. Stephen Henson 已提交
1360 1361 1362 1363
		ctx->cleanup = store->cleanup;
		}
	else
		ctx->cleanup = 0;
1364 1365 1366 1367 1368 1369 1370 1371 1372

	if (ret)
		ret = X509_VERIFY_PARAM_inherit(ctx->param,
					X509_VERIFY_PARAM_lookup("default"));

	if (ret == 0)
		{
		X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
		return 0;
D
Dr. Stephen Henson 已提交
1373 1374 1375
		}

	if (store && store->check_issued)
1376 1377 1378 1379
		ctx->check_issued = store->check_issued;
	else
		ctx->check_issued = check_issued;

D
Dr. Stephen Henson 已提交
1380
	if (store && store->get_issuer)
1381 1382 1383 1384
		ctx->get_issuer = store->get_issuer;
	else
		ctx->get_issuer = X509_STORE_CTX_get1_issuer;

D
Dr. Stephen Henson 已提交
1385
	if (store && store->verify_cb)
1386 1387 1388 1389
		ctx->verify_cb = store->verify_cb;
	else
		ctx->verify_cb = null_callback;

D
Dr. Stephen Henson 已提交
1390
	if (store && store->verify)
1391 1392 1393 1394
		ctx->verify = store->verify;
	else
		ctx->verify = internal_verify;

D
Dr. Stephen Henson 已提交
1395
	if (store && store->check_revocation)
1396 1397 1398 1399
		ctx->check_revocation = store->check_revocation;
	else
		ctx->check_revocation = check_revocation;

D
Dr. Stephen Henson 已提交
1400
	if (store && store->get_crl)
1401 1402 1403 1404
		ctx->get_crl = store->get_crl;
	else
		ctx->get_crl = get_crl;

D
Dr. Stephen Henson 已提交
1405
	if (store && store->check_crl)
1406 1407 1408 1409
		ctx->check_crl = store->check_crl;
	else
		ctx->check_crl = check_crl;

D
Dr. Stephen Henson 已提交
1410
	if (store && store->cert_crl)
1411 1412 1413 1414
		ctx->cert_crl = store->cert_crl;
	else
		ctx->cert_crl = cert_crl;

1415 1416
	ctx->check_policy = check_policy;

1417

1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
	/* This memset() can't make any sense anyway, so it's removed. As
	 * X509_STORE_CTX_cleanup does a proper "free" on the ex_data, we put a
	 * corresponding "new" here and remove this bogus initialisation. */
	/* memset(&(ctx->ex_data),0,sizeof(CRYPTO_EX_DATA)); */
	if(!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx,
				&(ctx->ex_data)))
		{
		OPENSSL_free(ctx);
		X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
		return 0;
		}
	return 1;
1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
	}

/* Set alternative lookup method: just a STACK of trusted certificates.
 * This avoids X509_STORE nastiness where it isn't needed.
 */

void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
{
	ctx->other_ctx = sk;
	ctx->get_issuer = get_issuer_sk;
}

void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx)
	{
1444
	if (ctx->cleanup) ctx->cleanup(ctx);
1445 1446 1447
	X509_VERIFY_PARAM_free(ctx->param);
	if (ctx->tree)
		X509_policy_tree_free(ctx->tree);
1448 1449 1450 1451 1452
	if (ctx->chain != NULL)
		{
		sk_X509_pop_free(ctx->chain,X509_free);
		ctx->chain=NULL;
		}
1453
	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx, &(ctx->ex_data));
1454
	memset(&ctx->ex_data,0,sizeof(CRYPTO_EX_DATA));
1455
	}
1456

1457
void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth)
D
Dr. Stephen Henson 已提交
1458
	{
1459
	X509_VERIFY_PARAM_set_depth(ctx->param, depth);
D
Dr. Stephen Henson 已提交
1460 1461
	}

1462
void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags)
D
Dr. Stephen Henson 已提交
1463
	{
1464 1465 1466 1467 1468 1469
	X509_VERIFY_PARAM_set_flags(ctx->param, flags);
	}

void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t)
	{
	X509_VERIFY_PARAM_set_time(ctx->param, t);
D
Dr. Stephen Henson 已提交
1470 1471
	}

L
Lutz Jänicke 已提交
1472 1473 1474 1475 1476 1477
void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
				  int (*verify_cb)(int, X509_STORE_CTX *))
	{
	ctx->verify_cb=verify_cb;
	}

1478 1479 1480 1481 1482 1483 1484
X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx)
	{
	return ctx->tree;
	}

int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx)
	{
1485
	return ctx->explicit_policy;
1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508
	}

int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name)
	{
	const X509_VERIFY_PARAM *param;
	param = X509_VERIFY_PARAM_lookup(name);
	if (!param)
		return 0;
	return X509_VERIFY_PARAM_inherit(ctx->param, param);
	}

X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx)
	{
	return ctx->param;
	}

void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param)
	{
	if (ctx->param)
		X509_VERIFY_PARAM_free(ctx->param);
	ctx->param = param;
	}

B
Ben Laurie 已提交
1509 1510
IMPLEMENT_STACK_OF(X509)
IMPLEMENT_ASN1_SET_OF(X509)
B
Ben Laurie 已提交
1511

B
Ben Laurie 已提交
1512
IMPLEMENT_STACK_OF(X509_NAME)
B
Ben Laurie 已提交
1513

1514
IMPLEMENT_STACK_OF(X509_ATTRIBUTE)
B
Ben Laurie 已提交
1515
IMPLEMENT_ASN1_SET_OF(X509_ATTRIBUTE)