t1_lib.c revision 205128
1/* ssl/t1_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to.  The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 *    notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 *    notice, this list of conditions and the following disclaimer in the
30 *    documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 *    must display the following acknowledgement:
33 *    "This product includes cryptographic software written by
34 *     Eric Young (eay@cryptsoft.com)"
35 *    The word 'cryptographic' can be left out if the rouines from the library
36 *    being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 *    the apps directory (application code) you must include an acknowledgement:
39 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <openssl/objects.h>
61#include <openssl/evp.h>
62#include <openssl/hmac.h>
63#include <openssl/ocsp.h>
64#include "ssl_locl.h"
65
66const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
67
68#ifndef OPENSSL_NO_TLSEXT
69static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
70				const unsigned char *sess_id, int sesslen,
71				SSL_SESSION **psess);
72#endif
73
74SSL3_ENC_METHOD TLSv1_enc_data={
75	tls1_enc,
76	tls1_mac,
77	tls1_setup_key_block,
78	tls1_generate_master_secret,
79	tls1_change_cipher_state,
80	tls1_final_finish_mac,
81	TLS1_FINISH_MAC_LENGTH,
82	tls1_cert_verify_mac,
83	TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
84	TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
85	tls1_alert_code,
86	};
87
88long tls1_default_timeout(void)
89	{
90	/* 2 hours, the 24 hours mentioned in the TLSv1 spec
91	 * is way too long for http, the cache would over fill */
92	return(60*60*2);
93	}
94
95IMPLEMENT_tls1_meth_func(tlsv1_base_method,
96			ssl_undefined_function,
97			ssl_undefined_function,
98			ssl_bad_method)
99
100int tls1_new(SSL *s)
101	{
102	if (!ssl3_new(s)) return(0);
103	s->method->ssl_clear(s);
104	return(1);
105	}
106
107void tls1_free(SSL *s)
108	{
109	ssl3_free(s);
110	}
111
112void tls1_clear(SSL *s)
113	{
114	ssl3_clear(s);
115	s->version=TLS1_VERSION;
116	}
117
118#if 0
119long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
120	{
121	return(0);
122	}
123
124long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
125	{
126	return(0);
127	}
128#endif
129
130#ifndef OPENSSL_NO_TLSEXT
131unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
132	{
133	int extdatalen=0;
134	unsigned char *ret = p;
135
136	/* don't add extensions for SSLv3 unless doing secure renegotiation */
137	if (s->client_version == SSL3_VERSION
138					&& !s->s3->send_connection_binding)
139		return p;
140
141	ret+=2;
142
143	if (ret>=limit) return NULL; /* this really never occurs, but ... */
144
145 	if (s->tlsext_hostname != NULL)
146		{
147		/* Add TLS extension servername to the Client Hello message */
148		unsigned long size_str;
149		long lenmax;
150
151		/* check for enough space.
152		   4 for the servername type and entension length
153		   2 for servernamelist length
154		   1 for the hostname type
155		   2 for hostname length
156		   + hostname length
157		*/
158
159		if ((lenmax = limit - ret - 9) < 0
160		|| (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
161			return NULL;
162
163		/* extension type and length */
164		s2n(TLSEXT_TYPE_server_name,ret);
165		s2n(size_str+5,ret);
166
167		/* length of servername list */
168		s2n(size_str+3,ret);
169
170		/* hostname type, length and hostname */
171		*(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
172		s2n(size_str,ret);
173		memcpy(ret, s->tlsext_hostname, size_str);
174		ret+=size_str;
175
176		}
177
178        /* Add RI if renegotiating */
179        if (s->new_session)
180          {
181          int el;
182
183          if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
184              {
185              SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
186              return NULL;
187              }
188
189          if((limit - p - 4 - el) < 0) return NULL;
190
191          s2n(TLSEXT_TYPE_renegotiate,ret);
192          s2n(el,ret);
193
194          if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
195              {
196              SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
197              return NULL;
198              }
199
200          ret += el;
201        }
202
203
204	if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
205		{
206		int ticklen;
207		if (!s->new_session && s->session && s->session->tlsext_tick)
208			ticklen = s->session->tlsext_ticklen;
209		else
210			ticklen = 0;
211		/* Check for enough room 2 for extension type, 2 for len
212 		 * rest for ticket
213  		 */
214		if (limit - ret - 4 - ticklen < 0)
215			return NULL;
216		s2n(TLSEXT_TYPE_session_ticket,ret);
217		s2n(ticklen,ret);
218		if (ticklen)
219			{
220			memcpy(ret, s->session->tlsext_tick, ticklen);
221			ret += ticklen;
222			}
223		}
224
225	if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
226	    s->version != DTLS1_VERSION)
227		{
228		int i;
229		long extlen, idlen, itmp;
230		OCSP_RESPID *id;
231
232		idlen = 0;
233		for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
234			{
235			id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
236			itmp = i2d_OCSP_RESPID(id, NULL);
237			if (itmp <= 0)
238				return NULL;
239			idlen += itmp + 2;
240			}
241
242		if (s->tlsext_ocsp_exts)
243			{
244			extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
245			if (extlen < 0)
246				return NULL;
247			}
248		else
249			extlen = 0;
250
251		if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
252		s2n(TLSEXT_TYPE_status_request, ret);
253		if (extlen + idlen > 0xFFF0)
254			return NULL;
255		s2n(extlen + idlen + 5, ret);
256		*(ret++) = TLSEXT_STATUSTYPE_ocsp;
257		s2n(idlen, ret);
258		for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
259			{
260			/* save position of id len */
261			unsigned char *q = ret;
262			id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
263			/* skip over id len */
264			ret += 2;
265			itmp = i2d_OCSP_RESPID(id, &ret);
266			/* write id len */
267			s2n(itmp, q);
268			}
269		s2n(extlen, ret);
270		if (extlen > 0)
271			i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
272		}
273
274	if ((extdatalen = ret-p-2)== 0)
275		return p;
276
277	s2n(extdatalen,p);
278	return ret;
279	}
280
281unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
282	{
283	int extdatalen=0;
284	unsigned char *ret = p;
285
286	/* don't add extensions for SSLv3, unless doing secure renegotiation */
287	if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
288		return p;
289
290	ret+=2;
291	if (ret>=limit) return NULL; /* this really never occurs, but ... */
292
293	if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
294		{
295		if (limit - ret - 4 < 0) return NULL;
296
297		s2n(TLSEXT_TYPE_server_name,ret);
298		s2n(0,ret);
299		}
300
301	if(s->s3->send_connection_binding)
302        {
303          int el;
304
305          if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
306              {
307              SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
308              return NULL;
309              }
310
311          if((limit - p - 4 - el) < 0) return NULL;
312
313          s2n(TLSEXT_TYPE_renegotiate,ret);
314          s2n(el,ret);
315
316          if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
317              {
318              SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
319              return NULL;
320              }
321
322          ret += el;
323        }
324
325	if (s->tlsext_ticket_expected
326		&& !(SSL_get_options(s) & SSL_OP_NO_TICKET))
327		{
328		if (limit - ret - 4 < 0) return NULL;
329		s2n(TLSEXT_TYPE_session_ticket,ret);
330		s2n(0,ret);
331		}
332
333	if (s->tlsext_status_expected)
334		{
335		if ((long)(limit - ret - 4) < 0) return NULL;
336		s2n(TLSEXT_TYPE_status_request,ret);
337		s2n(0,ret);
338		}
339
340	if ((extdatalen = ret-p-2)== 0)
341		return p;
342
343	s2n(extdatalen,p);
344	return ret;
345	}
346
347int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
348	{
349	unsigned short type;
350	unsigned short size;
351	unsigned short len;
352	unsigned char *data = *p;
353	int renegotiate_seen = 0;
354
355	s->servername_done = 0;
356	s->tlsext_status_type = -1;
357
358	if (data >= (d+n-2))
359		goto ri_check;
360
361	n2s(data,len);
362
363	if (data > (d+n-len))
364		goto ri_check;
365
366	while (data <= (d+n-4))
367		{
368		n2s(data,type);
369		n2s(data,size);
370
371		if (data+size > (d+n))
372	   		goto ri_check;
373
374		if (s->tlsext_debug_cb)
375			s->tlsext_debug_cb(s, 0, type, data, size,
376						s->tlsext_debug_arg);
377/* The servername extension is treated as follows:
378
379   - Only the hostname type is supported with a maximum length of 255.
380   - The servername is rejected if too long or if it contains zeros,
381     in which case an fatal alert is generated.
382   - The servername field is maintained together with the session cache.
383   - When a session is resumed, the servername call back invoked in order
384     to allow the application to position itself to the right context.
385   - The servername is acknowledged if it is new for a session or when
386     it is identical to a previously used for the same session.
387     Applications can control the behaviour.  They can at any time
388     set a 'desirable' servername for a new SSL object. This can be the
389     case for example with HTTPS when a Host: header field is received and
390     a renegotiation is requested. In this case, a possible servername
391     presented in the new client hello is only acknowledged if it matches
392     the value of the Host: field.
393   - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
394     if they provide for changing an explicit servername context for the session,
395     i.e. when the session has been established with a servername extension.
396   - On session reconnect, the servername extension may be absent.
397
398*/
399
400		if (type == TLSEXT_TYPE_server_name)
401			{
402			unsigned char *sdata;
403			int servname_type;
404			int dsize;
405
406			if (size < 2)
407				{
408				*al = SSL_AD_DECODE_ERROR;
409				return 0;
410				}
411			n2s(data,dsize);
412			size -= 2;
413			if (dsize > size  )
414				{
415				*al = SSL_AD_DECODE_ERROR;
416				return 0;
417				}
418
419			sdata = data;
420			while (dsize > 3)
421				{
422	 			servname_type = *(sdata++);
423				n2s(sdata,len);
424				dsize -= 3;
425
426				if (len > dsize)
427					{
428					*al = SSL_AD_DECODE_ERROR;
429					return 0;
430					}
431				if (s->servername_done == 0)
432				switch (servname_type)
433					{
434				case TLSEXT_NAMETYPE_host_name:
435					if (s->session->tlsext_hostname == NULL)
436						{
437						if (len > TLSEXT_MAXLEN_host_name ||
438							((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL))
439							{
440							*al = TLS1_AD_UNRECOGNIZED_NAME;
441							return 0;
442							}
443						memcpy(s->session->tlsext_hostname, sdata, len);
444						s->session->tlsext_hostname[len]='\0';
445						if (strlen(s->session->tlsext_hostname) != len) {
446							OPENSSL_free(s->session->tlsext_hostname);
447							s->session->tlsext_hostname = NULL;
448							*al = TLS1_AD_UNRECOGNIZED_NAME;
449							return 0;
450						}
451						s->servername_done = 1;
452
453						}
454					else
455						s->servername_done = strlen(s->session->tlsext_hostname) == len
456							&& strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
457
458					break;
459
460				default:
461					break;
462					}
463
464				dsize -= len;
465				}
466			if (dsize != 0)
467				{
468				*al = SSL_AD_DECODE_ERROR;
469				return 0;
470				}
471
472			}
473		else if (type == TLSEXT_TYPE_renegotiate)
474			{
475			if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
476				return 0;
477			renegotiate_seen = 1;
478			}
479		else if (type == TLSEXT_TYPE_status_request &&
480		         s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
481			{
482
483			if (size < 5)
484				{
485				*al = SSL_AD_DECODE_ERROR;
486				return 0;
487				}
488
489			s->tlsext_status_type = *data++;
490			size--;
491			if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
492				{
493				const unsigned char *sdata;
494				int dsize;
495				/* Read in responder_id_list */
496				n2s(data,dsize);
497				size -= 2;
498				if (dsize > size  )
499					{
500					*al = SSL_AD_DECODE_ERROR;
501					return 0;
502					}
503				while (dsize > 0)
504					{
505					OCSP_RESPID *id;
506					int idsize;
507					if (dsize < 4)
508						{
509						*al = SSL_AD_DECODE_ERROR;
510						return 0;
511						}
512					n2s(data, idsize);
513					dsize -= 2 + idsize;
514					if (dsize < 0)
515						{
516						*al = SSL_AD_DECODE_ERROR;
517						return 0;
518						}
519					sdata = data;
520					data += idsize;
521					id = d2i_OCSP_RESPID(NULL,
522								&sdata, idsize);
523					if (!id)
524						{
525						*al = SSL_AD_DECODE_ERROR;
526						return 0;
527						}
528					if (data != sdata)
529						{
530						OCSP_RESPID_free(id);
531						*al = SSL_AD_DECODE_ERROR;
532						return 0;
533						}
534					if (!s->tlsext_ocsp_ids
535						&& !(s->tlsext_ocsp_ids =
536						sk_OCSP_RESPID_new_null()))
537						{
538						OCSP_RESPID_free(id);
539						*al = SSL_AD_INTERNAL_ERROR;
540						return 0;
541						}
542					if (!sk_OCSP_RESPID_push(
543							s->tlsext_ocsp_ids, id))
544						{
545						OCSP_RESPID_free(id);
546						*al = SSL_AD_INTERNAL_ERROR;
547						return 0;
548						}
549					}
550
551				/* Read in request_extensions */
552				n2s(data,dsize);
553				size -= 2;
554				if (dsize > size)
555					{
556					*al = SSL_AD_DECODE_ERROR;
557					return 0;
558					}
559				sdata = data;
560				if (dsize > 0)
561					{
562					s->tlsext_ocsp_exts =
563						d2i_X509_EXTENSIONS(NULL,
564							&sdata, dsize);
565					if (!s->tlsext_ocsp_exts
566						|| (data + dsize != sdata))
567						{
568						*al = SSL_AD_DECODE_ERROR;
569						return 0;
570						}
571					}
572				}
573				/* We don't know what to do with any other type
574 			 	* so ignore it.
575 			 	*/
576				else
577					s->tlsext_status_type = -1;
578			}
579
580		/* session ticket processed earlier */
581
582		data+=size;
583		}
584	*p = data;
585
586	ri_check:
587
588	/* Need RI if renegotiating */
589
590	if (!renegotiate_seen && s->new_session &&
591		!(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
592		{
593		*al = SSL_AD_HANDSHAKE_FAILURE;
594	 	SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
595				SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
596		return 0;
597		}
598
599	return 1;
600	}
601
602int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
603	{
604	unsigned short type;
605	unsigned short size;
606	unsigned short len;
607	unsigned char *data = *p;
608	int tlsext_servername = 0;
609	int renegotiate_seen = 0;
610
611	if (data >= (d+n-2))
612		goto ri_check;
613
614	n2s(data,len);
615
616	while(data <= (d+n-4))
617		{
618		n2s(data,type);
619		n2s(data,size);
620
621		if (data+size > (d+n))
622	   		goto ri_check;
623
624		if (s->tlsext_debug_cb)
625			s->tlsext_debug_cb(s, 1, type, data, size,
626						s->tlsext_debug_arg);
627
628		if (type == TLSEXT_TYPE_server_name)
629			{
630			if (s->tlsext_hostname == NULL || size > 0)
631				{
632				*al = TLS1_AD_UNRECOGNIZED_NAME;
633				return 0;
634				}
635			tlsext_servername = 1;
636			}
637		else if (type == TLSEXT_TYPE_session_ticket)
638			{
639			if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
640				|| (size > 0))
641				{
642				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
643				return 0;
644				}
645			s->tlsext_ticket_expected = 1;
646			}
647		else if (type == TLSEXT_TYPE_status_request &&
648		         s->version != DTLS1_VERSION)
649			{
650			/* MUST be empty and only sent if we've requested
651			 * a status request message.
652			 */
653			if ((s->tlsext_status_type == -1) || (size > 0))
654				{
655				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
656				return 0;
657				}
658			/* Set flag to expect CertificateStatus message */
659			s->tlsext_status_expected = 1;
660			}
661		else if (type == TLSEXT_TYPE_renegotiate)
662			{
663			if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
664				return 0;
665			renegotiate_seen = 1;
666			}
667		data+=size;
668		}
669
670	if (data != d+n)
671		{
672		*al = SSL_AD_DECODE_ERROR;
673		return 0;
674		}
675
676	if (!s->hit && tlsext_servername == 1)
677		{
678 		if (s->tlsext_hostname)
679			{
680			if (s->session->tlsext_hostname == NULL)
681				{
682				s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
683				if (!s->session->tlsext_hostname)
684					{
685					*al = SSL_AD_UNRECOGNIZED_NAME;
686					return 0;
687					}
688				}
689			else
690				{
691				*al = SSL_AD_DECODE_ERROR;
692				return 0;
693				}
694			}
695		}
696
697	*p = data;
698
699	ri_check:
700
701	/* Determine if we need to see RI. Strictly speaking if we want to
702	 * avoid an attack we should *always* see RI even on initial server
703	 * hello because the client doesn't see any renegotiation during an
704	 * attack. However this would mean we could not connect to any server
705	 * which doesn't support RI so for the immediate future tolerate RI
706	 * absence on initial connect only.
707	 */
708	if (!renegotiate_seen
709		&& !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
710		&& !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
711		{
712		*al = SSL_AD_HANDSHAKE_FAILURE;
713		SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
714				SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
715		return 0;
716		}
717
718	return 1;
719	}
720
721int ssl_check_clienthello_tlsext(SSL *s)
722	{
723	int ret=SSL_TLSEXT_ERR_NOACK;
724	int al = SSL_AD_UNRECOGNIZED_NAME;
725
726	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
727		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
728	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
729		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
730
731	/* If status request then ask callback what to do.
732 	 * Note: this must be called after servername callbacks in case
733 	 * the certificate has changed.
734 	 */
735	if ((s->tlsext_status_type != -1) && s->ctx->tlsext_status_cb)
736		{
737		int r;
738		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
739		switch (r)
740			{
741			/* We don't want to send a status request response */
742			case SSL_TLSEXT_ERR_NOACK:
743				s->tlsext_status_expected = 0;
744				break;
745			/* status request response should be sent */
746			case SSL_TLSEXT_ERR_OK:
747				if (s->tlsext_ocsp_resp)
748					s->tlsext_status_expected = 1;
749				else
750					s->tlsext_status_expected = 0;
751				break;
752			/* something bad happened */
753			case SSL_TLSEXT_ERR_ALERT_FATAL:
754				ret = SSL_TLSEXT_ERR_ALERT_FATAL;
755				al = SSL_AD_INTERNAL_ERROR;
756				goto err;
757			}
758		}
759	else
760		s->tlsext_status_expected = 0;
761	err:
762	switch (ret)
763		{
764		case SSL_TLSEXT_ERR_ALERT_FATAL:
765			ssl3_send_alert(s,SSL3_AL_FATAL,al);
766			return -1;
767
768		case SSL_TLSEXT_ERR_ALERT_WARNING:
769			ssl3_send_alert(s,SSL3_AL_WARNING,al);
770			return 1;
771
772		case SSL_TLSEXT_ERR_NOACK:
773			s->servername_done=0;
774			default:
775		return 1;
776		}
777	}
778
779int ssl_check_serverhello_tlsext(SSL *s)
780	{
781	int ret=SSL_TLSEXT_ERR_NOACK;
782	int al = SSL_AD_UNRECOGNIZED_NAME;
783
784	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
785		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
786	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
787		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
788
789	/* If we've requested certificate status and we wont get one
790 	 * tell the callback
791 	 */
792	if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
793			&& s->ctx->tlsext_status_cb)
794		{
795		int r;
796		/* Set resp to NULL, resplen to -1 so callback knows
797 		 * there is no response.
798 		 */
799		if (s->tlsext_ocsp_resp)
800			{
801			OPENSSL_free(s->tlsext_ocsp_resp);
802			s->tlsext_ocsp_resp = NULL;
803			}
804		s->tlsext_ocsp_resplen = -1;
805		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
806		if (r == 0)
807			{
808			al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
809			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
810			}
811		if (r < 0)
812			{
813			al = SSL_AD_INTERNAL_ERROR;
814			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
815			}
816		}
817
818	switch (ret)
819		{
820		case SSL_TLSEXT_ERR_ALERT_FATAL:
821			ssl3_send_alert(s,SSL3_AL_FATAL,al);
822			return -1;
823
824		case SSL_TLSEXT_ERR_ALERT_WARNING:
825			ssl3_send_alert(s,SSL3_AL_WARNING,al);
826			return 1;
827
828		case SSL_TLSEXT_ERR_NOACK:
829			s->servername_done=0;
830			default:
831		return 1;
832		}
833	}
834
835/* Since the server cache lookup is done early on in the processing of client
836 * hello and other operations depend on the result we need to handle any TLS
837 * session ticket extension at the same time.
838 */
839
840int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
841				const unsigned char *limit, SSL_SESSION **ret)
842	{
843	/* Point after session ID in client hello */
844	const unsigned char *p = session_id + len;
845	unsigned short i;
846
847	/* If tickets disabled behave as if no ticket present
848 	 * to permit stateful resumption.
849 	 */
850	if (SSL_get_options(s) & SSL_OP_NO_TICKET)
851		return 1;
852
853	if ((s->version <= SSL3_VERSION) || !limit)
854		return 1;
855	if (p >= limit)
856		return -1;
857	/* Skip past DTLS cookie */
858	if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
859		{
860		i = *(p++);
861		p+= i;
862		if (p >= limit)
863			return -1;
864		}
865	/* Skip past cipher list */
866	n2s(p, i);
867	p+= i;
868	if (p >= limit)
869		return -1;
870	/* Skip past compression algorithm list */
871	i = *(p++);
872	p += i;
873	if (p > limit)
874		return -1;
875	/* Now at start of extensions */
876	if ((p + 2) >= limit)
877		return 1;
878	n2s(p, i);
879	while ((p + 4) <= limit)
880		{
881		unsigned short type, size;
882		n2s(p, type);
883		n2s(p, size);
884		if (p + size > limit)
885			return 1;
886		if (type == TLSEXT_TYPE_session_ticket)
887			{
888			/* If zero length note client will accept a ticket
889 			 * and indicate cache miss to trigger full handshake
890 			 */
891			if (size == 0)
892				{
893				s->tlsext_ticket_expected = 1;
894				return 0;	/* Cache miss */
895				}
896			return tls_decrypt_ticket(s, p, size, session_id, len,
897									ret);
898			}
899		p += size;
900		}
901	return 1;
902	}
903
904static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
905				const unsigned char *sess_id, int sesslen,
906				SSL_SESSION **psess)
907	{
908	SSL_SESSION *sess;
909	unsigned char *sdec;
910	const unsigned char *p;
911	int slen, mlen, renew_ticket = 0;
912	unsigned char tick_hmac[EVP_MAX_MD_SIZE];
913	HMAC_CTX hctx;
914	EVP_CIPHER_CTX ctx;
915	SSL_CTX *tctx = s->initial_ctx;
916	/* Need at least keyname + iv + some encrypted data */
917	if (eticklen < 48)
918		goto tickerr;
919	/* Initialize session ticket encryption and HMAC contexts */
920	HMAC_CTX_init(&hctx);
921	EVP_CIPHER_CTX_init(&ctx);
922	if (tctx->tlsext_ticket_key_cb)
923		{
924		unsigned char *nctick = (unsigned char *)etick;
925		int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
926							&ctx, &hctx, 0);
927		if (rv < 0)
928			return -1;
929		if (rv == 0)
930			goto tickerr;
931		if (rv == 2)
932			renew_ticket = 1;
933		}
934	else
935		{
936		/* Check key name matches */
937		if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
938			goto tickerr;
939		HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
940					tlsext_tick_md(), NULL);
941		EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
942				tctx->tlsext_tick_aes_key, etick + 16);
943		}
944	/* Attempt to process session ticket, first conduct sanity and
945 	 * integrity checks on ticket.
946 	 */
947	mlen = HMAC_size(&hctx);
948	eticklen -= mlen;
949	/* Check HMAC of encrypted ticket */
950	HMAC_Update(&hctx, etick, eticklen);
951	HMAC_Final(&hctx, tick_hmac, NULL);
952	HMAC_CTX_cleanup(&hctx);
953	if (memcmp(tick_hmac, etick + eticklen, mlen))
954		goto tickerr;
955	/* Attempt to decrypt session data */
956	/* Move p after IV to start of encrypted ticket, update length */
957	p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
958	eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
959	sdec = OPENSSL_malloc(eticklen);
960	if (!sdec)
961		{
962		EVP_CIPHER_CTX_cleanup(&ctx);
963		return -1;
964		}
965	EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
966	if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
967		goto tickerr;
968	slen += mlen;
969	EVP_CIPHER_CTX_cleanup(&ctx);
970	p = sdec;
971
972	sess = d2i_SSL_SESSION(NULL, &p, slen);
973	OPENSSL_free(sdec);
974	if (sess)
975		{
976		/* The session ID if non-empty is used by some clients to
977 		 * detect that the ticket has been accepted. So we copy it to
978 		 * the session structure. If it is empty set length to zero
979 		 * as required by standard.
980 		 */
981		if (sesslen)
982			memcpy(sess->session_id, sess_id, sesslen);
983		sess->session_id_length = sesslen;
984		*psess = sess;
985		s->tlsext_ticket_expected = renew_ticket;
986		return 1;
987		}
988	/* If session decrypt failure indicate a cache miss and set state to
989 	 * send a new ticket
990 	 */
991	tickerr:
992	s->tlsext_ticket_expected = 1;
993	return 0;
994	}
995
996#endif
997