• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SSL_clear(SSL * s)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 */
SSL_CTX_set_ssl_version(SSL_CTX * ctx,SSL_METHOD * meth)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 
SSL_new(SSL_CTX * ctx)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 
SSL_CTX_set_session_id_context(SSL_CTX * ctx,const unsigned char * sid_ctx,unsigned int sid_ctx_len)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 
SSL_set_session_id_context(SSL * ssl,const unsigned char * sid_ctx,unsigned int sid_ctx_len)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 
SSL_CTX_set_generate_session_id(SSL_CTX * ctx,GEN_SESSION_CB cb)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 
SSL_set_generate_session_id(SSL * ssl,GEN_SESSION_CB cb)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 
SSL_has_matching_session_id(const SSL * ssl,const unsigned char * id,unsigned int id_len)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 
SSL_CTX_set_purpose(SSL_CTX * s,int purpose)430 int SSL_CTX_set_purpose(SSL_CTX *s, int purpose)
431 	{
432 	return X509_VERIFY_PARAM_set_purpose(s->param, purpose);
433 	}
434 
SSL_set_purpose(SSL * s,int purpose)435 int SSL_set_purpose(SSL *s, int purpose)
436 	{
437 	return X509_VERIFY_PARAM_set_purpose(s->param, purpose);
438 	}
439 
SSL_CTX_set_trust(SSL_CTX * s,int trust)440 int SSL_CTX_set_trust(SSL_CTX *s, int trust)
441 	{
442 	return X509_VERIFY_PARAM_set_trust(s->param, trust);
443 	}
444 
SSL_set_trust(SSL * s,int trust)445 int SSL_set_trust(SSL *s, int trust)
446 	{
447 	return X509_VERIFY_PARAM_set_trust(s->param, trust);
448 	}
449 
SSL_free(SSL * s)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 
SSL_set_bio(SSL * s,BIO * rbio,BIO * wbio)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 
SSL_get_rbio(const SSL * s)552 BIO *SSL_get_rbio(const SSL *s)
553 	{ return(s->rbio); }
554 
SSL_get_wbio(const SSL * s)555 BIO *SSL_get_wbio(const SSL *s)
556 	{ return(s->wbio); }
557 
SSL_get_fd(const SSL * s)558 int SSL_get_fd(const SSL *s)
559 	{
560 	return(SSL_get_rfd(s));
561 	}
562 
SSL_get_rfd(const SSL * s)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 
SSL_get_wfd(const SSL * s)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
SSL_set_fd(SSL * s,int fd)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 
SSL_set_wfd(SSL * s,int fd)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 
SSL_set_rfd(SSL * s,int fd)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' */
SSL_get_finished(const SSL * s,void * buf,size_t count)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' */
SSL_get_peer_finished(const SSL * s,void * buf,size_t count)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 
SSL_get_verify_mode(const SSL * s)687 int SSL_get_verify_mode(const SSL *s)
688 	{
689 	return(s->verify_mode);
690 	}
691 
SSL_get_verify_depth(const SSL * s)692 int SSL_get_verify_depth(const SSL *s)
693 	{
694 	return X509_VERIFY_PARAM_get_depth(s->param);
695 	}
696 
SSL_get_verify_callback(const SSL * s)697 int (*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *)
698 	{
699 	return(s->verify_callback);
700 	}
701 
SSL_CTX_get_verify_mode(const SSL_CTX * ctx)702 int SSL_CTX_get_verify_mode(const SSL_CTX *ctx)
703 	{
704 	return(ctx->verify_mode);
705 	}
706 
SSL_CTX_get_verify_depth(const SSL_CTX * ctx)707 int SSL_CTX_get_verify_depth(const SSL_CTX *ctx)
708 	{
709 	return X509_VERIFY_PARAM_get_depth(ctx->param);
710 	}
711 
SSL_CTX_get_verify_callback(const SSL_CTX * ctx)712 int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *)
713 	{
714 	return(ctx->default_verify_callback);
715 	}
716 
SSL_set_verify(SSL * s,int mode,int (* callback)(int ok,X509_STORE_CTX * ctx))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 
SSL_set_verify_depth(SSL * s,int depth)725 void SSL_set_verify_depth(SSL *s,int depth)
726 	{
727 	X509_VERIFY_PARAM_set_depth(s->param, depth);
728 	}
729 
SSL_set_read_ahead(SSL * s,int yes)730 void SSL_set_read_ahead(SSL *s,int yes)
731 	{
732 	s->read_ahead=yes;
733 	}
734 
SSL_get_read_ahead(const SSL * s)735 int SSL_get_read_ahead(const SSL *s)
736 	{
737 	return(s->read_ahead);
738 	}
739 
SSL_pending(const SSL * s)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 
SSL_get_peer_certificate(const SSL * s)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 
STACK_OF(X509)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 */
SSL_copy_session_id(SSL * t,const SSL * f)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 */
SSL_CTX_check_private_key(const SSL_CTX * ctx)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 */
SSL_check_private_key(const SSL * ssl)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 
SSL_accept(SSL * s)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 
SSL_connect(SSL * s)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 
SSL_get_default_timeout(const SSL * s)876 long SSL_get_default_timeout(const SSL *s)
877 	{
878 	return(s->method->get_timeout());
879 	}
880 
SSL_read(SSL * s,void * buf,int num)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 
SSL_peek(SSL * s,void * buf,int num)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 
SSL_write(SSL * s,const void * buf,int num)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 
SSL_shutdown(SSL * s)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 
SSL_renegotiate(SSL * s)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 
SSL_renegotiate_pending(SSL * s)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 
SSL_ctrl(SSL * s,int cmd,long larg,void * parg)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 
SSL_callback_ctrl(SSL * s,int cmd,void (* fp)(void))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 
SSL_CTX_sessions(SSL_CTX * ctx)1017 struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)
1018 	{
1019 	return ctx->sessions;
1020 	}
1021 
SSL_CTX_ctrl(SSL_CTX * ctx,int cmd,long larg,void * parg)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 
SSL_CTX_callback_ctrl(SSL_CTX * ctx,int cmd,void (* fp)(void))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 
ssl_cipher_id_cmp(const SSL_CIPHER * a,const SSL_CIPHER * b)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 
ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const * ap,const SSL_CIPHER * const * bp)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 */
STACK_OF(SSL_CIPHER)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 */
STACK_OF(SSL_CIPHER)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() */
SSL_get_cipher_list(const SSL * s,int n)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 */
SSL_CTX_set_cipher_list(SSL_CTX * ctx,const char * str)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 */
SSL_set_cipher_list(SSL * s,const char * str)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 */
SSL_get_shared_ciphers(const SSL * s,char * buf,int len)1224 char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
1225 	{
1226 	char *p;
1227 	STACK_OF(SSL_CIPHER) *sk;
1228 	SSL_CIPHER *c;
1229 	int i;
1230 
1231 	if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1232 		(len < 2))
1233 		return(NULL);
1234 
1235 	p=buf;
1236 	sk=s->session->ciphers;
1237 	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1238 		{
1239 		int n;
1240 
1241 		c=sk_SSL_CIPHER_value(sk,i);
1242 		n=strlen(c->name);
1243 		if (n+1 > len)
1244 			{
1245 			if (p != buf)
1246 				--p;
1247 			*p='\0';
1248 			return buf;
1249 			}
1250 		strcpy(p,c->name);
1251 		p+=n;
1252 		*(p++)=':';
1253 		len-=n+1;
1254 		}
1255 	p[-1]='\0';
1256 	return(buf);
1257 	}
1258 
ssl_cipher_list_to_bytes(SSL * s,STACK_OF (SSL_CIPHER)* sk,unsigned char * p,int (* put_cb)(const SSL_CIPHER *,unsigned char *))1259 int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p,
1260                              int (*put_cb)(const SSL_CIPHER *, unsigned char *))
1261 	{
1262 	int i,j=0;
1263 	SSL_CIPHER *c;
1264 	unsigned char *q;
1265 #ifndef OPENSSL_NO_KRB5
1266         int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx);
1267 #endif /* OPENSSL_NO_KRB5 */
1268 
1269 	if (sk == NULL) return(0);
1270 	q=p;
1271 
1272 	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1273 		{
1274 		c=sk_SSL_CIPHER_value(sk,i);
1275 #ifndef OPENSSL_NO_KRB5
1276                 if ((c->algorithms & SSL_KRB5) && nokrb5)
1277                     continue;
1278 #endif /* OPENSSL_NO_KRB5 */
1279 
1280 		j = put_cb ? put_cb(c,p) : ssl_put_cipher_by_char(s,c,p);
1281 		p+=j;
1282 		}
1283 	return(p-q);
1284 	}
1285 
STACK_OF(SSL_CIPHER)1286 STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
1287 					       STACK_OF(SSL_CIPHER) **skp)
1288 	{
1289 	SSL_CIPHER *c;
1290 	STACK_OF(SSL_CIPHER) *sk;
1291 	int i,n;
1292 
1293 	n=ssl_put_cipher_by_char(s,NULL,NULL);
1294 	if ((num%n) != 0)
1295 		{
1296 		SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST);
1297 		return(NULL);
1298 		}
1299 	if ((skp == NULL) || (*skp == NULL))
1300 		sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
1301 	else
1302 		{
1303 		sk= *skp;
1304 		sk_SSL_CIPHER_zero(sk);
1305 		}
1306 
1307 	for (i=0; i<num; i+=n)
1308 		{
1309 		c=ssl_get_cipher_by_char(s,p);
1310 		p+=n;
1311 		if (c != NULL)
1312 			{
1313 			if (!sk_SSL_CIPHER_push(sk,c))
1314 				{
1315 				SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
1316 				goto err;
1317 				}
1318 			}
1319 		}
1320 
1321 	if (skp != NULL)
1322 		*skp=sk;
1323 	return(sk);
1324 err:
1325 	if ((skp == NULL) || (*skp == NULL))
1326 		sk_SSL_CIPHER_free(sk);
1327 	return(NULL);
1328 	}
1329 
1330 #ifndef OPENSSL_NO_TLSEXT
1331 /** return a servername extension value if provided in Client Hello, or NULL.
1332  * So far, only host_name types are defined (RFC 3546).
1333  */
1334 
SSL_get_servername(const SSL * s,const int type)1335 const char *SSL_get_servername(const SSL *s, const int type)
1336 	{
1337 	if (type != TLSEXT_NAMETYPE_host_name)
1338 		return NULL;
1339 
1340 	return s->session && !s->tlsext_hostname ?
1341 		s->session->tlsext_hostname :
1342 		s->tlsext_hostname;
1343 	}
1344 
SSL_get_servername_type(const SSL * s)1345 int SSL_get_servername_type(const SSL *s)
1346 	{
1347 	if (s->session && (!s->tlsext_hostname ? s->session->tlsext_hostname : s->tlsext_hostname))
1348 		return TLSEXT_NAMETYPE_host_name;
1349 	return -1;
1350 	}
1351 #endif
1352 
SSL_SESSION_hash(const SSL_SESSION * a)1353 unsigned long SSL_SESSION_hash(const SSL_SESSION *a)
1354 	{
1355 	unsigned long l;
1356 
1357 	l=(unsigned long)
1358 		((unsigned int) a->session_id[0]     )|
1359 		((unsigned int) a->session_id[1]<< 8L)|
1360 		((unsigned long)a->session_id[2]<<16L)|
1361 		((unsigned long)a->session_id[3]<<24L);
1362 	return(l);
1363 	}
1364 
1365 /* NB: If this function (or indeed the hash function which uses a sort of
1366  * coarser function than this one) is changed, ensure
1367  * SSL_CTX_has_matching_session_id() is checked accordingly. It relies on being
1368  * able to construct an SSL_SESSION that will collide with any existing session
1369  * with a matching session ID. */
SSL_SESSION_cmp(const SSL_SESSION * a,const SSL_SESSION * b)1370 int SSL_SESSION_cmp(const SSL_SESSION *a,const SSL_SESSION *b)
1371 	{
1372 	if (a->ssl_version != b->ssl_version)
1373 		return(1);
1374 	if (a->session_id_length != b->session_id_length)
1375 		return(1);
1376 	return(memcmp(a->session_id,b->session_id,a->session_id_length));
1377 	}
1378 
1379 /* These wrapper functions should remain rather than redeclaring
1380  * SSL_SESSION_hash and SSL_SESSION_cmp for void* types and casting each
1381  * variable. The reason is that the functions aren't static, they're exposed via
1382  * ssl.h. */
IMPLEMENT_LHASH_HASH_FN(SSL_SESSION_hash,SSL_SESSION *)1383 static IMPLEMENT_LHASH_HASH_FN(SSL_SESSION_hash, SSL_SESSION *)
1384 static IMPLEMENT_LHASH_COMP_FN(SSL_SESSION_cmp, SSL_SESSION *)
1385 
1386 SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)
1387 	{
1388 	SSL_CTX *ret=NULL;
1389 
1390 	if (meth == NULL)
1391 		{
1392 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);
1393 		return(NULL);
1394 		}
1395 
1396 	if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0)
1397 		{
1398 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);
1399 		goto err;
1400 		}
1401 	ret=(SSL_CTX *)OPENSSL_malloc(sizeof(SSL_CTX));
1402 	if (ret == NULL)
1403 		goto err;
1404 
1405 	memset(ret,0,sizeof(SSL_CTX));
1406 
1407 	ret->method=meth;
1408 
1409 	ret->cert_store=NULL;
1410 	ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
1411 	ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
1412 	ret->session_cache_head=NULL;
1413 	ret->session_cache_tail=NULL;
1414 
1415 	/* We take the system default */
1416 	ret->session_timeout=meth->get_timeout();
1417 
1418 	ret->new_session_cb=0;
1419 	ret->remove_session_cb=0;
1420 	ret->get_session_cb=0;
1421 	ret->generate_session_id=0;
1422 
1423 	memset((char *)&ret->stats,0,sizeof(ret->stats));
1424 
1425 	ret->references=1;
1426 	ret->quiet_shutdown=0;
1427 
1428 /*	ret->cipher=NULL;*/
1429 /*	ret->s2->challenge=NULL;
1430 	ret->master_key=NULL;
1431 	ret->key_arg=NULL;
1432 	ret->s2->conn_id=NULL; */
1433 
1434 	ret->info_callback=NULL;
1435 
1436 	ret->app_verify_callback=0;
1437 	ret->app_verify_arg=NULL;
1438 
1439 	ret->max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;
1440 	ret->read_ahead=0;
1441 	ret->msg_callback=0;
1442 	ret->msg_callback_arg=NULL;
1443 	ret->verify_mode=SSL_VERIFY_NONE;
1444 #if 0
1445 	ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */
1446 #endif
1447 	ret->sid_ctx_length=0;
1448 	ret->default_verify_callback=NULL;
1449 	if ((ret->cert=ssl_cert_new()) == NULL)
1450 		goto err;
1451 
1452 	ret->default_passwd_callback=0;
1453 	ret->default_passwd_callback_userdata=NULL;
1454 	ret->client_cert_cb=0;
1455 	ret->app_gen_cookie_cb=0;
1456 	ret->app_verify_cookie_cb=0;
1457 
1458 	ret->sessions=lh_new(LHASH_HASH_FN(SSL_SESSION_hash),
1459 			LHASH_COMP_FN(SSL_SESSION_cmp));
1460 	if (ret->sessions == NULL) goto err;
1461 	ret->cert_store=X509_STORE_new();
1462 	if (ret->cert_store == NULL) goto err;
1463 
1464 	ssl_create_cipher_list(ret->method,
1465 		&ret->cipher_list,&ret->cipher_list_by_id,
1466 		SSL_DEFAULT_CIPHER_LIST);
1467 	if (ret->cipher_list == NULL
1468 	    || sk_SSL_CIPHER_num(ret->cipher_list) <= 0)
1469 		{
1470 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);
1471 		goto err2;
1472 		}
1473 
1474 	ret->param = X509_VERIFY_PARAM_new();
1475 	if (!ret->param)
1476 		goto err;
1477 
1478 	if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL)
1479 		{
1480 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);
1481 		goto err2;
1482 		}
1483 	if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL)
1484 		{
1485 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);
1486 		goto err2;
1487 		}
1488 	if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL)
1489 		{
1490 		SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);
1491 		goto err2;
1492 		}
1493 
1494 	if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL)
1495 		goto err;
1496 
1497 	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data);
1498 
1499 	ret->extra_certs=NULL;
1500 	ret->comp_methods=SSL_COMP_get_compression_methods();
1501 
1502 #ifndef OPENSSL_NO_TLSEXT
1503 	ret->tlsext_servername_callback = 0;
1504 	ret->tlsext_servername_arg = NULL;
1505 	/* Setup RFC4507 ticket keys */
1506 	if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0)
1507 		|| (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0)
1508 		|| (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0))
1509 		ret->options |= SSL_OP_NO_TICKET;
1510 
1511 	ret->tlsext_status_cb = 0;
1512 	ret->tlsext_status_arg = NULL;
1513 
1514 #endif
1515 
1516 	return(ret);
1517 err:
1518 	SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);
1519 err2:
1520 	if (ret != NULL) SSL_CTX_free(ret);
1521 	return(NULL);
1522 	}
1523 
1524 #if 0
1525 static void SSL_COMP_free(SSL_COMP *comp)
1526     { OPENSSL_free(comp); }
1527 #endif
1528 
SSL_CTX_free(SSL_CTX * a)1529 void SSL_CTX_free(SSL_CTX *a)
1530 	{
1531 	int i;
1532 
1533 	if (a == NULL) return;
1534 
1535 	i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX);
1536 #ifdef REF_PRINT
1537 	REF_PRINT("SSL_CTX",a);
1538 #endif
1539 	if (i > 0) return;
1540 #ifdef REF_CHECK
1541 	if (i < 0)
1542 		{
1543 		fprintf(stderr,"SSL_CTX_free, bad reference count\n");
1544 		abort(); /* ok */
1545 		}
1546 #endif
1547 
1548 	if (a->param)
1549 		X509_VERIFY_PARAM_free(a->param);
1550 
1551 	/*
1552 	 * Free internal session cache. However: the remove_cb() may reference
1553 	 * the ex_data of SSL_CTX, thus the ex_data store can only be removed
1554 	 * after the sessions were flushed.
1555 	 * As the ex_data handling routines might also touch the session cache,
1556 	 * the most secure solution seems to be: empty (flush) the cache, then
1557 	 * free ex_data, then finally free the cache.
1558 	 * (See ticket [openssl.org #212].)
1559 	 */
1560 	if (a->sessions != NULL)
1561 		SSL_CTX_flush_sessions(a,0);
1562 
1563 	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data);
1564 
1565 	if (a->sessions != NULL)
1566 		lh_free(a->sessions);
1567 
1568 	if (a->cert_store != NULL)
1569 		X509_STORE_free(a->cert_store);
1570 	if (a->cipher_list != NULL)
1571 		sk_SSL_CIPHER_free(a->cipher_list);
1572 	if (a->cipher_list_by_id != NULL)
1573 		sk_SSL_CIPHER_free(a->cipher_list_by_id);
1574 	if (a->cert != NULL)
1575 		ssl_cert_free(a->cert);
1576 	if (a->client_CA != NULL)
1577 		sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free);
1578 	if (a->extra_certs != NULL)
1579 		sk_X509_pop_free(a->extra_certs,X509_free);
1580 #if 0 /* This should never be done, since it removes a global database */
1581 	if (a->comp_methods != NULL)
1582 		sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free);
1583 #else
1584 	a->comp_methods = NULL;
1585 #endif
1586 	OPENSSL_free(a);
1587 	}
1588 
SSL_CTX_set_default_passwd_cb(SSL_CTX * ctx,pem_password_cb * cb)1589 void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
1590 	{
1591 	ctx->default_passwd_callback=cb;
1592 	}
1593 
SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX * ctx,void * u)1594 void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
1595 	{
1596 	ctx->default_passwd_callback_userdata=u;
1597 	}
1598 
SSL_CTX_set_cert_verify_callback(SSL_CTX * ctx,int (* cb)(X509_STORE_CTX *,void *),void * arg)1599 void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg)
1600 	{
1601 	ctx->app_verify_callback=cb;
1602 	ctx->app_verify_arg=arg;
1603 	}
1604 
SSL_CTX_set_verify(SSL_CTX * ctx,int mode,int (* cb)(int,X509_STORE_CTX *))1605 void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *))
1606 	{
1607 	ctx->verify_mode=mode;
1608 	ctx->default_verify_callback=cb;
1609 	}
1610 
SSL_CTX_set_verify_depth(SSL_CTX * ctx,int depth)1611 void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth)
1612 	{
1613 	X509_VERIFY_PARAM_set_depth(ctx->param, depth);
1614 	}
1615 
ssl_set_cert_masks(CERT * c,SSL_CIPHER * cipher)1616 void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher)
1617 	{
1618 	CERT_PKEY *cpk;
1619 	int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign;
1620 	int rsa_enc_export,dh_rsa_export,dh_dsa_export;
1621 	int rsa_tmp_export,dh_tmp_export,kl;
1622 	unsigned long mask,emask;
1623 	int have_ecc_cert, ecdh_ok, ecdsa_ok, ecc_pkey_size;
1624 #ifndef OPENSSL_NO_ECDH
1625 	int have_ecdh_tmp;
1626 #endif
1627 	X509 *x = NULL;
1628 	EVP_PKEY *ecc_pkey = NULL;
1629 	int signature_nid = 0;
1630 
1631 	if (c == NULL) return;
1632 
1633 	kl=SSL_C_EXPORT_PKEYLENGTH(cipher);
1634 
1635 #ifndef OPENSSL_NO_RSA
1636 	rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL);
1637 	rsa_tmp_export=(c->rsa_tmp_cb != NULL ||
1638 		(rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl));
1639 #else
1640 	rsa_tmp=rsa_tmp_export=0;
1641 #endif
1642 #ifndef OPENSSL_NO_DH
1643 	dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL);
1644 	dh_tmp_export=(c->dh_tmp_cb != NULL ||
1645 		(dh_tmp && DH_size(c->dh_tmp)*8 <= kl));
1646 #else
1647 	dh_tmp=dh_tmp_export=0;
1648 #endif
1649 
1650 #ifndef OPENSSL_NO_ECDH
1651 	have_ecdh_tmp=(c->ecdh_tmp != NULL || c->ecdh_tmp_cb != NULL);
1652 #endif
1653 	cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]);
1654 	rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL);
1655 	rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1656 	cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]);
1657 	rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1658 	cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]);
1659 	dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL);
1660 	cpk= &(c->pkeys[SSL_PKEY_DH_RSA]);
1661 	dh_rsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1662 	dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1663 	cpk= &(c->pkeys[SSL_PKEY_DH_DSA]);
1664 /* FIX THIS EAY EAY EAY */
1665 	dh_dsa=  (cpk->x509 != NULL && cpk->privatekey != NULL);
1666 	dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl);
1667 	cpk= &(c->pkeys[SSL_PKEY_ECC]);
1668 	have_ecc_cert= (cpk->x509 != NULL && cpk->privatekey != NULL);
1669 	mask=0;
1670 	emask=0;
1671 
1672 #ifdef CIPHER_DEBUG
1673 	printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n",
1674 		rsa_tmp,rsa_tmp_export,dh_tmp,
1675 		rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa);
1676 #endif
1677 
1678 	if (rsa_enc || (rsa_tmp && rsa_sign))
1679 		mask|=SSL_kRSA;
1680 	if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc)))
1681 		emask|=SSL_kRSA;
1682 
1683 #if 0
1684 	/* The match needs to be both kEDH and aRSA or aDSA, so don't worry */
1685 	if (	(dh_tmp || dh_rsa || dh_dsa) &&
1686 		(rsa_enc || rsa_sign || dsa_sign))
1687 		mask|=SSL_kEDH;
1688 	if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) &&
1689 		(rsa_enc || rsa_sign || dsa_sign))
1690 		emask|=SSL_kEDH;
1691 #endif
1692 
1693 	if (dh_tmp_export)
1694 		emask|=SSL_kEDH;
1695 
1696 	if (dh_tmp)
1697 		mask|=SSL_kEDH;
1698 
1699 	if (dh_rsa) mask|=SSL_kDHr;
1700 	if (dh_rsa_export) emask|=SSL_kDHr;
1701 
1702 	if (dh_dsa) mask|=SSL_kDHd;
1703 	if (dh_dsa_export) emask|=SSL_kDHd;
1704 
1705 	if (rsa_enc || rsa_sign)
1706 		{
1707 		mask|=SSL_aRSA;
1708 		emask|=SSL_aRSA;
1709 		}
1710 
1711 	if (dsa_sign)
1712 		{
1713 		mask|=SSL_aDSS;
1714 		emask|=SSL_aDSS;
1715 		}
1716 
1717 	mask|=SSL_aNULL;
1718 	emask|=SSL_aNULL;
1719 
1720 #ifndef OPENSSL_NO_KRB5
1721 	mask|=SSL_kKRB5|SSL_aKRB5;
1722 	emask|=SSL_kKRB5|SSL_aKRB5;
1723 #endif
1724 
1725 	/* An ECC certificate may be usable for ECDH and/or
1726 	 * ECDSA cipher suites depending on the key usage extension.
1727 	 */
1728 	if (have_ecc_cert)
1729 		{
1730                 /* This call populates extension flags (ex_flags) */
1731 		x = (c->pkeys[SSL_PKEY_ECC]).x509;
1732 		X509_check_purpose(x, -1, 0);
1733 		ecdh_ok = (x->ex_flags & EXFLAG_KUSAGE) ?
1734 		    (x->ex_kusage & X509v3_KU_KEY_AGREEMENT) : 1;
1735 		ecdsa_ok = (x->ex_flags & EXFLAG_KUSAGE) ?
1736 		    (x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE) : 1;
1737 		ecc_pkey = X509_get_pubkey(x);
1738 		ecc_pkey_size = (ecc_pkey != NULL) ?
1739 		    EVP_PKEY_bits(ecc_pkey) : 0;
1740 		EVP_PKEY_free(ecc_pkey);
1741 		if ((x->sig_alg) && (x->sig_alg->algorithm))
1742 			signature_nid = OBJ_obj2nid(x->sig_alg->algorithm);
1743 #ifndef OPENSSL_NO_ECDH
1744 		if (ecdh_ok)
1745 			{
1746 			if ((signature_nid == NID_md5WithRSAEncryption) ||
1747 			    (signature_nid == NID_md4WithRSAEncryption) ||
1748 			    (signature_nid == NID_md2WithRSAEncryption))
1749 				{
1750 				mask|=SSL_kECDH|SSL_aRSA;
1751 				if (ecc_pkey_size <= 163)
1752 					emask|=SSL_kECDH|SSL_aRSA;
1753 				}
1754 			if (signature_nid == NID_ecdsa_with_SHA1)
1755 				{
1756 				mask|=SSL_kECDH|SSL_aECDSA;
1757 				if (ecc_pkey_size <= 163)
1758 					emask|=SSL_kECDH|SSL_aECDSA;
1759 				}
1760 			}
1761 #endif
1762 #ifndef OPENSSL_NO_ECDSA
1763 		if (ecdsa_ok)
1764 			{
1765 			mask|=SSL_aECDSA;
1766 			emask|=SSL_aECDSA;
1767 			}
1768 #endif
1769 		}
1770 
1771 #ifndef OPENSSL_NO_ECDH
1772 	if (have_ecdh_tmp)
1773 		{
1774 		mask|=SSL_kECDHE;
1775 		emask|=SSL_kECDHE;
1776 		}
1777 #endif
1778 	c->mask=mask;
1779 	c->export_mask=emask;
1780 	c->valid=1;
1781 	}
1782 
1783 /* This handy macro borrowed from crypto/x509v3/v3_purp.c */
1784 #define ku_reject(x, usage) \
1785 	(((x)->ex_flags & EXFLAG_KUSAGE) && !((x)->ex_kusage & (usage)))
1786 
check_srvr_ecc_cert_and_alg(X509 * x,SSL_CIPHER * cs)1787 int check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs)
1788 	{
1789 	unsigned long alg = cs->algorithms;
1790 	EVP_PKEY *pkey = NULL;
1791 	int keysize = 0;
1792 	int signature_nid = 0;
1793 
1794 	if (SSL_C_IS_EXPORT(cs))
1795 		{
1796 		/* ECDH key length in export ciphers must be <= 163 bits */
1797 		pkey = X509_get_pubkey(x);
1798 		if (pkey == NULL) return 0;
1799 		keysize = EVP_PKEY_bits(pkey);
1800 		EVP_PKEY_free(pkey);
1801 		if (keysize > 163) return 0;
1802 		}
1803 
1804 	/* This call populates the ex_flags field correctly */
1805 	X509_check_purpose(x, -1, 0);
1806 	if ((x->sig_alg) && (x->sig_alg->algorithm))
1807 		signature_nid = OBJ_obj2nid(x->sig_alg->algorithm);
1808 	if (alg & SSL_kECDH)
1809 		{
1810 		/* key usage, if present, must allow key agreement */
1811 		if (ku_reject(x, X509v3_KU_KEY_AGREEMENT))
1812 			{
1813 			return 0;
1814 			}
1815 		if (alg & SSL_aECDSA)
1816 			{
1817 			/* signature alg must be ECDSA */
1818 			if (signature_nid != NID_ecdsa_with_SHA1)
1819 				{
1820 				return 0;
1821 				}
1822 			}
1823 		if (alg & SSL_aRSA)
1824 			{
1825 			/* signature alg must be RSA */
1826 			if ((signature_nid != NID_md5WithRSAEncryption) &&
1827 			    (signature_nid != NID_md4WithRSAEncryption) &&
1828 			    (signature_nid != NID_md2WithRSAEncryption))
1829 				{
1830 				return 0;
1831 				}
1832 			}
1833 		}
1834 	else if (alg & SSL_aECDSA)
1835 		{
1836 		/* key usage, if present, must allow signing */
1837 		if (ku_reject(x, X509v3_KU_DIGITAL_SIGNATURE))
1838 			{
1839 			return 0;
1840 			}
1841 		}
1842 
1843 	return 1;  /* all checks are ok */
1844 	}
1845 
1846 /* THIS NEEDS CLEANING UP */
ssl_get_server_send_cert(SSL * s)1847 X509 *ssl_get_server_send_cert(SSL *s)
1848 	{
1849 	unsigned long alg,mask,kalg;
1850 	CERT *c;
1851 	int i,is_export;
1852 
1853 	c=s->cert;
1854 	ssl_set_cert_masks(c, s->s3->tmp.new_cipher);
1855 	alg=s->s3->tmp.new_cipher->algorithms;
1856 	is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
1857 	mask=is_export?c->export_mask:c->mask;
1858 	kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK);
1859 
1860 	if (kalg & SSL_kECDH)
1861 		{
1862 		/* we don't need to look at SSL_kECDHE
1863 		 * since no certificate is needed for
1864 		 * anon ECDH and for authenticated
1865 		 * ECDHE, the check for the auth
1866 		 * algorithm will set i correctly
1867 		 * NOTE: For ECDH-RSA, we need an ECC
1868 		 * not an RSA cert but for ECDHE-RSA
1869 		 * we need an RSA cert. Placing the
1870 		 * checks for SSL_kECDH before RSA
1871 		 * checks ensures the correct cert is chosen.
1872 		 */
1873 		i=SSL_PKEY_ECC;
1874 		}
1875 	else if (kalg & SSL_aECDSA)
1876 		{
1877 		i=SSL_PKEY_ECC;
1878 		}
1879 	else if (kalg & SSL_kDHr)
1880 		i=SSL_PKEY_DH_RSA;
1881 	else if (kalg & SSL_kDHd)
1882 		i=SSL_PKEY_DH_DSA;
1883 	else if (kalg & SSL_aDSS)
1884 		i=SSL_PKEY_DSA_SIGN;
1885 	else if (kalg & SSL_aRSA)
1886 		{
1887 		if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL)
1888 			i=SSL_PKEY_RSA_SIGN;
1889 		else
1890 			i=SSL_PKEY_RSA_ENC;
1891 		}
1892 	else if (kalg & SSL_aKRB5)
1893 		{
1894 		/* VRS something else here? */
1895 		return(NULL);
1896 		}
1897 	else /* if (kalg & SSL_aNULL) */
1898 		{
1899 		SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,ERR_R_INTERNAL_ERROR);
1900 		return(NULL);
1901 		}
1902 	if (c->pkeys[i].x509 == NULL) return(NULL);
1903 
1904 	return(c->pkeys[i].x509);
1905 	}
1906 
ssl_get_sign_pkey(SSL * s,SSL_CIPHER * cipher)1907 EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher)
1908 	{
1909 	unsigned long alg;
1910 	CERT *c;
1911 
1912 	alg=cipher->algorithms;
1913 	c=s->cert;
1914 
1915 	if ((alg & SSL_aDSS) &&
1916 		(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
1917 		return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey);
1918 	else if (alg & SSL_aRSA)
1919 		{
1920 		if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
1921 			return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey);
1922 		else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
1923 			return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey);
1924 		else
1925 			return(NULL);
1926 		}
1927 	else if ((alg & SSL_aECDSA) &&
1928 	         (c->pkeys[SSL_PKEY_ECC].privatekey != NULL))
1929 		return(c->pkeys[SSL_PKEY_ECC].privatekey);
1930 	else /* if (alg & SSL_aNULL) */
1931 		{
1932 		SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
1933 		return(NULL);
1934 		}
1935 	}
1936 
ssl_update_cache(SSL * s,int mode)1937 void ssl_update_cache(SSL *s,int mode)
1938 	{
1939 	int i;
1940 
1941 	/* If the session_id_length is 0, we are not supposed to cache it,
1942 	 * and it would be rather hard to do anyway :-) */
1943 	if (s->session->session_id_length == 0) return;
1944 
1945 	i=s->ctx->session_cache_mode;
1946 	if ((i & mode) && (!s->hit)
1947 		&& ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE)
1948 		    || SSL_CTX_add_session(s->ctx,s->session))
1949 		&& (s->ctx->new_session_cb != NULL))
1950 		{
1951 		CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
1952 		if (!s->ctx->new_session_cb(s,s->session))
1953 			SSL_SESSION_free(s->session);
1954 		}
1955 
1956 	/* auto flush every 255 connections */
1957 	if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
1958 		((i & mode) == mode))
1959 		{
1960 		if (  (((mode & SSL_SESS_CACHE_CLIENT)
1961 			?s->ctx->stats.sess_connect_good
1962 			:s->ctx->stats.sess_accept_good) & 0xff) == 0xff)
1963 			{
1964 			SSL_CTX_flush_sessions(s->ctx,(unsigned long)time(NULL));
1965 			}
1966 		}
1967 	}
1968 
SSL_get_ssl_method(SSL * s)1969 SSL_METHOD *SSL_get_ssl_method(SSL *s)
1970 	{
1971 	return(s->method);
1972 	}
1973 
SSL_set_ssl_method(SSL * s,SSL_METHOD * meth)1974 int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth)
1975 	{
1976 	int conn= -1;
1977 	int ret=1;
1978 
1979 	if (s->method != meth)
1980 		{
1981 		if (s->handshake_func != NULL)
1982 			conn=(s->handshake_func == s->method->ssl_connect);
1983 
1984 		if (s->method->version == meth->version)
1985 			s->method=meth;
1986 		else
1987 			{
1988 			s->method->ssl_free(s);
1989 			s->method=meth;
1990 			ret=s->method->ssl_new(s);
1991 			}
1992 
1993 		if (conn == 1)
1994 			s->handshake_func=meth->ssl_connect;
1995 		else if (conn == 0)
1996 			s->handshake_func=meth->ssl_accept;
1997 		}
1998 	return(ret);
1999 	}
2000 
SSL_get_error(const SSL * s,int i)2001 int SSL_get_error(const SSL *s,int i)
2002 	{
2003 	int reason;
2004 	unsigned long l;
2005 	BIO *bio;
2006 
2007 	if (i > 0) return(SSL_ERROR_NONE);
2008 
2009 	/* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake
2010 	 * etc, where we do encode the error */
2011 	if ((l=ERR_peek_error()) != 0)
2012 		{
2013 		if (ERR_GET_LIB(l) == ERR_LIB_SYS)
2014 			return(SSL_ERROR_SYSCALL);
2015 		else
2016 			return(SSL_ERROR_SSL);
2017 		}
2018 
2019 	if ((i < 0) && SSL_want_read(s))
2020 		{
2021 		bio=SSL_get_rbio(s);
2022 		if (BIO_should_read(bio))
2023 			return(SSL_ERROR_WANT_READ);
2024 		else if (BIO_should_write(bio))
2025 			/* This one doesn't make too much sense ... We never try
2026 			 * to write to the rbio, and an application program where
2027 			 * rbio and wbio are separate couldn't even know what it
2028 			 * should wait for.
2029 			 * However if we ever set s->rwstate incorrectly
2030 			 * (so that we have SSL_want_read(s) instead of
2031 			 * SSL_want_write(s)) and rbio and wbio *are* the same,
2032 			 * this test works around that bug; so it might be safer
2033 			 * to keep it. */
2034 			return(SSL_ERROR_WANT_WRITE);
2035 		else if (BIO_should_io_special(bio))
2036 			{
2037 			reason=BIO_get_retry_reason(bio);
2038 			if (reason == BIO_RR_CONNECT)
2039 				return(SSL_ERROR_WANT_CONNECT);
2040 			else if (reason == BIO_RR_ACCEPT)
2041 				return(SSL_ERROR_WANT_ACCEPT);
2042 			else
2043 				return(SSL_ERROR_SYSCALL); /* unknown */
2044 			}
2045 		}
2046 
2047 	if ((i < 0) && SSL_want_write(s))
2048 		{
2049 		bio=SSL_get_wbio(s);
2050 		if (BIO_should_write(bio))
2051 			return(SSL_ERROR_WANT_WRITE);
2052 		else if (BIO_should_read(bio))
2053 			/* See above (SSL_want_read(s) with BIO_should_write(bio)) */
2054 			return(SSL_ERROR_WANT_READ);
2055 		else if (BIO_should_io_special(bio))
2056 			{
2057 			reason=BIO_get_retry_reason(bio);
2058 			if (reason == BIO_RR_CONNECT)
2059 				return(SSL_ERROR_WANT_CONNECT);
2060 			else if (reason == BIO_RR_ACCEPT)
2061 				return(SSL_ERROR_WANT_ACCEPT);
2062 			else
2063 				return(SSL_ERROR_SYSCALL);
2064 			}
2065 		}
2066 	if ((i < 0) && SSL_want_x509_lookup(s))
2067 		{
2068 		return(SSL_ERROR_WANT_X509_LOOKUP);
2069 		}
2070 
2071 	if (i == 0)
2072 		{
2073 		if (s->version == SSL2_VERSION)
2074 			{
2075 			/* assume it is the socket being closed */
2076 			return(SSL_ERROR_ZERO_RETURN);
2077 			}
2078 		else
2079 			{
2080 			if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) &&
2081 				(s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY))
2082 				return(SSL_ERROR_ZERO_RETURN);
2083 			}
2084 		}
2085 	return(SSL_ERROR_SYSCALL);
2086 	}
2087 
SSL_do_handshake(SSL * s)2088 int SSL_do_handshake(SSL *s)
2089 	{
2090 	int ret=1;
2091 
2092 	if (s->handshake_func == NULL)
2093 		{
2094 		SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET);
2095 		return(-1);
2096 		}
2097 
2098 	s->method->ssl_renegotiate_check(s);
2099 
2100 	if (SSL_in_init(s) || SSL_in_before(s))
2101 		{
2102 		ret=s->handshake_func(s);
2103 		}
2104 	return(ret);
2105 	}
2106 
2107 /* For the next 2 functions, SSL_clear() sets shutdown and so
2108  * one of these calls will reset it */
SSL_set_accept_state(SSL * s)2109 void SSL_set_accept_state(SSL *s)
2110 	{
2111 	s->server=1;
2112 	s->shutdown=0;
2113 	s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE;
2114 	s->handshake_func=s->method->ssl_accept;
2115 	/* clear the current cipher */
2116 	ssl_clear_cipher_ctx(s);
2117 	}
2118 
SSL_set_connect_state(SSL * s)2119 void SSL_set_connect_state(SSL *s)
2120 	{
2121 	s->server=0;
2122 	s->shutdown=0;
2123 	s->state=SSL_ST_CONNECT|SSL_ST_BEFORE;
2124 	s->handshake_func=s->method->ssl_connect;
2125 	/* clear the current cipher */
2126 	ssl_clear_cipher_ctx(s);
2127 	}
2128 
ssl_undefined_function(SSL * s)2129 int ssl_undefined_function(SSL *s)
2130 	{
2131 	SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2132 	return(0);
2133 	}
2134 
ssl_undefined_void_function(void)2135 int ssl_undefined_void_function(void)
2136 	{
2137 	SSLerr(SSL_F_SSL_UNDEFINED_VOID_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2138 	return(0);
2139 	}
2140 
ssl_undefined_const_function(const SSL * s)2141 int ssl_undefined_const_function(const SSL *s)
2142 	{
2143 	SSLerr(SSL_F_SSL_UNDEFINED_CONST_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2144 	return(0);
2145 	}
2146 
ssl_bad_method(int ver)2147 SSL_METHOD *ssl_bad_method(int ver)
2148 	{
2149 	SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2150 	return(NULL);
2151 	}
2152 
SSL_get_version(const SSL * s)2153 const char *SSL_get_version(const SSL *s)
2154 	{
2155 	if (s->version == TLS1_VERSION)
2156 		return("TLSv1");
2157 	else if (s->version == SSL3_VERSION)
2158 		return("SSLv3");
2159 	else if (s->version == SSL2_VERSION)
2160 		return("SSLv2");
2161 	else
2162 		return("unknown");
2163 	}
2164 
SSL_dup(SSL * s)2165 SSL *SSL_dup(SSL *s)
2166 	{
2167 	STACK_OF(X509_NAME) *sk;
2168 	X509_NAME *xn;
2169 	SSL *ret;
2170 	int i;
2171 
2172 	if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL)
2173 	    return(NULL);
2174 
2175 	ret->version = s->version;
2176 	ret->type = s->type;
2177 	ret->method = s->method;
2178 
2179 	if (s->session != NULL)
2180 		{
2181 		/* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */
2182 		SSL_copy_session_id(ret,s);
2183 		}
2184 	else
2185 		{
2186 		/* No session has been established yet, so we have to expect
2187 		 * that s->cert or ret->cert will be changed later --
2188 		 * they should not both point to the same object,
2189 		 * and thus we can't use SSL_copy_session_id. */
2190 
2191 		ret->method->ssl_free(ret);
2192 		ret->method = s->method;
2193 		ret->method->ssl_new(ret);
2194 
2195 		if (s->cert != NULL)
2196 			{
2197 			if (ret->cert != NULL)
2198 				{
2199 				ssl_cert_free(ret->cert);
2200 				}
2201 			ret->cert = ssl_cert_dup(s->cert);
2202 			if (ret->cert == NULL)
2203 				goto err;
2204 			}
2205 
2206 		SSL_set_session_id_context(ret,
2207 			s->sid_ctx, s->sid_ctx_length);
2208 		}
2209 
2210 	ret->options=s->options;
2211 	ret->mode=s->mode;
2212 	SSL_set_max_cert_list(ret,SSL_get_max_cert_list(s));
2213 	SSL_set_read_ahead(ret,SSL_get_read_ahead(s));
2214 	ret->msg_callback = s->msg_callback;
2215 	ret->msg_callback_arg = s->msg_callback_arg;
2216 	SSL_set_verify(ret,SSL_get_verify_mode(s),
2217 		SSL_get_verify_callback(s));
2218 	SSL_set_verify_depth(ret,SSL_get_verify_depth(s));
2219 	ret->generate_session_id = s->generate_session_id;
2220 
2221 	SSL_set_info_callback(ret,SSL_get_info_callback(s));
2222 
2223 	ret->debug=s->debug;
2224 
2225 	/* copy app data, a little dangerous perhaps */
2226 	if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL, &ret->ex_data, &s->ex_data))
2227 		goto err;
2228 
2229 	/* setup rbio, and wbio */
2230 	if (s->rbio != NULL)
2231 		{
2232 		if (!BIO_dup_state(s->rbio,(char *)&ret->rbio))
2233 			goto err;
2234 		}
2235 	if (s->wbio != NULL)
2236 		{
2237 		if (s->wbio != s->rbio)
2238 			{
2239 			if (!BIO_dup_state(s->wbio,(char *)&ret->wbio))
2240 				goto err;
2241 			}
2242 		else
2243 			ret->wbio=ret->rbio;
2244 		}
2245 	ret->rwstate = s->rwstate;
2246 	ret->in_handshake = s->in_handshake;
2247 	ret->handshake_func = s->handshake_func;
2248 	ret->server = s->server;
2249 	ret->new_session = s->new_session;
2250 	ret->quiet_shutdown = s->quiet_shutdown;
2251 	ret->shutdown=s->shutdown;
2252 	ret->state=s->state; /* SSL_dup does not really work at any state, though */
2253 	ret->rstate=s->rstate;
2254 	ret->init_num = 0; /* would have to copy ret->init_buf, ret->init_msg, ret->init_num, ret->init_off */
2255 	ret->hit=s->hit;
2256 
2257 	X509_VERIFY_PARAM_inherit(ret->param, s->param);
2258 
2259 	/* dup the cipher_list and cipher_list_by_id stacks */
2260 	if (s->cipher_list != NULL)
2261 		{
2262 		if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL)
2263 			goto err;
2264 		}
2265 	if (s->cipher_list_by_id != NULL)
2266 		if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id))
2267 			== NULL)
2268 			goto err;
2269 
2270 	/* Dup the client_CA list */
2271 	if (s->client_CA != NULL)
2272 		{
2273 		if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err;
2274 		ret->client_CA=sk;
2275 		for (i=0; i<sk_X509_NAME_num(sk); i++)
2276 			{
2277 			xn=sk_X509_NAME_value(sk,i);
2278 			if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL)
2279 				{
2280 				X509_NAME_free(xn);
2281 				goto err;
2282 				}
2283 			}
2284 		}
2285 
2286 	if (0)
2287 		{
2288 err:
2289 		if (ret != NULL) SSL_free(ret);
2290 		ret=NULL;
2291 		}
2292 	return(ret);
2293 	}
2294 
ssl_clear_cipher_ctx(SSL * s)2295 void ssl_clear_cipher_ctx(SSL *s)
2296 	{
2297 	if (s->enc_read_ctx != NULL)
2298 		{
2299 		EVP_CIPHER_CTX_cleanup(s->enc_read_ctx);
2300 		OPENSSL_free(s->enc_read_ctx);
2301 		s->enc_read_ctx=NULL;
2302 		}
2303 	if (s->enc_write_ctx != NULL)
2304 		{
2305 		EVP_CIPHER_CTX_cleanup(s->enc_write_ctx);
2306 		OPENSSL_free(s->enc_write_ctx);
2307 		s->enc_write_ctx=NULL;
2308 		}
2309 #ifndef OPENSSL_NO_COMP
2310 	if (s->expand != NULL)
2311 		{
2312 		COMP_CTX_free(s->expand);
2313 		s->expand=NULL;
2314 		}
2315 	if (s->compress != NULL)
2316 		{
2317 		COMP_CTX_free(s->compress);
2318 		s->compress=NULL;
2319 		}
2320 #endif
2321 	}
2322 
2323 /* Fix this function so that it takes an optional type parameter */
SSL_get_certificate(const SSL * s)2324 X509 *SSL_get_certificate(const SSL *s)
2325 	{
2326 	if (s->cert != NULL)
2327 		return(s->cert->key->x509);
2328 	else
2329 		return(NULL);
2330 	}
2331 
2332 /* Fix this function so that it takes an optional type parameter */
SSL_get_privatekey(SSL * s)2333 EVP_PKEY *SSL_get_privatekey(SSL *s)
2334 	{
2335 	if (s->cert != NULL)
2336 		return(s->cert->key->privatekey);
2337 	else
2338 		return(NULL);
2339 	}
2340 
SSL_get_current_cipher(const SSL * s)2341 SSL_CIPHER *SSL_get_current_cipher(const SSL *s)
2342 	{
2343 	if ((s->session != NULL) && (s->session->cipher != NULL))
2344 		return(s->session->cipher);
2345 	return(NULL);
2346 	}
2347 #ifdef OPENSSL_NO_COMP
SSL_get_current_compression(SSL * s)2348 const void *SSL_get_current_compression(SSL *s)
2349 	{
2350 	return NULL;
2351 	}
SSL_get_current_expansion(SSL * s)2352 const void *SSL_get_current_expansion(SSL *s)
2353 	{
2354 	return NULL;
2355 	}
2356 #else
2357 
SSL_get_current_compression(SSL * s)2358 const COMP_METHOD *SSL_get_current_compression(SSL *s)
2359 	{
2360 	if (s->compress != NULL)
2361 		return(s->compress->meth);
2362 	return(NULL);
2363 	}
2364 
SSL_get_current_expansion(SSL * s)2365 const COMP_METHOD *SSL_get_current_expansion(SSL *s)
2366 	{
2367 	if (s->expand != NULL)
2368 		return(s->expand->meth);
2369 	return(NULL);
2370 	}
2371 #endif
2372 
ssl_init_wbio_buffer(SSL * s,int push)2373 int ssl_init_wbio_buffer(SSL *s,int push)
2374 	{
2375 	BIO *bbio;
2376 
2377 	if (s->bbio == NULL)
2378 		{
2379 		bbio=BIO_new(BIO_f_buffer());
2380 		if (bbio == NULL) return(0);
2381 		s->bbio=bbio;
2382 		}
2383 	else
2384 		{
2385 		bbio=s->bbio;
2386 		if (s->bbio == s->wbio)
2387 			s->wbio=BIO_pop(s->wbio);
2388 		}
2389 	(void)BIO_reset(bbio);
2390 /*	if (!BIO_set_write_buffer_size(bbio,16*1024)) */
2391 	if (!BIO_set_read_buffer_size(bbio,1))
2392 		{
2393 		SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB);
2394 		return(0);
2395 		}
2396 	if (push)
2397 		{
2398 		if (s->wbio != bbio)
2399 			s->wbio=BIO_push(bbio,s->wbio);
2400 		}
2401 	else
2402 		{
2403 		if (s->wbio == bbio)
2404 			s->wbio=BIO_pop(bbio);
2405 		}
2406 	return(1);
2407 	}
2408 
ssl_free_wbio_buffer(SSL * s)2409 void ssl_free_wbio_buffer(SSL *s)
2410 	{
2411 	if (s->bbio == NULL) return;
2412 
2413 	if (s->bbio == s->wbio)
2414 		{
2415 		/* remove buffering */
2416 		s->wbio=BIO_pop(s->wbio);
2417 #ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
2418 		assert(s->wbio != NULL);
2419 #endif
2420 	}
2421 	BIO_free(s->bbio);
2422 	s->bbio=NULL;
2423 	}
2424 
SSL_CTX_set_quiet_shutdown(SSL_CTX * ctx,int mode)2425 void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode)
2426 	{
2427 	ctx->quiet_shutdown=mode;
2428 	}
2429 
SSL_CTX_get_quiet_shutdown(const SSL_CTX * ctx)2430 int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx)
2431 	{
2432 	return(ctx->quiet_shutdown);
2433 	}
2434 
SSL_set_quiet_shutdown(SSL * s,int mode)2435 void SSL_set_quiet_shutdown(SSL *s,int mode)
2436 	{
2437 	s->quiet_shutdown=mode;
2438 	}
2439 
SSL_get_quiet_shutdown(const SSL * s)2440 int SSL_get_quiet_shutdown(const SSL *s)
2441 	{
2442 	return(s->quiet_shutdown);
2443 	}
2444 
SSL_set_shutdown(SSL * s,int mode)2445 void SSL_set_shutdown(SSL *s,int mode)
2446 	{
2447 	s->shutdown=mode;
2448 	}
2449 
SSL_get_shutdown(const SSL * s)2450 int SSL_get_shutdown(const SSL *s)
2451 	{
2452 	return(s->shutdown);
2453 	}
2454 
SSL_version(const SSL * s)2455 int SSL_version(const SSL *s)
2456 	{
2457 	return(s->version);
2458 	}
2459 
SSL_get_SSL_CTX(const SSL * ssl)2460 SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl)
2461 	{
2462 	return(ssl->ctx);
2463 	}
2464 
SSL_set_SSL_CTX(SSL * ssl,SSL_CTX * ctx)2465 SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx)
2466 	{
2467 	if (ssl->ctx == ctx)
2468 		return ssl->ctx;
2469 #ifndef OPENSSL_NO_TLSEXT
2470 	if (ctx == NULL)
2471 		ctx = ssl->initial_ctx;
2472 #endif
2473 	if (ssl->cert != NULL)
2474 		ssl_cert_free(ssl->cert);
2475 	ssl->cert = ssl_cert_dup(ctx->cert);
2476 	CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
2477 	if (ssl->ctx != NULL)
2478 		SSL_CTX_free(ssl->ctx); /* decrement reference count */
2479 	ssl->ctx = ctx;
2480 	return(ssl->ctx);
2481 	}
2482 
2483 #ifndef OPENSSL_NO_STDIO
SSL_CTX_set_default_verify_paths(SSL_CTX * ctx)2484 int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
2485 	{
2486 	return(X509_STORE_set_default_paths(ctx->cert_store));
2487 	}
2488 
SSL_CTX_load_verify_locations(SSL_CTX * ctx,const char * CAfile,const char * CApath)2489 int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
2490 		const char *CApath)
2491 	{
2492 	return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath));
2493 	}
2494 #endif
2495 
SSL_set_info_callback(SSL * ssl,void (* cb)(const SSL * ssl,int type,int val))2496 void SSL_set_info_callback(SSL *ssl,
2497 	void (*cb)(const SSL *ssl,int type,int val))
2498 	{
2499 	ssl->info_callback=cb;
2500 	}
2501 
2502 /* One compiler (Diab DCC) doesn't like argument names in returned
2503    function pointer.  */
SSL_get_info_callback(const SSL * ssl)2504 void (*SSL_get_info_callback(const SSL *ssl))(const SSL * /*ssl*/,int /*type*/,int /*val*/)
2505 	{
2506 	return ssl->info_callback;
2507 	}
2508 
SSL_state(const SSL * ssl)2509 int SSL_state(const SSL *ssl)
2510 	{
2511 	return(ssl->state);
2512 	}
2513 
SSL_set_verify_result(SSL * ssl,long arg)2514 void SSL_set_verify_result(SSL *ssl,long arg)
2515 	{
2516 	ssl->verify_result=arg;
2517 	}
2518 
SSL_get_verify_result(const SSL * ssl)2519 long SSL_get_verify_result(const SSL *ssl)
2520 	{
2521 	return(ssl->verify_result);
2522 	}
2523 
SSL_get_ex_new_index(long argl,void * argp,CRYPTO_EX_new * new_func,CRYPTO_EX_dup * dup_func,CRYPTO_EX_free * free_func)2524 int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2525 			 CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2526 	{
2527 	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, argl, argp,
2528 				new_func, dup_func, free_func);
2529 	}
2530 
SSL_set_ex_data(SSL * s,int idx,void * arg)2531 int SSL_set_ex_data(SSL *s,int idx,void *arg)
2532 	{
2533 	return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2534 	}
2535 
SSL_get_ex_data(const SSL * s,int idx)2536 void *SSL_get_ex_data(const SSL *s,int idx)
2537 	{
2538 	return(CRYPTO_get_ex_data(&s->ex_data,idx));
2539 	}
2540 
SSL_CTX_get_ex_new_index(long argl,void * argp,CRYPTO_EX_new * new_func,CRYPTO_EX_dup * dup_func,CRYPTO_EX_free * free_func)2541 int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func,
2542 			     CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func)
2543 	{
2544 	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, argl, argp,
2545 				new_func, dup_func, free_func);
2546 	}
2547 
SSL_CTX_set_ex_data(SSL_CTX * s,int idx,void * arg)2548 int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg)
2549 	{
2550 	return(CRYPTO_set_ex_data(&s->ex_data,idx,arg));
2551 	}
2552 
SSL_CTX_get_ex_data(const SSL_CTX * s,int idx)2553 void *SSL_CTX_get_ex_data(const SSL_CTX *s,int idx)
2554 	{
2555 	return(CRYPTO_get_ex_data(&s->ex_data,idx));
2556 	}
2557 
ssl_ok(SSL * s)2558 int ssl_ok(SSL *s)
2559 	{
2560 	return(1);
2561 	}
2562 
SSL_CTX_get_cert_store(const SSL_CTX * ctx)2563 X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx)
2564 	{
2565 	return(ctx->cert_store);
2566 	}
2567 
SSL_CTX_set_cert_store(SSL_CTX * ctx,X509_STORE * store)2568 void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store)
2569 	{
2570 	if (ctx->cert_store != NULL)
2571 		X509_STORE_free(ctx->cert_store);
2572 	ctx->cert_store=store;
2573 	}
2574 
SSL_want(const SSL * s)2575 int SSL_want(const SSL *s)
2576 	{
2577 	return(s->rwstate);
2578 	}
2579 
2580 /*!
2581  * \brief Set the callback for generating temporary RSA keys.
2582  * \param ctx the SSL context.
2583  * \param cb the callback
2584  */
2585 
2586 #ifndef OPENSSL_NO_RSA
SSL_CTX_set_tmp_rsa_callback(SSL_CTX * ctx,RSA * (* cb)(SSL * ssl,int is_export,int keylength))2587 void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
2588 							  int is_export,
2589 							  int keylength))
2590     {
2591     SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb);
2592     }
2593 
SSL_set_tmp_rsa_callback(SSL * ssl,RSA * (* cb)(SSL * ssl,int is_export,int keylength))2594 void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
2595 						  int is_export,
2596 						  int keylength))
2597     {
2598     SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)(void))cb);
2599     }
2600 #endif
2601 
2602 #ifdef DOXYGEN
2603 /*!
2604  * \brief The RSA temporary key callback function.
2605  * \param ssl the SSL session.
2606  * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite.
2607  * \param keylength if \c is_export is \c TRUE, then \c keylength is the size
2608  * of the required key in bits.
2609  * \return the temporary RSA key.
2610  * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback
2611  */
2612 
cb(SSL * ssl,int is_export,int keylength)2613 RSA *cb(SSL *ssl,int is_export,int keylength)
2614     {}
2615 #endif
2616 
2617 /*!
2618  * \brief Set the callback for generating temporary DH keys.
2619  * \param ctx the SSL context.
2620  * \param dh the callback
2621  */
2622 
2623 #ifndef OPENSSL_NO_DH
SSL_CTX_set_tmp_dh_callback(SSL_CTX * ctx,DH * (* dh)(SSL * ssl,int is_export,int keylength))2624 void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
2625 							int keylength))
2626 	{
2627 	SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh);
2628 	}
2629 
SSL_set_tmp_dh_callback(SSL * ssl,DH * (* dh)(SSL * ssl,int is_export,int keylength))2630 void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
2631 						int keylength))
2632 	{
2633 	SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)(void))dh);
2634 	}
2635 #endif
2636 
2637 #ifndef OPENSSL_NO_ECDH
SSL_CTX_set_tmp_ecdh_callback(SSL_CTX * ctx,EC_KEY * (* ecdh)(SSL * ssl,int is_export,int keylength))2638 void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx,EC_KEY *(*ecdh)(SSL *ssl,int is_export,
2639 							int keylength))
2640 	{
2641 	SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh);
2642 	}
2643 
SSL_set_tmp_ecdh_callback(SSL * ssl,EC_KEY * (* ecdh)(SSL * ssl,int is_export,int keylength))2644 void SSL_set_tmp_ecdh_callback(SSL *ssl,EC_KEY *(*ecdh)(SSL *ssl,int is_export,
2645 						int keylength))
2646 	{
2647 	SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH_CB,(void (*)(void))ecdh);
2648 	}
2649 #endif
2650 
2651 
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))2652 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))
2653 	{
2654 	SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
2655 	}
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))2656 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))
2657 	{
2658 	SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
2659 	}
2660 
2661 
2662 
2663 #if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
2664 #include "../crypto/bio/bss_file.c"
2665 #endif
2666 
2667 IMPLEMENT_STACK_OF(SSL_CIPHER)
2668 IMPLEMENT_STACK_OF(SSL_COMP)
2669