xref: /openbsd-src/lib/libssl/ssl_lib.c (revision 850e275390052b330d93020bf619a739a3c277ac)
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  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
62  *
63  * Redistribution and use in source and binary forms, with or without
64  * modification, are permitted provided that the following conditions
65  * are met:
66  *
67  * 1. Redistributions of source code must retain the above copyright
68  *    notice, this list of conditions and the following disclaimer.
69  *
70  * 2. Redistributions in binary form must reproduce the above copyright
71  *    notice, this list of conditions and the following disclaimer in
72  *    the documentation and/or other materials provided with the
73  *    distribution.
74  *
75  * 3. All advertising materials mentioning features or use of this
76  *    software must display the following acknowledgment:
77  *    "This product includes software developed by the OpenSSL Project
78  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
79  *
80  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
81  *    endorse or promote products derived from this software without
82  *    prior written permission. For written permission, please contact
83  *    openssl-core@openssl.org.
84  *
85  * 5. Products derived from this software may not be called "OpenSSL"
86  *    nor may "OpenSSL" appear in their names without prior written
87  *    permission of the OpenSSL Project.
88  *
89  * 6. Redistributions of any form whatsoever must retain the following
90  *    acknowledgment:
91  *    "This product includes software developed by the OpenSSL Project
92  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
93  *
94  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
95  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
96  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
97  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
98  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
99  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
100  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
101  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
102  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
103  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
104  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
105  * OF THE POSSIBILITY OF SUCH DAMAGE.
106  * ====================================================================
107  *
108  * This product includes cryptographic software written by Eric Young
109  * (eay@cryptsoft.com).  This product includes software written by Tim
110  * Hudson (tjh@cryptsoft.com).
111  *
112  */
113 /* ====================================================================
114  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
115  * ECC cipher suite support in OpenSSL originally developed by
116  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
117  */
118 
119 #ifdef REF_CHECK
120 #  include <assert.h>
121 #endif
122 #include <stdio.h>
123 #include "ssl_locl.h"
124 #include "kssl_lcl.h"
125 #include <openssl/objects.h>
126 #include <openssl/lhash.h>
127 #include <openssl/x509v3.h>
128 #include <openssl/rand.h>
129 #include <openssl/ocsp.h>
130 #ifndef OPENSSL_NO_DH
131 #include <openssl/dh.h>
132 #endif
133 
134 const char *SSL_version_str=OPENSSL_VERSION_TEXT;
135 
136 SSL3_ENC_METHOD ssl3_undef_enc_method={
137 	/* evil casts, but these functions are only called if there's a library bug */
138 	(int (*)(SSL *,int))ssl_undefined_function,
139 	(int (*)(SSL *, unsigned char *, int))ssl_undefined_function,
140 	ssl_undefined_function,
141 	(int (*)(SSL *, unsigned char *, unsigned char *, int))ssl_undefined_function,
142 	(int (*)(SSL*, int))ssl_undefined_function,
143 	(int (*)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char*, int, unsigned char *))ssl_undefined_function,
144 	0,	/* finish_mac_length */
145 	(int (*)(SSL *, EVP_MD_CTX *, unsigned char *))ssl_undefined_function,
146 	NULL,	/* client_finished_label */
147 	0,	/* client_finished_label_len */
148 	NULL,	/* server_finished_label */
149 	0,	/* server_finished_label_len */
150 	(int (*)(int))ssl_undefined_function
151 	};
152 
153 int SSL_clear(SSL *s)
154 	{
155 
156 	if (s->method == NULL)
157 		{
158 		SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED);
159 		return(0);
160 		}
161 
162 	if (ssl_clear_bad_session(s))
163 		{
164 		SSL_SESSION_free(s->session);
165 		s->session=NULL;
166 		}
167 
168 	s->error=0;
169 	s->hit=0;
170 	s->shutdown=0;
171 
172 #if 0 /* Disabled since version 1.10 of this file (early return not
173        * needed because SSL_clear is not called when doing renegotiation) */
174 	/* This is set if we are doing dynamic renegotiation so keep
175 	 * the old cipher.  It is sort of a SSL_clear_lite :-) */
176 	if (s->new_session) return(1);
177 #else
178 	if (s->new_session)
179 		{
180 		SSLerr(SSL_F_SSL_CLEAR,ERR_R_INTERNAL_ERROR);
181 		return 0;
182 		}
183 #endif
184 
185 	s->type=0;
186 
187 	s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT);
188 
189 	s->version=s->method->version;
190 	s->client_version=s->version;
191 	s->rwstate=SSL_NOTHING;
192 	s->rstate=SSL_ST_READ_HEADER;
193 #if 0
194 	s->read_ahead=s->ctx->read_ahead;
195 #endif
196 
197 	if (s->init_buf != NULL)
198 		{
199 		BUF_MEM_free(s->init_buf);
200 		s->init_buf=NULL;
201 		}
202 
203 	ssl_clear_cipher_ctx(s);
204 
205 	s->first_packet=0;
206 
207 #if 1
208 	/* Check to see if we were changed into a different method, if
209 	 * so, revert back if we are not doing session-id reuse. */
210 	if (!s->in_handshake && (s->session == NULL) && (s->method != s->ctx->method))
211 		{
212 		s->method->ssl_free(s);
213 		s->method=s->ctx->method;
214 		if (!s->method->ssl_new(s))
215 			return(0);
216 		}
217 	else
218 #endif
219 		s->method->ssl_clear(s);
220 	return(1);
221 	}
222 
223 /** Used to change an SSL_CTXs default SSL method type */
224 int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth)
225 	{
226 	STACK_OF(SSL_CIPHER) *sk;
227 
228 	ctx->method=meth;
229 
230 	sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list),
231 		&(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST);
232 	if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0))
233 		{
234 		SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
235 		return(0);
236 		}
237 	return(1);
238 	}
239 
240 SSL *SSL_new(SSL_CTX *ctx)
241 	{
242 	SSL *s;
243 
244 	if (ctx == NULL)
245 		{
246 		SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
247 		return(NULL);
248 		}
249 	if (ctx->method == NULL)
250 		{
251 		SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
252 		return(NULL);
253 		}
254 
255 	s=(SSL *)OPENSSL_malloc(sizeof(SSL));
256 	if (s == NULL) goto err;
257 	memset(s,0,sizeof(SSL));
258 
259 #ifndef	OPENSSL_NO_KRB5
260 	s->kssl_ctx = kssl_ctx_new();
261 #endif	/* OPENSSL_NO_KRB5 */
262 
263 	s->options=ctx->options;
264 	s->mode=ctx->mode;
265 	s->max_cert_list=ctx->max_cert_list;
266 
267 	if (ctx->cert != NULL)
268 		{
269 		/* Earlier library versions used to copy the pointer to
270 		 * the CERT, not its contents; only when setting new
271 		 * parameters for the per-SSL copy, ssl_cert_new would be
272 		 * called (and the direct reference to the per-SSL_CTX
273 		 * settings would be lost, but those still were indirectly
274 		 * accessed for various purposes, and for that reason they
275 		 * used to be known as s->ctx->default_cert).
276 		 * Now we don't look at the SSL_CTX's CERT after having
277 		 * duplicated it once. */
278 
279 		s->cert = ssl_cert_dup(ctx->cert);
280 		if (s->cert == NULL)
281 			goto err;
282 		}
283 	else
284 		s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
285 
286 	s->read_ahead=ctx->read_ahead;
287 	s->msg_callback=ctx->msg_callback;
288 	s->msg_callback_arg=ctx->msg_callback_arg;
289 	s->verify_mode=ctx->verify_mode;
290 #if 0
291 	s->verify_depth=ctx->verify_depth;
292 #endif
293 	s->sid_ctx_length=ctx->sid_ctx_length;
294 	OPENSSL_assert(s->sid_ctx_length <= sizeof s->sid_ctx);
295 	memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
296 	s->verify_callback=ctx->default_verify_callback;
297 	s->generate_session_id=ctx->generate_session_id;
298 
299 	s->param = X509_VERIFY_PARAM_new();
300 	if (!s->param)
301 		goto err;
302 	X509_VERIFY_PARAM_inherit(s->param, ctx->param);
303 #if 0
304 	s->purpose = ctx->purpose;
305 	s->trust = ctx->trust;
306 #endif
307 	s->quiet_shutdown=ctx->quiet_shutdown;
308 
309 	CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
310 	s->ctx=ctx;
311 #ifndef OPENSSL_NO_TLSEXT
312 	s->tlsext_debug_cb = 0;
313 	s->tlsext_debug_arg = NULL;
314 	s->tlsext_ticket_expected = 0;
315 	s->tlsext_status_type = -1;
316 	s->tlsext_status_expected = 0;
317 	s->tlsext_ocsp_ids = NULL;
318 	s->tlsext_ocsp_exts = NULL;
319 	s->tlsext_ocsp_resp = NULL;
320 	s->tlsext_ocsp_resplen = -1;
321 	CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
322 	s->initial_ctx=ctx;
323 #endif
324 	s->verify_result=X509_V_OK;
325 
326 	s->method=ctx->method;
327 
328 	if (!s->method->ssl_new(s))
329 		goto err;
330 
331 	s->references=1;
332 	s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
333 
334 	SSL_clear(s);
335 
336 	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
337 
338 	return(s);
339 err:
340 	if (s != NULL)
341 		{
342 		if (s->cert != NULL)
343 			ssl_cert_free(s->cert);
344 		if (s->ctx != NULL)
345 			SSL_CTX_free(s->ctx); /* decrement reference count */
346 		OPENSSL_free(s);
347 		}
348 	SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
349 	return(NULL);
350 	}
351 
352 int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
353 				   unsigned int sid_ctx_len)
354     {
355     if(sid_ctx_len > sizeof ctx->sid_ctx)
356 	{
357 	SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
358 	return 0;
359 	}
360     ctx->sid_ctx_length=sid_ctx_len;
361     memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len);
362 
363     return 1;
364     }
365 
366 int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
367 			       unsigned int sid_ctx_len)
368     {
369     if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH)
370 	{
371 	SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
372 	return 0;
373 	}
374     ssl->sid_ctx_length=sid_ctx_len;
375     memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len);
376 
377     return 1;
378     }
379 
380 int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb)
381 	{
382 	CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
383 	ctx->generate_session_id = cb;
384 	CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
385 	return 1;
386 	}
387 
388 int SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB cb)
389 	{
390 	CRYPTO_w_lock(CRYPTO_LOCK_SSL);
391 	ssl->generate_session_id = cb;
392 	CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
393 	return 1;
394 	}
395 
396 int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
397 				unsigned int id_len)
398 	{
399 	/* A quick examination of SSL_SESSION_hash and SSL_SESSION_cmp shows how
400 	 * we can "construct" a session to give us the desired check - ie. to
401 	 * find if there's a session in the hash table that would conflict with
402 	 * any new session built out of this id/id_len and the ssl_version in
403 	 * use by this SSL. */
404 	SSL_SESSION r, *p;
405 
406 	if(id_len > sizeof r.session_id)
407 		return 0;
408 
409 	r.ssl_version = ssl->version;
410 	r.session_id_length = id_len;
411 	memcpy(r.session_id, id, id_len);
412 	/* NB: SSLv2 always uses a fixed 16-byte session ID, so even if a
413 	 * callback is calling us to check the uniqueness of a shorter ID, it
414 	 * must be compared as a padded-out ID because that is what it will be
415 	 * converted to when the callback has finished choosing it. */
416 	if((r.ssl_version == SSL2_VERSION) &&
417 			(id_len < SSL2_SSL_SESSION_ID_LENGTH))
418 		{
419 		memset(r.session_id + id_len, 0,
420 			SSL2_SSL_SESSION_ID_LENGTH - id_len);
421 		r.session_id_length = SSL2_SSL_SESSION_ID_LENGTH;
422 		}
423 
424 	CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX);
425 	p = (SSL_SESSION *)lh_retrieve(ssl->ctx->sessions, &r);
426 	CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX);
427 	return (p != NULL);
428 	}
429 
430 int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
431 	{
432 	return X509_VERIFY_PARAM_set_purpose(s->param, purpose);
433 	}
434 
435 int SSL_set_purpose(SSL *s, int purpose)
436 	{
437 	return X509_VERIFY_PARAM_set_purpose(s->param, purpose);
438 	}
439 
440 int SSL_CTX_set_trust(SSL_CTX *s, int trust)
441 	{
442 	return X509_VERIFY_PARAM_set_trust(s->param, trust);
443 	}
444 
445 int SSL_set_trust(SSL *s, int trust)
446 	{
447 	return X509_VERIFY_PARAM_set_trust(s->param, trust);
448 	}
449 
450 void SSL_free(SSL *s)
451 	{
452 	int i;
453 
454 	if(s == NULL)
455 	    return;
456 
457 	i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL);
458 #ifdef REF_PRINT
459 	REF_PRINT("SSL",s);
460 #endif
461 	if (i > 0) return;
462 #ifdef REF_CHECK
463 	if (i < 0)
464 		{
465 		fprintf(stderr,"SSL_free, bad reference count\n");
466 		abort(); /* ok */
467 		}
468 #endif
469 
470 	if (s->param)
471 		X509_VERIFY_PARAM_free(s->param);
472 
473 	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
474 
475 	if (s->bbio != NULL)
476 		{
477 		/* If the buffering BIO is in place, pop it off */
478 		if (s->bbio == s->wbio)
479 			{
480 			s->wbio=BIO_pop(s->wbio);
481 			}
482 		BIO_free(s->bbio);
483 		s->bbio=NULL;
484 		}
485 	if (s->rbio != NULL)
486 		BIO_free_all(s->rbio);
487 	if ((s->wbio != NULL) && (s->wbio != s->rbio))
488 		BIO_free_all(s->wbio);
489 
490 	if (s->init_buf != NULL) BUF_MEM_free(s->init_buf);
491 
492 	/* add extra stuff */
493 	if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list);
494 	if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id);
495 
496 	/* Make the next call work :-) */
497 	if (s->session != NULL)
498 		{
499 		ssl_clear_bad_session(s);
500 		SSL_SESSION_free(s->session);
501 		}
502 
503 	ssl_clear_cipher_ctx(s);
504 
505 	if (s->cert != NULL) ssl_cert_free(s->cert);
506 	/* Free up if allocated */
507 
508 	if (s->ctx) SSL_CTX_free(s->ctx);
509 #ifndef OPENSSL_NO_TLSEXT
510 	if (s->initial_ctx) SSL_CTX_free(s->initial_ctx);
511 	if (s->tlsext_ocsp_exts)
512 		sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
513 						X509_EXTENSION_free);
514 	if (s->tlsext_ocsp_ids)
515 		sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free);
516 	if (s->tlsext_ocsp_resp)
517 		OPENSSL_free(s->tlsext_ocsp_resp);
518 #endif
519 	if (s->client_CA != NULL)
520 		sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free);
521 
522 	if (s->method != NULL) s->method->ssl_free(s);
523 
524 #ifndef	OPENSSL_NO_KRB5
525 	if (s->kssl_ctx != NULL)
526 		kssl_ctx_free(s->kssl_ctx);
527 #endif	/* OPENSSL_NO_KRB5 */
528 
529 	OPENSSL_free(s);
530 	}
531 
532 void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
533 	{
534 	/* If the output buffering BIO is still in place, remove it
535 	 */
536 	if (s->bbio != NULL)
537 		{
538 		if (s->wbio == s->bbio)
539 			{
540 			s->wbio=s->wbio->next_bio;
541 			s->bbio->next_bio=NULL;
542 			}
543 		}
544 	if ((s->rbio != NULL) && (s->rbio != rbio))
545 		BIO_free_all(s->rbio);
546 	if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
547 		BIO_free_all(s->wbio);
548 	s->rbio=rbio;
549 	s->wbio=wbio;
550 	}
551 
552 BIO *SSL_get_rbio(const SSL *s)
553 	{ return(s->rbio); }
554 
555 BIO *SSL_get_wbio(const SSL *s)
556 	{ return(s->wbio); }
557 
558 int SSL_get_fd(const SSL *s)
559 	{
560 	return(SSL_get_rfd(s));
561 	}
562 
563 int SSL_get_rfd(const SSL *s)
564 	{
565 	int ret= -1;
566 	BIO *b,*r;
567 
568 	b=SSL_get_rbio(s);
569 	r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
570 	if (r != NULL)
571 		BIO_get_fd(r,&ret);
572 	return(ret);
573 	}
574 
575 int SSL_get_wfd(const SSL *s)
576 	{
577 	int ret= -1;
578 	BIO *b,*r;
579 
580 	b=SSL_get_wbio(s);
581 	r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);
582 	if (r != NULL)
583 		BIO_get_fd(r,&ret);
584 	return(ret);
585 	}
586 
587 #ifndef OPENSSL_NO_SOCK
588 int SSL_set_fd(SSL *s,int fd)
589 	{
590 	int ret=0;
591 	BIO *bio=NULL;
592 
593 	bio=BIO_new(BIO_s_socket());
594 
595 	if (bio == NULL)
596 		{
597 		SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
598 		goto err;
599 		}
600 	BIO_set_fd(bio,fd,BIO_NOCLOSE);
601 	SSL_set_bio(s,bio,bio);
602 	ret=1;
603 err:
604 	return(ret);
605 	}
606 
607 int SSL_set_wfd(SSL *s,int fd)
608 	{
609 	int ret=0;
610 	BIO *bio=NULL;
611 
612 	if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)
613 		|| ((int)BIO_get_fd(s->rbio,NULL) != fd))
614 		{
615 		bio=BIO_new(BIO_s_socket());
616 
617 		if (bio == NULL)
618 			{ SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }
619 		BIO_set_fd(bio,fd,BIO_NOCLOSE);
620 		SSL_set_bio(s,SSL_get_rbio(s),bio);
621 		}
622 	else
623 		SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));
624 	ret=1;
625 err:
626 	return(ret);
627 	}
628 
629 int SSL_set_rfd(SSL *s,int fd)
630 	{
631 	int ret=0;
632 	BIO *bio=NULL;
633 
634 	if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)
635 		|| ((int)BIO_get_fd(s->wbio,NULL) != fd))
636 		{
637 		bio=BIO_new(BIO_s_socket());
638 
639 		if (bio == NULL)
640 			{
641 			SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);
642 			goto err;
643 			}
644 		BIO_set_fd(bio,fd,BIO_NOCLOSE);
645 		SSL_set_bio(s,bio,SSL_get_wbio(s));
646 		}
647 	else
648 		SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));
649 	ret=1;
650 err:
651 	return(ret);
652 	}
653 #endif
654 
655 
656 /* return length of latest Finished message we sent, copy to 'buf' */
657 size_t SSL_get_finished(const SSL *s, void *buf, size_t count)
658 	{
659 	size_t ret = 0;
660 
661 	if (s->s3 != NULL)
662 		{
663 		ret = s->s3->tmp.finish_md_len;
664 		if (count > ret)
665 			count = ret;
666 		memcpy(buf, s->s3->tmp.finish_md, count);
667 		}
668 	return ret;
669 	}
670 
671 /* return length of latest Finished message we expected, copy to 'buf' */
672 size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count)
673 	{
674 	size_t ret = 0;
675 
676 	if (s->s3 != NULL)
677 		{
678 		ret = s->s3->tmp.peer_finish_md_len;
679 		if (count > ret)
680 			count = ret;
681 		memcpy(buf, s->s3->tmp.peer_finish_md, count);
682 		}
683 	return ret;
684 	}
685 
686 
687 int SSL_get_verify_mode(const SSL *s)
688 	{
689 	return(s->verify_mode);
690 	}
691 
692 int SSL_get_verify_depth(const SSL *s)
693 	{
694 	return X509_VERIFY_PARAM_get_depth(s->param);
695 	}
696 
697 int (*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *)
698 	{
699 	return(s->verify_callback);
700 	}
701 
702 int SSL_CTX_get_verify_mode(const SSL_CTX *ctx)
703 	{
704 	return(ctx->verify_mode);
705 	}
706 
707 int SSL_CTX_get_verify_depth(const SSL_CTX *ctx)
708 	{
709 	return X509_VERIFY_PARAM_get_depth(ctx->param);
710 	}
711 
712 int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *)
713 	{
714 	return(ctx->default_verify_callback);
715 	}
716 
717 void SSL_set_verify(SSL *s,int mode,
718 		    int (*callback)(int ok,X509_STORE_CTX *ctx))
719 	{
720 	s->verify_mode=mode;
721 	if (callback != NULL)
722 		s->verify_callback=callback;
723 	}
724 
725 void SSL_set_verify_depth(SSL *s,int depth)
726 	{
727 	X509_VERIFY_PARAM_set_depth(s->param, depth);
728 	}
729 
730 void SSL_set_read_ahead(SSL *s,int yes)
731 	{
732 	s->read_ahead=yes;
733 	}
734 
735 int SSL_get_read_ahead(const SSL *s)
736 	{
737 	return(s->read_ahead);
738 	}
739 
740 int SSL_pending(const SSL *s)
741 	{
742 	/* SSL_pending cannot work properly if read-ahead is enabled
743 	 * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)),
744 	 * and it is impossible to fix since SSL_pending cannot report
745 	 * errors that may be observed while scanning the new data.
746 	 * (Note that SSL_pending() is often used as a boolean value,
747 	 * so we'd better not return -1.)
748 	 */
749 	return(s->method->ssl_pending(s));
750 	}
751 
752 X509 *SSL_get_peer_certificate(const SSL *s)
753 	{
754 	X509 *r;
755 
756 	if ((s == NULL) || (s->session == NULL))
757 		r=NULL;
758 	else
759 		r=s->session->peer;
760 
761 	if (r == NULL) return(r);
762 
763 	CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);
764 
765 	return(r);
766 	}
767 
768 STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s)
769 	{
770 	STACK_OF(X509) *r;
771 
772 	if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))
773 		r=NULL;
774 	else
775 		r=s->session->sess_cert->cert_chain;
776 
777 	/* If we are a client, cert_chain includes the peer's own
778 	 * certificate; if we are a server, it does not. */
779 
780 	return(r);
781 	}
782 
783 /* Now in theory, since the calling process own 't' it should be safe to
784  * modify.  We need to be able to read f without being hassled */
785 void SSL_copy_session_id(SSL *t,const SSL *f)
786 	{
787 	CERT *tmp;
788 
789 	/* Do we need to to SSL locking? */
790 	SSL_set_session(t,SSL_get_session(f));
791 
792 	/* what if we are setup as SSLv2 but want to talk SSLv3 or
793 	 * vice-versa */
794 	if (t->method != f->method)
795 		{
796 		t->method->ssl_free(t);	/* cleanup current */
797 		t->method=f->method;	/* change method */
798 		t->method->ssl_new(t);	/* setup new */
799 		}
800 
801 	tmp=t->cert;
802 	if (f->cert != NULL)
803 		{
804 		CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);
805 		t->cert=f->cert;
806 		}
807 	else
808 		t->cert=NULL;
809 	if (tmp != NULL) ssl_cert_free(tmp);
810 	SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);
811 	}
812 
813 /* Fix this so it checks all the valid key/cert options */
814 int SSL_CTX_check_private_key(const SSL_CTX *ctx)
815 	{
816 	if (	(ctx == NULL) ||
817 		(ctx->cert == NULL) ||
818 		(ctx->cert->key->x509 == NULL))
819 		{
820 		SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
821 		return(0);
822 		}
823 	if 	(ctx->cert->key->privatekey == NULL)
824 		{
825 		SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
826 		return(0);
827 		}
828 	return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
829 	}
830 
831 /* Fix this function so that it takes an optional type parameter */
832 int SSL_check_private_key(const SSL *ssl)
833 	{
834 	if (ssl == NULL)
835 		{
836 		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);
837 		return(0);
838 		}
839 	if (ssl->cert == NULL)
840 		{
841                 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
842 		return 0;
843 		}
844 	if (ssl->cert->key->x509 == NULL)
845 		{
846 		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
847 		return(0);
848 		}
849 	if (ssl->cert->key->privatekey == NULL)
850 		{
851 		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
852 		return(0);
853 		}
854 	return(X509_check_private_key(ssl->cert->key->x509,
855 		ssl->cert->key->privatekey));
856 	}
857 
858 int SSL_accept(SSL *s)
859 	{
860 	if (s->handshake_func == 0)
861 		/* Not properly initialized yet */
862 		SSL_set_accept_state(s);
863 
864 	return(s->method->ssl_accept(s));
865 	}
866 
867 int SSL_connect(SSL *s)
868 	{
869 	if (s->handshake_func == 0)
870 		/* Not properly initialized yet */
871 		SSL_set_connect_state(s);
872 
873 	return(s->method->ssl_connect(s));
874 	}
875 
876 long SSL_get_default_timeout(const SSL *s)
877 	{
878 	return(s->method->get_timeout());
879 	}
880 
881 int SSL_read(SSL *s,void *buf,int num)
882 	{
883 	if (s->handshake_func == 0)
884 		{
885 		SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
886 		return -1;
887 		}
888 
889 	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
890 		{
891 		s->rwstate=SSL_NOTHING;
892 		return(0);
893 		}
894 	return(s->method->ssl_read(s,buf,num));
895 	}
896 
897 int SSL_peek(SSL *s,void *buf,int num)
898 	{
899 	if (s->handshake_func == 0)
900 		{
901 		SSLerr(SSL_F_SSL_PEEK, SSL_R_UNINITIALIZED);
902 		return -1;
903 		}
904 
905 	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
906 		{
907 		return(0);
908 		}
909 	return(s->method->ssl_peek(s,buf,num));
910 	}
911 
912 int SSL_write(SSL *s,const void *buf,int num)
913 	{
914 	if (s->handshake_func == 0)
915 		{
916 		SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
917 		return -1;
918 		}
919 
920 	if (s->shutdown & SSL_SENT_SHUTDOWN)
921 		{
922 		s->rwstate=SSL_NOTHING;
923 		SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
924 		return(-1);
925 		}
926 	return(s->method->ssl_write(s,buf,num));
927 	}
928 
929 int SSL_shutdown(SSL *s)
930 	{
931 	/* Note that this function behaves differently from what one might
932 	 * expect.  Return values are 0 for no success (yet),
933 	 * 1 for success; but calling it once is usually not enough,
934 	 * even if blocking I/O is used (see ssl3_shutdown).
935 	 */
936 
937 	if (s->handshake_func == 0)
938 		{
939 		SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
940 		return -1;
941 		}
942 
943 	if ((s != NULL) && !SSL_in_init(s))
944 		return(s->method->ssl_shutdown(s));
945 	else
946 		return(1);
947 	}
948 
949 int SSL_renegotiate(SSL *s)
950 	{
951 	if (s->new_session == 0)
952 		{
953 		s->new_session=1;
954 		}
955 	return(s->method->ssl_renegotiate(s));
956 	}
957 
958 int SSL_renegotiate_pending(SSL *s)
959 	{
960 	/* becomes true when negotiation is requested;
961 	 * false again once a handshake has finished */
962 	return (s->new_session != 0);
963 	}
964 
965 long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)
966 	{
967 	long l;
968 
969 	switch (cmd)
970 		{
971 	case SSL_CTRL_GET_READ_AHEAD:
972 		return(s->read_ahead);
973 	case SSL_CTRL_SET_READ_AHEAD:
974 		l=s->read_ahead;
975 		s->read_ahead=larg;
976 		return(l);
977 
978 	case SSL_CTRL_SET_MSG_CALLBACK_ARG:
979 		s->msg_callback_arg = parg;
980 		return 1;
981 
982 	case SSL_CTRL_OPTIONS:
983 		return(s->options|=larg);
984 	case SSL_CTRL_MODE:
985 		return(s->mode|=larg);
986 	case SSL_CTRL_GET_MAX_CERT_LIST:
987 		return(s->max_cert_list);
988 	case SSL_CTRL_SET_MAX_CERT_LIST:
989 		l=s->max_cert_list;
990 		s->max_cert_list=larg;
991 		return(l);
992 	case SSL_CTRL_SET_MTU:
993 		if (SSL_version(s) == DTLS1_VERSION)
994 			{
995 			s->d1->mtu = larg;
996 			return larg;
997 			}
998 		return 0;
999 	default:
1000 		return(s->method->ssl_ctrl(s,cmd,larg,parg));
1001 		}
1002 	}
1003 
1004 long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
1005 	{
1006 	switch(cmd)
1007 		{
1008 	case SSL_CTRL_SET_MSG_CALLBACK:
1009 		s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
1010 		return 1;
1011 
1012 	default:
1013 		return(s->method->ssl_callback_ctrl(s,cmd,fp));
1014 		}
1015 	}
1016 
1017 struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)
1018 	{
1019 	return ctx->sessions;
1020 	}
1021 
1022 long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg)
1023 	{
1024 	long l;
1025 
1026 	switch (cmd)
1027 		{
1028 	case SSL_CTRL_GET_READ_AHEAD:
1029 		return(ctx->read_ahead);
1030 	case SSL_CTRL_SET_READ_AHEAD:
1031 		l=ctx->read_ahead;
1032 		ctx->read_ahead=larg;
1033 		return(l);
1034 
1035 	case SSL_CTRL_SET_MSG_CALLBACK_ARG:
1036 		ctx->msg_callback_arg = parg;
1037 		return 1;
1038 
1039 	case SSL_CTRL_GET_MAX_CERT_LIST:
1040 		return(ctx->max_cert_list);
1041 	case SSL_CTRL_SET_MAX_CERT_LIST:
1042 		l=ctx->max_cert_list;
1043 		ctx->max_cert_list=larg;
1044 		return(l);
1045 
1046 	case SSL_CTRL_SET_SESS_CACHE_SIZE:
1047 		l=ctx->session_cache_size;
1048 		ctx->session_cache_size=larg;
1049 		return(l);
1050 	case SSL_CTRL_GET_SESS_CACHE_SIZE:
1051 		return(ctx->session_cache_size);
1052 	case SSL_CTRL_SET_SESS_CACHE_MODE:
1053 		l=ctx->session_cache_mode;
1054 		ctx->session_cache_mode=larg;
1055 		return(l);
1056 	case SSL_CTRL_GET_SESS_CACHE_MODE:
1057 		return(ctx->session_cache_mode);
1058 
1059 	case SSL_CTRL_SESS_NUMBER:
1060 		return(ctx->sessions->num_items);
1061 	case SSL_CTRL_SESS_CONNECT:
1062 		return(ctx->stats.sess_connect);
1063 	case SSL_CTRL_SESS_CONNECT_GOOD:
1064 		return(ctx->stats.sess_connect_good);
1065 	case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:
1066 		return(ctx->stats.sess_connect_renegotiate);
1067 	case SSL_CTRL_SESS_ACCEPT:
1068 		return(ctx->stats.sess_accept);
1069 	case SSL_CTRL_SESS_ACCEPT_GOOD:
1070 		return(ctx->stats.sess_accept_good);
1071 	case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:
1072 		return(ctx->stats.sess_accept_renegotiate);
1073 	case SSL_CTRL_SESS_HIT:
1074 		return(ctx->stats.sess_hit);
1075 	case SSL_CTRL_SESS_CB_HIT:
1076 		return(ctx->stats.sess_cb_hit);
1077 	case SSL_CTRL_SESS_MISSES:
1078 		return(ctx->stats.sess_miss);
1079 	case SSL_CTRL_SESS_TIMEOUTS:
1080 		return(ctx->stats.sess_timeout);
1081 	case SSL_CTRL_SESS_CACHE_FULL:
1082 		return(ctx->stats.sess_cache_full);
1083 	case SSL_CTRL_OPTIONS:
1084 		return(ctx->options|=larg);
1085 	case SSL_CTRL_MODE:
1086 		return(ctx->mode|=larg);
1087 	default:
1088 		return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg));
1089 		}
1090 	}
1091 
1092 long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
1093 	{
1094 	switch(cmd)
1095 		{
1096 	case SSL_CTRL_SET_MSG_CALLBACK:
1097 		ctx->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);
1098 		return 1;
1099 
1100 	default:
1101 		return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
1102 		}
1103 	}
1104 
1105 int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b)
1106 	{
1107 	long l;
1108 
1109 	l=a->id-b->id;
1110 	if (l == 0L)
1111 		return(0);
1112 	else
1113 		return((l > 0)?1:-1);
1114 	}
1115 
1116 int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,
1117 			const SSL_CIPHER * const *bp)
1118 	{
1119 	long l;
1120 
1121 	l=(*ap)->id-(*bp)->id;
1122 	if (l == 0L)
1123 		return(0);
1124 	else
1125 		return((l > 0)?1:-1);
1126 	}
1127 
1128 /** return a STACK of the ciphers available for the SSL and in order of
1129  * preference */
1130 STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s)
1131 	{
1132 	if (s != NULL)
1133 		{
1134 		if (s->cipher_list != NULL)
1135 			{
1136 			return(s->cipher_list);
1137 			}
1138 		else if ((s->ctx != NULL) &&
1139 			(s->ctx->cipher_list != NULL))
1140 			{
1141 			return(s->ctx->cipher_list);
1142 			}
1143 		}
1144 	return(NULL);
1145 	}
1146 
1147 /** return a STACK of the ciphers available for the SSL and in order of
1148  * algorithm id */
1149 STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)
1150 	{
1151 	if (s != NULL)
1152 		{
1153 		if (s->cipher_list_by_id != NULL)
1154 			{
1155 			return(s->cipher_list_by_id);
1156 			}
1157 		else if ((s->ctx != NULL) &&
1158 			(s->ctx->cipher_list_by_id != NULL))
1159 			{
1160 			return(s->ctx->cipher_list_by_id);
1161 			}
1162 		}
1163 	return(NULL);
1164 	}
1165 
1166 /** The old interface to get the same thing as SSL_get_ciphers() */
1167 const char *SSL_get_cipher_list(const SSL *s,int n)
1168 	{
1169 	SSL_CIPHER *c;
1170 	STACK_OF(SSL_CIPHER) *sk;
1171 
1172 	if (s == NULL) return(NULL);
1173 	sk=SSL_get_ciphers(s);
1174 	if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))
1175 		return(NULL);
1176 	c=sk_SSL_CIPHER_value(sk,n);
1177 	if (c == NULL) return(NULL);
1178 	return(c->name);
1179 	}
1180 
1181 /** specify the ciphers to be used by default by the SSL_CTX */
1182 int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)
1183 	{
1184 	STACK_OF(SSL_CIPHER) *sk;
1185 
1186 	sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,
1187 		&ctx->cipher_list_by_id,str);
1188 	/* ssl_create_cipher_list may return an empty stack if it
1189 	 * was unable to find a cipher matching the given rule string
1190 	 * (for example if the rule string specifies a cipher which
1191 	 * has been disabled). This is not an error as far as
1192 	 * ssl_create_cipher_list is concerned, and hence
1193 	 * ctx->cipher_list and ctx->cipher_list_by_id has been
1194 	 * updated. */
1195 	if (sk == NULL)
1196 		return 0;
1197 	else if (sk_SSL_CIPHER_num(sk) == 0)
1198 		{
1199 		SSLerr(SSL_F_SSL_CTX_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH);
1200 		return 0;
1201 		}
1202 	return 1;
1203 	}
1204 
1205 /** specify the ciphers to be used by the SSL */
1206 int SSL_set_cipher_list(SSL *s,const char *str)
1207 	{
1208 	STACK_OF(SSL_CIPHER) *sk;
1209 
1210 	sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,
1211 		&s->cipher_list_by_id,str);
1212 	/* see comment in SSL_CTX_set_cipher_list */
1213 	if (sk == NULL)
1214 		return 0;
1215 	else if (sk_SSL_CIPHER_num(sk) == 0)
1216 		{
1217 		SSLerr(SSL_F_SSL_SET_CIPHER_LIST, SSL_R_NO_CIPHER_MATCH);
1218 		return 0;
1219 		}
1220 	return 1;
1221 	}
1222 
1223 /* works well for SSLv2, not so good for SSLv3 */
1224 char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
1225 	{
1226 	char *end;
1227 	STACK_OF(SSL_CIPHER) *sk;
1228 	SSL_CIPHER *c;
1229 	size_t curlen = 0;
1230 	int i;
1231 
1232 	if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1233 		(len < 2))
1234 		return(NULL);
1235 
1236 	sk=s->session->ciphers;
1237 	buf[0] = '\0';
1238 	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1239 		{
1240 		c=sk_SSL_CIPHER_value(sk,i);
1241 		end = buf + curlen;
1242 		if (strlcat(buf, c->name, len) >= len ||
1243 		    (curlen = strlcat(buf, ":", len)) >= len)
1244 			{
1245 			/* remove truncated cipher from list */
1246 			*end = '\0';
1247 			break;
1248 			}
1249 		}
1250 	/* remove trailing colon */
1251 	if ((end = strrchr(buf, ':')) != NULL)
1252 		*end = '\0';
1253 	return(buf);
1254 	}
1255 
1256 int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p,
1257                              int (*put_cb)(const SSL_CIPHER *, unsigned char *))
1258 	{
1259 	int i,j=0;
1260 	SSL_CIPHER *c;
1261 	unsigned char *q;
1262 #ifndef OPENSSL_NO_KRB5
1263         int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx);
1264 #endif /* OPENSSL_NO_KRB5 */
1265 
1266 	if (sk == NULL) return(0);
1267 	q=p;
1268 
1269 	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1270 		{
1271 		c=sk_SSL_CIPHER_value(sk,i);
1272 #ifndef OPENSSL_NO_KRB5
1273                 if ((c->algorithms & SSL_KRB5) && nokrb5)
1274                     continue;
1275 #endif /* OPENSSL_NO_KRB5 */
1276 
1277 		j = put_cb ? put_cb(c,p) : ssl_put_cipher_by_char(s,c,p);
1278 		p+=j;
1279 		}
1280 	return(p-q);
1281 	}
1282 
1283 STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
1284 					       STACK_OF(SSL_CIPHER) **skp)
1285 	{
1286 	SSL_CIPHER *c;
1287 	STACK_OF(SSL_CIPHER) *sk;
1288 	int i,n;
1289 
1290 	n=ssl_put_cipher_by_char(s,NULL,NULL);
1291 	if ((num%n) != 0)
1292 		{
1293 		SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
1294 		return(NULL);
1295 		}
1296 	if ((skp == NULL) || (*skp == NULL))
1297 		sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
1298 	else
1299 		{
1300 		sk= *skp;
1301 		sk_SSL_CIPHER_zero(sk);
1302 		}
1303 
1304 	for (i=0; i<num; i+=n)
1305 		{
1306 		c=ssl_get_cipher_by_char(s,p);
1307 		p+=n;
1308 		if (c != NULL)
1309 			{
1310 			if (!sk_SSL_CIPHER_push(sk,c))
1311 				{
1312 				SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1313 				goto err;
1314 				}
1315 			}
1316 		}
1317 
1318 	if (skp != NULL)
1319 		*skp=sk;
1320 	return(sk);
1321 err:
1322 	if ((skp == NULL) || (*skp == NULL))
1323 		sk_SSL_CIPHER_free(sk);
1324 	return(NULL);
1325 	}
1326 
1327 #ifndef OPENSSL_NO_TLSEXT
1328 /** return a servername extension value if provided in Client Hello, or NULL.
1329  * So far, only host_name types are defined (RFC 3546).
1330  */
1331 
1332 const char *SSL_get_servername(const SSL *s, const int type)
1333 	{
1334 	if (type != TLSEXT_NAMETYPE_host_name)
1335 		return NULL;
1336 
1337 	return s->session && !s->tlsext_hostname ?
1338 		s->session->tlsext_hostname :
1339 		s->tlsext_hostname;
1340 	}
1341 
1342 int SSL_get_servername_type(const SSL *s)
1343 	{
1344 	if (s->session && (!s->tlsext_hostname ? s->session->tlsext_hostname : s->tlsext_hostname))
1345 		return TLSEXT_NAMETYPE_host_name;
1346 	return -1;
1347 	}
1348 #endif
1349 
1350 unsigned long SSL_SESSION_hash(const SSL_SESSION *a)
1351 	{
1352 	unsigned long l;
1353 
1354 	l=(unsigned long)
1355 		((unsigned int) a->session_id[0]     )|
1356 		((unsigned int) a->session_id[1]<< 8L)|
1357 		((unsigned long)a->session_id[2]<<16L)|
1358 		((unsigned long)a->session_id[3]<<24L);
1359 	return(l);
1360 	}
1361 
1362 /* NB: If this function (or indeed the hash function which uses a sort of
1363  * coarser function than this one) is changed, ensure
1364  * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being
1365  * able to construct an SSL_SESSION that will collide with any existing session
1366  * with a matching session ID. */
1367 int SSL_SESSION_cmp(const SSL_SESSION *a,const SSL_SESSION *b)
1368 	{
1369 	if (a->ssl_version != b->ssl_version)
1370 		return(1);
1371 	if (a->session_id_length != b->session_id_length)
1372 		return(1);
1373 	return(memcmp(a->session_id,b->session_id,a->session_id_length));
1374 	}
1375 
1376 /* These wrapper functions should remain rather than redeclaring
1377  * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each
1378  * variable. The reason is that the functions aren't static, they're exposed via
1379  * ssl.h. */
1380 static IMPLEMENT_LHASH_HASH_FN(SSL_SESSION_hash, SSL_SESSION *)
1381 static IMPLEMENT_LHASH_COMP_FN(SSL_SESSION_cmp, SSL_SESSION *)
1382 
1383 SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)
1384 	{
1385 	SSL_CTX *ret=NULL;
1386 
1387 	if (meth == NULL)
1388 		{
1389 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1390 		return(NULL);
1391 		}
1392 
1393 	if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1394 		{
1395 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1396 		goto err;
1397 		}
1398 	ret=(SSL_CTX *)OPENSSL_malloc(sizeof(SSL_CTX));
1399 	if (ret == NULL)
1400 		goto err;
1401 
1402 	memset(ret,0,sizeof(SSL_CTX));
1403 
1404 	ret->method=meth;
1405 
1406 	ret->cert_store=NULL;
1407 	ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
1408 	ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1409 	ret->session_cache_head=NULL;
1410 	ret->session_cache_tail=NULL;
1411 
1412 	/* We take the system default */
1413 	ret->session_timeout=meth->get_timeout();
1414 
1415 	ret->new_session_cb=0;
1416 	ret->remove_session_cb=0;
1417 	ret->get_session_cb=0;
1418 	ret->generate_session_id=0;
1419 
1420 	memset((char *)&ret->stats,0,sizeof(ret->stats));
1421 
1422 	ret->references=1;
1423 	ret->quiet_shutdown=0;
1424 
1425 /*	ret->cipher=NULL;*/
1426 /*	ret->s2->challenge=NULL;
1427 	ret->master_key=NULL;
1428 	ret->key_arg=NULL;
1429 	ret->s2->conn_id=NULL; */
1430 
1431 	ret->info_callback=NULL;
1432 
1433 	ret->app_verify_callback=0;
1434 	ret->app_verify_arg=NULL;
1435 
1436 	ret->max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;
1437 	ret->read_ahead=0;
1438 	ret->msg_callback=0;
1439 	ret->msg_callback_arg=NULL;
1440 	ret->verify_mode=SSL_VERIFY_NONE;
1441 #if 0
1442 	ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
1443 #endif
1444 	ret->sid_ctx_length=0;
1445 	ret->default_verify_callback=NULL;
1446 	if ((ret->cert=ssl_cert_new()) == NULL)
1447 		goto err;
1448 
1449 	ret->default_passwd_callback=0;
1450 	ret->default_passwd_callback_userdata=NULL;
1451 	ret->client_cert_cb=0;
1452 	ret->app_gen_cookie_cb=0;
1453 	ret->app_verify_cookie_cb=0;
1454 
1455 	ret->sessions=lh_new(LHASH_HASH_FN(SSL_SESSION_hash),
1456 			LHASH_COMP_FN(SSL_SESSION_cmp));
1457 	if (ret->sessions == NULL) goto err;
1458 	ret->cert_store=X509_STORE_new();
1459 	if (ret->cert_store == NULL) goto err;
1460 
1461 	ssl_create_cipher_list(ret->method,
1462 		&ret->cipher_list,&ret->cipher_list_by_id,
1463 		SSL_DEFAULT_CIPHER_LIST);
1464 	if (ret->cipher_list == NULL
1465 	    || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
1466 		{
1467 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
1468 		goto err2;
1469 		}
1470 
1471 	ret->param = X509_VERIFY_PARAM_new();
1472 	if (!ret->param)
1473 		goto err;
1474 
1475 	if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
1476 		{
1477 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
1478 		goto err2;
1479 		}
1480 	if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
1481 		{
1482 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
1483 		goto err2;
1484 		}
1485 	if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
1486 		{
1487 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
1488 		goto err2;
1489 		}
1490 
1491 	if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
1492 		goto err;
1493 
1494 	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data);
1495 
1496 	ret->extra_certs=NULL;
1497 	ret->comp_methods=SSL_COMP_get_compression_methods();
1498 
1499 #ifndef OPENSSL_NO_TLSEXT
1500 	ret->tlsext_servername_callback = 0;
1501 	ret->tlsext_servername_arg = NULL;
1502 	/* Setup RFC4507 ticket keys */
1503 	if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0)
1504 		|| (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0)
1505 		|| (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0))
1506 		ret->options |= SSL_OP_NO_TICKET;
1507 
1508 	ret->tlsext_status_cb = 0;
1509 	ret->tlsext_status_arg = NULL;
1510 
1511 #endif
1512 
1513 	return(ret);
1514 err:
1515 	SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
1516 err2:
1517 	if (ret != NULL) SSL_CTX_free(ret);
1518 	return(NULL);
1519 	}
1520 
1521 #if 0
1522 static void SSL_COMP_free(SSL_COMP *comp)
1523     { OPENSSL_free(comp); }
1524 #endif
1525 
1526 void SSL_CTX_free(SSL_CTX *a)
1527 	{
1528 	int i;
1529 
1530 	if (a == NULL) return;
1531 
1532 	i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
1533 #ifdef REF_PRINT
1534 	REF_PRINT("SSL_CTX",a);
1535 #endif
1536 	if (i > 0) return;
1537 #ifdef REF_CHECK
1538 	if (i < 0)
1539 		{
1540 		fprintf(stderr,"SSL_CTX_free, bad reference count\n");
1541 		abort(); /* ok */
1542 		}
1543 #endif
1544 
1545 	if (a->param)
1546 		X509_VERIFY_PARAM_free(a->param);
1547 
1548 	/*
1549 	 * Free internal session cache. However: the remove_cb() may reference
1550 	 * the ex_data of SSL_CTX, thus the ex_data store can only be removed
1551 	 * after the sessions were flushed.
1552 	 * As the ex_data handling routines might also touch the session cache,
1553 	 * the most secure solution seems to be: empty (flush) the cache, then
1554 	 * free ex_data, then finally free the cache.
1555 	 * (See ticket [openssl.org #212].)
1556 	 */
1557 	if (a->sessions != NULL)
1558 		SSL_CTX_flush_sessions(a,0);
1559 
1560 	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data);
1561 
1562 	if (a->sessions != NULL)
1563 		lh_free(a->sessions);
1564 
1565 	if (a->cert_store != NULL)
1566 		X509_STORE_free(a->cert_store);
1567 	if (a->cipher_list != NULL)
1568 		sk_SSL_CIPHER_free(a->cipher_list);
1569 	if (a->cipher_list_by_id != NULL)
1570 		sk_SSL_CIPHER_free(a->cipher_list_by_id);
1571 	if (a->cert != NULL)
1572 		ssl_cert_free(a->cert);
1573 	if (a->client_CA != NULL)
1574 		sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
1575 	if (a->extra_certs != NULL)
1576 		sk_X509_pop_free(a->extra_certs,X509_free);
1577 #if 0 /* This should never be done, since it removes a global database */
1578 	if (a->comp_methods != NULL)
1579 		sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
1580 #else
1581 	a->comp_methods = NULL;
1582 #endif
1583 	OPENSSL_free(a);
1584 	}
1585 
1586 void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
1587 	{
1588 	ctx->default_passwd_callback=cb;
1589 	}
1590 
1591 void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1592 	{
1593 	ctx->default_passwd_callback_userdata=u;
1594 	}
1595 
1596 void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg)
1597 	{
1598 	ctx->app_verify_callback=cb;
1599 	ctx->app_verify_arg=arg;
1600 	}
1601 
1602 void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
1603 	{
1604 	ctx->verify_mode=mode;
1605 	ctx->default_verify_callback=cb;
1606 	}
1607 
1608 void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1609 	{
1610 	X509_VERIFY_PARAM_set_depth(ctx->param, depth);
1611 	}
1612 
1613 void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
1614 	{
1615 	CERT_PKEY *cpk;
1616 	int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1617 	int rsa_enc_export,dh_rsa_export,dh_dsa_export;
1618 	int rsa_tmp_export,dh_tmp_export,kl;
1619 	unsigned long mask,emask;
1620 	int have_ecc_cert, ecdh_ok, ecdsa_ok, ecc_pkey_size;
1621 #ifndef OPENSSL_NO_ECDH
1622 	int have_ecdh_tmp;
1623 #endif
1624 	X509 *x = NULL;
1625 	EVP_PKEY *ecc_pkey = NULL;
1626 	int signature_nid = 0;
1627 
1628 	if (c == NULL) return;
1629 
1630 	kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1631 
1632 #ifndef OPENSSL_NO_RSA
1633 	rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1634 	rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
1635 		(rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
1636 #else
1637 	rsa_tmp=rsa_tmp_export=0;
1638 #endif
1639 #ifndef OPENSSL_NO_DH
1640 	dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1641 	dh_tmp_export=(c->dh_tmp_cb != NULL ||
1642 		(dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
1643 #else
1644 	dh_tmp=dh_tmp_export=0;
1645 #endif
1646 
1647 #ifndef OPENSSL_NO_ECDH
1648 	have_ecdh_tmp=(c->ecdh_tmp != NULL || c->ecdh_tmp_cb != NULL);
1649 #endif
1650 	cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
1651 	rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1652 	rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1653 	cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
1654 	rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1655 	cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
1656 	dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1657 	cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
1658 	dh_rsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1659 	dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1660 	cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1661 /* FIX THIS EAY EAY EAY */
1662 	dh_dsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1663 	dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1664 	cpk= &(c->pkeys[SSL_PKEY_ECC]);
1665 	have_ecc_cert= (cpk->x509 != NULL && cpk->privatekey != NULL);
1666 	mask=0;
1667 	emask=0;
1668 
1669 #ifdef CIPHER_DEBUG
1670 	printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1671 		rsa_tmp,rsa_tmp_export,dh_tmp,
1672 		rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
1673 #endif
1674 
1675 	if (rsa_enc || (rsa_tmp && rsa_sign))
1676 		mask|=SSL_kRSA;
1677 	if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
1678 		emask|=SSL_kRSA;
1679 
1680 #if 0
1681 	/* The match needs to be both kEDH and aRSA or aDSA, so don't worry */
1682 	if (	(dh_tmp || dh_rsa || dh_dsa) &&
1683 		(rsa_enc || rsa_sign || dsa_sign))
1684 		mask|=SSL_kEDH;
1685 	if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
1686 		(rsa_enc || rsa_sign || dsa_sign))
1687 		emask|=SSL_kEDH;
1688 #endif
1689 
1690 	if (dh_tmp_export)
1691 		emask|=SSL_kEDH;
1692 
1693 	if (dh_tmp)
1694 		mask|=SSL_kEDH;
1695 
1696 	if (dh_rsa) mask|=SSL_kDHr;
1697 	if (dh_rsa_export) emask|=SSL_kDHr;
1698 
1699 	if (dh_dsa) mask|=SSL_kDHd;
1700 	if (dh_dsa_export) emask|=SSL_kDHd;
1701 
1702 	if (rsa_enc || rsa_sign)
1703 		{
1704 		mask|=SSL_aRSA;
1705 		emask|=SSL_aRSA;
1706 		}
1707 
1708 	if (dsa_sign)
1709 		{
1710 		mask|=SSL_aDSS;
1711 		emask|=SSL_aDSS;
1712 		}
1713 
1714 	mask|=SSL_aNULL;
1715 	emask|=SSL_aNULL;
1716 
1717 #ifndef OPENSSL_NO_KRB5
1718 	mask|=SSL_kKRB5|SSL_aKRB5;
1719 	emask|=SSL_kKRB5|SSL_aKRB5;
1720 #endif
1721 
1722 	/* An ECC certificate may be usable for ECDH and/or
1723 	 * ECDSA cipher suites depending on the key usage extension.
1724 	 */
1725 	if (have_ecc_cert)
1726 		{
1727                 /* This call populates extension flags (ex_flags) */
1728 		x = (c->pkeys[SSL_PKEY_ECC]).x509;
1729 		X509_check_purpose(x, -1, 0);
1730 		ecdh_ok = (x->ex_flags & EXFLAG_KUSAGE) ?
1731 		    (x->ex_kusage & X509v3_KU_KEY_AGREEMENT) : 1;
1732 		ecdsa_ok = (x->ex_flags & EXFLAG_KUSAGE) ?
1733 		    (x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE) : 1;
1734 		ecc_pkey = X509_get_pubkey(x);
1735 		ecc_pkey_size = (ecc_pkey != NULL) ?
1736 		    EVP_PKEY_bits(ecc_pkey) : 0;
1737 		EVP_PKEY_free(ecc_pkey);
1738 		if ((x->sig_alg) && (x->sig_alg->algorithm))
1739 			signature_nid = OBJ_obj2nid(x->sig_alg->algorithm);
1740 #ifndef OPENSSL_NO_ECDH
1741 		if (ecdh_ok)
1742 			{
1743 			if ((signature_nid == NID_md5WithRSAEncryption) ||
1744 			    (signature_nid == NID_md4WithRSAEncryption) ||
1745 			    (signature_nid == NID_md2WithRSAEncryption))
1746 				{
1747 				mask|=SSL_kECDH|SSL_aRSA;
1748 				if (ecc_pkey_size <= 163)
1749 					emask|=SSL_kECDH|SSL_aRSA;
1750 				}
1751 			if (signature_nid == NID_ecdsa_with_SHA1)
1752 				{
1753 				mask|=SSL_kECDH|SSL_aECDSA;
1754 				if (ecc_pkey_size <= 163)
1755 					emask|=SSL_kECDH|SSL_aECDSA;
1756 				}
1757 			}
1758 #endif
1759 #ifndef OPENSSL_NO_ECDSA
1760 		if (ecdsa_ok)
1761 			{
1762 			mask|=SSL_aECDSA;
1763 			emask|=SSL_aECDSA;
1764 			}
1765 #endif
1766 		}
1767 
1768 #ifndef OPENSSL_NO_ECDH
1769 	if (have_ecdh_tmp)
1770 		{
1771 		mask|=SSL_kECDHE;
1772 		emask|=SSL_kECDHE;
1773 		}
1774 #endif
1775 	c->mask=mask;
1776 	c->export_mask=emask;
1777 	c->valid=1;
1778 	}
1779 
1780 /* This handy macro borrowed from crypto/x509v3/v3_purp.c */
1781 #define ku_reject(x, usage) \
1782 	(((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
1783 
1784 int check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs)
1785 	{
1786 	unsigned long alg = cs->algorithms;
1787 	EVP_PKEY *pkey = NULL;
1788 	int keysize = 0;
1789 	int signature_nid = 0;
1790 
1791 	if (SSL_C_IS_EXPORT(cs))
1792 		{
1793 		/* ECDH key length in export ciphers must be <= 163 bits */
1794 		pkey = X509_get_pubkey(x);
1795 		if (pkey == NULL) return 0;
1796 		keysize = EVP_PKEY_bits(pkey);
1797 		EVP_PKEY_free(pkey);
1798 		if (keysize > 163) return 0;
1799 		}
1800 
1801 	/* This call populates the ex_flags field correctly */
1802 	X509_check_purpose(x, -1, 0);
1803 	if ((x->sig_alg) && (x->sig_alg->algorithm))
1804 		signature_nid = OBJ_obj2nid(x->sig_alg->algorithm);
1805 	if (alg & SSL_kECDH)
1806 		{
1807 		/* key usage, if present, must allow key agreement */
1808 		if (ku_reject(x, X509v3_KU_KEY_AGREEMENT))
1809 			{
1810 			return 0;
1811 			}
1812 		if (alg & SSL_aECDSA)
1813 			{
1814 			/* signature alg must be ECDSA */
1815 			if (signature_nid != NID_ecdsa_with_SHA1)
1816 				{
1817 				return 0;
1818 				}
1819 			}
1820 		if (alg & SSL_aRSA)
1821 			{
1822 			/* signature alg must be RSA */
1823 			if ((signature_nid != NID_md5WithRSAEncryption) &&
1824 			    (signature_nid != NID_md4WithRSAEncryption) &&
1825 			    (signature_nid != NID_md2WithRSAEncryption))
1826 				{
1827 				return 0;
1828 				}
1829 			}
1830 		}
1831 	else if (alg & SSL_aECDSA)
1832 		{
1833 		/* key usage, if present, must allow signing */
1834 		if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE))
1835 			{
1836 			return 0;
1837 			}
1838 		}
1839 
1840 	return 1;  /* all checks are ok */
1841 	}
1842 
1843 /* THIS NEEDS CLEANING UP */
1844 X509 *ssl_get_server_send_cert(SSL *s)
1845 	{
1846 	unsigned long alg,mask,kalg;
1847 	CERT *c;
1848 	int i,is_export;
1849 
1850 	c=s->cert;
1851 	ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
1852 	alg=s->s3->tmp.new_cipher->algorithms;
1853 	is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
1854 	mask=is_export?c->export_mask:c->mask;
1855 	kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1856 
1857 	if (kalg & SSL_kECDH)
1858 		{
1859 		/* we don't need to look at SSL_kECDHE
1860 		 * since no certificate is needed for
1861 		 * anon ECDH and for authenticated
1862 		 * ECDHE, the check for the auth
1863 		 * algorithm will set i correctly
1864 		 * NOTE: For ECDH-RSA, we need an ECC
1865 		 * not an RSA cert but for ECDHE-RSA
1866 		 * we need an RSA cert. Placing the
1867 		 * checks for SSL_kECDH before RSA
1868 		 * checks ensures the correct cert is chosen.
1869 		 */
1870 		i=SSL_PKEY_ECC;
1871 		}
1872 	else if (kalg & SSL_aECDSA)
1873 		{
1874 		i=SSL_PKEY_ECC;
1875 		}
1876 	else if (kalg & SSL_kDHr)
1877 		i=SSL_PKEY_DH_RSA;
1878 	else if (kalg & SSL_kDHd)
1879 		i=SSL_PKEY_DH_DSA;
1880 	else if (kalg & SSL_aDSS)
1881 		i=SSL_PKEY_DSA_SIGN;
1882 	else if (kalg & SSL_aRSA)
1883 		{
1884 		if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL)
1885 			i=SSL_PKEY_RSA_SIGN;
1886 		else
1887 			i=SSL_PKEY_RSA_ENC;
1888 		}
1889 	else if (kalg & SSL_aKRB5)
1890 		{
1891 		/* VRS something else here? */
1892 		return(NULL);
1893 		}
1894 	else /* if (kalg & SSL_aNULL) */
1895 		{
1896 		SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,ERR_R_INTERNAL_ERROR);
1897 		return(NULL);
1898 		}
1899 	if (c->pkeys[i].x509 == NULL) return(NULL);
1900 
1901 	return(c->pkeys[i].x509);
1902 	}
1903 
1904 EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
1905 	{
1906 	unsigned long alg;
1907 	CERT *c;
1908 
1909 	alg=cipher->algorithms;
1910 	c=s->cert;
1911 
1912 	if ((alg & SSL_aDSS) &&
1913 		(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
1914 		return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey);
1915 	else if (alg & SSL_aRSA)
1916 		{
1917 		if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
1918 			return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey);
1919 		else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
1920 			return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey);
1921 		else
1922 			return(NULL);
1923 		}
1924 	else if ((alg & SSL_aECDSA) &&
1925 	         (c->pkeys[SSL_PKEY_ECC].privatekey != NULL))
1926 		return(c->pkeys[SSL_PKEY_ECC].privatekey);
1927 	else /* if (alg & SSL_aNULL) */
1928 		{
1929 		SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
1930 		return(NULL);
1931 		}
1932 	}
1933 
1934 void ssl_update_cache(SSL *s,int mode)
1935 	{
1936 	int i;
1937 
1938 	/* If the session_id_length is 0, we are not supposed to cache it,
1939 	 * and it would be rather hard to do anyway :-) */
1940 	if (s->session->session_id_length == 0) return;
1941 
1942 	i=s->ctx->session_cache_mode;
1943 	if ((i & mode) && (!s->hit)
1944 		&& ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE)
1945 		    || SSL_CTX_add_session(s->ctx,s->session))
1946 		&& (s->ctx->new_session_cb != NULL))
1947 		{
1948 		CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
1949 		if (!s->ctx->new_session_cb(s,s->session))
1950 			SSL_SESSION_free(s->session);
1951 		}
1952 
1953 	/* auto flush every 255 connections */
1954 	if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1955 		((i & mode) == mode))
1956 		{
1957 		if (  (((mode & SSL_SESS_CACHE_CLIENT)
1958 			?s->ctx->stats.sess_connect_good
1959 			:s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
1960 			{
1961 			SSL_CTX_flush_sessions(s->ctx,(unsigned long)time(NULL));
1962 			}
1963 		}
1964 	}
1965 
1966 SSL_METHOD *SSL_get_ssl_method(SSL *s)
1967 	{
1968 	return(s->method);
1969 	}
1970 
1971 int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
1972 	{
1973 	int conn= -1;
1974 	int ret=1;
1975 
1976 	if (s->method != meth)
1977 		{
1978 		if (s->handshake_func != NULL)
1979 			conn=(s->handshake_func == s->method->ssl_connect);
1980 
1981 		if (s->method->version == meth->version)
1982 			s->method=meth;
1983 		else
1984 			{
1985 			s->method->ssl_free(s);
1986 			s->method=meth;
1987 			ret=s->method->ssl_new(s);
1988 			}
1989 
1990 		if (conn == 1)
1991 			s->handshake_func=meth->ssl_connect;
1992 		else if (conn == 0)
1993 			s->handshake_func=meth->ssl_accept;
1994 		}
1995 	return(ret);
1996 	}
1997 
1998 int SSL_get_error(const SSL *s,int i)
1999 	{
2000 	int reason;
2001 	unsigned long l;
2002 	BIO *bio;
2003 
2004 	if (i > 0) return(SSL_ERROR_NONE);
2005 
2006 	/* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
2007 	 * etc, where we do encode the error */
2008 	if ((l=ERR_peek_error()) != 0)
2009 		{
2010 		if (ERR_GET_LIB(l) == ERR_LIB_SYS)
2011 			return(SSL_ERROR_SYSCALL);
2012 		else
2013 			return(SSL_ERROR_SSL);
2014 		}
2015 
2016 	if ((i < 0) && SSL_want_read(s))
2017 		{
2018 		bio=SSL_get_rbio(s);
2019 		if (BIO_should_read(bio))
2020 			return(SSL_ERROR_WANT_READ);
2021 		else if (BIO_should_write(bio))
2022 			/* This one doesn't make too much sense ... We never try
2023 			 * to write to the rbio, and an application program where
2024 			 * rbio and wbio are separate couldn't even know what it
2025 			 * should wait for.
2026 			 * However if we ever set s->rwstate incorrectly
2027 			 * (so that we have SSL_want_read(s) instead of
2028 			 * SSL_want_write(s)) and rbio and wbio *are* the same,
2029 			 * this test works around that bug; so it might be safer
2030 			 * to keep it. */
2031 			return(SSL_ERROR_WANT_WRITE);
2032 		else if (BIO_should_io_special(bio))
2033 			{
2034 			reason=BIO_get_retry_reason(bio);
2035 			if (reason == BIO_RR_CONNECT)
2036 				return(SSL_ERROR_WANT_CONNECT);
2037 			else if (reason == BIO_RR_ACCEPT)
2038 				return(SSL_ERROR_WANT_ACCEPT);
2039 			else
2040 				return(SSL_ERROR_SYSCALL); /* unknown */
2041 			}
2042 		}
2043 
2044 	if ((i < 0) && SSL_want_write(s))
2045 		{
2046 		bio=SSL_get_wbio(s);
2047 		if (BIO_should_write(bio))
2048 			return(SSL_ERROR_WANT_WRITE);
2049 		else if (BIO_should_read(bio))
2050 			/* See above (SSL_want_read(s) with BIO_should_write(bio)) */
2051 			return(SSL_ERROR_WANT_READ);
2052 		else if (BIO_should_io_special(bio))
2053 			{
2054 			reason=BIO_get_retry_reason(bio);
2055 			if (reason == BIO_RR_CONNECT)
2056 				return(SSL_ERROR_WANT_CONNECT);
2057 			else if (reason == BIO_RR_ACCEPT)
2058 				return(SSL_ERROR_WANT_ACCEPT);
2059 			else
2060 				return(SSL_ERROR_SYSCALL);
2061 			}
2062 		}
2063 	if ((i < 0) && SSL_want_x509_lookup(s))
2064 		{
2065 		return(SSL_ERROR_WANT_X509_LOOKUP);
2066 		}
2067 
2068 	if (i == 0)
2069 		{
2070 		if (s->version == SSL2_VERSION)
2071 			{
2072 			/* assume it is the socket being closed */
2073 			return(SSL_ERROR_ZERO_RETURN);
2074 			}
2075 		else
2076 			{
2077 			if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
2078 				(s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
2079 				return(SSL_ERROR_ZERO_RETURN);
2080 			}
2081 		}
2082 	return(SSL_ERROR_SYSCALL);
2083 	}
2084 
2085 int SSL_do_handshake(SSL *s)
2086 	{
2087 	int ret=1;
2088 
2089 	if (s->handshake_func == NULL)
2090 		{
2091 		SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
2092 		return(-1);
2093 		}
2094 
2095 	s->method->ssl_renegotiate_check(s);
2096 
2097 	if (SSL_in_init(s) || SSL_in_before(s))
2098 		{
2099 		ret=s->handshake_func(s);
2100 		}
2101 	return(ret);
2102 	}
2103 
2104 /* For the next 2 functions, SSL_clear() sets shutdown and so
2105  * one of these calls will reset it */
2106 void SSL_set_accept_state(SSL *s)
2107 	{
2108 	s->server=1;
2109 	s->shutdown=0;
2110 	s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
2111 	s->handshake_func=s->method->ssl_accept;
2112 	/* clear the current cipher */
2113 	ssl_clear_cipher_ctx(s);
2114 	}
2115 
2116 void SSL_set_connect_state(SSL *s)
2117 	{
2118 	s->server=0;
2119 	s->shutdown=0;
2120 	s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
2121 	s->handshake_func=s->method->ssl_connect;
2122 	/* clear the current cipher */
2123 	ssl_clear_cipher_ctx(s);
2124 	}
2125 
2126 int ssl_undefined_function(SSL *s)
2127 	{
2128 	SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2129 	return(0);
2130 	}
2131 
2132 int ssl_undefined_void_function(void)
2133 	{
2134 	SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2135 	return(0);
2136 	}
2137 
2138 int ssl_undefined_const_function(const SSL *s)
2139 	{
2140 	SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2141 	return(0);
2142 	}
2143 
2144 SSL_METHOD *ssl_bad_method(int ver)
2145 	{
2146 	SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2147 	return(NULL);
2148 	}
2149 
2150 const char *SSL_get_version(const SSL *s)
2151 	{
2152 	if (s->version == TLS1_VERSION)
2153 		return("TLSv1");
2154 	else if (s->version == SSL3_VERSION)
2155 		return("SSLv3");
2156 	else if (s->version == SSL2_VERSION)
2157 		return("SSLv2");
2158 	else
2159 		return("unknown");
2160 	}
2161 
2162 SSL *SSL_dup(SSL *s)
2163 	{
2164 	STACK_OF(X509_NAME) *sk;
2165 	X509_NAME *xn;
2166 	SSL *ret;
2167 	int i;
2168 
2169 	if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
2170 	    return(NULL);
2171 
2172 	ret->version = s->version;
2173 	ret->type = s->type;
2174 	ret->method = s->method;
2175 
2176 	if (s->session != NULL)
2177 		{
2178 		/* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
2179 		SSL_copy_session_id(ret,s);
2180 		}
2181 	else
2182 		{
2183 		/* No session has been established yet, so we have to expect
2184 		 * that s->cert or ret->cert will be changed later --
2185 		 * they should not both point to the same object,
2186 		 * and thus we can't use SSL_copy_session_id. */
2187 
2188 		ret->method->ssl_free(ret);
2189 		ret->method = s->method;
2190 		ret->method->ssl_new(ret);
2191 
2192 		if (s->cert != NULL)
2193 			{
2194 			if (ret->cert != NULL)
2195 				{
2196 				ssl_cert_free(ret->cert);
2197 				}
2198 			ret->cert = ssl_cert_dup(s->cert);
2199 			if (ret->cert == NULL)
2200 				goto err;
2201 			}
2202 
2203 		SSL_set_session_id_context(ret,
2204 			s->sid_ctx, s->sid_ctx_length);
2205 		}
2206 
2207 	ret->options=s->options;
2208 	ret->mode=s->mode;
2209 	SSL_set_max_cert_list(ret,SSL_get_max_cert_list(s));
2210 	SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
2211 	ret->msg_callback = s->msg_callback;
2212 	ret->msg_callback_arg = s->msg_callback_arg;
2213 	SSL_set_verify(ret,SSL_get_verify_mode(s),
2214 		SSL_get_verify_callback(s));
2215 	SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
2216 	ret->generate_session_id = s->generate_session_id;
2217 
2218 	SSL_set_info_callback(ret,SSL_get_info_callback(s));
2219 
2220 	ret->debug=s->debug;
2221 
2222 	/* copy app data, a little dangerous perhaps */
2223 	if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data))
2224 		goto err;
2225 
2226 	/* setup rbio, and wbio */
2227 	if (s->rbio != NULL)
2228 		{
2229 		if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
2230 			goto err;
2231 		}
2232 	if (s->wbio != NULL)
2233 		{
2234 		if (s->wbio != s->rbio)
2235 			{
2236 			if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
2237 				goto err;
2238 			}
2239 		else
2240 			ret->wbio=ret->rbio;
2241 		}
2242 	ret->rwstate = s->rwstate;
2243 	ret->in_handshake = s->in_handshake;
2244 	ret->handshake_func = s->handshake_func;
2245 	ret->server = s->server;
2246 	ret->new_session = s->new_session;
2247 	ret->quiet_shutdown = s->quiet_shutdown;
2248 	ret->shutdown=s->shutdown;
2249 	ret->state=s->state; /* SSL_dup does not really work at any state, though */
2250 	ret->rstate=s->rstate;
2251 	ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */
2252 	ret->hit=s->hit;
2253 
2254 	X509_VERIFY_PARAM_inherit(ret->param, s->param);
2255 
2256 	/* dup the cipher_list and cipher_list_by_id stacks */
2257 	if (s->cipher_list != NULL)
2258 		{
2259 		if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
2260 			goto err;
2261 		}
2262 	if (s->cipher_list_by_id != NULL)
2263 		if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
2264 			== NULL)
2265 			goto err;
2266 
2267 	/* Dup the client_CA list */
2268 	if (s->client_CA != NULL)
2269 		{
2270 		if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
2271 		ret->client_CA=sk;
2272 		for (i=0; i<sk_X509_NAME_num(sk); i++)
2273 			{
2274 			xn=sk_X509_NAME_value(sk,i);
2275 			if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
2276 				{
2277 				X509_NAME_free(xn);
2278 				goto err;
2279 				}
2280 			}
2281 		}
2282 
2283 	if (0)
2284 		{
2285 err:
2286 		if (ret != NULL) SSL_free(ret);
2287 		ret=NULL;
2288 		}
2289 	return(ret);
2290 	}
2291 
2292 void ssl_clear_cipher_ctx(SSL *s)
2293 	{
2294 	if (s->enc_read_ctx != NULL)
2295 		{
2296 		EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
2297 		OPENSSL_free(s->enc_read_ctx);
2298 		s->enc_read_ctx=NULL;
2299 		}
2300 	if (s->enc_write_ctx != NULL)
2301 		{
2302 		EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
2303 		OPENSSL_free(s->enc_write_ctx);
2304 		s->enc_write_ctx=NULL;
2305 		}
2306 #ifndef OPENSSL_NO_COMP
2307 	if (s->expand != NULL)
2308 		{
2309 		COMP_CTX_free(s->expand);
2310 		s->expand=NULL;
2311 		}
2312 	if (s->compress != NULL)
2313 		{
2314 		COMP_CTX_free(s->compress);
2315 		s->compress=NULL;
2316 		}
2317 #endif
2318 	}
2319 
2320 /* Fix this function so that it takes an optional type parameter */
2321 X509 *SSL_get_certificate(const SSL *s)
2322 	{
2323 	if (s->cert != NULL)
2324 		return(s->cert->key->x509);
2325 	else
2326 		return(NULL);
2327 	}
2328 
2329 /* Fix this function so that it takes an optional type parameter */
2330 EVP_PKEY *SSL_get_privatekey(SSL *s)
2331 	{
2332 	if (s->cert != NULL)
2333 		return(s->cert->key->privatekey);
2334 	else
2335 		return(NULL);
2336 	}
2337 
2338 SSL_CIPHER *SSL_get_current_cipher(const SSL *s)
2339 	{
2340 	if ((s->session != NULL) && (s->session->cipher != NULL))
2341 		return(s->session->cipher);
2342 	return(NULL);
2343 	}
2344 #ifdef OPENSSL_NO_COMP
2345 const void *SSL_get_current_compression(SSL *s)
2346 	{
2347 	return NULL;
2348 	}
2349 const void *SSL_get_current_expansion(SSL *s)
2350 	{
2351 	return NULL;
2352 	}
2353 #else
2354 
2355 const COMP_METHOD *SSL_get_current_compression(SSL *s)
2356 	{
2357 	if (s->compress != NULL)
2358 		return(s->compress->meth);
2359 	return(NULL);
2360 	}
2361 
2362 const COMP_METHOD *SSL_get_current_expansion(SSL *s)
2363 	{
2364 	if (s->expand != NULL)
2365 		return(s->expand->meth);
2366 	return(NULL);
2367 	}
2368 #endif
2369 
2370 int ssl_init_wbio_buffer(SSL *s,int push)
2371 	{
2372 	BIO *bbio;
2373 
2374 	if (s->bbio == NULL)
2375 		{
2376 		bbio=BIO_new(BIO_f_buffer());
2377 		if (bbio == NULL) return(0);
2378 		s->bbio=bbio;
2379 		}
2380 	else
2381 		{
2382 		bbio=s->bbio;
2383 		if (s->bbio == s->wbio)
2384 			s->wbio=BIO_pop(s->wbio);
2385 		}
2386 	(void)BIO_reset(bbio);
2387 /*	if (!BIO_set_write_buffer_size(bbio,16*1024)) */
2388 	if (!BIO_set_read_buffer_size(bbio,1))
2389 		{
2390 		SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
2391 		return(0);
2392 		}
2393 	if (push)
2394 		{
2395 		if (s->wbio != bbio)
2396 			s->wbio=BIO_push(bbio,s->wbio);
2397 		}
2398 	else
2399 		{
2400 		if (s->wbio == bbio)
2401 			s->wbio=BIO_pop(bbio);
2402 		}
2403 	return(1);
2404 	}
2405 
2406 void ssl_free_wbio_buffer(SSL *s)
2407 	{
2408 	if (s->bbio == NULL) return;
2409 
2410 	if (s->bbio == s->wbio)
2411 		{
2412 		/* remove buffering */
2413 		s->wbio=BIO_pop(s->wbio);
2414 #ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
2415 		assert(s->wbio != NULL);
2416 #endif
2417 	}
2418 	BIO_free(s->bbio);
2419 	s->bbio=NULL;
2420 	}
2421 
2422 void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
2423 	{
2424 	ctx->quiet_shutdown=mode;
2425 	}
2426 
2427 int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx)
2428 	{
2429 	return(ctx->quiet_shutdown);
2430 	}
2431 
2432 void SSL_set_quiet_shutdown(SSL *s,int mode)
2433 	{
2434 	s->quiet_shutdown=mode;
2435 	}
2436 
2437 int SSL_get_quiet_shutdown(const SSL *s)
2438 	{
2439 	return(s->quiet_shutdown);
2440 	}
2441 
2442 void SSL_set_shutdown(SSL *s,int mode)
2443 	{
2444 	s->shutdown=mode;
2445 	}
2446 
2447 int SSL_get_shutdown(const SSL *s)
2448 	{
2449 	return(s->shutdown);
2450 	}
2451 
2452 int SSL_version(const SSL *s)
2453 	{
2454 	return(s->version);
2455 	}
2456 
2457 SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl)
2458 	{
2459 	return(ssl->ctx);
2460 	}
2461 
2462 SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx)
2463 	{
2464 	if (ssl->ctx == ctx)
2465 		return ssl->ctx;
2466 #ifndef OPENSSL_NO_TLSEXT
2467 	if (ctx == NULL)
2468 		ctx = ssl->initial_ctx;
2469 #endif
2470 	if (ssl->cert != NULL)
2471 		ssl_cert_free(ssl->cert);
2472 	ssl->cert = ssl_cert_dup(ctx->cert);
2473 	CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
2474 	if (ssl->ctx != NULL)
2475 		SSL_CTX_free(ssl->ctx); /* decrement reference count */
2476 	ssl->ctx = ctx;
2477 	return(ssl->ctx);
2478 	}
2479 
2480 #ifndef OPENSSL_NO_STDIO
2481 int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
2482 	{
2483 	return(X509_STORE_set_default_paths(ctx->cert_store));
2484 	}
2485 
2486 int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
2487 		const char *CApath)
2488 	{
2489 	return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
2490 	}
2491 #endif
2492 
2493 void SSL_set_info_callback(SSL *ssl,
2494 	void (*cb)(const SSL *ssl,int type,int val))
2495 	{
2496 	ssl->info_callback=cb;
2497 	}
2498 
2499 /* One compiler (Diab DCC) doesn't like argument names in returned
2500    function pointer.  */
2501 void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/)
2502 	{
2503 	return ssl->info_callback;
2504 	}
2505 
2506 int SSL_state(const SSL *ssl)
2507 	{
2508 	return(ssl->state);
2509 	}
2510 
2511 void SSL_set_verify_result(SSL *ssl,long arg)
2512 	{
2513 	ssl->verify_result=arg;
2514 	}
2515 
2516 long SSL_get_verify_result(const SSL *ssl)
2517 	{
2518 	return(ssl->verify_result);
2519 	}
2520 
2521 int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2522 			 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2523 	{
2524 	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp,
2525 				new_func, dup_func, free_func);
2526 	}
2527 
2528 int SSL_set_ex_data(SSL *s,int idx,void *arg)
2529 	{
2530 	return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2531 	}
2532 
2533 void *SSL_get_ex_data(const SSL *s,int idx)
2534 	{
2535 	return(CRYPTO_get_ex_data(&s->ex_data,idx));
2536 	}
2537 
2538 int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2539 			     CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2540 	{
2541 	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp,
2542 				new_func, dup_func, free_func);
2543 	}
2544 
2545 int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
2546 	{
2547 	return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2548 	}
2549 
2550 void *SSL_CTX_get_ex_data(const SSL_CTX *s,int idx)
2551 	{
2552 	return(CRYPTO_get_ex_data(&s->ex_data,idx));
2553 	}
2554 
2555 int ssl_ok(SSL *s)
2556 	{
2557 	return(1);
2558 	}
2559 
2560 X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx)
2561 	{
2562 	return(ctx->cert_store);
2563 	}
2564 
2565 void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
2566 	{
2567 	if (ctx->cert_store != NULL)
2568 		X509_STORE_free(ctx->cert_store);
2569 	ctx->cert_store=store;
2570 	}
2571 
2572 int SSL_want(const SSL *s)
2573 	{
2574 	return(s->rwstate);
2575 	}
2576 
2577 /*!
2578  * \brief Set the callback for generating temporary RSA keys.
2579  * \param ctx the SSL context.
2580  * \param cb the callback
2581  */
2582 
2583 #ifndef OPENSSL_NO_RSA
2584 void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
2585 							  int is_export,
2586 							  int keylength))
2587     {
2588     SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb);
2589     }
2590 
2591 void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
2592 						  int is_export,
2593 						  int keylength))
2594     {
2595     SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb);
2596     }
2597 #endif
2598 
2599 #ifdef DOXYGEN
2600 /*!
2601  * \brief The RSA temporary key callback function.
2602  * \param ssl the SSL session.
2603  * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
2604  * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
2605  * of the required key in bits.
2606  * \return the temporary RSA key.
2607  * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
2608  */
2609 
2610 RSA *cb(SSL *ssl,int is_export,int keylength)
2611     {}
2612 #endif
2613 
2614 /*!
2615  * \brief Set the callback for generating temporary DH keys.
2616  * \param ctx the SSL context.
2617  * \param dh the callback
2618  */
2619 
2620 #ifndef OPENSSL_NO_DH
2621 void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
2622 							int keylength))
2623 	{
2624 	SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh);
2625 	}
2626 
2627 void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
2628 						int keylength))
2629 	{
2630 	SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh);
2631 	}
2632 #endif
2633 
2634 #ifndef OPENSSL_NO_ECDH
2635 void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx,EC_KEY *(*ecdh)(SSL *ssl,int is_export,
2636 							int keylength))
2637 	{
2638 	SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh);
2639 	}
2640 
2641 void SSL_set_tmp_ecdh_callback(SSL *ssl,EC_KEY *(*ecdh)(SSL *ssl,int is_export,
2642 						int keylength))
2643 	{
2644 	SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh);
2645 	}
2646 #endif
2647 
2648 
2649 void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
2650 	{
2651 	SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
2652 	}
2653 void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
2654 	{
2655 	SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
2656 	}
2657 
2658 
2659 
2660 #if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
2661 #include "../crypto/bio/bss_file.c"
2662 #endif
2663 
2664 IMPLEMENT_STACK_OF(SSL_CIPHER)
2665 IMPLEMENT_STACK_OF(SSL_COMP)
2666