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