xref: /openbsd-src/lib/libssl/t1_lib.c (revision 0b7734b3d77bb9b21afec6f4621cae6c805dbd45)
1 /* $OpenBSD: t1_lib.c,v 1.87 2016/05/30 13:42:54 beck Exp $ */
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 
114 #include <openssl/evp.h>
115 #include <openssl/hmac.h>
116 #include <openssl/objects.h>
117 #include <openssl/ocsp.h>
118 
119 #include "ssl_locl.h"
120 #include "bytestring.h"
121 
122 static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
123     const unsigned char *sess_id, int sesslen,
124     SSL_SESSION **psess);
125 
126 SSL3_ENC_METHOD TLSv1_enc_data = {
127 	.enc = tls1_enc,
128 	.mac = tls1_mac,
129 	.setup_key_block = tls1_setup_key_block,
130 	.generate_master_secret = tls1_generate_master_secret,
131 	.change_cipher_state = tls1_change_cipher_state,
132 	.final_finish_mac = tls1_final_finish_mac,
133 	.finish_mac_length = TLS1_FINISH_MAC_LENGTH,
134 	.cert_verify_mac = tls1_cert_verify_mac,
135 	.client_finished_label = TLS_MD_CLIENT_FINISH_CONST,
136 	.client_finished_label_len = TLS_MD_CLIENT_FINISH_CONST_SIZE,
137 	.server_finished_label = TLS_MD_SERVER_FINISH_CONST,
138 	.server_finished_label_len = TLS_MD_SERVER_FINISH_CONST_SIZE,
139 	.alert_value = tls1_alert_code,
140 	.export_keying_material = tls1_export_keying_material,
141 	.enc_flags = 0,
142 };
143 
144 SSL3_ENC_METHOD TLSv1_1_enc_data = {
145 	.enc = tls1_enc,
146 	.mac = tls1_mac,
147 	.setup_key_block = tls1_setup_key_block,
148 	.generate_master_secret = tls1_generate_master_secret,
149 	.change_cipher_state = tls1_change_cipher_state,
150 	.final_finish_mac = tls1_final_finish_mac,
151 	.finish_mac_length = TLS1_FINISH_MAC_LENGTH,
152 	.cert_verify_mac = tls1_cert_verify_mac,
153 	.client_finished_label = TLS_MD_CLIENT_FINISH_CONST,
154 	.client_finished_label_len = TLS_MD_CLIENT_FINISH_CONST_SIZE,
155 	.server_finished_label = TLS_MD_SERVER_FINISH_CONST,
156 	.server_finished_label_len = TLS_MD_SERVER_FINISH_CONST_SIZE,
157 	.alert_value = tls1_alert_code,
158 	.export_keying_material = tls1_export_keying_material,
159 	.enc_flags = SSL_ENC_FLAG_EXPLICIT_IV,
160 };
161 
162 SSL3_ENC_METHOD TLSv1_2_enc_data = {
163 	.enc = tls1_enc,
164 	.mac = tls1_mac,
165 	.setup_key_block = tls1_setup_key_block,
166 	.generate_master_secret = tls1_generate_master_secret,
167 	.change_cipher_state = tls1_change_cipher_state,
168 	.final_finish_mac = tls1_final_finish_mac,
169 	.finish_mac_length = TLS1_FINISH_MAC_LENGTH,
170 	.cert_verify_mac = tls1_cert_verify_mac,
171 	.client_finished_label = TLS_MD_CLIENT_FINISH_CONST,
172 	.client_finished_label_len = TLS_MD_CLIENT_FINISH_CONST_SIZE,
173 	.server_finished_label = TLS_MD_SERVER_FINISH_CONST,
174 	.server_finished_label_len = TLS_MD_SERVER_FINISH_CONST_SIZE,
175 	.alert_value = tls1_alert_code,
176 	.export_keying_material = tls1_export_keying_material,
177 	.enc_flags = SSL_ENC_FLAG_EXPLICIT_IV|SSL_ENC_FLAG_SIGALGS|
178 	    SSL_ENC_FLAG_SHA256_PRF|SSL_ENC_FLAG_TLS1_2_CIPHERS,
179 };
180 
181 long
182 tls1_default_timeout(void)
183 {
184 	/* 2 hours, the 24 hours mentioned in the TLSv1 spec
185 	 * is way too long for http, the cache would over fill */
186 	return (60 * 60 * 2);
187 }
188 
189 int
190 tls1_new(SSL *s)
191 {
192 	if (!ssl3_new(s))
193 		return (0);
194 	s->method->ssl_clear(s);
195 	return (1);
196 }
197 
198 void
199 tls1_free(SSL *s)
200 {
201 	if (s == NULL)
202 		return;
203 
204 	free(s->tlsext_session_ticket);
205 	ssl3_free(s);
206 }
207 
208 void
209 tls1_clear(SSL *s)
210 {
211 	ssl3_clear(s);
212 	s->version = s->method->version;
213 }
214 
215 
216 static int nid_list[] = {
217 	NID_sect163k1,		/* sect163k1 (1) */
218 	NID_sect163r1,		/* sect163r1 (2) */
219 	NID_sect163r2,		/* sect163r2 (3) */
220 	NID_sect193r1,		/* sect193r1 (4) */
221 	NID_sect193r2,		/* sect193r2 (5) */
222 	NID_sect233k1,		/* sect233k1 (6) */
223 	NID_sect233r1,		/* sect233r1 (7) */
224 	NID_sect239k1,		/* sect239k1 (8) */
225 	NID_sect283k1,		/* sect283k1 (9) */
226 	NID_sect283r1,		/* sect283r1 (10) */
227 	NID_sect409k1,		/* sect409k1 (11) */
228 	NID_sect409r1,		/* sect409r1 (12) */
229 	NID_sect571k1,		/* sect571k1 (13) */
230 	NID_sect571r1,		/* sect571r1 (14) */
231 	NID_secp160k1,		/* secp160k1 (15) */
232 	NID_secp160r1,		/* secp160r1 (16) */
233 	NID_secp160r2,		/* secp160r2 (17) */
234 	NID_secp192k1,		/* secp192k1 (18) */
235 	NID_X9_62_prime192v1,	/* secp192r1 (19) */
236 	NID_secp224k1,		/* secp224k1 (20) */
237 	NID_secp224r1,		/* secp224r1 (21) */
238 	NID_secp256k1,		/* secp256k1 (22) */
239 	NID_X9_62_prime256v1,	/* secp256r1 (23) */
240 	NID_secp384r1,		/* secp384r1 (24) */
241 	NID_secp521r1,		/* secp521r1 (25) */
242 	NID_brainpoolP256r1,	/* brainpoolP256r1 (26) */
243 	NID_brainpoolP384r1,	/* brainpoolP384r1 (27) */
244 	NID_brainpoolP512r1	/* brainpoolP512r1 (28) */
245 };
246 
247 static const uint8_t ecformats_default[] = {
248 	TLSEXT_ECPOINTFORMAT_uncompressed,
249 	TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime,
250 	TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2
251 };
252 
253 static const uint16_t eccurves_default[] = {
254 	14,			/* sect571r1 (14) */
255 	13,			/* sect571k1 (13) */
256 	25,			/* secp521r1 (25) */
257 	28,			/* brainpool512r1 (28) */
258 	11,			/* sect409k1 (11) */
259 	12,			/* sect409r1 (12) */
260 	27,			/* brainpoolP384r1 (27) */
261 	24,			/* secp384r1 (24) */
262 	9,			/* sect283k1 (9) */
263 	10,			/* sect283r1 (10) */
264 	26,			/* brainpoolP256r1 (26) */
265 	22,			/* secp256k1 (22) */
266 	23,			/* secp256r1 (23) */
267 	8,			/* sect239k1 (8) */
268 	6,			/* sect233k1 (6) */
269 	7,			/* sect233r1 (7) */
270 	20,			/* secp224k1 (20) */
271 	21,			/* secp224r1 (21) */
272 	4,			/* sect193r1 (4) */
273 	5,			/* sect193r2 (5) */
274 	18,			/* secp192k1 (18) */
275 	19,			/* secp192r1 (19) */
276 	1,			/* sect163k1 (1) */
277 	2,			/* sect163r1 (2) */
278 	3,			/* sect163r2 (3) */
279 	15,			/* secp160k1 (15) */
280 	16,			/* secp160r1 (16) */
281 	17,			/* secp160r2 (17) */
282 };
283 
284 int
285 tls1_ec_curve_id2nid(uint16_t curve_id)
286 {
287 	/* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
288 	if ((curve_id < 1) ||
289 	    ((unsigned int)curve_id > sizeof(nid_list) / sizeof(nid_list[0])))
290 		return 0;
291 	return nid_list[curve_id - 1];
292 }
293 
294 uint16_t
295 tls1_ec_nid2curve_id(int nid)
296 {
297 	/* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
298 	switch (nid) {
299 	case NID_sect163k1: /* sect163k1 (1) */
300 		return 1;
301 	case NID_sect163r1: /* sect163r1 (2) */
302 		return 2;
303 	case NID_sect163r2: /* sect163r2 (3) */
304 		return 3;
305 	case NID_sect193r1: /* sect193r1 (4) */
306 		return 4;
307 	case NID_sect193r2: /* sect193r2 (5) */
308 		return 5;
309 	case NID_sect233k1: /* sect233k1 (6) */
310 		return 6;
311 	case NID_sect233r1: /* sect233r1 (7) */
312 		return 7;
313 	case NID_sect239k1: /* sect239k1 (8) */
314 		return 8;
315 	case NID_sect283k1: /* sect283k1 (9) */
316 		return 9;
317 	case NID_sect283r1: /* sect283r1 (10) */
318 		return 10;
319 	case NID_sect409k1: /* sect409k1 (11) */
320 		return 11;
321 	case NID_sect409r1: /* sect409r1 (12) */
322 		return 12;
323 	case NID_sect571k1: /* sect571k1 (13) */
324 		return 13;
325 	case NID_sect571r1: /* sect571r1 (14) */
326 		return 14;
327 	case NID_secp160k1: /* secp160k1 (15) */
328 		return 15;
329 	case NID_secp160r1: /* secp160r1 (16) */
330 		return 16;
331 	case NID_secp160r2: /* secp160r2 (17) */
332 		return 17;
333 	case NID_secp192k1: /* secp192k1 (18) */
334 		return 18;
335 	case NID_X9_62_prime192v1: /* secp192r1 (19) */
336 		return 19;
337 	case NID_secp224k1: /* secp224k1 (20) */
338 		return 20;
339 	case NID_secp224r1: /* secp224r1 (21) */
340 		return 21;
341 	case NID_secp256k1: /* secp256k1 (22) */
342 		return 22;
343 	case NID_X9_62_prime256v1: /* secp256r1 (23) */
344 		return 23;
345 	case NID_secp384r1: /* secp384r1 (24) */
346 		return 24;
347 	case NID_secp521r1: /* secp521r1 (25) */
348 		return 25;
349 	case NID_brainpoolP256r1: /* brainpoolP256r1 (26) */
350 		return 26;
351 	case NID_brainpoolP384r1: /* brainpoolP384r1 (27) */
352 		return 27;
353 	case NID_brainpoolP512r1: /* brainpoolP512r1 (28) */
354 		return 28;
355 	default:
356 		return 0;
357 	}
358 }
359 
360 /*
361  * Return the appropriate format list. If client_formats is non-zero, return
362  * the client/session formats. Otherwise return the custom format list if one
363  * exists, or the default formats if a custom list has not been specified.
364  */
365 static void
366 tls1_get_formatlist(SSL *s, int client_formats, const uint8_t **pformats,
367     size_t *pformatslen)
368 {
369 	if (client_formats != 0) {
370 		*pformats = s->session->tlsext_ecpointformatlist;
371 		*pformatslen = s->session->tlsext_ecpointformatlist_length;
372 		return;
373 	}
374 
375 	*pformats = s->tlsext_ecpointformatlist;
376 	*pformatslen = s->tlsext_ecpointformatlist_length;
377 	if (*pformats == NULL) {
378 		*pformats = ecformats_default;
379 		*pformatslen = sizeof(ecformats_default);
380 	}
381 }
382 
383 /*
384  * Return the appropriate curve list. If client_curves is non-zero, return
385  * the client/session curves. Otherwise return the custom curve list if one
386  * exists, or the default curves if a custom list has not been specified.
387  */
388 static void
389 tls1_get_curvelist(SSL *s, int client_curves, const uint16_t **pcurves,
390     size_t *pcurveslen)
391 {
392 	if (client_curves != 0) {
393 		*pcurves = s->session->tlsext_ellipticcurvelist;
394 		*pcurveslen = s->session->tlsext_ellipticcurvelist_length;
395 		return;
396 	}
397 
398 	*pcurves = s->tlsext_ellipticcurvelist;
399 	*pcurveslen = s->tlsext_ellipticcurvelist_length;
400 	if (*pcurves == NULL) {
401 		*pcurves = eccurves_default;
402 		*pcurveslen = sizeof(eccurves_default) / 2;
403 	}
404 }
405 
406 /* Check that a curve is one of our preferences. */
407 int
408 tls1_check_curve(SSL *s, const unsigned char *p, size_t len)
409 {
410 	CBS cbs;
411 	const uint16_t *curves;
412 	size_t curveslen, i;
413 	uint8_t type;
414 	uint16_t cid;
415 
416 	CBS_init(&cbs, p, len);
417 
418 	/* Only named curves are supported. */
419 	if (CBS_len(&cbs) != 3 ||
420 	    !CBS_get_u8(&cbs, &type) ||
421 	    type != NAMED_CURVE_TYPE ||
422 	    !CBS_get_u16(&cbs, &cid))
423 		return (0);
424 
425 	tls1_get_curvelist(s, 0, &curves, &curveslen);
426 
427 	for (i = 0; i < curveslen; i++) {
428 		if (curves[i] == cid)
429 			return (1);
430 	}
431 	return (0);
432 }
433 
434 int
435 tls1_get_shared_curve(SSL *s)
436 {
437 	size_t preflen, supplen, i, j;
438 	const uint16_t *pref, *supp;
439 	unsigned long server_pref;
440 
441 	/* Cannot do anything on the client side. */
442 	if (s->server == 0)
443 		return (NID_undef);
444 
445 	/* Return first preference shared curve. */
446 	server_pref = (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE);
447 	tls1_get_curvelist(s, (server_pref == 0), &pref, &preflen);
448 	tls1_get_curvelist(s, (server_pref != 0), &supp, &supplen);
449 
450 	for (i = 0; i < preflen; i++) {
451 		for (j = 0; j < supplen; j++) {
452 			if (pref[i] == supp[j])
453 				return (tls1_ec_curve_id2nid(pref[i]));
454 		}
455 	}
456 	return (NID_undef);
457 }
458 
459 /* For an EC key set TLS ID and required compression based on parameters. */
460 static int
461 tls1_set_ec_id(uint16_t *curve_id, uint8_t *comp_id, EC_KEY *ec)
462 {
463 	const EC_GROUP *grp;
464 	const EC_METHOD *meth;
465 	int is_prime = 0;
466 	int nid, id;
467 
468 	if (ec == NULL)
469 		return (0);
470 
471 	/* Determine if it is a prime field. */
472 	if ((grp = EC_KEY_get0_group(ec)) == NULL)
473 		return (0);
474 	if ((meth = EC_GROUP_method_of(grp)) == NULL)
475 		return (0);
476 	if (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field)
477 		is_prime = 1;
478 
479 	/* Determine curve ID. */
480 	nid = EC_GROUP_get_curve_name(grp);
481 	id = tls1_ec_nid2curve_id(nid);
482 
483 	/* If we have an ID set it, otherwise set arbitrary explicit curve. */
484 	if (id != 0)
485 		*curve_id = id;
486 	else
487 		*curve_id = is_prime ? 0xff01 : 0xff02;
488 
489 	/* Specify the compression identifier. */
490 	if (comp_id != NULL) {
491 		if (EC_KEY_get0_public_key(ec) == NULL)
492 			return (0);
493 
494 		if (EC_KEY_get_conv_form(ec) == POINT_CONVERSION_COMPRESSED) {
495 			*comp_id = is_prime ?
496 			    TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime :
497 			    TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
498 		} else {
499 			*comp_id = TLSEXT_ECPOINTFORMAT_uncompressed;
500 		}
501 	}
502 	return (1);
503 }
504 
505 /* Check that an EC key is compatible with extensions. */
506 static int
507 tls1_check_ec_key(SSL *s, const uint16_t *curve_id, const uint8_t *comp_id)
508 {
509 	size_t curveslen, formatslen, i;
510 	const uint16_t *curves;
511 	const uint8_t *formats;
512 
513 	/*
514 	 * Check point formats extension if present, otherwise everything
515 	 * is supported (see RFC4492).
516 	 */
517 	tls1_get_formatlist(s, 1, &formats, &formatslen);
518 	if (comp_id != NULL && formats != NULL) {
519 		for (i = 0; i < formatslen; i++) {
520 			if (formats[i] == *comp_id)
521 				break;
522 		}
523 		if (i == formatslen)
524 			return (0);
525 	}
526 
527 	/*
528 	 * Check curve list if present, otherwise everything is supported.
529 	 */
530 	tls1_get_curvelist(s, 1, &curves, &curveslen);
531 	if (curve_id != NULL && curves != NULL) {
532 		for (i = 0; i < curveslen; i++) {
533 			if (curves[i] == *curve_id)
534 				break;
535 		}
536 		if (i == curveslen)
537 			return (0);
538 	}
539 
540 	return (1);
541 }
542 
543 /* Check EC server key is compatible with client extensions. */
544 int
545 tls1_check_ec_server_key(SSL *s)
546 {
547 	CERT_PKEY *cpk = s->cert->pkeys + SSL_PKEY_ECC;
548 	uint16_t curve_id;
549 	uint8_t comp_id;
550 	EVP_PKEY *pkey;
551 	int rv;
552 
553 	if (cpk->x509 == NULL || cpk->privatekey == NULL)
554 		return (0);
555 	if ((pkey = X509_get_pubkey(cpk->x509)) == NULL)
556 		return (0);
557 	rv = tls1_set_ec_id(&curve_id, &comp_id, pkey->pkey.ec);
558 	EVP_PKEY_free(pkey);
559 	if (rv != 1)
560 		return (0);
561 
562 	return tls1_check_ec_key(s, &curve_id, &comp_id);
563 }
564 
565 /* Check EC temporary key is compatible with client extensions. */
566 int
567 tls1_check_ec_tmp_key(SSL *s)
568 {
569 	EC_KEY *ec = s->cert->ecdh_tmp;
570 	uint16_t curve_id;
571 
572 	if (s->cert->ecdh_tmp_auto != 0) {
573 		/* Need a shared curve. */
574 		if (tls1_get_shared_curve(s) != NID_undef)
575 			return (1);
576 		return (0);
577 	}
578 
579 	if (ec == NULL) {
580 		if (s->cert->ecdh_tmp_cb != NULL)
581 			return (1);
582 		return (0);
583 	}
584 	if (tls1_set_ec_id(&curve_id, NULL, ec) != 1)
585 		return (0);
586 
587 	return tls1_check_ec_key(s, &curve_id, NULL);
588 }
589 
590 /*
591  * List of supported signature algorithms and hashes. Should make this
592  * customisable at some point, for now include everything we support.
593  */
594 
595 static unsigned char tls12_sigalgs[] = {
596 	TLSEXT_hash_sha512, TLSEXT_signature_rsa,
597 	TLSEXT_hash_sha512, TLSEXT_signature_dsa,
598 	TLSEXT_hash_sha512, TLSEXT_signature_ecdsa,
599 #ifndef OPENSSL_NO_GOST
600 	TLSEXT_hash_streebog_512, TLSEXT_signature_gostr12_512,
601 #endif
602 
603 	TLSEXT_hash_sha384, TLSEXT_signature_rsa,
604 	TLSEXT_hash_sha384, TLSEXT_signature_dsa,
605 	TLSEXT_hash_sha384, TLSEXT_signature_ecdsa,
606 
607 	TLSEXT_hash_sha256, TLSEXT_signature_rsa,
608 	TLSEXT_hash_sha256, TLSEXT_signature_dsa,
609 	TLSEXT_hash_sha256, TLSEXT_signature_ecdsa,
610 
611 #ifndef OPENSSL_NO_GOST
612 	TLSEXT_hash_streebog_256, TLSEXT_signature_gostr12_256,
613 	TLSEXT_hash_gost94, TLSEXT_signature_gostr01,
614 #endif
615 
616 	TLSEXT_hash_sha224, TLSEXT_signature_rsa,
617 	TLSEXT_hash_sha224, TLSEXT_signature_dsa,
618 	TLSEXT_hash_sha224, TLSEXT_signature_ecdsa,
619 
620 	TLSEXT_hash_sha1, TLSEXT_signature_rsa,
621 	TLSEXT_hash_sha1, TLSEXT_signature_dsa,
622 	TLSEXT_hash_sha1, TLSEXT_signature_ecdsa,
623 };
624 
625 int
626 tls12_get_req_sig_algs(SSL *s, unsigned char *p)
627 {
628 	size_t slen = sizeof(tls12_sigalgs);
629 
630 	if (p)
631 		memcpy(p, tls12_sigalgs, slen);
632 	return (int)slen;
633 }
634 
635 unsigned char *
636 ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
637 {
638 	int extdatalen = 0;
639 	unsigned char *ret = p;
640 	int using_ecc = 0;
641 
642 	/* See if we support any ECC ciphersuites. */
643 	if (s->version != DTLS1_VERSION && s->version >= TLS1_VERSION) {
644 		STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
645 		unsigned long alg_k, alg_a;
646 		int i;
647 
648 		for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++) {
649 			SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
650 
651 			alg_k = c->algorithm_mkey;
652 			alg_a = c->algorithm_auth;
653 
654 			if ((alg_k & (SSL_kECDHE|SSL_kECDHr|SSL_kECDHe) ||
655 			    (alg_a & SSL_aECDSA))) {
656 				using_ecc = 1;
657 				break;
658 			}
659 		}
660 	}
661 
662 	ret += 2;
663 
664 	if (ret >= limit)
665 		return NULL; /* this really never occurs, but ... */
666 
667 	if (s->tlsext_hostname != NULL) {
668 		/* Add TLS extension servername to the Client Hello message */
669 		size_t size_str, lenmax;
670 
671 		/* check for enough space.
672 		   4 for the servername type and extension length
673 		   2 for servernamelist length
674 		   1 for the hostname type
675 		   2 for hostname length
676 		   + hostname length
677 		*/
678 
679 		if ((size_t)(limit - ret) < 9)
680 			return NULL;
681 
682 		lenmax = limit - ret - 9;
683 		if ((size_str = strlen(s->tlsext_hostname)) > lenmax)
684 			return NULL;
685 
686 		/* extension type and length */
687 		s2n(TLSEXT_TYPE_server_name, ret);
688 
689 		s2n(size_str + 5, ret);
690 
691 		/* length of servername list */
692 		s2n(size_str + 3, ret);
693 
694 		/* hostname type, length and hostname */
695 		*(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
696 		s2n(size_str, ret);
697 		memcpy(ret, s->tlsext_hostname, size_str);
698 		ret += size_str;
699 	}
700 
701 	/* Add RI if renegotiating */
702 	if (s->renegotiate) {
703 		int el;
704 
705 		if (!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0)) {
706 			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
707 			    ERR_R_INTERNAL_ERROR);
708 			return NULL;
709 		}
710 
711 		if ((size_t)(limit - ret) < 4 + el)
712 			return NULL;
713 
714 		s2n(TLSEXT_TYPE_renegotiate, ret);
715 		s2n(el, ret);
716 
717 		if (!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el)) {
718 			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
719 			    ERR_R_INTERNAL_ERROR);
720 			return NULL;
721 		}
722 
723 		ret += el;
724 	}
725 
726 	if (using_ecc) {
727 		size_t curveslen, formatslen, lenmax;
728 		const uint16_t *curves;
729 		const uint8_t *formats;
730 		int i;
731 
732 		/*
733 		 * Add TLS extension ECPointFormats to the ClientHello message.
734 		 */
735 		tls1_get_formatlist(s, 0, &formats, &formatslen);
736 
737 		if ((size_t)(limit - ret) < 5)
738 			return NULL;
739 
740 		lenmax = limit - ret - 5;
741 		if (formatslen > lenmax)
742 			return NULL;
743 		if (formatslen > 255) {
744 			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
745 			    ERR_R_INTERNAL_ERROR);
746 			return NULL;
747 		}
748 
749 		s2n(TLSEXT_TYPE_ec_point_formats, ret);
750 		s2n(formatslen + 1, ret);
751 		*(ret++) = (unsigned char)formatslen;
752 		memcpy(ret, formats, formatslen);
753 		ret += formatslen;
754 
755 		/*
756 		 * Add TLS extension EllipticCurves to the ClientHello message.
757 		 */
758 		tls1_get_curvelist(s, 0, &curves, &curveslen);
759 
760 		if ((size_t)(limit - ret) < 6)
761 			return NULL;
762 
763 		lenmax = limit - ret - 6;
764 		if (curveslen > lenmax)
765 			return NULL;
766 		if (curveslen > 65532) {
767 			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
768 			    ERR_R_INTERNAL_ERROR);
769 			return NULL;
770 		}
771 
772 		s2n(TLSEXT_TYPE_elliptic_curves, ret);
773 		s2n((curveslen * 2) + 2, ret);
774 
775 		/* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
776 		 * elliptic_curve_list, but the examples use two bytes.
777 		 * https://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
778 		 * resolves this to two bytes.
779 		 */
780 		s2n(curveslen * 2, ret);
781 		for (i = 0; i < curveslen; i++)
782 			s2n(curves[i], ret);
783 	}
784 
785 	if (!(SSL_get_options(s) & SSL_OP_NO_TICKET)) {
786 		int ticklen;
787 		if (!s->new_session && s->session && s->session->tlsext_tick)
788 			ticklen = s->session->tlsext_ticklen;
789 		else if (s->session && s->tlsext_session_ticket &&
790 		    s->tlsext_session_ticket->data) {
791 			ticklen = s->tlsext_session_ticket->length;
792 			s->session->tlsext_tick = malloc(ticklen);
793 			if (!s->session->tlsext_tick)
794 				return NULL;
795 			memcpy(s->session->tlsext_tick,
796 			    s->tlsext_session_ticket->data, ticklen);
797 			s->session->tlsext_ticklen = ticklen;
798 		} else
799 			ticklen = 0;
800 		if (ticklen == 0 && s->tlsext_session_ticket &&
801 		    s->tlsext_session_ticket->data == NULL)
802 			goto skip_ext;
803 		/* Check for enough room 2 for extension type, 2 for len
804  		 * rest for ticket
805   		 */
806 		if ((size_t)(limit - ret) < 4 + ticklen)
807 			return NULL;
808 		s2n(TLSEXT_TYPE_session_ticket, ret);
809 
810 		s2n(ticklen, ret);
811 		if (ticklen) {
812 			memcpy(ret, s->session->tlsext_tick, ticklen);
813 			ret += ticklen;
814 		}
815 	}
816 skip_ext:
817 
818 	if (TLS1_get_client_version(s) >= TLS1_2_VERSION) {
819 		if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
820 			return NULL;
821 
822 		s2n(TLSEXT_TYPE_signature_algorithms, ret);
823 		s2n(sizeof(tls12_sigalgs) + 2, ret);
824 		s2n(sizeof(tls12_sigalgs), ret);
825 		memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
826 		ret += sizeof(tls12_sigalgs);
827 	}
828 
829 	if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
830 	    s->version != DTLS1_VERSION) {
831 		int i;
832 		long extlen, idlen, itmp;
833 		OCSP_RESPID *id;
834 
835 		idlen = 0;
836 		for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) {
837 			id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
838 			itmp = i2d_OCSP_RESPID(id, NULL);
839 			if (itmp <= 0)
840 				return NULL;
841 			idlen += itmp + 2;
842 		}
843 
844 		if (s->tlsext_ocsp_exts) {
845 			extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
846 			if (extlen < 0)
847 				return NULL;
848 		} else
849 			extlen = 0;
850 
851 		if ((size_t)(limit - ret) < 7 + extlen + idlen)
852 			return NULL;
853 		s2n(TLSEXT_TYPE_status_request, ret);
854 		if (extlen + idlen > 0xFFF0)
855 			return NULL;
856 		s2n(extlen + idlen + 5, ret);
857 		*(ret++) = TLSEXT_STATUSTYPE_ocsp;
858 		s2n(idlen, ret);
859 		for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) {
860 			/* save position of id len */
861 			unsigned char *q = ret;
862 			id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
863 			/* skip over id len */
864 			ret += 2;
865 			itmp = i2d_OCSP_RESPID(id, &ret);
866 			/* write id len */
867 			s2n(itmp, q);
868 		}
869 		s2n(extlen, ret);
870 		if (extlen > 0)
871 			i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
872 	}
873 
874 	if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len) {
875 		/* The client advertises an emtpy extension to indicate its
876 		 * support for Next Protocol Negotiation */
877 		if ((size_t)(limit - ret) < 4)
878 			return NULL;
879 		s2n(TLSEXT_TYPE_next_proto_neg, ret);
880 		s2n(0, ret);
881 	}
882 
883 	if (s->alpn_client_proto_list != NULL &&
884 	    s->s3->tmp.finish_md_len == 0) {
885 		if ((size_t)(limit - ret) < 6 + s->alpn_client_proto_list_len)
886 			return (NULL);
887 		s2n(TLSEXT_TYPE_application_layer_protocol_negotiation, ret);
888 		s2n(2 + s->alpn_client_proto_list_len, ret);
889 		s2n(s->alpn_client_proto_list_len, ret);
890 		memcpy(ret, s->alpn_client_proto_list,
891 		    s->alpn_client_proto_list_len);
892 		ret += s->alpn_client_proto_list_len;
893 	}
894 
895 #ifndef OPENSSL_NO_SRTP
896 	if (SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s)) {
897 		int el;
898 
899 		ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
900 
901 		if ((size_t)(limit - ret) < 4 + el)
902 			return NULL;
903 
904 		s2n(TLSEXT_TYPE_use_srtp, ret);
905 		s2n(el, ret);
906 
907 		if (ssl_add_clienthello_use_srtp_ext(s, ret, &el, el)) {
908 			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
909 			    ERR_R_INTERNAL_ERROR);
910 			return NULL;
911 		}
912 		ret += el;
913 	}
914 #endif
915 
916 	/*
917 	 * Add padding to workaround bugs in F5 terminators.
918 	 * See https://tools.ietf.org/html/draft-agl-tls-padding-03
919 	 *
920 	 * Note that this seems to trigger issues with IronPort SMTP
921 	 * appliances.
922 	 *
923 	 * NB: because this code works out the length of all existing
924 	 * extensions it MUST always appear last.
925 	 */
926 	if (s->options & SSL_OP_TLSEXT_PADDING) {
927 		int hlen = ret - (unsigned char *)s->init_buf->data;
928 
929 		/*
930 		 * The code in s23_clnt.c to build ClientHello messages
931 		 * includes the 5-byte record header in the buffer, while the
932 		 * code in s3_clnt.c does not.
933 		 */
934 		if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
935 			hlen -= 5;
936 		if (hlen > 0xff && hlen < 0x200) {
937 			hlen = 0x200 - hlen;
938 			if (hlen >= 4)
939 				hlen -= 4;
940 			else
941 				hlen = 0;
942 
943 			s2n(TLSEXT_TYPE_padding, ret);
944 			s2n(hlen, ret);
945 			memset(ret, 0, hlen);
946 			ret += hlen;
947 		}
948 	}
949 
950 	if ((extdatalen = ret - p - 2) == 0)
951 		return p;
952 
953 	s2n(extdatalen, p);
954 	return ret;
955 }
956 
957 unsigned char *
958 ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
959 {
960 	int using_ecc, extdatalen = 0;
961 	unsigned long alg_a, alg_k;
962 	unsigned char *ret = p;
963 	int next_proto_neg_seen;
964 
965 	alg_a = s->s3->tmp.new_cipher->algorithm_auth;
966 	alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
967 	using_ecc = (alg_k & (SSL_kECDHE|SSL_kECDHr|SSL_kECDHe) ||
968 	    alg_a & SSL_aECDSA) &&
969 	    s->session->tlsext_ecpointformatlist != NULL;
970 
971 	ret += 2;
972 	if (ret >= limit)
973 		return NULL; /* this really never occurs, but ... */
974 
975 	if (!s->hit && s->servername_done == 1 &&
976 	    s->session->tlsext_hostname != NULL) {
977 		if ((size_t)(limit - ret) < 4)
978 			return NULL;
979 
980 		s2n(TLSEXT_TYPE_server_name, ret);
981 		s2n(0, ret);
982 	}
983 
984 	if (s->s3->send_connection_binding) {
985 		int el;
986 
987 		if (!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0)) {
988 			SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT,
989 			    ERR_R_INTERNAL_ERROR);
990 			return NULL;
991 		}
992 
993 		if ((size_t)(limit - ret) < 4 + el)
994 			return NULL;
995 
996 		s2n(TLSEXT_TYPE_renegotiate, ret);
997 		s2n(el, ret);
998 
999 		if (!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el)) {
1000 			SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT,
1001 			    ERR_R_INTERNAL_ERROR);
1002 			return NULL;
1003 		}
1004 
1005 		ret += el;
1006 	}
1007 
1008 	if (using_ecc && s->version != DTLS1_VERSION) {
1009 		const unsigned char *formats;
1010 		size_t formatslen, lenmax;
1011 
1012 		/*
1013 		 * Add TLS extension ECPointFormats to the ServerHello message.
1014 		 */
1015 		tls1_get_formatlist(s, 0, &formats, &formatslen);
1016 
1017 		if ((size_t)(limit - ret) < 5)
1018 			return NULL;
1019 
1020 		lenmax = limit - ret - 5;
1021 		if (formatslen > lenmax)
1022 			return NULL;
1023 		if (formatslen > 255) {
1024 			SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT,
1025 			    ERR_R_INTERNAL_ERROR);
1026 			return NULL;
1027 		}
1028 
1029 		s2n(TLSEXT_TYPE_ec_point_formats, ret);
1030 		s2n(formatslen + 1, ret);
1031 		*(ret++) = (unsigned char)formatslen;
1032 		memcpy(ret, formats, formatslen);
1033 		ret += formatslen;
1034 	}
1035 
1036 	/*
1037 	 * Currently the server should not respond with a SupportedCurves
1038 	 * extension.
1039 	 */
1040 
1041 	if (s->tlsext_ticket_expected &&
1042 	    !(SSL_get_options(s) & SSL_OP_NO_TICKET)) {
1043 		if ((size_t)(limit - ret) < 4)
1044 			return NULL;
1045 
1046 		s2n(TLSEXT_TYPE_session_ticket, ret);
1047 		s2n(0, ret);
1048 	}
1049 
1050 	if (s->tlsext_status_expected) {
1051 		if ((size_t)(limit - ret) < 4)
1052 			return NULL;
1053 
1054 		s2n(TLSEXT_TYPE_status_request, ret);
1055 		s2n(0, ret);
1056 	}
1057 
1058 #ifndef OPENSSL_NO_SRTP
1059 	if (SSL_IS_DTLS(s) && s->srtp_profile) {
1060 		int el;
1061 
1062 		ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
1063 
1064 		if ((size_t)(limit - ret) < 4 + el)
1065 			return NULL;
1066 
1067 		s2n(TLSEXT_TYPE_use_srtp, ret);
1068 		s2n(el, ret);
1069 
1070 		if (ssl_add_serverhello_use_srtp_ext(s, ret, &el, el)) {
1071 			SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT,
1072 			    ERR_R_INTERNAL_ERROR);
1073 			return NULL;
1074 		}
1075 		ret += el;
1076 	}
1077 #endif
1078 
1079 	if (((s->s3->tmp.new_cipher->id & 0xFFFF) == 0x80 ||
1080 	    (s->s3->tmp.new_cipher->id & 0xFFFF) == 0x81) &&
1081 	    (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG)) {
1082 		static const unsigned char cryptopro_ext[36] = {
1083 			0xfd, 0xe8, /*65000*/
1084 			0x00, 0x20, /*32 bytes length*/
1085 			0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
1086 			0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
1087 			0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
1088 			0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17
1089 		};
1090 		if ((size_t)(limit - ret) < sizeof(cryptopro_ext))
1091 			return NULL;
1092 		memcpy(ret, cryptopro_ext, sizeof(cryptopro_ext));
1093 		ret += sizeof(cryptopro_ext);
1094 	}
1095 
1096 	next_proto_neg_seen = s->s3->next_proto_neg_seen;
1097 	s->s3->next_proto_neg_seen = 0;
1098 	if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb) {
1099 		const unsigned char *npa;
1100 		unsigned int npalen;
1101 		int r;
1102 
1103 		r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen,
1104 		    s->ctx->next_protos_advertised_cb_arg);
1105 		if (r == SSL_TLSEXT_ERR_OK) {
1106 			if ((size_t)(limit - ret) < 4 + npalen)
1107 				return NULL;
1108 			s2n(TLSEXT_TYPE_next_proto_neg, ret);
1109 			s2n(npalen, ret);
1110 			memcpy(ret, npa, npalen);
1111 			ret += npalen;
1112 			s->s3->next_proto_neg_seen = 1;
1113 		}
1114 	}
1115 
1116 	if (s->s3->alpn_selected != NULL) {
1117 		const unsigned char *selected = s->s3->alpn_selected;
1118 		unsigned int len = s->s3->alpn_selected_len;
1119 
1120 		if ((long)(limit - ret - 4 - 2 - 1 - len) < 0)
1121 			return (NULL);
1122 		s2n(TLSEXT_TYPE_application_layer_protocol_negotiation, ret);
1123 		s2n(3 + len, ret);
1124 		s2n(1 + len, ret);
1125 		*ret++ = len;
1126 		memcpy(ret, selected, len);
1127 		ret += len;
1128 	}
1129 
1130 	if ((extdatalen = ret - p - 2) == 0)
1131 		return p;
1132 
1133 	s2n(extdatalen, p);
1134 	return ret;
1135 }
1136 
1137 /*
1138  * tls1_alpn_handle_client_hello is called to process the ALPN extension in a
1139  * ClientHello.
1140  *   data: the contents of the extension, not including the type and length.
1141  *   data_len: the number of bytes in data.
1142  *   al: a pointer to the alert value to send in the event of a non-zero
1143  *       return.
1144  *   returns: 1 on success.
1145  */
1146 static int
1147 tls1_alpn_handle_client_hello(SSL *s, const unsigned char *data,
1148     unsigned int data_len, int *al)
1149 {
1150 	CBS cbs, proto_name_list, alpn;
1151 	const unsigned char *selected;
1152 	unsigned char selected_len;
1153 	int r;
1154 
1155 	if (s->ctx->alpn_select_cb == NULL)
1156 		return (1);
1157 
1158 	if (data_len < 2)
1159 		goto parse_error;
1160 
1161 	CBS_init(&cbs, data, data_len);
1162 
1163 	/*
1164 	 * data should contain a uint16 length followed by a series of 8-bit,
1165 	 * length-prefixed strings.
1166 	 */
1167 	if (!CBS_get_u16_length_prefixed(&cbs, &alpn) ||
1168 	    CBS_len(&alpn) < 2 ||
1169 	    CBS_len(&cbs) != 0)
1170 		goto parse_error;
1171 
1172 	/* Validate data before sending to callback. */
1173 	CBS_dup(&alpn, &proto_name_list);
1174 	while (CBS_len(&proto_name_list) > 0) {
1175 		CBS proto_name;
1176 
1177 		if (!CBS_get_u8_length_prefixed(&proto_name_list, &proto_name) ||
1178 		    CBS_len(&proto_name) == 0)
1179 			goto parse_error;
1180 	}
1181 
1182 	r = s->ctx->alpn_select_cb(s, &selected, &selected_len,
1183 	    CBS_data(&alpn), CBS_len(&alpn), s->ctx->alpn_select_cb_arg);
1184 	if (r == SSL_TLSEXT_ERR_OK) {
1185 		free(s->s3->alpn_selected);
1186 		if ((s->s3->alpn_selected = malloc(selected_len)) == NULL) {
1187 			*al = SSL_AD_INTERNAL_ERROR;
1188 			return (-1);
1189 		}
1190 		memcpy(s->s3->alpn_selected, selected, selected_len);
1191 		s->s3->alpn_selected_len = selected_len;
1192 	}
1193 
1194 	return (1);
1195 
1196 parse_error:
1197 	*al = SSL_AD_DECODE_ERROR;
1198 	return (0);
1199 }
1200 
1201 int
1202 ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1203     int n, int *al)
1204 {
1205 	unsigned short type;
1206 	unsigned short size;
1207 	unsigned short len;
1208 	unsigned char *data = *p;
1209 	int renegotiate_seen = 0;
1210 	int sigalg_seen = 0;
1211 
1212 	s->servername_done = 0;
1213 	s->tlsext_status_type = -1;
1214 	s->s3->next_proto_neg_seen = 0;
1215 	free(s->s3->alpn_selected);
1216 	s->s3->alpn_selected = NULL;
1217 
1218 	if (data >= (d + n - 2))
1219 		goto ri_check;
1220 	n2s(data, len);
1221 
1222 	if (data > (d + n - len))
1223 		goto ri_check;
1224 
1225 	while (data <= (d + n - 4)) {
1226 		n2s(data, type);
1227 		n2s(data, size);
1228 
1229 		if (data + size > (d + n))
1230 			goto ri_check;
1231 		if (s->tlsext_debug_cb)
1232 			s->tlsext_debug_cb(s, 0, type, data, size,
1233 			    s->tlsext_debug_arg);
1234 /* The servername extension is treated as follows:
1235 
1236    - Only the hostname type is supported with a maximum length of 255.
1237    - The servername is rejected if too long or if it contains zeros,
1238      in which case an fatal alert is generated.
1239    - The servername field is maintained together with the session cache.
1240    - When a session is resumed, the servername call back invoked in order
1241      to allow the application to position itself to the right context.
1242    - The servername is acknowledged if it is new for a session or when
1243      it is identical to a previously used for the same session.
1244      Applications can control the behaviour.  They can at any time
1245      set a 'desirable' servername for a new SSL object. This can be the
1246      case for example with HTTPS when a Host: header field is received and
1247      a renegotiation is requested. In this case, a possible servername
1248      presented in the new client hello is only acknowledged if it matches
1249      the value of the Host: field.
1250    - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
1251      if they provide for changing an explicit servername context for the session,
1252      i.e. when the session has been established with a servername extension.
1253    - On session reconnect, the servername extension may be absent.
1254 
1255 */
1256 
1257 		if (type == TLSEXT_TYPE_server_name) {
1258 			unsigned char *sdata;
1259 			int servname_type;
1260 			int dsize;
1261 
1262 			if (size < 2) {
1263 				*al = SSL_AD_DECODE_ERROR;
1264 				return 0;
1265 			}
1266 			n2s(data, dsize);
1267 
1268 			size -= 2;
1269 			if (dsize > size) {
1270 				*al = SSL_AD_DECODE_ERROR;
1271 				return 0;
1272 			}
1273 
1274 			sdata = data;
1275 			while (dsize > 3) {
1276 				servname_type = *(sdata++);
1277 
1278 				n2s(sdata, len);
1279 				dsize -= 3;
1280 
1281 				if (len > dsize) {
1282 					*al = SSL_AD_DECODE_ERROR;
1283 					return 0;
1284 				}
1285 				if (s->servername_done == 0)
1286 					switch (servname_type) {
1287 					case TLSEXT_NAMETYPE_host_name:
1288 						if (!s->hit) {
1289 							if (s->session->tlsext_hostname) {
1290 								*al = SSL_AD_DECODE_ERROR;
1291 								return 0;
1292 							}
1293 							if (len > TLSEXT_MAXLEN_host_name) {
1294 								*al = TLS1_AD_UNRECOGNIZED_NAME;
1295 								return 0;
1296 							}
1297 							if ((s->session->tlsext_hostname =
1298 							    malloc(len + 1)) == NULL) {
1299 								*al = TLS1_AD_INTERNAL_ERROR;
1300 								return 0;
1301 							}
1302 							memcpy(s->session->tlsext_hostname, sdata, len);
1303 							s->session->tlsext_hostname[len] = '\0';
1304 							if (strlen(s->session->tlsext_hostname) != len) {
1305 								free(s->session->tlsext_hostname);
1306 								s->session->tlsext_hostname = NULL;
1307 								*al = TLS1_AD_UNRECOGNIZED_NAME;
1308 								return 0;
1309 							}
1310 							s->servername_done = 1;
1311 
1312 
1313 						} else {
1314 							s->servername_done = s->session->tlsext_hostname &&
1315 							    strlen(s->session->tlsext_hostname) == len &&
1316 							    strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
1317 						}
1318 						break;
1319 
1320 					default:
1321 						break;
1322 					}
1323 
1324 				dsize -= len;
1325 			}
1326 			if (dsize != 0) {
1327 				*al = SSL_AD_DECODE_ERROR;
1328 				return 0;
1329 			}
1330 
1331 		}
1332 
1333 		else if (type == TLSEXT_TYPE_ec_point_formats &&
1334 		    s->version != DTLS1_VERSION) {
1335 			unsigned char *sdata = data;
1336 			size_t formatslen;
1337 			uint8_t *formats;
1338 
1339 			if (size < 1) {
1340 				*al = TLS1_AD_DECODE_ERROR;
1341 				return 0;
1342 			}
1343 			formatslen = *(sdata++);
1344 			if (formatslen != size - 1) {
1345 				*al = TLS1_AD_DECODE_ERROR;
1346 				return 0;
1347 			}
1348 
1349 			if (!s->hit) {
1350 				free(s->session->tlsext_ecpointformatlist);
1351 				s->session->tlsext_ecpointformatlist = NULL;
1352 				s->session->tlsext_ecpointformatlist_length = 0;
1353 
1354 				if ((formats = reallocarray(NULL, formatslen,
1355 				    sizeof(uint8_t))) == NULL) {
1356 					*al = TLS1_AD_INTERNAL_ERROR;
1357 					return 0;
1358 				}
1359 				memcpy(formats, sdata, formatslen);
1360 				s->session->tlsext_ecpointformatlist = formats;
1361 				s->session->tlsext_ecpointformatlist_length =
1362 				    formatslen;
1363 			}
1364 		} else if (type == TLSEXT_TYPE_elliptic_curves &&
1365 		    s->version != DTLS1_VERSION) {
1366 			unsigned char *sdata = data;
1367 			size_t curveslen, i;
1368 			uint16_t *curves;
1369 
1370 			if (size < 2) {
1371 				*al = TLS1_AD_DECODE_ERROR;
1372 				return 0;
1373 			}
1374 			n2s(sdata, curveslen);
1375 			if (curveslen != size - 2 || curveslen % 2 != 0) {
1376 				*al = TLS1_AD_DECODE_ERROR;
1377 				return 0;
1378 			}
1379 			curveslen /= 2;
1380 
1381 			if (!s->hit) {
1382 				if (s->session->tlsext_ellipticcurvelist) {
1383 					*al = TLS1_AD_DECODE_ERROR;
1384 					return 0;
1385 				}
1386 				s->session->tlsext_ellipticcurvelist_length = 0;
1387 				if ((curves = reallocarray(NULL, curveslen,
1388 				    sizeof(uint16_t))) == NULL) {
1389 					*al = TLS1_AD_INTERNAL_ERROR;
1390 					return 0;
1391 				}
1392 				for (i = 0; i < curveslen; i++)
1393 					n2s(sdata, curves[i]);
1394 				s->session->tlsext_ellipticcurvelist = curves;
1395 				s->session->tlsext_ellipticcurvelist_length = curveslen;
1396 			}
1397 		}
1398 		else if (type == TLSEXT_TYPE_session_ticket) {
1399 			if (s->tls_session_ticket_ext_cb &&
1400 			    !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg)) {
1401 				*al = TLS1_AD_INTERNAL_ERROR;
1402 				return 0;
1403 			}
1404 		} else if (type == TLSEXT_TYPE_renegotiate) {
1405 			if (!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1406 				return 0;
1407 			renegotiate_seen = 1;
1408 		} else if (type == TLSEXT_TYPE_signature_algorithms) {
1409 			int dsize;
1410 			if (sigalg_seen || size < 2) {
1411 				*al = SSL_AD_DECODE_ERROR;
1412 				return 0;
1413 			}
1414 			sigalg_seen = 1;
1415 			n2s(data, dsize);
1416 			size -= 2;
1417 			if (dsize != size || dsize & 1) {
1418 				*al = SSL_AD_DECODE_ERROR;
1419 				return 0;
1420 			}
1421 			if (!tls1_process_sigalgs(s, data, dsize)) {
1422 				*al = SSL_AD_DECODE_ERROR;
1423 				return 0;
1424 			}
1425 		} else if (type == TLSEXT_TYPE_status_request &&
1426 		    s->version != DTLS1_VERSION) {
1427 
1428 			if (size < 5) {
1429 				*al = SSL_AD_DECODE_ERROR;
1430 				return 0;
1431 			}
1432 
1433 			s->tlsext_status_type = *data++;
1434 			size--;
1435 			if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp) {
1436 				const unsigned char *sdata;
1437 				int dsize;
1438 				/* Read in responder_id_list */
1439 				n2s(data, dsize);
1440 				size -= 2;
1441 				if (dsize > size  ) {
1442 					*al = SSL_AD_DECODE_ERROR;
1443 					return 0;
1444 				}
1445 				while (dsize > 0) {
1446 					OCSP_RESPID *id;
1447 					int idsize;
1448 					if (dsize < 4) {
1449 						*al = SSL_AD_DECODE_ERROR;
1450 						return 0;
1451 					}
1452 					n2s(data, idsize);
1453 					dsize -= 2 + idsize;
1454 					size -= 2 + idsize;
1455 					if (dsize < 0) {
1456 						*al = SSL_AD_DECODE_ERROR;
1457 						return 0;
1458 					}
1459 					sdata = data;
1460 					data += idsize;
1461 					id = d2i_OCSP_RESPID(NULL,
1462 					    &sdata, idsize);
1463 					if (!id) {
1464 						*al = SSL_AD_DECODE_ERROR;
1465 						return 0;
1466 					}
1467 					if (data != sdata) {
1468 						OCSP_RESPID_free(id);
1469 						*al = SSL_AD_DECODE_ERROR;
1470 						return 0;
1471 					}
1472 					if (!s->tlsext_ocsp_ids &&
1473 					    !(s->tlsext_ocsp_ids =
1474 					    sk_OCSP_RESPID_new_null())) {
1475 						OCSP_RESPID_free(id);
1476 						*al = SSL_AD_INTERNAL_ERROR;
1477 						return 0;
1478 					}
1479 					if (!sk_OCSP_RESPID_push(
1480 					    s->tlsext_ocsp_ids, id)) {
1481 						OCSP_RESPID_free(id);
1482 						*al = SSL_AD_INTERNAL_ERROR;
1483 						return 0;
1484 					}
1485 				}
1486 
1487 				/* Read in request_extensions */
1488 				if (size < 2) {
1489 					*al = SSL_AD_DECODE_ERROR;
1490 					return 0;
1491 				}
1492 				n2s(data, dsize);
1493 				size -= 2;
1494 				if (dsize != size) {
1495 					*al = SSL_AD_DECODE_ERROR;
1496 					return 0;
1497 				}
1498 				sdata = data;
1499 				if (dsize > 0) {
1500 					if (s->tlsext_ocsp_exts) {
1501 						sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1502 						    X509_EXTENSION_free);
1503 					}
1504 
1505 					s->tlsext_ocsp_exts =
1506 					    d2i_X509_EXTENSIONS(NULL,
1507 					    &sdata, dsize);
1508 					if (!s->tlsext_ocsp_exts ||
1509 						    (data + dsize != sdata)) {
1510 						*al = SSL_AD_DECODE_ERROR;
1511 						return 0;
1512 					}
1513 				}
1514 			} else {
1515 				/* We don't know what to do with any other type
1516  			 	* so ignore it.
1517  			 	*/
1518 				s->tlsext_status_type = -1;
1519 			}
1520 		}
1521 		else if (type == TLSEXT_TYPE_next_proto_neg &&
1522 		    s->s3->tmp.finish_md_len == 0 &&
1523 		    s->s3->alpn_selected == NULL) {
1524 			/* We shouldn't accept this extension on a
1525 			 * renegotiation.
1526 			 *
1527 			 * s->new_session will be set on renegotiation, but we
1528 			 * probably shouldn't rely that it couldn't be set on
1529 			 * the initial renegotation too in certain cases (when
1530 			 * there's some other reason to disallow resuming an
1531 			 * earlier session -- the current code won't be doing
1532 			 * anything like that, but this might change).
1533 
1534 			 * A valid sign that there's been a previous handshake
1535 			 * in this connection is if s->s3->tmp.finish_md_len >
1536 			 * 0.  (We are talking about a check that will happen
1537 			 * in the Hello protocol round, well before a new
1538 			 * Finished message could have been computed.) */
1539 			s->s3->next_proto_neg_seen = 1;
1540 		}
1541 		else if (type ==
1542 		    TLSEXT_TYPE_application_layer_protocol_negotiation &&
1543 		    s->ctx->alpn_select_cb != NULL &&
1544 		    s->s3->tmp.finish_md_len == 0) {
1545 			if (tls1_alpn_handle_client_hello(s, data,
1546 			    size, al) != 1)
1547 				return (0);
1548 			/* ALPN takes precedence over NPN. */
1549 			s->s3->next_proto_neg_seen = 0;
1550 		}
1551 
1552 		/* session ticket processed earlier */
1553 #ifndef OPENSSL_NO_SRTP
1554 		else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) {
1555 			if (ssl_parse_clienthello_use_srtp_ext(s, data, size, al))
1556 				return 0;
1557 		}
1558 #endif
1559 
1560 		data += size;
1561 	}
1562 
1563 	*p = data;
1564 
1565 ri_check:
1566 
1567 	/* Need RI if renegotiating */
1568 
1569 	if (!renegotiate_seen && s->renegotiate) {
1570 		*al = SSL_AD_HANDSHAKE_FAILURE;
1571 		SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1572 		    SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1573 		return 0;
1574 	}
1575 
1576 	return 1;
1577 }
1578 
1579 /*
1580  * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1581  * elements of zero length are allowed and the set of elements must exactly fill
1582  * the length of the block.
1583  */
1584 static char
1585 ssl_next_proto_validate(const unsigned char *d, unsigned int len)
1586 {
1587 	CBS npn, value;
1588 
1589 	CBS_init(&npn, d, len);
1590 	while (CBS_len(&npn) > 0) {
1591 		if (!CBS_get_u8_length_prefixed(&npn, &value) ||
1592 		    CBS_len(&value) == 0)
1593 			return 0;
1594 	}
1595 	return 1;
1596 }
1597 
1598 int
1599 ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1600     int n, int *al)
1601 {
1602 	unsigned short length;
1603 	unsigned short type;
1604 	unsigned short size;
1605 	unsigned char *data = *p;
1606 	int tlsext_servername = 0;
1607 	int renegotiate_seen = 0;
1608 
1609 	s->s3->next_proto_neg_seen = 0;
1610 	free(s->s3->alpn_selected);
1611 	s->s3->alpn_selected = NULL;
1612 
1613 	if (data >= (d + n - 2))
1614 		goto ri_check;
1615 
1616 	n2s(data, length);
1617 	if (data + length != d + n) {
1618 		*al = SSL_AD_DECODE_ERROR;
1619 		return 0;
1620 	}
1621 
1622 	while (data <= (d + n - 4)) {
1623 		n2s(data, type);
1624 		n2s(data, size);
1625 
1626 		if (data + size > (d + n))
1627 			goto ri_check;
1628 
1629 		if (s->tlsext_debug_cb)
1630 			s->tlsext_debug_cb(s, 1, type, data, size,
1631 			    s->tlsext_debug_arg);
1632 
1633 		if (type == TLSEXT_TYPE_server_name) {
1634 			if (s->tlsext_hostname == NULL || size > 0) {
1635 				*al = TLS1_AD_UNRECOGNIZED_NAME;
1636 				return 0;
1637 			}
1638 			tlsext_servername = 1;
1639 
1640 		}
1641 		else if (type == TLSEXT_TYPE_ec_point_formats &&
1642 		    s->version != DTLS1_VERSION) {
1643 			unsigned char *sdata = data;
1644 			size_t formatslen;
1645 			uint8_t *formats;
1646 
1647 			if (size < 1) {
1648 				*al = TLS1_AD_DECODE_ERROR;
1649 				return 0;
1650 			}
1651 			formatslen = *(sdata++);
1652 			if (formatslen != size - 1) {
1653 				*al = TLS1_AD_DECODE_ERROR;
1654 				return 0;
1655 			}
1656 
1657 			if (!s->hit) {
1658 				free(s->session->tlsext_ecpointformatlist);
1659 				s->session->tlsext_ecpointformatlist = NULL;
1660 				s->session->tlsext_ecpointformatlist_length = 0;
1661 
1662 				if ((formats = reallocarray(NULL, formatslen,
1663 				    sizeof(uint8_t))) == NULL) {
1664 					*al = TLS1_AD_INTERNAL_ERROR;
1665 					return 0;
1666 				}
1667 				memcpy(formats, sdata, formatslen);
1668 				s->session->tlsext_ecpointformatlist = formats;
1669 				s->session->tlsext_ecpointformatlist_length =
1670 				    formatslen;
1671 			}
1672 		}
1673 		else if (type == TLSEXT_TYPE_session_ticket) {
1674 			if (s->tls_session_ticket_ext_cb &&
1675 			    !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg)) {
1676 				*al = TLS1_AD_INTERNAL_ERROR;
1677 				return 0;
1678 			}
1679 			if ((SSL_get_options(s) & SSL_OP_NO_TICKET) || (size > 0)) {
1680 				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1681 				return 0;
1682 			}
1683 			s->tlsext_ticket_expected = 1;
1684 		}
1685 		else if (type == TLSEXT_TYPE_status_request &&
1686 		    s->version != DTLS1_VERSION) {
1687 			/* MUST be empty and only sent if we've requested
1688 			 * a status request message.
1689 			 */
1690 			if ((s->tlsext_status_type == -1) || (size > 0)) {
1691 				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1692 				return 0;
1693 			}
1694 			/* Set flag to expect CertificateStatus message */
1695 			s->tlsext_status_expected = 1;
1696 		}
1697 		else if (type == TLSEXT_TYPE_next_proto_neg &&
1698 		    s->s3->tmp.finish_md_len == 0) {
1699 			unsigned char *selected;
1700 			unsigned char selected_len;
1701 
1702 			/* We must have requested it. */
1703 			if (s->ctx->next_proto_select_cb == NULL) {
1704 				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1705 				return 0;
1706 			}
1707 			/* The data must be valid */
1708 			if (!ssl_next_proto_validate(data, size)) {
1709 				*al = TLS1_AD_DECODE_ERROR;
1710 				return 0;
1711 			}
1712 			if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK) {
1713 				*al = TLS1_AD_INTERNAL_ERROR;
1714 				return 0;
1715 			}
1716 			s->next_proto_negotiated = malloc(selected_len);
1717 			if (!s->next_proto_negotiated) {
1718 				*al = TLS1_AD_INTERNAL_ERROR;
1719 				return 0;
1720 			}
1721 			memcpy(s->next_proto_negotiated, selected, selected_len);
1722 			s->next_proto_negotiated_len = selected_len;
1723 			s->s3->next_proto_neg_seen = 1;
1724 		}
1725 		else if (type ==
1726 		    TLSEXT_TYPE_application_layer_protocol_negotiation) {
1727 			unsigned int len;
1728 
1729 			/* We must have requested it. */
1730 			if (s->alpn_client_proto_list == NULL) {
1731 				*al = TLS1_AD_UNSUPPORTED_EXTENSION;
1732 				return 0;
1733 			}
1734 			if (size < 4) {
1735 				*al = TLS1_AD_DECODE_ERROR;
1736 				return (0);
1737 			}
1738 
1739 			/* The extension data consists of:
1740 			 *   uint16 list_length
1741 			 *   uint8 proto_length;
1742 			 *   uint8 proto[proto_length]; */
1743 			len = ((unsigned int)data[0]) << 8 |
1744 			    ((unsigned int)data[1]);
1745 			if (len != (unsigned int)size - 2) {
1746 				*al = TLS1_AD_DECODE_ERROR;
1747 				return (0);
1748 			}
1749 			len = data[2];
1750 			if (len != (unsigned int)size - 3) {
1751 				*al = TLS1_AD_DECODE_ERROR;
1752 				return (0);
1753 			}
1754 			free(s->s3->alpn_selected);
1755 			s->s3->alpn_selected = malloc(len);
1756 			if (s->s3->alpn_selected == NULL) {
1757 				*al = TLS1_AD_INTERNAL_ERROR;
1758 				return (0);
1759 			}
1760 			memcpy(s->s3->alpn_selected, data + 3, len);
1761 			s->s3->alpn_selected_len = len;
1762 
1763 		} else if (type == TLSEXT_TYPE_renegotiate) {
1764 			if (!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1765 				return 0;
1766 			renegotiate_seen = 1;
1767 		}
1768 #ifndef OPENSSL_NO_SRTP
1769 		else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) {
1770 			if (ssl_parse_serverhello_use_srtp_ext(s, data,
1771 			    size, al))
1772 				return 0;
1773 		}
1774 #endif
1775 
1776 		data += size;
1777 
1778 	}
1779 
1780 	if (data != d + n) {
1781 		*al = SSL_AD_DECODE_ERROR;
1782 		return 0;
1783 	}
1784 
1785 	if (!s->hit && tlsext_servername == 1) {
1786 		if (s->tlsext_hostname) {
1787 			if (s->session->tlsext_hostname == NULL) {
1788 				s->session->tlsext_hostname =
1789 				    strdup(s->tlsext_hostname);
1790 
1791 				if (!s->session->tlsext_hostname) {
1792 					*al = SSL_AD_UNRECOGNIZED_NAME;
1793 					return 0;
1794 				}
1795 			} else {
1796 				*al = SSL_AD_DECODE_ERROR;
1797 				return 0;
1798 			}
1799 		}
1800 	}
1801 
1802 	*p = data;
1803 
1804 ri_check:
1805 
1806 	/* Determine if we need to see RI. Strictly speaking if we want to
1807 	 * avoid an attack we should *always* see RI even on initial server
1808 	 * hello because the client doesn't see any renegotiation during an
1809 	 * attack. However this would mean we could not connect to any server
1810 	 * which doesn't support RI so for the immediate future tolerate RI
1811 	 * absence on initial connect only.
1812 	 */
1813 	if (!renegotiate_seen && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)) {
1814 		*al = SSL_AD_HANDSHAKE_FAILURE;
1815 		SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1816 		    SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1817 		return 0;
1818 	}
1819 
1820 	return 1;
1821 }
1822 
1823 int
1824 ssl_check_clienthello_tlsext_early(SSL *s)
1825 {
1826 	int ret = SSL_TLSEXT_ERR_NOACK;
1827 	int al = SSL_AD_UNRECOGNIZED_NAME;
1828 
1829 	/* The handling of the ECPointFormats extension is done elsewhere, namely in
1830 	 * ssl3_choose_cipher in s3_lib.c.
1831 	 */
1832 	/* The handling of the EllipticCurves extension is done elsewhere, namely in
1833 	 * ssl3_choose_cipher in s3_lib.c.
1834 	 */
1835 
1836 	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1837 		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1838 	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1839 		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1840 
1841 	switch (ret) {
1842 	case SSL_TLSEXT_ERR_ALERT_FATAL:
1843 		ssl3_send_alert(s, SSL3_AL_FATAL, al);
1844 		return -1;
1845 	case SSL_TLSEXT_ERR_ALERT_WARNING:
1846 		ssl3_send_alert(s, SSL3_AL_WARNING, al);
1847 		return 1;
1848 	case SSL_TLSEXT_ERR_NOACK:
1849 		s->servername_done = 0;
1850 	default:
1851 		return 1;
1852 	}
1853 }
1854 
1855 int
1856 ssl_check_clienthello_tlsext_late(SSL *s)
1857 {
1858 	int ret = SSL_TLSEXT_ERR_OK;
1859 	int al = 0;	/* XXX gcc3 */
1860 
1861 	/* If status request then ask callback what to do.
1862  	 * Note: this must be called after servername callbacks in case
1863  	 * the certificate has changed, and must be called after the cipher
1864 	 * has been chosen because this may influence which certificate is sent
1865  	 */
1866 	if ((s->tlsext_status_type != -1) &&
1867 	    s->ctx && s->ctx->tlsext_status_cb) {
1868 		int r;
1869 		CERT_PKEY *certpkey;
1870 		certpkey = ssl_get_server_send_pkey(s);
1871 		/* If no certificate can't return certificate status */
1872 		if (certpkey == NULL) {
1873 			s->tlsext_status_expected = 0;
1874 			return 1;
1875 		}
1876 		/* Set current certificate to one we will use so
1877 		 * SSL_get_certificate et al can pick it up.
1878 		 */
1879 		s->cert->key = certpkey;
1880 		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1881 		switch (r) {
1882 			/* We don't want to send a status request response */
1883 		case SSL_TLSEXT_ERR_NOACK:
1884 			s->tlsext_status_expected = 0;
1885 			break;
1886 			/* status request response should be sent */
1887 		case SSL_TLSEXT_ERR_OK:
1888 			if (s->tlsext_ocsp_resp)
1889 				s->tlsext_status_expected = 1;
1890 			else
1891 				s->tlsext_status_expected = 0;
1892 			break;
1893 			/* something bad happened */
1894 		case SSL_TLSEXT_ERR_ALERT_FATAL:
1895 			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1896 			al = SSL_AD_INTERNAL_ERROR;
1897 			goto err;
1898 		}
1899 	} else
1900 		s->tlsext_status_expected = 0;
1901 
1902 err:
1903 	switch (ret) {
1904 	case SSL_TLSEXT_ERR_ALERT_FATAL:
1905 		ssl3_send_alert(s, SSL3_AL_FATAL, al);
1906 		return -1;
1907 	case SSL_TLSEXT_ERR_ALERT_WARNING:
1908 		ssl3_send_alert(s, SSL3_AL_WARNING, al);
1909 		return 1;
1910 	default:
1911 		return 1;
1912 	}
1913 }
1914 
1915 int
1916 ssl_check_serverhello_tlsext(SSL *s)
1917 {
1918 	int ret = SSL_TLSEXT_ERR_NOACK;
1919 	int al = SSL_AD_UNRECOGNIZED_NAME;
1920 
1921 	/* If we are client and using an elliptic curve cryptography cipher
1922 	 * suite, then if server returns an EC point formats lists extension
1923 	 * it must contain uncompressed.
1924 	 */
1925 	unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1926 	unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1927 	if ((s->tlsext_ecpointformatlist != NULL) &&
1928 	    (s->tlsext_ecpointformatlist_length > 0) &&
1929 	    (s->session->tlsext_ecpointformatlist != NULL) &&
1930 	    (s->session->tlsext_ecpointformatlist_length > 0) &&
1931 	    ((alg_k & (SSL_kECDHE|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA))) {
1932 		/* we are using an ECC cipher */
1933 		size_t i;
1934 		unsigned char *list;
1935 		int found_uncompressed = 0;
1936 		list = s->session->tlsext_ecpointformatlist;
1937 		for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++) {
1938 			if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed) {
1939 				found_uncompressed = 1;
1940 				break;
1941 			}
1942 		}
1943 		if (!found_uncompressed) {
1944 			SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT, SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
1945 			return -1;
1946 		}
1947 	}
1948 	ret = SSL_TLSEXT_ERR_OK;
1949 
1950 	if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1951 		ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1952 	else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1953 		ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1954 
1955 	/* If we've requested certificate status and we wont get one
1956  	 * tell the callback
1957  	 */
1958 	if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected) &&
1959 	    s->ctx && s->ctx->tlsext_status_cb) {
1960 		int r;
1961 		/* Set resp to NULL, resplen to -1 so callback knows
1962  		 * there is no response.
1963  		 */
1964 		free(s->tlsext_ocsp_resp);
1965 		s->tlsext_ocsp_resp = NULL;
1966 		s->tlsext_ocsp_resplen = -1;
1967 		r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1968 		if (r == 0) {
1969 			al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
1970 			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1971 		}
1972 		if (r < 0) {
1973 			al = SSL_AD_INTERNAL_ERROR;
1974 			ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1975 		}
1976 	}
1977 
1978 	switch (ret) {
1979 	case SSL_TLSEXT_ERR_ALERT_FATAL:
1980 		ssl3_send_alert(s, SSL3_AL_FATAL, al);
1981 
1982 		return -1;
1983 	case SSL_TLSEXT_ERR_ALERT_WARNING:
1984 		ssl3_send_alert(s, SSL3_AL_WARNING, al);
1985 
1986 		return 1;
1987 	case SSL_TLSEXT_ERR_NOACK:
1988 		s->servername_done = 0;
1989 	default:
1990 		return 1;
1991 	}
1992 }
1993 
1994 /* Since the server cache lookup is done early on in the processing of the
1995  * ClientHello, and other operations depend on the result, we need to handle
1996  * any TLS session ticket extension at the same time.
1997  *
1998  *   session_id: points at the session ID in the ClientHello. This code will
1999  *       read past the end of this in order to parse out the session ticket
2000  *       extension, if any.
2001  *   len: the length of the session ID.
2002  *   limit: a pointer to the first byte after the ClientHello.
2003  *   ret: (output) on return, if a ticket was decrypted, then this is set to
2004  *       point to the resulting session.
2005  *
2006  * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2007  * ciphersuite, in which case we have no use for session tickets and one will
2008  * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2009  *
2010  * Returns:
2011  *   -1: fatal error, either from parsing or decrypting the ticket.
2012  *    0: no ticket was found (or was ignored, based on settings).
2013  *    1: a zero length extension was found, indicating that the client supports
2014  *       session tickets but doesn't currently have one to offer.
2015  *    2: either s->tls_session_secret_cb was set, or a ticket was offered but
2016  *       couldn't be decrypted because of a non-fatal error.
2017  *    3: a ticket was successfully decrypted and *ret was set.
2018  *
2019  * Side effects:
2020  *   Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2021  *   a new session ticket to the client because the client indicated support
2022  *   (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2023  *   a session ticket or we couldn't use the one it gave us, or if
2024  *   s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2025  *   Otherwise, s->tlsext_ticket_expected is set to 0.
2026  */
2027 int
2028 tls1_process_ticket(SSL *s, const unsigned char *session, int session_len,
2029     const unsigned char *limit, SSL_SESSION **ret)
2030 {
2031 	/* Point after session ID in client hello */
2032 	CBS session_id, cookie, cipher_list, compress_algo, extensions;
2033 
2034 	*ret = NULL;
2035 	s->tlsext_ticket_expected = 0;
2036 
2037 	/* If tickets disabled behave as if no ticket present
2038 	 * to permit stateful resumption.
2039 	 */
2040 	if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2041 		return 0;
2042 	if (!limit)
2043 		return 0;
2044 
2045 	if (limit < session)
2046 		return -1;
2047 
2048 	CBS_init(&session_id, session, limit - session);
2049 
2050 	/* Skip past the session id */
2051 	if (!CBS_skip(&session_id, session_len))
2052 		return -1;
2053 
2054 	/* Skip past DTLS cookie */
2055 	if (SSL_IS_DTLS(s)) {
2056 		if (!CBS_get_u8_length_prefixed(&session_id, &cookie))
2057 			return -1;
2058 	}
2059 
2060 	/* Skip past cipher list */
2061 	if (!CBS_get_u16_length_prefixed(&session_id, &cipher_list))
2062 		return -1;
2063 
2064 	/* Skip past compression algorithm list */
2065 	if (!CBS_get_u8_length_prefixed(&session_id, &compress_algo))
2066 		return -1;
2067 
2068 	/* Now at start of extensions */
2069 	if (CBS_len(&session_id) == 0)
2070 		return 0;
2071 	if (!CBS_get_u16_length_prefixed(&session_id, &extensions))
2072 		return -1;
2073 
2074 	while (CBS_len(&extensions) > 0) {
2075 		CBS ext_data;
2076 		uint16_t ext_type;
2077 
2078 		if (!CBS_get_u16(&extensions, &ext_type) ||
2079 		    !CBS_get_u16_length_prefixed(&extensions, &ext_data))
2080 			return -1;
2081 
2082 		if (ext_type == TLSEXT_TYPE_session_ticket) {
2083 			int r;
2084 			if (CBS_len(&ext_data) == 0) {
2085 				/* The client will accept a ticket but doesn't
2086 				 * currently have one. */
2087 				s->tlsext_ticket_expected = 1;
2088 				return 1;
2089 			}
2090 			if (s->tls_session_secret_cb) {
2091 				/* Indicate that the ticket couldn't be
2092 				 * decrypted rather than generating the session
2093 				 * from ticket now, trigger abbreviated
2094 				 * handshake based on external mechanism to
2095 				 * calculate the master secret later. */
2096 				return 2;
2097 			}
2098 
2099 			r = tls_decrypt_ticket(s, CBS_data(&ext_data),
2100 			    CBS_len(&ext_data), session, session_len, ret);
2101 
2102 			switch (r) {
2103 			case 2: /* ticket couldn't be decrypted */
2104 				s->tlsext_ticket_expected = 1;
2105 				return 2;
2106 			case 3: /* ticket was decrypted */
2107 				return r;
2108 			case 4: /* ticket decrypted but need to renew */
2109 				s->tlsext_ticket_expected = 1;
2110 				return 3;
2111 			default: /* fatal error */
2112 				return -1;
2113 			}
2114 		}
2115 	}
2116 	return 0;
2117 }
2118 
2119 /* tls_decrypt_ticket attempts to decrypt a session ticket.
2120  *
2121  *   etick: points to the body of the session ticket extension.
2122  *   eticklen: the length of the session tickets extenion.
2123  *   sess_id: points at the session ID.
2124  *   sesslen: the length of the session ID.
2125  *   psess: (output) on return, if a ticket was decrypted, then this is set to
2126  *       point to the resulting session.
2127  *
2128  * Returns:
2129  *   -1: fatal error, either from parsing or decrypting the ticket.
2130  *    2: the ticket couldn't be decrypted.
2131  *    3: a ticket was successfully decrypted and *psess was set.
2132  *    4: same as 3, but the ticket needs to be renewed.
2133  */
2134 static int
2135 tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2136     const unsigned char *sess_id, int sesslen, SSL_SESSION **psess)
2137 {
2138 	SSL_SESSION *sess;
2139 	unsigned char *sdec;
2140 	const unsigned char *p;
2141 	int slen, mlen, renew_ticket = 0;
2142 	unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2143 	HMAC_CTX hctx;
2144 	EVP_CIPHER_CTX ctx;
2145 	SSL_CTX *tctx = s->initial_ctx;
2146 	/* Need at least keyname + iv + some encrypted data */
2147 	if (eticklen < 48)
2148 		return 2;
2149 	/* Initialize session ticket encryption and HMAC contexts */
2150 	HMAC_CTX_init(&hctx);
2151 	EVP_CIPHER_CTX_init(&ctx);
2152 	if (tctx->tlsext_ticket_key_cb) {
2153 		unsigned char *nctick = (unsigned char *)etick;
2154 		int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
2155 		    &ctx, &hctx, 0);
2156 		if (rv < 0) {
2157 			EVP_CIPHER_CTX_cleanup(&ctx);
2158 			return -1;
2159 		}
2160 		if (rv == 0) {
2161 			EVP_CIPHER_CTX_cleanup(&ctx);
2162 			return 2;
2163 		}
2164 		if (rv == 2)
2165 			renew_ticket = 1;
2166 	} else {
2167 		/* Check key name matches */
2168 		if (timingsafe_memcmp(etick, tctx->tlsext_tick_key_name, 16))
2169 			return 2;
2170 		HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
2171 		    tlsext_tick_md(), NULL);
2172 		EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
2173 		    tctx->tlsext_tick_aes_key, etick + 16);
2174 	}
2175 	/* Attempt to process session ticket, first conduct sanity and
2176 	 * integrity checks on ticket.
2177 	 */
2178 	mlen = HMAC_size(&hctx);
2179 	if (mlen < 0) {
2180 		EVP_CIPHER_CTX_cleanup(&ctx);
2181 		return -1;
2182 	}
2183 	eticklen -= mlen;
2184 	/* Check HMAC of encrypted ticket */
2185 	HMAC_Update(&hctx, etick, eticklen);
2186 	HMAC_Final(&hctx, tick_hmac, NULL);
2187 	HMAC_CTX_cleanup(&hctx);
2188 	if (timingsafe_memcmp(tick_hmac, etick + eticklen, mlen)) {
2189 		EVP_CIPHER_CTX_cleanup(&ctx);
2190 		return 2;
2191 	}
2192 	/* Attempt to decrypt session data */
2193 	/* Move p after IV to start of encrypted ticket, update length */
2194 	p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2195 	eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2196 	sdec = malloc(eticklen);
2197 	if (!sdec) {
2198 		EVP_CIPHER_CTX_cleanup(&ctx);
2199 		return -1;
2200 	}
2201 	EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2202 	if (EVP_DecryptFinal_ex(&ctx, sdec + slen, &mlen) <= 0) {
2203 		free(sdec);
2204 		EVP_CIPHER_CTX_cleanup(&ctx);
2205 		return 2;
2206 	}
2207 	slen += mlen;
2208 	EVP_CIPHER_CTX_cleanup(&ctx);
2209 	p = sdec;
2210 
2211 	sess = d2i_SSL_SESSION(NULL, &p, slen);
2212 	free(sdec);
2213 	if (sess) {
2214 		/* The session ID, if non-empty, is used by some clients to
2215 		 * detect that the ticket has been accepted. So we copy it to
2216 		 * the session structure. If it is empty set length to zero
2217 		 * as required by standard.
2218 		 */
2219 		if (sesslen)
2220 			memcpy(sess->session_id, sess_id, sesslen);
2221 		sess->session_id_length = sesslen;
2222 		*psess = sess;
2223 		if (renew_ticket)
2224 			return 4;
2225 		else
2226 			return 3;
2227 	}
2228 	ERR_clear_error();
2229 	/* For session parse failure, indicate that we need to send a new
2230 	 * ticket. */
2231 	return 2;
2232 }
2233 
2234 /* Tables to translate from NIDs to TLS v1.2 ids */
2235 
2236 typedef struct {
2237 	int nid;
2238 	int id;
2239 } tls12_lookup;
2240 
2241 static tls12_lookup tls12_md[] = {
2242 	{NID_md5, TLSEXT_hash_md5},
2243 	{NID_sha1, TLSEXT_hash_sha1},
2244 	{NID_sha224, TLSEXT_hash_sha224},
2245 	{NID_sha256, TLSEXT_hash_sha256},
2246 	{NID_sha384, TLSEXT_hash_sha384},
2247 	{NID_sha512, TLSEXT_hash_sha512},
2248 	{NID_id_GostR3411_94, TLSEXT_hash_gost94},
2249 	{NID_id_tc26_gost3411_2012_256, TLSEXT_hash_streebog_256},
2250 	{NID_id_tc26_gost3411_2012_512, TLSEXT_hash_streebog_512}
2251 };
2252 
2253 static tls12_lookup tls12_sig[] = {
2254 	{EVP_PKEY_RSA, TLSEXT_signature_rsa},
2255 	{EVP_PKEY_DSA, TLSEXT_signature_dsa},
2256 	{EVP_PKEY_EC, TLSEXT_signature_ecdsa},
2257 	{EVP_PKEY_GOSTR01, TLSEXT_signature_gostr01},
2258 };
2259 
2260 static int
2261 tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2262 {
2263 	size_t i;
2264 	for (i = 0; i < tlen; i++) {
2265 		if (table[i].nid == nid)
2266 			return table[i].id;
2267 	}
2268 	return -1;
2269 }
2270 
2271 int
2272 tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
2273 {
2274 	int sig_id, md_id;
2275 	if (!md)
2276 		return 0;
2277 	md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2278 	    sizeof(tls12_md) / sizeof(tls12_lookup));
2279 	if (md_id == -1)
2280 		return 0;
2281 	sig_id = tls12_get_sigid(pk);
2282 	if (sig_id == -1)
2283 		return 0;
2284 	p[0] = (unsigned char)md_id;
2285 	p[1] = (unsigned char)sig_id;
2286 	return 1;
2287 }
2288 
2289 int
2290 tls12_get_sigid(const EVP_PKEY *pk)
2291 {
2292 	return tls12_find_id(pk->type, tls12_sig,
2293 	    sizeof(tls12_sig) / sizeof(tls12_lookup));
2294 }
2295 
2296 const EVP_MD *
2297 tls12_get_hash(unsigned char hash_alg)
2298 {
2299 	switch (hash_alg) {
2300 	case TLSEXT_hash_sha1:
2301 		return EVP_sha1();
2302 	case TLSEXT_hash_sha224:
2303 		return EVP_sha224();
2304 	case TLSEXT_hash_sha256:
2305 		return EVP_sha256();
2306 	case TLSEXT_hash_sha384:
2307 		return EVP_sha384();
2308 	case TLSEXT_hash_sha512:
2309 		return EVP_sha512();
2310 #ifndef OPENSSL_NO_GOST
2311 	case TLSEXT_hash_gost94:
2312 		return EVP_gostr341194();
2313 	case TLSEXT_hash_streebog_256:
2314 		return EVP_streebog256();
2315 	case TLSEXT_hash_streebog_512:
2316 		return EVP_streebog512();
2317 #endif
2318 	default:
2319 		return NULL;
2320 	}
2321 }
2322 
2323 /* Set preferred digest for each key type */
2324 
2325 int
2326 tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2327 {
2328 	int idx;
2329 	const EVP_MD *md;
2330 	CERT *c = s->cert;
2331 	CBS cbs;
2332 
2333 	/* Extension ignored for inappropriate versions */
2334 	if (!SSL_USE_SIGALGS(s))
2335 		return 1;
2336 
2337 	/* Should never happen */
2338 	if (!c || dsize < 0)
2339 		return 0;
2340 
2341 	CBS_init(&cbs, data, dsize);
2342 
2343 	c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
2344 	c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
2345 	c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
2346 	c->pkeys[SSL_PKEY_ECC].digest = NULL;
2347 	c->pkeys[SSL_PKEY_GOST01].digest = NULL;
2348 
2349 	while (CBS_len(&cbs) > 0) {
2350 		uint8_t hash_alg, sig_alg;
2351 
2352 		if (!CBS_get_u8(&cbs, &hash_alg) ||
2353 		    !CBS_get_u8(&cbs, &sig_alg)) {
2354 			/* Should never happen */
2355 			return 0;
2356 		}
2357 
2358 		switch (sig_alg) {
2359 		case TLSEXT_signature_rsa:
2360 			idx = SSL_PKEY_RSA_SIGN;
2361 			break;
2362 		case TLSEXT_signature_dsa:
2363 			idx = SSL_PKEY_DSA_SIGN;
2364 			break;
2365 		case TLSEXT_signature_ecdsa:
2366 			idx = SSL_PKEY_ECC;
2367 			break;
2368 		case TLSEXT_signature_gostr01:
2369 		case TLSEXT_signature_gostr12_256:
2370 		case TLSEXT_signature_gostr12_512:
2371 			idx = SSL_PKEY_GOST01;
2372 			break;
2373 		default:
2374 			continue;
2375 		}
2376 
2377 		if (c->pkeys[idx].digest == NULL) {
2378 			md = tls12_get_hash(hash_alg);
2379 			if (md) {
2380 				c->pkeys[idx].digest = md;
2381 				if (idx == SSL_PKEY_RSA_SIGN)
2382 					c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
2383 			}
2384 		}
2385 
2386 	}
2387 
2388 	/* Set any remaining keys to default values. NOTE: if alg is not
2389 	 * supported it stays as NULL.
2390 	 */
2391 	if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
2392 		c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
2393 	if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest) {
2394 		c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
2395 		c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
2396 	}
2397 	if (!c->pkeys[SSL_PKEY_ECC].digest)
2398 		c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
2399 #ifndef OPENSSL_NO_GOST
2400 	if (!c->pkeys[SSL_PKEY_GOST01].digest)
2401 		c->pkeys[SSL_PKEY_GOST01].digest = EVP_gostr341194();
2402 #endif
2403 	return 1;
2404 }
2405