blob: 726ec51f498c1bc29442b4503ebff3b2b0dcc4fb [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.]
56 */
57/* ====================================================================
58 * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
59 *
60 * Redistribution and use in source and binary forms, with or without
61 * modification, are permitted provided that the following conditions
62 * are met:
63 *
64 * 1. Redistributions of source code must retain the above copyright
65 * notice, this list of conditions and the following disclaimer.
66 *
67 * 2. Redistributions in binary form must reproduce the above copyright
68 * notice, this list of conditions and the following disclaimer in
69 * the documentation and/or other materials provided with the
70 * distribution.
71 *
72 * 3. All advertising materials mentioning features or use of this
73 * software must display the following acknowledgment:
74 * "This product includes software developed by the OpenSSL Project
75 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76 *
77 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78 * endorse or promote products derived from this software without
79 * prior written permission. For written permission, please contact
80 * openssl-core@openssl.org.
81 *
82 * 5. Products derived from this software may not be called "OpenSSL"
83 * nor may "OpenSSL" appear in their names without prior written
84 * permission of the OpenSSL Project.
85 *
86 * 6. Redistributions of any form whatsoever must retain the following
87 * acknowledgment:
88 * "This product includes software developed by the OpenSSL Project
89 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90 *
91 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
95 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102 * OF THE POSSIBILITY OF SUCH DAMAGE.
103 * ====================================================================
104 *
105 * This product includes cryptographic software written by Eric Young
106 * (eay@cryptsoft.com). This product includes software written by Tim
107 * Hudson (tjh@cryptsoft.com). */
108
109#include <stdio.h>
110#include <assert.h>
111
112#include <openssl/evp.h>
113#include <openssl/hmac.h>
114#include <openssl/mem.h>
115#include <openssl/obj.h>
116#include <openssl/rand.h>
117
118#include "ssl_locl.h"
119#ifndef OPENSSL_NO_TLSEXT
120static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
121 const unsigned char *sess_id, int sesslen,
122 SSL_SESSION **psess);
123static int ssl_check_clienthello_tlsext_early(SSL *s);
124int ssl_check_serverhello_tlsext(SSL *s);
125#endif
126
127SSL3_ENC_METHOD TLSv1_enc_data={
128 tls1_enc,
129 tls1_mac,
130 tls1_setup_key_block,
131 tls1_generate_master_secret,
132 tls1_change_cipher_state,
133 tls1_final_finish_mac,
134 TLS1_FINISH_MAC_LENGTH,
135 tls1_cert_verify_mac,
136 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
137 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
138 tls1_alert_code,
139 tls1_export_keying_material,
140 0,
141 SSL3_HM_HEADER_LENGTH,
142 ssl3_set_handshake_header,
143 ssl3_handshake_write
144 };
145
146SSL3_ENC_METHOD TLSv1_1_enc_data={
147 tls1_enc,
148 tls1_mac,
149 tls1_setup_key_block,
150 tls1_generate_master_secret,
151 tls1_change_cipher_state,
152 tls1_final_finish_mac,
153 TLS1_FINISH_MAC_LENGTH,
154 tls1_cert_verify_mac,
155 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
156 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
157 tls1_alert_code,
158 tls1_export_keying_material,
159 SSL_ENC_FLAG_EXPLICIT_IV,
160 SSL3_HM_HEADER_LENGTH,
161 ssl3_set_handshake_header,
162 ssl3_handshake_write
163 };
164
165SSL3_ENC_METHOD TLSv1_2_enc_data={
166 tls1_enc,
167 tls1_mac,
168 tls1_setup_key_block,
169 tls1_generate_master_secret,
170 tls1_change_cipher_state,
171 tls1_final_finish_mac,
172 TLS1_FINISH_MAC_LENGTH,
173 tls1_cert_verify_mac,
174 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
175 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
176 tls1_alert_code,
177 tls1_export_keying_material,
178 SSL_ENC_FLAG_EXPLICIT_IV|SSL_ENC_FLAG_SIGALGS|SSL_ENC_FLAG_SHA256_PRF
179 |SSL_ENC_FLAG_TLS1_2_CIPHERS,
180 SSL3_HM_HEADER_LENGTH,
181 ssl3_set_handshake_header,
182 ssl3_handshake_write
183 };
184
185long tls1_default_timeout(void)
186 {
187 /* 2 hours, the 24 hours mentioned in the TLSv1 spec
188 * is way too long for http, the cache would over fill */
189 return(60*60*2);
190 }
191
192int tls1_new(SSL *s)
193 {
194 if (!ssl3_new(s)) return(0);
195 s->method->ssl_clear(s);
196 return(1);
197 }
198
199void tls1_free(SSL *s)
200 {
201#ifndef OPENSSL_NO_TLSEXT
202 if (s->tlsext_session_ticket)
203 {
204 OPENSSL_free(s->tlsext_session_ticket);
205 }
206#endif /* OPENSSL_NO_TLSEXT */
207 ssl3_free(s);
208 }
209
210void tls1_clear(SSL *s)
211 {
212 ssl3_clear(s);
213 s->version = s->method->version;
214 }
215
216#ifndef OPENSSL_NO_EC
217
218static int nid_list[] =
219 {
220 NID_sect163k1, /* sect163k1 (1) */
221 NID_sect163r1, /* sect163r1 (2) */
222 NID_sect163r2, /* sect163r2 (3) */
223 NID_sect193r1, /* sect193r1 (4) */
224 NID_sect193r2, /* sect193r2 (5) */
225 NID_sect233k1, /* sect233k1 (6) */
226 NID_sect233r1, /* sect233r1 (7) */
227 NID_sect239k1, /* sect239k1 (8) */
228 NID_sect283k1, /* sect283k1 (9) */
229 NID_sect283r1, /* sect283r1 (10) */
230 NID_sect409k1, /* sect409k1 (11) */
231 NID_sect409r1, /* sect409r1 (12) */
232 NID_sect571k1, /* sect571k1 (13) */
233 NID_sect571r1, /* sect571r1 (14) */
234 NID_secp160k1, /* secp160k1 (15) */
235 NID_secp160r1, /* secp160r1 (16) */
236 NID_secp160r2, /* secp160r2 (17) */
237 NID_secp192k1, /* secp192k1 (18) */
238 NID_X9_62_prime192v1, /* secp192r1 (19) */
239 NID_secp224k1, /* secp224k1 (20) */
240 NID_secp224r1, /* secp224r1 (21) */
241 NID_secp256k1, /* secp256k1 (22) */
242 NID_X9_62_prime256v1, /* secp256r1 (23) */
243 NID_secp384r1, /* secp384r1 (24) */
244 NID_secp521r1, /* secp521r1 (25) */
245 NID_brainpoolP256r1, /* brainpoolP256r1 (26) */
246 NID_brainpoolP384r1, /* brainpoolP384r1 (27) */
247 NID_brainpoolP512r1 /* brainpool512r1 (28) */
248 };
249
250
251static const unsigned char ecformats_default[] =
252 {
253 TLSEXT_ECPOINTFORMAT_uncompressed,
254 TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime,
255 TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2
256 };
257
258static const unsigned char eccurves_default[] =
259 {
260 0,14, /* sect571r1 (14) */
261 0,13, /* sect571k1 (13) */
262 0,25, /* secp521r1 (25) */
263 0,28, /* brainpool512r1 (28) */
264 0,11, /* sect409k1 (11) */
265 0,12, /* sect409r1 (12) */
266 0,27, /* brainpoolP384r1 (27) */
267 0,24, /* secp384r1 (24) */
268 0,9, /* sect283k1 (9) */
269 0,10, /* sect283r1 (10) */
270 0,26, /* brainpoolP256r1 (26) */
271 0,22, /* secp256k1 (22) */
272 0,23, /* secp256r1 (23) */
273 0,8, /* sect239k1 (8) */
274 0,6, /* sect233k1 (6) */
275 0,7, /* sect233r1 (7) */
276 0,20, /* secp224k1 (20) */
277 0,21, /* secp224r1 (21) */
278 0,4, /* sect193r1 (4) */
279 0,5, /* sect193r2 (5) */
280 0,18, /* secp192k1 (18) */
281 0,19, /* secp192r1 (19) */
282 0,1, /* sect163k1 (1) */
283 0,2, /* sect163r1 (2) */
284 0,3, /* sect163r2 (3) */
285 0,15, /* secp160k1 (15) */
286 0,16, /* secp160r1 (16) */
287 0,17, /* secp160r2 (17) */
288 };
289
290static const unsigned char suiteb_curves[] =
291 {
292 0, TLSEXT_curve_P_256,
293 0, TLSEXT_curve_P_384
294 };
295
296int tls1_ec_curve_id2nid(int curve_id)
297 {
298 /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
299 if ((curve_id < 1) || ((unsigned int)curve_id >
300 sizeof(nid_list)/sizeof(nid_list[0])))
301 return 0;
302 return nid_list[curve_id-1];
303 }
304
305int tls1_ec_nid2curve_id(int nid)
306 {
307 /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
308 switch (nid)
309 {
310 case NID_sect163k1: /* sect163k1 (1) */
311 return 1;
312 case NID_sect163r1: /* sect163r1 (2) */
313 return 2;
314 case NID_sect163r2: /* sect163r2 (3) */
315 return 3;
316 case NID_sect193r1: /* sect193r1 (4) */
317 return 4;
318 case NID_sect193r2: /* sect193r2 (5) */
319 return 5;
320 case NID_sect233k1: /* sect233k1 (6) */
321 return 6;
322 case NID_sect233r1: /* sect233r1 (7) */
323 return 7;
324 case NID_sect239k1: /* sect239k1 (8) */
325 return 8;
326 case NID_sect283k1: /* sect283k1 (9) */
327 return 9;
328 case NID_sect283r1: /* sect283r1 (10) */
329 return 10;
330 case NID_sect409k1: /* sect409k1 (11) */
331 return 11;
332 case NID_sect409r1: /* sect409r1 (12) */
333 return 12;
334 case NID_sect571k1: /* sect571k1 (13) */
335 return 13;
336 case NID_sect571r1: /* sect571r1 (14) */
337 return 14;
338 case NID_secp160k1: /* secp160k1 (15) */
339 return 15;
340 case NID_secp160r1: /* secp160r1 (16) */
341 return 16;
342 case NID_secp160r2: /* secp160r2 (17) */
343 return 17;
344 case NID_secp192k1: /* secp192k1 (18) */
345 return 18;
346 case NID_X9_62_prime192v1: /* secp192r1 (19) */
347 return 19;
348 case NID_secp224k1: /* secp224k1 (20) */
349 return 20;
350 case NID_secp224r1: /* secp224r1 (21) */
351 return 21;
352 case NID_secp256k1: /* secp256k1 (22) */
353 return 22;
354 case NID_X9_62_prime256v1: /* secp256r1 (23) */
355 return 23;
356 case NID_secp384r1: /* secp384r1 (24) */
357 return 24;
358 case NID_secp521r1: /* secp521r1 (25) */
359 return 25;
360 case NID_brainpoolP256r1: /* brainpoolP256r1 (26) */
361 return 26;
362 case NID_brainpoolP384r1: /* brainpoolP384r1 (27) */
363 return 27;
364 case NID_brainpoolP512r1: /* brainpool512r1 (28) */
365 return 28;
366 default:
367 return 0;
368 }
369 }
370/* Get curves list, if "sess" is set return client curves otherwise
371 * preferred list
372 */
373static void tls1_get_curvelist(SSL *s, int sess,
374 const unsigned char **pcurves,
375 size_t *pcurveslen)
376 {
377 if (sess)
378 {
379 *pcurves = s->session->tlsext_ellipticcurvelist;
380 *pcurveslen = s->session->tlsext_ellipticcurvelist_length;
381 return;
382 }
383 /* For Suite B mode only include P-256, P-384 */
384 switch (tls1_suiteb(s))
385 {
386 case SSL_CERT_FLAG_SUITEB_128_LOS:
387 *pcurves = suiteb_curves;
388 *pcurveslen = sizeof(suiteb_curves);
389 break;
390
391 case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
392 *pcurves = suiteb_curves;
393 *pcurveslen = 2;
394 break;
395
396 case SSL_CERT_FLAG_SUITEB_192_LOS:
397 *pcurves = suiteb_curves + 2;
398 *pcurveslen = 2;
399 break;
400 default:
401 *pcurves = s->tlsext_ellipticcurvelist;
402 *pcurveslen = s->tlsext_ellipticcurvelist_length;
403 }
404 if (!*pcurves)
405 {
406 *pcurves = eccurves_default;
407 *pcurveslen = sizeof(eccurves_default);
408 }
409 }
410/* Check a curve is one of our preferences */
411int tls1_check_curve(SSL *s, const unsigned char *p, size_t len)
412 {
413 const unsigned char *curves;
414 size_t curveslen, i;
415 unsigned int suiteb_flags = tls1_suiteb(s);
416 if (len != 3 || p[0] != NAMED_CURVE_TYPE)
417 return 0;
418 /* Check curve matches Suite B preferences */
419 if (suiteb_flags)
420 {
421 unsigned long cid = s->s3->tmp.new_cipher->id;
422 if (p[1])
423 return 0;
424 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
425 {
426 if (p[2] != TLSEXT_curve_P_256)
427 return 0;
428 }
429 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
430 {
431 if (p[2] != TLSEXT_curve_P_384)
432 return 0;
433 }
434 else /* Should never happen */
435 return 0;
436 }
437 tls1_get_curvelist(s, 0, &curves, &curveslen);
438 for (i = 0; i < curveslen; i += 2, curves += 2)
439 {
440 if (p[1] == curves[0] && p[2] == curves[1])
441 return 1;
442 }
443 return 0;
444 }
445
446/* Return nth shared curve. If nmatch == -1 return number of
447 * matches. For nmatch == -2 return the NID of the curve to use for
448 * an EC tmp key.
449 */
450
451int tls1_shared_curve(SSL *s, int nmatch)
452 {
453 const unsigned char *pref, *supp;
454 size_t preflen, supplen, i, j;
455 int k;
456 /* Can't do anything on client side */
457 if (s->server == 0)
458 return -1;
459 if (nmatch == -2)
460 {
461 if (tls1_suiteb(s))
462 {
463 /* For Suite B ciphersuite determines curve: we
464 * already know these are acceptable due to previous
465 * checks.
466 */
467 unsigned long cid = s->s3->tmp.new_cipher->id;
468 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
469 return NID_X9_62_prime256v1; /* P-256 */
470 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
471 return NID_secp384r1; /* P-384 */
472 /* Should never happen */
473 return NID_undef;
474 }
475 /* If not Suite B just return first preference shared curve */
476 nmatch = 0;
477 }
478 tls1_get_curvelist(s, !!(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE),
479 &supp, &supplen);
480 tls1_get_curvelist(s, !(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE),
481 &pref, &preflen);
482 preflen /= 2;
483 supplen /= 2;
484 k = 0;
485 for (i = 0; i < preflen; i++, pref+=2)
486 {
487 const unsigned char *tsupp = supp;
488 for (j = 0; j < supplen; j++, tsupp+=2)
489 {
490 if (pref[0] == tsupp[0] && pref[1] == tsupp[1])
491 {
492 if (nmatch == k)
493 {
494 int id = (pref[0] << 8) | pref[1];
495 return tls1_ec_curve_id2nid(id);
496 }
497 k++;
498 }
499 }
500 }
501 if (nmatch == -1)
502 return k;
503 return 0;
504 }
505
506int tls1_set_curves(unsigned char **pext, size_t *pextlen,
507 int *curves, size_t ncurves)
508 {
509 unsigned char *clist, *p;
510 size_t i;
511 /* Bitmap of curves included to detect duplicates: only works
512 * while curve ids < 32
513 */
514 unsigned long dup_list = 0;
515 clist = OPENSSL_malloc(ncurves * 2);
516 if (!clist)
517 return 0;
518 for (i = 0, p = clist; i < ncurves; i++)
519 {
520 unsigned long idmask;
521 int id;
522 id = tls1_ec_nid2curve_id(curves[i]);
523 idmask = 1L << id;
524 if (!id || (dup_list & idmask))
525 {
526 OPENSSL_free(clist);
527 return 0;
528 }
529 dup_list |= idmask;
530 s2n(id, p);
531 }
532 if (*pext)
533 OPENSSL_free(*pext);
534 *pext = clist;
535 *pextlen = ncurves * 2;
536 return 1;
537 }
538
539/* TODO(fork): remove */
540#if 0
541#define MAX_CURVELIST 28
542
543typedef struct
544 {
545 size_t nidcnt;
546 int nid_arr[MAX_CURVELIST];
547 } nid_cb_st;
548
549static int nid_cb(const char *elem, int len, void *arg)
550 {
551 nid_cb_st *narg = arg;
552 size_t i;
553 int nid;
554 char etmp[20];
555 if (narg->nidcnt == MAX_CURVELIST)
556 return 0;
557 if (len > (int)(sizeof(etmp) - 1))
558 return 0;
559 memcpy(etmp, elem, len);
560 etmp[len] = 0;
561 nid = EC_curve_nist2nid(etmp);
562 if (nid == NID_undef)
563 nid = OBJ_sn2nid(etmp);
564 if (nid == NID_undef)
565 nid = OBJ_ln2nid(etmp);
566 if (nid == NID_undef)
567 return 0;
568 for (i = 0; i < narg->nidcnt; i++)
569 if (narg->nid_arr[i] == nid)
570 return 0;
571 narg->nid_arr[narg->nidcnt++] = nid;
572 return 1;
573 }
574/* Set curves based on a colon separate list */
575int tls1_set_curves_list(unsigned char **pext, size_t *pextlen,
576 const char *str)
577 {
578 nid_cb_st ncb;
579 ncb.nidcnt = 0;
580 if (!CONF_parse_list(str, ':', 1, nid_cb, &ncb))
581 return 0;
582 if (pext == NULL)
583 return 1;
584 return tls1_set_curves(pext, pextlen, ncb.nid_arr, ncb.nidcnt);
585 }
586#endif
587
588/* For an EC key set TLS id and required compression based on parameters */
589static int tls1_set_ec_id(unsigned char *curve_id, unsigned char *comp_id,
590 EC_KEY *ec)
591 {
592 int is_prime = 1, id;
593 const EC_GROUP *grp;
594 if (!ec)
595 return 0;
596
597 /* TODO(fork): remove. All curves are prime now. */
598 grp = EC_KEY_get0_group(ec);
599 if (!grp)
600 return 0;
601#if 0
602 /* Determine if it is a prime field */
603 meth = EC_GROUP_method_of(grp);
604 if (!meth)
605 return 0;
606 if (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field)
607 is_prime = 1;
608 else
609 is_prime = 0;
610#endif
611
612 /* Determine curve ID */
613 id = EC_GROUP_get_curve_name(grp);
614 id = tls1_ec_nid2curve_id(id);
615 /* If we have an ID set it, otherwise set arbitrary explicit curve */
616 if (id)
617 {
618 curve_id[0] = 0;
619 curve_id[1] = (unsigned char)id;
620 }
621 else
622 {
623 curve_id[0] = 0xff;
624 if (is_prime)
625 curve_id[1] = 0x01;
626 else
627 curve_id[1] = 0x02;
628 }
629 if (comp_id)
630 {
631 if (EC_KEY_get0_public_key(ec) == NULL)
632 return 0;
633 if (EC_KEY_get_conv_form(ec) == POINT_CONVERSION_COMPRESSED)
634 {
635 if (is_prime)
636 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
637 else
638 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
639 }
640 else
641 *comp_id = TLSEXT_ECPOINTFORMAT_uncompressed;
642 }
643 return 1;
644 }
645/* Check an EC key is compatible with extensions */
646static int tls1_check_ec_key(SSL *s,
647 unsigned char *curve_id, unsigned char *comp_id)
648 {
649 const unsigned char *p;
650 size_t plen, i;
651 int j;
652 /* If point formats extension present check it, otherwise everything
653 * is supported (see RFC4492).
654 */
655 if (comp_id && s->session->tlsext_ecpointformatlist)
656 {
657 p = s->session->tlsext_ecpointformatlist;
658 plen = s->session->tlsext_ecpointformatlist_length;
659 for (i = 0; i < plen; i++, p++)
660 {
661 if (*comp_id == *p)
662 break;
663 }
664 if (i == plen)
665 return 0;
666 }
667 if (!curve_id)
668 return 1;
669 /* Check curve is consistent with client and server preferences */
670 for (j = 0; j <= 1; j++)
671 {
672 tls1_get_curvelist(s, j, &p, &plen);
673 for (i = 0; i < plen; i+=2, p+=2)
674 {
675 if (p[0] == curve_id[0] && p[1] == curve_id[1])
676 break;
677 }
678 if (i == plen)
679 return 0;
680 /* For clients can only check sent curve list */
681 if (!s->server)
682 return 1;
683 }
684 return 1;
685 }
686
687static void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
688 size_t *pformatslen)
689 {
690 /* If we have a custom point format list use it otherwise
691 * use default */
692 if (s->tlsext_ecpointformatlist)
693 {
694 *pformats = s->tlsext_ecpointformatlist;
695 *pformatslen = s->tlsext_ecpointformatlist_length;
696 }
697 else
698 {
699 *pformats = ecformats_default;
700 /* For Suite B we don't support char2 fields */
701 if (tls1_suiteb(s))
702 *pformatslen = sizeof(ecformats_default) - 1;
703 else
704 *pformatslen = sizeof(ecformats_default);
705 }
706 }
707
708/* Check cert parameters compatible with extensions: currently just checks
709 * EC certificates have compatible curves and compression.
710 */
711static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
712 {
713 unsigned char comp_id, curve_id[2];
714 EVP_PKEY *pkey;
715 int rv;
716 pkey = X509_get_pubkey(x);
717 if (!pkey)
718 return 0;
719 /* If not EC nothing to do */
720 if (pkey->type != EVP_PKEY_EC)
721 {
722 EVP_PKEY_free(pkey);
723 return 1;
724 }
725 rv = tls1_set_ec_id(curve_id, &comp_id, pkey->pkey.ec);
726 EVP_PKEY_free(pkey);
727 if (!rv)
728 return 0;
729 /* Can't check curve_id for client certs as we don't have a
730 * supported curves extension.
731 */
732 rv = tls1_check_ec_key(s, s->server ? curve_id : NULL, &comp_id);
733 if (!rv)
734 return 0;
735 /* Special case for suite B. We *MUST* sign using SHA256+P-256 or
736 * SHA384+P-384, adjust digest if necessary.
737 */
738 if (set_ee_md && tls1_suiteb(s))
739 {
740 int check_md;
741 size_t i;
742 CERT *c = s->cert;
743 if (curve_id[0])
744 return 0;
745 /* Check to see we have necessary signing algorithm */
746 if (curve_id[1] == TLSEXT_curve_P_256)
747 check_md = NID_ecdsa_with_SHA256;
748 else if (curve_id[1] == TLSEXT_curve_P_384)
749 check_md = NID_ecdsa_with_SHA384;
750 else
751 return 0; /* Should never happen */
752 for (i = 0; i < c->shared_sigalgslen; i++)
753 if (check_md == c->shared_sigalgs[i].signandhash_nid)
754 break;
755 if (i == c->shared_sigalgslen)
756 return 0;
757 if (set_ee_md == 2)
758 {
759 if (check_md == NID_ecdsa_with_SHA256)
760 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha256();
761 else
762 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha384();
763 }
764 }
765 return rv;
766 }
767/* Check EC temporary key is compatible with client extensions */
768int tls1_check_ec_tmp_key(SSL *s, unsigned long cid)
769 {
770 unsigned char curve_id[2];
771 EC_KEY *ec = s->cert->ecdh_tmp;
772#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
773 /* Allow any curve: not just those peer supports */
774 if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
775 return 1;
776#endif
777 /* If Suite B, AES128 MUST use P-256 and AES256 MUST use P-384,
778 * no other curves permitted.
779 */
780 if (tls1_suiteb(s))
781 {
782 /* Curve to check determined by ciphersuite */
783 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
784 curve_id[1] = TLSEXT_curve_P_256;
785 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
786 curve_id[1] = TLSEXT_curve_P_384;
787 else
788 return 0;
789 curve_id[0] = 0;
790 /* Check this curve is acceptable */
791 if (!tls1_check_ec_key(s, curve_id, NULL))
792 return 0;
793 /* If auto or setting curve from callback assume OK */
794 if (s->cert->ecdh_tmp_auto || s->cert->ecdh_tmp_cb)
795 return 1;
796 /* Otherwise check curve is acceptable */
797 else
798 {
799 unsigned char curve_tmp[2];
800 if (!ec)
801 return 0;
802 if (!tls1_set_ec_id(curve_tmp, NULL, ec))
803 return 0;
804 if (!curve_tmp[0] || curve_tmp[1] == curve_id[1])
805 return 1;
806 return 0;
807 }
808
809 }
810 if (s->cert->ecdh_tmp_auto)
811 {
812 /* Need a shared curve */
813 if (tls1_shared_curve(s, 0))
814 return 1;
815 else return 0;
816 }
817 if (!ec)
818 {
819 if (s->cert->ecdh_tmp_cb)
820 return 1;
821 else
822 return 0;
823 }
824 if (!tls1_set_ec_id(curve_id, NULL, ec))
825 return 0;
826/* Set this to allow use of invalid curves for testing */
827#if 0
828 return 1;
829#else
830 return tls1_check_ec_key(s, curve_id, NULL);
831#endif
832 }
833
834#else
835
836static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
837 {
838 return 1;
839 }
840
841#endif /* OPENSSL_NO_EC */
842
843#ifndef OPENSSL_NO_TLSEXT
844
845/* List of supported signature algorithms and hashes. Should make this
846 * customisable at some point, for now include everything we support.
847 */
848
849#ifdef OPENSSL_NO_RSA
850#define tlsext_sigalg_rsa(md) /* */
851#else
852#define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
853#endif
854
855#ifdef OPENSSL_NO_DSA
856#define tlsext_sigalg_dsa(md) /* */
857#else
858#define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
859#endif
860
861#ifdef OPENSSL_NO_ECDSA
862#define tlsext_sigalg_ecdsa(md) /* */
863#else
864#define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
865#endif
866
867#define tlsext_sigalg(md) \
868 tlsext_sigalg_rsa(md) \
869 tlsext_sigalg_dsa(md) \
870 tlsext_sigalg_ecdsa(md)
871
872static unsigned char tls12_sigalgs[] = {
873#ifndef OPENSSL_NO_SHA512
874 tlsext_sigalg(TLSEXT_hash_sha512)
875 tlsext_sigalg(TLSEXT_hash_sha384)
876#endif
877#ifndef OPENSSL_NO_SHA256
878 tlsext_sigalg(TLSEXT_hash_sha256)
879 tlsext_sigalg(TLSEXT_hash_sha224)
880#endif
881#ifndef OPENSSL_NO_SHA
882 tlsext_sigalg(TLSEXT_hash_sha1)
883#endif
884};
885#ifndef OPENSSL_NO_ECDSA
886static unsigned char suiteb_sigalgs[] = {
887 tlsext_sigalg_ecdsa(TLSEXT_hash_sha256)
888 tlsext_sigalg_ecdsa(TLSEXT_hash_sha384)
889};
890#endif
891size_t tls12_get_psigalgs(SSL *s, const unsigned char **psigs)
892 {
893 /* If Suite B mode use Suite B sigalgs only, ignore any other
894 * preferences.
895 */
896#ifndef OPENSSL_NO_EC
897 switch (tls1_suiteb(s))
898 {
899 case SSL_CERT_FLAG_SUITEB_128_LOS:
900 *psigs = suiteb_sigalgs;
901 return sizeof(suiteb_sigalgs);
902
903 case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
904 *psigs = suiteb_sigalgs;
905 return 2;
906
907 case SSL_CERT_FLAG_SUITEB_192_LOS:
908 *psigs = suiteb_sigalgs + 2;
909 return 2;
910 }
911#endif
912 /* If server use client authentication sigalgs if not NULL */
913 if (s->server && s->cert->client_sigalgs)
914 {
915 *psigs = s->cert->client_sigalgs;
916 return s->cert->client_sigalgslen;
917 }
918 else if (s->cert->conf_sigalgs)
919 {
920 *psigs = s->cert->conf_sigalgs;
921 return s->cert->conf_sigalgslen;
922 }
923 else
924 {
925 *psigs = tls12_sigalgs;
926 return sizeof(tls12_sigalgs);
927 }
928 }
929/* Check signature algorithm is consistent with sent supported signature
930 * algorithms and if so return relevant digest.
931 */
932int tls12_check_peer_sigalg(const EVP_MD **pmd, SSL *s,
933 const unsigned char *sig, EVP_PKEY *pkey)
934 {
935 const unsigned char *sent_sigs;
936 size_t sent_sigslen, i;
937 int sigalg = tls12_get_sigid(pkey);
938 /* Should never happen */
939 if (sigalg == -1)
940 return -1;
941 /* Check key type is consistent with signature */
942 if (sigalg != (int)sig[1])
943 {
944 OPENSSL_PUT_ERROR(SSL, tls12_check_peer_sigalg, SSL_R_WRONG_SIGNATURE_TYPE);
945 return 0;
946 }
947#ifndef OPENSSL_NO_EC
948 if (pkey->type == EVP_PKEY_EC)
949 {
950 unsigned char curve_id[2], comp_id;
951 /* Check compression and curve matches extensions */
952 if (!tls1_set_ec_id(curve_id, &comp_id, pkey->pkey.ec))
953 return 0;
954 if (!s->server && !tls1_check_ec_key(s, curve_id, &comp_id))
955 {
956 OPENSSL_PUT_ERROR(SSL, tls12_check_peer_sigalg, SSL_R_WRONG_CURVE);
957 return 0;
958 }
959 /* If Suite B only P-384+SHA384 or P-256+SHA-256 allowed */
960 if (tls1_suiteb(s))
961 {
962 if (curve_id[0])
963 return 0;
964 if (curve_id[1] == TLSEXT_curve_P_256)
965 {
966 if (sig[0] != TLSEXT_hash_sha256)
967 {
968 OPENSSL_PUT_ERROR(SSL, tls12_check_peer_sigalg, SSL_R_ILLEGAL_SUITEB_DIGEST);
969 return 0;
970 }
971 }
972 else if (curve_id[1] == TLSEXT_curve_P_384)
973 {
974 if (sig[0] != TLSEXT_hash_sha384)
975 {
976 OPENSSL_PUT_ERROR(SSL, tls12_check_peer_sigalg, SSL_R_ILLEGAL_SUITEB_DIGEST);
977 return 0;
978 }
979 }
980 else
981 return 0;
982 }
983 }
984 else if (tls1_suiteb(s))
985 return 0;
986#endif
987
988 /* Check signature matches a type we sent */
989 sent_sigslen = tls12_get_psigalgs(s, &sent_sigs);
990 for (i = 0; i < sent_sigslen; i+=2, sent_sigs+=2)
991 {
992 if (sig[0] == sent_sigs[0] && sig[1] == sent_sigs[1])
993 break;
994 }
995 /* Allow fallback to SHA1 if not strict mode */
996 if (i == sent_sigslen && (sig[0] != TLSEXT_hash_sha1 || s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT))
997 {
998 OPENSSL_PUT_ERROR(SSL, tls12_check_peer_sigalg, SSL_R_WRONG_SIGNATURE_TYPE);
999 return 0;
1000 }
1001 *pmd = tls12_get_hash(sig[0]);
1002 if (*pmd == NULL)
1003 {
1004 OPENSSL_PUT_ERROR(SSL, tls12_check_peer_sigalg, SSL_R_UNKNOWN_DIGEST);
1005 return 0;
1006 }
1007 /* Store the digest used so applications can retrieve it if they
1008 * wish.
1009 */
1010 if (s->session && s->session->sess_cert)
1011 s->session->sess_cert->peer_key->digest = *pmd;
1012 return 1;
1013 }
1014/* Get a mask of disabled algorithms: an algorithm is disabled
1015 * if it isn't supported or doesn't appear in supported signature
1016 * algorithms. Unlike ssl_cipher_get_disabled this applies to a specific
1017 * session and not global settings.
1018 *
1019 */
1020void ssl_set_client_disabled(SSL *s)
1021 {
1022 CERT *c = s->cert;
1023 const unsigned char *sigalgs;
1024 size_t i, sigalgslen;
1025 int have_rsa = 0, have_dsa = 0, have_ecdsa = 0;
1026 c->mask_a = 0;
1027 c->mask_k = 0;
1028 /* Don't allow TLS 1.2 only ciphers if we don't suppport them */
1029 if (!SSL_CLIENT_USE_TLS1_2_CIPHERS(s))
1030 c->mask_ssl = SSL_TLSV1_2;
1031 else
1032 c->mask_ssl = 0;
1033 /* Now go through all signature algorithms seeing if we support
1034 * any for RSA, DSA, ECDSA. Do this for all versions not just
1035 * TLS 1.2.
1036 */
1037 sigalgslen = tls12_get_psigalgs(s, &sigalgs);
1038 for (i = 0; i < sigalgslen; i += 2, sigalgs += 2)
1039 {
1040 switch(sigalgs[1])
1041 {
1042#ifndef OPENSSL_NO_RSA
1043 case TLSEXT_signature_rsa:
1044 have_rsa = 1;
1045 break;
1046#endif
1047#ifndef OPENSSL_NO_DSA
1048 case TLSEXT_signature_dsa:
1049 have_dsa = 1;
1050 break;
1051#endif
1052#ifndef OPENSSL_NO_ECDSA
1053 case TLSEXT_signature_ecdsa:
1054 have_ecdsa = 1;
1055 break;
1056#endif
1057 }
1058 }
1059 /* Disable auth and static DH if we don't include any appropriate
1060 * signature algorithms.
1061 */
1062 if (!have_rsa)
1063 {
1064 c->mask_a |= SSL_aRSA;
1065 c->mask_k |= SSL_kDHr|SSL_kECDHr;
1066 }
1067 if (!have_dsa)
1068 {
1069 c->mask_a |= SSL_aDSS;
1070 c->mask_k |= SSL_kDHd;
1071 }
1072 if (!have_ecdsa)
1073 {
1074 c->mask_a |= SSL_aECDSA;
1075 c->mask_k |= SSL_kECDHe;
1076 }
1077#ifndef OPENSSL_NO_PSK
1078 /* with PSK there must be client callback set */
1079 if (!s->psk_client_callback)
1080 {
1081 c->mask_a |= SSL_aPSK;
1082 c->mask_k |= SSL_kPSK;
1083 }
1084#endif /* OPENSSL_NO_PSK */
1085 c->valid = 1;
1086 }
1087
1088/* byte_compare is a compare function for qsort(3) that compares bytes. */
1089static int byte_compare(const void *in_a, const void *in_b)
1090 {
1091 unsigned char a = *((const unsigned char*) in_a);
1092 unsigned char b = *((const unsigned char*) in_b);
1093
1094 if (a > b)
1095 return 1;
1096 else if (a < b)
1097 return -1;
1098 return 0;
1099}
1100
Adam Langleyb0c235e2014-06-20 12:00:00 -07001101/* header_len is the length of the ClientHello header written so far, used to
1102 * compute padding. It does not include the record header. Pass 0 if no padding
1103 * is to be done. */
1104unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned char *limit, size_t header_len)
Adam Langley95c29f32014-06-20 12:00:00 -07001105 {
1106 int extdatalen=0;
Adam Langleyb0c235e2014-06-20 12:00:00 -07001107 unsigned char *ret = buf;
1108 unsigned char *orig = buf;
Adam Langley95c29f32014-06-20 12:00:00 -07001109#ifndef OPENSSL_NO_EC
1110 /* See if we support any ECC ciphersuites */
1111 int using_ecc = 0;
1112 if (s->version >= TLS1_VERSION || SSL_IS_DTLS(s))
1113 {
1114 int i;
1115 unsigned long alg_k, alg_a;
1116 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1117
1118 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1119 {
1120 SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1121
1122 alg_k = c->algorithm_mkey;
1123 alg_a = c->algorithm_auth;
1124 if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)
1125 || (alg_a & SSL_aECDSA)))
1126 {
1127 using_ecc = 1;
1128 break;
1129 }
1130 }
1131 }
1132#endif
1133
1134 /* don't add extensions for SSLv3 unless doing secure renegotiation */
1135 if (s->client_version == SSL3_VERSION
1136 && !s->s3->send_connection_binding)
Adam Langleyb0c235e2014-06-20 12:00:00 -07001137 return orig;
Adam Langley95c29f32014-06-20 12:00:00 -07001138
1139 ret+=2;
1140
1141 if (ret>=limit) return NULL; /* this really never occurs, but ... */
1142
1143 if (s->tlsext_hostname != NULL)
1144 {
1145 /* Add TLS extension servername to the Client Hello message */
1146 unsigned long size_str;
1147 long lenmax;
1148
1149 /* check for enough space.
1150 4 for the servername type and entension length
1151 2 for servernamelist length
1152 1 for the hostname type
1153 2 for hostname length
1154 + hostname length
1155 */
1156
1157 if ((lenmax = limit - ret - 9) < 0
1158 || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
1159 return NULL;
1160
1161 /* extension type and length */
1162 s2n(TLSEXT_TYPE_server_name,ret);
1163 s2n(size_str+5,ret);
1164
1165 /* length of servername list */
1166 s2n(size_str+3,ret);
1167
1168 /* hostname type, length and hostname */
1169 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
1170 s2n(size_str,ret);
1171 memcpy(ret, s->tlsext_hostname, size_str);
1172 ret+=size_str;
1173 }
1174
1175 /* Add RI if renegotiating */
1176 if (s->renegotiate)
1177 {
1178 int el;
1179
1180 if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
1181 {
1182 OPENSSL_PUT_ERROR(SSL, ssl_add_clienthello_tlsext, ERR_R_INTERNAL_ERROR);
1183 return NULL;
1184 }
1185
Adam Langleyb0c235e2014-06-20 12:00:00 -07001186 if((limit - ret - 4 - el) < 0) return NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001187
1188 s2n(TLSEXT_TYPE_renegotiate,ret);
1189 s2n(el,ret);
1190
1191 if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
1192 {
1193 OPENSSL_PUT_ERROR(SSL, ssl_add_clienthello_tlsext, ERR_R_INTERNAL_ERROR);
1194 return NULL;
1195 }
1196
1197 ret += el;
1198 }
1199
1200
1201#ifndef OPENSSL_NO_EC
1202 if (using_ecc)
1203 {
1204 /* Add TLS extension ECPointFormats to the ClientHello message */
1205 long lenmax;
1206 const unsigned char *plist;
1207 size_t plistlen;
1208
1209 tls1_get_formatlist(s, &plist, &plistlen);
1210
1211 if ((lenmax = limit - ret - 5) < 0) return NULL;
1212 if (plistlen > (size_t)lenmax) return NULL;
1213 if (plistlen > 255)
1214 {
1215 OPENSSL_PUT_ERROR(SSL, ssl_add_clienthello_tlsext, ERR_R_INTERNAL_ERROR);
1216 return NULL;
1217 }
1218
1219 s2n(TLSEXT_TYPE_ec_point_formats,ret);
1220 s2n(plistlen + 1,ret);
1221 *(ret++) = (unsigned char)plistlen ;
1222 memcpy(ret, plist, plistlen);
1223 ret+=plistlen;
1224
1225 /* Add TLS extension EllipticCurves to the ClientHello message */
1226 plist = s->tlsext_ellipticcurvelist;
1227 tls1_get_curvelist(s, 0, &plist, &plistlen);
1228
1229 if ((lenmax = limit - ret - 6) < 0) return NULL;
1230 if (plistlen > (size_t)lenmax) return NULL;
1231 if (plistlen > 65532)
1232 {
1233 OPENSSL_PUT_ERROR(SSL, ssl_add_clienthello_tlsext, ERR_R_INTERNAL_ERROR);
1234 return NULL;
1235 }
1236
1237 s2n(TLSEXT_TYPE_elliptic_curves,ret);
1238 s2n(plistlen + 2, ret);
1239
1240 /* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
1241 * elliptic_curve_list, but the examples use two bytes.
1242 * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
1243 * resolves this to two bytes.
1244 */
1245 s2n(plistlen, ret);
1246 memcpy(ret, plist, plistlen);
1247 ret+=plistlen;
1248 }
1249#endif /* OPENSSL_NO_EC */
1250
1251 if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
1252 {
1253 int ticklen;
1254 if (!s->new_session && s->session && s->session->tlsext_tick)
1255 ticklen = s->session->tlsext_ticklen;
1256 else if (s->session && s->tlsext_session_ticket &&
1257 s->tlsext_session_ticket->data)
1258 {
1259 ticklen = s->tlsext_session_ticket->length;
1260 s->session->tlsext_tick = OPENSSL_malloc(ticklen);
1261 if (!s->session->tlsext_tick)
1262 return NULL;
1263 memcpy(s->session->tlsext_tick,
1264 s->tlsext_session_ticket->data,
1265 ticklen);
1266 s->session->tlsext_ticklen = ticklen;
1267 }
1268 else
1269 ticklen = 0;
1270 if (ticklen == 0 && s->tlsext_session_ticket &&
1271 s->tlsext_session_ticket->data == NULL)
1272 goto skip_ext;
1273 /* Check for enough room 2 for extension type, 2 for len
1274 * rest for ticket
1275 */
1276 if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
1277 s2n(TLSEXT_TYPE_session_ticket,ret);
1278 s2n(ticklen,ret);
1279 if (ticklen)
1280 {
1281 memcpy(ret, s->session->tlsext_tick, ticklen);
1282 ret += ticklen;
1283 }
1284 }
1285 skip_ext:
1286
1287 if (SSL_USE_SIGALGS(s))
1288 {
1289 size_t salglen;
1290 const unsigned char *salg;
1291 salglen = tls12_get_psigalgs(s, &salg);
1292 if ((size_t)(limit - ret) < salglen + 6)
1293 return NULL;
1294 s2n(TLSEXT_TYPE_signature_algorithms,ret);
1295 s2n(salglen + 2, ret);
1296 s2n(salglen, ret);
1297 memcpy(ret, salg, salglen);
1298 ret += salglen;
1299 }
1300
1301#ifdef TLSEXT_TYPE_opaque_prf_input
1302 if (s->s3->client_opaque_prf_input != NULL)
1303 {
1304 size_t col = s->s3->client_opaque_prf_input_len;
1305
1306 if ((long)(limit - ret - 6 - col < 0))
1307 return NULL;
1308 if (col > 0xFFFD) /* can't happen */
1309 return NULL;
1310
1311 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
1312 s2n(col + 2, ret);
1313 s2n(col, ret);
1314 memcpy(ret, s->s3->client_opaque_prf_input, col);
1315 ret += col;
1316 }
1317#endif
1318
1319 /* TODO(fork): we probably want OCSP stapling, but it currently pulls in a lot of code. */
1320#if 0
1321 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1322 {
1323 int i;
1324 long extlen, idlen, itmp;
1325 OCSP_RESPID *id;
1326
1327 idlen = 0;
1328 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
1329 {
1330 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
1331 itmp = i2d_OCSP_RESPID(id, NULL);
1332 if (itmp <= 0)
1333 return NULL;
1334 idlen += itmp + 2;
1335 }
1336
1337 if (s->tlsext_ocsp_exts)
1338 {
1339 extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
1340 if (extlen < 0)
1341 return NULL;
1342 }
1343 else
1344 extlen = 0;
1345
1346 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
1347 s2n(TLSEXT_TYPE_status_request, ret);
1348 if (extlen + idlen > 0xFFF0)
1349 return NULL;
1350 s2n(extlen + idlen + 5, ret);
1351 *(ret++) = TLSEXT_STATUSTYPE_ocsp;
1352 s2n(idlen, ret);
1353 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
1354 {
1355 /* save position of id len */
1356 unsigned char *q = ret;
1357 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
1358 /* skip over id len */
1359 ret += 2;
1360 itmp = i2d_OCSP_RESPID(id, &ret);
1361 /* write id len */
1362 s2n(itmp, q);
1363 }
1364 s2n(extlen, ret);
1365 if (extlen > 0)
1366 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
1367 }
1368#endif
1369
1370#ifndef OPENSSL_NO_HEARTBEATS
1371 /* Add Heartbeat extension */
1372 s2n(TLSEXT_TYPE_heartbeat,ret);
1373 s2n(1,ret);
1374 /* Set mode:
1375 * 1: peer may send requests
1376 * 2: peer not allowed to send requests
1377 */
1378 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
1379 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1380 else
1381 *(ret++) = SSL_TLSEXT_HB_ENABLED;
1382#endif
1383
1384#ifndef OPENSSL_NO_NEXTPROTONEG
1385 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
1386 {
1387 /* The client advertises an emtpy extension to indicate its
1388 * support for Next Protocol Negotiation */
1389 if (limit - ret - 4 < 0)
1390 return NULL;
1391 s2n(TLSEXT_TYPE_next_proto_neg,ret);
1392 s2n(0,ret);
1393 }
1394#endif
1395
1396 if (s->alpn_client_proto_list && !s->s3->tmp.finish_md_len)
1397 {
1398 if ((size_t)(limit - ret) < 6 + s->alpn_client_proto_list_len)
1399 return NULL;
1400 s2n(TLSEXT_TYPE_application_layer_protocol_negotiation,ret);
1401 s2n(2 + s->alpn_client_proto_list_len,ret);
1402 s2n(s->alpn_client_proto_list_len,ret);
1403 memcpy(ret, s->alpn_client_proto_list,
1404 s->alpn_client_proto_list_len);
1405 ret += s->alpn_client_proto_list_len;
1406 }
1407
Adam Langley1258b6a2014-06-20 12:00:00 -07001408 if (s->tlsext_channel_id_enabled)
1409 {
1410 /* The client advertises an emtpy extension to indicate its
1411 * support for Channel ID. */
1412 if (limit - ret - 4 < 0)
1413 return NULL;
1414 if (s->ctx->tlsext_channel_id_enabled_new)
1415 s2n(TLSEXT_TYPE_channel_id_new,ret);
1416 else
1417 s2n(TLSEXT_TYPE_channel_id,ret);
1418 s2n(0,ret);
1419 }
1420
Adam Langley95c29f32014-06-20 12:00:00 -07001421 if(SSL_get_srtp_profiles(s))
1422 {
1423 int el;
1424
1425 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
1426
Adam Langleyb0c235e2014-06-20 12:00:00 -07001427 if((limit - ret - 4 - el) < 0) return NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001428
1429 s2n(TLSEXT_TYPE_use_srtp,ret);
1430 s2n(el,ret);
1431
1432 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
1433 {
1434 OPENSSL_PUT_ERROR(SSL, ssl_add_clienthello_tlsext, ERR_R_INTERNAL_ERROR);
1435 return NULL;
1436 }
1437 ret += el;
1438 }
1439
1440 /* Add TLS extension Server_Authz_DataFormats to the ClientHello */
1441 /* 2 bytes for extension type */
1442 /* 2 bytes for extension length */
1443 /* 1 byte for the list length */
1444 /* 1 byte for the list (we only support audit proofs) */
1445 if (s->ctx->tlsext_authz_server_audit_proof_cb != NULL)
1446 {
1447 const unsigned short ext_len = 2;
1448 const unsigned char list_len = 1;
1449
1450 if (limit < ret + 6)
1451 return NULL;
1452
1453 s2n(TLSEXT_TYPE_server_authz, ret);
1454 /* Extension length: 2 bytes */
1455 s2n(ext_len, ret);
1456 *(ret++) = list_len;
1457 *(ret++) = TLSEXT_AUTHZDATAFORMAT_audit_proof;
1458 }
1459
1460 /* Add custom TLS Extensions to ClientHello */
1461 if (s->ctx->custom_cli_ext_records_count)
1462 {
1463 size_t i;
1464 custom_cli_ext_record* record;
1465
1466 for (i = 0; i < s->ctx->custom_cli_ext_records_count; i++)
1467 {
1468 const unsigned char* out = NULL;
1469 unsigned short outlen = 0;
1470
1471 record = &s->ctx->custom_cli_ext_records[i];
1472 /* NULL callback sends empty extension */
1473 /* -1 from callback omits extension */
1474 if (record->fn1)
1475 {
1476 int cb_retval = 0;
1477 cb_retval = record->fn1(s, record->ext_type,
1478 &out, &outlen,
1479 record->arg);
1480 if (cb_retval == 0)
1481 return NULL; /* error */
1482 if (cb_retval == -1)
1483 continue; /* skip this extension */
1484 }
1485 if (limit < ret + 4 + outlen)
1486 return NULL;
1487 s2n(record->ext_type, ret);
1488 s2n(outlen, ret);
1489 memcpy(ret, out, outlen);
1490 ret += outlen;
1491 }
1492 }
1493
1494#ifdef TLSEXT_TYPE_padding
1495 /* Add padding to workaround bugs in F5 terminators.
Adam Langleyb0c235e2014-06-20 12:00:00 -07001496 * See https://tools.ietf.org/html/draft-agl-tls-padding-03
Adam Langley95c29f32014-06-20 12:00:00 -07001497 *
1498 * NB: because this code works out the length of all existing
Adam Langleyb0c235e2014-06-20 12:00:00 -07001499 * extensions it MUST always appear last. */
1500 if (header_len > 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001501 {
Adam Langleyb0c235e2014-06-20 12:00:00 -07001502 header_len += ret - orig;
1503 if (header_len > 0xff && header_len < 0x200)
1504 {
1505 size_t padding_len = 0x200 - header_len;
1506 if (padding_len >= 4)
1507 padding_len -= 4;
1508 else
1509 padding_len = 0;
1510 if (limit - ret - 4 - (long)padding_len < 0)
1511 return NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001512
Adam Langleyb0c235e2014-06-20 12:00:00 -07001513 s2n(TLSEXT_TYPE_padding, ret);
1514 s2n(padding_len, ret);
1515 memset(ret, 0, padding_len);
1516 ret += padding_len;
1517 }
Adam Langley95c29f32014-06-20 12:00:00 -07001518 }
1519#endif
1520
Adam Langleyb0c235e2014-06-20 12:00:00 -07001521 if ((extdatalen = ret-orig-2)== 0)
1522 return orig;
Adam Langley95c29f32014-06-20 12:00:00 -07001523
Adam Langleyb0c235e2014-06-20 12:00:00 -07001524 s2n(extdatalen, orig);
Adam Langley95c29f32014-06-20 12:00:00 -07001525 return ret;
1526 }
1527
Adam Langleyb0c235e2014-06-20 12:00:00 -07001528unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf, unsigned char *limit)
Adam Langley95c29f32014-06-20 12:00:00 -07001529 {
1530 int extdatalen=0;
Adam Langleyb0c235e2014-06-20 12:00:00 -07001531 unsigned char *orig = buf;
1532 unsigned char *ret = buf;
Adam Langley95c29f32014-06-20 12:00:00 -07001533#ifndef OPENSSL_NO_NEXTPROTONEG
1534 int next_proto_neg_seen;
1535#endif
1536#ifndef OPENSSL_NO_EC
1537 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1538 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1539 int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
1540 using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1541#endif
1542 /* don't add extensions for SSLv3, unless doing secure renegotiation */
1543 if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
Adam Langleyb0c235e2014-06-20 12:00:00 -07001544 return orig;
Adam Langley95c29f32014-06-20 12:00:00 -07001545
1546 ret+=2;
1547 if (ret>=limit) return NULL; /* this really never occurs, but ... */
1548
1549 if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
1550 {
1551 if ((long)(limit - ret - 4) < 0) return NULL;
1552
1553 s2n(TLSEXT_TYPE_server_name,ret);
1554 s2n(0,ret);
1555 }
1556
1557 if(s->s3->send_connection_binding)
1558 {
1559 int el;
1560
1561 if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
1562 {
1563 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, ERR_R_INTERNAL_ERROR);
1564 return NULL;
1565 }
1566
Adam Langleyb0c235e2014-06-20 12:00:00 -07001567 if((limit - ret - 4 - el) < 0) return NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001568
1569 s2n(TLSEXT_TYPE_renegotiate,ret);
1570 s2n(el,ret);
1571
1572 if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
1573 {
1574 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, ERR_R_INTERNAL_ERROR);
1575 return NULL;
1576 }
1577
1578 ret += el;
1579 }
1580
1581#ifndef OPENSSL_NO_EC
1582 if (using_ecc)
1583 {
1584 const unsigned char *plist;
1585 size_t plistlen;
1586 /* Add TLS extension ECPointFormats to the ServerHello message */
1587 long lenmax;
1588
1589 tls1_get_formatlist(s, &plist, &plistlen);
1590
1591 if ((lenmax = limit - ret - 5) < 0) return NULL;
1592 if (plistlen > (size_t)lenmax) return NULL;
1593 if (plistlen > 255)
1594 {
1595 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, ERR_R_INTERNAL_ERROR);
1596 return NULL;
1597 }
1598
1599 s2n(TLSEXT_TYPE_ec_point_formats,ret);
1600 s2n(plistlen + 1,ret);
1601 *(ret++) = (unsigned char) plistlen;
1602 memcpy(ret, plist, plistlen);
1603 ret+=plistlen;
1604
1605 }
1606 /* Currently the server should not respond with a SupportedCurves extension */
1607#endif /* OPENSSL_NO_EC */
1608
1609 if (s->tlsext_ticket_expected
1610 && !(SSL_get_options(s) & SSL_OP_NO_TICKET))
1611 {
1612 if ((long)(limit - ret - 4) < 0) return NULL;
1613 s2n(TLSEXT_TYPE_session_ticket,ret);
1614 s2n(0,ret);
1615 }
1616
1617 if (s->tlsext_status_expected)
1618 {
1619 if ((long)(limit - ret - 4) < 0) return NULL;
1620 s2n(TLSEXT_TYPE_status_request,ret);
1621 s2n(0,ret);
1622 }
1623
1624#ifdef TLSEXT_TYPE_opaque_prf_input
1625 if (s->s3->server_opaque_prf_input != NULL)
1626 {
1627 size_t sol = s->s3->server_opaque_prf_input_len;
1628
1629 if ((long)(limit - ret - 6 - sol) < 0)
1630 return NULL;
1631 if (sol > 0xFFFD) /* can't happen */
1632 return NULL;
1633
1634 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
1635 s2n(sol + 2, ret);
1636 s2n(sol, ret);
1637 memcpy(ret, s->s3->server_opaque_prf_input, sol);
1638 ret += sol;
1639 }
1640#endif
1641
1642 if(s->srtp_profile)
1643 {
1644 int el;
1645
1646 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
1647
Adam Langleyb0c235e2014-06-20 12:00:00 -07001648 if((limit - ret - 4 - el) < 0) return NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001649
1650 s2n(TLSEXT_TYPE_use_srtp,ret);
1651 s2n(el,ret);
1652
1653 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
1654 {
1655 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, ERR_R_INTERNAL_ERROR);
1656 return NULL;
1657 }
1658 ret+=el;
1659 }
1660
1661 if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81)
1662 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
1663 { const unsigned char cryptopro_ext[36] = {
1664 0xfd, 0xe8, /*65000*/
1665 0x00, 0x20, /*32 bytes length*/
1666 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
1667 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
1668 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
1669 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
1670 if (limit-ret<36) return NULL;
1671 memcpy(ret,cryptopro_ext,36);
1672 ret+=36;
1673
1674 }
1675
1676#ifndef OPENSSL_NO_HEARTBEATS
1677 /* Add Heartbeat extension if we've received one */
1678 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
1679 {
1680 s2n(TLSEXT_TYPE_heartbeat,ret);
1681 s2n(1,ret);
1682 /* Set mode:
1683 * 1: peer may send requests
1684 * 2: peer not allowed to send requests
1685 */
1686 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
1687 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1688 else
1689 *(ret++) = SSL_TLSEXT_HB_ENABLED;
1690
1691 }
1692#endif
1693
1694#ifndef OPENSSL_NO_NEXTPROTONEG
1695 next_proto_neg_seen = s->s3->next_proto_neg_seen;
1696 s->s3->next_proto_neg_seen = 0;
1697 if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
1698 {
1699 const unsigned char *npa;
1700 unsigned int npalen;
1701 int r;
1702
1703 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
1704 if (r == SSL_TLSEXT_ERR_OK)
1705 {
1706 if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
1707 s2n(TLSEXT_TYPE_next_proto_neg,ret);
1708 s2n(npalen,ret);
1709 memcpy(ret, npa, npalen);
1710 ret += npalen;
1711 s->s3->next_proto_neg_seen = 1;
1712 }
1713 }
1714#endif
1715
1716 /* If the client supports authz then see whether we have any to offer
1717 * to it. */
1718 if (s->s3->tlsext_authz_client_types_len)
1719 {
1720 size_t authz_length;
1721 /* By now we already know the new cipher, so we can look ahead
1722 * to see whether the cert we are going to send
1723 * has any authz data attached to it. */
1724 const unsigned char* authz = ssl_get_authz_data(s, &authz_length);
1725 const unsigned char* const orig_authz = authz;
1726 size_t i;
1727 unsigned authz_count = 0;
1728
1729 /* The authz data contains a number of the following structures:
1730 * uint8_t authz_type
1731 * uint16_t length
1732 * uint8_t data[length]
1733 *
1734 * First we walk over it to find the number of authz elements. */
1735 for (i = 0; i < authz_length; i++)
1736 {
1737 unsigned short length;
1738 unsigned char type;
1739
1740 type = *(authz++);
1741 if (memchr(s->s3->tlsext_authz_client_types,
1742 type,
1743 s->s3->tlsext_authz_client_types_len) != NULL)
1744 authz_count++;
1745
1746 n2s(authz, length);
1747 /* n2s increments authz by 2 */
1748 i += 2;
1749 authz += length;
1750 i += length;
1751 }
1752
1753 if (authz_count)
1754 {
1755 /* Add TLS extension server_authz to the ServerHello message
1756 * 2 bytes for extension type
1757 * 2 bytes for extension length
1758 * 1 byte for the list length
1759 * n bytes for the list */
1760 const unsigned short ext_len = 1 + authz_count;
1761
1762 if ((long)(limit - ret - 4 - ext_len) < 0) return NULL;
1763 s2n(TLSEXT_TYPE_server_authz, ret);
1764 s2n(ext_len, ret);
1765 *(ret++) = authz_count;
1766 s->s3->tlsext_authz_promised_to_client = 1;
1767 }
1768
1769 authz = orig_authz;
1770 for (i = 0; i < authz_length; i++)
1771 {
1772 unsigned short length;
1773 unsigned char type;
1774
1775 authz_count++;
1776 type = *(authz++);
1777 if (memchr(s->s3->tlsext_authz_client_types,
1778 type,
1779 s->s3->tlsext_authz_client_types_len) != NULL)
1780 *(ret++) = type;
1781 n2s(authz, length);
1782 /* n2s increments authz by 2 */
1783 i += 2;
1784 authz += length;
1785 i += length;
1786 }
1787 }
1788
1789 /* If custom types were sent in ClientHello, add ServerHello responses */
1790 if (s->s3->tlsext_custom_types_count)
1791 {
1792 size_t i;
1793
1794 for (i = 0; i < s->s3->tlsext_custom_types_count; i++)
1795 {
1796 size_t j;
1797 custom_srv_ext_record *record;
1798
1799 for (j = 0; j < s->ctx->custom_srv_ext_records_count; j++)
1800 {
1801 record = &s->ctx->custom_srv_ext_records[j];
1802 if (s->s3->tlsext_custom_types[i] == record->ext_type)
1803 {
1804 const unsigned char *out = NULL;
1805 unsigned short outlen = 0;
1806 int cb_retval = 0;
1807
1808 /* NULL callback or -1 omits extension */
1809 if (!record->fn2)
1810 break;
1811 cb_retval = record->fn2(s, record->ext_type,
1812 &out, &outlen,
1813 record->arg);
1814 if (cb_retval == 0)
1815 return NULL; /* error */
1816 if (cb_retval == -1)
1817 break; /* skip this extension */
1818 if (limit < ret + 4 + outlen)
1819 return NULL;
1820 s2n(record->ext_type, ret);
1821 s2n(outlen, ret);
1822 memcpy(ret, out, outlen);
1823 ret += outlen;
1824 break;
1825 }
1826 }
1827 }
1828 }
1829
1830 if (s->s3->alpn_selected)
1831 {
1832 const unsigned char *selected = s->s3->alpn_selected;
1833 unsigned len = s->s3->alpn_selected_len;
1834
1835 if ((long)(limit - ret - 4 - 2 - 1 - len) < 0)
1836 return NULL;
1837 s2n(TLSEXT_TYPE_application_layer_protocol_negotiation,ret);
1838 s2n(3 + len,ret);
1839 s2n(1 + len,ret);
1840 *ret++ = len;
1841 memcpy(ret, selected, len);
1842 ret += len;
1843 }
1844
Adam Langley1258b6a2014-06-20 12:00:00 -07001845 /* If the client advertised support for Channel ID, and we have it
1846 * enabled, then we want to echo it back. */
1847 if (s->s3->tlsext_channel_id_valid)
1848 {
1849 if (limit - ret - 4 < 0)
1850 return NULL;
1851 if (s->s3->tlsext_channel_id_new)
1852 s2n(TLSEXT_TYPE_channel_id_new,ret);
1853 else
1854 s2n(TLSEXT_TYPE_channel_id,ret);
1855 s2n(0,ret);
1856 }
1857
Adam Langleyb0c235e2014-06-20 12:00:00 -07001858 if ((extdatalen = ret-orig-2) == 0)
1859 return orig;
Adam Langley95c29f32014-06-20 12:00:00 -07001860
Adam Langleyb0c235e2014-06-20 12:00:00 -07001861 s2n(extdatalen, orig);
Adam Langley95c29f32014-06-20 12:00:00 -07001862 return ret;
1863 }
1864
1865#ifndef OPENSSL_NO_EC
1866/* ssl_check_for_safari attempts to fingerprint Safari using OS X
1867 * SecureTransport using the TLS extension block in |d|, of length |n|.
1868 * Safari, since 10.6, sends exactly these extensions, in this order:
1869 * SNI,
1870 * elliptic_curves
1871 * ec_point_formats
1872 *
1873 * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
1874 * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
1875 * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
1876 * 10.8..10.8.3 (which don't work).
1877 */
1878static void ssl_check_for_safari(SSL *s, const unsigned char *data, const unsigned char *d, int n) {
1879 unsigned short type, size;
1880 static const unsigned char kSafariExtensionsBlock[] = {
1881 0x00, 0x0a, /* elliptic_curves extension */
1882 0x00, 0x08, /* 8 bytes */
1883 0x00, 0x06, /* 6 bytes of curve ids */
1884 0x00, 0x17, /* P-256 */
1885 0x00, 0x18, /* P-384 */
1886 0x00, 0x19, /* P-521 */
1887
1888 0x00, 0x0b, /* ec_point_formats */
1889 0x00, 0x02, /* 2 bytes */
1890 0x01, /* 1 point format */
1891 0x00, /* uncompressed */
1892 };
1893
1894 /* The following is only present in TLS 1.2 */
1895 static const unsigned char kSafariTLS12ExtensionsBlock[] = {
1896 0x00, 0x0d, /* signature_algorithms */
1897 0x00, 0x0c, /* 12 bytes */
1898 0x00, 0x0a, /* 10 bytes */
1899 0x05, 0x01, /* SHA-384/RSA */
1900 0x04, 0x01, /* SHA-256/RSA */
1901 0x02, 0x01, /* SHA-1/RSA */
1902 0x04, 0x03, /* SHA-256/ECDSA */
1903 0x02, 0x03, /* SHA-1/ECDSA */
1904 };
1905
1906 if (data >= (d+n-2))
1907 return;
1908 data += 2;
1909
1910 if (data > (d+n-4))
1911 return;
1912 n2s(data,type);
1913 n2s(data,size);
1914
1915 if (type != TLSEXT_TYPE_server_name)
1916 return;
1917
1918 if (data+size > d+n)
1919 return;
1920 data += size;
1921
1922 if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
1923 {
1924 const size_t len1 = sizeof(kSafariExtensionsBlock);
1925 const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
1926
1927 if (data + len1 + len2 != d+n)
1928 return;
1929 if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
1930 return;
1931 if (memcmp(data + len1, kSafariTLS12ExtensionsBlock, len2) != 0)
1932 return;
1933 }
1934 else
1935 {
1936 const size_t len = sizeof(kSafariExtensionsBlock);
1937
1938 if (data + len != d+n)
1939 return;
1940 if (memcmp(data, kSafariExtensionsBlock, len) != 0)
1941 return;
1942 }
1943
1944 s->s3->is_probably_safari = 1;
1945}
1946#endif /* !OPENSSL_NO_EC */
1947
1948/* tls1_alpn_handle_client_hello is called to process the ALPN extension in a
1949 * ClientHello.
1950 * data: the contents of the extension, not including the type and length.
1951 * data_len: the number of bytes in |data|
1952 * al: a pointer to the alert value to send in the event of a non-zero
1953 * return.
1954 *
1955 * returns: 0 on success. */
1956static int tls1_alpn_handle_client_hello(SSL *s, const unsigned char *data,
1957 unsigned data_len, int *al)
1958 {
1959 unsigned i;
1960 unsigned proto_len;
1961 const unsigned char *selected;
1962 unsigned char selected_len;
1963 int r;
1964
1965 if (s->ctx->alpn_select_cb == NULL)
1966 return 0;
1967
1968 if (data_len < 2)
1969 goto parse_error;
1970
1971 /* data should contain a uint16 length followed by a series of 8-bit,
1972 * length-prefixed strings. */
1973 i = ((unsigned) data[0]) << 8 |
1974 ((unsigned) data[1]);
1975 data_len -= 2;
1976 data += 2;
1977 if (data_len != i)
1978 goto parse_error;
1979
1980 if (data_len < 2)
1981 goto parse_error;
1982
1983 for (i = 0; i < data_len;)
1984 {
1985 proto_len = data[i];
1986 i++;
1987
1988 if (proto_len == 0)
1989 goto parse_error;
1990
1991 if (i + proto_len < i || i + proto_len > data_len)
1992 goto parse_error;
1993
1994 i += proto_len;
1995 }
1996
1997 r = s->ctx->alpn_select_cb(s, &selected, &selected_len, data, data_len,
1998 s->ctx->alpn_select_cb_arg);
1999 if (r == SSL_TLSEXT_ERR_OK) {
2000 if (s->s3->alpn_selected)
2001 OPENSSL_free(s->s3->alpn_selected);
2002 s->s3->alpn_selected = OPENSSL_malloc(selected_len);
2003 if (!s->s3->alpn_selected)
2004 {
2005 *al = SSL_AD_INTERNAL_ERROR;
2006 return -1;
2007 }
2008 memcpy(s->s3->alpn_selected, selected, selected_len);
2009 s->s3->alpn_selected_len = selected_len;
2010 }
2011 return 0;
2012
2013parse_error:
2014 *al = SSL_AD_DECODE_ERROR;
2015 return -1;
2016 }
2017
2018static int ssl_scan_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
2019 {
2020 unsigned short type;
2021 unsigned short size;
2022 unsigned short len;
2023 unsigned char *data = *p;
2024 int renegotiate_seen = 0;
2025 size_t i;
2026
2027 s->servername_done = 0;
2028 s->tlsext_status_type = -1;
2029#ifndef OPENSSL_NO_NEXTPROTONEG
2030 s->s3->next_proto_neg_seen = 0;
2031#endif
2032
2033 /* Clear observed custom extensions */
2034 s->s3->tlsext_custom_types_count = 0;
2035 if (s->s3->tlsext_custom_types != NULL)
2036 {
2037 OPENSSL_free(s->s3->tlsext_custom_types);
2038 s->s3->tlsext_custom_types = NULL;
2039 }
2040
2041 if (s->s3->alpn_selected)
2042 {
2043 OPENSSL_free(s->s3->alpn_selected);
2044 s->s3->alpn_selected = NULL;
2045 }
2046
2047#ifndef OPENSSL_NO_HEARTBEATS
2048 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
2049 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
2050#endif
2051
2052#ifndef OPENSSL_NO_EC
2053 if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
2054 ssl_check_for_safari(s, data, d, n);
2055#endif /* !OPENSSL_NO_EC */
2056
2057 /* Clear any signature algorithms extension received */
2058 if (s->cert->peer_sigalgs)
2059 {
2060 OPENSSL_free(s->cert->peer_sigalgs);
2061 s->cert->peer_sigalgs = NULL;
2062 }
2063 /* Clear any shared sigtnature algorithms */
2064 if (s->cert->shared_sigalgs)
2065 {
2066 OPENSSL_free(s->cert->shared_sigalgs);
2067 s->cert->shared_sigalgs = NULL;
2068 }
2069 /* Clear certificate digests and validity flags */
2070 for (i = 0; i < SSL_PKEY_NUM; i++)
2071 {
2072 s->cert->pkeys[i].digest = NULL;
2073 s->cert->pkeys[i].valid_flags = 0;
2074 }
2075
2076 if (data >= (d+n-2))
2077 goto ri_check;
2078 n2s(data,len);
2079
2080 if (data > (d+n-len))
2081 goto ri_check;
2082
2083 while (data <= (d+n-4))
2084 {
2085 n2s(data,type);
2086 n2s(data,size);
2087
2088 if (data+size > (d+n))
2089 goto ri_check;
2090#if 0
2091 fprintf(stderr,"Received extension type %d size %d\n",type,size);
2092#endif
2093 if (s->tlsext_debug_cb)
2094 s->tlsext_debug_cb(s, 0, type, data, size,
2095 s->tlsext_debug_arg);
2096/* The servername extension is treated as follows:
2097
2098 - Only the hostname type is supported with a maximum length of 255.
2099 - The servername is rejected if too long or if it contains zeros,
2100 in which case an fatal alert is generated.
2101 - The servername field is maintained together with the session cache.
2102 - When a session is resumed, the servername call back invoked in order
2103 to allow the application to position itself to the right context.
2104 - The servername is acknowledged if it is new for a session or when
2105 it is identical to a previously used for the same session.
2106 Applications can control the behaviour. They can at any time
2107 set a 'desirable' servername for a new SSL object. This can be the
2108 case for example with HTTPS when a Host: header field is received and
2109 a renegotiation is requested. In this case, a possible servername
2110 presented in the new client hello is only acknowledged if it matches
2111 the value of the Host: field.
2112 - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
2113 if they provide for changing an explicit servername context for the session,
2114 i.e. when the session has been established with a servername extension.
2115 - On session reconnect, the servername extension may be absent.
2116
2117*/
2118
2119 if (type == TLSEXT_TYPE_server_name)
2120 {
2121 unsigned char *sdata;
2122 int servname_type;
2123 int dsize;
2124
2125 if (size < 2)
2126 {
2127 *al = SSL_AD_DECODE_ERROR;
2128 return 0;
2129 }
2130 n2s(data,dsize);
2131 size -= 2;
2132 if (dsize > size )
2133 {
2134 *al = SSL_AD_DECODE_ERROR;
2135 return 0;
2136 }
2137
2138 sdata = data;
2139 while (dsize > 3)
2140 {
2141 servname_type = *(sdata++);
2142 n2s(sdata,len);
2143 dsize -= 3;
2144
2145 if (len > dsize)
2146 {
2147 *al = SSL_AD_DECODE_ERROR;
2148 return 0;
2149 }
2150 if (s->servername_done == 0)
2151 switch (servname_type)
2152 {
2153 case TLSEXT_NAMETYPE_host_name:
2154 if (!s->hit)
2155 {
2156 if(s->session->tlsext_hostname)
2157 {
2158 *al = SSL_AD_DECODE_ERROR;
2159 return 0;
2160 }
2161 if (len > TLSEXT_MAXLEN_host_name)
2162 {
2163 *al = TLS1_AD_UNRECOGNIZED_NAME;
2164 return 0;
2165 }
2166 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
2167 {
2168 *al = TLS1_AD_INTERNAL_ERROR;
2169 return 0;
2170 }
2171 memcpy(s->session->tlsext_hostname, sdata, len);
2172 s->session->tlsext_hostname[len]='\0';
2173 if (strlen(s->session->tlsext_hostname) != len) {
2174 OPENSSL_free(s->session->tlsext_hostname);
2175 s->session->tlsext_hostname = NULL;
2176 *al = TLS1_AD_UNRECOGNIZED_NAME;
2177 return 0;
2178 }
2179 s->servername_done = 1;
2180
2181 }
2182 else
2183 s->servername_done = s->session->tlsext_hostname
2184 && strlen(s->session->tlsext_hostname) == len
2185 && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
2186
2187 break;
2188
2189 default:
2190 break;
2191 }
2192
2193 dsize -= len;
2194 }
2195 if (dsize != 0)
2196 {
2197 *al = SSL_AD_DECODE_ERROR;
2198 return 0;
2199 }
2200
2201 }
2202
2203#ifndef OPENSSL_NO_EC
2204 else if (type == TLSEXT_TYPE_ec_point_formats)
2205 {
2206 unsigned char *sdata = data;
2207 int ecpointformatlist_length = *(sdata++);
2208
2209 if (ecpointformatlist_length != size - 1 ||
2210 ecpointformatlist_length < 1)
2211 {
2212 *al = TLS1_AD_DECODE_ERROR;
2213 return 0;
2214 }
2215 if (!s->hit)
2216 {
2217 if(s->session->tlsext_ecpointformatlist)
2218 {
2219 OPENSSL_free(s->session->tlsext_ecpointformatlist);
2220 s->session->tlsext_ecpointformatlist = NULL;
2221 }
2222 s->session->tlsext_ecpointformatlist_length = 0;
2223 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
2224 {
2225 *al = TLS1_AD_INTERNAL_ERROR;
2226 return 0;
2227 }
2228 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
2229 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
2230 }
2231#if 0
2232 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
2233 sdata = s->session->tlsext_ecpointformatlist;
2234 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
2235 fprintf(stderr,"%i ",*(sdata++));
2236 fprintf(stderr,"\n");
2237#endif
2238 }
2239 else if (type == TLSEXT_TYPE_elliptic_curves)
2240 {
2241 unsigned char *sdata = data;
2242 int ellipticcurvelist_length = (*(sdata++) << 8);
2243 ellipticcurvelist_length += (*(sdata++));
2244
2245 if (ellipticcurvelist_length != size - 2 ||
2246 ellipticcurvelist_length < 1)
2247 {
2248 *al = TLS1_AD_DECODE_ERROR;
2249 return 0;
2250 }
2251 if (!s->hit)
2252 {
2253 if(s->session->tlsext_ellipticcurvelist)
2254 {
2255 *al = TLS1_AD_DECODE_ERROR;
2256 return 0;
2257 }
2258 s->session->tlsext_ellipticcurvelist_length = 0;
2259 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
2260 {
2261 *al = TLS1_AD_INTERNAL_ERROR;
2262 return 0;
2263 }
2264 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
2265 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
2266 }
2267#if 0
2268 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
2269 sdata = s->session->tlsext_ellipticcurvelist;
2270 for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
2271 fprintf(stderr,"%i ",*(sdata++));
2272 fprintf(stderr,"\n");
2273#endif
2274 }
2275#endif /* OPENSSL_NO_EC */
2276#ifdef TLSEXT_TYPE_opaque_prf_input
2277 else if (type == TLSEXT_TYPE_opaque_prf_input)
2278 {
2279 unsigned char *sdata = data;
2280
2281 if (size < 2)
2282 {
2283 *al = SSL_AD_DECODE_ERROR;
2284 return 0;
2285 }
2286 n2s(sdata, s->s3->client_opaque_prf_input_len);
2287 if (s->s3->client_opaque_prf_input_len != size - 2)
2288 {
2289 *al = SSL_AD_DECODE_ERROR;
2290 return 0;
2291 }
2292
2293 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
2294 OPENSSL_free(s->s3->client_opaque_prf_input);
2295 if (s->s3->client_opaque_prf_input_len == 0)
2296 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2297 else
2298 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
2299 if (s->s3->client_opaque_prf_input == NULL)
2300 {
2301 *al = TLS1_AD_INTERNAL_ERROR;
2302 return 0;
2303 }
2304 }
2305#endif
2306 else if (type == TLSEXT_TYPE_session_ticket)
2307 {
2308 if (s->tls_session_ticket_ext_cb &&
2309 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
2310 {
2311 *al = TLS1_AD_INTERNAL_ERROR;
2312 return 0;
2313 }
2314 }
2315 else if (type == TLSEXT_TYPE_renegotiate)
2316 {
2317 if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
2318 return 0;
2319 renegotiate_seen = 1;
2320 }
2321 else if (type == TLSEXT_TYPE_signature_algorithms)
2322 {
2323 int dsize;
2324 if (s->cert->peer_sigalgs || size < 2)
2325 {
2326 *al = SSL_AD_DECODE_ERROR;
2327 return 0;
2328 }
2329 n2s(data,dsize);
2330 size -= 2;
2331 if (dsize != size || dsize & 1 || !dsize)
2332 {
2333 *al = SSL_AD_DECODE_ERROR;
2334 return 0;
2335 }
2336 if (!tls1_process_sigalgs(s, data, dsize))
2337 {
2338 *al = SSL_AD_DECODE_ERROR;
2339 return 0;
2340 }
2341 /* If sigalgs received and no shared algorithms fatal
2342 * error.
2343 */
2344 if (s->cert->peer_sigalgs && !s->cert->shared_sigalgs)
2345 {
2346 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_NO_SHARED_SIGATURE_ALGORITHMS);
2347 *al = SSL_AD_ILLEGAL_PARAMETER;
2348 return 0;
2349 }
2350 }
2351
2352 /* TODO(fork): we probably want OCSP stapling support, but this pulls in a lot of code. */
2353#if 0
2354 else if (type == TLSEXT_TYPE_status_request)
2355 {
2356
2357 if (size < 5)
2358 {
2359 *al = SSL_AD_DECODE_ERROR;
2360 return 0;
2361 }
2362
2363 s->tlsext_status_type = *data++;
2364 size--;
2365 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
2366 {
2367 const unsigned char *sdata;
2368 int dsize;
2369 /* Read in responder_id_list */
2370 n2s(data,dsize);
2371 size -= 2;
2372 if (dsize > size )
2373 {
2374 *al = SSL_AD_DECODE_ERROR;
2375 return 0;
2376 }
2377 while (dsize > 0)
2378 {
2379 OCSP_RESPID *id;
2380 int idsize;
2381 if (dsize < 4)
2382 {
2383 *al = SSL_AD_DECODE_ERROR;
2384 return 0;
2385 }
2386 n2s(data, idsize);
2387 dsize -= 2 + idsize;
2388 size -= 2 + idsize;
2389 if (dsize < 0)
2390 {
2391 *al = SSL_AD_DECODE_ERROR;
2392 return 0;
2393 }
2394 sdata = data;
2395 data += idsize;
2396 id = d2i_OCSP_RESPID(NULL,
2397 &sdata, idsize);
2398 if (!id)
2399 {
2400 *al = SSL_AD_DECODE_ERROR;
2401 return 0;
2402 }
2403 if (data != sdata)
2404 {
2405 OCSP_RESPID_free(id);
2406 *al = SSL_AD_DECODE_ERROR;
2407 return 0;
2408 }
2409 if (!s->tlsext_ocsp_ids
2410 && !(s->tlsext_ocsp_ids =
2411 sk_OCSP_RESPID_new_null()))
2412 {
2413 OCSP_RESPID_free(id);
2414 *al = SSL_AD_INTERNAL_ERROR;
2415 return 0;
2416 }
2417 if (!sk_OCSP_RESPID_push(
2418 s->tlsext_ocsp_ids, id))
2419 {
2420 OCSP_RESPID_free(id);
2421 *al = SSL_AD_INTERNAL_ERROR;
2422 return 0;
2423 }
2424 }
2425
2426 /* Read in request_extensions */
2427 if (size < 2)
2428 {
2429 *al = SSL_AD_DECODE_ERROR;
2430 return 0;
2431 }
2432 n2s(data,dsize);
2433 size -= 2;
2434 if (dsize != size)
2435 {
2436 *al = SSL_AD_DECODE_ERROR;
2437 return 0;
2438 }
2439 sdata = data;
2440 if (dsize > 0)
2441 {
2442 if (s->tlsext_ocsp_exts)
2443 {
2444 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
2445 X509_EXTENSION_free);
2446 }
2447
2448 s->tlsext_ocsp_exts =
2449 d2i_X509_EXTENSIONS(NULL,
2450 &sdata, dsize);
2451 if (!s->tlsext_ocsp_exts
2452 || (data + dsize != sdata))
2453 {
2454 *al = SSL_AD_DECODE_ERROR;
2455 return 0;
2456 }
2457 }
2458 }
2459 /* We don't know what to do with any other type
2460 * so ignore it.
2461 */
2462 else
2463 s->tlsext_status_type = -1;
2464 }
2465#endif
2466
2467#ifndef OPENSSL_NO_HEARTBEATS
2468 else if (type == TLSEXT_TYPE_heartbeat)
2469 {
2470 switch(data[0])
2471 {
2472 case 0x01: /* Client allows us to send HB requests */
2473 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2474 break;
2475 case 0x02: /* Client doesn't accept HB requests */
2476 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2477 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
2478 break;
2479 default: *al = SSL_AD_ILLEGAL_PARAMETER;
2480 return 0;
2481 }
2482 }
2483#endif
2484#ifndef OPENSSL_NO_NEXTPROTONEG
2485 else if (type == TLSEXT_TYPE_next_proto_neg &&
2486 s->s3->tmp.finish_md_len == 0 &&
2487 s->s3->alpn_selected == NULL)
2488 {
2489 /* We shouldn't accept this extension on a
2490 * renegotiation.
2491 *
2492 * s->new_session will be set on renegotiation, but we
2493 * probably shouldn't rely that it couldn't be set on
2494 * the initial renegotation too in certain cases (when
2495 * there's some other reason to disallow resuming an
2496 * earlier session -- the current code won't be doing
2497 * anything like that, but this might change).
2498
2499 * A valid sign that there's been a previous handshake
2500 * in this connection is if s->s3->tmp.finish_md_len >
2501 * 0. (We are talking about a check that will happen
2502 * in the Hello protocol round, well before a new
2503 * Finished message could have been computed.) */
2504 s->s3->next_proto_neg_seen = 1;
2505 }
2506#endif
2507
2508 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation &&
2509 s->ctx->alpn_select_cb &&
2510 s->s3->tmp.finish_md_len == 0)
2511 {
2512 if (tls1_alpn_handle_client_hello(s, data, size, al) != 0)
2513 return 0;
2514#ifndef OPENSSL_NO_NEXTPROTONEG
2515 /* ALPN takes precedence over NPN. */
2516 s->s3->next_proto_neg_seen = 0;
2517#endif
2518 }
2519
Adam Langley1258b6a2014-06-20 12:00:00 -07002520 else if (type == TLSEXT_TYPE_channel_id &&
2521 s->tlsext_channel_id_enabled)
2522 s->s3->tlsext_channel_id_valid = 1;
2523
2524 else if (type == TLSEXT_TYPE_channel_id_new &&
2525 s->tlsext_channel_id_enabled)
2526 {
2527 s->s3->tlsext_channel_id_valid = 1;
2528 s->s3->tlsext_channel_id_new = 1;
2529 }
2530
2531
Adam Langley95c29f32014-06-20 12:00:00 -07002532 /* session ticket processed earlier */
2533 else if (type == TLSEXT_TYPE_use_srtp)
2534 {
2535 if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
2536 al))
2537 return 0;
2538 }
2539
2540 else if (type == TLSEXT_TYPE_server_authz)
2541 {
2542 unsigned char *sdata = data;
2543 unsigned char server_authz_dataformatlist_length;
2544
2545 if (size == 0)
2546 {
2547 *al = TLS1_AD_DECODE_ERROR;
2548 return 0;
2549 }
2550
2551 server_authz_dataformatlist_length = *(sdata++);
2552
2553 if (server_authz_dataformatlist_length != size - 1)
2554 {
2555 *al = TLS1_AD_DECODE_ERROR;
2556 return 0;
2557 }
2558
2559 /* Successful session resumption uses the same authz
2560 * information as the original session so we ignore this
2561 * in the case of a session resumption. */
2562 if (!s->hit)
2563 {
2564 if (s->s3->tlsext_authz_client_types != NULL)
2565 OPENSSL_free(s->s3->tlsext_authz_client_types);
2566 s->s3->tlsext_authz_client_types =
2567 OPENSSL_malloc(server_authz_dataformatlist_length);
2568 if (!s->s3->tlsext_authz_client_types)
2569 {
2570 *al = TLS1_AD_INTERNAL_ERROR;
2571 return 0;
2572 }
2573
2574 s->s3->tlsext_authz_client_types_len =
2575 server_authz_dataformatlist_length;
2576 memcpy(s->s3->tlsext_authz_client_types,
2577 sdata,
2578 server_authz_dataformatlist_length);
2579
2580 /* Sort the types in order to check for duplicates. */
2581 qsort(s->s3->tlsext_authz_client_types,
2582 server_authz_dataformatlist_length,
2583 1 /* element size */,
2584 byte_compare);
2585
2586 for (i = 0; i < server_authz_dataformatlist_length; i++)
2587 {
2588 if (i > 0 &&
2589 s->s3->tlsext_authz_client_types[i] ==
2590 s->s3->tlsext_authz_client_types[i-1])
2591 {
2592 *al = TLS1_AD_DECODE_ERROR;
2593 return 0;
2594 }
2595 }
2596 }
2597 }
2598
2599 /* If this ClientHello extension was unhandled and this is
2600 * a nonresumed connection, check whether the extension is a
2601 * custom TLS Extension (has a custom_srv_ext_record), and if
2602 * so call the callback and record the extension number so that
2603 * an appropriate ServerHello may be later returned.
2604 */
2605 else if (!s->hit && s->ctx->custom_srv_ext_records_count)
2606 {
2607 custom_srv_ext_record *record;
2608
2609 for (i=0; i < s->ctx->custom_srv_ext_records_count; i++)
2610 {
2611 record = &s->ctx->custom_srv_ext_records[i];
2612 if (type == record->ext_type)
2613 {
2614 size_t j;
2615
2616 /* Error on duplicate TLS Extensions */
2617 for (j = 0; j < s->s3->tlsext_custom_types_count; j++)
2618 {
2619 if (type == s->s3->tlsext_custom_types[j])
2620 {
2621 *al = TLS1_AD_DECODE_ERROR;
2622 return 0;
2623 }
2624 }
2625
2626 /* NULL callback still notes the extension */
2627 if (record->fn1 && !record->fn1(s, type, data, size, al, record->arg))
2628 return 0;
2629
2630 /* Add the (non-duplicated) entry */
2631 s->s3->tlsext_custom_types_count++;
2632 s->s3->tlsext_custom_types = OPENSSL_realloc(
2633 s->s3->tlsext_custom_types,
2634 s->s3->tlsext_custom_types_count * 2);
2635 if (s->s3->tlsext_custom_types == NULL)
2636 {
2637 s->s3->tlsext_custom_types = 0;
2638 *al = TLS1_AD_INTERNAL_ERROR;
2639 return 0;
2640 }
2641 s->s3->tlsext_custom_types[
2642 s->s3->tlsext_custom_types_count - 1] = type;
2643 }
2644 }
2645 }
2646
2647 data+=size;
2648 }
2649
2650 *p = data;
2651
2652 ri_check:
2653
2654 /* Need RI if renegotiating */
2655
2656 if (!renegotiate_seen && s->renegotiate &&
2657 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
2658 {
2659 *al = SSL_AD_HANDSHAKE_FAILURE;
2660 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
2661 return 0;
2662 }
2663 /* If no signature algorithms extension set default values */
2664 if (!s->cert->peer_sigalgs)
2665 ssl_cert_set_default_md(s->cert);
2666
2667 return 1;
2668 }
2669
2670int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n)
2671 {
2672 int al = -1;
2673 if (ssl_scan_clienthello_tlsext(s, p, d, n, &al) <= 0)
2674 {
2675 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2676 return 0;
2677 }
2678
2679 if (ssl_check_clienthello_tlsext_early(s) <= 0)
2680 {
2681 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_CLIENTHELLO_TLSEXT);
2682 return 0;
2683 }
2684 return 1;
2685}
2686
2687#ifndef OPENSSL_NO_NEXTPROTONEG
2688/* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
2689 * elements of zero length are allowed and the set of elements must exactly fill
2690 * the length of the block. */
2691static char ssl_next_proto_validate(unsigned char *d, unsigned len)
2692 {
2693 unsigned int off = 0;
2694
2695 while (off < len)
2696 {
2697 if (d[off] == 0)
2698 return 0;
2699 off += d[off];
2700 off++;
2701 }
2702
2703 return off == len;
2704 }
2705#endif
2706
2707static int ssl_scan_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
2708 {
2709 unsigned short length;
2710 unsigned short type;
2711 unsigned short size;
2712 unsigned char *data = *p;
2713 int tlsext_servername = 0;
2714 int renegotiate_seen = 0;
2715
2716#ifndef OPENSSL_NO_NEXTPROTONEG
2717 s->s3->next_proto_neg_seen = 0;
2718#endif
2719
2720 if (s->s3->alpn_selected)
2721 {
2722 OPENSSL_free(s->s3->alpn_selected);
2723 s->s3->alpn_selected = NULL;
2724 }
2725
2726#ifndef OPENSSL_NO_HEARTBEATS
2727 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
2728 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
2729#endif
2730
2731 if (data >= (d+n-2))
2732 goto ri_check;
2733
2734 n2s(data,length);
2735 if (data+length != d+n)
2736 {
2737 *al = SSL_AD_DECODE_ERROR;
2738 return 0;
2739 }
2740
2741 while(data <= (d+n-4))
2742 {
2743 n2s(data,type);
2744 n2s(data,size);
2745
2746 if (data+size > (d+n))
2747 goto ri_check;
2748
2749 if (s->tlsext_debug_cb)
2750 s->tlsext_debug_cb(s, 1, type, data, size,
2751 s->tlsext_debug_arg);
2752
2753 if (type == TLSEXT_TYPE_server_name)
2754 {
2755 if (s->tlsext_hostname == NULL || size > 0)
2756 {
2757 *al = TLS1_AD_UNRECOGNIZED_NAME;
2758 return 0;
2759 }
2760 tlsext_servername = 1;
2761 }
2762
2763#ifndef OPENSSL_NO_EC
2764 else if (type == TLSEXT_TYPE_ec_point_formats)
2765 {
2766 unsigned char *sdata = data;
2767 int ecpointformatlist_length = *(sdata++);
2768
2769 if (ecpointformatlist_length != size - 1)
2770 {
2771 *al = TLS1_AD_DECODE_ERROR;
2772 return 0;
2773 }
2774 s->session->tlsext_ecpointformatlist_length = 0;
2775 if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
2776 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
2777 {
2778 *al = TLS1_AD_INTERNAL_ERROR;
2779 return 0;
2780 }
2781 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
2782 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
2783#if 0
2784 fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
2785 sdata = s->session->tlsext_ecpointformatlist;
2786 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
2787 fprintf(stderr,"%i ",*(sdata++));
2788 fprintf(stderr,"\n");
2789#endif
2790 }
2791#endif /* OPENSSL_NO_EC */
2792
2793 else if (type == TLSEXT_TYPE_session_ticket)
2794 {
2795 if (s->tls_session_ticket_ext_cb &&
2796 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
2797 {
2798 *al = TLS1_AD_INTERNAL_ERROR;
2799 return 0;
2800 }
2801 if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
2802 || (size > 0))
2803 {
2804 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2805 return 0;
2806 }
2807 s->tlsext_ticket_expected = 1;
2808 }
2809#ifdef TLSEXT_TYPE_opaque_prf_input
2810 else if (type == TLSEXT_TYPE_opaque_prf_input)
2811 {
2812 unsigned char *sdata = data;
2813
2814 if (size < 2)
2815 {
2816 *al = SSL_AD_DECODE_ERROR;
2817 return 0;
2818 }
2819 n2s(sdata, s->s3->server_opaque_prf_input_len);
2820 if (s->s3->server_opaque_prf_input_len != size - 2)
2821 {
2822 *al = SSL_AD_DECODE_ERROR;
2823 return 0;
2824 }
2825
2826 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
2827 OPENSSL_free(s->s3->server_opaque_prf_input);
2828 if (s->s3->server_opaque_prf_input_len == 0)
2829 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2830 else
2831 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
2832
2833 if (s->s3->server_opaque_prf_input == NULL)
2834 {
2835 *al = TLS1_AD_INTERNAL_ERROR;
2836 return 0;
2837 }
2838 }
2839#endif
2840 else if (type == TLSEXT_TYPE_status_request)
2841 {
2842 /* MUST be empty and only sent if we've requested
2843 * a status request message.
2844 */
2845 if ((s->tlsext_status_type == -1) || (size > 0))
2846 {
2847 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2848 return 0;
2849 }
2850 /* Set flag to expect CertificateStatus message */
2851 s->tlsext_status_expected = 1;
2852 }
2853#ifndef OPENSSL_NO_NEXTPROTONEG
2854 else if (type == TLSEXT_TYPE_next_proto_neg &&
2855 s->s3->tmp.finish_md_len == 0)
2856 {
2857 unsigned char *selected;
2858 unsigned char selected_len;
2859
2860 /* We must have requested it. */
2861 if (s->ctx->next_proto_select_cb == NULL)
2862 {
2863 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2864 return 0;
2865 }
2866 /* The data must be valid */
2867 if (!ssl_next_proto_validate(data, size))
2868 {
2869 *al = TLS1_AD_DECODE_ERROR;
2870 return 0;
2871 }
2872 if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
2873 {
2874 *al = TLS1_AD_INTERNAL_ERROR;
2875 return 0;
2876 }
2877 s->next_proto_negotiated = OPENSSL_malloc(selected_len);
2878 if (!s->next_proto_negotiated)
2879 {
2880 *al = TLS1_AD_INTERNAL_ERROR;
2881 return 0;
2882 }
2883 memcpy(s->next_proto_negotiated, selected, selected_len);
2884 s->next_proto_negotiated_len = selected_len;
2885 s->s3->next_proto_neg_seen = 1;
2886 }
2887#endif
2888
2889 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation)
2890 {
2891 unsigned len;
2892
2893 /* We must have requested it. */
2894 if (s->alpn_client_proto_list == NULL)
2895 {
2896 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2897 return 0;
2898 }
2899 if (size < 4)
2900 {
2901 *al = TLS1_AD_DECODE_ERROR;
2902 return 0;
2903 }
2904 /* The extension data consists of:
2905 * uint16 list_length
2906 * uint8 proto_length;
2907 * uint8 proto[proto_length]; */
2908 len = data[0];
2909 len <<= 8;
2910 len |= data[1];
2911 if (len != (unsigned) size - 2)
2912 {
2913 *al = TLS1_AD_DECODE_ERROR;
2914 return 0;
2915 }
2916 len = data[2];
2917 if (len != (unsigned) size - 3)
2918 {
2919 *al = TLS1_AD_DECODE_ERROR;
2920 return 0;
2921 }
2922 if (s->s3->alpn_selected)
2923 OPENSSL_free(s->s3->alpn_selected);
2924 s->s3->alpn_selected = OPENSSL_malloc(len);
2925 if (!s->s3->alpn_selected)
2926 {
2927 *al = TLS1_AD_INTERNAL_ERROR;
2928 return 0;
2929 }
2930 memcpy(s->s3->alpn_selected, data + 3, len);
2931 s->s3->alpn_selected_len = len;
2932 }
2933
Adam Langley1258b6a2014-06-20 12:00:00 -07002934 else if (type == TLSEXT_TYPE_channel_id)
2935 s->s3->tlsext_channel_id_valid = 1;
2936
2937 else if (type == TLSEXT_TYPE_channel_id_new)
2938 {
2939 s->s3->tlsext_channel_id_valid = 1;
2940 s->s3->tlsext_channel_id_new = 1;
2941 }
2942
Adam Langley95c29f32014-06-20 12:00:00 -07002943 else if (type == TLSEXT_TYPE_renegotiate)
2944 {
2945 if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
2946 return 0;
2947 renegotiate_seen = 1;
2948 }
2949#ifndef OPENSSL_NO_HEARTBEATS
2950 else if (type == TLSEXT_TYPE_heartbeat)
2951 {
2952 switch(data[0])
2953 {
2954 case 0x01: /* Server allows us to send HB requests */
2955 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2956 break;
2957 case 0x02: /* Server doesn't accept HB requests */
2958 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
2959 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
2960 break;
2961 default: *al = SSL_AD_ILLEGAL_PARAMETER;
2962 return 0;
2963 }
2964 }
2965#endif
2966 else if (type == TLSEXT_TYPE_use_srtp)
2967 {
2968 if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
2969 al))
2970 return 0;
2971 }
2972
2973 else if (type == TLSEXT_TYPE_server_authz)
2974 {
2975 /* We only support audit proofs. It's an error to send
2976 * an authz hello extension if the client
2977 * didn't request a proof. */
2978 unsigned char *sdata = data;
2979 unsigned char server_authz_dataformatlist_length;
2980
2981 if (!s->ctx->tlsext_authz_server_audit_proof_cb)
2982 {
2983 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
2984 return 0;
2985 }
2986
2987 if (!size)
2988 {
2989 *al = TLS1_AD_DECODE_ERROR;
2990 return 0;
2991 }
2992
2993 server_authz_dataformatlist_length = *(sdata++);
2994 if (server_authz_dataformatlist_length != size - 1)
2995 {
2996 *al = TLS1_AD_DECODE_ERROR;
2997 return 0;
2998 }
2999
3000 /* We only support audit proofs, so a legal ServerHello
3001 * authz list contains exactly one entry. */
3002 if (server_authz_dataformatlist_length != 1 ||
3003 sdata[0] != TLSEXT_AUTHZDATAFORMAT_audit_proof)
3004 {
3005 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
3006 return 0;
3007 }
3008
3009 s->s3->tlsext_authz_server_promised = 1;
3010 }
3011
3012 /* If this extension type was not otherwise handled, but
3013 * matches a custom_cli_ext_record, then send it to the c
3014 * callback */
3015 else if (s->ctx->custom_cli_ext_records_count)
3016 {
3017 size_t i;
3018 custom_cli_ext_record* record;
3019
3020 for (i = 0; i < s->ctx->custom_cli_ext_records_count; i++)
3021 {
3022 record = &s->ctx->custom_cli_ext_records[i];
3023 if (record->ext_type == type)
3024 {
3025 if (record->fn2 && !record->fn2(s, type, data, size, al, record->arg))
3026 return 0;
3027 break;
3028 }
3029 }
3030 }
3031
3032 data += size;
3033 }
3034
3035 if (data != d+n)
3036 {
3037 *al = SSL_AD_DECODE_ERROR;
3038 return 0;
3039 }
3040
3041 if (!s->hit && tlsext_servername == 1)
3042 {
3043 if (s->tlsext_hostname)
3044 {
3045 if (s->session->tlsext_hostname == NULL)
3046 {
3047 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
3048 if (!s->session->tlsext_hostname)
3049 {
3050 *al = SSL_AD_UNRECOGNIZED_NAME;
3051 return 0;
3052 }
3053 }
3054 else
3055 {
3056 *al = SSL_AD_DECODE_ERROR;
3057 return 0;
3058 }
3059 }
3060 }
3061
3062 *p = data;
3063
3064 ri_check:
3065
3066 /* Determine if we need to see RI. Strictly speaking if we want to
3067 * avoid an attack we should *always* see RI even on initial server
3068 * hello because the client doesn't see any renegotiation during an
3069 * attack. However this would mean we could not connect to any server
3070 * which doesn't support RI so for the immediate future tolerate RI
3071 * absence on initial connect only.
3072 */
3073 if (!renegotiate_seen
3074 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
3075 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
3076 {
3077 *al = SSL_AD_HANDSHAKE_FAILURE;
3078 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
3079 return 0;
3080 }
3081
3082 return 1;
3083 }
3084
3085
3086int ssl_prepare_clienthello_tlsext(SSL *s)
3087 {
3088
3089#ifdef TLSEXT_TYPE_opaque_prf_input
3090 {
3091 int r = 1;
3092
3093 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
3094 {
3095 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
3096 if (!r)
3097 return -1;
3098 }
3099
3100 if (s->tlsext_opaque_prf_input != NULL)
3101 {
3102 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
3103 OPENSSL_free(s->s3->client_opaque_prf_input);
3104
3105 if (s->tlsext_opaque_prf_input_len == 0)
3106 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
3107 else
3108 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
3109 if (s->s3->client_opaque_prf_input == NULL)
3110 {
3111 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, ERR_R_MALLOC_FAILURE);
3112 return -1;
3113 }
3114 s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
3115 }
3116
3117 if (r == 2)
3118 /* at callback's request, insist on receiving an appropriate server opaque PRF input */
3119 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
3120 }
3121#endif
3122
3123 return 1;
3124 }
3125
3126int ssl_prepare_serverhello_tlsext(SSL *s)
3127 {
3128 return 1;
3129 }
3130
3131static int ssl_check_clienthello_tlsext_early(SSL *s)
3132 {
3133 int ret=SSL_TLSEXT_ERR_NOACK;
3134 int al = SSL_AD_UNRECOGNIZED_NAME;
3135
3136#ifndef OPENSSL_NO_EC
3137 /* The handling of the ECPointFormats extension is done elsewhere, namely in
3138 * ssl3_choose_cipher in s3_lib.c.
3139 */
3140 /* The handling of the EllipticCurves extension is done elsewhere, namely in
3141 * ssl3_choose_cipher in s3_lib.c.
3142 */
3143#endif
3144
3145 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
3146 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
3147 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
3148 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
3149
3150#ifdef TLSEXT_TYPE_opaque_prf_input
3151 {
3152 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
3153 * but we might be sending an alert in response to the client hello,
3154 * so this has to happen here in
3155 * ssl_check_clienthello_tlsext_early(). */
3156
3157 int r = 1;
3158
3159 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
3160 {
3161 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
3162 if (!r)
3163 {
3164 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3165 al = SSL_AD_INTERNAL_ERROR;
3166 goto err;
3167 }
3168 }
3169
3170 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
3171 OPENSSL_free(s->s3->server_opaque_prf_input);
3172 s->s3->server_opaque_prf_input = NULL;
3173
3174 if (s->tlsext_opaque_prf_input != NULL)
3175 {
3176 if (s->s3->client_opaque_prf_input != NULL &&
3177 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
3178 {
3179 /* can only use this extension if we have a server opaque PRF input
3180 * of the same length as the client opaque PRF input! */
3181
3182 if (s->tlsext_opaque_prf_input_len == 0)
3183 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
3184 else
3185 s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
3186 if (s->s3->server_opaque_prf_input == NULL)
3187 {
3188 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3189 al = SSL_AD_INTERNAL_ERROR;
3190 goto err;
3191 }
3192 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
3193 }
3194 }
3195
3196 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
3197 {
3198 /* The callback wants to enforce use of the extension,
3199 * but we can't do that with the client opaque PRF input;
3200 * abort the handshake.
3201 */
3202 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3203 al = SSL_AD_HANDSHAKE_FAILURE;
3204 }
3205 }
3206
3207 err:
3208#endif
3209 switch (ret)
3210 {
3211 case SSL_TLSEXT_ERR_ALERT_FATAL:
3212 ssl3_send_alert(s,SSL3_AL_FATAL,al);
3213 return -1;
3214
3215 case SSL_TLSEXT_ERR_ALERT_WARNING:
3216 ssl3_send_alert(s,SSL3_AL_WARNING,al);
3217 return 1;
3218
3219 case SSL_TLSEXT_ERR_NOACK:
3220 s->servername_done=0;
3221 default:
3222 return 1;
3223 }
3224 }
3225
3226int ssl_check_clienthello_tlsext_late(SSL *s)
3227 {
3228 int ret = SSL_TLSEXT_ERR_OK;
3229 int al;
3230
3231 /* If status request then ask callback what to do.
3232 * Note: this must be called after servername callbacks in case
3233 * the certificate has changed, and must be called after the cipher
3234 * has been chosen because this may influence which certificate is sent
3235 */
3236 if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
3237 {
3238 int r;
3239 CERT_PKEY *certpkey;
3240 certpkey = ssl_get_server_send_pkey(s);
3241 /* If no certificate can't return certificate status */
3242 if (certpkey == NULL)
3243 {
3244 s->tlsext_status_expected = 0;
3245 return 1;
3246 }
3247 /* Set current certificate to one we will use so
3248 * SSL_get_certificate et al can pick it up.
3249 */
3250 s->cert->key = certpkey;
3251 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
3252 switch (r)
3253 {
3254 /* We don't want to send a status request response */
3255 case SSL_TLSEXT_ERR_NOACK:
3256 s->tlsext_status_expected = 0;
3257 break;
3258 /* status request response should be sent */
3259 case SSL_TLSEXT_ERR_OK:
3260 if (s->tlsext_ocsp_resp)
3261 s->tlsext_status_expected = 1;
3262 else
3263 s->tlsext_status_expected = 0;
3264 break;
3265 /* something bad happened */
3266 case SSL_TLSEXT_ERR_ALERT_FATAL:
3267 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3268 al = SSL_AD_INTERNAL_ERROR;
3269 goto err;
3270 }
3271 }
3272 else
3273 s->tlsext_status_expected = 0;
3274
3275 err:
3276 switch (ret)
3277 {
3278 case SSL_TLSEXT_ERR_ALERT_FATAL:
3279 ssl3_send_alert(s, SSL3_AL_FATAL, al);
3280 return -1;
3281
3282 case SSL_TLSEXT_ERR_ALERT_WARNING:
3283 ssl3_send_alert(s, SSL3_AL_WARNING, al);
3284 return 1;
3285
3286 default:
3287 return 1;
3288 }
3289 }
3290
3291int ssl_check_serverhello_tlsext(SSL *s)
3292 {
3293 int ret=SSL_TLSEXT_ERR_NOACK;
3294 int al = SSL_AD_UNRECOGNIZED_NAME;
3295
3296#ifndef OPENSSL_NO_EC
3297 /* If we are client and using an elliptic curve cryptography cipher
3298 * suite, then if server returns an EC point formats lists extension
3299 * it must contain uncompressed.
3300 */
3301 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
3302 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
3303 if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) &&
3304 (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) &&
3305 ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
3306 {
3307 /* we are using an ECC cipher */
3308 size_t i;
3309 unsigned char *list;
3310 int found_uncompressed = 0;
3311 list = s->session->tlsext_ecpointformatlist;
3312 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
3313 {
3314 if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
3315 {
3316 found_uncompressed = 1;
3317 break;
3318 }
3319 }
3320 if (!found_uncompressed)
3321 {
3322 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
3323 return -1;
3324 }
3325 }
3326 ret = SSL_TLSEXT_ERR_OK;
3327#endif /* OPENSSL_NO_EC */
3328
3329 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
3330 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
3331 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
3332 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
3333
3334#ifdef TLSEXT_TYPE_opaque_prf_input
3335 if (s->s3->server_opaque_prf_input_len > 0)
3336 {
3337 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
3338 * So first verify that we really have a value from the server too. */
3339
3340 if (s->s3->server_opaque_prf_input == NULL)
3341 {
3342 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3343 al = SSL_AD_HANDSHAKE_FAILURE;
3344 }
3345
3346 /* Anytime the server *has* sent an opaque PRF input, we need to check
3347 * that we have a client opaque PRF input of the same size. */
3348 if (s->s3->client_opaque_prf_input == NULL ||
3349 s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
3350 {
3351 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3352 al = SSL_AD_ILLEGAL_PARAMETER;
3353 }
3354 }
3355#endif
3356
3357 /* If we've requested certificate status and we wont get one
3358 * tell the callback
3359 */
3360 if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
3361 && s->ctx && s->ctx->tlsext_status_cb)
3362 {
3363 int r;
3364 /* Set resp to NULL, resplen to -1 so callback knows
3365 * there is no response.
3366 */
3367 if (s->tlsext_ocsp_resp)
3368 {
3369 OPENSSL_free(s->tlsext_ocsp_resp);
3370 s->tlsext_ocsp_resp = NULL;
3371 }
3372 s->tlsext_ocsp_resplen = -1;
3373 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
3374 if (r == 0)
3375 {
3376 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
3377 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3378 }
3379 if (r < 0)
3380 {
3381 al = SSL_AD_INTERNAL_ERROR;
3382 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
3383 }
3384 }
3385
3386 switch (ret)
3387 {
3388 case SSL_TLSEXT_ERR_ALERT_FATAL:
3389 ssl3_send_alert(s,SSL3_AL_FATAL,al);
3390 return -1;
3391
3392 case SSL_TLSEXT_ERR_ALERT_WARNING:
3393 ssl3_send_alert(s,SSL3_AL_WARNING,al);
3394 return 1;
3395
3396 case SSL_TLSEXT_ERR_NOACK:
3397 s->servername_done=0;
3398 default:
3399 return 1;
3400 }
3401 }
3402
3403int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n)
3404 {
3405 int al = -1;
3406 if (s->version < SSL3_VERSION)
3407 return 1;
3408 if (ssl_scan_serverhello_tlsext(s, p, d, n, &al) <= 0)
3409 {
3410 ssl3_send_alert(s,SSL3_AL_FATAL,al);
3411 return 0;
3412 }
3413
3414 if (ssl_check_serverhello_tlsext(s) <= 0)
3415 {
3416 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_SERVERHELLO_TLSEXT);
3417 return 0;
3418 }
3419 return 1;
3420}
3421
3422/* Since the server cache lookup is done early on in the processing of the
3423 * ClientHello, and other operations depend on the result, we need to handle
3424 * any TLS session ticket extension at the same time.
3425 *
3426 * session_id: points at the session ID in the ClientHello. This code will
3427 * read past the end of this in order to parse out the session ticket
3428 * extension, if any.
3429 * len: the length of the session ID.
3430 * limit: a pointer to the first byte after the ClientHello.
3431 * ret: (output) on return, if a ticket was decrypted, then this is set to
3432 * point to the resulting session.
3433 *
3434 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
3435 * ciphersuite, in which case we have no use for session tickets and one will
3436 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
3437 *
3438 * Returns:
3439 * -1: fatal error, either from parsing or decrypting the ticket.
3440 * 0: no ticket was found (or was ignored, based on settings).
3441 * 1: a zero length extension was found, indicating that the client supports
3442 * session tickets but doesn't currently have one to offer.
3443 * 2: either s->tls_session_secret_cb was set, or a ticket was offered but
3444 * couldn't be decrypted because of a non-fatal error.
3445 * 3: a ticket was successfully decrypted and *ret was set.
3446 *
3447 * Side effects:
3448 * Sets s->tlsext_ticket_expected to 1 if the server will have to issue
3449 * a new session ticket to the client because the client indicated support
3450 * (and s->tls_session_secret_cb is NULL) but the client either doesn't have
3451 * a session ticket or we couldn't use the one it gave us, or if
3452 * s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
3453 * Otherwise, s->tlsext_ticket_expected is set to 0.
3454 */
3455int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
3456 const unsigned char *limit, SSL_SESSION **ret)
3457 {
3458 /* Point after session ID in client hello */
3459 const unsigned char *p = session_id + len;
3460 unsigned short i;
3461
3462 *ret = NULL;
3463 s->tlsext_ticket_expected = 0;
3464
3465 /* If tickets disabled behave as if no ticket present
3466 * to permit stateful resumption.
3467 */
3468 if (SSL_get_options(s) & SSL_OP_NO_TICKET)
3469 return 0;
3470 if ((s->version <= SSL3_VERSION) || !limit)
3471 return 0;
3472 if (p >= limit)
3473 return -1;
3474 /* Skip past DTLS cookie */
3475 if (SSL_IS_DTLS(s))
3476 {
3477 i = *(p++);
3478 p+= i;
3479 if (p >= limit)
3480 return -1;
3481 }
3482 /* Skip past cipher list */
3483 n2s(p, i);
3484 p+= i;
3485 if (p >= limit)
3486 return -1;
3487 /* Skip past compression algorithm list */
3488 i = *(p++);
3489 p += i;
3490 if (p > limit)
3491 return -1;
3492 /* Now at start of extensions */
3493 if ((p + 2) >= limit)
3494 return 0;
3495 n2s(p, i);
3496 while ((p + 4) <= limit)
3497 {
3498 unsigned short type, size;
3499 n2s(p, type);
3500 n2s(p, size);
3501 if (p + size > limit)
3502 return 0;
3503 if (type == TLSEXT_TYPE_session_ticket)
3504 {
3505 int r;
3506 if (size == 0)
3507 {
3508 /* The client will accept a ticket but doesn't
3509 * currently have one. */
3510 s->tlsext_ticket_expected = 1;
3511 return 1;
3512 }
3513 if (s->tls_session_secret_cb)
3514 {
3515 /* Indicate that the ticket couldn't be
3516 * decrypted rather than generating the session
3517 * from ticket now, trigger abbreviated
3518 * handshake based on external mechanism to
3519 * calculate the master secret later. */
3520 return 2;
3521 }
3522 r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
3523 switch (r)
3524 {
3525 case 2: /* ticket couldn't be decrypted */
3526 s->tlsext_ticket_expected = 1;
3527 return 2;
3528 case 3: /* ticket was decrypted */
3529 return r;
3530 case 4: /* ticket decrypted but need to renew */
3531 s->tlsext_ticket_expected = 1;
3532 return 3;
3533 default: /* fatal error */
3534 return -1;
3535 }
3536 }
3537 p += size;
3538 }
3539 return 0;
3540 }
3541
3542/* tls_decrypt_ticket attempts to decrypt a session ticket.
3543 *
3544 * etick: points to the body of the session ticket extension.
3545 * eticklen: the length of the session tickets extenion.
3546 * sess_id: points at the session ID.
3547 * sesslen: the length of the session ID.
3548 * psess: (output) on return, if a ticket was decrypted, then this is set to
3549 * point to the resulting session.
3550 *
3551 * Returns:
3552 * -1: fatal error, either from parsing or decrypting the ticket.
3553 * 2: the ticket couldn't be decrypted.
3554 * 3: a ticket was successfully decrypted and *psess was set.
3555 * 4: same as 3, but the ticket needs to be renewed.
3556 */
3557static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
3558 const unsigned char *sess_id, int sesslen,
3559 SSL_SESSION **psess)
3560 {
3561 SSL_SESSION *sess;
3562 unsigned char *sdec;
3563 const unsigned char *p;
3564 int slen, mlen, renew_ticket = 0;
3565 unsigned char tick_hmac[EVP_MAX_MD_SIZE];
3566 HMAC_CTX hctx;
3567 EVP_CIPHER_CTX ctx;
3568 SSL_CTX *tctx = s->initial_ctx;
3569 /* Need at least keyname + iv + some encrypted data */
3570 if (eticklen < 48)
3571 return 2;
3572 /* Initialize session ticket encryption and HMAC contexts */
3573 HMAC_CTX_init(&hctx);
3574 EVP_CIPHER_CTX_init(&ctx);
3575 if (tctx->tlsext_ticket_key_cb)
3576 {
3577 unsigned char *nctick = (unsigned char *)etick;
3578 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
3579 &ctx, &hctx, 0);
3580 if (rv < 0)
3581 return -1;
3582 if (rv == 0)
3583 return 2;
3584 if (rv == 2)
3585 renew_ticket = 1;
3586 }
3587 else
3588 {
3589 /* Check key name matches */
3590 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
3591 return 2;
3592 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
3593 tlsext_tick_md(), NULL);
3594 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
3595 tctx->tlsext_tick_aes_key, etick + 16);
3596 }
3597 /* Attempt to process session ticket, first conduct sanity and
3598 * integrity checks on ticket.
3599 */
3600 mlen = HMAC_size(&hctx);
3601 if (mlen < 0)
3602 {
3603 EVP_CIPHER_CTX_cleanup(&ctx);
3604 return -1;
3605 }
3606 eticklen -= mlen;
3607 /* Check HMAC of encrypted ticket */
3608 HMAC_Update(&hctx, etick, eticklen);
3609 HMAC_Final(&hctx, tick_hmac, NULL);
3610 HMAC_CTX_cleanup(&hctx);
3611 if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
3612 return 2;
3613 /* Attempt to decrypt session data */
3614 /* Move p after IV to start of encrypted ticket, update length */
3615 p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
3616 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
3617 sdec = OPENSSL_malloc(eticklen);
3618 if (!sdec)
3619 {
3620 EVP_CIPHER_CTX_cleanup(&ctx);
3621 return -1;
3622 }
3623 EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
3624 if (EVP_DecryptFinal_ex(&ctx, sdec + slen, &mlen) <= 0)
3625 return 2;
3626 slen += mlen;
3627 EVP_CIPHER_CTX_cleanup(&ctx);
3628 p = sdec;
3629
3630 sess = d2i_SSL_SESSION(NULL, &p, slen);
3631 OPENSSL_free(sdec);
3632 if (sess)
3633 {
3634 /* The session ID, if non-empty, is used by some clients to
3635 * detect that the ticket has been accepted. So we copy it to
3636 * the session structure. If it is empty set length to zero
3637 * as required by standard.
3638 */
3639 if (sesslen)
3640 memcpy(sess->session_id, sess_id, sesslen);
3641 sess->session_id_length = sesslen;
3642 *psess = sess;
3643 if (renew_ticket)
3644 return 4;
3645 else
3646 return 3;
3647 }
3648 ERR_clear_error();
3649 /* For session parse failure, indicate that we need to send a new
3650 * ticket. */
3651 return 2;
3652 }
3653
3654/* Tables to translate from NIDs to TLS v1.2 ids */
3655
3656typedef struct
3657 {
3658 int nid;
3659 int id;
3660 } tls12_lookup;
3661
3662static tls12_lookup tls12_md[] = {
3663 {NID_md5, TLSEXT_hash_md5},
3664 {NID_sha1, TLSEXT_hash_sha1},
3665 {NID_sha224, TLSEXT_hash_sha224},
3666 {NID_sha256, TLSEXT_hash_sha256},
3667 {NID_sha384, TLSEXT_hash_sha384},
3668 {NID_sha512, TLSEXT_hash_sha512}
3669};
3670
3671static tls12_lookup tls12_sig[] = {
3672 {EVP_PKEY_RSA, TLSEXT_signature_rsa},
3673 {EVP_PKEY_DSA, TLSEXT_signature_dsa},
3674 {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
3675};
3676
3677static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
3678 {
3679 size_t i;
3680 for (i = 0; i < tlen; i++)
3681 {
3682 if (table[i].nid == nid)
3683 return table[i].id;
3684 }
3685 return -1;
3686 }
3687
3688static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
3689 {
3690 size_t i;
3691 for (i = 0; i < tlen; i++)
3692 {
3693 if ((table[i].id) == id)
3694 return table[i].nid;
3695 }
3696 return NID_undef;
3697 }
3698
3699int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
3700 {
3701 int sig_id, md_id;
3702 if (!md)
3703 return 0;
3704 md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
3705 sizeof(tls12_md)/sizeof(tls12_lookup));
3706 if (md_id == -1)
3707 return 0;
3708 sig_id = tls12_get_sigid(pk);
3709 if (sig_id == -1)
3710 return 0;
3711 p[0] = (unsigned char)md_id;
3712 p[1] = (unsigned char)sig_id;
3713 return 1;
3714 }
3715
3716int tls12_get_sigid(const EVP_PKEY *pk)
3717 {
3718 return tls12_find_id(pk->type, tls12_sig,
3719 sizeof(tls12_sig)/sizeof(tls12_lookup));
3720 }
3721
3722const EVP_MD *tls12_get_hash(unsigned char hash_alg)
3723 {
3724 switch(hash_alg)
3725 {
3726#ifndef OPENSSL_NO_MD5
3727 case TLSEXT_hash_md5:
3728#ifdef OPENSSL_FIPS
3729 if (FIPS_mode())
3730 return NULL;
3731#endif
3732 return EVP_md5();
3733#endif
3734#ifndef OPENSSL_NO_SHA
3735 case TLSEXT_hash_sha1:
3736 return EVP_sha1();
3737#endif
3738#ifndef OPENSSL_NO_SHA256
3739 case TLSEXT_hash_sha224:
3740 return EVP_sha224();
3741
3742 case TLSEXT_hash_sha256:
3743 return EVP_sha256();
3744#endif
3745#ifndef OPENSSL_NO_SHA512
3746 case TLSEXT_hash_sha384:
3747 return EVP_sha384();
3748
3749 case TLSEXT_hash_sha512:
3750 return EVP_sha512();
3751#endif
3752 default:
3753 return NULL;
3754
3755 }
3756 }
3757
3758static int tls12_get_pkey_idx(unsigned char sig_alg)
3759 {
3760 switch(sig_alg)
3761 {
3762#ifndef OPENSSL_NO_RSA
3763 case TLSEXT_signature_rsa:
3764 return SSL_PKEY_RSA_SIGN;
3765#endif
3766#ifndef OPENSSL_NO_DSA
3767 case TLSEXT_signature_dsa:
3768 return SSL_PKEY_DSA_SIGN;
3769#endif
3770#ifndef OPENSSL_NO_ECDSA
3771 case TLSEXT_signature_ecdsa:
3772 return SSL_PKEY_ECC;
3773#endif
3774 }
3775 return -1;
3776 }
3777
3778/* Convert TLS 1.2 signature algorithm extension values into NIDs */
3779static void tls1_lookup_sigalg(int *phash_nid, int *psign_nid,
3780 int *psignhash_nid, const unsigned char *data)
3781 {
3782 int sign_nid = 0, hash_nid = 0;
3783 if (!phash_nid && !psign_nid && !psignhash_nid)
3784 return;
3785 if (phash_nid || psignhash_nid)
3786 {
3787 hash_nid = tls12_find_nid(data[0], tls12_md,
3788 sizeof(tls12_md)/sizeof(tls12_lookup));
3789 if (phash_nid)
3790 *phash_nid = hash_nid;
3791 }
3792 if (psign_nid || psignhash_nid)
3793 {
3794 sign_nid = tls12_find_nid(data[1], tls12_sig,
3795 sizeof(tls12_sig)/sizeof(tls12_lookup));
3796 if (psign_nid)
3797 *psign_nid = sign_nid;
3798 }
3799 if (psignhash_nid)
3800 {
3801 if (sign_nid && hash_nid)
3802 OBJ_find_sigid_by_algs(psignhash_nid,
3803 hash_nid, sign_nid);
3804 else
3805 *psignhash_nid = NID_undef;
3806 }
3807 }
3808/* Given preference and allowed sigalgs set shared sigalgs */
3809static int tls12_do_shared_sigalgs(TLS_SIGALGS *shsig,
3810 const unsigned char *pref, size_t preflen,
3811 const unsigned char *allow, size_t allowlen)
3812 {
3813 const unsigned char *ptmp, *atmp;
3814 size_t i, j, nmatch = 0;
3815 for (i = 0, ptmp = pref; i < preflen; i+=2, ptmp+=2)
3816 {
3817 /* Skip disabled hashes or signature algorithms */
3818 if (tls12_get_hash(ptmp[0]) == NULL)
3819 continue;
3820 if (tls12_get_pkey_idx(ptmp[1]) == -1)
3821 continue;
3822 for (j = 0, atmp = allow; j < allowlen; j+=2, atmp+=2)
3823 {
3824 if (ptmp[0] == atmp[0] && ptmp[1] == atmp[1])
3825 {
3826 nmatch++;
3827 if (shsig)
3828 {
3829 shsig->rhash = ptmp[0];
3830 shsig->rsign = ptmp[1];
3831 tls1_lookup_sigalg(&shsig->hash_nid,
3832 &shsig->sign_nid,
3833 &shsig->signandhash_nid,
3834 ptmp);
3835 shsig++;
3836 }
3837 break;
3838 }
3839 }
3840 }
3841 return nmatch;
3842 }
3843
3844/* Set shared signature algorithms for SSL structures */
3845static int tls1_set_shared_sigalgs(SSL *s)
3846 {
3847 const unsigned char *pref, *allow, *conf;
3848 size_t preflen, allowlen, conflen;
3849 size_t nmatch;
3850 TLS_SIGALGS *salgs = NULL;
3851 CERT *c = s->cert;
3852 unsigned int is_suiteb = tls1_suiteb(s);
3853 /* If client use client signature algorithms if not NULL */
3854 if (!s->server && c->client_sigalgs && !is_suiteb)
3855 {
3856 conf = c->client_sigalgs;
3857 conflen = c->client_sigalgslen;
3858 }
3859 else if (c->conf_sigalgs && !is_suiteb)
3860 {
3861 conf = c->conf_sigalgs;
3862 conflen = c->conf_sigalgslen;
3863 }
3864 else
3865 conflen = tls12_get_psigalgs(s, &conf);
3866 if(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || is_suiteb)
3867 {
3868 pref = conf;
3869 preflen = conflen;
3870 allow = c->peer_sigalgs;
3871 allowlen = c->peer_sigalgslen;
3872 }
3873 else
3874 {
3875 allow = conf;
3876 allowlen = conflen;
3877 pref = c->peer_sigalgs;
3878 preflen = c->peer_sigalgslen;
3879 }
3880 nmatch = tls12_do_shared_sigalgs(NULL, pref, preflen, allow, allowlen);
3881 if (!nmatch)
3882 return 1;
3883 salgs = OPENSSL_malloc(nmatch * sizeof(TLS_SIGALGS));
3884 if (!salgs)
3885 return 0;
3886 nmatch = tls12_do_shared_sigalgs(salgs, pref, preflen, allow, allowlen);
3887 c->shared_sigalgs = salgs;
3888 c->shared_sigalgslen = nmatch;
3889 return 1;
3890 }
3891
3892
3893/* Set preferred digest for each key type */
3894
3895int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
3896 {
3897 int idx;
3898 size_t i;
3899 const EVP_MD *md;
3900 CERT *c = s->cert;
3901 TLS_SIGALGS *sigptr;
3902 /* Extension ignored for inappropriate versions */
3903 if (!SSL_USE_SIGALGS(s))
3904 return 1;
3905 /* Should never happen */
3906 if (!c)
3907 return 0;
3908
3909 c->peer_sigalgs = OPENSSL_malloc(dsize);
3910 if (!c->peer_sigalgs)
3911 return 0;
3912 c->peer_sigalgslen = dsize;
3913 memcpy(c->peer_sigalgs, data, dsize);
3914
3915 tls1_set_shared_sigalgs(s);
3916
3917#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
3918 if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
3919 {
3920 /* Use first set signature preference to force message
3921 * digest, ignoring any peer preferences.
3922 */
3923 const unsigned char *sigs = NULL;
3924 if (s->server)
3925 sigs = c->conf_sigalgs;
3926 else
3927 sigs = c->client_sigalgs;
3928 if (sigs)
3929 {
3930 idx = tls12_get_pkey_idx(sigs[1]);
3931 md = tls12_get_hash(sigs[0]);
3932 c->pkeys[idx].digest = md;
3933 c->pkeys[idx].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3934 if (idx == SSL_PKEY_RSA_SIGN)
3935 {
3936 c->pkeys[SSL_PKEY_RSA_ENC].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3937 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
3938 }
3939 }
3940 }
3941#endif
3942
3943 for (i = 0, sigptr = c->shared_sigalgs;
3944 i < c->shared_sigalgslen; i++, sigptr++)
3945 {
3946 idx = tls12_get_pkey_idx(sigptr->rsign);
3947 if (idx > 0 && c->pkeys[idx].digest == NULL)
3948 {
3949 md = tls12_get_hash(sigptr->rhash);
3950 c->pkeys[idx].digest = md;
3951 c->pkeys[idx].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3952 if (idx == SSL_PKEY_RSA_SIGN)
3953 {
3954 c->pkeys[SSL_PKEY_RSA_ENC].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
3955 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
3956 }
3957 }
3958
3959 }
3960 /* In strict mode leave unset digests as NULL to indicate we can't
3961 * use the certificate for signing.
3962 */
3963 if (!(s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT))
3964 {
3965 /* Set any remaining keys to default values. NOTE: if alg is
3966 * not supported it stays as NULL.
3967 */
3968#ifndef OPENSSL_NO_DSA
3969 if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
3970 c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
3971#endif
3972#ifndef OPENSSL_NO_RSA
3973 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
3974 {
3975 c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
3976 c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
3977 }
3978#endif
3979#ifndef OPENSSL_NO_ECDSA
3980 if (!c->pkeys[SSL_PKEY_ECC].digest)
3981 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
3982#endif
3983 }
3984 return 1;
3985 }
3986
3987
3988int SSL_get_sigalgs(SSL *s, int idx,
3989 int *psign, int *phash, int *psignhash,
3990 unsigned char *rsig, unsigned char *rhash)
3991 {
3992 const unsigned char *psig = s->cert->peer_sigalgs;
3993 if (psig == NULL)
3994 return 0;
3995 if (idx >= 0)
3996 {
3997 idx <<= 1;
3998 if (idx >= (int)s->cert->peer_sigalgslen)
3999 return 0;
4000 psig += idx;
4001 if (rhash)
4002 *rhash = psig[0];
4003 if (rsig)
4004 *rsig = psig[1];
4005 tls1_lookup_sigalg(phash, psign, psignhash, psig);
4006 }
4007 return s->cert->peer_sigalgslen / 2;
4008 }
4009
4010int SSL_get_shared_sigalgs(SSL *s, int idx,
4011 int *psign, int *phash, int *psignhash,
4012 unsigned char *rsig, unsigned char *rhash)
4013 {
4014 TLS_SIGALGS *shsigalgs = s->cert->shared_sigalgs;
4015 if (!shsigalgs || idx >= (int)s->cert->shared_sigalgslen)
4016 return 0;
4017 shsigalgs += idx;
4018 if (phash)
4019 *phash = shsigalgs->hash_nid;
4020 if (psign)
4021 *psign = shsigalgs->sign_nid;
4022 if (psignhash)
4023 *psignhash = shsigalgs->signandhash_nid;
4024 if (rsig)
4025 *rsig = shsigalgs->rsign;
4026 if (rhash)
4027 *rhash = shsigalgs->rhash;
4028 return s->cert->shared_sigalgslen;
4029 }
4030
4031
4032#ifndef OPENSSL_NO_HEARTBEATS
4033int
4034tls1_process_heartbeat(SSL *s)
4035 {
4036 unsigned char *p = &s->s3->rrec.data[0], *pl;
4037 unsigned short hbtype;
4038 unsigned int payload;
4039 unsigned int padding = 16; /* Use minimum padding */
4040
4041 /* Read type and payload length first */
4042 hbtype = *p++;
4043 n2s(p, payload);
4044 pl = p;
4045
4046 if (s->msg_callback)
4047 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
4048 &s->s3->rrec.data[0], s->s3->rrec.length,
4049 s, s->msg_callback_arg);
4050
4051 if (hbtype == TLS1_HB_REQUEST)
4052 {
4053 unsigned char *buffer, *bp;
4054 int r;
4055
4056 /* Allocate memory for the response, size is 1 bytes
4057 * message type, plus 2 bytes payload length, plus
4058 * payload, plus padding
4059 */
4060 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
4061 bp = buffer;
4062
4063 /* Enter response type, length and copy payload */
4064 *bp++ = TLS1_HB_RESPONSE;
4065 s2n(payload, bp);
4066 memcpy(bp, pl, payload);
4067 bp += payload;
4068 /* Random padding */
4069 RAND_pseudo_bytes(bp, padding);
4070
4071 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
4072
4073 if (r >= 0 && s->msg_callback)
4074 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
4075 buffer, 3 + payload + padding,
4076 s, s->msg_callback_arg);
4077
4078 OPENSSL_free(buffer);
4079
4080 if (r < 0)
4081 return r;
4082 }
4083 else if (hbtype == TLS1_HB_RESPONSE)
4084 {
4085 unsigned int seq;
4086
4087 /* We only send sequence numbers (2 bytes unsigned int),
4088 * and 16 random bytes, so we just try to read the
4089 * sequence number */
4090 n2s(pl, seq);
4091
4092 if (payload == 18 && seq == s->tlsext_hb_seq)
4093 {
4094 s->tlsext_hb_seq++;
4095 s->tlsext_hb_pending = 0;
4096 }
4097 }
4098
4099 return 0;
4100 }
4101
4102int
4103tls1_heartbeat(SSL *s)
4104 {
4105 unsigned char *buf, *p;
4106 int ret;
4107 unsigned int payload = 18; /* Sequence number + random bytes */
4108 unsigned int padding = 16; /* Use minimum padding */
4109
4110 /* Only send if peer supports and accepts HB requests... */
4111 if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
4112 s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
4113 {
4114 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
4115 return -1;
4116 }
4117
4118 /* ...and there is none in flight yet... */
4119 if (s->tlsext_hb_pending)
4120 {
4121 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_TLS_HEARTBEAT_PENDING);
4122 return -1;
4123 }
4124
4125 /* ...and no handshake in progress. */
4126 if (SSL_in_init(s) || s->in_handshake)
4127 {
4128 OPENSSL_PUT_ERROR(SSL, ssl_add_serverhello_tlsext, SSL_R_UNEXPECTED_MESSAGE);
4129 return -1;
4130 }
4131
4132 /* Check if padding is too long, payload and padding
4133 * must not exceed 2^14 - 3 = 16381 bytes in total.
4134 */
4135 assert(payload + padding <= 16381);
4136
4137 /* Create HeartBeat message, we just use a sequence number
4138 * as payload to distuingish different messages and add
4139 * some random stuff.
4140 * - Message Type, 1 byte
4141 * - Payload Length, 2 bytes (unsigned int)
4142 * - Payload, the sequence number (2 bytes uint)
4143 * - Payload, random bytes (16 bytes uint)
4144 * - Padding
4145 */
4146 buf = OPENSSL_malloc(1 + 2 + payload + padding);
4147 p = buf;
4148 /* Message Type */
4149 *p++ = TLS1_HB_REQUEST;
4150 /* Payload length (18 bytes here) */
4151 s2n(payload, p);
4152 /* Sequence number */
4153 s2n(s->tlsext_hb_seq, p);
4154 /* 16 random bytes */
4155 RAND_pseudo_bytes(p, 16);
4156 p += 16;
4157 /* Random padding */
4158 RAND_pseudo_bytes(p, padding);
4159
4160 ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
4161 if (ret >= 0)
4162 {
4163 if (s->msg_callback)
4164 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
4165 buf, 3 + payload + padding,
4166 s, s->msg_callback_arg);
4167
4168 s->tlsext_hb_pending = 1;
4169 }
4170
4171 OPENSSL_free(buf);
4172
4173 return ret;
4174 }
4175#endif
4176
Adam Langley1258b6a2014-06-20 12:00:00 -07004177#if !defined(OPENSSL_NO_TLSEXT)
4178/* tls1_channel_id_hash calculates the signed data for a Channel ID on the given
4179 * SSL connection and writes it to |md|. */
4180int
4181tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s)
4182 {
4183 EVP_MD_CTX ctx;
4184 unsigned char temp_digest[EVP_MAX_MD_SIZE];
4185 unsigned temp_digest_len;
4186 int i;
4187 static const char kClientIDMagic[] = "TLS Channel ID signature";
4188
4189 if (s->s3->handshake_buffer)
4190 if (!ssl3_digest_cached_records(s))
4191 return 0;
4192
4193 EVP_DigestUpdate(md, kClientIDMagic, sizeof(kClientIDMagic));
4194
4195 if (s->hit && s->s3->tlsext_channel_id_new)
4196 {
4197 static const char kResumptionMagic[] = "Resumption";
4198 EVP_DigestUpdate(md, kResumptionMagic,
4199 sizeof(kResumptionMagic));
4200 if (s->session->original_handshake_hash_len == 0)
4201 return 0;
4202 EVP_DigestUpdate(md, s->session->original_handshake_hash,
4203 s->session->original_handshake_hash_len);
4204 }
4205
4206 EVP_MD_CTX_init(&ctx);
4207 for (i = 0; i < SSL_MAX_DIGEST; i++)
4208 {
4209 if (s->s3->handshake_dgst[i] == NULL)
4210 continue;
4211 EVP_MD_CTX_copy_ex(&ctx, s->s3->handshake_dgst[i]);
4212 EVP_DigestFinal_ex(&ctx, temp_digest, &temp_digest_len);
4213 EVP_DigestUpdate(md, temp_digest, temp_digest_len);
4214 }
4215 EVP_MD_CTX_cleanup(&ctx);
4216
4217 return 1;
4218 }
4219#endif
4220
4221/* tls1_record_handshake_hashes_for_channel_id records the current handshake
4222 * hashes in |s->session| so that Channel ID resumptions can sign that data. */
4223int tls1_record_handshake_hashes_for_channel_id(SSL *s)
4224 {
4225 int digest_len;
4226 /* This function should never be called for a resumed session because
4227 * the handshake hashes that we wish to record are for the original,
4228 * full handshake. */
4229 if (s->hit)
4230 return -1;
4231 /* It only makes sense to call this function if Channel IDs have been
4232 * negotiated. */
4233 if (!s->s3->tlsext_channel_id_new)
4234 return -1;
4235
4236 digest_len = tls1_handshake_digest(
4237 s, s->session->original_handshake_hash,
4238 sizeof(s->session->original_handshake_hash));
4239 if (digest_len < 0)
4240 return -1;
4241
4242 s->session->original_handshake_hash_len = digest_len;
4243
4244 return 1;
4245 }
4246
Adam Langley95c29f32014-06-20 12:00:00 -07004247/* TODO(fork): remove */
4248#if 0
4249#define MAX_SIGALGLEN (TLSEXT_hash_num * TLSEXT_signature_num * 2)
4250
4251typedef struct
4252 {
4253 size_t sigalgcnt;
4254 int sigalgs[MAX_SIGALGLEN];
4255 } sig_cb_st;
4256
4257static int sig_cb(const char *elem, int len, void *arg)
4258 {
4259 sig_cb_st *sarg = arg;
4260 size_t i;
4261 char etmp[20], *p;
4262 int sig_alg, hash_alg;
4263 if (sarg->sigalgcnt == MAX_SIGALGLEN)
4264 return 0;
4265 if (len > (int)(sizeof(etmp) - 1))
4266 return 0;
4267 memcpy(etmp, elem, len);
4268 etmp[len] = 0;
4269 p = strchr(etmp, '+');
4270 if (!p)
4271 return 0;
4272 *p = 0;
4273 p++;
4274 if (!*p)
4275 return 0;
4276
4277 if (!strcmp(etmp, "RSA"))
4278 sig_alg = EVP_PKEY_RSA;
4279 else if (!strcmp(etmp, "DSA"))
4280 sig_alg = EVP_PKEY_DSA;
4281 else if (!strcmp(etmp, "ECDSA"))
4282 sig_alg = EVP_PKEY_EC;
4283 else return 0;
4284
4285 hash_alg = OBJ_sn2nid(p);
4286 if (hash_alg == NID_undef)
4287 hash_alg = OBJ_ln2nid(p);
4288 if (hash_alg == NID_undef)
4289 return 0;
4290
4291 for (i = 0; i < sarg->sigalgcnt; i+=2)
4292 {
4293 if (sarg->sigalgs[i] == sig_alg
4294 && sarg->sigalgs[i + 1] == hash_alg)
4295 return 0;
4296 }
4297 sarg->sigalgs[sarg->sigalgcnt++] = hash_alg;
4298 sarg->sigalgs[sarg->sigalgcnt++] = sig_alg;
4299 return 1;
4300 }
4301
4302/* Set suppored signature algorithms based on a colon separated list
4303 * of the form sig+hash e.g. RSA+SHA512:DSA+SHA512 */
4304int tls1_set_sigalgs_list(CERT *c, const char *str, int client)
4305 {
4306 sig_cb_st sig;
4307 sig.sigalgcnt = 0;
4308 if (!CONF_parse_list(str, ':', 1, sig_cb, &sig))
4309 return 0;
4310 if (c == NULL)
4311 return 1;
4312 return tls1_set_sigalgs(c, sig.sigalgs, sig.sigalgcnt, client);
4313 }
4314#endif
4315
4316int tls1_set_sigalgs(CERT *c, const int *psig_nids, size_t salglen, int client)
4317 {
4318 unsigned char *sigalgs, *sptr;
4319 int rhash, rsign;
4320 size_t i;
4321 if (salglen & 1)
4322 return 0;
4323 sigalgs = OPENSSL_malloc(salglen);
4324 if (sigalgs == NULL)
4325 return 0;
4326 for (i = 0, sptr = sigalgs; i < salglen; i+=2)
4327 {
4328 rhash = tls12_find_id(*psig_nids++, tls12_md,
4329 sizeof(tls12_md)/sizeof(tls12_lookup));
4330 rsign = tls12_find_id(*psig_nids++, tls12_sig,
4331 sizeof(tls12_sig)/sizeof(tls12_lookup));
4332
4333 if (rhash == -1 || rsign == -1)
4334 goto err;
4335 *sptr++ = rhash;
4336 *sptr++ = rsign;
4337 }
4338
4339 if (client)
4340 {
4341 if (c->client_sigalgs)
4342 OPENSSL_free(c->client_sigalgs);
4343 c->client_sigalgs = sigalgs;
4344 c->client_sigalgslen = salglen;
4345 }
4346 else
4347 {
4348 if (c->conf_sigalgs)
4349 OPENSSL_free(c->conf_sigalgs);
4350 c->conf_sigalgs = sigalgs;
4351 c->conf_sigalgslen = salglen;
4352 }
4353
4354 return 1;
4355
4356 err:
4357 OPENSSL_free(sigalgs);
4358 return 0;
4359 }
4360
4361static int tls1_check_sig_alg(CERT *c, X509 *x, int default_nid)
4362 {
4363 int sig_nid;
4364 size_t i;
4365 if (default_nid == -1)
4366 return 1;
4367 sig_nid = X509_get_signature_nid(x);
4368 if (default_nid)
4369 return sig_nid == default_nid ? 1 : 0;
4370 for (i = 0; i < c->shared_sigalgslen; i++)
4371 if (sig_nid == c->shared_sigalgs[i].signandhash_nid)
4372 return 1;
4373 return 0;
4374 }
4375/* Check to see if a certificate issuer name matches list of CA names */
4376static int ssl_check_ca_name(STACK_OF(X509_NAME) *names, X509 *x)
4377 {
4378 X509_NAME *nm;
4379 int i;
4380 nm = X509_get_issuer_name(x);
4381 for (i = 0; i < sk_X509_NAME_num(names); i++)
4382 {
4383 if(!X509_NAME_cmp(nm, sk_X509_NAME_value(names, i)))
4384 return 1;
4385 }
4386 return 0;
4387 }
4388
4389/* Check certificate chain is consistent with TLS extensions and is
4390 * usable by server. This servers two purposes: it allows users to
4391 * check chains before passing them to the server and it allows the
4392 * server to check chains before attempting to use them.
4393 */
4394
4395/* Flags which need to be set for a certificate when stict mode not set */
4396
4397#define CERT_PKEY_VALID_FLAGS \
4398 (CERT_PKEY_EE_SIGNATURE|CERT_PKEY_EE_PARAM)
4399/* Strict mode flags */
4400#define CERT_PKEY_STRICT_FLAGS \
4401 (CERT_PKEY_VALID_FLAGS|CERT_PKEY_CA_SIGNATURE|CERT_PKEY_CA_PARAM \
4402 | CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE)
4403
4404int tls1_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain,
4405 int idx)
4406 {
4407 int i;
4408 int rv = 0;
4409 int check_flags = 0, strict_mode;
4410 CERT_PKEY *cpk = NULL;
4411 CERT *c = s->cert;
4412 unsigned int suiteb_flags = tls1_suiteb(s);
4413 /* idx == -1 means checking server chains */
4414 if (idx != -1)
4415 {
4416 /* idx == -2 means checking client certificate chains */
4417 if (idx == -2)
4418 {
4419 cpk = c->key;
4420 idx = cpk - c->pkeys;
4421 }
4422 else
4423 cpk = c->pkeys + idx;
4424 x = cpk->x509;
4425 pk = cpk->privatekey;
4426 chain = cpk->chain;
4427 strict_mode = c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT;
4428 /* If no cert or key, forget it */
4429 if (!x || !pk)
4430 goto end;
4431#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
4432 /* Allow any certificate to pass test */
4433 if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
4434 {
4435 rv = CERT_PKEY_STRICT_FLAGS|CERT_PKEY_EXPLICIT_SIGN|CERT_PKEY_VALID|CERT_PKEY_SIGN;
4436 cpk->valid_flags = rv;
4437 return rv;
4438 }
4439#endif
4440 }
4441 else
4442 {
4443 if (!x || !pk)
4444 goto end;
4445 idx = ssl_cert_type(x, pk);
4446 if (idx == -1)
4447 goto end;
4448 cpk = c->pkeys + idx;
4449 if (c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)
4450 check_flags = CERT_PKEY_STRICT_FLAGS;
4451 else
4452 check_flags = CERT_PKEY_VALID_FLAGS;
4453 strict_mode = 1;
4454 }
4455
4456 if (suiteb_flags)
4457 {
4458 int ok;
4459 if (check_flags)
4460 check_flags |= CERT_PKEY_SUITEB;
4461 ok = X509_chain_check_suiteb(NULL, x, chain, suiteb_flags);
4462 if (ok != X509_V_OK)
4463 {
4464 if (check_flags)
4465 rv |= CERT_PKEY_SUITEB;
4466 else
4467 goto end;
4468 }
4469 }
4470
4471 /* Check all signature algorithms are consistent with
4472 * signature algorithms extension if TLS 1.2 or later
4473 * and strict mode.
4474 */
4475 if (TLS1_get_version(s) >= TLS1_2_VERSION && strict_mode)
4476 {
4477 int default_nid;
4478 unsigned char rsign = 0;
4479 if (c->peer_sigalgs)
4480 default_nid = 0;
4481 /* If no sigalgs extension use defaults from RFC5246 */
4482 else
4483 {
4484 switch(idx)
4485 {
4486 case SSL_PKEY_RSA_ENC:
4487 case SSL_PKEY_RSA_SIGN:
4488 case SSL_PKEY_DH_RSA:
4489 rsign = TLSEXT_signature_rsa;
4490 default_nid = NID_sha1WithRSAEncryption;
4491 break;
4492
4493 case SSL_PKEY_DSA_SIGN:
4494 case SSL_PKEY_DH_DSA:
4495 rsign = TLSEXT_signature_dsa;
4496 default_nid = NID_dsaWithSHA1;
4497 break;
4498
4499 case SSL_PKEY_ECC:
4500 rsign = TLSEXT_signature_ecdsa;
4501 default_nid = NID_ecdsa_with_SHA1;
4502 break;
4503
4504 default:
4505 default_nid = -1;
4506 break;
4507 }
4508 }
4509 /* If peer sent no signature algorithms extension and we
4510 * have set preferred signature algorithms check we support
4511 * sha1.
4512 */
4513 if (default_nid > 0 && c->conf_sigalgs)
4514 {
4515 size_t j;
4516 const unsigned char *p = c->conf_sigalgs;
4517 for (j = 0; j < c->conf_sigalgslen; j += 2, p += 2)
4518 {
4519 if (p[0] == TLSEXT_hash_sha1 && p[1] == rsign)
4520 break;
4521 }
4522 if (j == c->conf_sigalgslen)
4523 {
4524 if (check_flags)
4525 goto skip_sigs;
4526 else
4527 goto end;
4528 }
4529 }
4530 /* Check signature algorithm of each cert in chain */
4531 if (!tls1_check_sig_alg(c, x, default_nid))
4532 {
4533 if (!check_flags) goto end;
4534 }
4535 else
4536 rv |= CERT_PKEY_EE_SIGNATURE;
4537 rv |= CERT_PKEY_CA_SIGNATURE;
4538 for (i = 0; i < sk_X509_num(chain); i++)
4539 {
4540 if (!tls1_check_sig_alg(c, sk_X509_value(chain, i),
4541 default_nid))
4542 {
4543 if (check_flags)
4544 {
4545 rv &= ~CERT_PKEY_CA_SIGNATURE;
4546 break;
4547 }
4548 else
4549 goto end;
4550 }
4551 }
4552 }
4553 /* Else not TLS 1.2, so mark EE and CA signing algorithms OK */
4554 else if(check_flags)
4555 rv |= CERT_PKEY_EE_SIGNATURE|CERT_PKEY_CA_SIGNATURE;
4556 skip_sigs:
4557 /* Check cert parameters are consistent */
4558 if (tls1_check_cert_param(s, x, check_flags ? 1 : 2))
4559 rv |= CERT_PKEY_EE_PARAM;
4560 else if (!check_flags)
4561 goto end;
4562 if (!s->server)
4563 rv |= CERT_PKEY_CA_PARAM;
4564 /* In strict mode check rest of chain too */
4565 else if (strict_mode)
4566 {
4567 rv |= CERT_PKEY_CA_PARAM;
4568 for (i = 0; i < sk_X509_num(chain); i++)
4569 {
4570 X509 *ca = sk_X509_value(chain, i);
4571 if (!tls1_check_cert_param(s, ca, 0))
4572 {
4573 if (check_flags)
4574 {
4575 rv &= ~CERT_PKEY_CA_PARAM;
4576 break;
4577 }
4578 else
4579 goto end;
4580 }
4581 }
4582 }
4583 if (!s->server && strict_mode)
4584 {
4585 STACK_OF(X509_NAME) *ca_dn;
4586 int check_type = 0;
4587 switch (pk->type)
4588 {
4589 case EVP_PKEY_RSA:
4590 check_type = TLS_CT_RSA_SIGN;
4591 break;
4592 case EVP_PKEY_DSA:
4593 check_type = TLS_CT_DSS_SIGN;
4594 break;
4595 case EVP_PKEY_EC:
4596 check_type = TLS_CT_ECDSA_SIGN;
4597 break;
4598 case EVP_PKEY_DH:
4599 case EVP_PKEY_DHX:
4600 {
4601 int cert_type = X509_certificate_type(x, pk);
4602 if (cert_type & EVP_PKS_RSA)
4603 check_type = TLS_CT_RSA_FIXED_DH;
4604 if (cert_type & EVP_PKS_DSA)
4605 check_type = TLS_CT_DSS_FIXED_DH;
4606 }
4607 }
4608 if (check_type)
4609 {
4610 const unsigned char *ctypes;
4611 int ctypelen;
4612 if (c->ctypes)
4613 {
4614 ctypes = c->ctypes;
4615 ctypelen = (int)c->ctype_num;
4616 }
4617 else
4618 {
4619 ctypes = (unsigned char *)s->s3->tmp.ctype;
4620 ctypelen = s->s3->tmp.ctype_num;
4621 }
4622 for (i = 0; i < ctypelen; i++)
4623 {
4624 if (ctypes[i] == check_type)
4625 {
4626 rv |= CERT_PKEY_CERT_TYPE;
4627 break;
4628 }
4629 }
4630 if (!(rv & CERT_PKEY_CERT_TYPE) && !check_flags)
4631 goto end;
4632 }
4633 else
4634 rv |= CERT_PKEY_CERT_TYPE;
4635
4636
4637 ca_dn = s->s3->tmp.ca_names;
4638
4639 if (!sk_X509_NAME_num(ca_dn))
4640 rv |= CERT_PKEY_ISSUER_NAME;
4641
4642 if (!(rv & CERT_PKEY_ISSUER_NAME))
4643 {
4644 if (ssl_check_ca_name(ca_dn, x))
4645 rv |= CERT_PKEY_ISSUER_NAME;
4646 }
4647 if (!(rv & CERT_PKEY_ISSUER_NAME))
4648 {
4649 for (i = 0; i < sk_X509_num(chain); i++)
4650 {
4651 X509 *xtmp = sk_X509_value(chain, i);
4652 if (ssl_check_ca_name(ca_dn, xtmp))
4653 {
4654 rv |= CERT_PKEY_ISSUER_NAME;
4655 break;
4656 }
4657 }
4658 }
4659 if (!check_flags && !(rv & CERT_PKEY_ISSUER_NAME))
4660 goto end;
4661 }
4662 else
4663 rv |= CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE;
4664
4665 if (!check_flags || (rv & check_flags) == check_flags)
4666 rv |= CERT_PKEY_VALID;
4667
4668 end:
4669
4670 if (TLS1_get_version(s) >= TLS1_2_VERSION)
4671 {
4672 if (cpk->valid_flags & CERT_PKEY_EXPLICIT_SIGN)
4673 rv |= CERT_PKEY_EXPLICIT_SIGN|CERT_PKEY_SIGN;
4674 else if (cpk->digest)
4675 rv |= CERT_PKEY_SIGN;
4676 }
4677 else
4678 rv |= CERT_PKEY_SIGN|CERT_PKEY_EXPLICIT_SIGN;
4679
4680 /* When checking a CERT_PKEY structure all flags are irrelevant
4681 * if the chain is invalid.
4682 */
4683 if (!check_flags)
4684 {
4685 if (rv & CERT_PKEY_VALID)
4686 cpk->valid_flags = rv;
4687 else
4688 {
4689 /* Preserve explicit sign flag, clear rest */
4690 cpk->valid_flags &= CERT_PKEY_EXPLICIT_SIGN;
4691 return 0;
4692 }
4693 }
4694 return rv;
4695 }
4696
4697/* Set validity of certificates in an SSL structure */
4698void tls1_set_cert_validity(SSL *s)
4699 {
4700 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_ENC);
4701 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_SIGN);
4702 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DSA_SIGN);
4703 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DH_RSA);
4704 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DH_DSA);
4705 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ECC);
4706 }
4707/* User level utiity function to check a chain is suitable */
4708int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain)
4709 {
4710 return tls1_check_chain(s, x, pk, chain, -1);
4711 }
4712
4713#endif