t1_lib.c revision 267258
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 * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 *    notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 *    notice, this list of conditions and the following disclaimer in
70 *    the documentation and/or other materials provided with the
71 *    distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 *    software must display the following acknowledgment:
75 *    "This product includes software developed by the OpenSSL Project
76 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 *    endorse or promote products derived from this software without
80 *    prior written permission. For written permission, please contact
81 *    openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 *    nor may "OpenSSL" appear in their names without prior written
85 *    permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 *    acknowledgment:
89 *    "This product includes software developed by the OpenSSL Project
90 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com).  This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#include <stdio.h>
113#include <openssl/objects.h>
114#include <openssl/evp.h>
115#include <openssl/hmac.h>
116#include <openssl/ocsp.h>
117#include <openssl/rand.h>
118#include "ssl_locl.h"
119
120const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
121
122#ifndef OPENSSL_NO_TLSEXT
123static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
124				const unsigned char *sess_id, int sesslen,
125				SSL_SESSION **psess);
126#endif
127
128SSL3_ENC_METHOD TLSv1_enc_data={
129	tls1_enc,
130	tls1_mac,
131	tls1_setup_key_block,
132	tls1_generate_master_secret,
133	tls1_change_cipher_state,
134	tls1_final_finish_mac,
135	TLS1_FINISH_MAC_LENGTH,
136	tls1_cert_verify_mac,
137	TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
138	TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
139	tls1_alert_code,
140	tls1_export_keying_material,
141	};
142
143long tls1_default_timeout(void)
144	{
145	/* 2 hours, the 24 hours mentioned in the TLSv1 spec
146	 * is way too long for http, the cache would over fill */
147	return(60*60*2);
148	}
149
150int tls1_new(SSL *s)
151	{
152	if (!ssl3_new(s)) return(0);
153	s->method->ssl_clear(s);
154	return(1);
155	}
156
157void tls1_free(SSL *s)
158	{
159#ifndef OPENSSL_NO_TLSEXT
160	if (s->tlsext_session_ticket)
161		{
162		OPENSSL_free(s->tlsext_session_ticket);
163		}
164#endif /* OPENSSL_NO_TLSEXT */
165	ssl3_free(s);
166	}
167
168void tls1_clear(SSL *s)
169	{
170	ssl3_clear(s);
171	s->version = s->method->version;
172	}
173
174#ifndef OPENSSL_NO_EC
175
176static int nid_list[] =
177	{
178		NID_sect163k1, /* sect163k1 (1) */
179		NID_sect163r1, /* sect163r1 (2) */
180		NID_sect163r2, /* sect163r2 (3) */
181		NID_sect193r1, /* sect193r1 (4) */
182		NID_sect193r2, /* sect193r2 (5) */
183		NID_sect233k1, /* sect233k1 (6) */
184		NID_sect233r1, /* sect233r1 (7) */
185		NID_sect239k1, /* sect239k1 (8) */
186		NID_sect283k1, /* sect283k1 (9) */
187		NID_sect283r1, /* sect283r1 (10) */
188		NID_sect409k1, /* sect409k1 (11) */
189		NID_sect409r1, /* sect409r1 (12) */
190		NID_sect571k1, /* sect571k1 (13) */
191		NID_sect571r1, /* sect571r1 (14) */
192		NID_secp160k1, /* secp160k1 (15) */
193		NID_secp160r1, /* secp160r1 (16) */
194		NID_secp160r2, /* secp160r2 (17) */
195		NID_secp192k1, /* secp192k1 (18) */
196		NID_X9_62_prime192v1, /* secp192r1 (19) */
197		NID_secp224k1, /* secp224k1 (20) */
198		NID_secp224r1, /* secp224r1 (21) */
199		NID_secp256k1, /* secp256k1 (22) */
200		NID_X9_62_prime256v1, /* secp256r1 (23) */
201		NID_secp384r1, /* secp384r1 (24) */
202		NID_secp521r1  /* secp521r1 (25) */
203	};
204
205static int pref_list[] =
206	{
207		NID_sect571r1, /* sect571r1 (14) */
208		NID_sect571k1, /* sect571k1 (13) */
209		NID_secp521r1, /* secp521r1 (25) */
210		NID_sect409k1, /* sect409k1 (11) */
211		NID_sect409r1, /* sect409r1 (12) */
212		NID_secp384r1, /* secp384r1 (24) */
213		NID_sect283k1, /* sect283k1 (9) */
214		NID_sect283r1, /* sect283r1 (10) */
215		NID_secp256k1, /* secp256k1 (22) */
216		NID_X9_62_prime256v1, /* secp256r1 (23) */
217		NID_sect239k1, /* sect239k1 (8) */
218		NID_sect233k1, /* sect233k1 (6) */
219		NID_sect233r1, /* sect233r1 (7) */
220		NID_secp224k1, /* secp224k1 (20) */
221		NID_secp224r1, /* secp224r1 (21) */
222		NID_sect193r1, /* sect193r1 (4) */
223		NID_sect193r2, /* sect193r2 (5) */
224		NID_secp192k1, /* secp192k1 (18) */
225		NID_X9_62_prime192v1, /* secp192r1 (19) */
226		NID_sect163k1, /* sect163k1 (1) */
227		NID_sect163r1, /* sect163r1 (2) */
228		NID_sect163r2, /* sect163r2 (3) */
229		NID_secp160k1, /* secp160k1 (15) */
230		NID_secp160r1, /* secp160r1 (16) */
231		NID_secp160r2, /* secp160r2 (17) */
232	};
233
234int tls1_ec_curve_id2nid(int curve_id)
235	{
236	/* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
237	if ((curve_id < 1) || ((unsigned int)curve_id >
238				sizeof(nid_list)/sizeof(nid_list[0])))
239		return 0;
240	return nid_list[curve_id-1];
241	}
242
243int tls1_ec_nid2curve_id(int nid)
244	{
245	/* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
246	switch (nid)
247		{
248	case NID_sect163k1: /* sect163k1 (1) */
249		return 1;
250	case NID_sect163r1: /* sect163r1 (2) */
251		return 2;
252	case NID_sect163r2: /* sect163r2 (3) */
253		return 3;
254	case NID_sect193r1: /* sect193r1 (4) */
255		return 4;
256	case NID_sect193r2: /* sect193r2 (5) */
257		return 5;
258	case NID_sect233k1: /* sect233k1 (6) */
259		return 6;
260	case NID_sect233r1: /* sect233r1 (7) */
261		return 7;
262	case NID_sect239k1: /* sect239k1 (8) */
263		return 8;
264	case NID_sect283k1: /* sect283k1 (9) */
265		return 9;
266	case NID_sect283r1: /* sect283r1 (10) */
267		return 10;
268	case NID_sect409k1: /* sect409k1 (11) */
269		return 11;
270	case NID_sect409r1: /* sect409r1 (12) */
271		return 12;
272	case NID_sect571k1: /* sect571k1 (13) */
273		return 13;
274	case NID_sect571r1: /* sect571r1 (14) */
275		return 14;
276	case NID_secp160k1: /* secp160k1 (15) */
277		return 15;
278	case NID_secp160r1: /* secp160r1 (16) */
279		return 16;
280	case NID_secp160r2: /* secp160r2 (17) */
281		return 17;
282	case NID_secp192k1: /* secp192k1 (18) */
283		return 18;
284	case NID_X9_62_prime192v1: /* secp192r1 (19) */
285		return 19;
286	case NID_secp224k1: /* secp224k1 (20) */
287		return 20;
288	case NID_secp224r1: /* secp224r1 (21) */
289		return 21;
290	case NID_secp256k1: /* secp256k1 (22) */
291		return 22;
292	case NID_X9_62_prime256v1: /* secp256r1 (23) */
293		return 23;
294	case NID_secp384r1: /* secp384r1 (24) */
295		return 24;
296	case NID_secp521r1:  /* secp521r1 (25) */
297		return 25;
298	default:
299		return 0;
300		}
301	}
302#endif /* OPENSSL_NO_EC */
303
304#ifndef OPENSSL_NO_TLSEXT
305
306/* List of supported signature algorithms and hashes. Should make this
307 * customisable at some point, for now include everything we support.
308 */
309
310#ifdef OPENSSL_NO_RSA
311#define tlsext_sigalg_rsa(md) /* */
312#else
313#define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
314#endif
315
316#ifdef OPENSSL_NO_DSA
317#define tlsext_sigalg_dsa(md) /* */
318#else
319#define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
320#endif
321
322#ifdef OPENSSL_NO_ECDSA
323#define tlsext_sigalg_ecdsa(md) /* */
324#else
325#define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
326#endif
327
328#define tlsext_sigalg(md) \
329		tlsext_sigalg_rsa(md) \
330		tlsext_sigalg_dsa(md) \
331		tlsext_sigalg_ecdsa(md)
332
333static unsigned char tls12_sigalgs[] = {
334#ifndef OPENSSL_NO_SHA512
335	tlsext_sigalg(TLSEXT_hash_sha512)
336	tlsext_sigalg(TLSEXT_hash_sha384)
337#endif
338#ifndef OPENSSL_NO_SHA256
339	tlsext_sigalg(TLSEXT_hash_sha256)
340	tlsext_sigalg(TLSEXT_hash_sha224)
341#endif
342#ifndef OPENSSL_NO_SHA
343	tlsext_sigalg(TLSEXT_hash_sha1)
344#endif
345};
346
347int tls12_get_req_sig_algs(SSL *s, unsigned char *p)
348	{
349	size_t slen = sizeof(tls12_sigalgs);
350	if (p)
351		memcpy(p, tls12_sigalgs, slen);
352	return (int)slen;
353	}
354
355unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
356	{
357	int extdatalen=0;
358	unsigned char *ret = p;
359
360	/* don't add extensions for SSLv3 unless doing secure renegotiation */
361	if (s->client_version == SSL3_VERSION
362					&& !s->s3->send_connection_binding)
363		return p;
364
365	ret+=2;
366
367	if (ret>=limit) return NULL; /* this really never occurs, but ... */
368
369 	if (s->tlsext_hostname != NULL)
370		{
371		/* Add TLS extension servername to the Client Hello message */
372		unsigned long size_str;
373		long lenmax;
374
375		/* check for enough space.
376		   4 for the servername type and entension length
377		   2 for servernamelist length
378		   1 for the hostname type
379		   2 for hostname length
380		   + hostname length
381		*/
382
383		if ((lenmax = limit - ret - 9) < 0
384		    || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
385			return NULL;
386
387		/* extension type and length */
388		s2n(TLSEXT_TYPE_server_name,ret);
389		s2n(size_str+5,ret);
390
391		/* length of servername list */
392		s2n(size_str+3,ret);
393
394		/* hostname type, length and hostname */
395		*(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
396		s2n(size_str,ret);
397		memcpy(ret, s->tlsext_hostname, size_str);
398		ret+=size_str;
399		}
400
401        /* Add RI if renegotiating */
402        if (s->renegotiate)
403          {
404          int el;
405
406          if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
407              {
408              SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
409              return NULL;
410              }
411
412          if((limit - p - 4 - el) < 0) return NULL;
413
414          s2n(TLSEXT_TYPE_renegotiate,ret);
415          s2n(el,ret);
416
417          if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
418              {
419              SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
420              return NULL;
421              }
422
423          ret += el;
424        }
425
426#ifndef OPENSSL_NO_SRP
427	/* Add SRP username if there is one */
428	if (s->srp_ctx.login != NULL)
429		{ /* Add TLS extension SRP username to the Client Hello message */
430
431		int login_len = strlen(s->srp_ctx.login);
432		if (login_len > 255 || login_len == 0)
433			{
434			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
435			return NULL;
436			}
437
438		/* check for enough space.
439		   4 for the srp type type and entension length
440		   1 for the srp user identity
441		   + srp user identity length
442		*/
443		if ((limit - ret - 5 - login_len) < 0) return NULL;
444
445		/* fill in the extension */
446		s2n(TLSEXT_TYPE_srp,ret);
447		s2n(login_len+1,ret);
448		(*ret++) = (unsigned char) login_len;
449		memcpy(ret, s->srp_ctx.login, login_len);
450		ret+=login_len;
451		}
452#endif
453
454#ifndef OPENSSL_NO_EC
455	if (s->tlsext_ecpointformatlist != NULL &&
456	    s->version != DTLS1_VERSION)
457		{
458		/* Add TLS extension ECPointFormats to the ClientHello message */
459		long lenmax;
460
461		if ((lenmax = limit - ret - 5) < 0) return NULL;
462		if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
463		if (s->tlsext_ecpointformatlist_length > 255)
464			{
465			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
466			return NULL;
467			}
468
469		s2n(TLSEXT_TYPE_ec_point_formats,ret);
470		s2n(s->tlsext_ecpointformatlist_length + 1,ret);
471		*(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
472		memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
473		ret+=s->tlsext_ecpointformatlist_length;
474		}
475	if (s->tlsext_ellipticcurvelist != NULL &&
476	    s->version != DTLS1_VERSION)
477		{
478		/* Add TLS extension EllipticCurves to the ClientHello message */
479		long lenmax;
480
481		if ((lenmax = limit - ret - 6) < 0) return NULL;
482		if (s->tlsext_ellipticcurvelist_length > (unsigned long)lenmax) return NULL;
483		if (s->tlsext_ellipticcurvelist_length > 65532)
484			{
485			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
486			return NULL;
487			}
488
489		s2n(TLSEXT_TYPE_elliptic_curves,ret);
490		s2n(s->tlsext_ellipticcurvelist_length + 2, ret);
491
492		/* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
493		 * elliptic_curve_list, but the examples use two bytes.
494		 * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
495		 * resolves this to two bytes.
496		 */
497		s2n(s->tlsext_ellipticcurvelist_length, ret);
498		memcpy(ret, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length);
499		ret+=s->tlsext_ellipticcurvelist_length;
500		}
501#endif /* OPENSSL_NO_EC */
502
503	if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
504		{
505		int ticklen;
506		if (!s->new_session && s->session && s->session->tlsext_tick)
507			ticklen = s->session->tlsext_ticklen;
508		else if (s->session && s->tlsext_session_ticket &&
509			 s->tlsext_session_ticket->data)
510			{
511			ticklen = s->tlsext_session_ticket->length;
512			s->session->tlsext_tick = OPENSSL_malloc(ticklen);
513			if (!s->session->tlsext_tick)
514				return NULL;
515			memcpy(s->session->tlsext_tick,
516			       s->tlsext_session_ticket->data,
517			       ticklen);
518			s->session->tlsext_ticklen = ticklen;
519			}
520		else
521			ticklen = 0;
522		if (ticklen == 0 && s->tlsext_session_ticket &&
523		    s->tlsext_session_ticket->data == NULL)
524			goto skip_ext;
525		/* Check for enough room 2 for extension type, 2 for len
526 		 * rest for ticket
527  		 */
528		if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
529		s2n(TLSEXT_TYPE_session_ticket,ret);
530		s2n(ticklen,ret);
531		if (ticklen)
532			{
533			memcpy(ret, s->session->tlsext_tick, ticklen);
534			ret += ticklen;
535			}
536		}
537		skip_ext:
538
539	if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
540		{
541		if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
542			return NULL;
543		s2n(TLSEXT_TYPE_signature_algorithms,ret);
544		s2n(sizeof(tls12_sigalgs) + 2, ret);
545		s2n(sizeof(tls12_sigalgs), ret);
546		memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
547		ret += sizeof(tls12_sigalgs);
548		}
549
550#ifdef TLSEXT_TYPE_opaque_prf_input
551	if (s->s3->client_opaque_prf_input != NULL &&
552	    s->version != DTLS1_VERSION)
553		{
554		size_t col = s->s3->client_opaque_prf_input_len;
555
556		if ((long)(limit - ret - 6 - col < 0))
557			return NULL;
558		if (col > 0xFFFD) /* can't happen */
559			return NULL;
560
561		s2n(TLSEXT_TYPE_opaque_prf_input, ret);
562		s2n(col + 2, ret);
563		s2n(col, ret);
564		memcpy(ret, s->s3->client_opaque_prf_input, col);
565		ret += col;
566		}
567#endif
568
569	if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
570	    s->version != DTLS1_VERSION)
571		{
572		int i;
573		long extlen, idlen, itmp;
574		OCSP_RESPID *id;
575
576		idlen = 0;
577		for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
578			{
579			id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
580			itmp = i2d_OCSP_RESPID(id, NULL);
581			if (itmp <= 0)
582				return NULL;
583			idlen += itmp + 2;
584			}
585
586		if (s->tlsext_ocsp_exts)
587			{
588			extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
589			if (extlen < 0)
590				return NULL;
591			}
592		else
593			extlen = 0;
594
595		if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
596		s2n(TLSEXT_TYPE_status_request, ret);
597		if (extlen + idlen > 0xFFF0)
598			return NULL;
599		s2n(extlen + idlen + 5, ret);
600		*(ret++) = TLSEXT_STATUSTYPE_ocsp;
601		s2n(idlen, ret);
602		for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
603			{
604			/* save position of id len */
605			unsigned char *q = ret;
606			id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
607			/* skip over id len */
608			ret += 2;
609			itmp = i2d_OCSP_RESPID(id, &ret);
610			/* write id len */
611			s2n(itmp, q);
612			}
613		s2n(extlen, ret);
614		if (extlen > 0)
615			i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
616		}
617
618#ifndef OPENSSL_NO_HEARTBEATS
619	/* Add Heartbeat extension */
620	if ((limit - ret - 4 - 1) < 0)
621		return NULL;
622	s2n(TLSEXT_TYPE_heartbeat,ret);
623	s2n(1,ret);
624	/* Set mode:
625	 * 1: peer may send requests
626	 * 2: peer not allowed to send requests
627	 */
628	if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
629		*(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
630	else
631		*(ret++) = SSL_TLSEXT_HB_ENABLED;
632#endif
633
634#ifndef OPENSSL_NO_NEXTPROTONEG
635	if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
636		{
637		/* The client advertises an emtpy extension to indicate its
638		 * support for Next Protocol Negotiation */
639		if (limit - ret - 4 < 0)
640			return NULL;
641		s2n(TLSEXT_TYPE_next_proto_neg,ret);
642		s2n(0,ret);
643		}
644#endif
645
646#ifndef OPENSSL_NO_SRTP
647        if(SSL_get_srtp_profiles(s))
648                {
649                int el;
650
651                ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
652
653                if((limit - p - 4 - el) < 0) return NULL;
654
655                s2n(TLSEXT_TYPE_use_srtp,ret);
656                s2n(el,ret);
657
658                if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
659			{
660			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
661			return NULL;
662			}
663                ret += el;
664                }
665#endif
666	/* Add padding to workaround bugs in F5 terminators.
667	 * See https://tools.ietf.org/html/draft-agl-tls-padding-03
668	 *
669	 * NB: because this code works out the length of all existing
670	 * extensions it MUST always appear last.
671	 */
672	if (s->options & SSL_OP_TLSEXT_PADDING)
673		{
674		int hlen = ret - (unsigned char *)s->init_buf->data;
675		/* The code in s23_clnt.c to build ClientHello messages
676		 * includes the 5-byte record header in the buffer, while
677		 * the code in s3_clnt.c does not.
678		 */
679		if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
680			hlen -= 5;
681		if (hlen > 0xff && hlen < 0x200)
682			{
683			hlen = 0x200 - hlen;
684			if (hlen >= 4)
685				hlen -= 4;
686			else
687				hlen = 0;
688
689			s2n(TLSEXT_TYPE_padding, ret);
690			s2n(hlen, ret);
691			memset(ret, 0, hlen);
692			ret += hlen;
693			}
694		}
695
696	if ((extdatalen = ret-p-2)== 0)
697		return p;
698
699	s2n(extdatalen,p);
700	return ret;
701	}
702
703unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
704	{
705	int extdatalen=0;
706	unsigned char *ret = p;
707#ifndef OPENSSL_NO_NEXTPROTONEG
708	int next_proto_neg_seen;
709#endif
710
711	/* don't add extensions for SSLv3, unless doing secure renegotiation */
712	if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
713		return p;
714
715	ret+=2;
716	if (ret>=limit) return NULL; /* this really never occurs, but ... */
717
718	if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
719		{
720		if ((long)(limit - ret - 4) < 0) return NULL;
721
722		s2n(TLSEXT_TYPE_server_name,ret);
723		s2n(0,ret);
724		}
725
726	if(s->s3->send_connection_binding)
727        {
728          int el;
729
730          if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
731              {
732              SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
733              return NULL;
734              }
735
736          if((limit - p - 4 - el) < 0) return NULL;
737
738          s2n(TLSEXT_TYPE_renegotiate,ret);
739          s2n(el,ret);
740
741          if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
742              {
743              SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
744              return NULL;
745              }
746
747          ret += el;
748        }
749
750#ifndef OPENSSL_NO_EC
751	if (s->tlsext_ecpointformatlist != NULL &&
752	    s->version != DTLS1_VERSION)
753		{
754		/* Add TLS extension ECPointFormats to the ServerHello message */
755		long lenmax;
756
757		if ((lenmax = limit - ret - 5) < 0) return NULL;
758		if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
759		if (s->tlsext_ecpointformatlist_length > 255)
760			{
761			SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
762			return NULL;
763			}
764
765		s2n(TLSEXT_TYPE_ec_point_formats,ret);
766		s2n(s->tlsext_ecpointformatlist_length + 1,ret);
767		*(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
768		memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
769		ret+=s->tlsext_ecpointformatlist_length;
770
771		}
772	/* Currently the server should not respond with a SupportedCurves extension */
773#endif /* OPENSSL_NO_EC */
774
775	if (s->tlsext_ticket_expected
776		&& !(SSL_get_options(s) & SSL_OP_NO_TICKET))
777		{
778		if ((long)(limit - ret - 4) < 0) return NULL;
779		s2n(TLSEXT_TYPE_session_ticket,ret);
780		s2n(0,ret);
781		}
782
783	if (s->tlsext_status_expected)
784		{
785		if ((long)(limit - ret - 4) < 0) return NULL;
786		s2n(TLSEXT_TYPE_status_request,ret);
787		s2n(0,ret);
788		}
789
790#ifdef TLSEXT_TYPE_opaque_prf_input
791	if (s->s3->server_opaque_prf_input != NULL &&
792	    s->version != DTLS1_VERSION)
793		{
794		size_t sol = s->s3->server_opaque_prf_input_len;
795
796		if ((long)(limit - ret - 6 - sol) < 0)
797			return NULL;
798		if (sol > 0xFFFD) /* can't happen */
799			return NULL;
800
801		s2n(TLSEXT_TYPE_opaque_prf_input, ret);
802		s2n(sol + 2, ret);
803		s2n(sol, ret);
804		memcpy(ret, s->s3->server_opaque_prf_input, sol);
805		ret += sol;
806		}
807#endif
808
809#ifndef OPENSSL_NO_SRTP
810        if(s->srtp_profile)
811                {
812                int el;
813
814                ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
815
816                if((limit - p - 4 - el) < 0) return NULL;
817
818                s2n(TLSEXT_TYPE_use_srtp,ret);
819                s2n(el,ret);
820
821                if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
822			{
823			SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
824			return NULL;
825			}
826                ret+=el;
827                }
828#endif
829
830	if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81)
831		&& (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
832		{ const unsigned char cryptopro_ext[36] = {
833			0xfd, 0xe8, /*65000*/
834			0x00, 0x20, /*32 bytes length*/
835			0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
836			0x03,   0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
837			0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
838			0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
839			if (limit-ret<36) return NULL;
840			memcpy(ret,cryptopro_ext,36);
841			ret+=36;
842
843		}
844
845#ifndef OPENSSL_NO_HEARTBEATS
846	/* Add Heartbeat extension if we've received one */
847	if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
848		{
849		if ((limit - ret - 4 - 1) < 0)
850			return NULL;
851		s2n(TLSEXT_TYPE_heartbeat,ret);
852		s2n(1,ret);
853		/* Set mode:
854		 * 1: peer may send requests
855		 * 2: peer not allowed to send requests
856		 */
857		if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
858			*(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
859		else
860			*(ret++) = SSL_TLSEXT_HB_ENABLED;
861
862		}
863#endif
864
865#ifndef OPENSSL_NO_NEXTPROTONEG
866	next_proto_neg_seen = s->s3->next_proto_neg_seen;
867	s->s3->next_proto_neg_seen = 0;
868	if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
869		{
870		const unsigned char *npa;
871		unsigned int npalen;
872		int r;
873
874		r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
875		if (r == SSL_TLSEXT_ERR_OK)
876			{
877			if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
878			s2n(TLSEXT_TYPE_next_proto_neg,ret);
879			s2n(npalen,ret);
880			memcpy(ret, npa, npalen);
881			ret += npalen;
882			s->s3->next_proto_neg_seen = 1;
883			}
884		}
885#endif
886
887	if ((extdatalen = ret-p-2)== 0)
888		return p;
889
890	s2n(extdatalen,p);
891	return ret;
892	}
893
894#ifndef OPENSSL_NO_EC
895/* ssl_check_for_safari attempts to fingerprint Safari using OS X
896 * SecureTransport using the TLS extension block in |d|, of length |n|.
897 * Safari, since 10.6, sends exactly these extensions, in this order:
898 *   SNI,
899 *   elliptic_curves
900 *   ec_point_formats
901 *
902 * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
903 * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
904 * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
905 * 10.8..10.8.3 (which don't work).
906 */
907static void ssl_check_for_safari(SSL *s, const unsigned char *data, const unsigned char *d, int n) {
908	unsigned short type, size;
909	static const unsigned char kSafariExtensionsBlock[] = {
910		0x00, 0x0a,  /* elliptic_curves extension */
911		0x00, 0x08,  /* 8 bytes */
912		0x00, 0x06,  /* 6 bytes of curve ids */
913		0x00, 0x17,  /* P-256 */
914		0x00, 0x18,  /* P-384 */
915		0x00, 0x19,  /* P-521 */
916
917		0x00, 0x0b,  /* ec_point_formats */
918		0x00, 0x02,  /* 2 bytes */
919		0x01,        /* 1 point format */
920		0x00,        /* uncompressed */
921	};
922
923	/* The following is only present in TLS 1.2 */
924	static const unsigned char kSafariTLS12ExtensionsBlock[] = {
925		0x00, 0x0d,  /* signature_algorithms */
926		0x00, 0x0c,  /* 12 bytes */
927		0x00, 0x0a,  /* 10 bytes */
928		0x05, 0x01,  /* SHA-384/RSA */
929		0x04, 0x01,  /* SHA-256/RSA */
930		0x02, 0x01,  /* SHA-1/RSA */
931		0x04, 0x03,  /* SHA-256/ECDSA */
932		0x02, 0x03,  /* SHA-1/ECDSA */
933	};
934
935	if (data >= (d+n-2))
936		return;
937	data += 2;
938
939	if (data > (d+n-4))
940		return;
941	n2s(data,type);
942	n2s(data,size);
943
944	if (type != TLSEXT_TYPE_server_name)
945		return;
946
947	if (data+size > d+n)
948		return;
949	data += size;
950
951	if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
952		{
953		const size_t len1 = sizeof(kSafariExtensionsBlock);
954		const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
955
956		if (data + len1 + len2 != d+n)
957			return;
958		if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
959			return;
960		if (memcmp(data + len1, kSafariTLS12ExtensionsBlock, len2) != 0)
961			return;
962		}
963	else
964		{
965		const size_t len = sizeof(kSafariExtensionsBlock);
966
967		if (data + len != d+n)
968			return;
969		if (memcmp(data, kSafariExtensionsBlock, len) != 0)
970			return;
971		}
972
973	s->s3->is_probably_safari = 1;
974}
975#endif /* !OPENSSL_NO_EC */
976
977int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
978	{
979	unsigned short type;
980	unsigned short size;
981	unsigned short len;
982	unsigned char *data = *p;
983	int renegotiate_seen = 0;
984	int sigalg_seen = 0;
985
986	s->servername_done = 0;
987	s->tlsext_status_type = -1;
988#ifndef OPENSSL_NO_NEXTPROTONEG
989	s->s3->next_proto_neg_seen = 0;
990#endif
991
992#ifndef OPENSSL_NO_HEARTBEATS
993	s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
994	                       SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
995#endif
996
997#ifndef OPENSSL_NO_EC
998	if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
999		ssl_check_for_safari(s, data, d, n);
1000#endif /* !OPENSSL_NO_EC */
1001
1002	if (data >= (d+n-2))
1003		goto ri_check;
1004	n2s(data,len);
1005
1006	if (data > (d+n-len))
1007		goto ri_check;
1008
1009	while (data <= (d+n-4))
1010		{
1011		n2s(data,type);
1012		n2s(data,size);
1013
1014		if (data+size > (d+n))
1015	   		goto ri_check;
1016#if 0
1017		fprintf(stderr,"Received extension type %d size %d\n",type,size);
1018#endif
1019		if (s->tlsext_debug_cb)
1020			s->tlsext_debug_cb(s, 0, type, data, size,
1021						s->tlsext_debug_arg);
1022/* The servername extension is treated as follows:
1023
1024   - Only the hostname type is supported with a maximum length of 255.
1025   - The servername is rejected if too long or if it contains zeros,
1026     in which case an fatal alert is generated.
1027   - The servername field is maintained together with the session cache.
1028   - When a session is resumed, the servername call back invoked in order
1029     to allow the application to position itself to the right context.
1030   - The servername is acknowledged if it is new for a session or when
1031     it is identical to a previously used for the same session.
1032     Applications can control the behaviour.  They can at any time
1033     set a 'desirable' servername for a new SSL object. This can be the
1034     case for example with HTTPS when a Host: header field is received and
1035     a renegotiation is requested. In this case, a possible servername
1036     presented in the new client hello is only acknowledged if it matches
1037     the value of the Host: field.
1038   - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
1039     if they provide for changing an explicit servername context for the session,
1040     i.e. when the session has been established with a servername extension.
1041   - On session reconnect, the servername extension may be absent.
1042
1043*/
1044
1045		if (type == TLSEXT_TYPE_server_name)
1046			{
1047			unsigned char *sdata;
1048			int servname_type;
1049			int dsize;
1050
1051			if (size < 2)
1052				{
1053				*al = SSL_AD_DECODE_ERROR;
1054				return 0;
1055				}
1056			n2s(data,dsize);
1057			size -= 2;
1058			if (dsize > size  )
1059				{
1060				*al = SSL_AD_DECODE_ERROR;
1061				return 0;
1062				}
1063
1064			sdata = data;
1065			while (dsize > 3)
1066				{
1067	 			servname_type = *(sdata++);
1068				n2s(sdata,len);
1069				dsize -= 3;
1070
1071				if (len > dsize)
1072					{
1073					*al = SSL_AD_DECODE_ERROR;
1074					return 0;
1075					}
1076				if (s->servername_done == 0)
1077				switch (servname_type)
1078					{
1079				case TLSEXT_NAMETYPE_host_name:
1080					if (!s->hit)
1081						{
1082						if(s->session->tlsext_hostname)
1083							{
1084							*al = SSL_AD_DECODE_ERROR;
1085							return 0;
1086							}
1087						if (len > TLSEXT_MAXLEN_host_name)
1088							{
1089							*al = TLS1_AD_UNRECOGNIZED_NAME;
1090							return 0;
1091							}
1092						if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
1093							{
1094							*al = TLS1_AD_INTERNAL_ERROR;
1095							return 0;
1096							}
1097						memcpy(s->session->tlsext_hostname, sdata, len);
1098						s->session->tlsext_hostname[len]='\0';
1099						if (strlen(s->session->tlsext_hostname) != len) {
1100							OPENSSL_free(s->session->tlsext_hostname);
1101							s->session->tlsext_hostname = NULL;
1102							*al = TLS1_AD_UNRECOGNIZED_NAME;
1103							return 0;
1104						}
1105						s->servername_done = 1;
1106
1107						}
1108					else
1109						s->servername_done = s->session->tlsext_hostname
1110							&& strlen(s->session->tlsext_hostname) == len
1111							&& strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
1112
1113					break;
1114
1115				default:
1116					break;
1117					}
1118
1119				dsize -= len;
1120				}
1121			if (dsize != 0)
1122				{
1123				*al = SSL_AD_DECODE_ERROR;
1124				return 0;
1125				}
1126
1127			}
1128#ifndef OPENSSL_NO_SRP
1129		else if (type == TLSEXT_TYPE_srp)
1130			{
1131			if (size <= 0 || ((len = data[0])) != (size -1))
1132				{
1133				*al = SSL_AD_DECODE_ERROR;
1134				return 0;
1135				}
1136			if (s->srp_ctx.login != NULL)
1137				{
1138				*al = SSL_AD_DECODE_ERROR;
1139				return 0;
1140				}
1141			if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
1142				return -1;
1143			memcpy(s->srp_ctx.login, &data[1], len);
1144			s->srp_ctx.login[len]='\0';
1145
1146			if (strlen(s->srp_ctx.login) != len)
1147				{
1148				*al = SSL_AD_DECODE_ERROR;
1149				return 0;
1150				}
1151			}
1152#endif
1153
1154#ifndef OPENSSL_NO_EC
1155		else if (type == TLSEXT_TYPE_ec_point_formats &&
1156	             s->version != DTLS1_VERSION)
1157			{
1158			unsigned char *sdata = data;
1159			int ecpointformatlist_length = *(sdata++);
1160
1161			if (ecpointformatlist_length != size - 1)
1162				{
1163				*al = TLS1_AD_DECODE_ERROR;
1164				return 0;
1165				}
1166			if (!s->hit)
1167				{
1168				if(s->session->tlsext_ecpointformatlist)
1169					{
1170					OPENSSL_free(s->session->tlsext_ecpointformatlist);
1171					s->session->tlsext_ecpointformatlist = NULL;
1172					}
1173				s->session->tlsext_ecpointformatlist_length = 0;
1174				if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1175					{
1176					*al = TLS1_AD_INTERNAL_ERROR;
1177					return 0;
1178					}
1179				s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1180				memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
1181				}
1182#if 0
1183			fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
1184			sdata = s->session->tlsext_ecpointformatlist;
1185			for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1186				fprintf(stderr,"%i ",*(sdata++));
1187			fprintf(stderr,"\n");
1188#endif
1189			}
1190		else if (type == TLSEXT_TYPE_elliptic_curves &&
1191	             s->version != DTLS1_VERSION)
1192			{
1193			unsigned char *sdata = data;
1194			int ellipticcurvelist_length = (*(sdata++) << 8);
1195			ellipticcurvelist_length += (*(sdata++));
1196
1197			if (ellipticcurvelist_length != size - 2 ||
1198				ellipticcurvelist_length < 1)
1199				{
1200				*al = TLS1_AD_DECODE_ERROR;
1201				return 0;
1202				}
1203			if (!s->hit)
1204				{
1205				if(s->session->tlsext_ellipticcurvelist)
1206					{
1207					*al = TLS1_AD_DECODE_ERROR;
1208					return 0;
1209					}
1210				s->session->tlsext_ellipticcurvelist_length = 0;
1211				if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
1212					{
1213					*al = TLS1_AD_INTERNAL_ERROR;
1214					return 0;
1215					}
1216				s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
1217				memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
1218				}
1219#if 0
1220			fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
1221			sdata = s->session->tlsext_ellipticcurvelist;
1222			for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
1223				fprintf(stderr,"%i ",*(sdata++));
1224			fprintf(stderr,"\n");
1225#endif
1226			}
1227#endif /* OPENSSL_NO_EC */
1228#ifdef TLSEXT_TYPE_opaque_prf_input
1229		else if (type == TLSEXT_TYPE_opaque_prf_input &&
1230	             s->version != DTLS1_VERSION)
1231			{
1232			unsigned char *sdata = data;
1233
1234			if (size < 2)
1235				{
1236				*al = SSL_AD_DECODE_ERROR;
1237				return 0;
1238				}
1239			n2s(sdata, s->s3->client_opaque_prf_input_len);
1240			if (s->s3->client_opaque_prf_input_len != size - 2)
1241				{
1242				*al = SSL_AD_DECODE_ERROR;
1243				return 0;
1244				}
1245
1246			if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1247				OPENSSL_free(s->s3->client_opaque_prf_input);
1248			if (s->s3->client_opaque_prf_input_len == 0)
1249				s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1250			else
1251				s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
1252			if (s->s3->client_opaque_prf_input == NULL)
1253				{
1254				*al = TLS1_AD_INTERNAL_ERROR;
1255				return 0;
1256				}
1257			}
1258#endif
1259		else if (type == TLSEXT_TYPE_session_ticket)
1260			{
1261			if (s->tls_session_ticket_ext_cb &&
1262			    !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1263				{
1264				*al = TLS1_AD_INTERNAL_ERROR;
1265				return 0;
1266				}
1267			}
1268		else if (type == TLSEXT_TYPE_renegotiate)
1269			{
1270			if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1271				return 0;
1272			renegotiate_seen = 1;
1273			}
1274		else if (type == TLSEXT_TYPE_signature_algorithms)
1275			{
1276			int dsize;
1277			if (sigalg_seen || size < 2)
1278				{
1279				*al = SSL_AD_DECODE_ERROR;
1280				return 0;
1281				}
1282			sigalg_seen = 1;
1283			n2s(data,dsize);
1284			size -= 2;
1285			if (dsize != size || dsize & 1)
1286				{
1287				*al = SSL_AD_DECODE_ERROR;
1288				return 0;
1289				}
1290			if (!tls1_process_sigalgs(s, data, dsize))
1291				{
1292				*al = SSL_AD_DECODE_ERROR;
1293				return 0;
1294				}
1295			}
1296		else if (type == TLSEXT_TYPE_status_request &&
1297		         s->version != DTLS1_VERSION)
1298			{
1299
1300			if (size < 5)
1301				{
1302				*al = SSL_AD_DECODE_ERROR;
1303				return 0;
1304				}
1305
1306			s->tlsext_status_type = *data++;
1307			size--;
1308			if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1309				{
1310				const unsigned char *sdata;
1311				int dsize;
1312				/* Read in responder_id_list */
1313				n2s(data,dsize);
1314				size -= 2;
1315				if (dsize > size  )
1316					{
1317					*al = SSL_AD_DECODE_ERROR;
1318					return 0;
1319					}
1320				while (dsize > 0)
1321					{
1322					OCSP_RESPID *id;
1323					int idsize;
1324					if (dsize < 4)
1325						{
1326						*al = SSL_AD_DECODE_ERROR;
1327						return 0;
1328						}
1329					n2s(data, idsize);
1330					dsize -= 2 + idsize;
1331					size -= 2 + idsize;
1332					if (dsize < 0)
1333						{
1334						*al = SSL_AD_DECODE_ERROR;
1335						return 0;
1336						}
1337					sdata = data;
1338					data += idsize;
1339					id = d2i_OCSP_RESPID(NULL,
1340								&sdata, idsize);
1341					if (!id)
1342						{
1343						*al = SSL_AD_DECODE_ERROR;
1344						return 0;
1345						}
1346					if (data != sdata)
1347						{
1348						OCSP_RESPID_free(id);
1349						*al = SSL_AD_DECODE_ERROR;
1350						return 0;
1351						}
1352					if (!s->tlsext_ocsp_ids
1353						&& !(s->tlsext_ocsp_ids =
1354						sk_OCSP_RESPID_new_null()))
1355						{
1356						OCSP_RESPID_free(id);
1357						*al = SSL_AD_INTERNAL_ERROR;
1358						return 0;
1359						}
1360					if (!sk_OCSP_RESPID_push(
1361							s->tlsext_ocsp_ids, id))
1362						{
1363						OCSP_RESPID_free(id);
1364						*al = SSL_AD_INTERNAL_ERROR;
1365						return 0;
1366						}
1367					}
1368
1369				/* Read in request_extensions */
1370				if (size < 2)
1371					{
1372					*al = SSL_AD_DECODE_ERROR;
1373					return 0;
1374					}
1375				n2s(data,dsize);
1376				size -= 2;
1377				if (dsize != size)
1378					{
1379					*al = SSL_AD_DECODE_ERROR;
1380					return 0;
1381					}
1382				sdata = data;
1383				if (dsize > 0)
1384					{
1385					if (s->tlsext_ocsp_exts)
1386						{
1387						sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1388									   X509_EXTENSION_free);
1389						}
1390
1391					s->tlsext_ocsp_exts =
1392						d2i_X509_EXTENSIONS(NULL,
1393							&sdata, dsize);
1394					if (!s->tlsext_ocsp_exts
1395						|| (data + dsize != sdata))
1396						{
1397						*al = SSL_AD_DECODE_ERROR;
1398						return 0;
1399						}
1400					}
1401				}
1402				/* We don't know what to do with any other type
1403 			 	* so ignore it.
1404 			 	*/
1405				else
1406					s->tlsext_status_type = -1;
1407			}
1408#ifndef OPENSSL_NO_HEARTBEATS
1409		else if (type == TLSEXT_TYPE_heartbeat)
1410			{
1411			switch(data[0])
1412				{
1413				case 0x01:	/* Client allows us to send HB requests */
1414							s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1415							break;
1416				case 0x02:	/* Client doesn't accept HB requests */
1417							s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1418							s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1419							break;
1420				default:	*al = SSL_AD_ILLEGAL_PARAMETER;
1421							return 0;
1422				}
1423			}
1424#endif
1425#ifndef OPENSSL_NO_NEXTPROTONEG
1426		else if (type == TLSEXT_TYPE_next_proto_neg &&
1427			 s->s3->tmp.finish_md_len == 0)
1428			{
1429			/* We shouldn't accept this extension on a
1430			 * renegotiation.
1431			 *
1432			 * s->new_session will be set on renegotiation, but we
1433			 * probably shouldn't rely that it couldn't be set on
1434			 * the initial renegotation too in certain cases (when
1435			 * there's some other reason to disallow resuming an
1436			 * earlier session -- the current code won't be doing
1437			 * anything like that, but this might change).
1438
1439			 * A valid sign that there's been a previous handshake
1440			 * in this connection is if s->s3->tmp.finish_md_len >
1441			 * 0.  (We are talking about a check that will happen
1442			 * in the Hello protocol round, well before a new
1443			 * Finished message could have been computed.) */
1444			s->s3->next_proto_neg_seen = 1;
1445			}
1446#endif
1447
1448		/* session ticket processed earlier */
1449#ifndef OPENSSL_NO_SRTP
1450		else if (type == TLSEXT_TYPE_use_srtp)
1451			{
1452			if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
1453							      al))
1454				return 0;
1455			}
1456#endif
1457
1458		data+=size;
1459		}
1460
1461	*p = data;
1462
1463	ri_check:
1464
1465	/* Need RI if renegotiating */
1466
1467	if (!renegotiate_seen && s->renegotiate &&
1468		!(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1469		{
1470		*al = SSL_AD_HANDSHAKE_FAILURE;
1471	 	SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1472				SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1473		return 0;
1474		}
1475
1476	return 1;
1477	}
1478
1479#ifndef OPENSSL_NO_NEXTPROTONEG
1480/* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1481 * elements of zero length are allowed and the set of elements must exactly fill
1482 * the length of the block. */
1483static char ssl_next_proto_validate(unsigned char *d, unsigned len)
1484	{
1485	unsigned int off = 0;
1486
1487	while (off < len)
1488		{
1489		if (d[off] == 0)
1490			return 0;
1491		off += d[off];
1492		off++;
1493		}
1494
1495	return off == len;
1496	}
1497#endif
1498
1499int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
1500	{
1501	unsigned short length;
1502	unsigned short type;
1503	unsigned short size;
1504	unsigned char *data = *p;
1505	int tlsext_servername = 0;
1506	int renegotiate_seen = 0;
1507
1508#ifndef OPENSSL_NO_NEXTPROTONEG
1509	s->s3->next_proto_neg_seen = 0;
1510#endif
1511
1512#ifndef OPENSSL_NO_HEARTBEATS
1513	s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1514	                       SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1515#endif
1516
1517	if (data >= (d+n-2))
1518		goto ri_check;
1519
1520	n2s(data,length);
1521	if (data+length != d+n)
1522		{
1523		*al = SSL_AD_DECODE_ERROR;
1524		return 0;
1525		}
1526
1527	while(data <= (d+n-4))
1528		{
1529		n2s(data,type);
1530		n2s(data,size);
1531
1532		if (data+size > (d+n))
1533	   		goto ri_check;
1534
1535		if (s->tlsext_debug_cb)
1536			s->tlsext_debug_cb(s, 1, type, data, size,
1537						s->tlsext_debug_arg);
1538
1539		if (type == TLSEXT_TYPE_server_name)
1540			{
1541			if (s->tlsext_hostname == NULL || size > 0)
1542				{
1543				*al = TLS1_AD_UNRECOGNIZED_NAME;
1544				return 0;
1545				}
1546			tlsext_servername = 1;
1547			}
1548
1549#ifndef OPENSSL_NO_EC
1550		else if (type == TLSEXT_TYPE_ec_point_formats &&
1551	             s->version != DTLS1_VERSION)
1552			{
1553			unsigned char *sdata = data;
1554			int ecpointformatlist_length = *(sdata++);
1555
1556			if (ecpointformatlist_length != size - 1 ||
1557				ecpointformatlist_length < 1)
1558				{
1559				*al = TLS1_AD_DECODE_ERROR;
1560				return 0;
1561				}
1562			s->session->tlsext_ecpointformatlist_length = 0;
1563			if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
1564			if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1565				{
1566				*al = TLS1_AD_INTERNAL_ERROR;
1567				return 0;
1568				}
1569			s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1570			memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
1571#if 0
1572			fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1573			sdata = s->session->tlsext_ecpointformatlist;
1574			for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1575				fprintf(stderr,"%i ",*(sdata++));
1576			fprintf(stderr,"\n");
1577#endif
1578			}
1579#endif /* OPENSSL_NO_EC */
1580
1581		else if (type == TLSEXT_TYPE_session_ticket)
1582			{
1583			if (s->tls_session_ticket_ext_cb &&
1584			    !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1585				{
1586				*al = TLS1_AD_INTERNAL_ERROR;
1587				return 0;
1588				}
1589			if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1590				|| (size > 0))
1591				{
1592				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1593				return 0;
1594				}
1595			s->tlsext_ticket_expected = 1;
1596			}
1597#ifdef TLSEXT_TYPE_opaque_prf_input
1598		else if (type == TLSEXT_TYPE_opaque_prf_input &&
1599	             s->version != DTLS1_VERSION)
1600			{
1601			unsigned char *sdata = data;
1602
1603			if (size < 2)
1604				{
1605				*al = SSL_AD_DECODE_ERROR;
1606				return 0;
1607				}
1608			n2s(sdata, s->s3->server_opaque_prf_input_len);
1609			if (s->s3->server_opaque_prf_input_len != size - 2)
1610				{
1611				*al = SSL_AD_DECODE_ERROR;
1612				return 0;
1613				}
1614
1615			if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1616				OPENSSL_free(s->s3->server_opaque_prf_input);
1617			if (s->s3->server_opaque_prf_input_len == 0)
1618				s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1619			else
1620				s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1621
1622			if (s->s3->server_opaque_prf_input == NULL)
1623				{
1624				*al = TLS1_AD_INTERNAL_ERROR;
1625				return 0;
1626				}
1627			}
1628#endif
1629		else if (type == TLSEXT_TYPE_status_request &&
1630		         s->version != DTLS1_VERSION)
1631			{
1632			/* MUST be empty and only sent if we've requested
1633			 * a status request message.
1634			 */
1635			if ((s->tlsext_status_type == -1) || (size > 0))
1636				{
1637				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1638				return 0;
1639				}
1640			/* Set flag to expect CertificateStatus message */
1641			s->tlsext_status_expected = 1;
1642			}
1643#ifndef OPENSSL_NO_NEXTPROTONEG
1644		else if (type == TLSEXT_TYPE_next_proto_neg &&
1645			 s->s3->tmp.finish_md_len == 0)
1646			{
1647			unsigned char *selected;
1648			unsigned char selected_len;
1649
1650			/* We must have requested it. */
1651			if (s->ctx->next_proto_select_cb == NULL)
1652				{
1653				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1654				return 0;
1655				}
1656			/* The data must be valid */
1657			if (!ssl_next_proto_validate(data, size))
1658				{
1659				*al = TLS1_AD_DECODE_ERROR;
1660				return 0;
1661				}
1662			if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
1663				{
1664				*al = TLS1_AD_INTERNAL_ERROR;
1665				return 0;
1666				}
1667			s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1668			if (!s->next_proto_negotiated)
1669				{
1670				*al = TLS1_AD_INTERNAL_ERROR;
1671				return 0;
1672				}
1673			memcpy(s->next_proto_negotiated, selected, selected_len);
1674			s->next_proto_negotiated_len = selected_len;
1675			s->s3->next_proto_neg_seen = 1;
1676			}
1677#endif
1678		else if (type == TLSEXT_TYPE_renegotiate)
1679			{
1680			if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1681				return 0;
1682			renegotiate_seen = 1;
1683			}
1684#ifndef OPENSSL_NO_HEARTBEATS
1685		else if (type == TLSEXT_TYPE_heartbeat)
1686			{
1687			switch(data[0])
1688				{
1689				case 0x01:	/* Server allows us to send HB requests */
1690							s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1691							break;
1692				case 0x02:	/* Server doesn't accept HB requests */
1693							s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1694							s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1695							break;
1696				default:	*al = SSL_AD_ILLEGAL_PARAMETER;
1697							return 0;
1698				}
1699			}
1700#endif
1701#ifndef OPENSSL_NO_SRTP
1702		else if (type == TLSEXT_TYPE_use_srtp)
1703			{
1704                        if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
1705							      al))
1706                                return 0;
1707			}
1708#endif
1709
1710		data+=size;
1711		}
1712
1713	if (data != d+n)
1714		{
1715		*al = SSL_AD_DECODE_ERROR;
1716		return 0;
1717		}
1718
1719	if (!s->hit && tlsext_servername == 1)
1720		{
1721 		if (s->tlsext_hostname)
1722			{
1723			if (s->session->tlsext_hostname == NULL)
1724				{
1725				s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1726				if (!s->session->tlsext_hostname)
1727					{
1728					*al = SSL_AD_UNRECOGNIZED_NAME;
1729					return 0;
1730					}
1731				}
1732			else
1733				{
1734				*al = SSL_AD_DECODE_ERROR;
1735				return 0;
1736				}
1737			}
1738		}
1739
1740	*p = data;
1741
1742	ri_check:
1743
1744	/* Determine if we need to see RI. Strictly speaking if we want to
1745	 * avoid an attack we should *always* see RI even on initial server
1746	 * hello because the client doesn't see any renegotiation during an
1747	 * attack. However this would mean we could not connect to any server
1748	 * which doesn't support RI so for the immediate future tolerate RI
1749	 * absence on initial connect only.
1750	 */
1751	if (!renegotiate_seen
1752		&& !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1753		&& !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1754		{
1755		*al = SSL_AD_HANDSHAKE_FAILURE;
1756		SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1757				SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1758		return 0;
1759		}
1760
1761	return 1;
1762	}
1763
1764
1765int ssl_prepare_clienthello_tlsext(SSL *s)
1766	{
1767#ifndef OPENSSL_NO_EC
1768	/* If we are client and using an elliptic curve cryptography cipher suite, send the point formats
1769	 * and elliptic curves we support.
1770	 */
1771	int using_ecc = 0;
1772	int i;
1773	unsigned char *j;
1774	unsigned long alg_k, alg_a;
1775	STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1776
1777	for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1778		{
1779		SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1780
1781		alg_k = c->algorithm_mkey;
1782		alg_a = c->algorithm_auth;
1783		if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe) || (alg_a & SSL_aECDSA)))
1784			{
1785			using_ecc = 1;
1786			break;
1787			}
1788		}
1789	using_ecc = using_ecc && (s->version >= TLS1_VERSION);
1790	if (using_ecc)
1791		{
1792		if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1793		if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1794			{
1795			SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1796			return -1;
1797			}
1798		s->tlsext_ecpointformatlist_length = 3;
1799		s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1800		s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1801		s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1802
1803		/* we support all named elliptic curves in draft-ietf-tls-ecc-12 */
1804		if (s->tlsext_ellipticcurvelist != NULL) OPENSSL_free(s->tlsext_ellipticcurvelist);
1805		s->tlsext_ellipticcurvelist_length = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
1806		if ((s->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
1807			{
1808			s->tlsext_ellipticcurvelist_length = 0;
1809			SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1810			return -1;
1811			}
1812		for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1813				sizeof(pref_list)/sizeof(pref_list[0]); i++)
1814			{
1815			int id = tls1_ec_nid2curve_id(pref_list[i]);
1816			s2n(id,j);
1817			}
1818		}
1819#endif /* OPENSSL_NO_EC */
1820
1821#ifdef TLSEXT_TYPE_opaque_prf_input
1822 	{
1823		int r = 1;
1824
1825		if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1826			{
1827			r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1828			if (!r)
1829				return -1;
1830			}
1831
1832		if (s->tlsext_opaque_prf_input != NULL)
1833			{
1834			if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1835				OPENSSL_free(s->s3->client_opaque_prf_input);
1836
1837			if (s->tlsext_opaque_prf_input_len == 0)
1838				s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1839			else
1840				s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1841			if (s->s3->client_opaque_prf_input == NULL)
1842				{
1843				SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1844				return -1;
1845				}
1846			s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1847			}
1848
1849		if (r == 2)
1850			/* at callback's request, insist on receiving an appropriate server opaque PRF input */
1851			s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1852	}
1853#endif
1854
1855	return 1;
1856	}
1857
1858int ssl_prepare_serverhello_tlsext(SSL *s)
1859	{
1860#ifndef OPENSSL_NO_EC
1861	/* If we are server and using an ECC cipher suite, send the point formats we support
1862	 * if the client sent us an ECPointsFormat extension.  Note that the server is not
1863	 * supposed to send an EllipticCurves extension.
1864	 */
1865
1866	unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1867	unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1868	int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
1869	using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1870
1871	if (using_ecc)
1872		{
1873		if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1874		if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1875			{
1876			SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1877			return -1;
1878			}
1879		s->tlsext_ecpointformatlist_length = 3;
1880		s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1881		s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1882		s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1883		}
1884#endif /* OPENSSL_NO_EC */
1885
1886	return 1;
1887	}
1888
1889int ssl_check_clienthello_tlsext_early(SSL *s)
1890	{
1891	int ret=SSL_TLSEXT_ERR_NOACK;
1892	int al = SSL_AD_UNRECOGNIZED_NAME;
1893
1894#ifndef OPENSSL_NO_EC
1895	/* The handling of the ECPointFormats extension is done elsewhere, namely in
1896	 * ssl3_choose_cipher in s3_lib.c.
1897	 */
1898	/* The handling of the EllipticCurves extension is done elsewhere, namely in
1899	 * ssl3_choose_cipher in s3_lib.c.
1900	 */
1901#endif
1902
1903	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1904		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1905	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1906		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1907
1908#ifdef TLSEXT_TYPE_opaque_prf_input
1909 	{
1910		/* This sort of belongs into ssl_prepare_serverhello_tlsext(),
1911		 * but we might be sending an alert in response to the client hello,
1912		 * so this has to happen here in
1913		 * ssl_check_clienthello_tlsext_early(). */
1914
1915		int r = 1;
1916
1917		if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1918			{
1919			r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1920			if (!r)
1921				{
1922				ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1923				al = SSL_AD_INTERNAL_ERROR;
1924				goto err;
1925				}
1926			}
1927
1928		if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1929			OPENSSL_free(s->s3->server_opaque_prf_input);
1930		s->s3->server_opaque_prf_input = NULL;
1931
1932		if (s->tlsext_opaque_prf_input != NULL)
1933			{
1934			if (s->s3->client_opaque_prf_input != NULL &&
1935				s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
1936				{
1937				/* can only use this extension if we have a server opaque PRF input
1938				 * of the same length as the client opaque PRF input! */
1939
1940				if (s->tlsext_opaque_prf_input_len == 0)
1941					s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1942				else
1943					s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1944				if (s->s3->server_opaque_prf_input == NULL)
1945					{
1946					ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1947					al = SSL_AD_INTERNAL_ERROR;
1948					goto err;
1949					}
1950				s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1951				}
1952			}
1953
1954		if (r == 2 && s->s3->server_opaque_prf_input == NULL)
1955			{
1956			/* The callback wants to enforce use of the extension,
1957			 * but we can't do that with the client opaque PRF input;
1958			 * abort the handshake.
1959			 */
1960			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1961			al = SSL_AD_HANDSHAKE_FAILURE;
1962			}
1963	}
1964
1965 err:
1966#endif
1967	switch (ret)
1968		{
1969		case SSL_TLSEXT_ERR_ALERT_FATAL:
1970			ssl3_send_alert(s,SSL3_AL_FATAL,al);
1971			return -1;
1972
1973		case SSL_TLSEXT_ERR_ALERT_WARNING:
1974			ssl3_send_alert(s,SSL3_AL_WARNING,al);
1975			return 1;
1976
1977		case SSL_TLSEXT_ERR_NOACK:
1978			s->servername_done=0;
1979			default:
1980		return 1;
1981		}
1982	}
1983
1984int ssl_check_clienthello_tlsext_late(SSL *s)
1985	{
1986	int ret = SSL_TLSEXT_ERR_OK;
1987	int al;
1988
1989	/* If status request then ask callback what to do.
1990 	 * Note: this must be called after servername callbacks in case
1991 	 * the certificate has changed, and must be called after the cipher
1992	 * has been chosen because this may influence which certificate is sent
1993 	 */
1994	if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
1995		{
1996		int r;
1997		CERT_PKEY *certpkey;
1998		certpkey = ssl_get_server_send_pkey(s);
1999		/* If no certificate can't return certificate status */
2000		if (certpkey == NULL)
2001			{
2002			s->tlsext_status_expected = 0;
2003			return 1;
2004			}
2005		/* Set current certificate to one we will use so
2006		 * SSL_get_certificate et al can pick it up.
2007		 */
2008		s->cert->key = certpkey;
2009		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2010		switch (r)
2011			{
2012			/* We don't want to send a status request response */
2013			case SSL_TLSEXT_ERR_NOACK:
2014				s->tlsext_status_expected = 0;
2015				break;
2016			/* status request response should be sent */
2017			case SSL_TLSEXT_ERR_OK:
2018				if (s->tlsext_ocsp_resp)
2019					s->tlsext_status_expected = 1;
2020				else
2021					s->tlsext_status_expected = 0;
2022				break;
2023			/* something bad happened */
2024			case SSL_TLSEXT_ERR_ALERT_FATAL:
2025				ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2026				al = SSL_AD_INTERNAL_ERROR;
2027				goto err;
2028			}
2029		}
2030	else
2031		s->tlsext_status_expected = 0;
2032
2033 err:
2034	switch (ret)
2035		{
2036		case SSL_TLSEXT_ERR_ALERT_FATAL:
2037			ssl3_send_alert(s,SSL3_AL_FATAL,al);
2038			return -1;
2039
2040		case SSL_TLSEXT_ERR_ALERT_WARNING:
2041			ssl3_send_alert(s,SSL3_AL_WARNING,al);
2042			return 1;
2043
2044		default:
2045			return 1;
2046		}
2047	}
2048
2049int ssl_check_serverhello_tlsext(SSL *s)
2050	{
2051	int ret=SSL_TLSEXT_ERR_NOACK;
2052	int al = SSL_AD_UNRECOGNIZED_NAME;
2053
2054#ifndef OPENSSL_NO_EC
2055	/* If we are client and using an elliptic curve cryptography cipher
2056	 * suite, then if server returns an EC point formats lists extension
2057	 * it must contain uncompressed.
2058	 */
2059	unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
2060	unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
2061	if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) &&
2062	    (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) &&
2063	    ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
2064		{
2065		/* we are using an ECC cipher */
2066		size_t i;
2067		unsigned char *list;
2068		int found_uncompressed = 0;
2069		list = s->session->tlsext_ecpointformatlist;
2070		for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
2071			{
2072			if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
2073				{
2074				found_uncompressed = 1;
2075				break;
2076				}
2077			}
2078		if (!found_uncompressed)
2079			{
2080			SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
2081			return -1;
2082			}
2083		}
2084	ret = SSL_TLSEXT_ERR_OK;
2085#endif /* OPENSSL_NO_EC */
2086
2087	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2088		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
2089	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
2090		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
2091
2092#ifdef TLSEXT_TYPE_opaque_prf_input
2093	if (s->s3->server_opaque_prf_input_len > 0)
2094		{
2095		/* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
2096		 * So first verify that we really have a value from the server too. */
2097
2098		if (s->s3->server_opaque_prf_input == NULL)
2099			{
2100			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2101			al = SSL_AD_HANDSHAKE_FAILURE;
2102			}
2103
2104		/* Anytime the server *has* sent an opaque PRF input, we need to check
2105		 * that we have a client opaque PRF input of the same size. */
2106		if (s->s3->client_opaque_prf_input == NULL ||
2107		    s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
2108			{
2109			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2110			al = SSL_AD_ILLEGAL_PARAMETER;
2111			}
2112		}
2113#endif
2114
2115	/* If we've requested certificate status and we wont get one
2116 	 * tell the callback
2117 	 */
2118	if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
2119			&& s->ctx && s->ctx->tlsext_status_cb)
2120		{
2121		int r;
2122		/* Set resp to NULL, resplen to -1 so callback knows
2123 		 * there is no response.
2124 		 */
2125		if (s->tlsext_ocsp_resp)
2126			{
2127			OPENSSL_free(s->tlsext_ocsp_resp);
2128			s->tlsext_ocsp_resp = NULL;
2129			}
2130		s->tlsext_ocsp_resplen = -1;
2131		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2132		if (r == 0)
2133			{
2134			al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2135			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2136			}
2137		if (r < 0)
2138			{
2139			al = SSL_AD_INTERNAL_ERROR;
2140			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2141			}
2142		}
2143
2144	switch (ret)
2145		{
2146		case SSL_TLSEXT_ERR_ALERT_FATAL:
2147			ssl3_send_alert(s,SSL3_AL_FATAL,al);
2148			return -1;
2149
2150		case SSL_TLSEXT_ERR_ALERT_WARNING:
2151			ssl3_send_alert(s,SSL3_AL_WARNING,al);
2152			return 1;
2153
2154		case SSL_TLSEXT_ERR_NOACK:
2155			s->servername_done=0;
2156			default:
2157		return 1;
2158		}
2159	}
2160
2161/* Since the server cache lookup is done early on in the processing of the
2162 * ClientHello, and other operations depend on the result, we need to handle
2163 * any TLS session ticket extension at the same time.
2164 *
2165 *   session_id: points at the session ID in the ClientHello. This code will
2166 *       read past the end of this in order to parse out the session ticket
2167 *       extension, if any.
2168 *   len: the length of the session ID.
2169 *   limit: a pointer to the first byte after the ClientHello.
2170 *   ret: (output) on return, if a ticket was decrypted, then this is set to
2171 *       point to the resulting session.
2172 *
2173 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2174 * ciphersuite, in which case we have no use for session tickets and one will
2175 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2176 *
2177 * Returns:
2178 *   -1: fatal error, either from parsing or decrypting the ticket.
2179 *    0: no ticket was found (or was ignored, based on settings).
2180 *    1: a zero length extension was found, indicating that the client supports
2181 *       session tickets but doesn't currently have one to offer.
2182 *    2: either s->tls_session_secret_cb was set, or a ticket was offered but
2183 *       couldn't be decrypted because of a non-fatal error.
2184 *    3: a ticket was successfully decrypted and *ret was set.
2185 *
2186 * Side effects:
2187 *   Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2188 *   a new session ticket to the client because the client indicated support
2189 *   (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2190 *   a session ticket or we couldn't use the one it gave us, or if
2191 *   s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2192 *   Otherwise, s->tlsext_ticket_expected is set to 0.
2193 */
2194int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
2195			const unsigned char *limit, SSL_SESSION **ret)
2196	{
2197	/* Point after session ID in client hello */
2198	const unsigned char *p = session_id + len;
2199	unsigned short i;
2200
2201	*ret = NULL;
2202	s->tlsext_ticket_expected = 0;
2203
2204	/* If tickets disabled behave as if no ticket present
2205	 * to permit stateful resumption.
2206	 */
2207	if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2208		return 0;
2209	if ((s->version <= SSL3_VERSION) || !limit)
2210		return 0;
2211	if (p >= limit)
2212		return -1;
2213	/* Skip past DTLS cookie */
2214	if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
2215		{
2216		i = *(p++);
2217		p+= i;
2218		if (p >= limit)
2219			return -1;
2220		}
2221	/* Skip past cipher list */
2222	n2s(p, i);
2223	p+= i;
2224	if (p >= limit)
2225		return -1;
2226	/* Skip past compression algorithm list */
2227	i = *(p++);
2228	p += i;
2229	if (p > limit)
2230		return -1;
2231	/* Now at start of extensions */
2232	if ((p + 2) >= limit)
2233		return 0;
2234	n2s(p, i);
2235	while ((p + 4) <= limit)
2236		{
2237		unsigned short type, size;
2238		n2s(p, type);
2239		n2s(p, size);
2240		if (p + size > limit)
2241			return 0;
2242		if (type == TLSEXT_TYPE_session_ticket)
2243			{
2244			int r;
2245			if (size == 0)
2246				{
2247				/* The client will accept a ticket but doesn't
2248				 * currently have one. */
2249				s->tlsext_ticket_expected = 1;
2250				return 1;
2251				}
2252			if (s->tls_session_secret_cb)
2253				{
2254				/* Indicate that the ticket couldn't be
2255				 * decrypted rather than generating the session
2256				 * from ticket now, trigger abbreviated
2257				 * handshake based on external mechanism to
2258				 * calculate the master secret later. */
2259				return 2;
2260				}
2261			r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2262			switch (r)
2263				{
2264				case 2: /* ticket couldn't be decrypted */
2265					s->tlsext_ticket_expected = 1;
2266					return 2;
2267				case 3: /* ticket was decrypted */
2268					return r;
2269				case 4: /* ticket decrypted but need to renew */
2270					s->tlsext_ticket_expected = 1;
2271					return 3;
2272				default: /* fatal error */
2273					return -1;
2274				}
2275			}
2276		p += size;
2277		}
2278	return 0;
2279	}
2280
2281/* tls_decrypt_ticket attempts to decrypt a session ticket.
2282 *
2283 *   etick: points to the body of the session ticket extension.
2284 *   eticklen: the length of the session tickets extenion.
2285 *   sess_id: points at the session ID.
2286 *   sesslen: the length of the session ID.
2287 *   psess: (output) on return, if a ticket was decrypted, then this is set to
2288 *       point to the resulting session.
2289 *
2290 * Returns:
2291 *   -1: fatal error, either from parsing or decrypting the ticket.
2292 *    2: the ticket couldn't be decrypted.
2293 *    3: a ticket was successfully decrypted and *psess was set.
2294 *    4: same as 3, but the ticket needs to be renewed.
2295 */
2296static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2297				const unsigned char *sess_id, int sesslen,
2298				SSL_SESSION **psess)
2299	{
2300	SSL_SESSION *sess;
2301	unsigned char *sdec;
2302	const unsigned char *p;
2303	int slen, mlen, renew_ticket = 0;
2304	unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2305	HMAC_CTX hctx;
2306	EVP_CIPHER_CTX ctx;
2307	SSL_CTX *tctx = s->initial_ctx;
2308	/* Need at least keyname + iv + some encrypted data */
2309	if (eticklen < 48)
2310		return 2;
2311	/* Initialize session ticket encryption and HMAC contexts */
2312	HMAC_CTX_init(&hctx);
2313	EVP_CIPHER_CTX_init(&ctx);
2314	if (tctx->tlsext_ticket_key_cb)
2315		{
2316		unsigned char *nctick = (unsigned char *)etick;
2317		int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
2318							&ctx, &hctx, 0);
2319		if (rv < 0)
2320			return -1;
2321		if (rv == 0)
2322			return 2;
2323		if (rv == 2)
2324			renew_ticket = 1;
2325		}
2326	else
2327		{
2328		/* Check key name matches */
2329		if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
2330			return 2;
2331		HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
2332					tlsext_tick_md(), NULL);
2333		EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
2334				tctx->tlsext_tick_aes_key, etick + 16);
2335		}
2336	/* Attempt to process session ticket, first conduct sanity and
2337	 * integrity checks on ticket.
2338	 */
2339	mlen = HMAC_size(&hctx);
2340	if (mlen < 0)
2341		{
2342		EVP_CIPHER_CTX_cleanup(&ctx);
2343		return -1;
2344		}
2345	eticklen -= mlen;
2346	/* Check HMAC of encrypted ticket */
2347	HMAC_Update(&hctx, etick, eticklen);
2348	HMAC_Final(&hctx, tick_hmac, NULL);
2349	HMAC_CTX_cleanup(&hctx);
2350	if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
2351		return 2;
2352	/* Attempt to decrypt session data */
2353	/* Move p after IV to start of encrypted ticket, update length */
2354	p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2355	eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2356	sdec = OPENSSL_malloc(eticklen);
2357	if (!sdec)
2358		{
2359		EVP_CIPHER_CTX_cleanup(&ctx);
2360		return -1;
2361		}
2362	EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2363	if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
2364		return 2;
2365	slen += mlen;
2366	EVP_CIPHER_CTX_cleanup(&ctx);
2367	p = sdec;
2368
2369	sess = d2i_SSL_SESSION(NULL, &p, slen);
2370	OPENSSL_free(sdec);
2371	if (sess)
2372		{
2373		/* The session ID, if non-empty, is used by some clients to
2374		 * detect that the ticket has been accepted. So we copy it to
2375		 * the session structure. If it is empty set length to zero
2376		 * as required by standard.
2377		 */
2378		if (sesslen)
2379			memcpy(sess->session_id, sess_id, sesslen);
2380		sess->session_id_length = sesslen;
2381		*psess = sess;
2382		if (renew_ticket)
2383			return 4;
2384		else
2385			return 3;
2386		}
2387        ERR_clear_error();
2388	/* For session parse failure, indicate that we need to send a new
2389	 * ticket. */
2390	return 2;
2391	}
2392
2393/* Tables to translate from NIDs to TLS v1.2 ids */
2394
2395typedef struct
2396	{
2397	int nid;
2398	int id;
2399	} tls12_lookup;
2400
2401static tls12_lookup tls12_md[] = {
2402#ifndef OPENSSL_NO_MD5
2403	{NID_md5, TLSEXT_hash_md5},
2404#endif
2405#ifndef OPENSSL_NO_SHA
2406	{NID_sha1, TLSEXT_hash_sha1},
2407#endif
2408#ifndef OPENSSL_NO_SHA256
2409	{NID_sha224, TLSEXT_hash_sha224},
2410	{NID_sha256, TLSEXT_hash_sha256},
2411#endif
2412#ifndef OPENSSL_NO_SHA512
2413	{NID_sha384, TLSEXT_hash_sha384},
2414	{NID_sha512, TLSEXT_hash_sha512}
2415#endif
2416};
2417
2418static tls12_lookup tls12_sig[] = {
2419#ifndef OPENSSL_NO_RSA
2420	{EVP_PKEY_RSA, TLSEXT_signature_rsa},
2421#endif
2422#ifndef OPENSSL_NO_DSA
2423	{EVP_PKEY_DSA, TLSEXT_signature_dsa},
2424#endif
2425#ifndef OPENSSL_NO_ECDSA
2426	{EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2427#endif
2428};
2429
2430static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2431	{
2432	size_t i;
2433	for (i = 0; i < tlen; i++)
2434		{
2435		if (table[i].nid == nid)
2436			return table[i].id;
2437		}
2438	return -1;
2439	}
2440#if 0
2441static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
2442	{
2443	size_t i;
2444	for (i = 0; i < tlen; i++)
2445		{
2446		if (table[i].id == id)
2447			return table[i].nid;
2448		}
2449	return -1;
2450	}
2451#endif
2452
2453int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
2454	{
2455	int sig_id, md_id;
2456	if (!md)
2457		return 0;
2458	md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2459				sizeof(tls12_md)/sizeof(tls12_lookup));
2460	if (md_id == -1)
2461		return 0;
2462	sig_id = tls12_get_sigid(pk);
2463	if (sig_id == -1)
2464		return 0;
2465	p[0] = (unsigned char)md_id;
2466	p[1] = (unsigned char)sig_id;
2467	return 1;
2468	}
2469
2470int tls12_get_sigid(const EVP_PKEY *pk)
2471	{
2472	return tls12_find_id(pk->type, tls12_sig,
2473				sizeof(tls12_sig)/sizeof(tls12_lookup));
2474	}
2475
2476const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2477	{
2478	switch(hash_alg)
2479		{
2480#ifndef OPENSSL_NO_SHA
2481		case TLSEXT_hash_sha1:
2482		return EVP_sha1();
2483#endif
2484#ifndef OPENSSL_NO_SHA256
2485		case TLSEXT_hash_sha224:
2486		return EVP_sha224();
2487
2488		case TLSEXT_hash_sha256:
2489		return EVP_sha256();
2490#endif
2491#ifndef OPENSSL_NO_SHA512
2492		case TLSEXT_hash_sha384:
2493		return EVP_sha384();
2494
2495		case TLSEXT_hash_sha512:
2496		return EVP_sha512();
2497#endif
2498		default:
2499		return NULL;
2500
2501		}
2502	}
2503
2504/* Set preferred digest for each key type */
2505
2506int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2507	{
2508	int i, idx;
2509	const EVP_MD *md;
2510	CERT *c = s->cert;
2511	/* Extension ignored for TLS versions below 1.2 */
2512	if (TLS1_get_version(s) < TLS1_2_VERSION)
2513		return 1;
2514	/* Should never happen */
2515	if (!c)
2516		return 0;
2517
2518	c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
2519	c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
2520	c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
2521	c->pkeys[SSL_PKEY_ECC].digest = NULL;
2522
2523	for (i = 0; i < dsize; i += 2)
2524		{
2525		unsigned char hash_alg = data[i], sig_alg = data[i+1];
2526
2527		switch(sig_alg)
2528			{
2529#ifndef OPENSSL_NO_RSA
2530			case TLSEXT_signature_rsa:
2531			idx = SSL_PKEY_RSA_SIGN;
2532			break;
2533#endif
2534#ifndef OPENSSL_NO_DSA
2535			case TLSEXT_signature_dsa:
2536			idx = SSL_PKEY_DSA_SIGN;
2537			break;
2538#endif
2539#ifndef OPENSSL_NO_ECDSA
2540			case TLSEXT_signature_ecdsa:
2541			idx = SSL_PKEY_ECC;
2542			break;
2543#endif
2544			default:
2545			continue;
2546			}
2547
2548		if (c->pkeys[idx].digest == NULL)
2549			{
2550			md = tls12_get_hash(hash_alg);
2551			if (md)
2552				{
2553				c->pkeys[idx].digest = md;
2554				if (idx == SSL_PKEY_RSA_SIGN)
2555					c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
2556				}
2557			}
2558
2559		}
2560
2561
2562	/* Set any remaining keys to default values. NOTE: if alg is not
2563	 * supported it stays as NULL.
2564	 */
2565#ifndef OPENSSL_NO_DSA
2566	if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
2567		c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
2568#endif
2569#ifndef OPENSSL_NO_RSA
2570	if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
2571		{
2572		c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
2573		c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
2574		}
2575#endif
2576#ifndef OPENSSL_NO_ECDSA
2577	if (!c->pkeys[SSL_PKEY_ECC].digest)
2578		c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
2579#endif
2580	return 1;
2581	}
2582
2583#endif
2584
2585#ifndef OPENSSL_NO_HEARTBEATS
2586int
2587tls1_process_heartbeat(SSL *s)
2588	{
2589	unsigned char *p = &s->s3->rrec.data[0], *pl;
2590	unsigned short hbtype;
2591	unsigned int payload;
2592	unsigned int padding = 16; /* Use minimum padding */
2593
2594	if (s->msg_callback)
2595		s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2596			&s->s3->rrec.data[0], s->s3->rrec.length,
2597			s, s->msg_callback_arg);
2598
2599	/* Read type and payload length first */
2600	if (1 + 2 + 16 > s->s3->rrec.length)
2601		return 0; /* silently discard */
2602	hbtype = *p++;
2603	n2s(p, payload);
2604	if (1 + 2 + payload + 16 > s->s3->rrec.length)
2605		return 0; /* silently discard per RFC 6520 sec. 4 */
2606	pl = p;
2607
2608	if (hbtype == TLS1_HB_REQUEST)
2609		{
2610		unsigned char *buffer, *bp;
2611		int r;
2612
2613		/* Allocate memory for the response, size is 1 bytes
2614		 * message type, plus 2 bytes payload length, plus
2615		 * payload, plus padding
2616		 */
2617		buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2618		bp = buffer;
2619
2620		/* Enter response type, length and copy payload */
2621		*bp++ = TLS1_HB_RESPONSE;
2622		s2n(payload, bp);
2623		memcpy(bp, pl, payload);
2624		bp += payload;
2625		/* Random padding */
2626		RAND_pseudo_bytes(bp, padding);
2627
2628		r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
2629
2630		if (r >= 0 && s->msg_callback)
2631			s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2632				buffer, 3 + payload + padding,
2633				s, s->msg_callback_arg);
2634
2635		OPENSSL_free(buffer);
2636
2637		if (r < 0)
2638			return r;
2639		}
2640	else if (hbtype == TLS1_HB_RESPONSE)
2641		{
2642		unsigned int seq;
2643
2644		/* We only send sequence numbers (2 bytes unsigned int),
2645		 * and 16 random bytes, so we just try to read the
2646		 * sequence number */
2647		n2s(pl, seq);
2648
2649		if (payload == 18 && seq == s->tlsext_hb_seq)
2650			{
2651			s->tlsext_hb_seq++;
2652			s->tlsext_hb_pending = 0;
2653			}
2654		}
2655
2656	return 0;
2657	}
2658
2659int
2660tls1_heartbeat(SSL *s)
2661	{
2662	unsigned char *buf, *p;
2663	int ret;
2664	unsigned int payload = 18; /* Sequence number + random bytes */
2665	unsigned int padding = 16; /* Use minimum padding */
2666
2667	/* Only send if peer supports and accepts HB requests... */
2668	if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2669	    s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
2670		{
2671		SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2672		return -1;
2673		}
2674
2675	/* ...and there is none in flight yet... */
2676	if (s->tlsext_hb_pending)
2677		{
2678		SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
2679		return -1;
2680		}
2681
2682	/* ...and no handshake in progress. */
2683	if (SSL_in_init(s) || s->in_handshake)
2684		{
2685		SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
2686		return -1;
2687		}
2688
2689	/* Check if padding is too long, payload and padding
2690	 * must not exceed 2^14 - 3 = 16381 bytes in total.
2691	 */
2692	OPENSSL_assert(payload + padding <= 16381);
2693
2694	/* Create HeartBeat message, we just use a sequence number
2695	 * as payload to distuingish different messages and add
2696	 * some random stuff.
2697	 *  - Message Type, 1 byte
2698	 *  - Payload Length, 2 bytes (unsigned int)
2699	 *  - Payload, the sequence number (2 bytes uint)
2700	 *  - Payload, random bytes (16 bytes uint)
2701	 *  - Padding
2702	 */
2703	buf = OPENSSL_malloc(1 + 2 + payload + padding);
2704	p = buf;
2705	/* Message Type */
2706	*p++ = TLS1_HB_REQUEST;
2707	/* Payload length (18 bytes here) */
2708	s2n(payload, p);
2709	/* Sequence number */
2710	s2n(s->tlsext_hb_seq, p);
2711	/* 16 random bytes */
2712	RAND_pseudo_bytes(p, 16);
2713	p += 16;
2714	/* Random padding */
2715	RAND_pseudo_bytes(p, padding);
2716
2717	ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2718	if (ret >= 0)
2719		{
2720		if (s->msg_callback)
2721			s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2722				buf, 3 + payload + padding,
2723				s, s->msg_callback_arg);
2724
2725		s->tlsext_hb_pending = 1;
2726		}
2727
2728	OPENSSL_free(buf);
2729
2730	return ret;
2731	}
2732#endif
2733