os/ossrv/ssl/libssl/src/d1_srvr.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.
     1 /* ssl/d1_srvr.c */
     2 /* 
     3  * DTLS implementation written by Nagendra Modadugu
     4  * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.  
     5  */
     6 /* ====================================================================
     7  * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
     8  *
     9  * Redistribution and use in source and binary forms, with or without
    10  * modification, are permitted provided that the following conditions
    11  * are met:
    12  *
    13  * 1. Redistributions of source code must retain the above copyright
    14  *    notice, this list of conditions and the following disclaimer. 
    15  *
    16  * 2. Redistributions in binary form must reproduce the above copyright
    17  *    notice, this list of conditions and the following disclaimer in
    18  *    the documentation and/or other materials provided with the
    19  *    distribution.
    20  *
    21  * 3. All advertising materials mentioning features or use of this
    22  *    software must display the following acknowledgment:
    23  *    "This product includes software developed by the OpenSSL Project
    24  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
    25  *
    26  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
    27  *    endorse or promote products derived from this software without
    28  *    prior written permission. For written permission, please contact
    29  *    openssl-core@OpenSSL.org.
    30  *
    31  * 5. Products derived from this software may not be called "OpenSSL"
    32  *    nor may "OpenSSL" appear in their names without prior written
    33  *    permission of the OpenSSL Project.
    34  *
    35  * 6. Redistributions of any form whatsoever must retain the following
    36  *    acknowledgment:
    37  *    "This product includes software developed by the OpenSSL Project
    38  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
    39  *
    40  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
    41  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    43  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
    44  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    45  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    46  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    47  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    49  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    50  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    51  * OF THE POSSIBILITY OF SUCH DAMAGE.
    52  * ====================================================================
    53  *
    54  * This product includes cryptographic software written by Eric Young
    55  * (eay@cryptsoft.com).  This product includes software written by Tim
    56  * Hudson (tjh@cryptsoft.com).
    57  *
    58  */
    59 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
    60  * All rights reserved.
    61  *
    62  * This package is an SSL implementation written
    63  * by Eric Young (eay@cryptsoft.com).
    64  * The implementation was written so as to conform with Netscapes SSL.
    65  * 
    66  * This library is free for commercial and non-commercial use as long as
    67  * the following conditions are aheared to.  The following conditions
    68  * apply to all code found in this distribution, be it the RC4, RSA,
    69  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
    70  * included with this distribution is covered by the same copyright terms
    71  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
    72  * 
    73  * Copyright remains Eric Young's, and as such any Copyright notices in
    74  * the code are not to be removed.
    75  * If this package is used in a product, Eric Young should be given attribution
    76  * as the author of the parts of the library used.
    77  * This can be in the form of a textual message at program startup or
    78  * in documentation (online or textual) provided with the package.
    79  * 
    80  * Redistribution and use in source and binary forms, with or without
    81  * modification, are permitted provided that the following conditions
    82  * are met:
    83  * 1. Redistributions of source code must retain the copyright
    84  *    notice, this list of conditions and the following disclaimer.
    85  * 2. Redistributions in binary form must reproduce the above copyright
    86  *    notice, this list of conditions and the following disclaimer in the
    87  *    documentation and/or other materials provided with the distribution.
    88  * 3. All advertising materials mentioning features or use of this software
    89  *    must display the following acknowledgement:
    90  *    "This product includes cryptographic software written by
    91  *     Eric Young (eay@cryptsoft.com)"
    92  *    The word 'cryptographic' can be left out if the rouines from the library
    93  *    being used are not cryptographic related :-).
    94  * 4. If you include any Windows specific code (or a derivative thereof) from 
    95  *    the apps directory (application code) you must include an acknowledgement:
    96  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
    97  * 
    98  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
    99  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   100  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   101  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   102  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   103  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   104  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   105  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   106  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   107  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   108  * SUCH DAMAGE.
   109  * 
   110  * The licence and distribution terms for any publically available version or
   111  * derivative of this code cannot be changed.  i.e. this code cannot simply be
   112  * copied and put under another distribution licence
   113  * [including the GNU Public Licence.]
   114  */
   115 /*
   116  © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
   117  */
   118  
   119 #include <stdio.h>
   120 #include "ssl_locl.h"
   121 #include <openssl/buffer.h>
   122 #include <openssl/rand.h>
   123 #include <openssl/objects.h>
   124 #include <openssl/evp.h>
   125 #include <openssl/x509.h>
   126 #include <openssl/md5.h>
   127 #ifndef OPENSSL_NO_DH
   128 #include <openssl/dh.h>
   129 #endif
   130 
   131 #if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__)))
   132 #include "libssl_wsd.h"
   133 #endif
   134 
   135 #ifdef EMULATOR
   136 	
   137 	GET_STATIC_VAR_FROM_TLS(DTLSv1_server_method_data,d1_srvr,SSL_METHOD)
   138 	
   139 	#define DTLSv1_server_method_data (*GET_WSD_VAR_NAME(DTLSv1_server_method_data,d1_srvr,s)())
   140 	
   141 #endif
   142 
   143 static SSL_METHOD *dtls1_get_server_method(int ver);
   144 static int dtls1_send_hello_verify_request(SSL *s);
   145 
   146 static SSL_METHOD *dtls1_get_server_method(int ver)
   147 	{
   148 	if (ver == DTLS1_VERSION)
   149 		return(DTLSv1_server_method());
   150 	else
   151 		return(NULL);
   152 	}
   153 
   154 EXPORT_C IMPLEMENT_dtls1_meth_func(DTLSv1_server_method,
   155 			dtls1_accept,
   156 			ssl_undefined_function,
   157 			dtls1_get_server_method)
   158 
   159 int dtls1_accept(SSL *s)
   160 	{
   161 	BUF_MEM *buf;
   162 	unsigned long l,Time=(unsigned long)time(NULL);
   163 	void (*cb)(const SSL *ssl,int type,int val)=NULL;
   164 	long num1;
   165 	int ret= -1;
   166 	int new_state,state,skip=0;
   167 
   168 	RAND_add(&Time,sizeof(Time),0);
   169 	ERR_clear_error();
   170 	clear_sys_error();
   171 
   172 	if (s->info_callback != NULL)
   173 		cb=s->info_callback;
   174 	else if (s->ctx->info_callback != NULL)
   175 		cb=s->ctx->info_callback;
   176 
   177 	/* init things to blank */
   178 	s->in_handshake++;
   179 	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
   180 
   181 	if (s->cert == NULL)
   182 		{
   183 		SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
   184 		return(-1);
   185 		}
   186 
   187 	for (;;)
   188 		{
   189 		state=s->state;
   190 
   191 		switch (s->state)
   192 			{
   193 		case SSL_ST_RENEGOTIATE:
   194 			s->new_session=1;
   195 			/* s->state=SSL_ST_ACCEPT; */
   196 
   197 		case SSL_ST_BEFORE:
   198 		case SSL_ST_ACCEPT:
   199 		case SSL_ST_BEFORE|SSL_ST_ACCEPT:
   200 		case SSL_ST_OK|SSL_ST_ACCEPT:
   201 
   202 			s->server=1;
   203 			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
   204 
   205 			if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00))
   206 				{
   207 				SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
   208 				return -1;
   209 				}
   210 			s->type=SSL_ST_ACCEPT;
   211 
   212 			if (s->init_buf == NULL)
   213 				{
   214 				if ((buf=BUF_MEM_new()) == NULL)
   215 					{
   216 					ret= -1;
   217 					goto end;
   218 					}
   219 				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
   220 					{
   221 					ret= -1;
   222 					goto end;
   223 					}
   224 				s->init_buf=buf;
   225 				}
   226 
   227 			if (!ssl3_setup_buffers(s))
   228 				{
   229 				ret= -1;
   230 				goto end;
   231 				}
   232 
   233 			s->init_num=0;
   234 
   235 			if (s->state != SSL_ST_RENEGOTIATE)
   236 				{
   237 				/* Ok, we now need to push on a buffering BIO so that
   238 				 * the output is sent in a way that TCP likes :-)
   239 				 */
   240 				if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
   241 
   242 				ssl3_init_finished_mac(s);
   243 				s->state=SSL3_ST_SR_CLNT_HELLO_A;
   244 				s->ctx->stats.sess_accept++;
   245 				}
   246 			else
   247 				{
   248 				/* s->state == SSL_ST_RENEGOTIATE,
   249 				 * we will just send a HelloRequest */
   250 				s->ctx->stats.sess_accept_renegotiate++;
   251 				s->state=SSL3_ST_SW_HELLO_REQ_A;
   252 				}
   253 
   254             if ( (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
   255                 s->d1->send_cookie = 1;
   256             else
   257                 s->d1->send_cookie = 0;
   258 
   259 			break;
   260 
   261 		case SSL3_ST_SW_HELLO_REQ_A:
   262 		case SSL3_ST_SW_HELLO_REQ_B:
   263 
   264 			s->shutdown=0;
   265 			ret=dtls1_send_hello_request(s);
   266 			if (ret <= 0) goto end;
   267 			s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
   268 			s->state=SSL3_ST_SW_FLUSH;
   269 			s->init_num=0;
   270 
   271 			ssl3_init_finished_mac(s);
   272 			break;
   273 
   274 		case SSL3_ST_SW_HELLO_REQ_C:
   275 			s->state=SSL_ST_OK;
   276 			break;
   277 
   278 		case SSL3_ST_SR_CLNT_HELLO_A:
   279 		case SSL3_ST_SR_CLNT_HELLO_B:
   280 		case SSL3_ST_SR_CLNT_HELLO_C:
   281 
   282 			s->shutdown=0;
   283 			ret=ssl3_get_client_hello(s);
   284 			if (ret <= 0) goto end;
   285 			s->new_session = 2;
   286 
   287 			if ( s->d1->send_cookie)
   288 				s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A;
   289 			else
   290 				s->state = SSL3_ST_SW_SRVR_HELLO_A;
   291 
   292 			s->init_num=0;
   293 			break;
   294 			
   295 		case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
   296 		case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
   297 
   298 			ret = dtls1_send_hello_verify_request(s);
   299 			if ( ret <= 0) goto end;
   300 			s->d1->send_cookie = 0;
   301 			s->state=SSL3_ST_SW_FLUSH;
   302 			s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
   303 
   304 			/* HelloVerifyRequests resets Finished MAC */
   305 			if (s->client_version != DTLS1_BAD_VER)
   306 				ssl3_init_finished_mac(s);
   307 			break;
   308 			
   309 		case SSL3_ST_SW_SRVR_HELLO_A:
   310 		case SSL3_ST_SW_SRVR_HELLO_B:
   311 			ret=dtls1_send_server_hello(s);
   312 			if (ret <= 0) goto end;
   313 
   314 			if (s->hit)
   315 				s->state=SSL3_ST_SW_CHANGE_A;
   316 			else
   317 				s->state=SSL3_ST_SW_CERT_A;
   318 			s->init_num=0;
   319 			break;
   320 
   321 		case SSL3_ST_SW_CERT_A:
   322 		case SSL3_ST_SW_CERT_B:
   323 			/* Check if it is anon DH */
   324 			if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
   325 				{
   326 				ret=dtls1_send_server_certificate(s);
   327 				if (ret <= 0) goto end;
   328 				}
   329 			else
   330 				skip=1;
   331 			s->state=SSL3_ST_SW_KEY_EXCH_A;
   332 			s->init_num=0;
   333 			break;
   334 
   335 		case SSL3_ST_SW_KEY_EXCH_A:
   336 		case SSL3_ST_SW_KEY_EXCH_B:
   337 			l=s->s3->tmp.new_cipher->algorithms;
   338 
   339 			/* clear this, it may get reset by
   340 			 * send_server_key_exchange */
   341 			if ((s->options & SSL_OP_EPHEMERAL_RSA)
   342 #ifndef OPENSSL_NO_KRB5
   343 				&& !(l & SSL_KRB5)
   344 #endif /* OPENSSL_NO_KRB5 */
   345 				)
   346 				/* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
   347 				 * even when forbidden by protocol specs
   348 				 * (handshake may fail as clients are not required to
   349 				 * be able to handle this) */
   350 				s->s3->tmp.use_rsa_tmp=1;
   351 			else
   352 				s->s3->tmp.use_rsa_tmp=0;
   353 
   354 			/* only send if a DH key exchange, fortezza or
   355 			 * RSA but we have a sign only certificate */
   356 			if (s->s3->tmp.use_rsa_tmp
   357 			    || (l & (SSL_DH|SSL_kFZA))
   358 			    || ((l & SSL_kRSA)
   359 				&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
   360 				    || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
   361 					&& EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
   362 					)
   363 				    )
   364 				)
   365 			    )
   366 				{
   367 				ret=dtls1_send_server_key_exchange(s);
   368 				if (ret <= 0) goto end;
   369 				}
   370 			else
   371 				skip=1;
   372 
   373 			s->state=SSL3_ST_SW_CERT_REQ_A;
   374 			s->init_num=0;
   375 			break;
   376 
   377 		case SSL3_ST_SW_CERT_REQ_A:
   378 		case SSL3_ST_SW_CERT_REQ_B:
   379 			if (/* don't request cert unless asked for it: */
   380 				!(s->verify_mode & SSL_VERIFY_PEER) ||
   381 				/* if SSL_VERIFY_CLIENT_ONCE is set,
   382 				 * don't request cert during re-negotiation: */
   383 				((s->session->peer != NULL) &&
   384 				 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
   385 				/* never request cert in anonymous ciphersuites
   386 				 * (see section "Certificate request" in SSL 3 drafts
   387 				 * and in RFC 2246): */
   388 				((s->s3->tmp.new_cipher->algorithms & SSL_aNULL) &&
   389 				 /* ... except when the application insists on verification
   390 				  * (against the specs, but s3_clnt.c accepts this for SSL 3) */
   391 				 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
   392                                  /* never request cert in Kerberos ciphersuites */
   393                                 (s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
   394 				{
   395 				/* no cert request */
   396 				skip=1;
   397 				s->s3->tmp.cert_request=0;
   398 				s->state=SSL3_ST_SW_SRVR_DONE_A;
   399 				}
   400 			else
   401 				{
   402 				s->s3->tmp.cert_request=1;
   403 				ret=dtls1_send_certificate_request(s);
   404 				if (ret <= 0) goto end;
   405 #ifndef NETSCAPE_HANG_BUG
   406 				s->state=SSL3_ST_SW_SRVR_DONE_A;
   407 #else
   408 				s->state=SSL3_ST_SW_FLUSH;
   409 				s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
   410 #endif
   411 				s->init_num=0;
   412 				}
   413 			break;
   414 
   415 		case SSL3_ST_SW_SRVR_DONE_A:
   416 		case SSL3_ST_SW_SRVR_DONE_B:
   417 			ret=dtls1_send_server_done(s);
   418 			if (ret <= 0) goto end;
   419 			s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
   420 			s->state=SSL3_ST_SW_FLUSH;
   421 			s->init_num=0;
   422 			break;
   423 		
   424 		case SSL3_ST_SW_FLUSH:
   425 			/* number of bytes to be flushed */
   426 			num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
   427 			if (num1 > 0)
   428 				{
   429 				s->rwstate=SSL_WRITING;
   430 				num1=BIO_flush(s->wbio);
   431 				if (num1 <= 0) { ret= -1; goto end; }
   432 				s->rwstate=SSL_NOTHING;
   433 				}
   434 
   435 			s->state=s->s3->tmp.next_state;
   436 			break;
   437 
   438 		case SSL3_ST_SR_CERT_A:
   439 		case SSL3_ST_SR_CERT_B:
   440 			/* Check for second client hello (MS SGC) */
   441 			ret = ssl3_check_client_hello(s);
   442 			if (ret <= 0)
   443 				goto end;
   444 			if (ret == 2)
   445 				s->state = SSL3_ST_SR_CLNT_HELLO_C;
   446 			else {
   447 				/* could be sent for a DH cert, even if we
   448 				 * have not asked for it :-) */
   449 				ret=ssl3_get_client_certificate(s);
   450 				if (ret <= 0) goto end;
   451 				s->init_num=0;
   452 				s->state=SSL3_ST_SR_KEY_EXCH_A;
   453 			}
   454 			break;
   455 
   456 		case SSL3_ST_SR_KEY_EXCH_A:
   457 		case SSL3_ST_SR_KEY_EXCH_B:
   458 			ret=ssl3_get_client_key_exchange(s);
   459 			if (ret <= 0) goto end;
   460 			s->state=SSL3_ST_SR_CERT_VRFY_A;
   461 			s->init_num=0;
   462 
   463 			/* We need to get hashes here so if there is
   464 			 * a client cert, it can be verified */ 
   465 			s->method->ssl3_enc->cert_verify_mac(s,
   466 				&(s->s3->finish_dgst1),
   467 				&(s->s3->tmp.cert_verify_md[0]));
   468 			s->method->ssl3_enc->cert_verify_mac(s,
   469 				&(s->s3->finish_dgst2),
   470 				&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
   471 
   472 			break;
   473 
   474 		case SSL3_ST_SR_CERT_VRFY_A:
   475 		case SSL3_ST_SR_CERT_VRFY_B:
   476 
   477 			/* we should decide if we expected this one */
   478 			ret=ssl3_get_cert_verify(s);
   479 			if (ret <= 0) goto end;
   480 
   481 			s->state=SSL3_ST_SR_FINISHED_A;
   482 			s->init_num=0;
   483 			break;
   484 
   485 		case SSL3_ST_SR_FINISHED_A:
   486 		case SSL3_ST_SR_FINISHED_B:
   487 			ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
   488 				SSL3_ST_SR_FINISHED_B);
   489 			if (ret <= 0) goto end;
   490 			if (s->hit)
   491 				s->state=SSL_ST_OK;
   492 			else
   493 				s->state=SSL3_ST_SW_CHANGE_A;
   494 			s->init_num=0;
   495 			break;
   496 
   497 		case SSL3_ST_SW_CHANGE_A:
   498 		case SSL3_ST_SW_CHANGE_B:
   499 
   500 			s->session->cipher=s->s3->tmp.new_cipher;
   501 			if (!s->method->ssl3_enc->setup_key_block(s))
   502 				{ ret= -1; goto end; }
   503 
   504 			ret=dtls1_send_change_cipher_spec(s,
   505 				SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
   506 
   507 			if (ret <= 0) goto end;
   508 			s->state=SSL3_ST_SW_FINISHED_A;
   509 			s->init_num=0;
   510 
   511 			if (!s->method->ssl3_enc->change_cipher_state(s,
   512 				SSL3_CHANGE_CIPHER_SERVER_WRITE))
   513 				{
   514 				ret= -1;
   515 				goto end;
   516 				}
   517 
   518 			dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
   519 			break;
   520 
   521 		case SSL3_ST_SW_FINISHED_A:
   522 		case SSL3_ST_SW_FINISHED_B:
   523 			ret=dtls1_send_finished(s,
   524 				SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
   525 				s->method->ssl3_enc->server_finished_label,
   526 				s->method->ssl3_enc->server_finished_label_len);
   527 			if (ret <= 0) goto end;
   528 			s->state=SSL3_ST_SW_FLUSH;
   529 			if (s->hit)
   530 				s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
   531 			else
   532 				s->s3->tmp.next_state=SSL_ST_OK;
   533 			s->init_num=0;
   534 			break;
   535 
   536 		case SSL_ST_OK:
   537 			/* clean a few things up */
   538 			ssl3_cleanup_key_block(s);
   539 
   540 #if 0
   541 			BUF_MEM_free(s->init_buf);
   542 			s->init_buf=NULL;
   543 #endif
   544 
   545 			/* remove buffering on output */
   546 			ssl_free_wbio_buffer(s);
   547 
   548 			s->init_num=0;
   549 
   550 			if (s->new_session == 2) /* skipped if we just sent a HelloRequest */
   551 				{
   552 				/* actually not necessarily a 'new' session unless
   553 				 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
   554 				
   555 				s->new_session=0;
   556 				
   557 				ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
   558 				
   559 				s->ctx->stats.sess_accept_good++;
   560 				/* s->server=1; */
   561 				s->handshake_func=dtls1_accept;
   562 
   563 				if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
   564 				}
   565 			
   566 			ret = 1;
   567 
   568 			/* done handshaking, next message is client hello */
   569 			s->d1->handshake_read_seq = 0;
   570 			/* next message is server hello */
   571 			s->d1->handshake_write_seq = 0;
   572 			goto end;
   573 			/* break; */
   574 
   575 		default:
   576 			SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_UNKNOWN_STATE);
   577 			ret= -1;
   578 			goto end;
   579 			/* break; */
   580 			}
   581 		
   582 		if (!s->s3->tmp.reuse_message && !skip)
   583 			{
   584 			if (s->debug)
   585 				{
   586 				if ((ret=BIO_flush(s->wbio)) <= 0)
   587 					goto end;
   588 				}
   589 
   590 
   591 			if ((cb != NULL) && (s->state != state))
   592 				{
   593 				new_state=s->state;
   594 				s->state=state;
   595 				cb(s,SSL_CB_ACCEPT_LOOP,1);
   596 				s->state=new_state;
   597 				}
   598 			}
   599 		skip=0;
   600 		}
   601 end:
   602 	/* BIO_flush(s->wbio); */
   603 
   604 	s->in_handshake--;
   605 	if (cb != NULL)
   606 		cb(s,SSL_CB_ACCEPT_EXIT,ret);
   607 	return(ret);
   608 	}
   609 
   610 int dtls1_send_hello_request(SSL *s)
   611 	{
   612 	unsigned char *p;
   613 
   614 	if (s->state == SSL3_ST_SW_HELLO_REQ_A)
   615 		{
   616 		p=(unsigned char *)s->init_buf->data;
   617 		p = dtls1_set_message_header(s, p, SSL3_MT_HELLO_REQUEST, 0, 0, 0);
   618 
   619 		s->state=SSL3_ST_SW_HELLO_REQ_B;
   620 		/* number of bytes to write */
   621 		s->init_num=DTLS1_HM_HEADER_LENGTH;
   622 		s->init_off=0;
   623 
   624 		/* no need to buffer this message, since there are no retransmit 
   625 		 * requests for it */
   626 		}
   627 
   628 	/* SSL3_ST_SW_HELLO_REQ_B */
   629 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
   630 	}
   631 
   632 int dtls1_send_hello_verify_request(SSL *s)
   633 	{
   634 	unsigned int msg_len;
   635 	unsigned char *msg, *buf, *p;
   636 
   637 	if (s->state == DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A)
   638 		{
   639 		buf = (unsigned char *)s->init_buf->data;
   640 
   641 		msg = p = &(buf[DTLS1_HM_HEADER_LENGTH]);
   642 		if (s->client_version == DTLS1_BAD_VER)
   643 			*(p++) = DTLS1_BAD_VER>>8,
   644 			*(p++) = DTLS1_BAD_VER&0xff;
   645 		else
   646 			*(p++) = s->version >> 8,
   647 			*(p++) = s->version & 0xFF;
   648 
   649 		if (s->ctx->app_gen_cookie_cb != NULL &&
   650 		    s->ctx->app_gen_cookie_cb(s, s->d1->cookie, 
   651 		    &(s->d1->cookie_len)) == 0)
   652 			{
   653 			SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,ERR_R_INTERNAL_ERROR);
   654 			return 0;
   655 			}
   656 		/* else the cookie is assumed to have 
   657 		 * been initialized by the application */
   658 
   659 		*(p++) = (unsigned char) s->d1->cookie_len;
   660 		memcpy(p, s->d1->cookie, s->d1->cookie_len);
   661 		p += s->d1->cookie_len;
   662 		msg_len = p - msg;
   663 
   664 		dtls1_set_message_header(s, buf,
   665 			DTLS1_MT_HELLO_VERIFY_REQUEST, msg_len, 0, msg_len);
   666 
   667 		s->state=DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B;
   668 		/* number of bytes to write */
   669 		s->init_num=p-buf;
   670 		s->init_off=0;
   671 
   672 		/* buffer the message to handle re-xmits */
   673 		dtls1_buffer_message(s, 0);
   674 		}
   675 
   676 	/* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */
   677 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
   678 	}
   679 
   680 int dtls1_send_server_hello(SSL *s)
   681 	{
   682 	unsigned char *buf;
   683 	unsigned char *p,*d;
   684 	int i;
   685 	unsigned int sl;
   686 	unsigned long l,Time;
   687 
   688 	if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
   689 		{
   690 		buf=(unsigned char *)s->init_buf->data;
   691 		p=s->s3->server_random;
   692 		Time=(unsigned long)time(NULL);			/* Time */
   693 		l2n(Time,p);
   694 		RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
   695 		/* Do the message type and length last */
   696 		d=p= &(buf[DTLS1_HM_HEADER_LENGTH]);
   697 
   698 		if (s->client_version == DTLS1_BAD_VER)
   699 			*(p++)=DTLS1_BAD_VER>>8,
   700 			*(p++)=DTLS1_BAD_VER&0xff;
   701 		else
   702 			*(p++)=s->version>>8,
   703 			*(p++)=s->version&0xff;
   704 
   705 		/* Random stuff */
   706 		memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
   707 		p+=SSL3_RANDOM_SIZE;
   708 
   709 		/* now in theory we have 3 options to sending back the
   710 		 * session id.  If it is a re-use, we send back the
   711 		 * old session-id, if it is a new session, we send
   712 		 * back the new session-id or we send back a 0 length
   713 		 * session-id if we want it to be single use.
   714 		 * Currently I will not implement the '0' length session-id
   715 		 * 12-Jan-98 - I'll now support the '0' length stuff.
   716 		 */
   717 		if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
   718 			s->session->session_id_length=0;
   719 
   720 		sl=s->session->session_id_length;
   721 		if (sl > sizeof s->session->session_id)
   722 			{
   723 			SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
   724 			return -1;
   725 			}
   726 		*(p++)=sl;
   727 		memcpy(p,s->session->session_id,sl);
   728 		p+=sl;
   729 
   730 		/* put the cipher */
   731 		i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
   732 		p+=i;
   733 
   734 		/* put the compression method */
   735 #ifdef OPENSSL_NO_COMP
   736 		*(p++)=0;
   737 #else
   738 		if (s->s3->tmp.new_compression == NULL)
   739 			*(p++)=0;
   740 		else
   741 			*(p++)=s->s3->tmp.new_compression->id;
   742 #endif
   743 
   744 		/* do the header */
   745 		l=(p-d);
   746 		d=buf;
   747 
   748 		d = dtls1_set_message_header(s, d, SSL3_MT_SERVER_HELLO, l, 0, l);
   749 
   750 		s->state=SSL3_ST_CW_CLNT_HELLO_B;
   751 		/* number of bytes to write */
   752 		s->init_num=p-buf;
   753 		s->init_off=0;
   754 
   755 		/* buffer the message to handle re-xmits */
   756 		dtls1_buffer_message(s, 0);
   757 		}
   758 
   759 	/* SSL3_ST_CW_CLNT_HELLO_B */
   760 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
   761 	}
   762 
   763 int dtls1_send_server_done(SSL *s)
   764 	{
   765 	unsigned char *p;
   766 
   767 	if (s->state == SSL3_ST_SW_SRVR_DONE_A)
   768 		{
   769 		p=(unsigned char *)s->init_buf->data;
   770 
   771 		/* do the header */
   772 		p = dtls1_set_message_header(s, p, SSL3_MT_SERVER_DONE, 0, 0, 0);
   773 
   774 		s->state=SSL3_ST_SW_SRVR_DONE_B;
   775 		/* number of bytes to write */
   776 		s->init_num=DTLS1_HM_HEADER_LENGTH;
   777 		s->init_off=0;
   778 
   779 		/* buffer the message to handle re-xmits */
   780 		dtls1_buffer_message(s, 0);
   781 		}
   782 
   783 	/* SSL3_ST_CW_CLNT_HELLO_B */
   784 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
   785 	}
   786 
   787 int dtls1_send_server_key_exchange(SSL *s)
   788 	{
   789 #ifndef OPENSSL_NO_RSA
   790 	unsigned char *q;
   791 	int j,num;
   792 	RSA *rsa;
   793 	unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
   794 	unsigned int u;
   795 #endif
   796 #ifndef OPENSSL_NO_DH
   797 	DH *dh=NULL,*dhp;
   798 #endif
   799 	EVP_PKEY *pkey;
   800 	unsigned char *p,*d;
   801 	int al,i;
   802 	unsigned long type;
   803 	int n;
   804 	CERT *cert;
   805 	BIGNUM *r[4];
   806 	int nr[4],kn;
   807 	BUF_MEM *buf;
   808 	EVP_MD_CTX md_ctx;
   809 
   810 	EVP_MD_CTX_init(&md_ctx);
   811 	if (s->state == SSL3_ST_SW_KEY_EXCH_A)
   812 		{
   813 		type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
   814 		cert=s->cert;
   815 
   816 		buf=s->init_buf;
   817 
   818 		r[0]=r[1]=r[2]=r[3]=NULL;
   819 		n=0;
   820 #ifndef OPENSSL_NO_RSA
   821 		if (type & SSL_kRSA)
   822 			{
   823 			rsa=cert->rsa_tmp;
   824 			if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
   825 				{
   826 				rsa=s->cert->rsa_tmp_cb(s,
   827 				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
   828 				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
   829 				if(rsa == NULL)
   830 				{
   831 					al=SSL_AD_HANDSHAKE_FAILURE;
   832 					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
   833 					goto f_err;
   834 				}
   835 				RSA_up_ref(rsa);
   836 				cert->rsa_tmp=rsa;
   837 				}
   838 			if (rsa == NULL)
   839 				{
   840 				al=SSL_AD_HANDSHAKE_FAILURE;
   841 				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
   842 				goto f_err;
   843 				}
   844 			r[0]=rsa->n;
   845 			r[1]=rsa->e;
   846 			s->s3->tmp.use_rsa_tmp=1;
   847 			}
   848 		else
   849 #endif
   850 #ifndef OPENSSL_NO_DH
   851 			if (type & SSL_kEDH)
   852 			{
   853 			dhp=cert->dh_tmp;
   854 			if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
   855 				dhp=s->cert->dh_tmp_cb(s,
   856 				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
   857 				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
   858 			if (dhp == NULL)
   859 				{
   860 				al=SSL_AD_HANDSHAKE_FAILURE;
   861 				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
   862 				goto f_err;
   863 				}
   864 
   865 			if (s->s3->tmp.dh != NULL)
   866 				{
   867 				DH_free(dh);
   868 				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
   869 				goto err;
   870 				}
   871 
   872 			if ((dh=DHparams_dup(dhp)) == NULL)
   873 				{
   874 				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
   875 				goto err;
   876 				}
   877 
   878 			s->s3->tmp.dh=dh;
   879 			if ((dhp->pub_key == NULL ||
   880 			     dhp->priv_key == NULL ||
   881 			     (s->options & SSL_OP_SINGLE_DH_USE)))
   882 				{
   883 				if(!DH_generate_key(dh))
   884 				    {
   885 				    SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,
   886 					   ERR_R_DH_LIB);
   887 				    goto err;
   888 				    }
   889 				}
   890 			else
   891 				{
   892 				dh->pub_key=BN_dup(dhp->pub_key);
   893 				dh->priv_key=BN_dup(dhp->priv_key);
   894 				if ((dh->pub_key == NULL) ||
   895 					(dh->priv_key == NULL))
   896 					{
   897 					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
   898 					goto err;
   899 					}
   900 				}
   901 			r[0]=dh->p;
   902 			r[1]=dh->g;
   903 			r[2]=dh->pub_key;
   904 			}
   905 		else 
   906 #endif
   907 			{
   908 			al=SSL_AD_HANDSHAKE_FAILURE;
   909 			SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
   910 			goto f_err;
   911 			}
   912 		for (i=0; r[i] != NULL; i++)
   913 			{
   914 			nr[i]=BN_num_bytes(r[i]);
   915 			n+=2+nr[i];
   916 			}
   917 
   918 		if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
   919 			{
   920 			if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
   921 				== NULL)
   922 				{
   923 				al=SSL_AD_DECODE_ERROR;
   924 				goto f_err;
   925 				}
   926 			kn=EVP_PKEY_size(pkey);
   927 			}
   928 		else
   929 			{
   930 			pkey=NULL;
   931 			kn=0;
   932 			}
   933 
   934 		if (!BUF_MEM_grow_clean(buf,n+DTLS1_HM_HEADER_LENGTH+kn))
   935 			{
   936 			SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
   937 			goto err;
   938 			}
   939 		d=(unsigned char *)s->init_buf->data;
   940 		p= &(d[DTLS1_HM_HEADER_LENGTH]);
   941 
   942 		for (i=0; r[i] != NULL; i++)
   943 			{
   944 			s2n(nr[i],p);
   945 			BN_bn2bin(r[i],p);
   946 			p+=nr[i];
   947 			}
   948 
   949 		/* not anonymous */
   950 		if (pkey != NULL)
   951 			{
   952 			/* n is the length of the params, they start at
   953 			 * &(d[DTLS1_HM_HEADER_LENGTH]) and p points to the space
   954 			 * at the end. */
   955 #ifndef OPENSSL_NO_RSA
   956 			if (pkey->type == EVP_PKEY_RSA)
   957 				{
   958 				q=md_buf;
   959 				j=0;
   960 				for (num=2; num > 0; num--)
   961 					{
   962 					EVP_DigestInit_ex(&md_ctx,(num == 2)
   963 						?s->ctx->md5:s->ctx->sha1, NULL);
   964 					EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
   965 					EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
   966 					EVP_DigestUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
   967 					EVP_DigestFinal_ex(&md_ctx,q,
   968 						(unsigned int *)&i);
   969 					q+=i;
   970 					j+=i;
   971 					}
   972 				if (RSA_sign(NID_md5_sha1, md_buf, j,
   973 					&(p[2]), &u, pkey->pkey.rsa) <= 0)
   974 					{
   975 					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
   976 					goto err;
   977 					}
   978 				s2n(u,p);
   979 				n+=u+2;
   980 				}
   981 			else
   982 #endif
   983 #if !defined(OPENSSL_NO_DSA)
   984 				if (pkey->type == EVP_PKEY_DSA)
   985 				{
   986 				/* lets do DSS */
   987 				EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
   988 				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
   989 				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
   990 				EVP_SignUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
   991 				if (!EVP_SignFinal(&md_ctx,&(p[2]),
   992 					(unsigned int *)&i,pkey))
   993 					{
   994 					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
   995 					goto err;
   996 					}
   997 				s2n(i,p);
   998 				n+=i+2;
   999 				}
  1000 			else
  1001 #endif
  1002 				{
  1003 				/* Is this error check actually needed? */
  1004 				al=SSL_AD_HANDSHAKE_FAILURE;
  1005 				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
  1006 				goto f_err;
  1007 				}
  1008 			}
  1009 
  1010 		d = dtls1_set_message_header(s, d,
  1011 			SSL3_MT_SERVER_KEY_EXCHANGE, n, 0, n);
  1012 
  1013 		/* we should now have things packed up, so lets send
  1014 		 * it off */
  1015 		s->init_num=n+DTLS1_HM_HEADER_LENGTH;
  1016 		s->init_off=0;
  1017 
  1018 		/* buffer the message to handle re-xmits */
  1019 		dtls1_buffer_message(s, 0);
  1020 		}
  1021 
  1022 	s->state = SSL3_ST_SW_KEY_EXCH_B;
  1023 	EVP_MD_CTX_cleanup(&md_ctx);
  1024 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  1025 f_err:
  1026 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
  1027 err:
  1028 	EVP_MD_CTX_cleanup(&md_ctx);
  1029 	return(-1);
  1030 	}
  1031 
  1032 int dtls1_send_certificate_request(SSL *s)
  1033 	{
  1034 	unsigned char *p,*d;
  1035 	int i,j,nl,off,n;
  1036 	STACK_OF(X509_NAME) *sk=NULL;
  1037 	X509_NAME *name;
  1038 	BUF_MEM *buf;
  1039 	unsigned int msg_len;
  1040 
  1041 	if (s->state == SSL3_ST_SW_CERT_REQ_A)
  1042 		{
  1043 		buf=s->init_buf;
  1044 
  1045 		d=p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH]);
  1046 
  1047 		/* get the list of acceptable cert types */
  1048 		p++;
  1049 		n=ssl3_get_req_cert_type(s,p);
  1050 		d[0]=n;
  1051 		p+=n;
  1052 		n++;
  1053 
  1054 		off=n;
  1055 		p+=2;
  1056 		n+=2;
  1057 
  1058 		sk=SSL_get_client_CA_list(s);
  1059 		nl=0;
  1060 		if (sk != NULL)
  1061 			{
  1062 			for (i=0; i<sk_X509_NAME_num(sk); i++)
  1063 				{
  1064 				name=sk_X509_NAME_value(sk,i);
  1065 				j=i2d_X509_NAME(name,NULL);
  1066 				if (!BUF_MEM_grow_clean(buf,DTLS1_HM_HEADER_LENGTH+n+j+2))
  1067 					{
  1068 					SSLerr(SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
  1069 					goto err;
  1070 					}
  1071 				p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+n]);
  1072 				if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
  1073 					{
  1074 					s2n(j,p);
  1075 					i2d_X509_NAME(name,&p);
  1076 					n+=2+j;
  1077 					nl+=2+j;
  1078 					}
  1079 				else
  1080 					{
  1081 					d=p;
  1082 					i2d_X509_NAME(name,&p);
  1083 					j-=2; s2n(j,d); j+=2;
  1084 					n+=j;
  1085 					nl+=j;
  1086 					}
  1087 				}
  1088 			}
  1089 		/* else no CA names */
  1090 		p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+off]);
  1091 		s2n(nl,p);
  1092 
  1093 		d=(unsigned char *)buf->data;
  1094 		*(d++)=SSL3_MT_CERTIFICATE_REQUEST;
  1095 		l2n3(n,d);
  1096 		s2n(s->d1->handshake_write_seq,d);
  1097 		s->d1->handshake_write_seq++;
  1098 
  1099 		/* we should now have things packed up, so lets send
  1100 		 * it off */
  1101 
  1102 		s->init_num=n+DTLS1_HM_HEADER_LENGTH;
  1103 		s->init_off=0;
  1104 #ifdef NETSCAPE_HANG_BUG
  1105 /* XXX: what to do about this? */
  1106 		p=(unsigned char *)s->init_buf->data + s->init_num;
  1107 
  1108 		/* do the header */
  1109 		*(p++)=SSL3_MT_SERVER_DONE;
  1110 		*(p++)=0;
  1111 		*(p++)=0;
  1112 		*(p++)=0;
  1113 		s->init_num += 4;
  1114 #endif
  1115 
  1116 		/* XDTLS:  set message header ? */
  1117 		msg_len = s->init_num - DTLS1_HM_HEADER_LENGTH;
  1118 		dtls1_set_message_header(s, (void *)s->init_buf->data,
  1119 			SSL3_MT_CERTIFICATE_REQUEST, msg_len, 0, msg_len);
  1120 
  1121 		/* buffer the message to handle re-xmits */
  1122 		dtls1_buffer_message(s, 0);
  1123 
  1124 		s->state = SSL3_ST_SW_CERT_REQ_B;
  1125 		}
  1126 
  1127 	/* SSL3_ST_SW_CERT_REQ_B */
  1128 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  1129 err:
  1130 	return(-1);
  1131 	}
  1132 
  1133 int dtls1_send_server_certificate(SSL *s)
  1134 	{
  1135 	unsigned long l;
  1136 	X509 *x;
  1137 
  1138 	if (s->state == SSL3_ST_SW_CERT_A)
  1139 		{
  1140 		x=ssl_get_server_send_cert(s);
  1141 		if (x == NULL &&
  1142                         /* VRS: allow null cert if auth == KRB5 */
  1143                         (s->s3->tmp.new_cipher->algorithms
  1144                                 & (SSL_MKEY_MASK|SSL_AUTH_MASK))
  1145                         != (SSL_aKRB5|SSL_kKRB5))
  1146 			{
  1147 			SSLerr(SSL_F_DTLS1_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
  1148 			return(0);
  1149 			}
  1150 
  1151 		l=dtls1_output_cert_chain(s,x);
  1152 		s->state=SSL3_ST_SW_CERT_B;
  1153 		s->init_num=(int)l;
  1154 		s->init_off=0;
  1155 
  1156 		/* buffer the message to handle re-xmits */
  1157 		dtls1_buffer_message(s, 0);
  1158 		}
  1159 
  1160 	/* SSL3_ST_SW_CERT_B */
  1161 	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  1162 	}