1160814Ssimon/* ssl/d1_srvr.c */
2160814Ssimon/*
3160814Ssimon * DTLS implementation written by Nagendra Modadugu
4160814Ssimon * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
5160814Ssimon */
6160814Ssimon/* ====================================================================
7238405Sjkim * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
8160814Ssimon *
9160814Ssimon * Redistribution and use in source and binary forms, with or without
10160814Ssimon * modification, are permitted provided that the following conditions
11160814Ssimon * are met:
12160814Ssimon *
13160814Ssimon * 1. Redistributions of source code must retain the above copyright
14160814Ssimon *    notice, this list of conditions and the following disclaimer.
15160814Ssimon *
16160814Ssimon * 2. Redistributions in binary form must reproduce the above copyright
17160814Ssimon *    notice, this list of conditions and the following disclaimer in
18160814Ssimon *    the documentation and/or other materials provided with the
19160814Ssimon *    distribution.
20160814Ssimon *
21160814Ssimon * 3. All advertising materials mentioning features or use of this
22160814Ssimon *    software must display the following acknowledgment:
23160814Ssimon *    "This product includes software developed by the OpenSSL Project
24160814Ssimon *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25160814Ssimon *
26160814Ssimon * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27160814Ssimon *    endorse or promote products derived from this software without
28160814Ssimon *    prior written permission. For written permission, please contact
29160814Ssimon *    openssl-core@OpenSSL.org.
30160814Ssimon *
31160814Ssimon * 5. Products derived from this software may not be called "OpenSSL"
32160814Ssimon *    nor may "OpenSSL" appear in their names without prior written
33160814Ssimon *    permission of the OpenSSL Project.
34160814Ssimon *
35160814Ssimon * 6. Redistributions of any form whatsoever must retain the following
36160814Ssimon *    acknowledgment:
37160814Ssimon *    "This product includes software developed by the OpenSSL Project
38160814Ssimon *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39160814Ssimon *
40160814Ssimon * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41160814Ssimon * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42160814Ssimon * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43160814Ssimon * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44160814Ssimon * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45160814Ssimon * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46160814Ssimon * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47160814Ssimon * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48160814Ssimon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49160814Ssimon * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50160814Ssimon * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51160814Ssimon * OF THE POSSIBILITY OF SUCH DAMAGE.
52160814Ssimon * ====================================================================
53160814Ssimon *
54160814Ssimon * This product includes cryptographic software written by Eric Young
55160814Ssimon * (eay@cryptsoft.com).  This product includes software written by Tim
56160814Ssimon * Hudson (tjh@cryptsoft.com).
57160814Ssimon *
58160814Ssimon */
59160814Ssimon/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
60160814Ssimon * All rights reserved.
61160814Ssimon *
62160814Ssimon * This package is an SSL implementation written
63160814Ssimon * by Eric Young (eay@cryptsoft.com).
64160814Ssimon * The implementation was written so as to conform with Netscapes SSL.
65160814Ssimon *
66160814Ssimon * This library is free for commercial and non-commercial use as long as
67160814Ssimon * the following conditions are aheared to.  The following conditions
68160814Ssimon * apply to all code found in this distribution, be it the RC4, RSA,
69160814Ssimon * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
70160814Ssimon * included with this distribution is covered by the same copyright terms
71160814Ssimon * except that the holder is Tim Hudson (tjh@cryptsoft.com).
72160814Ssimon *
73160814Ssimon * Copyright remains Eric Young's, and as such any Copyright notices in
74160814Ssimon * the code are not to be removed.
75160814Ssimon * If this package is used in a product, Eric Young should be given attribution
76160814Ssimon * as the author of the parts of the library used.
77160814Ssimon * This can be in the form of a textual message at program startup or
78160814Ssimon * in documentation (online or textual) provided with the package.
79160814Ssimon *
80160814Ssimon * Redistribution and use in source and binary forms, with or without
81160814Ssimon * modification, are permitted provided that the following conditions
82160814Ssimon * are met:
83160814Ssimon * 1. Redistributions of source code must retain the copyright
84160814Ssimon *    notice, this list of conditions and the following disclaimer.
85160814Ssimon * 2. Redistributions in binary form must reproduce the above copyright
86160814Ssimon *    notice, this list of conditions and the following disclaimer in the
87160814Ssimon *    documentation and/or other materials provided with the distribution.
88160814Ssimon * 3. All advertising materials mentioning features or use of this software
89160814Ssimon *    must display the following acknowledgement:
90160814Ssimon *    "This product includes cryptographic software written by
91160814Ssimon *     Eric Young (eay@cryptsoft.com)"
92160814Ssimon *    The word 'cryptographic' can be left out if the rouines from the library
93160814Ssimon *    being used are not cryptographic related :-).
94160814Ssimon * 4. If you include any Windows specific code (or a derivative thereof) from
95160814Ssimon *    the apps directory (application code) you must include an acknowledgement:
96160814Ssimon *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
97160814Ssimon *
98160814Ssimon * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
99160814Ssimon * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100160814Ssimon * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101160814Ssimon * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
102160814Ssimon * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
103160814Ssimon * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
104160814Ssimon * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
105160814Ssimon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
106160814Ssimon * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
107160814Ssimon * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
108160814Ssimon * SUCH DAMAGE.
109160814Ssimon *
110160814Ssimon * The licence and distribution terms for any publically available version or
111160814Ssimon * derivative of this code cannot be changed.  i.e. this code cannot simply be
112160814Ssimon * copied and put under another distribution licence
113160814Ssimon * [including the GNU Public Licence.]
114160814Ssimon */
115160814Ssimon
116160814Ssimon#include <stdio.h>
117160814Ssimon#include "ssl_locl.h"
118160814Ssimon#include <openssl/buffer.h>
119160814Ssimon#include <openssl/rand.h>
120160814Ssimon#include <openssl/objects.h>
121160814Ssimon#include <openssl/evp.h>
122160814Ssimon#include <openssl/x509.h>
123160814Ssimon#include <openssl/md5.h>
124238405Sjkim#include <openssl/bn.h>
125160814Ssimon#ifndef OPENSSL_NO_DH
126160814Ssimon#include <openssl/dh.h>
127160814Ssimon#endif
128160814Ssimon
129238405Sjkimstatic const SSL_METHOD *dtls1_get_server_method(int ver);
130160814Ssimonstatic int dtls1_send_hello_verify_request(SSL *s);
131160814Ssimon
132238405Sjkimstatic const SSL_METHOD *dtls1_get_server_method(int ver)
133160814Ssimon	{
134160814Ssimon	if (ver == DTLS1_VERSION)
135160814Ssimon		return(DTLSv1_server_method());
136160814Ssimon	else
137160814Ssimon		return(NULL);
138160814Ssimon	}
139160814Ssimon
140160814SsimonIMPLEMENT_dtls1_meth_func(DTLSv1_server_method,
141160814Ssimon			dtls1_accept,
142160814Ssimon			ssl_undefined_function,
143160814Ssimon			dtls1_get_server_method)
144160814Ssimon
145160814Ssimonint dtls1_accept(SSL *s)
146160814Ssimon	{
147160814Ssimon	BUF_MEM *buf;
148238405Sjkim	unsigned long Time=(unsigned long)time(NULL);
149160814Ssimon	void (*cb)(const SSL *ssl,int type,int val)=NULL;
150238405Sjkim	unsigned long alg_k;
151160814Ssimon	int ret= -1;
152160814Ssimon	int new_state,state,skip=0;
153237657Sjkim	int listen;
154238405Sjkim#ifndef OPENSSL_NO_SCTP
155238405Sjkim	unsigned char sctpauthkey[64];
156238405Sjkim	char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
157238405Sjkim#endif
158160814Ssimon
159160814Ssimon	RAND_add(&Time,sizeof(Time),0);
160160814Ssimon	ERR_clear_error();
161160814Ssimon	clear_sys_error();
162160814Ssimon
163160814Ssimon	if (s->info_callback != NULL)
164160814Ssimon		cb=s->info_callback;
165160814Ssimon	else if (s->ctx->info_callback != NULL)
166160814Ssimon		cb=s->ctx->info_callback;
167237657Sjkim
168237657Sjkim	listen = s->d1->listen;
169160814Ssimon
170160814Ssimon	/* init things to blank */
171160814Ssimon	s->in_handshake++;
172160814Ssimon	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
173160814Ssimon
174237657Sjkim	s->d1->listen = listen;
175238405Sjkim#ifndef OPENSSL_NO_SCTP
176238405Sjkim	/* Notify SCTP BIO socket to enter handshake
177238405Sjkim	 * mode and prevent stream identifier other
178238405Sjkim	 * than 0. Will be ignored if no SCTP is used.
179238405Sjkim	 */
180238405Sjkim	BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
181238405Sjkim#endif
182237657Sjkim
183160814Ssimon	if (s->cert == NULL)
184160814Ssimon		{
185160814Ssimon		SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
186160814Ssimon		return(-1);
187160814Ssimon		}
188160814Ssimon
189238405Sjkim#ifndef OPENSSL_NO_HEARTBEATS
190238405Sjkim	/* If we're awaiting a HeartbeatResponse, pretend we
191238405Sjkim	 * already got and don't await it anymore, because
192238405Sjkim	 * Heartbeats don't make sense during handshakes anyway.
193238405Sjkim	 */
194238405Sjkim	if (s->tlsext_hb_pending)
195238405Sjkim		{
196238405Sjkim		dtls1_stop_timer(s);
197238405Sjkim		s->tlsext_hb_pending = 0;
198238405Sjkim		s->tlsext_hb_seq++;
199238405Sjkim		}
200238405Sjkim#endif
201238405Sjkim
202160814Ssimon	for (;;)
203160814Ssimon		{
204160814Ssimon		state=s->state;
205160814Ssimon
206160814Ssimon		switch (s->state)
207160814Ssimon			{
208160814Ssimon		case SSL_ST_RENEGOTIATE:
209238405Sjkim			s->renegotiate=1;
210160814Ssimon			/* s->state=SSL_ST_ACCEPT; */
211160814Ssimon
212160814Ssimon		case SSL_ST_BEFORE:
213160814Ssimon		case SSL_ST_ACCEPT:
214160814Ssimon		case SSL_ST_BEFORE|SSL_ST_ACCEPT:
215160814Ssimon		case SSL_ST_OK|SSL_ST_ACCEPT:
216160814Ssimon
217160814Ssimon			s->server=1;
218160814Ssimon			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
219160814Ssimon
220160814Ssimon			if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00))
221160814Ssimon				{
222160814Ssimon				SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
223160814Ssimon				return -1;
224160814Ssimon				}
225160814Ssimon			s->type=SSL_ST_ACCEPT;
226160814Ssimon
227160814Ssimon			if (s->init_buf == NULL)
228160814Ssimon				{
229160814Ssimon				if ((buf=BUF_MEM_new()) == NULL)
230160814Ssimon					{
231160814Ssimon					ret= -1;
232160814Ssimon					goto end;
233160814Ssimon					}
234160814Ssimon				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
235160814Ssimon					{
236279264Sdelphij					BUF_MEM_free(buf);
237160814Ssimon					ret= -1;
238160814Ssimon					goto end;
239160814Ssimon					}
240160814Ssimon				s->init_buf=buf;
241160814Ssimon				}
242160814Ssimon
243160814Ssimon			if (!ssl3_setup_buffers(s))
244160814Ssimon				{
245160814Ssimon				ret= -1;
246160814Ssimon				goto end;
247160814Ssimon				}
248160814Ssimon
249160814Ssimon			s->init_num=0;
250279264Sdelphij			s->d1->change_cipher_spec_ok = 0;
251279264Sdelphij			/* Should have been reset by ssl3_get_finished, too. */
252279264Sdelphij			s->s3->change_cipher_spec = 0;
253160814Ssimon
254160814Ssimon			if (s->state != SSL_ST_RENEGOTIATE)
255160814Ssimon				{
256160814Ssimon				/* Ok, we now need to push on a buffering BIO so that
257160814Ssimon				 * the output is sent in a way that TCP likes :-)
258238405Sjkim				 * ...but not with SCTP :-)
259160814Ssimon				 */
260238405Sjkim#ifndef OPENSSL_NO_SCTP
261238405Sjkim				if (!BIO_dgram_is_sctp(SSL_get_wbio(s)))
262238405Sjkim#endif
263238405Sjkim					if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
264160814Ssimon
265160814Ssimon				ssl3_init_finished_mac(s);
266160814Ssimon				s->state=SSL3_ST_SR_CLNT_HELLO_A;
267160814Ssimon				s->ctx->stats.sess_accept++;
268160814Ssimon				}
269160814Ssimon			else
270160814Ssimon				{
271160814Ssimon				/* s->state == SSL_ST_RENEGOTIATE,
272160814Ssimon				 * we will just send a HelloRequest */
273160814Ssimon				s->ctx->stats.sess_accept_renegotiate++;
274160814Ssimon				s->state=SSL3_ST_SW_HELLO_REQ_A;
275160814Ssimon				}
276160814Ssimon
277160814Ssimon			break;
278160814Ssimon
279160814Ssimon		case SSL3_ST_SW_HELLO_REQ_A:
280160814Ssimon		case SSL3_ST_SW_HELLO_REQ_B:
281160814Ssimon
282160814Ssimon			s->shutdown=0;
283279264Sdelphij			dtls1_clear_record_buffer(s);
284205128Ssimon			dtls1_start_timer(s);
285160814Ssimon			ret=dtls1_send_hello_request(s);
286160814Ssimon			if (ret <= 0) goto end;
287279264Sdelphij			s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
288160814Ssimon			s->state=SSL3_ST_SW_FLUSH;
289160814Ssimon			s->init_num=0;
290160814Ssimon
291160814Ssimon			ssl3_init_finished_mac(s);
292160814Ssimon			break;
293160814Ssimon
294160814Ssimon		case SSL3_ST_SW_HELLO_REQ_C:
295160814Ssimon			s->state=SSL_ST_OK;
296160814Ssimon			break;
297160814Ssimon
298160814Ssimon		case SSL3_ST_SR_CLNT_HELLO_A:
299160814Ssimon		case SSL3_ST_SR_CLNT_HELLO_B:
300160814Ssimon		case SSL3_ST_SR_CLNT_HELLO_C:
301160814Ssimon
302160814Ssimon			s->shutdown=0;
303160814Ssimon			ret=ssl3_get_client_hello(s);
304160814Ssimon			if (ret <= 0) goto end;
305205128Ssimon			dtls1_stop_timer(s);
306160814Ssimon
307205128Ssimon			if (ret == 1 && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
308160814Ssimon				s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A;
309160814Ssimon			else
310160814Ssimon				s->state = SSL3_ST_SW_SRVR_HELLO_A;
311160814Ssimon
312160814Ssimon			s->init_num=0;
313205128Ssimon
314237657Sjkim			/* Reflect ClientHello sequence to remain stateless while listening */
315237657Sjkim			if (listen)
316237657Sjkim				{
317237657Sjkim				memcpy(s->s3->write_sequence, s->s3->read_sequence, sizeof(s->s3->write_sequence));
318237657Sjkim				}
319237657Sjkim
320205128Ssimon			/* If we're just listening, stop here */
321237657Sjkim			if (listen && s->state == SSL3_ST_SW_SRVR_HELLO_A)
322205128Ssimon				{
323205128Ssimon				ret = 2;
324205128Ssimon				s->d1->listen = 0;
325237657Sjkim				/* Set expected sequence numbers
326237657Sjkim				 * to continue the handshake.
327237657Sjkim				 */
328237657Sjkim				s->d1->handshake_read_seq = 2;
329237657Sjkim				s->d1->handshake_write_seq = 1;
330237657Sjkim				s->d1->next_handshake_write_seq = 1;
331205128Ssimon				goto end;
332205128Ssimon				}
333205128Ssimon
334160814Ssimon			break;
335160814Ssimon
336160814Ssimon		case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
337160814Ssimon		case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
338160814Ssimon
339160814Ssimon			ret = dtls1_send_hello_verify_request(s);
340160814Ssimon			if ( ret <= 0) goto end;
341160814Ssimon			s->state=SSL3_ST_SW_FLUSH;
342160814Ssimon			s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
343194206Ssimon
344238405Sjkim			/* HelloVerifyRequest resets Finished MAC */
345238405Sjkim			if (s->version != DTLS1_BAD_VER)
346194206Ssimon				ssl3_init_finished_mac(s);
347160814Ssimon			break;
348160814Ssimon
349238405Sjkim#ifndef OPENSSL_NO_SCTP
350238405Sjkim		case DTLS1_SCTP_ST_SR_READ_SOCK:
351238405Sjkim
352238405Sjkim			if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))
353238405Sjkim				{
354238405Sjkim				s->s3->in_read_app_data=2;
355238405Sjkim				s->rwstate=SSL_READING;
356238405Sjkim				BIO_clear_retry_flags(SSL_get_rbio(s));
357238405Sjkim				BIO_set_retry_read(SSL_get_rbio(s));
358238405Sjkim				ret = -1;
359238405Sjkim				goto end;
360238405Sjkim				}
361238405Sjkim
362238405Sjkim			s->state=SSL3_ST_SR_FINISHED_A;
363238405Sjkim			break;
364238405Sjkim
365238405Sjkim		case DTLS1_SCTP_ST_SW_WRITE_SOCK:
366238405Sjkim			ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
367238405Sjkim			if (ret < 0) goto end;
368238405Sjkim
369238405Sjkim			if (ret == 0)
370238405Sjkim				{
371238405Sjkim				if (s->d1->next_state != SSL_ST_OK)
372238405Sjkim					{
373238405Sjkim					s->s3->in_read_app_data=2;
374238405Sjkim					s->rwstate=SSL_READING;
375238405Sjkim					BIO_clear_retry_flags(SSL_get_rbio(s));
376238405Sjkim					BIO_set_retry_read(SSL_get_rbio(s));
377238405Sjkim					ret = -1;
378238405Sjkim					goto end;
379238405Sjkim					}
380238405Sjkim				}
381238405Sjkim
382238405Sjkim			s->state=s->d1->next_state;
383238405Sjkim			break;
384238405Sjkim#endif
385238405Sjkim
386160814Ssimon		case SSL3_ST_SW_SRVR_HELLO_A:
387160814Ssimon		case SSL3_ST_SW_SRVR_HELLO_B:
388238405Sjkim			s->renegotiate = 2;
389205128Ssimon			dtls1_start_timer(s);
390160814Ssimon			ret=dtls1_send_server_hello(s);
391160814Ssimon			if (ret <= 0) goto end;
392160814Ssimon
393160814Ssimon			if (s->hit)
394205128Ssimon				{
395238405Sjkim#ifndef OPENSSL_NO_SCTP
396238405Sjkim				/* Add new shared key for SCTP-Auth,
397238405Sjkim				 * will be ignored if no SCTP used.
398238405Sjkim				 */
399238405Sjkim				snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
400238405Sjkim				         DTLS1_SCTP_AUTH_LABEL);
401238405Sjkim
402238405Sjkim				SSL_export_keying_material(s, sctpauthkey,
403238405Sjkim				                           sizeof(sctpauthkey), labelbuffer,
404238405Sjkim				                           sizeof(labelbuffer), NULL, 0, 0);
405238405Sjkim
406238405Sjkim				BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
407238405Sjkim                         sizeof(sctpauthkey), sctpauthkey);
408238405Sjkim#endif
409238405Sjkim#ifndef OPENSSL_NO_TLSEXT
410205128Ssimon				if (s->tlsext_ticket_expected)
411205128Ssimon					s->state=SSL3_ST_SW_SESSION_TICKET_A;
412205128Ssimon				else
413205128Ssimon					s->state=SSL3_ST_SW_CHANGE_A;
414205128Ssimon#else
415238405Sjkim				s->state=SSL3_ST_SW_CHANGE_A;
416205128Ssimon#endif
417238405Sjkim				}
418160814Ssimon			else
419160814Ssimon				s->state=SSL3_ST_SW_CERT_A;
420160814Ssimon			s->init_num=0;
421160814Ssimon			break;
422160814Ssimon
423160814Ssimon		case SSL3_ST_SW_CERT_A:
424160814Ssimon		case SSL3_ST_SW_CERT_B:
425238405Sjkim			/* Check if it is anon DH or normal PSK */
426238405Sjkim			if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
427238405Sjkim				&& !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
428160814Ssimon				{
429205128Ssimon				dtls1_start_timer(s);
430160814Ssimon				ret=dtls1_send_server_certificate(s);
431160814Ssimon				if (ret <= 0) goto end;
432205128Ssimon#ifndef OPENSSL_NO_TLSEXT
433205128Ssimon				if (s->tlsext_status_expected)
434205128Ssimon					s->state=SSL3_ST_SW_CERT_STATUS_A;
435205128Ssimon				else
436205128Ssimon					s->state=SSL3_ST_SW_KEY_EXCH_A;
437160814Ssimon				}
438160814Ssimon			else
439205128Ssimon				{
440205128Ssimon				skip = 1;
441205128Ssimon				s->state=SSL3_ST_SW_KEY_EXCH_A;
442205128Ssimon				}
443205128Ssimon#else
444205128Ssimon				}
445205128Ssimon			else
446160814Ssimon				skip=1;
447205128Ssimon
448160814Ssimon			s->state=SSL3_ST_SW_KEY_EXCH_A;
449205128Ssimon#endif
450160814Ssimon			s->init_num=0;
451160814Ssimon			break;
452160814Ssimon
453160814Ssimon		case SSL3_ST_SW_KEY_EXCH_A:
454160814Ssimon		case SSL3_ST_SW_KEY_EXCH_B:
455238405Sjkim			alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
456160814Ssimon
457277195Sdelphij			/*
458277195Sdelphij			 * clear this, it may get reset by
459277195Sdelphij			 * send_server_key_exchange
460277195Sdelphij			 */
461277195Sdelphij			s->s3->tmp.use_rsa_tmp=0;
462160814Ssimon
463238405Sjkim			/* only send if a DH key exchange or
464160814Ssimon			 * RSA but we have a sign only certificate */
465277195Sdelphij			if (0
466238405Sjkim			/* PSK: send ServerKeyExchange if PSK identity
467238405Sjkim			 * hint if provided */
468238405Sjkim#ifndef OPENSSL_NO_PSK
469238405Sjkim			    || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint)
470238405Sjkim#endif
471238405Sjkim			    || (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
472238405Sjkim			    || (alg_k & SSL_kEECDH)
473238405Sjkim			    || ((alg_k & SSL_kRSA)
474160814Ssimon				&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
475160814Ssimon				    || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
476160814Ssimon					&& EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
477160814Ssimon					)
478160814Ssimon				    )
479160814Ssimon				)
480160814Ssimon			    )
481160814Ssimon				{
482205128Ssimon				dtls1_start_timer(s);
483160814Ssimon				ret=dtls1_send_server_key_exchange(s);
484160814Ssimon				if (ret <= 0) goto end;
485160814Ssimon				}
486160814Ssimon			else
487160814Ssimon				skip=1;
488160814Ssimon
489160814Ssimon			s->state=SSL3_ST_SW_CERT_REQ_A;
490160814Ssimon			s->init_num=0;
491160814Ssimon			break;
492160814Ssimon
493160814Ssimon		case SSL3_ST_SW_CERT_REQ_A:
494160814Ssimon		case SSL3_ST_SW_CERT_REQ_B:
495160814Ssimon			if (/* don't request cert unless asked for it: */
496160814Ssimon				!(s->verify_mode & SSL_VERIFY_PEER) ||
497160814Ssimon				/* if SSL_VERIFY_CLIENT_ONCE is set,
498160814Ssimon				 * don't request cert during re-negotiation: */
499160814Ssimon				((s->session->peer != NULL) &&
500160814Ssimon				 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
501160814Ssimon				/* never request cert in anonymous ciphersuites
502160814Ssimon				 * (see section "Certificate request" in SSL 3 drafts
503160814Ssimon				 * and in RFC 2246): */
504238405Sjkim				((s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
505160814Ssimon				 /* ... except when the application insists on verification
506160814Ssimon				  * (against the specs, but s3_clnt.c accepts this for SSL 3) */
507160814Ssimon				 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
508238405Sjkim				 /* never request cert in Kerberos ciphersuites */
509238405Sjkim				(s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)
510238405Sjkim				/* With normal PSK Certificates and
511238405Sjkim				 * Certificate Requests are omitted */
512238405Sjkim				|| (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
513160814Ssimon				{
514160814Ssimon				/* no cert request */
515160814Ssimon				skip=1;
516160814Ssimon				s->s3->tmp.cert_request=0;
517160814Ssimon				s->state=SSL3_ST_SW_SRVR_DONE_A;
518238405Sjkim#ifndef OPENSSL_NO_SCTP
519238405Sjkim				if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
520238405Sjkim					{
521238405Sjkim					s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
522238405Sjkim					s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
523238405Sjkim					}
524238405Sjkim#endif
525160814Ssimon				}
526160814Ssimon			else
527160814Ssimon				{
528160814Ssimon				s->s3->tmp.cert_request=1;
529205128Ssimon				dtls1_start_timer(s);
530160814Ssimon				ret=dtls1_send_certificate_request(s);
531160814Ssimon				if (ret <= 0) goto end;
532160814Ssimon#ifndef NETSCAPE_HANG_BUG
533160814Ssimon				s->state=SSL3_ST_SW_SRVR_DONE_A;
534238405Sjkim#ifndef OPENSSL_NO_SCTP
535238405Sjkim				if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
536238405Sjkim					{
537238405Sjkim					s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
538238405Sjkim					s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
539238405Sjkim					}
540238405Sjkim#endif
541160814Ssimon#else
542160814Ssimon				s->state=SSL3_ST_SW_FLUSH;
543160814Ssimon				s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
544238405Sjkim#ifndef OPENSSL_NO_SCTP
545238405Sjkim				if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
546238405Sjkim					{
547238405Sjkim					s->d1->next_state = s->s3->tmp.next_state;
548238405Sjkim					s->s3->tmp.next_state=DTLS1_SCTP_ST_SW_WRITE_SOCK;
549238405Sjkim					}
550160814Ssimon#endif
551238405Sjkim#endif
552160814Ssimon				s->init_num=0;
553160814Ssimon				}
554160814Ssimon			break;
555160814Ssimon
556160814Ssimon		case SSL3_ST_SW_SRVR_DONE_A:
557160814Ssimon		case SSL3_ST_SW_SRVR_DONE_B:
558205128Ssimon			dtls1_start_timer(s);
559160814Ssimon			ret=dtls1_send_server_done(s);
560160814Ssimon			if (ret <= 0) goto end;
561160814Ssimon			s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
562160814Ssimon			s->state=SSL3_ST_SW_FLUSH;
563160814Ssimon			s->init_num=0;
564160814Ssimon			break;
565160814Ssimon
566160814Ssimon		case SSL3_ST_SW_FLUSH:
567205128Ssimon			s->rwstate=SSL_WRITING;
568205128Ssimon			if (BIO_flush(s->wbio) <= 0)
569160814Ssimon				{
570238405Sjkim				/* If the write error was fatal, stop trying */
571238405Sjkim				if (!BIO_should_retry(s->wbio))
572238405Sjkim					{
573238405Sjkim					s->rwstate=SSL_NOTHING;
574238405Sjkim					s->state=s->s3->tmp.next_state;
575238405Sjkim					}
576238405Sjkim
577205128Ssimon				ret= -1;
578205128Ssimon				goto end;
579160814Ssimon				}
580205128Ssimon			s->rwstate=SSL_NOTHING;
581160814Ssimon			s->state=s->s3->tmp.next_state;
582160814Ssimon			break;
583160814Ssimon
584160814Ssimon		case SSL3_ST_SR_CERT_A:
585160814Ssimon		case SSL3_ST_SR_CERT_B:
586160814Ssimon			/* Check for second client hello (MS SGC) */
587160814Ssimon			ret = ssl3_check_client_hello(s);
588160814Ssimon			if (ret <= 0)
589160814Ssimon				goto end;
590160814Ssimon			if (ret == 2)
591237657Sjkim				{
592237657Sjkim				dtls1_stop_timer(s);
593160814Ssimon				s->state = SSL3_ST_SR_CLNT_HELLO_C;
594237657Sjkim				}
595160814Ssimon			else {
596279264Sdelphij				if (s->s3->tmp.cert_request)
597279264Sdelphij					{
598279264Sdelphij					ret=ssl3_get_client_certificate(s);
599279264Sdelphij					if (ret <= 0) goto end;
600279264Sdelphij					}
601160814Ssimon				s->init_num=0;
602160814Ssimon				s->state=SSL3_ST_SR_KEY_EXCH_A;
603160814Ssimon			}
604160814Ssimon			break;
605160814Ssimon
606160814Ssimon		case SSL3_ST_SR_KEY_EXCH_A:
607160814Ssimon		case SSL3_ST_SR_KEY_EXCH_B:
608160814Ssimon			ret=ssl3_get_client_key_exchange(s);
609160814Ssimon			if (ret <= 0) goto end;
610238405Sjkim#ifndef OPENSSL_NO_SCTP
611238405Sjkim			/* Add new shared key for SCTP-Auth,
612238405Sjkim			 * will be ignored if no SCTP used.
613238405Sjkim			 */
614238405Sjkim			snprintf((char *) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
615238405Sjkim			         DTLS1_SCTP_AUTH_LABEL);
616238405Sjkim
617238405Sjkim			SSL_export_keying_material(s, sctpauthkey,
618238405Sjkim			                           sizeof(sctpauthkey), labelbuffer,
619238405Sjkim			                           sizeof(labelbuffer), NULL, 0, 0);
620238405Sjkim
621238405Sjkim			BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
622238405Sjkim			         sizeof(sctpauthkey), sctpauthkey);
623238405Sjkim#endif
624238405Sjkim
625160814Ssimon			s->state=SSL3_ST_SR_CERT_VRFY_A;
626160814Ssimon			s->init_num=0;
627160814Ssimon
628238405Sjkim			if (ret == 2)
629238405Sjkim				{
630238405Sjkim				/* For the ECDH ciphersuites when
631238405Sjkim				 * the client sends its ECDH pub key in
632238405Sjkim				 * a certificate, the CertificateVerify
633238405Sjkim				 * message is not sent.
634238405Sjkim				 */
635238405Sjkim				s->state=SSL3_ST_SR_FINISHED_A;
636238405Sjkim				s->init_num = 0;
637238405Sjkim				}
638238405Sjkim			else
639238405Sjkim				{
640238405Sjkim				s->state=SSL3_ST_SR_CERT_VRFY_A;
641238405Sjkim				s->init_num=0;
642160814Ssimon
643238405Sjkim				/* We need to get hashes here so if there is
644238405Sjkim				 * a client cert, it can be verified */
645238405Sjkim				s->method->ssl3_enc->cert_verify_mac(s,
646238405Sjkim					NID_md5,
647238405Sjkim					&(s->s3->tmp.cert_verify_md[0]));
648238405Sjkim				s->method->ssl3_enc->cert_verify_mac(s,
649238405Sjkim					NID_sha1,
650238405Sjkim					&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
651238405Sjkim				}
652160814Ssimon			break;
653160814Ssimon
654160814Ssimon		case SSL3_ST_SR_CERT_VRFY_A:
655160814Ssimon		case SSL3_ST_SR_CERT_VRFY_B:
656279264Sdelphij			/*
657279264Sdelphij			 * This *should* be the first time we enable CCS, but be
658279264Sdelphij			 * extra careful about surrounding code changes. We need
659279264Sdelphij			 * to set this here because we don't know if we're
660279264Sdelphij			 * expecting a CertificateVerify or not.
661279264Sdelphij			 */
662279264Sdelphij			if (!s->s3->change_cipher_spec)
663279264Sdelphij				s->d1->change_cipher_spec_ok = 1;
664160814Ssimon			/* we should decide if we expected this one */
665160814Ssimon			ret=ssl3_get_cert_verify(s);
666160814Ssimon			if (ret <= 0) goto end;
667238405Sjkim#ifndef OPENSSL_NO_SCTP
668238405Sjkim			if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
669238405Sjkim			    state == SSL_ST_RENEGOTIATE)
670238405Sjkim				s->state=DTLS1_SCTP_ST_SR_READ_SOCK;
671238405Sjkim			else
672238405Sjkim#endif
673238405Sjkim				s->state=SSL3_ST_SR_FINISHED_A;
674160814Ssimon			s->init_num=0;
675160814Ssimon			break;
676160814Ssimon
677160814Ssimon		case SSL3_ST_SR_FINISHED_A:
678160814Ssimon		case SSL3_ST_SR_FINISHED_B:
679279264Sdelphij			/*
680279264Sdelphij			 * Enable CCS for resumed handshakes.
681279264Sdelphij			 * In a full handshake, we end up here through
682279264Sdelphij			 * SSL3_ST_SR_CERT_VRFY_B, so change_cipher_spec_ok was
683279264Sdelphij			 * already set. Receiving a CCS clears the flag, so make
684279264Sdelphij			 * sure not to re-enable it to ban duplicates.
685279264Sdelphij			 * s->s3->change_cipher_spec is set when a CCS is
686279264Sdelphij			 * processed in d1_pkt.c, and remains set until
687279264Sdelphij			 * the client's Finished message is read.
688279264Sdelphij			 */
689279264Sdelphij			if (!s->s3->change_cipher_spec)
690279264Sdelphij				s->d1->change_cipher_spec_ok = 1;
691160814Ssimon			ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
692160814Ssimon				SSL3_ST_SR_FINISHED_B);
693160814Ssimon			if (ret <= 0) goto end;
694205128Ssimon			dtls1_stop_timer(s);
695160814Ssimon			if (s->hit)
696160814Ssimon				s->state=SSL_ST_OK;
697205128Ssimon#ifndef OPENSSL_NO_TLSEXT
698205128Ssimon			else if (s->tlsext_ticket_expected)
699205128Ssimon				s->state=SSL3_ST_SW_SESSION_TICKET_A;
700205128Ssimon#endif
701160814Ssimon			else
702160814Ssimon				s->state=SSL3_ST_SW_CHANGE_A;
703160814Ssimon			s->init_num=0;
704160814Ssimon			break;
705160814Ssimon
706205128Ssimon#ifndef OPENSSL_NO_TLSEXT
707205128Ssimon		case SSL3_ST_SW_SESSION_TICKET_A:
708205128Ssimon		case SSL3_ST_SW_SESSION_TICKET_B:
709205128Ssimon			ret=dtls1_send_newsession_ticket(s);
710205128Ssimon			if (ret <= 0) goto end;
711205128Ssimon			s->state=SSL3_ST_SW_CHANGE_A;
712205128Ssimon			s->init_num=0;
713205128Ssimon			break;
714205128Ssimon
715205128Ssimon		case SSL3_ST_SW_CERT_STATUS_A:
716205128Ssimon		case SSL3_ST_SW_CERT_STATUS_B:
717205128Ssimon			ret=ssl3_send_cert_status(s);
718205128Ssimon			if (ret <= 0) goto end;
719205128Ssimon			s->state=SSL3_ST_SW_KEY_EXCH_A;
720205128Ssimon			s->init_num=0;
721205128Ssimon			break;
722205128Ssimon
723205128Ssimon#endif
724205128Ssimon
725160814Ssimon		case SSL3_ST_SW_CHANGE_A:
726160814Ssimon		case SSL3_ST_SW_CHANGE_B:
727160814Ssimon
728160814Ssimon			s->session->cipher=s->s3->tmp.new_cipher;
729160814Ssimon			if (!s->method->ssl3_enc->setup_key_block(s))
730160814Ssimon				{ ret= -1; goto end; }
731160814Ssimon
732160814Ssimon			ret=dtls1_send_change_cipher_spec(s,
733160814Ssimon				SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
734160814Ssimon
735160814Ssimon			if (ret <= 0) goto end;
736238405Sjkim
737238405Sjkim#ifndef OPENSSL_NO_SCTP
738279264Sdelphij			if (!s->hit)
739279264Sdelphij				{
740279264Sdelphij				/* Change to new shared key of SCTP-Auth,
741279264Sdelphij				 * will be ignored if no SCTP used.
742279264Sdelphij				 */
743279264Sdelphij				BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
744279264Sdelphij				}
745238405Sjkim#endif
746238405Sjkim
747160814Ssimon			s->state=SSL3_ST_SW_FINISHED_A;
748160814Ssimon			s->init_num=0;
749160814Ssimon
750160814Ssimon			if (!s->method->ssl3_enc->change_cipher_state(s,
751160814Ssimon				SSL3_CHANGE_CIPHER_SERVER_WRITE))
752160814Ssimon				{
753160814Ssimon				ret= -1;
754160814Ssimon				goto end;
755160814Ssimon				}
756160814Ssimon
757160814Ssimon			dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
758160814Ssimon			break;
759160814Ssimon
760160814Ssimon		case SSL3_ST_SW_FINISHED_A:
761160814Ssimon		case SSL3_ST_SW_FINISHED_B:
762160814Ssimon			ret=dtls1_send_finished(s,
763160814Ssimon				SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
764160814Ssimon				s->method->ssl3_enc->server_finished_label,
765160814Ssimon				s->method->ssl3_enc->server_finished_label_len);
766160814Ssimon			if (ret <= 0) goto end;
767160814Ssimon			s->state=SSL3_ST_SW_FLUSH;
768160814Ssimon			if (s->hit)
769279264Sdelphij				{
770160814Ssimon				s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
771279264Sdelphij
772279264Sdelphij#ifndef OPENSSL_NO_SCTP
773279264Sdelphij				/* Change to new shared key of SCTP-Auth,
774279264Sdelphij				 * will be ignored if no SCTP used.
775279264Sdelphij				 */
776279264Sdelphij				BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
777279264Sdelphij#endif
778279264Sdelphij				}
779160814Ssimon			else
780238405Sjkim				{
781160814Ssimon				s->s3->tmp.next_state=SSL_ST_OK;
782238405Sjkim#ifndef OPENSSL_NO_SCTP
783238405Sjkim				if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
784238405Sjkim					{
785238405Sjkim					s->d1->next_state = s->s3->tmp.next_state;
786238405Sjkim					s->s3->tmp.next_state=DTLS1_SCTP_ST_SW_WRITE_SOCK;
787238405Sjkim					}
788238405Sjkim#endif
789238405Sjkim				}
790160814Ssimon			s->init_num=0;
791160814Ssimon			break;
792160814Ssimon
793160814Ssimon		case SSL_ST_OK:
794160814Ssimon			/* clean a few things up */
795160814Ssimon			ssl3_cleanup_key_block(s);
796160814Ssimon
797160814Ssimon#if 0
798160814Ssimon			BUF_MEM_free(s->init_buf);
799160814Ssimon			s->init_buf=NULL;
800160814Ssimon#endif
801160814Ssimon
802160814Ssimon			/* remove buffering on output */
803160814Ssimon			ssl_free_wbio_buffer(s);
804160814Ssimon
805160814Ssimon			s->init_num=0;
806160814Ssimon
807238405Sjkim			if (s->renegotiate == 2) /* skipped if we just sent a HelloRequest */
808160814Ssimon				{
809238405Sjkim				s->renegotiate=0;
810160814Ssimon				s->new_session=0;
811160814Ssimon
812160814Ssimon				ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
813160814Ssimon
814160814Ssimon				s->ctx->stats.sess_accept_good++;
815160814Ssimon				/* s->server=1; */
816160814Ssimon				s->handshake_func=dtls1_accept;
817160814Ssimon
818160814Ssimon				if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
819160814Ssimon				}
820160814Ssimon
821160814Ssimon			ret = 1;
822160814Ssimon
823160814Ssimon			/* done handshaking, next message is client hello */
824160814Ssimon			s->d1->handshake_read_seq = 0;
825160814Ssimon			/* next message is server hello */
826160814Ssimon			s->d1->handshake_write_seq = 0;
827205128Ssimon			s->d1->next_handshake_write_seq = 0;
828160814Ssimon			goto end;
829160814Ssimon			/* break; */
830160814Ssimon
831160814Ssimon		default:
832160814Ssimon			SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_UNKNOWN_STATE);
833160814Ssimon			ret= -1;
834160814Ssimon			goto end;
835160814Ssimon			/* break; */
836160814Ssimon			}
837160814Ssimon
838160814Ssimon		if (!s->s3->tmp.reuse_message && !skip)
839160814Ssimon			{
840160814Ssimon			if (s->debug)
841160814Ssimon				{
842160814Ssimon				if ((ret=BIO_flush(s->wbio)) <= 0)
843160814Ssimon					goto end;
844160814Ssimon				}
845160814Ssimon
846160814Ssimon
847160814Ssimon			if ((cb != NULL) && (s->state != state))
848160814Ssimon				{
849160814Ssimon				new_state=s->state;
850160814Ssimon				s->state=state;
851160814Ssimon				cb(s,SSL_CB_ACCEPT_LOOP,1);
852160814Ssimon				s->state=new_state;
853160814Ssimon				}
854160814Ssimon			}
855160814Ssimon		skip=0;
856160814Ssimon		}
857160814Ssimonend:
858160814Ssimon	/* BIO_flush(s->wbio); */
859160814Ssimon
860160814Ssimon	s->in_handshake--;
861238405Sjkim#ifndef OPENSSL_NO_SCTP
862238405Sjkim		/* Notify SCTP BIO socket to leave handshake
863238405Sjkim		 * mode and prevent stream identifier other
864238405Sjkim		 * than 0. Will be ignored if no SCTP is used.
865238405Sjkim		 */
866238405Sjkim		BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
867238405Sjkim#endif
868238405Sjkim
869160814Ssimon	if (cb != NULL)
870160814Ssimon		cb(s,SSL_CB_ACCEPT_EXIT,ret);
871160814Ssimon	return(ret);
872160814Ssimon	}
873160814Ssimon
874160814Ssimonint dtls1_send_hello_request(SSL *s)
875160814Ssimon	{
876160814Ssimon	unsigned char *p;
877160814Ssimon
878160814Ssimon	if (s->state == SSL3_ST_SW_HELLO_REQ_A)
879160814Ssimon		{
880160814Ssimon		p=(unsigned char *)s->init_buf->data;
881160814Ssimon		p = dtls1_set_message_header(s, p, SSL3_MT_HELLO_REQUEST, 0, 0, 0);
882160814Ssimon
883160814Ssimon		s->state=SSL3_ST_SW_HELLO_REQ_B;
884160814Ssimon		/* number of bytes to write */
885160814Ssimon		s->init_num=DTLS1_HM_HEADER_LENGTH;
886160814Ssimon		s->init_off=0;
887160814Ssimon
888160814Ssimon		/* no need to buffer this message, since there are no retransmit
889160814Ssimon		 * requests for it */
890160814Ssimon		}
891160814Ssimon
892160814Ssimon	/* SSL3_ST_SW_HELLO_REQ_B */
893160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
894160814Ssimon	}
895160814Ssimon
896160814Ssimonint dtls1_send_hello_verify_request(SSL *s)
897160814Ssimon	{
898160814Ssimon	unsigned int msg_len;
899160814Ssimon	unsigned char *msg, *buf, *p;
900160814Ssimon
901160814Ssimon	if (s->state == DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A)
902160814Ssimon		{
903160814Ssimon		buf = (unsigned char *)s->init_buf->data;
904160814Ssimon
905160814Ssimon		msg = p = &(buf[DTLS1_HM_HEADER_LENGTH]);
906238405Sjkim		*(p++) = s->version >> 8;
907238405Sjkim		*(p++) = s->version & 0xFF;
908160814Ssimon
909205128Ssimon		if (s->ctx->app_gen_cookie_cb == NULL ||
910205128Ssimon		     s->ctx->app_gen_cookie_cb(s, s->d1->cookie,
911205128Ssimon			 &(s->d1->cookie_len)) == 0)
912194206Ssimon			{
913160814Ssimon			SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,ERR_R_INTERNAL_ERROR);
914194206Ssimon			return 0;
915194206Ssimon			}
916160814Ssimon
917194206Ssimon		*(p++) = (unsigned char) s->d1->cookie_len;
918160814Ssimon		memcpy(p, s->d1->cookie, s->d1->cookie_len);
919160814Ssimon		p += s->d1->cookie_len;
920160814Ssimon		msg_len = p - msg;
921160814Ssimon
922160814Ssimon		dtls1_set_message_header(s, buf,
923160814Ssimon			DTLS1_MT_HELLO_VERIFY_REQUEST, msg_len, 0, msg_len);
924160814Ssimon
925160814Ssimon		s->state=DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B;
926160814Ssimon		/* number of bytes to write */
927160814Ssimon		s->init_num=p-buf;
928160814Ssimon		s->init_off=0;
929160814Ssimon		}
930160814Ssimon
931160814Ssimon	/* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */
932160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
933160814Ssimon	}
934160814Ssimon
935160814Ssimonint dtls1_send_server_hello(SSL *s)
936160814Ssimon	{
937160814Ssimon	unsigned char *buf;
938160814Ssimon	unsigned char *p,*d;
939160814Ssimon	int i;
940160814Ssimon	unsigned int sl;
941279264Sdelphij	unsigned long l;
942160814Ssimon
943160814Ssimon	if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
944160814Ssimon		{
945160814Ssimon		buf=(unsigned char *)s->init_buf->data;
946160814Ssimon		p=s->s3->server_random;
947279264Sdelphij		ssl_fill_hello_random(s, 1, p, SSL3_RANDOM_SIZE);
948160814Ssimon		/* Do the message type and length last */
949160814Ssimon		d=p= &(buf[DTLS1_HM_HEADER_LENGTH]);
950160814Ssimon
951238405Sjkim		*(p++)=s->version>>8;
952238405Sjkim		*(p++)=s->version&0xff;
953160814Ssimon
954160814Ssimon		/* Random stuff */
955160814Ssimon		memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
956160814Ssimon		p+=SSL3_RANDOM_SIZE;
957160814Ssimon
958160814Ssimon		/* now in theory we have 3 options to sending back the
959160814Ssimon		 * session id.  If it is a re-use, we send back the
960160814Ssimon		 * old session-id, if it is a new session, we send
961160814Ssimon		 * back the new session-id or we send back a 0 length
962160814Ssimon		 * session-id if we want it to be single use.
963160814Ssimon		 * Currently I will not implement the '0' length session-id
964160814Ssimon		 * 12-Jan-98 - I'll now support the '0' length stuff.
965160814Ssimon		 */
966160814Ssimon		if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
967160814Ssimon			s->session->session_id_length=0;
968160814Ssimon
969160814Ssimon		sl=s->session->session_id_length;
970160814Ssimon		if (sl > sizeof s->session->session_id)
971160814Ssimon			{
972160814Ssimon			SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
973160814Ssimon			return -1;
974160814Ssimon			}
975160814Ssimon		*(p++)=sl;
976160814Ssimon		memcpy(p,s->session->session_id,sl);
977160814Ssimon		p+=sl;
978160814Ssimon
979160814Ssimon		/* put the cipher */
980205128Ssimon		if (s->s3->tmp.new_cipher == NULL)
981205128Ssimon			return -1;
982160814Ssimon		i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
983160814Ssimon		p+=i;
984160814Ssimon
985160814Ssimon		/* put the compression method */
986160814Ssimon#ifdef OPENSSL_NO_COMP
987160814Ssimon		*(p++)=0;
988160814Ssimon#else
989160814Ssimon		if (s->s3->tmp.new_compression == NULL)
990160814Ssimon			*(p++)=0;
991160814Ssimon		else
992160814Ssimon			*(p++)=s->s3->tmp.new_compression->id;
993160814Ssimon#endif
994160814Ssimon
995205128Ssimon#ifndef OPENSSL_NO_TLSEXT
996279264Sdelphij		if (ssl_prepare_serverhello_tlsext(s) <= 0)
997279264Sdelphij			{
998279264Sdelphij			SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO,SSL_R_SERVERHELLO_TLSEXT);
999279264Sdelphij			return -1;
1000279264Sdelphij			}
1001205128Ssimon		if ((p = ssl_add_serverhello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
1002205128Ssimon			{
1003205128Ssimon			SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO,ERR_R_INTERNAL_ERROR);
1004205128Ssimon			return -1;
1005205128Ssimon			}
1006205128Ssimon#endif
1007205128Ssimon
1008160814Ssimon		/* do the header */
1009160814Ssimon		l=(p-d);
1010160814Ssimon		d=buf;
1011160814Ssimon
1012160814Ssimon		d = dtls1_set_message_header(s, d, SSL3_MT_SERVER_HELLO, l, 0, l);
1013160814Ssimon
1014194206Ssimon		s->state=SSL3_ST_SW_SRVR_HELLO_B;
1015160814Ssimon		/* number of bytes to write */
1016160814Ssimon		s->init_num=p-buf;
1017160814Ssimon		s->init_off=0;
1018160814Ssimon
1019160814Ssimon		/* buffer the message to handle re-xmits */
1020160814Ssimon		dtls1_buffer_message(s, 0);
1021160814Ssimon		}
1022160814Ssimon
1023194206Ssimon	/* SSL3_ST_SW_SRVR_HELLO_B */
1024160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1025160814Ssimon	}
1026160814Ssimon
1027160814Ssimonint dtls1_send_server_done(SSL *s)
1028160814Ssimon	{
1029160814Ssimon	unsigned char *p;
1030160814Ssimon
1031160814Ssimon	if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1032160814Ssimon		{
1033160814Ssimon		p=(unsigned char *)s->init_buf->data;
1034160814Ssimon
1035160814Ssimon		/* do the header */
1036160814Ssimon		p = dtls1_set_message_header(s, p, SSL3_MT_SERVER_DONE, 0, 0, 0);
1037160814Ssimon
1038160814Ssimon		s->state=SSL3_ST_SW_SRVR_DONE_B;
1039160814Ssimon		/* number of bytes to write */
1040160814Ssimon		s->init_num=DTLS1_HM_HEADER_LENGTH;
1041160814Ssimon		s->init_off=0;
1042160814Ssimon
1043160814Ssimon		/* buffer the message to handle re-xmits */
1044160814Ssimon		dtls1_buffer_message(s, 0);
1045160814Ssimon		}
1046160814Ssimon
1047194206Ssimon	/* SSL3_ST_SW_SRVR_DONE_B */
1048160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1049160814Ssimon	}
1050160814Ssimon
1051160814Ssimonint dtls1_send_server_key_exchange(SSL *s)
1052160814Ssimon	{
1053160814Ssimon#ifndef OPENSSL_NO_RSA
1054160814Ssimon	unsigned char *q;
1055160814Ssimon	int j,num;
1056160814Ssimon	RSA *rsa;
1057160814Ssimon	unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1058160814Ssimon	unsigned int u;
1059160814Ssimon#endif
1060160814Ssimon#ifndef OPENSSL_NO_DH
1061160814Ssimon	DH *dh=NULL,*dhp;
1062160814Ssimon#endif
1063238405Sjkim#ifndef OPENSSL_NO_ECDH
1064238405Sjkim	EC_KEY *ecdh=NULL, *ecdhp;
1065238405Sjkim	unsigned char *encodedPoint = NULL;
1066238405Sjkim	int encodedlen = 0;
1067238405Sjkim	int curve_id = 0;
1068238405Sjkim	BN_CTX *bn_ctx = NULL;
1069238405Sjkim#endif
1070160814Ssimon	EVP_PKEY *pkey;
1071160814Ssimon	unsigned char *p,*d;
1072160814Ssimon	int al,i;
1073160814Ssimon	unsigned long type;
1074160814Ssimon	int n;
1075160814Ssimon	CERT *cert;
1076160814Ssimon	BIGNUM *r[4];
1077160814Ssimon	int nr[4],kn;
1078160814Ssimon	BUF_MEM *buf;
1079160814Ssimon	EVP_MD_CTX md_ctx;
1080160814Ssimon
1081160814Ssimon	EVP_MD_CTX_init(&md_ctx);
1082160814Ssimon	if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1083160814Ssimon		{
1084238405Sjkim		type=s->s3->tmp.new_cipher->algorithm_mkey;
1085160814Ssimon		cert=s->cert;
1086160814Ssimon
1087160814Ssimon		buf=s->init_buf;
1088160814Ssimon
1089160814Ssimon		r[0]=r[1]=r[2]=r[3]=NULL;
1090160814Ssimon		n=0;
1091160814Ssimon#ifndef OPENSSL_NO_RSA
1092160814Ssimon		if (type & SSL_kRSA)
1093160814Ssimon			{
1094160814Ssimon			rsa=cert->rsa_tmp;
1095160814Ssimon			if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
1096160814Ssimon				{
1097160814Ssimon				rsa=s->cert->rsa_tmp_cb(s,
1098160814Ssimon				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1099160814Ssimon				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1100160814Ssimon				if(rsa == NULL)
1101160814Ssimon				{
1102160814Ssimon					al=SSL_AD_HANDSHAKE_FAILURE;
1103160814Ssimon					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
1104160814Ssimon					goto f_err;
1105160814Ssimon				}
1106160814Ssimon				RSA_up_ref(rsa);
1107160814Ssimon				cert->rsa_tmp=rsa;
1108160814Ssimon				}
1109160814Ssimon			if (rsa == NULL)
1110160814Ssimon				{
1111160814Ssimon				al=SSL_AD_HANDSHAKE_FAILURE;
1112160814Ssimon				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
1113160814Ssimon				goto f_err;
1114160814Ssimon				}
1115160814Ssimon			r[0]=rsa->n;
1116160814Ssimon			r[1]=rsa->e;
1117160814Ssimon			s->s3->tmp.use_rsa_tmp=1;
1118160814Ssimon			}
1119160814Ssimon		else
1120160814Ssimon#endif
1121160814Ssimon#ifndef OPENSSL_NO_DH
1122160814Ssimon			if (type & SSL_kEDH)
1123160814Ssimon			{
1124160814Ssimon			dhp=cert->dh_tmp;
1125160814Ssimon			if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
1126160814Ssimon				dhp=s->cert->dh_tmp_cb(s,
1127160814Ssimon				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1128160814Ssimon				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1129160814Ssimon			if (dhp == NULL)
1130160814Ssimon				{
1131160814Ssimon				al=SSL_AD_HANDSHAKE_FAILURE;
1132160814Ssimon				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1133160814Ssimon				goto f_err;
1134160814Ssimon				}
1135160814Ssimon
1136160814Ssimon			if (s->s3->tmp.dh != NULL)
1137160814Ssimon				{
1138160814Ssimon				DH_free(dh);
1139160814Ssimon				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1140160814Ssimon				goto err;
1141160814Ssimon				}
1142160814Ssimon
1143160814Ssimon			if ((dh=DHparams_dup(dhp)) == NULL)
1144160814Ssimon				{
1145160814Ssimon				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1146160814Ssimon				goto err;
1147160814Ssimon				}
1148160814Ssimon
1149160814Ssimon			s->s3->tmp.dh=dh;
1150160814Ssimon			if ((dhp->pub_key == NULL ||
1151160814Ssimon			     dhp->priv_key == NULL ||
1152160814Ssimon			     (s->options & SSL_OP_SINGLE_DH_USE)))
1153160814Ssimon				{
1154160814Ssimon				if(!DH_generate_key(dh))
1155160814Ssimon				    {
1156160814Ssimon				    SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,
1157160814Ssimon					   ERR_R_DH_LIB);
1158160814Ssimon				    goto err;
1159160814Ssimon				    }
1160160814Ssimon				}
1161160814Ssimon			else
1162160814Ssimon				{
1163160814Ssimon				dh->pub_key=BN_dup(dhp->pub_key);
1164160814Ssimon				dh->priv_key=BN_dup(dhp->priv_key);
1165160814Ssimon				if ((dh->pub_key == NULL) ||
1166160814Ssimon					(dh->priv_key == NULL))
1167160814Ssimon					{
1168160814Ssimon					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1169160814Ssimon					goto err;
1170160814Ssimon					}
1171160814Ssimon				}
1172160814Ssimon			r[0]=dh->p;
1173160814Ssimon			r[1]=dh->g;
1174160814Ssimon			r[2]=dh->pub_key;
1175160814Ssimon			}
1176160814Ssimon		else
1177160814Ssimon#endif
1178238405Sjkim#ifndef OPENSSL_NO_ECDH
1179238405Sjkim			if (type & SSL_kEECDH)
1180160814Ssimon			{
1181238405Sjkim			const EC_GROUP *group;
1182238405Sjkim
1183238405Sjkim			ecdhp=cert->ecdh_tmp;
1184238405Sjkim			if ((ecdhp == NULL) && (s->cert->ecdh_tmp_cb != NULL))
1185238405Sjkim				{
1186238405Sjkim				ecdhp=s->cert->ecdh_tmp_cb(s,
1187238405Sjkim				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1188238405Sjkim				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1189238405Sjkim				}
1190238405Sjkim			if (ecdhp == NULL)
1191238405Sjkim				{
1192238405Sjkim				al=SSL_AD_HANDSHAKE_FAILURE;
1193238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_ECDH_KEY);
1194238405Sjkim				goto f_err;
1195238405Sjkim				}
1196238405Sjkim
1197238405Sjkim			if (s->s3->tmp.ecdh != NULL)
1198238405Sjkim				{
1199238405Sjkim				EC_KEY_free(s->s3->tmp.ecdh);
1200238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1201238405Sjkim				goto err;
1202238405Sjkim				}
1203238405Sjkim
1204238405Sjkim			/* Duplicate the ECDH structure. */
1205238405Sjkim			if (ecdhp == NULL)
1206238405Sjkim				{
1207238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1208238405Sjkim				goto err;
1209238405Sjkim				}
1210238405Sjkim			if ((ecdh = EC_KEY_dup(ecdhp)) == NULL)
1211238405Sjkim				{
1212238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1213238405Sjkim				goto err;
1214238405Sjkim				}
1215238405Sjkim
1216238405Sjkim			s->s3->tmp.ecdh=ecdh;
1217238405Sjkim			if ((EC_KEY_get0_public_key(ecdh) == NULL) ||
1218238405Sjkim			    (EC_KEY_get0_private_key(ecdh) == NULL) ||
1219238405Sjkim			    (s->options & SSL_OP_SINGLE_ECDH_USE))
1220238405Sjkim				{
1221238405Sjkim				if(!EC_KEY_generate_key(ecdh))
1222238405Sjkim				    {
1223238405Sjkim				    SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1224238405Sjkim				    goto err;
1225238405Sjkim				    }
1226238405Sjkim				}
1227238405Sjkim
1228238405Sjkim			if (((group = EC_KEY_get0_group(ecdh)) == NULL) ||
1229238405Sjkim			    (EC_KEY_get0_public_key(ecdh)  == NULL) ||
1230238405Sjkim			    (EC_KEY_get0_private_key(ecdh) == NULL))
1231238405Sjkim				{
1232238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1233238405Sjkim				goto err;
1234238405Sjkim				}
1235238405Sjkim
1236238405Sjkim			if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
1237238405Sjkim			    (EC_GROUP_get_degree(group) > 163))
1238238405Sjkim				{
1239238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
1240238405Sjkim				goto err;
1241238405Sjkim				}
1242238405Sjkim
1243238405Sjkim			/* XXX: For now, we only support ephemeral ECDH
1244238405Sjkim			 * keys over named (not generic) curves. For
1245238405Sjkim			 * supported named curves, curve_id is non-zero.
1246238405Sjkim			 */
1247238405Sjkim			if ((curve_id =
1248238405Sjkim			    tls1_ec_nid2curve_id(EC_GROUP_get_curve_name(group)))
1249238405Sjkim			    == 0)
1250238405Sjkim				{
1251238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1252238405Sjkim				goto err;
1253238405Sjkim				}
1254238405Sjkim
1255238405Sjkim			/* Encode the public key.
1256238405Sjkim			 * First check the size of encoding and
1257238405Sjkim			 * allocate memory accordingly.
1258238405Sjkim			 */
1259238405Sjkim			encodedlen = EC_POINT_point2oct(group,
1260238405Sjkim			    EC_KEY_get0_public_key(ecdh),
1261238405Sjkim			    POINT_CONVERSION_UNCOMPRESSED,
1262238405Sjkim			    NULL, 0, NULL);
1263238405Sjkim
1264238405Sjkim			encodedPoint = (unsigned char *)
1265238405Sjkim			    OPENSSL_malloc(encodedlen*sizeof(unsigned char));
1266238405Sjkim			bn_ctx = BN_CTX_new();
1267238405Sjkim			if ((encodedPoint == NULL) || (bn_ctx == NULL))
1268238405Sjkim				{
1269238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1270238405Sjkim				goto err;
1271238405Sjkim				}
1272238405Sjkim
1273238405Sjkim
1274238405Sjkim			encodedlen = EC_POINT_point2oct(group,
1275238405Sjkim			    EC_KEY_get0_public_key(ecdh),
1276238405Sjkim			    POINT_CONVERSION_UNCOMPRESSED,
1277238405Sjkim			    encodedPoint, encodedlen, bn_ctx);
1278238405Sjkim
1279238405Sjkim			if (encodedlen == 0)
1280238405Sjkim				{
1281238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1282238405Sjkim				goto err;
1283238405Sjkim				}
1284238405Sjkim
1285238405Sjkim			BN_CTX_free(bn_ctx);  bn_ctx=NULL;
1286238405Sjkim
1287238405Sjkim			/* XXX: For now, we only support named (not
1288238405Sjkim			 * generic) curves in ECDH ephemeral key exchanges.
1289238405Sjkim			 * In this situation, we need four additional bytes
1290238405Sjkim			 * to encode the entire ServerECDHParams
1291238405Sjkim			 * structure.
1292238405Sjkim			 */
1293238405Sjkim			n = 4 + encodedlen;
1294238405Sjkim
1295238405Sjkim			/* We'll generate the serverKeyExchange message
1296238405Sjkim			 * explicitly so we can set these to NULLs
1297238405Sjkim			 */
1298238405Sjkim			r[0]=NULL;
1299238405Sjkim			r[1]=NULL;
1300238405Sjkim			r[2]=NULL;
1301238405Sjkim			r[3]=NULL;
1302238405Sjkim			}
1303238405Sjkim		else
1304238405Sjkim#endif /* !OPENSSL_NO_ECDH */
1305238405Sjkim#ifndef OPENSSL_NO_PSK
1306238405Sjkim			if (type & SSL_kPSK)
1307238405Sjkim				{
1308238405Sjkim				/* reserve size for record length and PSK identity hint*/
1309238405Sjkim				n+=2+strlen(s->ctx->psk_identity_hint);
1310238405Sjkim				}
1311238405Sjkim			else
1312238405Sjkim#endif /* !OPENSSL_NO_PSK */
1313238405Sjkim			{
1314160814Ssimon			al=SSL_AD_HANDSHAKE_FAILURE;
1315160814Ssimon			SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1316160814Ssimon			goto f_err;
1317160814Ssimon			}
1318160814Ssimon		for (i=0; r[i] != NULL; i++)
1319160814Ssimon			{
1320160814Ssimon			nr[i]=BN_num_bytes(r[i]);
1321160814Ssimon			n+=2+nr[i];
1322160814Ssimon			}
1323160814Ssimon
1324238405Sjkim		if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
1325238405Sjkim			&& !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
1326160814Ssimon			{
1327238405Sjkim			if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher, NULL))
1328160814Ssimon				== NULL)
1329160814Ssimon				{
1330160814Ssimon				al=SSL_AD_DECODE_ERROR;
1331160814Ssimon				goto f_err;
1332160814Ssimon				}
1333160814Ssimon			kn=EVP_PKEY_size(pkey);
1334160814Ssimon			}
1335160814Ssimon		else
1336160814Ssimon			{
1337160814Ssimon			pkey=NULL;
1338160814Ssimon			kn=0;
1339160814Ssimon			}
1340160814Ssimon
1341160814Ssimon		if (!BUF_MEM_grow_clean(buf,n+DTLS1_HM_HEADER_LENGTH+kn))
1342160814Ssimon			{
1343160814Ssimon			SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1344160814Ssimon			goto err;
1345160814Ssimon			}
1346160814Ssimon		d=(unsigned char *)s->init_buf->data;
1347160814Ssimon		p= &(d[DTLS1_HM_HEADER_LENGTH]);
1348160814Ssimon
1349160814Ssimon		for (i=0; r[i] != NULL; i++)
1350160814Ssimon			{
1351160814Ssimon			s2n(nr[i],p);
1352160814Ssimon			BN_bn2bin(r[i],p);
1353160814Ssimon			p+=nr[i];
1354160814Ssimon			}
1355160814Ssimon
1356238405Sjkim#ifndef OPENSSL_NO_ECDH
1357238405Sjkim		if (type & SSL_kEECDH)
1358238405Sjkim			{
1359238405Sjkim			/* XXX: For now, we only support named (not generic) curves.
1360238405Sjkim			 * In this situation, the serverKeyExchange message has:
1361238405Sjkim			 * [1 byte CurveType], [2 byte CurveName]
1362238405Sjkim			 * [1 byte length of encoded point], followed by
1363238405Sjkim			 * the actual encoded point itself
1364238405Sjkim			 */
1365238405Sjkim			*p = NAMED_CURVE_TYPE;
1366238405Sjkim			p += 1;
1367238405Sjkim			*p = 0;
1368238405Sjkim			p += 1;
1369238405Sjkim			*p = curve_id;
1370238405Sjkim			p += 1;
1371238405Sjkim			*p = encodedlen;
1372238405Sjkim			p += 1;
1373238405Sjkim			memcpy((unsigned char*)p,
1374238405Sjkim			    (unsigned char *)encodedPoint,
1375238405Sjkim			    encodedlen);
1376238405Sjkim			OPENSSL_free(encodedPoint);
1377279264Sdelphij			encodedPoint = NULL;
1378238405Sjkim			p += encodedlen;
1379238405Sjkim			}
1380238405Sjkim#endif
1381238405Sjkim
1382238405Sjkim#ifndef OPENSSL_NO_PSK
1383238405Sjkim		if (type & SSL_kPSK)
1384238405Sjkim			{
1385238405Sjkim			/* copy PSK identity hint */
1386238405Sjkim			s2n(strlen(s->ctx->psk_identity_hint), p);
1387238405Sjkim			strncpy((char *)p, s->ctx->psk_identity_hint, strlen(s->ctx->psk_identity_hint));
1388238405Sjkim			p+=strlen(s->ctx->psk_identity_hint);
1389238405Sjkim			}
1390238405Sjkim#endif
1391238405Sjkim
1392160814Ssimon		/* not anonymous */
1393160814Ssimon		if (pkey != NULL)
1394160814Ssimon			{
1395160814Ssimon			/* n is the length of the params, they start at
1396160814Ssimon			 * &(d[DTLS1_HM_HEADER_LENGTH]) and p points to the space
1397160814Ssimon			 * at the end. */
1398160814Ssimon#ifndef OPENSSL_NO_RSA
1399160814Ssimon			if (pkey->type == EVP_PKEY_RSA)
1400160814Ssimon				{
1401160814Ssimon				q=md_buf;
1402160814Ssimon				j=0;
1403160814Ssimon				for (num=2; num > 0; num--)
1404160814Ssimon					{
1405160814Ssimon					EVP_DigestInit_ex(&md_ctx,(num == 2)
1406160814Ssimon						?s->ctx->md5:s->ctx->sha1, NULL);
1407160814Ssimon					EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1408160814Ssimon					EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1409160814Ssimon					EVP_DigestUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
1410160814Ssimon					EVP_DigestFinal_ex(&md_ctx,q,
1411160814Ssimon						(unsigned int *)&i);
1412160814Ssimon					q+=i;
1413160814Ssimon					j+=i;
1414160814Ssimon					}
1415160814Ssimon				if (RSA_sign(NID_md5_sha1, md_buf, j,
1416160814Ssimon					&(p[2]), &u, pkey->pkey.rsa) <= 0)
1417160814Ssimon					{
1418160814Ssimon					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1419160814Ssimon					goto err;
1420160814Ssimon					}
1421160814Ssimon				s2n(u,p);
1422160814Ssimon				n+=u+2;
1423160814Ssimon				}
1424160814Ssimon			else
1425160814Ssimon#endif
1426160814Ssimon#if !defined(OPENSSL_NO_DSA)
1427160814Ssimon				if (pkey->type == EVP_PKEY_DSA)
1428160814Ssimon				{
1429160814Ssimon				/* lets do DSS */
1430160814Ssimon				EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
1431160814Ssimon				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1432160814Ssimon				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1433160814Ssimon				EVP_SignUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
1434160814Ssimon				if (!EVP_SignFinal(&md_ctx,&(p[2]),
1435160814Ssimon					(unsigned int *)&i,pkey))
1436160814Ssimon					{
1437160814Ssimon					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1438160814Ssimon					goto err;
1439160814Ssimon					}
1440160814Ssimon				s2n(i,p);
1441160814Ssimon				n+=i+2;
1442160814Ssimon				}
1443160814Ssimon			else
1444160814Ssimon#endif
1445238405Sjkim#if !defined(OPENSSL_NO_ECDSA)
1446238405Sjkim				if (pkey->type == EVP_PKEY_EC)
1447160814Ssimon				{
1448238405Sjkim				/* let's do ECDSA */
1449238405Sjkim				EVP_SignInit_ex(&md_ctx,EVP_ecdsa(), NULL);
1450238405Sjkim				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1451238405Sjkim				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1452238405Sjkim				EVP_SignUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
1453238405Sjkim				if (!EVP_SignFinal(&md_ctx,&(p[2]),
1454238405Sjkim					(unsigned int *)&i,pkey))
1455238405Sjkim					{
1456238405Sjkim					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_ECDSA);
1457238405Sjkim					goto err;
1458238405Sjkim					}
1459238405Sjkim				s2n(i,p);
1460238405Sjkim				n+=i+2;
1461238405Sjkim				}
1462238405Sjkim			else
1463238405Sjkim#endif
1464238405Sjkim				{
1465160814Ssimon				/* Is this error check actually needed? */
1466160814Ssimon				al=SSL_AD_HANDSHAKE_FAILURE;
1467160814Ssimon				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1468160814Ssimon				goto f_err;
1469160814Ssimon				}
1470160814Ssimon			}
1471160814Ssimon
1472160814Ssimon		d = dtls1_set_message_header(s, d,
1473160814Ssimon			SSL3_MT_SERVER_KEY_EXCHANGE, n, 0, n);
1474160814Ssimon
1475160814Ssimon		/* we should now have things packed up, so lets send
1476160814Ssimon		 * it off */
1477160814Ssimon		s->init_num=n+DTLS1_HM_HEADER_LENGTH;
1478160814Ssimon		s->init_off=0;
1479160814Ssimon
1480160814Ssimon		/* buffer the message to handle re-xmits */
1481160814Ssimon		dtls1_buffer_message(s, 0);
1482160814Ssimon		}
1483160814Ssimon
1484160814Ssimon	s->state = SSL3_ST_SW_KEY_EXCH_B;
1485160814Ssimon	EVP_MD_CTX_cleanup(&md_ctx);
1486160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1487160814Ssimonf_err:
1488160814Ssimon	ssl3_send_alert(s,SSL3_AL_FATAL,al);
1489160814Ssimonerr:
1490238405Sjkim#ifndef OPENSSL_NO_ECDH
1491238405Sjkim	if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1492238405Sjkim	BN_CTX_free(bn_ctx);
1493238405Sjkim#endif
1494160814Ssimon	EVP_MD_CTX_cleanup(&md_ctx);
1495160814Ssimon	return(-1);
1496160814Ssimon	}
1497160814Ssimon
1498160814Ssimonint dtls1_send_certificate_request(SSL *s)
1499160814Ssimon	{
1500160814Ssimon	unsigned char *p,*d;
1501160814Ssimon	int i,j,nl,off,n;
1502160814Ssimon	STACK_OF(X509_NAME) *sk=NULL;
1503160814Ssimon	X509_NAME *name;
1504160814Ssimon	BUF_MEM *buf;
1505194206Ssimon	unsigned int msg_len;
1506160814Ssimon
1507160814Ssimon	if (s->state == SSL3_ST_SW_CERT_REQ_A)
1508160814Ssimon		{
1509160814Ssimon		buf=s->init_buf;
1510160814Ssimon
1511160814Ssimon		d=p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH]);
1512160814Ssimon
1513160814Ssimon		/* get the list of acceptable cert types */
1514160814Ssimon		p++;
1515160814Ssimon		n=ssl3_get_req_cert_type(s,p);
1516160814Ssimon		d[0]=n;
1517160814Ssimon		p+=n;
1518160814Ssimon		n++;
1519160814Ssimon
1520160814Ssimon		off=n;
1521160814Ssimon		p+=2;
1522160814Ssimon		n+=2;
1523160814Ssimon
1524160814Ssimon		sk=SSL_get_client_CA_list(s);
1525160814Ssimon		nl=0;
1526160814Ssimon		if (sk != NULL)
1527160814Ssimon			{
1528160814Ssimon			for (i=0; i<sk_X509_NAME_num(sk); i++)
1529160814Ssimon				{
1530160814Ssimon				name=sk_X509_NAME_value(sk,i);
1531160814Ssimon				j=i2d_X509_NAME(name,NULL);
1532160814Ssimon				if (!BUF_MEM_grow_clean(buf,DTLS1_HM_HEADER_LENGTH+n+j+2))
1533160814Ssimon					{
1534160814Ssimon					SSLerr(SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1535160814Ssimon					goto err;
1536160814Ssimon					}
1537160814Ssimon				p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+n]);
1538160814Ssimon				if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1539160814Ssimon					{
1540160814Ssimon					s2n(j,p);
1541160814Ssimon					i2d_X509_NAME(name,&p);
1542160814Ssimon					n+=2+j;
1543160814Ssimon					nl+=2+j;
1544160814Ssimon					}
1545160814Ssimon				else
1546160814Ssimon					{
1547160814Ssimon					d=p;
1548160814Ssimon					i2d_X509_NAME(name,&p);
1549160814Ssimon					j-=2; s2n(j,d); j+=2;
1550160814Ssimon					n+=j;
1551160814Ssimon					nl+=j;
1552160814Ssimon					}
1553160814Ssimon				}
1554160814Ssimon			}
1555160814Ssimon		/* else no CA names */
1556160814Ssimon		p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+off]);
1557160814Ssimon		s2n(nl,p);
1558160814Ssimon
1559160814Ssimon		d=(unsigned char *)buf->data;
1560160814Ssimon		*(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1561160814Ssimon		l2n3(n,d);
1562160814Ssimon		s2n(s->d1->handshake_write_seq,d);
1563160814Ssimon		s->d1->handshake_write_seq++;
1564160814Ssimon
1565160814Ssimon		/* we should now have things packed up, so lets send
1566160814Ssimon		 * it off */
1567160814Ssimon
1568160814Ssimon		s->init_num=n+DTLS1_HM_HEADER_LENGTH;
1569160814Ssimon		s->init_off=0;
1570160814Ssimon#ifdef NETSCAPE_HANG_BUG
1571160814Ssimon/* XXX: what to do about this? */
1572160814Ssimon		p=(unsigned char *)s->init_buf->data + s->init_num;
1573160814Ssimon
1574160814Ssimon		/* do the header */
1575160814Ssimon		*(p++)=SSL3_MT_SERVER_DONE;
1576160814Ssimon		*(p++)=0;
1577160814Ssimon		*(p++)=0;
1578160814Ssimon		*(p++)=0;
1579160814Ssimon		s->init_num += 4;
1580160814Ssimon#endif
1581160814Ssimon
1582160814Ssimon		/* XDTLS:  set message header ? */
1583194206Ssimon		msg_len = s->init_num - DTLS1_HM_HEADER_LENGTH;
1584194206Ssimon		dtls1_set_message_header(s, (void *)s->init_buf->data,
1585194206Ssimon			SSL3_MT_CERTIFICATE_REQUEST, msg_len, 0, msg_len);
1586194206Ssimon
1587160814Ssimon		/* buffer the message to handle re-xmits */
1588160814Ssimon		dtls1_buffer_message(s, 0);
1589160814Ssimon
1590160814Ssimon		s->state = SSL3_ST_SW_CERT_REQ_B;
1591160814Ssimon		}
1592160814Ssimon
1593160814Ssimon	/* SSL3_ST_SW_CERT_REQ_B */
1594160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1595160814Ssimonerr:
1596160814Ssimon	return(-1);
1597160814Ssimon	}
1598160814Ssimon
1599160814Ssimonint dtls1_send_server_certificate(SSL *s)
1600160814Ssimon	{
1601160814Ssimon	unsigned long l;
1602160814Ssimon	X509 *x;
1603160814Ssimon
1604160814Ssimon	if (s->state == SSL3_ST_SW_CERT_A)
1605160814Ssimon		{
1606160814Ssimon		x=ssl_get_server_send_cert(s);
1607238405Sjkim		if (x == NULL)
1608160814Ssimon			{
1609238405Sjkim			/* VRS: allow null cert if auth == KRB5 */
1610238405Sjkim			if ((s->s3->tmp.new_cipher->algorithm_mkey != SSL_kKRB5) ||
1611238405Sjkim			    (s->s3->tmp.new_cipher->algorithm_auth != SSL_aKRB5))
1612238405Sjkim				{
1613238405Sjkim				SSLerr(SSL_F_DTLS1_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
1614238405Sjkim				return(0);
1615238405Sjkim				}
1616160814Ssimon			}
1617160814Ssimon
1618160814Ssimon		l=dtls1_output_cert_chain(s,x);
1619279264Sdelphij		if (!l)
1620279264Sdelphij			{
1621279264Sdelphij			SSLerr(SSL_F_DTLS1_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
1622279264Sdelphij			return(0);
1623279264Sdelphij			}
1624160814Ssimon		s->state=SSL3_ST_SW_CERT_B;
1625160814Ssimon		s->init_num=(int)l;
1626160814Ssimon		s->init_off=0;
1627160814Ssimon
1628160814Ssimon		/* buffer the message to handle re-xmits */
1629160814Ssimon		dtls1_buffer_message(s, 0);
1630160814Ssimon		}
1631160814Ssimon
1632160814Ssimon	/* SSL3_ST_SW_CERT_B */
1633160814Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1634160814Ssimon	}
1635205128Ssimon
1636205128Ssimon#ifndef OPENSSL_NO_TLSEXT
1637205128Ssimonint dtls1_send_newsession_ticket(SSL *s)
1638205128Ssimon	{
1639205128Ssimon	if (s->state == SSL3_ST_SW_SESSION_TICKET_A)
1640205128Ssimon		{
1641205128Ssimon		unsigned char *p, *senc, *macstart;
1642205128Ssimon		int len, slen;
1643205128Ssimon		unsigned int hlen, msg_len;
1644205128Ssimon		EVP_CIPHER_CTX ctx;
1645205128Ssimon		HMAC_CTX hctx;
1646205128Ssimon		SSL_CTX *tctx = s->initial_ctx;
1647205128Ssimon		unsigned char iv[EVP_MAX_IV_LENGTH];
1648205128Ssimon		unsigned char key_name[16];
1649205128Ssimon
1650205128Ssimon		/* get session encoding length */
1651205128Ssimon		slen = i2d_SSL_SESSION(s->session, NULL);
1652205128Ssimon		/* Some length values are 16 bits, so forget it if session is
1653205128Ssimon 		 * too long
1654205128Ssimon 		 */
1655205128Ssimon		if (slen > 0xFF00)
1656205128Ssimon			return -1;
1657205128Ssimon		/* Grow buffer if need be: the length calculation is as
1658205128Ssimon 		 * follows 12 (DTLS handshake message header) +
1659205128Ssimon 		 * 4 (ticket lifetime hint) + 2 (ticket length) +
1660205128Ssimon 		 * 16 (key name) + max_iv_len (iv length) +
1661205128Ssimon 		 * session_length + max_enc_block_size (max encrypted session
1662205128Ssimon 		 * length) + max_md_size (HMAC).
1663205128Ssimon 		 */
1664205128Ssimon		if (!BUF_MEM_grow(s->init_buf,
1665205128Ssimon			DTLS1_HM_HEADER_LENGTH + 22 + EVP_MAX_IV_LENGTH +
1666205128Ssimon			EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE + slen))
1667205128Ssimon			return -1;
1668205128Ssimon		senc = OPENSSL_malloc(slen);
1669205128Ssimon		if (!senc)
1670205128Ssimon			return -1;
1671205128Ssimon		p = senc;
1672205128Ssimon		i2d_SSL_SESSION(s->session, &p);
1673205128Ssimon
1674205128Ssimon		p=(unsigned char *)&(s->init_buf->data[DTLS1_HM_HEADER_LENGTH]);
1675205128Ssimon		EVP_CIPHER_CTX_init(&ctx);
1676205128Ssimon		HMAC_CTX_init(&hctx);
1677205128Ssimon		/* Initialize HMAC and cipher contexts. If callback present
1678205128Ssimon		 * it does all the work otherwise use generated values
1679205128Ssimon		 * from parent ctx.
1680205128Ssimon		 */
1681205128Ssimon		if (tctx->tlsext_ticket_key_cb)
1682205128Ssimon			{
1683205128Ssimon			if (tctx->tlsext_ticket_key_cb(s, key_name, iv, &ctx,
1684205128Ssimon							 &hctx, 1) < 0)
1685205128Ssimon				{
1686205128Ssimon				OPENSSL_free(senc);
1687205128Ssimon				return -1;
1688205128Ssimon				}
1689205128Ssimon			}
1690205128Ssimon		else
1691205128Ssimon			{
1692205128Ssimon			RAND_pseudo_bytes(iv, 16);
1693205128Ssimon			EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
1694205128Ssimon					tctx->tlsext_tick_aes_key, iv);
1695205128Ssimon			HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
1696205128Ssimon					tlsext_tick_md(), NULL);
1697205128Ssimon			memcpy(key_name, tctx->tlsext_tick_key_name, 16);
1698205128Ssimon			}
1699205128Ssimon		l2n(s->session->tlsext_tick_lifetime_hint, p);
1700205128Ssimon		/* Skip ticket length for now */
1701205128Ssimon		p += 2;
1702205128Ssimon		/* Output key name */
1703205128Ssimon		macstart = p;
1704205128Ssimon		memcpy(p, key_name, 16);
1705205128Ssimon		p += 16;
1706205128Ssimon		/* output IV */
1707205128Ssimon		memcpy(p, iv, EVP_CIPHER_CTX_iv_length(&ctx));
1708205128Ssimon		p += EVP_CIPHER_CTX_iv_length(&ctx);
1709205128Ssimon		/* Encrypt session data */
1710205128Ssimon		EVP_EncryptUpdate(&ctx, p, &len, senc, slen);
1711205128Ssimon		p += len;
1712205128Ssimon		EVP_EncryptFinal(&ctx, p, &len);
1713205128Ssimon		p += len;
1714205128Ssimon		EVP_CIPHER_CTX_cleanup(&ctx);
1715205128Ssimon
1716205128Ssimon		HMAC_Update(&hctx, macstart, p - macstart);
1717205128Ssimon		HMAC_Final(&hctx, p, &hlen);
1718205128Ssimon		HMAC_CTX_cleanup(&hctx);
1719205128Ssimon
1720205128Ssimon		p += hlen;
1721205128Ssimon		/* Now write out lengths: p points to end of data written */
1722205128Ssimon		/* Total length */
1723205128Ssimon		len = p - (unsigned char *)(s->init_buf->data);
1724205128Ssimon		/* Ticket length */
1725205128Ssimon		p=(unsigned char *)&(s->init_buf->data[DTLS1_HM_HEADER_LENGTH]) + 4;
1726205128Ssimon		s2n(len - DTLS1_HM_HEADER_LENGTH - 6, p);
1727205128Ssimon
1728205128Ssimon		/* number of bytes to write */
1729205128Ssimon		s->init_num= len;
1730205128Ssimon		s->state=SSL3_ST_SW_SESSION_TICKET_B;
1731205128Ssimon		s->init_off=0;
1732205128Ssimon		OPENSSL_free(senc);
1733205128Ssimon
1734205128Ssimon		/* XDTLS:  set message header ? */
1735205128Ssimon		msg_len = s->init_num - DTLS1_HM_HEADER_LENGTH;
1736205128Ssimon		dtls1_set_message_header(s, (void *)s->init_buf->data,
1737205128Ssimon			SSL3_MT_NEWSESSION_TICKET, msg_len, 0, msg_len);
1738205128Ssimon
1739205128Ssimon		/* buffer the message to handle re-xmits */
1740205128Ssimon		dtls1_buffer_message(s, 0);
1741205128Ssimon		}
1742205128Ssimon
1743205128Ssimon	/* SSL3_ST_SW_SESSION_TICKET_B */
1744205128Ssimon	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1745205128Ssimon	}
1746205128Ssimon#endif
1747