t1_lib.c revision 215697
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->hit)
436						{
437						if(s->session->tlsext_hostname)
438							{
439							*al = SSL_AD_DECODE_ERROR;
440							return 0;
441							}
442						if (len > TLSEXT_MAXLEN_host_name)
443							{
444							*al = TLS1_AD_UNRECOGNIZED_NAME;
445							return 0;
446							}
447						if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
448							{
449							*al = TLS1_AD_INTERNAL_ERROR;
450							return 0;
451							}
452						memcpy(s->session->tlsext_hostname, sdata, len);
453						s->session->tlsext_hostname[len]='\0';
454						if (strlen(s->session->tlsext_hostname) != len) {
455							OPENSSL_free(s->session->tlsext_hostname);
456							s->session->tlsext_hostname = NULL;
457							*al = TLS1_AD_UNRECOGNIZED_NAME;
458							return 0;
459						}
460						s->servername_done = 1;
461
462						}
463					else
464						s->servername_done = s->session->tlsext_hostname
465							&& strlen(s->session->tlsext_hostname) == len
466							&& strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
467
468					break;
469
470				default:
471					break;
472					}
473
474				dsize -= len;
475				}
476			if (dsize != 0)
477				{
478				*al = SSL_AD_DECODE_ERROR;
479				return 0;
480				}
481
482			}
483		else if (type == TLSEXT_TYPE_renegotiate)
484			{
485			if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
486				return 0;
487			renegotiate_seen = 1;
488			}
489		else if (type == TLSEXT_TYPE_status_request &&
490		         s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
491			{
492
493			if (size < 5)
494				{
495				*al = SSL_AD_DECODE_ERROR;
496				return 0;
497				}
498
499			s->tlsext_status_type = *data++;
500			size--;
501			if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
502				{
503				const unsigned char *sdata;
504				int dsize;
505				/* Read in responder_id_list */
506				n2s(data,dsize);
507				size -= 2;
508				if (dsize > size  )
509					{
510					*al = SSL_AD_DECODE_ERROR;
511					return 0;
512					}
513				while (dsize > 0)
514					{
515					OCSP_RESPID *id;
516					int idsize;
517					if (dsize < 4)
518						{
519						*al = SSL_AD_DECODE_ERROR;
520						return 0;
521						}
522					n2s(data, idsize);
523					dsize -= 2 + idsize;
524					if (dsize < 0)
525						{
526						*al = SSL_AD_DECODE_ERROR;
527						return 0;
528						}
529					sdata = data;
530					data += idsize;
531					id = d2i_OCSP_RESPID(NULL,
532								&sdata, idsize);
533					if (!id)
534						{
535						*al = SSL_AD_DECODE_ERROR;
536						return 0;
537						}
538					if (data != sdata)
539						{
540						OCSP_RESPID_free(id);
541						*al = SSL_AD_DECODE_ERROR;
542						return 0;
543						}
544					if (!s->tlsext_ocsp_ids
545						&& !(s->tlsext_ocsp_ids =
546						sk_OCSP_RESPID_new_null()))
547						{
548						OCSP_RESPID_free(id);
549						*al = SSL_AD_INTERNAL_ERROR;
550						return 0;
551						}
552					if (!sk_OCSP_RESPID_push(
553							s->tlsext_ocsp_ids, id))
554						{
555						OCSP_RESPID_free(id);
556						*al = SSL_AD_INTERNAL_ERROR;
557						return 0;
558						}
559					}
560
561				/* Read in request_extensions */
562				n2s(data,dsize);
563				size -= 2;
564				if (dsize > size)
565					{
566					*al = SSL_AD_DECODE_ERROR;
567					return 0;
568					}
569				sdata = data;
570				if (dsize > 0)
571					{
572					s->tlsext_ocsp_exts =
573						d2i_X509_EXTENSIONS(NULL,
574							&sdata, dsize);
575					if (!s->tlsext_ocsp_exts
576						|| (data + dsize != sdata))
577						{
578						*al = SSL_AD_DECODE_ERROR;
579						return 0;
580						}
581					}
582				}
583				/* We don't know what to do with any other type
584 			 	* so ignore it.
585 			 	*/
586				else
587					s->tlsext_status_type = -1;
588			}
589
590		/* session ticket processed earlier */
591
592		data+=size;
593		}
594	*p = data;
595
596	ri_check:
597
598	/* Need RI if renegotiating */
599
600	if (!renegotiate_seen && s->new_session &&
601		!(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
602		{
603		*al = SSL_AD_HANDSHAKE_FAILURE;
604	 	SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
605				SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
606		return 0;
607		}
608
609	return 1;
610	}
611
612int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
613	{
614	unsigned short length;
615	unsigned short type;
616	unsigned short size;
617	unsigned char *data = *p;
618	int tlsext_servername = 0;
619	int renegotiate_seen = 0;
620
621	if (data >= (d+n-2))
622		goto ri_check;
623
624	n2s(data,length);
625	if (data+length != d+n)
626		{
627		*al = SSL_AD_DECODE_ERROR;
628		return 0;
629		}
630
631	while(data <= (d+n-4))
632		{
633		n2s(data,type);
634		n2s(data,size);
635
636		if (data+size > (d+n))
637	   		goto ri_check;
638
639		if (s->tlsext_debug_cb)
640			s->tlsext_debug_cb(s, 1, type, data, size,
641						s->tlsext_debug_arg);
642
643		if (type == TLSEXT_TYPE_server_name)
644			{
645			if (s->tlsext_hostname == NULL || size > 0)
646				{
647				*al = TLS1_AD_UNRECOGNIZED_NAME;
648				return 0;
649				}
650			tlsext_servername = 1;
651			}
652		else if (type == TLSEXT_TYPE_session_ticket)
653			{
654			if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
655				|| (size > 0))
656				{
657				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
658				return 0;
659				}
660			s->tlsext_ticket_expected = 1;
661			}
662		else if (type == TLSEXT_TYPE_status_request &&
663		         s->version != DTLS1_VERSION)
664			{
665			/* MUST be empty and only sent if we've requested
666			 * a status request message.
667			 */
668			if ((s->tlsext_status_type == -1) || (size > 0))
669				{
670				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
671				return 0;
672				}
673			/* Set flag to expect CertificateStatus message */
674			s->tlsext_status_expected = 1;
675			}
676		else if (type == TLSEXT_TYPE_renegotiate)
677			{
678			if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
679				return 0;
680			renegotiate_seen = 1;
681			}
682		data+=size;
683		}
684
685	if (data != d+n)
686		{
687		*al = SSL_AD_DECODE_ERROR;
688		return 0;
689		}
690
691	if (!s->hit && tlsext_servername == 1)
692		{
693 		if (s->tlsext_hostname)
694			{
695			if (s->session->tlsext_hostname == NULL)
696				{
697				s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
698				if (!s->session->tlsext_hostname)
699					{
700					*al = SSL_AD_UNRECOGNIZED_NAME;
701					return 0;
702					}
703				}
704			else
705				{
706				*al = SSL_AD_DECODE_ERROR;
707				return 0;
708				}
709			}
710		}
711
712	*p = data;
713
714	ri_check:
715
716	/* Determine if we need to see RI. Strictly speaking if we want to
717	 * avoid an attack we should *always* see RI even on initial server
718	 * hello because the client doesn't see any renegotiation during an
719	 * attack. However this would mean we could not connect to any server
720	 * which doesn't support RI so for the immediate future tolerate RI
721	 * absence on initial connect only.
722	 */
723	if (!renegotiate_seen
724		&& !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
725		&& !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
726		{
727		*al = SSL_AD_HANDSHAKE_FAILURE;
728		SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
729				SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
730		return 0;
731		}
732
733	return 1;
734	}
735
736int ssl_check_clienthello_tlsext(SSL *s)
737	{
738	int ret=SSL_TLSEXT_ERR_NOACK;
739	int al = SSL_AD_UNRECOGNIZED_NAME;
740
741	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
742		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
743	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
744		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
745
746	/* If status request then ask callback what to do.
747 	 * Note: this must be called after servername callbacks in case
748 	 * the certificate has changed.
749 	 */
750	if ((s->tlsext_status_type != -1) && s->ctx->tlsext_status_cb)
751		{
752		int r;
753		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
754		switch (r)
755			{
756			/* We don't want to send a status request response */
757			case SSL_TLSEXT_ERR_NOACK:
758				s->tlsext_status_expected = 0;
759				break;
760			/* status request response should be sent */
761			case SSL_TLSEXT_ERR_OK:
762				if (s->tlsext_ocsp_resp)
763					s->tlsext_status_expected = 1;
764				else
765					s->tlsext_status_expected = 0;
766				break;
767			/* something bad happened */
768			case SSL_TLSEXT_ERR_ALERT_FATAL:
769				ret = SSL_TLSEXT_ERR_ALERT_FATAL;
770				al = SSL_AD_INTERNAL_ERROR;
771				goto err;
772			}
773		}
774	else
775		s->tlsext_status_expected = 0;
776	err:
777	switch (ret)
778		{
779		case SSL_TLSEXT_ERR_ALERT_FATAL:
780			ssl3_send_alert(s,SSL3_AL_FATAL,al);
781			return -1;
782
783		case SSL_TLSEXT_ERR_ALERT_WARNING:
784			ssl3_send_alert(s,SSL3_AL_WARNING,al);
785			return 1;
786
787		case SSL_TLSEXT_ERR_NOACK:
788			s->servername_done=0;
789			default:
790		return 1;
791		}
792	}
793
794int ssl_check_serverhello_tlsext(SSL *s)
795	{
796	int ret=SSL_TLSEXT_ERR_NOACK;
797	int al = SSL_AD_UNRECOGNIZED_NAME;
798
799	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
800		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
801	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
802		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
803
804	/* If we've requested certificate status and we wont get one
805 	 * tell the callback
806 	 */
807	if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
808			&& s->ctx->tlsext_status_cb)
809		{
810		int r;
811		/* Set resp to NULL, resplen to -1 so callback knows
812 		 * there is no response.
813 		 */
814		if (s->tlsext_ocsp_resp)
815			{
816			OPENSSL_free(s->tlsext_ocsp_resp);
817			s->tlsext_ocsp_resp = NULL;
818			}
819		s->tlsext_ocsp_resplen = -1;
820		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
821		if (r == 0)
822			{
823			al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
824			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
825			}
826		if (r < 0)
827			{
828			al = SSL_AD_INTERNAL_ERROR;
829			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
830			}
831		}
832
833	switch (ret)
834		{
835		case SSL_TLSEXT_ERR_ALERT_FATAL:
836			ssl3_send_alert(s,SSL3_AL_FATAL,al);
837			return -1;
838
839		case SSL_TLSEXT_ERR_ALERT_WARNING:
840			ssl3_send_alert(s,SSL3_AL_WARNING,al);
841			return 1;
842
843		case SSL_TLSEXT_ERR_NOACK:
844			s->servername_done=0;
845			default:
846		return 1;
847		}
848	}
849
850/* Since the server cache lookup is done early on in the processing of client
851 * hello and other operations depend on the result we need to handle any TLS
852 * session ticket extension at the same time.
853 */
854
855int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
856				const unsigned char *limit, SSL_SESSION **ret)
857	{
858	/* Point after session ID in client hello */
859	const unsigned char *p = session_id + len;
860	unsigned short i;
861
862	/* If tickets disabled behave as if no ticket present
863 	 * to permit stateful resumption.
864 	 */
865	if (SSL_get_options(s) & SSL_OP_NO_TICKET)
866		return 1;
867
868	if ((s->version <= SSL3_VERSION) || !limit)
869		return 1;
870	if (p >= limit)
871		return -1;
872	/* Skip past DTLS cookie */
873	if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
874		{
875		i = *(p++);
876		p+= i;
877		if (p >= limit)
878			return -1;
879		}
880	/* Skip past cipher list */
881	n2s(p, i);
882	p+= i;
883	if (p >= limit)
884		return -1;
885	/* Skip past compression algorithm list */
886	i = *(p++);
887	p += i;
888	if (p > limit)
889		return -1;
890	/* Now at start of extensions */
891	if ((p + 2) >= limit)
892		return 1;
893	n2s(p, i);
894	while ((p + 4) <= limit)
895		{
896		unsigned short type, size;
897		n2s(p, type);
898		n2s(p, size);
899		if (p + size > limit)
900			return 1;
901		if (type == TLSEXT_TYPE_session_ticket)
902			{
903			/* If zero length note client will accept a ticket
904 			 * and indicate cache miss to trigger full handshake
905 			 */
906			if (size == 0)
907				{
908				s->tlsext_ticket_expected = 1;
909				return 0;	/* Cache miss */
910				}
911			return tls_decrypt_ticket(s, p, size, session_id, len,
912									ret);
913			}
914		p += size;
915		}
916	return 1;
917	}
918
919static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
920				const unsigned char *sess_id, int sesslen,
921				SSL_SESSION **psess)
922	{
923	SSL_SESSION *sess;
924	unsigned char *sdec;
925	const unsigned char *p;
926	int slen, mlen, renew_ticket = 0;
927	unsigned char tick_hmac[EVP_MAX_MD_SIZE];
928	HMAC_CTX hctx;
929	EVP_CIPHER_CTX ctx;
930	SSL_CTX *tctx = s->initial_ctx;
931	/* Need at least keyname + iv + some encrypted data */
932	if (eticklen < 48)
933		goto tickerr;
934	/* Initialize session ticket encryption and HMAC contexts */
935	HMAC_CTX_init(&hctx);
936	EVP_CIPHER_CTX_init(&ctx);
937	if (tctx->tlsext_ticket_key_cb)
938		{
939		unsigned char *nctick = (unsigned char *)etick;
940		int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
941							&ctx, &hctx, 0);
942		if (rv < 0)
943			return -1;
944		if (rv == 0)
945			goto tickerr;
946		if (rv == 2)
947			renew_ticket = 1;
948		}
949	else
950		{
951		/* Check key name matches */
952		if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
953			goto tickerr;
954		HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
955					tlsext_tick_md(), NULL);
956		EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
957				tctx->tlsext_tick_aes_key, etick + 16);
958		}
959	/* Attempt to process session ticket, first conduct sanity and
960 	 * integrity checks on ticket.
961 	 */
962	mlen = HMAC_size(&hctx);
963	eticklen -= mlen;
964	/* Check HMAC of encrypted ticket */
965	HMAC_Update(&hctx, etick, eticklen);
966	HMAC_Final(&hctx, tick_hmac, NULL);
967	HMAC_CTX_cleanup(&hctx);
968	if (memcmp(tick_hmac, etick + eticklen, mlen))
969		goto tickerr;
970	/* Attempt to decrypt session data */
971	/* Move p after IV to start of encrypted ticket, update length */
972	p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
973	eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
974	sdec = OPENSSL_malloc(eticklen);
975	if (!sdec)
976		{
977		EVP_CIPHER_CTX_cleanup(&ctx);
978		return -1;
979		}
980	EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
981	if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
982		goto tickerr;
983	slen += mlen;
984	EVP_CIPHER_CTX_cleanup(&ctx);
985	p = sdec;
986
987	sess = d2i_SSL_SESSION(NULL, &p, slen);
988	OPENSSL_free(sdec);
989	if (sess)
990		{
991		/* The session ID if non-empty is used by some clients to
992 		 * detect that the ticket has been accepted. So we copy it to
993 		 * the session structure. If it is empty set length to zero
994 		 * as required by standard.
995 		 */
996		if (sesslen)
997			memcpy(sess->session_id, sess_id, sesslen);
998		sess->session_id_length = sesslen;
999		*psess = sess;
1000		s->tlsext_ticket_expected = renew_ticket;
1001		return 1;
1002		}
1003	/* If session decrypt failure indicate a cache miss and set state to
1004 	 * send a new ticket
1005 	 */
1006	tickerr:
1007	s->tlsext_ticket_expected = 1;
1008	return 0;
1009	}
1010
1011#endif
1012