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