xref: /freebsd/crypto/openssl/ssl/ssl_lib.c (revision 23f282aa31e9b6fceacd449020e936e98d6f2298)
1 /*! \file ssl/ssl_lib.c
2  *  \brief Version independent SSL functions.
3  */
4 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5  * All rights reserved.
6  *
7  * This package is an SSL implementation written
8  * by Eric Young (eay@cryptsoft.com).
9  * The implementation was written so as to conform with Netscapes SSL.
10  *
11  * This library is free for commercial and non-commercial use as long as
12  * the following conditions are aheared to.  The following conditions
13  * apply to all code found in this distribution, be it the RC4, RSA,
14  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
15  * included with this distribution is covered by the same copyright terms
16  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
17  *
18  * Copyright remains Eric Young's, and as such any Copyright notices in
19  * the code are not to be removed.
20  * If this package is used in a product, Eric Young should be given attribution
21  * as the author of the parts of the library used.
22  * This can be in the form of a textual message at program startup or
23  * in documentation (online or textual) provided with the package.
24  *
25  * Redistribution and use in source and binary forms, with or without
26  * modification, are permitted provided that the following conditions
27  * are met:
28  * 1. Redistributions of source code must retain the copyright
29  *    notice, this list of conditions and the following disclaimer.
30  * 2. Redistributions in binary form must reproduce the above copyright
31  *    notice, this list of conditions and the following disclaimer in the
32  *    documentation and/or other materials provided with the distribution.
33  * 3. All advertising materials mentioning features or use of this software
34  *    must display the following acknowledgement:
35  *    "This product includes cryptographic software written by
36  *     Eric Young (eay@cryptsoft.com)"
37  *    The word 'cryptographic' can be left out if the rouines from the library
38  *    being used are not cryptographic related :-).
39  * 4. If you include any Windows specific code (or a derivative thereof) from
40  *    the apps directory (application code) you must include an acknowledgement:
41  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
42  *
43  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
44  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
47  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53  * SUCH DAMAGE.
54  *
55  * The licence and distribution terms for any publically available version or
56  * derivative of this code cannot be changed.  i.e. this code cannot simply be
57  * copied and put under another distribution licence
58  * [including the GNU Public Licence.]
59  */
60 
61 #include <stdio.h>
62 #include <openssl/objects.h>
63 #include <openssl/lhash.h>
64 #include <openssl/x509v3.h>
65 #include "ssl_locl.h"
66 
67 const char *SSL_version_str=OPENSSL_VERSION_TEXT;
68 
69 static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_meth=NULL;
70 static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_ctx_meth=NULL;
71 static int ssl_meth_num=0;
72 static int ssl_ctx_meth_num=0;
73 
74 OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={
75 	/* evil casts, but these functions are only called if there's a library bug */
76 	(int (*)(SSL *,int))ssl_undefined_function,
77 	(int (*)(SSL *, unsigned char *, int))ssl_undefined_function,
78 	ssl_undefined_function,
79 	(int (*)(SSL *, unsigned char *, unsigned char *, int))ssl_undefined_function,
80 	(int (*)(SSL*, int))ssl_undefined_function,
81 	(int (*)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char*, int, unsigned char *))ssl_undefined_function
82 	};
83 
84 int SSL_clear(SSL *s)
85 	{
86 	int state;
87 
88 	if (s->method == NULL)
89 		{
90 		SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED);
91 		return(0);
92 		}
93 
94 	s->error=0;
95 	s->hit=0;
96 	s->shutdown=0;
97 
98 #if 0 /* Disabled since version 1.10 of this file (early return not
99        * needed because SSL_clear is not called when doing renegotiation) */
100 	/* This is set if we are doing dynamic renegotiation so keep
101 	 * the old cipher.  It is sort of a SSL_clear_lite :-) */
102 	if (s->new_session) return(1);
103 #else
104 	if (s->new_session)
105 		{
106 		SSLerr(SSL_F_SSL_CLEAR,SSL_R_INTERNAL_ERROR);
107 		return 0;
108 		}
109 #endif
110 
111 	state=s->state; /* Keep to check if we throw away the session-id */
112 	s->type=0;
113 
114 	s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
115 
116 	s->version=s->method->version;
117 	s->client_version=s->version;
118 	s->rwstate=SSL_NOTHING;
119 	s->rstate=SSL_ST_READ_HEADER;
120 	s->read_ahead=s->ctx->read_ahead;
121 
122 	if (s->init_buf != NULL)
123 		{
124 		BUF_MEM_free(s->init_buf);
125 		s->init_buf=NULL;
126 		}
127 
128 	ssl_clear_cipher_ctx(s);
129 
130 	if (ssl_clear_bad_session(s))
131 		{
132 		SSL_SESSION_free(s->session);
133 		s->session=NULL;
134 		}
135 
136 	s->first_packet=0;
137 
138 #if 1
139 	/* Check to see if we were changed into a different method, if
140 	 * so, revert back if we are not doing session-id reuse. */
141 	if ((s->session == NULL) && (s->method != s->ctx->method))
142 		{
143 		s->method->ssl_free(s);
144 		s->method=s->ctx->method;
145 		if (!s->method->ssl_new(s))
146 			return(0);
147 		}
148 	else
149 #endif
150 		s->method->ssl_clear(s);
151 	return(1);
152 	}
153 
154 /** Used to change an SSL_CTXs default SSL method type */
155 int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth)
156 	{
157 	STACK_OF(SSL_CIPHER) *sk;
158 
159 	ctx->method=meth;
160 
161 	sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
162 		&(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST);
163 	if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
164 		{
165 		SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
166 		return(0);
167 		}
168 	return(1);
169 	}
170 
171 SSL *SSL_new(SSL_CTX *ctx)
172 	{
173 	SSL *s;
174 
175 	if (ctx == NULL)
176 		{
177 		SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
178 		return(NULL);
179 		}
180 	if (ctx->method == NULL)
181 		{
182 		SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
183 		return(NULL);
184 		}
185 
186 	s=(SSL *)Malloc(sizeof(SSL));
187 	if (s == NULL) goto err;
188 	memset(s,0,sizeof(SSL));
189 
190 	if (ctx->cert != NULL)
191 		{
192 		/* Earlier library versions used to copy the pointer to
193 		 * the CERT, not its contents; only when setting new
194 		 * parameters for the per-SSL copy, ssl_cert_new would be
195 		 * called (and the direct reference to the per-SSL_CTX
196 		 * settings would be lost, but those still were indirectly
197 		 * accessed for various purposes, and for that reason they
198 		 * used to be known as s->ctx->default_cert).
199 		 * Now we don't look at the SSL_CTX's CERT after having
200 		 * duplicated it once. */
201 
202 		s->cert = ssl_cert_dup(ctx->cert);
203 		if (s->cert == NULL)
204 			goto err;
205 		}
206 	else
207 		s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
208 	s->sid_ctx_length=ctx->sid_ctx_length;
209 	memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
210 	s->verify_mode=ctx->verify_mode;
211 	s->verify_depth=ctx->verify_depth;
212 	s->verify_callback=ctx->default_verify_callback;
213 	s->purpose = ctx->purpose;
214 	s->trust = ctx->trust;
215 	CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
216 	s->ctx=ctx;
217 
218 	s->verify_result=X509_V_OK;
219 
220 	s->method=ctx->method;
221 
222 	if (!s->method->ssl_new(s))
223 		goto err;
224 
225 	s->quiet_shutdown=ctx->quiet_shutdown;
226 	s->references=1;
227 	s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
228 	s->options=ctx->options;
229 	s->mode=ctx->mode;
230 	SSL_clear(s);
231 
232 	CRYPTO_new_ex_data(ssl_meth,s,&s->ex_data);
233 
234 	return(s);
235 err:
236 	if (s != NULL)
237 		{
238 		if (s->cert != NULL)
239 			ssl_cert_free(s->cert);
240 		if (s->ctx != NULL)
241 			SSL_CTX_free(s->ctx); /* decrement reference count */
242 		Free(s);
243 		}
244 	SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
245 	return(NULL);
246 	}
247 
248 int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
249 				   unsigned int sid_ctx_len)
250     {
251     if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
252 	{
253 	SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
254 	return 0;
255 	}
256     ctx->sid_ctx_length=sid_ctx_len;
257     memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len);
258 
259     return 1;
260     }
261 
262 int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
263 			       unsigned int sid_ctx_len)
264     {
265     if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
266 	{
267 	SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
268 	return 0;
269 	}
270     ssl->sid_ctx_length=sid_ctx_len;
271     memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len);
272 
273     return 1;
274     }
275 
276 int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
277 {
278 	if(X509_PURPOSE_get_by_id(purpose) == -1) {
279 		SSLerr(SSL_F_SSL_CTX_SET_PURPOSE, SSL_R_INVALID_PURPOSE);
280 		return 0;
281 	}
282 	s->purpose = purpose;
283 	return 1;
284 }
285 
286 int SSL_set_purpose(SSL *s, int purpose)
287 {
288 	if(X509_PURPOSE_get_by_id(purpose) == -1) {
289 		SSLerr(SSL_F_SSL_SET_PURPOSE, SSL_R_INVALID_PURPOSE);
290 		return 0;
291 	}
292 	s->purpose = purpose;
293 	return 1;
294 }
295 
296 int SSL_CTX_set_trust(SSL_CTX *s, int trust)
297 {
298 	if(X509_TRUST_get_by_id(trust) == -1) {
299 		SSLerr(SSL_F_SSL_CTX_SET_TRUST, SSL_R_INVALID_TRUST);
300 		return 0;
301 	}
302 	s->trust = trust;
303 	return 1;
304 }
305 
306 int SSL_set_trust(SSL *s, int trust)
307 {
308 	if(X509_TRUST_get_by_id(trust) == -1) {
309 		SSLerr(SSL_F_SSL_SET_TRUST, SSL_R_INVALID_TRUST);
310 		return 0;
311 	}
312 	s->trust = trust;
313 	return 1;
314 }
315 
316 void SSL_free(SSL *s)
317 	{
318 	int i;
319 
320 	if(s == NULL)
321 	    return;
322 
323 	i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
324 #ifdef REF_PRINT
325 	REF_PRINT("SSL",s);
326 #endif
327 	if (i > 0) return;
328 #ifdef REF_CHECK
329 	if (i < 0)
330 		{
331 		fprintf(stderr,"SSL_free, bad reference count\n");
332 		abort(); /* ok */
333 		}
334 #endif
335 
336 	CRYPTO_free_ex_data(ssl_meth,(char *)s,&s->ex_data);
337 
338 	if (s->bbio != NULL)
339 		{
340 		/* If the buffering BIO is in place, pop it off */
341 		if (s->bbio == s->wbio)
342 			{
343 			s->wbio=BIO_pop(s->wbio);
344 			}
345 		BIO_free(s->bbio);
346 		s->bbio=NULL;
347 		}
348 	if (s->rbio != NULL)
349 		BIO_free_all(s->rbio);
350 	if ((s->wbio != NULL) && (s->wbio != s->rbio))
351 		BIO_free_all(s->wbio);
352 
353 	if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
354 
355 	/* add extra stuff */
356 	if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
357 	if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
358 
359 	/* Make the next call work :-) */
360 	if (s->session != NULL)
361 		{
362 		ssl_clear_bad_session(s);
363 		SSL_SESSION_free(s->session);
364 		}
365 
366 	ssl_clear_cipher_ctx(s);
367 
368 	if (s->cert != NULL) ssl_cert_free(s->cert);
369 	/* Free up if allocated */
370 
371 	if (s->ctx) SSL_CTX_free(s->ctx);
372 
373 	if (s->client_CA != NULL)
374 		sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
375 
376 	if (s->method != NULL) s->method->ssl_free(s);
377 
378 	Free(s);
379 	}
380 
381 void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
382 	{
383 	/* If the output buffering BIO is still in place, remove it
384 	 */
385 	if (s->bbio != NULL)
386 		{
387 		if (s->wbio == s->bbio)
388 			{
389 			s->wbio=s->wbio->next_bio;
390 			s->bbio->next_bio=NULL;
391 			}
392 		}
393 	if ((s->rbio != NULL) && (s->rbio != rbio))
394 		BIO_free_all(s->rbio);
395 	if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
396 		BIO_free_all(s->wbio);
397 	s->rbio=rbio;
398 	s->wbio=wbio;
399 	}
400 
401 BIO *SSL_get_rbio(SSL *s)
402 	{ return(s->rbio); }
403 
404 BIO *SSL_get_wbio(SSL *s)
405 	{ return(s->wbio); }
406 
407 int SSL_get_fd(SSL *s)
408 	{
409 	int ret= -1;
410 	BIO *b,*r;
411 
412 	b=SSL_get_rbio(s);
413 	r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
414 	if (r != NULL)
415 		BIO_get_fd(r,&ret);
416 	return(ret);
417 	}
418 
419 #ifndef NO_SOCK
420 int SSL_set_fd(SSL *s,int fd)
421 	{
422 	int ret=0;
423 	BIO *bio=NULL;
424 
425 	bio=BIO_new(BIO_s_socket());
426 
427 	if (bio == NULL)
428 		{
429 		SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
430 		goto err;
431 		}
432 	BIO_set_fd(bio,fd,BIO_NOCLOSE);
433 	SSL_set_bio(s,bio,bio);
434 	ret=1;
435 err:
436 	return(ret);
437 	}
438 
439 int SSL_set_wfd(SSL *s,int fd)
440 	{
441 	int ret=0;
442 	BIO *bio=NULL;
443 
444 	if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)
445 		|| ((int)BIO_get_fd(s->rbio,NULL) != fd))
446 		{
447 		bio=BIO_new(BIO_s_socket());
448 
449 		if (bio == NULL)
450 			{ SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }
451 		BIO_set_fd(bio,fd,BIO_NOCLOSE);
452 		SSL_set_bio(s,SSL_get_rbio(s),bio);
453 		}
454 	else
455 		SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));
456 	ret=1;
457 err:
458 	return(ret);
459 	}
460 
461 int SSL_set_rfd(SSL *s,int fd)
462 	{
463 	int ret=0;
464 	BIO *bio=NULL;
465 
466 	if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)
467 		|| ((int)BIO_get_fd(s->wbio,NULL) != fd))
468 		{
469 		bio=BIO_new(BIO_s_socket());
470 
471 		if (bio == NULL)
472 			{
473 			SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);
474 			goto err;
475 			}
476 		BIO_set_fd(bio,fd,BIO_NOCLOSE);
477 		SSL_set_bio(s,bio,SSL_get_wbio(s));
478 		}
479 	else
480 		SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));
481 	ret=1;
482 err:
483 	return(ret);
484 	}
485 #endif
486 
487 
488 /* return length of latest Finished message we sent, copy to 'buf' */
489 size_t SSL_get_finished(SSL *s, void *buf, size_t count)
490 	{
491 	size_t ret = 0;
492 
493 	if (s->s3 != NULL)
494 		{
495 		ret = s->s3->tmp.finish_md_len;
496 		if (count > ret)
497 			count = ret;
498 		memcpy(buf, s->s3->tmp.finish_md, count);
499 		}
500 	return ret;
501 	}
502 
503 /* return length of latest Finished message we expected, copy to 'buf' */
504 size_t SSL_get_peer_finished(SSL *s, void *buf, size_t count)
505 	{
506 	size_t ret = 0;
507 
508 	if (s->s3 != NULL)
509 		{
510 		ret = s->s3->tmp.peer_finish_md_len;
511 		if (count > ret)
512 			count = ret;
513 		memcpy(buf, s->s3->tmp.peer_finish_md, count);
514 		}
515 	return ret;
516 	}
517 
518 
519 int SSL_get_verify_mode(SSL *s)
520 	{
521 	return(s->verify_mode);
522 	}
523 
524 int SSL_get_verify_depth(SSL *s)
525 	{
526 	return(s->verify_depth);
527 	}
528 
529 int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *)
530 	{
531 	return(s->verify_callback);
532 	}
533 
534 int SSL_CTX_get_verify_mode(SSL_CTX *ctx)
535 	{
536 	return(ctx->verify_mode);
537 	}
538 
539 int SSL_CTX_get_verify_depth(SSL_CTX *ctx)
540 	{
541 	return(ctx->verify_depth);
542 	}
543 
544 int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *)
545 	{
546 	return(ctx->default_verify_callback);
547 	}
548 
549 void SSL_set_verify(SSL *s,int mode,
550 		    int (*callback)(int ok,X509_STORE_CTX *ctx))
551 	{
552 	s->verify_mode=mode;
553 	if (callback != NULL)
554 		s->verify_callback=callback;
555 	}
556 
557 void SSL_set_verify_depth(SSL *s,int depth)
558 	{
559 	s->verify_depth=depth;
560 	}
561 
562 void SSL_set_read_ahead(SSL *s,int yes)
563 	{
564 	s->read_ahead=yes;
565 	}
566 
567 int SSL_get_read_ahead(SSL *s)
568 	{
569 	return(s->read_ahead);
570 	}
571 
572 int SSL_pending(SSL *s)
573 	{
574 	return(s->method->ssl_pending(s));
575 	}
576 
577 X509 *SSL_get_peer_certificate(SSL *s)
578 	{
579 	X509 *r;
580 
581 	if ((s == NULL) || (s->session == NULL))
582 		r=NULL;
583 	else
584 		r=s->session->peer;
585 
586 	if (r == NULL) return(r);
587 
588 	CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);
589 
590 	return(r);
591 	}
592 
593 STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
594 	{
595 	STACK_OF(X509) *r;
596 
597 	if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
598 		r=NULL;
599 	else
600 		r=s->session->sess_cert->cert_chain;
601 
602 	/* If we are a client, cert_chain includes the peer's own
603 	 * certificate; if we are a server, it does not. */
604 
605 	return(r);
606 	}
607 
608 /* Now in theory, since the calling process own 't' it should be safe to
609  * modify.  We need to be able to read f without being hassled */
610 void SSL_copy_session_id(SSL *t,SSL *f)
611 	{
612 	CERT *tmp;
613 
614 	/* Do we need to to SSL locking? */
615 	SSL_set_session(t,SSL_get_session(f));
616 
617 	/* what if we are setup as SSLv2 but want to talk SSLv3 or
618 	 * vice-versa */
619 	if (t->method != f->method)
620 		{
621 		t->method->ssl_free(t);	/* cleanup current */
622 		t->method=f->method;	/* change method */
623 		t->method->ssl_new(t);	/* setup new */
624 		}
625 
626 	tmp=t->cert;
627 	if (f->cert != NULL)
628 		{
629 		CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);
630 		t->cert=f->cert;
631 		}
632 	else
633 		t->cert=NULL;
634 	if (tmp != NULL) ssl_cert_free(tmp);
635 	SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
636 	}
637 
638 /* Fix this so it checks all the valid key/cert options */
639 int SSL_CTX_check_private_key(SSL_CTX *ctx)
640 	{
641 	if (	(ctx == NULL) ||
642 		(ctx->cert == NULL) ||
643 		(ctx->cert->key->x509 == NULL))
644 		{
645 		SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
646 		return(0);
647 		}
648 	if 	(ctx->cert->key->privatekey == NULL)
649 		{
650 		SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
651 		return(0);
652 		}
653 	return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
654 	}
655 
656 /* Fix this function so that it takes an optional type parameter */
657 int SSL_check_private_key(SSL *ssl)
658 	{
659 	if (ssl == NULL)
660 		{
661 		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);
662 		return(0);
663 		}
664 	if (ssl->cert == NULL)
665 		{
666                 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
667 		return 0;
668 		}
669 	if (ssl->cert->key->x509 == NULL)
670 		{
671 		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
672 		return(0);
673 		}
674 	if (ssl->cert->key->privatekey == NULL)
675 		{
676 		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
677 		return(0);
678 		}
679 	return(X509_check_private_key(ssl->cert->key->x509,
680 		ssl->cert->key->privatekey));
681 	}
682 
683 int SSL_accept(SSL *s)
684 	{
685 	if (s->handshake_func == 0)
686 		/* Not properly initialized yet */
687 		SSL_set_accept_state(s);
688 
689 	return(s->method->ssl_accept(s));
690 	}
691 
692 int SSL_connect(SSL *s)
693 	{
694 	if (s->handshake_func == 0)
695 		/* Not properly initialized yet */
696 		SSL_set_connect_state(s);
697 
698 	return(s->method->ssl_connect(s));
699 	}
700 
701 long SSL_get_default_timeout(SSL *s)
702 	{
703 	return(s->method->get_timeout());
704 	}
705 
706 int SSL_read(SSL *s,char *buf,int num)
707 	{
708 	if (s->handshake_func == 0)
709 		{
710 		SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
711 		return -1;
712 		}
713 
714 	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
715 		{
716 		s->rwstate=SSL_NOTHING;
717 		return(0);
718 		}
719 	return(s->method->ssl_read(s,buf,num));
720 	}
721 
722 int SSL_peek(SSL *s,char *buf,int num)
723 	{
724 	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
725 		{
726 		return(0);
727 		}
728 	return(s->method->ssl_peek(s,buf,num));
729 	}
730 
731 int SSL_write(SSL *s,const char *buf,int num)
732 	{
733 	if (s->handshake_func == 0)
734 		{
735 		SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
736 		return -1;
737 		}
738 
739 	if (s->shutdown & SSL_SENT_SHUTDOWN)
740 		{
741 		s->rwstate=SSL_NOTHING;
742 		SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
743 		return(-1);
744 		}
745 	return(s->method->ssl_write(s,buf,num));
746 	}
747 
748 int SSL_shutdown(SSL *s)
749 	{
750 	/* Note that this function behaves differently from what one might
751 	 * expect.  Return values are 0 for no success (yet),
752 	 * 1 for success; but calling it once is usually not enough,
753 	 * even if blocking I/O is used (see ssl3_shutdown).
754 	 */
755 
756 	if (s->handshake_func == 0)
757 		{
758 		SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
759 		return -1;
760 		}
761 
762 	if ((s != NULL) && !SSL_in_init(s))
763 		return(s->method->ssl_shutdown(s));
764 	else
765 		return(1);
766 	}
767 
768 int SSL_renegotiate(SSL *s)
769 	{
770 	s->new_session=1;
771 	return(s->method->ssl_renegotiate(s));
772 	}
773 
774 long SSL_ctrl(SSL *s,int cmd,long larg,char *parg)
775 	{
776 	long l;
777 
778 	switch (cmd)
779 		{
780 	case SSL_CTRL_GET_READ_AHEAD:
781 		return(s->read_ahead);
782 	case SSL_CTRL_SET_READ_AHEAD:
783 		l=s->read_ahead;
784 		s->read_ahead=larg;
785 		return(l);
786 	case SSL_CTRL_OPTIONS:
787 		return(s->options|=larg);
788 	case SSL_CTRL_MODE:
789 		return(s->mode|=larg);
790 	default:
791 		return(s->method->ssl_ctrl(s,cmd,larg,parg));
792 		}
793 	}
794 
795 long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)())
796 	{
797 	switch(cmd)
798 		{
799 	default:
800 		return(s->method->ssl_callback_ctrl(s,cmd,fp));
801 		}
802 	}
803 
804 struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)
805 	{
806 	return ctx->sessions;
807 	}
808 
809 long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
810 	{
811 	long l;
812 
813 	switch (cmd)
814 		{
815 	case SSL_CTRL_GET_READ_AHEAD:
816 		return(ctx->read_ahead);
817 	case SSL_CTRL_SET_READ_AHEAD:
818 		l=ctx->read_ahead;
819 		ctx->read_ahead=larg;
820 		return(l);
821 
822 	case SSL_CTRL_SET_SESS_CACHE_SIZE:
823 		l=ctx->session_cache_size;
824 		ctx->session_cache_size=larg;
825 		return(l);
826 	case SSL_CTRL_GET_SESS_CACHE_SIZE:
827 		return(ctx->session_cache_size);
828 	case SSL_CTRL_SET_SESS_CACHE_MODE:
829 		l=ctx->session_cache_mode;
830 		ctx->session_cache_mode=larg;
831 		return(l);
832 	case SSL_CTRL_GET_SESS_CACHE_MODE:
833 		return(ctx->session_cache_mode);
834 
835 	case SSL_CTRL_SESS_NUMBER:
836 		return(ctx->sessions->num_items);
837 	case SSL_CTRL_SESS_CONNECT:
838 		return(ctx->stats.sess_connect);
839 	case SSL_CTRL_SESS_CONNECT_GOOD:
840 		return(ctx->stats.sess_connect_good);
841 	case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:
842 		return(ctx->stats.sess_connect_renegotiate);
843 	case SSL_CTRL_SESS_ACCEPT:
844 		return(ctx->stats.sess_accept);
845 	case SSL_CTRL_SESS_ACCEPT_GOOD:
846 		return(ctx->stats.sess_accept_good);
847 	case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:
848 		return(ctx->stats.sess_accept_renegotiate);
849 	case SSL_CTRL_SESS_HIT:
850 		return(ctx->stats.sess_hit);
851 	case SSL_CTRL_SESS_CB_HIT:
852 		return(ctx->stats.sess_cb_hit);
853 	case SSL_CTRL_SESS_MISSES:
854 		return(ctx->stats.sess_miss);
855 	case SSL_CTRL_SESS_TIMEOUTS:
856 		return(ctx->stats.sess_timeout);
857 	case SSL_CTRL_SESS_CACHE_FULL:
858 		return(ctx->stats.sess_cache_full);
859 	case SSL_CTRL_OPTIONS:
860 		return(ctx->options|=larg);
861 	case SSL_CTRL_MODE:
862 		return(ctx->mode|=larg);
863 	default:
864 		return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg));
865 		}
866 	}
867 
868 long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
869 	{
870 	switch(cmd)
871 		{
872 	default:
873 		return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
874 		}
875 	}
876 
877 int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b)
878 	{
879 	long l;
880 
881 	l=a->id-b->id;
882 	if (l == 0L)
883 		return(0);
884 	else
885 		return((l > 0)?1:-1);
886 	}
887 
888 int ssl_cipher_ptr_id_cmp(SSL_CIPHER **ap,SSL_CIPHER **bp)
889 	{
890 	long l;
891 
892 	l=(*ap)->id-(*bp)->id;
893 	if (l == 0L)
894 		return(0);
895 	else
896 		return((l > 0)?1:-1);
897 	}
898 
899 /** return a STACK of the ciphers available for the SSL and in order of
900  * preference */
901 STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s)
902 	{
903 	if ((s != NULL) && (s->cipher_list != NULL))
904 		{
905 		return(s->cipher_list);
906 		}
907 	else if ((s->ctx != NULL) &&
908 		(s->ctx->cipher_list != NULL))
909 		{
910 		return(s->ctx->cipher_list);
911 		}
912 	return(NULL);
913 	}
914 
915 /** return a STACK of the ciphers available for the SSL and in order of
916  * algorithm id */
917 STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
918 	{
919 	if ((s != NULL) && (s->cipher_list_by_id != NULL))
920 		{
921 		return(s->cipher_list_by_id);
922 		}
923 	else if ((s != NULL) && (s->ctx != NULL) &&
924 		(s->ctx->cipher_list_by_id != NULL))
925 		{
926 		return(s->ctx->cipher_list_by_id);
927 		}
928 	return(NULL);
929 	}
930 
931 /** The old interface to get the same thing as SSL_get_ciphers() */
932 const char *SSL_get_cipher_list(SSL *s,int n)
933 	{
934 	SSL_CIPHER *c;
935 	STACK_OF(SSL_CIPHER) *sk;
936 
937 	if (s == NULL) return(NULL);
938 	sk=SSL_get_ciphers(s);
939 	if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
940 		return(NULL);
941 	c=sk_SSL_CIPHER_value(sk,n);
942 	if (c == NULL) return(NULL);
943 	return(c->name);
944 	}
945 
946 /** specify the ciphers to be used by default by the SSL_CTX */
947 int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)
948 	{
949 	STACK_OF(SSL_CIPHER) *sk;
950 
951 	sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
952 		&ctx->cipher_list_by_id,str);
953 /* XXXX */
954 	return((sk == NULL)?0:1);
955 	}
956 
957 /** specify the ciphers to be used by the SSL */
958 int SSL_set_cipher_list(SSL *s,const char *str)
959 	{
960 	STACK_OF(SSL_CIPHER) *sk;
961 
962 	sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
963 		&s->cipher_list_by_id,str);
964 /* XXXX */
965 	return((sk == NULL)?0:1);
966 	}
967 
968 /* works well for SSLv2, not so good for SSLv3 */
969 char *SSL_get_shared_ciphers(SSL *s,char *buf,int len)
970 	{
971 	char *p;
972 	const char *cp;
973 	STACK_OF(SSL_CIPHER) *sk;
974 	SSL_CIPHER *c;
975 	int i;
976 
977 	if ((s->session == NULL) || (s->session->ciphers == NULL) ||
978 		(len < 2))
979 		return(NULL);
980 
981 	p=buf;
982 	sk=s->session->ciphers;
983 	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
984 		{
985 		/* Decrement for either the ':' or a '\0' */
986 		len--;
987 		c=sk_SSL_CIPHER_value(sk,i);
988 		for (cp=c->name; *cp; )
989 			{
990 			if (len-- == 0)
991 				{
992 				*p='\0';
993 				return(buf);
994 				}
995 			else
996 				*(p++)= *(cp++);
997 			}
998 		*(p++)=':';
999 		}
1000 	p[-1]='\0';
1001 	return(buf);
1002 	}
1003 
1004 int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p)
1005 	{
1006 	int i,j=0;
1007 	SSL_CIPHER *c;
1008 	unsigned char *q;
1009 
1010 	if (sk == NULL) return(0);
1011 	q=p;
1012 
1013 	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1014 		{
1015 		c=sk_SSL_CIPHER_value(sk,i);
1016 		j=ssl_put_cipher_by_char(s,c,p);
1017 		p+=j;
1018 		}
1019 	return(p-q);
1020 	}
1021 
1022 STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
1023 					       STACK_OF(SSL_CIPHER) **skp)
1024 	{
1025 	SSL_CIPHER *c;
1026 	STACK_OF(SSL_CIPHER) *sk;
1027 	int i,n;
1028 
1029 	n=ssl_put_cipher_by_char(s,NULL,NULL);
1030 	if ((num%n) != 0)
1031 		{
1032 		SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
1033 		return(NULL);
1034 		}
1035 	if ((skp == NULL) || (*skp == NULL))
1036 		sk=sk_SSL_CIPHER_new(NULL); /* change perhaps later */
1037 	else
1038 		{
1039 		sk= *skp;
1040 		sk_SSL_CIPHER_zero(sk);
1041 		}
1042 
1043 	for (i=0; i<num; i+=n)
1044 		{
1045 		c=ssl_get_cipher_by_char(s,p);
1046 		p+=n;
1047 		if (c != NULL)
1048 			{
1049 			if (!sk_SSL_CIPHER_push(sk,c))
1050 				{
1051 				SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1052 				goto err;
1053 				}
1054 			}
1055 		}
1056 
1057 	if (skp != NULL)
1058 		*skp=sk;
1059 	return(sk);
1060 err:
1061 	if ((skp == NULL) || (*skp == NULL))
1062 		sk_SSL_CIPHER_free(sk);
1063 	return(NULL);
1064 	}
1065 
1066 unsigned long SSL_SESSION_hash(SSL_SESSION *a)
1067 	{
1068 	unsigned long l;
1069 
1070 	l=(unsigned long)
1071 		((unsigned int) a->session_id[0]     )|
1072 		((unsigned int) a->session_id[1]<< 8L)|
1073 		((unsigned long)a->session_id[2]<<16L)|
1074 		((unsigned long)a->session_id[3]<<24L);
1075 	return(l);
1076 	}
1077 
1078 int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b)
1079 	{
1080 	if (a->ssl_version != b->ssl_version)
1081 		return(1);
1082 	if (a->session_id_length != b->session_id_length)
1083 		return(1);
1084 	return(memcmp(a->session_id,b->session_id,a->session_id_length));
1085 	}
1086 
1087 SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)
1088 	{
1089 	SSL_CTX *ret=NULL;
1090 
1091 	if (meth == NULL)
1092 		{
1093 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1094 		return(NULL);
1095 		}
1096 
1097 	if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1098 		{
1099 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1100 		goto err;
1101 		}
1102 	ret=(SSL_CTX *)Malloc(sizeof(SSL_CTX));
1103 	if (ret == NULL)
1104 		goto err;
1105 
1106 	memset(ret,0,sizeof(SSL_CTX));
1107 
1108 	ret->method=meth;
1109 
1110 	ret->cert_store=NULL;
1111 	ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
1112 	ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1113 	ret->session_cache_head=NULL;
1114 	ret->session_cache_tail=NULL;
1115 
1116 	/* We take the system default */
1117 	ret->session_timeout=meth->get_timeout();
1118 
1119 	ret->new_session_cb=NULL;
1120 	ret->remove_session_cb=NULL;
1121 	ret->get_session_cb=NULL;
1122 
1123 	memset((char *)&ret->stats,0,sizeof(ret->stats));
1124 
1125 	ret->references=1;
1126 	ret->quiet_shutdown=0;
1127 
1128 /*	ret->cipher=NULL;*/
1129 /*	ret->s2->challenge=NULL;
1130 	ret->master_key=NULL;
1131 	ret->key_arg=NULL;
1132 	ret->s2->conn_id=NULL; */
1133 
1134 	ret->info_callback=NULL;
1135 
1136 	ret->app_verify_callback=NULL;
1137 	ret->app_verify_arg=NULL;
1138 
1139 	ret->read_ahead=0;
1140 	ret->verify_mode=SSL_VERIFY_NONE;
1141 	ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
1142 	ret->default_verify_callback=NULL;
1143 	if ((ret->cert=ssl_cert_new()) == NULL)
1144 		goto err;
1145 
1146 	ret->default_passwd_callback=NULL;
1147 	ret->default_passwd_callback_userdata=NULL;
1148 	ret->client_cert_cb=NULL;
1149 
1150 	ret->sessions=lh_new(SSL_SESSION_hash,SSL_SESSION_cmp);
1151 	if (ret->sessions == NULL) goto err;
1152 	ret->cert_store=X509_STORE_new();
1153 	if (ret->cert_store == NULL) goto err;
1154 
1155 	ssl_create_cipher_list(ret->method,
1156 		&ret->cipher_list,&ret->cipher_list_by_id,
1157 		SSL_DEFAULT_CIPHER_LIST);
1158 	if (ret->cipher_list == NULL
1159 	    || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
1160 		{
1161 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
1162 		goto err2;
1163 		}
1164 
1165 	if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
1166 		{
1167 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
1168 		goto err2;
1169 		}
1170 	if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
1171 		{
1172 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
1173 		goto err2;
1174 		}
1175 	if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
1176 		{
1177 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
1178 		goto err2;
1179 		}
1180 
1181 	if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
1182 		goto err;
1183 
1184 	CRYPTO_new_ex_data(ssl_ctx_meth,(char *)ret,&ret->ex_data);
1185 
1186 	ret->extra_certs=NULL;
1187 	ret->comp_methods=SSL_COMP_get_compression_methods();
1188 
1189 	return(ret);
1190 err:
1191 	SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
1192 err2:
1193 	if (ret != NULL) SSL_CTX_free(ret);
1194 	return(NULL);
1195 	}
1196 
1197 static void SSL_COMP_free(SSL_COMP *comp)
1198     { Free(comp); }
1199 
1200 void SSL_CTX_free(SSL_CTX *a)
1201 	{
1202 	int i;
1203 
1204 	if (a == NULL) return;
1205 
1206 	i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
1207 #ifdef REF_PRINT
1208 	REF_PRINT("SSL_CTX",a);
1209 #endif
1210 	if (i > 0) return;
1211 #ifdef REF_CHECK
1212 	if (i < 0)
1213 		{
1214 		fprintf(stderr,"SSL_CTX_free, bad reference count\n");
1215 		abort(); /* ok */
1216 		}
1217 #endif
1218 	CRYPTO_free_ex_data(ssl_ctx_meth,(char *)a,&a->ex_data);
1219 
1220 	if (a->sessions != NULL)
1221 		{
1222 		SSL_CTX_flush_sessions(a,0);
1223 		lh_free(a->sessions);
1224 		}
1225 	if (a->cert_store != NULL)
1226 		X509_STORE_free(a->cert_store);
1227 	if (a->cipher_list != NULL)
1228 		sk_SSL_CIPHER_free(a->cipher_list);
1229 	if (a->cipher_list_by_id != NULL)
1230 		sk_SSL_CIPHER_free(a->cipher_list_by_id);
1231 	if (a->cert != NULL)
1232 		ssl_cert_free(a->cert);
1233 	if (a->client_CA != NULL)
1234 		sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
1235 	if (a->extra_certs != NULL)
1236 		sk_X509_pop_free(a->extra_certs,X509_free);
1237 	if (a->comp_methods != NULL)
1238 		sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
1239 	Free(a);
1240 	}
1241 
1242 void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
1243 	{
1244 	ctx->default_passwd_callback=cb;
1245 	}
1246 
1247 void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1248 	{
1249 	ctx->default_passwd_callback_userdata=u;
1250 	}
1251 
1252 void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,int (*cb)(),char *arg)
1253 	{
1254 	/* now
1255 	 *     int (*cb)(X509_STORE_CTX *),
1256 	 * but should be
1257 	 *     int (*cb)(X509_STORE_CTX *, void *arg)
1258 	 */
1259 	ctx->app_verify_callback=cb;
1260 	ctx->app_verify_arg=arg; /* never used */
1261 	}
1262 
1263 void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
1264 	{
1265 	ctx->verify_mode=mode;
1266 	ctx->default_verify_callback=cb;
1267 	/* This needs cleaning up EAY EAY EAY */
1268 	X509_STORE_set_verify_cb_func(ctx->cert_store,cb);
1269 	}
1270 
1271 void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1272 	{
1273 	ctx->verify_depth=depth;
1274 	}
1275 
1276 void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
1277 	{
1278 	CERT_PKEY *cpk;
1279 	int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1280 	int rsa_enc_export,dh_rsa_export,dh_dsa_export;
1281 	int rsa_tmp_export,dh_tmp_export,kl;
1282 	unsigned long mask,emask;
1283 
1284 	if (c == NULL) return;
1285 
1286 	kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1287 
1288 #ifndef NO_RSA
1289 	rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1290 	rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
1291 		(rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
1292 #else
1293 	rsa_tmp=rsa_tmp_export=0;
1294 #endif
1295 #ifndef NO_DH
1296 	dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1297 	dh_tmp_export=(c->dh_tmp_cb != NULL ||
1298 		(dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
1299 #else
1300 	dh_tmp=dh_tmp_export=0;
1301 #endif
1302 
1303 	cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
1304 	rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1305 	rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1306 	cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
1307 	rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1308 	cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
1309 	dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1310 	cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
1311 	dh_rsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1312 	dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1313 	cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1314 /* FIX THIS EAY EAY EAY */
1315 	dh_dsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1316 	dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1317 
1318 	mask=0;
1319 	emask=0;
1320 
1321 #ifdef CIPHER_DEBUG
1322 	printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1323 		rsa_tmp,rsa_tmp_export,dh_tmp,
1324 		rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
1325 #endif
1326 
1327 	if (rsa_enc || (rsa_tmp && rsa_sign))
1328 		mask|=SSL_kRSA;
1329 	if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
1330 		emask|=SSL_kRSA;
1331 
1332 #if 0
1333 	/* The match needs to be both kEDH and aRSA or aDSA, so don't worry */
1334 	if (	(dh_tmp || dh_rsa || dh_dsa) &&
1335 		(rsa_enc || rsa_sign || dsa_sign))
1336 		mask|=SSL_kEDH;
1337 	if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
1338 		(rsa_enc || rsa_sign || dsa_sign))
1339 		emask|=SSL_kEDH;
1340 #endif
1341 
1342 	if (dh_tmp_export)
1343 		emask|=SSL_kEDH;
1344 
1345 	if (dh_tmp)
1346 		mask|=SSL_kEDH;
1347 
1348 	if (dh_rsa) mask|=SSL_kDHr;
1349 	if (dh_rsa_export) emask|=SSL_kDHr;
1350 
1351 	if (dh_dsa) mask|=SSL_kDHd;
1352 	if (dh_dsa_export) emask|=SSL_kDHd;
1353 
1354 	if (rsa_enc || rsa_sign)
1355 		{
1356 		mask|=SSL_aRSA;
1357 		emask|=SSL_aRSA;
1358 		}
1359 
1360 	if (dsa_sign)
1361 		{
1362 		mask|=SSL_aDSS;
1363 		emask|=SSL_aDSS;
1364 		}
1365 
1366 	mask|=SSL_aNULL;
1367 	emask|=SSL_aNULL;
1368 
1369 	c->mask=mask;
1370 	c->export_mask=emask;
1371 	c->valid=1;
1372 	}
1373 
1374 /* THIS NEEDS CLEANING UP */
1375 X509 *ssl_get_server_send_cert(SSL *s)
1376 	{
1377 	unsigned long alg,mask,kalg;
1378 	CERT *c;
1379 	int i,is_export;
1380 
1381 	c=s->cert;
1382 	ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
1383 	alg=s->s3->tmp.new_cipher->algorithms;
1384 	is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
1385 	mask=is_export?c->export_mask:c->mask;
1386 	kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1387 
1388 	if 	(kalg & SSL_kDHr)
1389 		i=SSL_PKEY_DH_RSA;
1390 	else if (kalg & SSL_kDHd)
1391 		i=SSL_PKEY_DH_DSA;
1392 	else if (kalg & SSL_aDSS)
1393 		i=SSL_PKEY_DSA_SIGN;
1394 	else if (kalg & SSL_aRSA)
1395 		{
1396 		if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL)
1397 			i=SSL_PKEY_RSA_SIGN;
1398 		else
1399 			i=SSL_PKEY_RSA_ENC;
1400 		}
1401 	else /* if (kalg & SSL_aNULL) */
1402 		{
1403 		SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,SSL_R_INTERNAL_ERROR);
1404 		return(NULL);
1405 		}
1406 	if (c->pkeys[i].x509 == NULL) return(NULL);
1407 	return(c->pkeys[i].x509);
1408 	}
1409 
1410 EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
1411 	{
1412 	unsigned long alg;
1413 	CERT *c;
1414 
1415 	alg=cipher->algorithms;
1416 	c=s->cert;
1417 
1418 	if ((alg & SSL_aDSS) &&
1419 		(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
1420 		return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey);
1421 	else if (alg & SSL_aRSA)
1422 		{
1423 		if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
1424 			return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey);
1425 		else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
1426 			return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey);
1427 		else
1428 			return(NULL);
1429 		}
1430 	else /* if (alg & SSL_aNULL) */
1431 		{
1432 		SSLerr(SSL_F_SSL_GET_SIGN_PKEY,SSL_R_INTERNAL_ERROR);
1433 		return(NULL);
1434 		}
1435 	}
1436 
1437 void ssl_update_cache(SSL *s,int mode)
1438 	{
1439 	int i;
1440 
1441 	/* If the session_id_length is 0, we are not supposed to cache it,
1442 	 * and it would be rather hard to do anyway :-) */
1443 	if (s->session->session_id_length == 0) return;
1444 
1445 	if ((s->ctx->session_cache_mode & mode)
1446 		&& (!s->hit)
1447 		&& SSL_CTX_add_session(s->ctx,s->session)
1448 		&& (s->ctx->new_session_cb != NULL))
1449 		{
1450 		CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
1451 		if (!s->ctx->new_session_cb(s,s->session))
1452 			SSL_SESSION_free(s->session);
1453 		}
1454 
1455 	/* auto flush every 255 connections */
1456 	i=s->ctx->session_cache_mode;
1457 	if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1458 		((i & mode) == mode))
1459 		{
1460 		if (  (((mode & SSL_SESS_CACHE_CLIENT)
1461 			?s->ctx->stats.sess_connect_good
1462 			:s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
1463 			{
1464 			SSL_CTX_flush_sessions(s->ctx,time(NULL));
1465 			}
1466 		}
1467 	}
1468 
1469 SSL_METHOD *SSL_get_ssl_method(SSL *s)
1470 	{
1471 	return(s->method);
1472 	}
1473 
1474 int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
1475 	{
1476 	int conn= -1;
1477 	int ret=1;
1478 
1479 	if (s->method != meth)
1480 		{
1481 		if (s->handshake_func != NULL)
1482 			conn=(s->handshake_func == s->method->ssl_connect);
1483 
1484 		if (s->method->version == meth->version)
1485 			s->method=meth;
1486 		else
1487 			{
1488 			s->method->ssl_free(s);
1489 			s->method=meth;
1490 			ret=s->method->ssl_new(s);
1491 			}
1492 
1493 		if (conn == 1)
1494 			s->handshake_func=meth->ssl_connect;
1495 		else if (conn == 0)
1496 			s->handshake_func=meth->ssl_accept;
1497 		}
1498 	return(ret);
1499 	}
1500 
1501 int SSL_get_error(SSL *s,int i)
1502 	{
1503 	int reason;
1504 	unsigned long l;
1505 	BIO *bio;
1506 
1507 	if (i > 0) return(SSL_ERROR_NONE);
1508 
1509 	/* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
1510 	 * etc, where we do encode the error */
1511 	if ((l=ERR_peek_error()) != 0)
1512 		{
1513 		if (ERR_GET_LIB(l) == ERR_LIB_SYS)
1514 			return(SSL_ERROR_SYSCALL);
1515 		else
1516 			return(SSL_ERROR_SSL);
1517 		}
1518 
1519 	if ((i < 0) && SSL_want_read(s))
1520 		{
1521 		bio=SSL_get_rbio(s);
1522 		if (BIO_should_read(bio))
1523 			return(SSL_ERROR_WANT_READ);
1524 		else if (BIO_should_write(bio))
1525 			/* This one doesn't make too much sense ... We never try
1526 			 * to write to the rbio, and an application program where
1527 			 * rbio and wbio are separate couldn't even know what it
1528 			 * should wait for.
1529 			 * However if we ever set s->rwstate incorrectly
1530 			 * (so that we have SSL_want_read(s) instead of
1531 			 * SSL_want_write(s)) and rbio and wbio *are* the same,
1532 			 * this test works around that bug; so it might be safer
1533 			 * to keep it. */
1534 			return(SSL_ERROR_WANT_WRITE);
1535 		else if (BIO_should_io_special(bio))
1536 			{
1537 			reason=BIO_get_retry_reason(bio);
1538 			if (reason == BIO_RR_CONNECT)
1539 				return(SSL_ERROR_WANT_CONNECT);
1540 			else
1541 				return(SSL_ERROR_SYSCALL); /* unknown */
1542 			}
1543 		}
1544 
1545 	if ((i < 0) && SSL_want_write(s))
1546 		{
1547 		bio=SSL_get_wbio(s);
1548 		if (BIO_should_write(bio))
1549 			return(SSL_ERROR_WANT_WRITE);
1550 		else if (BIO_should_read(bio))
1551 			/* See above (SSL_want_read(s) with BIO_should_write(bio)) */
1552 			return(SSL_ERROR_WANT_READ);
1553 		else if (BIO_should_io_special(bio))
1554 			{
1555 			reason=BIO_get_retry_reason(bio);
1556 			if (reason == BIO_RR_CONNECT)
1557 				return(SSL_ERROR_WANT_CONNECT);
1558 			else
1559 				return(SSL_ERROR_SYSCALL);
1560 			}
1561 		}
1562 	if ((i < 0) && SSL_want_x509_lookup(s))
1563 		{
1564 		return(SSL_ERROR_WANT_X509_LOOKUP);
1565 		}
1566 
1567 	if (i == 0)
1568 		{
1569 		if (s->version == SSL2_VERSION)
1570 			{
1571 			/* assume it is the socket being closed */
1572 			return(SSL_ERROR_ZERO_RETURN);
1573 			}
1574 		else
1575 			{
1576 			if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
1577 				(s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
1578 				return(SSL_ERROR_ZERO_RETURN);
1579 			}
1580 		}
1581 	return(SSL_ERROR_SYSCALL);
1582 	}
1583 
1584 int SSL_do_handshake(SSL *s)
1585 	{
1586 	int ret=1;
1587 
1588 	if (s->handshake_func == NULL)
1589 		{
1590 		SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
1591 		return(-1);
1592 		}
1593 
1594 	s->method->ssl_renegotiate_check(s);
1595 
1596 	if (SSL_in_init(s) || SSL_in_before(s))
1597 		{
1598 		ret=s->handshake_func(s);
1599 		}
1600 	return(ret);
1601 	}
1602 
1603 /* For the next 2 functions, SSL_clear() sets shutdown and so
1604  * one of these calls will reset it */
1605 void SSL_set_accept_state(SSL *s)
1606 	{
1607 	s->server=1;
1608 	s->shutdown=0;
1609 	s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
1610 	s->handshake_func=s->method->ssl_accept;
1611 	/* clear the current cipher */
1612 	ssl_clear_cipher_ctx(s);
1613 	}
1614 
1615 void SSL_set_connect_state(SSL *s)
1616 	{
1617 	s->server=0;
1618 	s->shutdown=0;
1619 	s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
1620 	s->handshake_func=s->method->ssl_connect;
1621 	/* clear the current cipher */
1622 	ssl_clear_cipher_ctx(s);
1623 	}
1624 
1625 int ssl_undefined_function(SSL *s)
1626 	{
1627 	SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1628 	return(0);
1629 	}
1630 
1631 SSL_METHOD *ssl_bad_method(int ver)
1632 	{
1633 	SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1634 	return(NULL);
1635 	}
1636 
1637 const char *SSL_get_version(SSL *s)
1638 	{
1639 	if (s->version == TLS1_VERSION)
1640 		return("TLSv1");
1641 	else if (s->version == SSL3_VERSION)
1642 		return("SSLv3");
1643 	else if (s->version == SSL2_VERSION)
1644 		return("SSLv2");
1645 	else
1646 		return("unknown");
1647 	}
1648 
1649 SSL *SSL_dup(SSL *s)
1650 	{
1651 	STACK_OF(X509_NAME) *sk;
1652 	X509_NAME *xn;
1653 	SSL *ret;
1654 	int i;
1655 
1656 	if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
1657 	    return(NULL);
1658 
1659 	if (s->session != NULL)
1660 		{
1661 		/* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
1662 		SSL_copy_session_id(ret,s);
1663 		}
1664 	else
1665 		{
1666 		/* No session has been established yet, so we have to expect
1667 		 * that s->cert or ret->cert will be changed later --
1668 		 * they should not both point to the same object,
1669 		 * and thus we can't use SSL_copy_session_id. */
1670 
1671 		ret->method = s->method;
1672 		ret->method->ssl_new(ret);
1673 
1674 		if (s->cert != NULL)
1675 			{
1676 			ret->cert = ssl_cert_dup(s->cert);
1677 			if (ret->cert == NULL)
1678 				goto err;
1679 			}
1680 
1681 		SSL_set_session_id_context(ret,
1682 			s->sid_ctx, s->sid_ctx_length);
1683 		}
1684 
1685 	SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
1686 	SSL_set_verify(ret,SSL_get_verify_mode(s),
1687 		SSL_get_verify_callback(s));
1688 	SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
1689 
1690 	SSL_set_info_callback(ret,SSL_get_info_callback(s));
1691 
1692 	ret->debug=s->debug;
1693 	ret->options=s->options;
1694 
1695 	/* copy app data, a little dangerous perhaps */
1696 	if (!CRYPTO_dup_ex_data(ssl_meth,&ret->ex_data,&s->ex_data))
1697 		goto err;
1698 
1699 	/* setup rbio, and wbio */
1700 	if (s->rbio != NULL)
1701 		{
1702 		if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
1703 			goto err;
1704 		}
1705 	if (s->wbio != NULL)
1706 		{
1707 		if (s->wbio != s->rbio)
1708 			{
1709 			if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
1710 				goto err;
1711 			}
1712 		else
1713 			ret->wbio=ret->rbio;
1714 		}
1715 
1716 	/* dup the cipher_list and cipher_list_by_id stacks */
1717 	if (s->cipher_list != NULL)
1718 		{
1719 		if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
1720 			goto err;
1721 		}
1722 	if (s->cipher_list_by_id != NULL)
1723 		if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
1724 			== NULL)
1725 			goto err;
1726 
1727 	/* Dup the client_CA list */
1728 	if (s->client_CA != NULL)
1729 		{
1730 		if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
1731 		ret->client_CA=sk;
1732 		for (i=0; i<sk_X509_NAME_num(sk); i++)
1733 			{
1734 			xn=sk_X509_NAME_value(sk,i);
1735 			if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
1736 				{
1737 				X509_NAME_free(xn);
1738 				goto err;
1739 				}
1740 			}
1741 		}
1742 
1743 	ret->shutdown=s->shutdown;
1744 	ret->state=s->state;
1745 	ret->handshake_func=s->handshake_func;
1746 	ret->server=s->server;
1747 
1748 	if (0)
1749 		{
1750 err:
1751 		if (ret != NULL) SSL_free(ret);
1752 		ret=NULL;
1753 		}
1754 	return(ret);
1755 	}
1756 
1757 void ssl_clear_cipher_ctx(SSL *s)
1758 	{
1759 	if (s->enc_read_ctx != NULL)
1760 		{
1761 		EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
1762 		Free(s->enc_read_ctx);
1763 		s->enc_read_ctx=NULL;
1764 		}
1765 	if (s->enc_write_ctx != NULL)
1766 		{
1767 		EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
1768 		Free(s->enc_write_ctx);
1769 		s->enc_write_ctx=NULL;
1770 		}
1771 	if (s->expand != NULL)
1772 		{
1773 		COMP_CTX_free(s->expand);
1774 		s->expand=NULL;
1775 		}
1776 	if (s->compress != NULL)
1777 		{
1778 		COMP_CTX_free(s->compress);
1779 		s->compress=NULL;
1780 		}
1781 	}
1782 
1783 /* Fix this function so that it takes an optional type parameter */
1784 X509 *SSL_get_certificate(SSL *s)
1785 	{
1786 	if (s->cert != NULL)
1787 		return(s->cert->key->x509);
1788 	else
1789 		return(NULL);
1790 	}
1791 
1792 /* Fix this function so that it takes an optional type parameter */
1793 EVP_PKEY *SSL_get_privatekey(SSL *s)
1794 	{
1795 	if (s->cert != NULL)
1796 		return(s->cert->key->privatekey);
1797 	else
1798 		return(NULL);
1799 	}
1800 
1801 SSL_CIPHER *SSL_get_current_cipher(SSL *s)
1802 	{
1803 	if ((s->session != NULL) && (s->session->cipher != NULL))
1804 		return(s->session->cipher);
1805 	return(NULL);
1806 	}
1807 
1808 int ssl_init_wbio_buffer(SSL *s,int push)
1809 	{
1810 	BIO *bbio;
1811 
1812 	if (s->bbio == NULL)
1813 		{
1814 		bbio=BIO_new(BIO_f_buffer());
1815 		if (bbio == NULL) return(0);
1816 		s->bbio=bbio;
1817 		}
1818 	else
1819 		{
1820 		bbio=s->bbio;
1821 		if (s->bbio == s->wbio)
1822 			s->wbio=BIO_pop(s->wbio);
1823 		}
1824 	(void)BIO_reset(bbio);
1825 /*	if (!BIO_set_write_buffer_size(bbio,16*1024)) */
1826 	if (!BIO_set_read_buffer_size(bbio,1))
1827 		{
1828 		SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
1829 		return(0);
1830 		}
1831 	if (push)
1832 		{
1833 		if (s->wbio != bbio)
1834 			s->wbio=BIO_push(bbio,s->wbio);
1835 		}
1836 	else
1837 		{
1838 		if (s->wbio == bbio)
1839 			s->wbio=BIO_pop(bbio);
1840 		}
1841 	return(1);
1842 	}
1843 
1844 void ssl_free_wbio_buffer(SSL *s)
1845 	{
1846 	BIO *under;
1847 
1848 	if (s->bbio == NULL) return;
1849 
1850 	if (s->bbio == s->wbio)
1851 		{
1852 		/* remove buffering */
1853 		under=BIO_pop(s->wbio);
1854 		if (under != NULL)
1855 			s->wbio=under;
1856 		else
1857 			abort(); /* ok */
1858 		}
1859 	BIO_free(s->bbio);
1860 	s->bbio=NULL;
1861 	}
1862 
1863 void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
1864 	{
1865 	ctx->quiet_shutdown=mode;
1866 	}
1867 
1868 int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx)
1869 	{
1870 	return(ctx->quiet_shutdown);
1871 	}
1872 
1873 void SSL_set_quiet_shutdown(SSL *s,int mode)
1874 	{
1875 	s->quiet_shutdown=mode;
1876 	}
1877 
1878 int SSL_get_quiet_shutdown(SSL *s)
1879 	{
1880 	return(s->quiet_shutdown);
1881 	}
1882 
1883 void SSL_set_shutdown(SSL *s,int mode)
1884 	{
1885 	s->shutdown=mode;
1886 	}
1887 
1888 int SSL_get_shutdown(SSL *s)
1889 	{
1890 	return(s->shutdown);
1891 	}
1892 
1893 int SSL_version(SSL *s)
1894 	{
1895 	return(s->version);
1896 	}
1897 
1898 SSL_CTX *SSL_get_SSL_CTX(SSL *ssl)
1899 	{
1900 	return(ssl->ctx);
1901 	}
1902 
1903 #ifndef NO_STDIO
1904 int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
1905 	{
1906 	return(X509_STORE_set_default_paths(ctx->cert_store));
1907 	}
1908 
1909 int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
1910 		const char *CApath)
1911 	{
1912 	return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
1913 	}
1914 #endif
1915 
1916 void SSL_set_info_callback(SSL *ssl,void (*cb)())
1917 	{
1918 	ssl->info_callback=cb;
1919 	}
1920 
1921 void (*SSL_get_info_callback(SSL *ssl))(void)
1922 	{
1923 	return((void (*)())ssl->info_callback);
1924 	}
1925 
1926 int SSL_state(SSL *ssl)
1927 	{
1928 	return(ssl->state);
1929 	}
1930 
1931 void SSL_set_verify_result(SSL *ssl,long arg)
1932 	{
1933 	ssl->verify_result=arg;
1934 	}
1935 
1936 long SSL_get_verify_result(SSL *ssl)
1937 	{
1938 	return(ssl->verify_result);
1939 	}
1940 
1941 int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
1942 			 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
1943 	{
1944 	ssl_meth_num++;
1945 	return(CRYPTO_get_ex_new_index(ssl_meth_num-1,
1946 		&ssl_meth,argl,argp,new_func,dup_func,free_func));
1947 	}
1948 
1949 int SSL_set_ex_data(SSL *s,int idx,void *arg)
1950 	{
1951 	return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
1952 	}
1953 
1954 void *SSL_get_ex_data(SSL *s,int idx)
1955 	{
1956 	return(CRYPTO_get_ex_data(&s->ex_data,idx));
1957 	}
1958 
1959 int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
1960 			     CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
1961 	{
1962 	ssl_ctx_meth_num++;
1963 	return(CRYPTO_get_ex_new_index(ssl_ctx_meth_num-1,
1964 		&ssl_ctx_meth,argl,argp,new_func,dup_func,free_func));
1965 	}
1966 
1967 int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
1968 	{
1969 	return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
1970 	}
1971 
1972 void *SSL_CTX_get_ex_data(SSL_CTX *s,int idx)
1973 	{
1974 	return(CRYPTO_get_ex_data(&s->ex_data,idx));
1975 	}
1976 
1977 int ssl_ok(SSL *s)
1978 	{
1979 	return(1);
1980 	}
1981 
1982 X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx)
1983 	{
1984 	return(ctx->cert_store);
1985 	}
1986 
1987 void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
1988 	{
1989 	if (ctx->cert_store != NULL)
1990 		X509_STORE_free(ctx->cert_store);
1991 	ctx->cert_store=store;
1992 	}
1993 
1994 int SSL_want(SSL *s)
1995 	{
1996 	return(s->rwstate);
1997 	}
1998 
1999 /*!
2000  * \brief Set the callback for generating temporary RSA keys.
2001  * \param ctx the SSL context.
2002  * \param cb the callback
2003  */
2004 
2005 #ifndef NO_RSA
2006 void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
2007 							  int is_export,
2008 							  int keylength))
2009     {
2010     SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2011     }
2012 
2013 void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
2014 						  int is_export,
2015 						  int keylength))
2016     {
2017     SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
2018     }
2019 #endif
2020 
2021 #ifdef DOXYGEN
2022 /*!
2023  * \brief The RSA temporary key callback function.
2024  * \param ssl the SSL session.
2025  * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
2026  * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
2027  * of the required key in bits.
2028  * \return the temporary RSA key.
2029  * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
2030  */
2031 
2032 RSA *cb(SSL *ssl,int is_export,int keylength)
2033     {}
2034 #endif
2035 
2036 /*!
2037  * \brief Set the callback for generating temporary DH keys.
2038  * \param ctx the SSL context.
2039  * \param dh the callback
2040  */
2041 
2042 #ifndef NO_DH
2043 void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
2044 							int keylength))
2045     {
2046     SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2047     }
2048 
2049 void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
2050 						int keylength))
2051     {
2052     SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
2053     }
2054 #endif
2055 
2056 #if defined(_WINDLL) && defined(WIN16)
2057 #include "../crypto/bio/bss_file.c"
2058 #endif
2059 
2060 IMPLEMENT_STACK_OF(SSL_CIPHER)
2061 IMPLEMENT_STACK_OF(SSL_COMP)
2062