blob: 0c49d4e8bc11778649e674db5900228d8809444b [file] [log] [blame]
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001/* ssl/t1_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
Brian Carlstrom221304e2010-04-15 14:22:36 -070058/* ====================================================================
59 * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800111
112#include <stdio.h>
113#include <openssl/objects.h>
114#include <openssl/evp.h>
115#include <openssl/hmac.h>
116#include <openssl/ocsp.h>
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700117#include <openssl/rand.h>
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800118#include "ssl_locl.h"
119
120const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
121
122#ifndef OPENSSL_NO_TLSEXT
123static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
124 const unsigned char *sess_id, int sesslen,
125 SSL_SESSION **psess);
126#endif
127
128SSL3_ENC_METHOD TLSv1_enc_data={
129 tls1_enc,
130 tls1_mac,
131 tls1_setup_key_block,
132 tls1_generate_master_secret,
133 tls1_change_cipher_state,
134 tls1_final_finish_mac,
135 TLS1_FINISH_MAC_LENGTH,
136 tls1_cert_verify_mac,
137 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
138 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
139 tls1_alert_code,
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700140 tls1_export_keying_material,
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800141 };
142
143long tls1_default_timeout(void)
144 {
145 /* 2 hours, the 24 hours mentioned in the TLSv1 spec
146 * is way too long for http, the cache would over fill */
147 return(60*60*2);
148 }
149
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800150int tls1_new(SSL *s)
151 {
152 if (!ssl3_new(s)) return(0);
153 s->method->ssl_clear(s);
154 return(1);
155 }
156
157void tls1_free(SSL *s)
158 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700159#ifndef OPENSSL_NO_TLSEXT
160 if (s->tlsext_session_ticket)
161 {
162 OPENSSL_free(s->tlsext_session_ticket);
163 }
164#endif /* OPENSSL_NO_TLSEXT */
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800165 ssl3_free(s);
166 }
167
168void tls1_clear(SSL *s)
169 {
170 ssl3_clear(s);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700171 s->version = s->method->version;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800172 }
173
Brian Carlstrom221304e2010-04-15 14:22:36 -0700174#ifndef OPENSSL_NO_EC
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700175
Brian Carlstrom221304e2010-04-15 14:22:36 -0700176static int nid_list[] =
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800177 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700178 NID_sect163k1, /* sect163k1 (1) */
179 NID_sect163r1, /* sect163r1 (2) */
180 NID_sect163r2, /* sect163r2 (3) */
181 NID_sect193r1, /* sect193r1 (4) */
182 NID_sect193r2, /* sect193r2 (5) */
183 NID_sect233k1, /* sect233k1 (6) */
184 NID_sect233r1, /* sect233r1 (7) */
185 NID_sect239k1, /* sect239k1 (8) */
186 NID_sect283k1, /* sect283k1 (9) */
187 NID_sect283r1, /* sect283r1 (10) */
188 NID_sect409k1, /* sect409k1 (11) */
189 NID_sect409r1, /* sect409r1 (12) */
190 NID_sect571k1, /* sect571k1 (13) */
191 NID_sect571r1, /* sect571r1 (14) */
192 NID_secp160k1, /* secp160k1 (15) */
193 NID_secp160r1, /* secp160r1 (16) */
194 NID_secp160r2, /* secp160r2 (17) */
195 NID_secp192k1, /* secp192k1 (18) */
196 NID_X9_62_prime192v1, /* secp192r1 (19) */
197 NID_secp224k1, /* secp224k1 (20) */
198 NID_secp224r1, /* secp224r1 (21) */
199 NID_secp256k1, /* secp256k1 (22) */
200 NID_X9_62_prime256v1, /* secp256r1 (23) */
201 NID_secp384r1, /* secp384r1 (24) */
202 NID_secp521r1 /* secp521r1 (25) */
203 };
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700204
205static int pref_list[] =
206 {
207 NID_sect571r1, /* sect571r1 (14) */
208 NID_sect571k1, /* sect571k1 (13) */
209 NID_secp521r1, /* secp521r1 (25) */
210 NID_sect409k1, /* sect409k1 (11) */
211 NID_sect409r1, /* sect409r1 (12) */
212 NID_secp384r1, /* secp384r1 (24) */
213 NID_sect283k1, /* sect283k1 (9) */
214 NID_sect283r1, /* sect283r1 (10) */
215 NID_secp256k1, /* secp256k1 (22) */
216 NID_X9_62_prime256v1, /* secp256r1 (23) */
217 NID_sect239k1, /* sect239k1 (8) */
218 NID_sect233k1, /* sect233k1 (6) */
219 NID_sect233r1, /* sect233r1 (7) */
220 NID_secp224k1, /* secp224k1 (20) */
221 NID_secp224r1, /* secp224r1 (21) */
222 NID_sect193r1, /* sect193r1 (4) */
223 NID_sect193r2, /* sect193r2 (5) */
224 NID_secp192k1, /* secp192k1 (18) */
225 NID_X9_62_prime192v1, /* secp192r1 (19) */
226 NID_sect163k1, /* sect163k1 (1) */
227 NID_sect163r1, /* sect163r1 (2) */
228 NID_sect163r2, /* sect163r2 (3) */
229 NID_secp160k1, /* secp160k1 (15) */
230 NID_secp160r1, /* secp160r1 (16) */
231 NID_secp160r2, /* secp160r2 (17) */
232 };
233
Brian Carlstrom221304e2010-04-15 14:22:36 -0700234int tls1_ec_curve_id2nid(int curve_id)
235 {
236 /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
237 if ((curve_id < 1) || ((unsigned int)curve_id >
238 sizeof(nid_list)/sizeof(nid_list[0])))
239 return 0;
240 return nid_list[curve_id-1];
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800241 }
242
Brian Carlstrom221304e2010-04-15 14:22:36 -0700243int tls1_ec_nid2curve_id(int nid)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800244 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700245 /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
246 switch (nid)
247 {
248 case NID_sect163k1: /* sect163k1 (1) */
249 return 1;
250 case NID_sect163r1: /* sect163r1 (2) */
251 return 2;
252 case NID_sect163r2: /* sect163r2 (3) */
253 return 3;
254 case NID_sect193r1: /* sect193r1 (4) */
255 return 4;
256 case NID_sect193r2: /* sect193r2 (5) */
257 return 5;
258 case NID_sect233k1: /* sect233k1 (6) */
259 return 6;
260 case NID_sect233r1: /* sect233r1 (7) */
261 return 7;
262 case NID_sect239k1: /* sect239k1 (8) */
263 return 8;
264 case NID_sect283k1: /* sect283k1 (9) */
265 return 9;
266 case NID_sect283r1: /* sect283r1 (10) */
267 return 10;
268 case NID_sect409k1: /* sect409k1 (11) */
269 return 11;
270 case NID_sect409r1: /* sect409r1 (12) */
271 return 12;
272 case NID_sect571k1: /* sect571k1 (13) */
273 return 13;
274 case NID_sect571r1: /* sect571r1 (14) */
275 return 14;
276 case NID_secp160k1: /* secp160k1 (15) */
277 return 15;
278 case NID_secp160r1: /* secp160r1 (16) */
279 return 16;
280 case NID_secp160r2: /* secp160r2 (17) */
281 return 17;
282 case NID_secp192k1: /* secp192k1 (18) */
283 return 18;
284 case NID_X9_62_prime192v1: /* secp192r1 (19) */
285 return 19;
286 case NID_secp224k1: /* secp224k1 (20) */
287 return 20;
288 case NID_secp224r1: /* secp224r1 (21) */
289 return 21;
290 case NID_secp256k1: /* secp256k1 (22) */
291 return 22;
292 case NID_X9_62_prime256v1: /* secp256r1 (23) */
293 return 23;
294 case NID_secp384r1: /* secp384r1 (24) */
295 return 24;
296 case NID_secp521r1: /* secp521r1 (25) */
297 return 25;
298 default:
299 return 0;
300 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800301 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700302#endif /* OPENSSL_NO_EC */
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800303
304#ifndef OPENSSL_NO_TLSEXT
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700305
306/* List of supported signature algorithms and hashes. Should make this
307 * customisable at some point, for now include everything we support.
308 */
309
310#ifdef OPENSSL_NO_RSA
311#define tlsext_sigalg_rsa(md) /* */
312#else
313#define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
314#endif
315
316#ifdef OPENSSL_NO_DSA
317#define tlsext_sigalg_dsa(md) /* */
318#else
319#define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
320#endif
321
322#ifdef OPENSSL_NO_ECDSA
323#define tlsext_sigalg_ecdsa(md) /* */
324#else
325#define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
326#endif
327
328#define tlsext_sigalg(md) \
329 tlsext_sigalg_rsa(md) \
330 tlsext_sigalg_dsa(md) \
331 tlsext_sigalg_ecdsa(md)
332
333static unsigned char tls12_sigalgs[] = {
334#ifndef OPENSSL_NO_SHA512
335 tlsext_sigalg(TLSEXT_hash_sha512)
336 tlsext_sigalg(TLSEXT_hash_sha384)
337#endif
338#ifndef OPENSSL_NO_SHA256
339 tlsext_sigalg(TLSEXT_hash_sha256)
340 tlsext_sigalg(TLSEXT_hash_sha224)
341#endif
342#ifndef OPENSSL_NO_SHA
343 tlsext_sigalg(TLSEXT_hash_sha1)
344#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700345};
346
347int tls12_get_req_sig_algs(SSL *s, unsigned char *p)
348 {
349 size_t slen = sizeof(tls12_sigalgs);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700350 if (p)
351 memcpy(p, tls12_sigalgs, slen);
352 return (int)slen;
353 }
354
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800355unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
356 {
357 int extdatalen=0;
358 unsigned char *ret = p;
359
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800360 /* don't add extensions for SSLv3 unless doing secure renegotiation */
361 if (s->client_version == SSL3_VERSION
362 && !s->s3->send_connection_binding)
363 return p;
364
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800365 ret+=2;
366
367 if (ret>=limit) return NULL; /* this really never occurs, but ... */
368
369 if (s->tlsext_hostname != NULL)
370 {
371 /* Add TLS extension servername to the Client Hello message */
372 unsigned long size_str;
373 long lenmax;
374
375 /* check for enough space.
376 4 for the servername type and entension length
377 2 for servernamelist length
378 1 for the hostname type
379 2 for hostname length
380 + hostname length
381 */
382
383 if ((lenmax = limit - ret - 9) < 0
Brian Carlstrom221304e2010-04-15 14:22:36 -0700384 || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800385 return NULL;
386
387 /* extension type and length */
388 s2n(TLSEXT_TYPE_server_name,ret);
389 s2n(size_str+5,ret);
390
391 /* length of servername list */
392 s2n(size_str+3,ret);
393
394 /* hostname type, length and hostname */
395 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
396 s2n(size_str,ret);
397 memcpy(ret, s->tlsext_hostname, size_str);
398 ret+=size_str;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800399 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700400
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800401 /* Add RI if renegotiating */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700402 if (s->renegotiate)
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800403 {
404 int el;
405
406 if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
407 {
408 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
409 return NULL;
410 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800411
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800412 if((limit - p - 4 - el) < 0) return NULL;
413
414 s2n(TLSEXT_TYPE_renegotiate,ret);
415 s2n(el,ret);
416
417 if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
418 {
419 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
420 return NULL;
421 }
422
423 ret += el;
424 }
425
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700426#ifndef OPENSSL_NO_SRP
427 /* Add SRP username if there is one */
428 if (s->srp_ctx.login != NULL)
429 { /* Add TLS extension SRP username to the Client Hello message */
430
431 int login_len = strlen(s->srp_ctx.login);
432 if (login_len > 255 || login_len == 0)
433 {
434 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
435 return NULL;
436 }
437
438 /* check for enough space.
439 4 for the srp type type and entension length
440 1 for the srp user identity
441 + srp user identity length
442 */
443 if ((limit - ret - 5 - login_len) < 0) return NULL;
444
445 /* fill in the extension */
446 s2n(TLSEXT_TYPE_srp,ret);
447 s2n(login_len+1,ret);
448 (*ret++) = (unsigned char) login_len;
449 memcpy(ret, s->srp_ctx.login, login_len);
450 ret+=login_len;
451 }
452#endif
453
Brian Carlstrom221304e2010-04-15 14:22:36 -0700454#ifndef OPENSSL_NO_EC
455 if (s->tlsext_ecpointformatlist != NULL &&
456 s->version != DTLS1_VERSION)
457 {
458 /* Add TLS extension ECPointFormats to the ClientHello message */
459 long lenmax;
460
461 if ((lenmax = limit - ret - 5) < 0) return NULL;
462 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
463 if (s->tlsext_ecpointformatlist_length > 255)
464 {
465 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
466 return NULL;
467 }
468
469 s2n(TLSEXT_TYPE_ec_point_formats,ret);
470 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
471 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
472 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
473 ret+=s->tlsext_ecpointformatlist_length;
474 }
475 if (s->tlsext_ellipticcurvelist != NULL &&
476 s->version != DTLS1_VERSION)
477 {
478 /* Add TLS extension EllipticCurves to the ClientHello message */
479 long lenmax;
480
481 if ((lenmax = limit - ret - 6) < 0) return NULL;
482 if (s->tlsext_ellipticcurvelist_length > (unsigned long)lenmax) return NULL;
483 if (s->tlsext_ellipticcurvelist_length > 65532)
484 {
485 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
486 return NULL;
487 }
488
489 s2n(TLSEXT_TYPE_elliptic_curves,ret);
490 s2n(s->tlsext_ellipticcurvelist_length + 2, ret);
491
492 /* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
493 * elliptic_curve_list, but the examples use two bytes.
494 * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
495 * resolves this to two bytes.
496 */
497 s2n(s->tlsext_ellipticcurvelist_length, ret);
498 memcpy(ret, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length);
499 ret+=s->tlsext_ellipticcurvelist_length;
500 }
501#endif /* OPENSSL_NO_EC */
502
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800503 if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
504 {
505 int ticklen;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800506 if (!s->new_session && s->session && s->session->tlsext_tick)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800507 ticklen = s->session->tlsext_ticklen;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700508 else if (s->session && s->tlsext_session_ticket &&
509 s->tlsext_session_ticket->data)
510 {
511 ticklen = s->tlsext_session_ticket->length;
512 s->session->tlsext_tick = OPENSSL_malloc(ticklen);
513 if (!s->session->tlsext_tick)
514 return NULL;
515 memcpy(s->session->tlsext_tick,
516 s->tlsext_session_ticket->data,
517 ticklen);
518 s->session->tlsext_ticklen = ticklen;
519 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800520 else
521 ticklen = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700522 if (ticklen == 0 && s->tlsext_session_ticket &&
523 s->tlsext_session_ticket->data == NULL)
524 goto skip_ext;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800525 /* Check for enough room 2 for extension type, 2 for len
526 * rest for ticket
527 */
Brian Carlstrom221304e2010-04-15 14:22:36 -0700528 if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800529 s2n(TLSEXT_TYPE_session_ticket,ret);
530 s2n(ticklen,ret);
531 if (ticklen)
532 {
533 memcpy(ret, s->session->tlsext_tick, ticklen);
534 ret += ticklen;
535 }
536 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700537 skip_ext:
538
Brian Carlstromed2ff7a2012-03-28 00:55:55 -0700539 if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700540 {
541 if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
542 return NULL;
543 s2n(TLSEXT_TYPE_signature_algorithms,ret);
544 s2n(sizeof(tls12_sigalgs) + 2, ret);
545 s2n(sizeof(tls12_sigalgs), ret);
546 memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
547 ret += sizeof(tls12_sigalgs);
548 }
549
Brian Carlstrom221304e2010-04-15 14:22:36 -0700550#ifdef TLSEXT_TYPE_opaque_prf_input
551 if (s->s3->client_opaque_prf_input != NULL &&
552 s->version != DTLS1_VERSION)
553 {
554 size_t col = s->s3->client_opaque_prf_input_len;
555
556 if ((long)(limit - ret - 6 - col < 0))
557 return NULL;
558 if (col > 0xFFFD) /* can't happen */
559 return NULL;
560
561 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
562 s2n(col + 2, ret);
563 s2n(col, ret);
564 memcpy(ret, s->s3->client_opaque_prf_input, col);
565 ret += col;
566 }
567#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800568
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800569 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
570 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800571 {
572 int i;
573 long extlen, idlen, itmp;
574 OCSP_RESPID *id;
575
576 idlen = 0;
577 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
578 {
579 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
580 itmp = i2d_OCSP_RESPID(id, NULL);
581 if (itmp <= 0)
582 return NULL;
583 idlen += itmp + 2;
584 }
585
586 if (s->tlsext_ocsp_exts)
587 {
588 extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
589 if (extlen < 0)
590 return NULL;
591 }
592 else
593 extlen = 0;
594
595 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
596 s2n(TLSEXT_TYPE_status_request, ret);
597 if (extlen + idlen > 0xFFF0)
598 return NULL;
599 s2n(extlen + idlen + 5, ret);
600 *(ret++) = TLSEXT_STATUSTYPE_ocsp;
601 s2n(idlen, ret);
602 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
603 {
604 /* save position of id len */
605 unsigned char *q = ret;
606 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
607 /* skip over id len */
608 ret += 2;
609 itmp = i2d_OCSP_RESPID(id, &ret);
610 /* write id len */
611 s2n(itmp, q);
612 }
613 s2n(extlen, ret);
614 if (extlen > 0)
615 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
616 }
617
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700618#ifndef OPENSSL_NO_HEARTBEATS
619 /* Add Heartbeat extension */
620 s2n(TLSEXT_TYPE_heartbeat,ret);
621 s2n(1,ret);
622 /* Set mode:
623 * 1: peer may send requests
624 * 2: peer not allowed to send requests
625 */
626 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
627 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
628 else
629 *(ret++) = SSL_TLSEXT_HB_ENABLED;
630#endif
631
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000632#ifndef OPENSSL_NO_NEXTPROTONEG
633 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
634 {
635 /* The client advertises an emtpy extension to indicate its
636 * support for Next Protocol Negotiation */
637 if (limit - ret - 4 < 0)
638 return NULL;
639 s2n(TLSEXT_TYPE_next_proto_neg,ret);
640 s2n(0,ret);
641 }
642#endif
643
Adam Langley45bcfbc2013-01-16 13:43:53 -0800644 if (s->tlsext_channel_id_enabled)
645 {
646 /* The client advertises an emtpy extension to indicate its
647 * support for Channel ID. */
648 if (limit - ret - 4 < 0)
649 return NULL;
650 s2n(TLSEXT_TYPE_channel_id,ret);
651 s2n(0,ret);
652 }
653
Kenny Rootee53ab12013-06-24 12:07:13 -0700654 if (s->alpn_client_proto_list && !s->s3->tmp.finish_md_len)
655 {
656 if ((size_t)(limit - ret) < 6 + s->alpn_client_proto_list_len)
657 return NULL;
658 s2n(TLSEXT_TYPE_application_layer_protocol_negotiation,ret);
659 s2n(2 + s->alpn_client_proto_list_len,ret);
660 s2n(s->alpn_client_proto_list_len,ret);
661 memcpy(ret, s->alpn_client_proto_list,
662 s->alpn_client_proto_list_len);
663 ret += s->alpn_client_proto_list_len;
664 }
665
Brian Carlstromeefface2013-02-11 09:54:43 -0800666#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700667 if(SSL_get_srtp_profiles(s))
668 {
669 int el;
670
671 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
672
673 if((limit - p - 4 - el) < 0) return NULL;
674
675 s2n(TLSEXT_TYPE_use_srtp,ret);
676 s2n(el,ret);
677
678 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
679 {
680 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
681 return NULL;
682 }
683 ret += el;
684 }
Brian Carlstromeefface2013-02-11 09:54:43 -0800685#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700686
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800687 if ((extdatalen = ret-p-2)== 0)
688 return p;
689
690 s2n(extdatalen,p);
691 return ret;
692 }
693
694unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
695 {
696 int extdatalen=0;
697 unsigned char *ret = p;
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000698#ifndef OPENSSL_NO_NEXTPROTONEG
699 int next_proto_neg_seen;
700#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800701
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800702 /* don't add extensions for SSLv3, unless doing secure renegotiation */
703 if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
704 return p;
705
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800706 ret+=2;
707 if (ret>=limit) return NULL; /* this really never occurs, but ... */
708
709 if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
710 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700711 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800712
713 s2n(TLSEXT_TYPE_server_name,ret);
714 s2n(0,ret);
715 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800716
717 if(s->s3->send_connection_binding)
718 {
719 int el;
720
721 if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
722 {
723 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
724 return NULL;
725 }
726
727 if((limit - p - 4 - el) < 0) return NULL;
728
729 s2n(TLSEXT_TYPE_renegotiate,ret);
730 s2n(el,ret);
731
732 if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
733 {
734 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
735 return NULL;
736 }
737
738 ret += el;
739 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700740
741#ifndef OPENSSL_NO_EC
742 if (s->tlsext_ecpointformatlist != NULL &&
743 s->version != DTLS1_VERSION)
744 {
745 /* Add TLS extension ECPointFormats to the ServerHello message */
746 long lenmax;
747
748 if ((lenmax = limit - ret - 5) < 0) return NULL;
749 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
750 if (s->tlsext_ecpointformatlist_length > 255)
751 {
752 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
753 return NULL;
754 }
755
756 s2n(TLSEXT_TYPE_ec_point_formats,ret);
757 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
758 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
759 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
760 ret+=s->tlsext_ecpointformatlist_length;
761
762 }
763 /* Currently the server should not respond with a SupportedCurves extension */
764#endif /* OPENSSL_NO_EC */
765
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800766 if (s->tlsext_ticket_expected
767 && !(SSL_get_options(s) & SSL_OP_NO_TICKET))
768 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700769 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800770 s2n(TLSEXT_TYPE_session_ticket,ret);
771 s2n(0,ret);
772 }
773
774 if (s->tlsext_status_expected)
775 {
776 if ((long)(limit - ret - 4) < 0) return NULL;
777 s2n(TLSEXT_TYPE_status_request,ret);
778 s2n(0,ret);
779 }
780
Brian Carlstrom221304e2010-04-15 14:22:36 -0700781#ifdef TLSEXT_TYPE_opaque_prf_input
782 if (s->s3->server_opaque_prf_input != NULL &&
783 s->version != DTLS1_VERSION)
784 {
785 size_t sol = s->s3->server_opaque_prf_input_len;
786
787 if ((long)(limit - ret - 6 - sol) < 0)
788 return NULL;
789 if (sol > 0xFFFD) /* can't happen */
790 return NULL;
791
792 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
793 s2n(sol + 2, ret);
794 s2n(sol, ret);
795 memcpy(ret, s->s3->server_opaque_prf_input, sol);
796 ret += sol;
797 }
798#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700799
Brian Carlstromeefface2013-02-11 09:54:43 -0800800#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700801 if(s->srtp_profile)
802 {
803 int el;
804
805 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
806
807 if((limit - p - 4 - el) < 0) return NULL;
808
809 s2n(TLSEXT_TYPE_use_srtp,ret);
810 s2n(el,ret);
811
812 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
813 {
814 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
815 return NULL;
816 }
817 ret+=el;
818 }
Brian Carlstromeefface2013-02-11 09:54:43 -0800819#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700820
Brian Carlstrom221304e2010-04-15 14:22:36 -0700821 if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81)
822 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
823 { const unsigned char cryptopro_ext[36] = {
824 0xfd, 0xe8, /*65000*/
825 0x00, 0x20, /*32 bytes length*/
826 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
827 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
828 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
829 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
830 if (limit-ret<36) return NULL;
831 memcpy(ret,cryptopro_ext,36);
832 ret+=36;
833
834 }
835
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700836#ifndef OPENSSL_NO_HEARTBEATS
837 /* Add Heartbeat extension if we've received one */
838 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
839 {
840 s2n(TLSEXT_TYPE_heartbeat,ret);
841 s2n(1,ret);
842 /* Set mode:
843 * 1: peer may send requests
844 * 2: peer not allowed to send requests
845 */
846 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
847 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
848 else
849 *(ret++) = SSL_TLSEXT_HB_ENABLED;
850
851 }
852#endif
853
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000854#ifndef OPENSSL_NO_NEXTPROTONEG
855 next_proto_neg_seen = s->s3->next_proto_neg_seen;
856 s->s3->next_proto_neg_seen = 0;
857 if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
858 {
859 const unsigned char *npa;
860 unsigned int npalen;
861 int r;
862
863 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
864 if (r == SSL_TLSEXT_ERR_OK)
865 {
866 if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
867 s2n(TLSEXT_TYPE_next_proto_neg,ret);
868 s2n(npalen,ret);
869 memcpy(ret, npa, npalen);
870 ret += npalen;
871 s->s3->next_proto_neg_seen = 1;
872 }
873 }
874#endif
875
Adam Langley45bcfbc2013-01-16 13:43:53 -0800876 /* If the client advertised support for Channel ID, and we have it
877 * enabled, then we want to echo it back. */
878 if (s->s3->tlsext_channel_id_valid)
879 {
880 if (limit - ret - 4 < 0)
881 return NULL;
882 s2n(TLSEXT_TYPE_channel_id,ret);
883 s2n(0,ret);
884 }
885
Kenny Rootee53ab12013-06-24 12:07:13 -0700886 if (s->s3->alpn_selected)
887 {
888 const unsigned char *selected = s->s3->alpn_selected;
889 unsigned len = s->s3->alpn_selected_len;
890
891 if ((long)(limit - ret - 4 - 2 - 1 - len) < 0)
892 return NULL;
893 s2n(TLSEXT_TYPE_application_layer_protocol_negotiation,ret);
894 s2n(3 + len,ret);
895 s2n(1 + len,ret);
896 *ret++ = len;
897 memcpy(ret, selected, len);
898 ret += len;
899 }
900
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800901 if ((extdatalen = ret-p-2)== 0)
902 return p;
903
904 s2n(extdatalen,p);
905 return ret;
906 }
907
Kenny Rootff41a4b2014-01-07 10:19:10 -0800908#ifndef OPENSSL_NO_EC
909/* ssl_check_for_safari attempts to fingerprint Safari using OS X
910 * SecureTransport using the TLS extension block in |d|, of length |n|.
911 * Safari, since 10.6, sends exactly these extensions, in this order:
912 * SNI,
913 * elliptic_curves
914 * ec_point_formats
915 *
916 * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
917 * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
918 * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
919 * 10.8..10.8.3 (which don't work).
920 */
921static void ssl_check_for_safari(SSL *s, const unsigned char *data, const unsigned char *d, int n) {
922 unsigned short type, size;
923 static const unsigned char kSafariExtensionsBlock[] = {
924 0x00, 0x0a, /* elliptic_curves extension */
925 0x00, 0x08, /* 8 bytes */
926 0x00, 0x06, /* 6 bytes of curve ids */
927 0x00, 0x17, /* P-256 */
928 0x00, 0x18, /* P-384 */
929 0x00, 0x19, /* P-521 */
930
931 0x00, 0x0b, /* ec_point_formats */
932 0x00, 0x02, /* 2 bytes */
933 0x01, /* 1 point format */
934 0x00, /* uncompressed */
935 };
936
937 /* The following is only present in TLS 1.2 */
938 static const unsigned char kSafariTLS12ExtensionsBlock[] = {
939 0x00, 0x0d, /* signature_algorithms */
940 0x00, 0x0c, /* 12 bytes */
941 0x00, 0x0a, /* 10 bytes */
942 0x05, 0x01, /* SHA-384/RSA */
943 0x04, 0x01, /* SHA-256/RSA */
944 0x02, 0x01, /* SHA-1/RSA */
945 0x04, 0x03, /* SHA-256/ECDSA */
946 0x02, 0x03, /* SHA-1/ECDSA */
947 };
948
949 if (data >= (d+n-2))
950 return;
951 data += 2;
952
953 if (data > (d+n-4))
954 return;
955 n2s(data,type);
956 n2s(data,size);
957
958 if (type != TLSEXT_TYPE_server_name)
959 return;
960
961 if (data+size > d+n)
962 return;
963 data += size;
964
965 if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
966 {
967 const size_t len1 = sizeof(kSafariExtensionsBlock);
968 const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
969
970 if (data + len1 + len2 != d+n)
971 return;
972 if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
973 return;
974 if (memcmp(data + len1, kSafariTLS12ExtensionsBlock, len2) != 0)
975 return;
976 }
977 else
978 {
979 const size_t len = sizeof(kSafariExtensionsBlock);
980
981 if (data + len != d+n)
982 return;
983 if (memcmp(data, kSafariExtensionsBlock, len) != 0)
984 return;
985 }
986
987 s->s3->is_probably_safari = 1;
988}
989#endif /* !OPENSSL_NO_EC */
990
Kenny Rootee53ab12013-06-24 12:07:13 -0700991/* tls1_alpn_handle_client_hello is called to process the ALPN extension in a
992 * ClientHello.
993 * data: the contents of the extension, not including the type and length.
994 * data_len: the number of bytes in |data|
995 * al: a pointer to the alert value to send in the event of a non-zero
996 * return.
997 *
998 * returns: 0 on success. */
999static int tls1_alpn_handle_client_hello(SSL *s, const unsigned char *data,
1000 unsigned data_len, int *al)
1001 {
1002 unsigned i;
1003 unsigned proto_len;
1004 const unsigned char *selected;
1005 unsigned char selected_len;
1006 int r;
1007
1008 if (s->ctx->alpn_select_cb == NULL)
1009 return 0;
1010
1011 if (data_len < 2)
1012 goto parse_error;
1013
1014 /* data should contain a uint16 length followed by a series of 8-bit,
1015 * length-prefixed strings. */
1016 i = ((unsigned) data[0]) << 8 |
1017 ((unsigned) data[1]);
1018 data_len -= 2;
1019 data += 2;
1020 if (data_len != i)
1021 goto parse_error;
1022
1023 if (data_len < 2)
1024 goto parse_error;
1025
1026 for (i = 0; i < data_len;)
1027 {
1028 proto_len = data[i];
1029 i++;
1030
1031 if (proto_len == 0)
1032 goto parse_error;
1033
1034 if (i + proto_len < i || i + proto_len > data_len)
1035 goto parse_error;
1036
1037 i += proto_len;
1038 }
1039
1040 r = s->ctx->alpn_select_cb(s, &selected, &selected_len, data, data_len,
1041 s->ctx->alpn_select_cb_arg);
1042 if (r == SSL_TLSEXT_ERR_OK) {
1043 if (s->s3->alpn_selected)
1044 OPENSSL_free(s->s3->alpn_selected);
1045 s->s3->alpn_selected = OPENSSL_malloc(selected_len);
1046 if (!s->s3->alpn_selected)
1047 {
1048 *al = SSL_AD_INTERNAL_ERROR;
1049 return -1;
1050 }
1051 memcpy(s->s3->alpn_selected, selected, selected_len);
1052 s->s3->alpn_selected_len = selected_len;
1053 }
1054 return 0;
1055
1056parse_error:
1057 *al = SSL_AD_DECODE_ERROR;
1058 return -1;
1059 }
1060
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001061int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
1062 {
1063 unsigned short type;
1064 unsigned short size;
1065 unsigned short len;
1066 unsigned char *data = *p;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001067 int renegotiate_seen = 0;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001068 int sigalg_seen = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001069
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001070 s->servername_done = 0;
1071 s->tlsext_status_type = -1;
Kenny Root9296b4b2013-06-24 12:03:19 -07001072
1073 /* Reset TLS 1.2 digest functions to defaults because they don't carry
1074 * over to a renegotiation. */
1075 s->s3->digest_rsa = NULL;
1076 s->s3->digest_dsa = NULL;
1077 s->s3->digest_ecdsa = NULL;
1078
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001079#ifndef OPENSSL_NO_NEXTPROTONEG
1080 s->s3->next_proto_neg_seen = 0;
1081#endif
1082
Kenny Rootee53ab12013-06-24 12:07:13 -07001083 if (s->s3->alpn_selected)
1084 {
1085 OPENSSL_free(s->s3->alpn_selected);
1086 s->s3->alpn_selected = NULL;
1087 }
1088
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001089#ifndef OPENSSL_NO_HEARTBEATS
1090 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1091 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1092#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001093
Kenny Rootff41a4b2014-01-07 10:19:10 -08001094#ifndef OPENSSL_NO_EC
1095 if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
1096 ssl_check_for_safari(s, data, d, n);
1097#endif /* !OPENSSL_NO_EC */
1098
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001099 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001100 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001101 n2s(data,len);
1102
1103 if (data > (d+n-len))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001104 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001105
1106 while (data <= (d+n-4))
1107 {
1108 n2s(data,type);
1109 n2s(data,size);
1110
1111 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001112 goto ri_check;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001113#if 0
1114 fprintf(stderr,"Received extension type %d size %d\n",type,size);
1115#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001116 if (s->tlsext_debug_cb)
1117 s->tlsext_debug_cb(s, 0, type, data, size,
1118 s->tlsext_debug_arg);
1119/* The servername extension is treated as follows:
1120
1121 - Only the hostname type is supported with a maximum length of 255.
1122 - The servername is rejected if too long or if it contains zeros,
1123 in which case an fatal alert is generated.
1124 - The servername field is maintained together with the session cache.
1125 - When a session is resumed, the servername call back invoked in order
1126 to allow the application to position itself to the right context.
1127 - The servername is acknowledged if it is new for a session or when
1128 it is identical to a previously used for the same session.
1129 Applications can control the behaviour. They can at any time
1130 set a 'desirable' servername for a new SSL object. This can be the
1131 case for example with HTTPS when a Host: header field is received and
1132 a renegotiation is requested. In this case, a possible servername
1133 presented in the new client hello is only acknowledged if it matches
1134 the value of the Host: field.
1135 - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
1136 if they provide for changing an explicit servername context for the session,
1137 i.e. when the session has been established with a servername extension.
1138 - On session reconnect, the servername extension may be absent.
1139
1140*/
1141
1142 if (type == TLSEXT_TYPE_server_name)
1143 {
1144 unsigned char *sdata;
1145 int servname_type;
1146 int dsize;
1147
1148 if (size < 2)
1149 {
1150 *al = SSL_AD_DECODE_ERROR;
1151 return 0;
1152 }
1153 n2s(data,dsize);
1154 size -= 2;
1155 if (dsize > size )
1156 {
1157 *al = SSL_AD_DECODE_ERROR;
1158 return 0;
1159 }
1160
1161 sdata = data;
1162 while (dsize > 3)
1163 {
1164 servname_type = *(sdata++);
1165 n2s(sdata,len);
1166 dsize -= 3;
1167
1168 if (len > dsize)
1169 {
1170 *al = SSL_AD_DECODE_ERROR;
1171 return 0;
1172 }
1173 if (s->servername_done == 0)
1174 switch (servname_type)
1175 {
1176 case TLSEXT_NAMETYPE_host_name:
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001177 if (!s->hit)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001178 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001179 if(s->session->tlsext_hostname)
1180 {
1181 *al = SSL_AD_DECODE_ERROR;
1182 return 0;
1183 }
1184 if (len > TLSEXT_MAXLEN_host_name)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001185 {
1186 *al = TLS1_AD_UNRECOGNIZED_NAME;
1187 return 0;
1188 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001189 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
1190 {
1191 *al = TLS1_AD_INTERNAL_ERROR;
1192 return 0;
1193 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001194 memcpy(s->session->tlsext_hostname, sdata, len);
1195 s->session->tlsext_hostname[len]='\0';
1196 if (strlen(s->session->tlsext_hostname) != len) {
1197 OPENSSL_free(s->session->tlsext_hostname);
1198 s->session->tlsext_hostname = NULL;
1199 *al = TLS1_AD_UNRECOGNIZED_NAME;
1200 return 0;
1201 }
1202 s->servername_done = 1;
1203
1204 }
1205 else
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001206 s->servername_done = s->session->tlsext_hostname
1207 && strlen(s->session->tlsext_hostname) == len
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001208 && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
1209
1210 break;
1211
1212 default:
1213 break;
1214 }
1215
1216 dsize -= len;
1217 }
1218 if (dsize != 0)
1219 {
1220 *al = SSL_AD_DECODE_ERROR;
1221 return 0;
1222 }
1223
1224 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001225#ifndef OPENSSL_NO_SRP
1226 else if (type == TLSEXT_TYPE_srp)
1227 {
1228 if (size <= 0 || ((len = data[0])) != (size -1))
1229 {
1230 *al = SSL_AD_DECODE_ERROR;
1231 return 0;
1232 }
1233 if (s->srp_ctx.login != NULL)
1234 {
1235 *al = SSL_AD_DECODE_ERROR;
1236 return 0;
1237 }
1238 if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
1239 return -1;
1240 memcpy(s->srp_ctx.login, &data[1], len);
1241 s->srp_ctx.login[len]='\0';
1242
1243 if (strlen(s->srp_ctx.login) != len)
1244 {
1245 *al = SSL_AD_DECODE_ERROR;
1246 return 0;
1247 }
1248 }
1249#endif
Brian Carlstrom221304e2010-04-15 14:22:36 -07001250
1251#ifndef OPENSSL_NO_EC
1252 else if (type == TLSEXT_TYPE_ec_point_formats &&
1253 s->version != DTLS1_VERSION)
1254 {
1255 unsigned char *sdata = data;
1256 int ecpointformatlist_length = *(sdata++);
1257
1258 if (ecpointformatlist_length != size - 1)
1259 {
1260 *al = TLS1_AD_DECODE_ERROR;
1261 return 0;
1262 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001263 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001264 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001265 if(s->session->tlsext_ecpointformatlist)
1266 {
Brian Carlstrom976a0342010-12-03 16:11:54 -08001267 OPENSSL_free(s->session->tlsext_ecpointformatlist);
1268 s->session->tlsext_ecpointformatlist = NULL;
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001269 }
1270 s->session->tlsext_ecpointformatlist_length = 0;
1271 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1272 {
1273 *al = TLS1_AD_INTERNAL_ERROR;
1274 return 0;
1275 }
1276 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1277 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001278 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001279#if 0
1280 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
1281 sdata = s->session->tlsext_ecpointformatlist;
1282 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1283 fprintf(stderr,"%i ",*(sdata++));
1284 fprintf(stderr,"\n");
1285#endif
1286 }
1287 else if (type == TLSEXT_TYPE_elliptic_curves &&
1288 s->version != DTLS1_VERSION)
1289 {
1290 unsigned char *sdata = data;
1291 int ellipticcurvelist_length = (*(sdata++) << 8);
1292 ellipticcurvelist_length += (*(sdata++));
1293
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001294 if (ellipticcurvelist_length != size - 2 ||
1295 ellipticcurvelist_length < 1)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001296 {
1297 *al = TLS1_AD_DECODE_ERROR;
1298 return 0;
1299 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001300 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001301 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001302 if(s->session->tlsext_ellipticcurvelist)
1303 {
1304 *al = TLS1_AD_DECODE_ERROR;
1305 return 0;
1306 }
1307 s->session->tlsext_ellipticcurvelist_length = 0;
1308 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
1309 {
1310 *al = TLS1_AD_INTERNAL_ERROR;
1311 return 0;
1312 }
1313 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
1314 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001315 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001316#if 0
1317 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
1318 sdata = s->session->tlsext_ellipticcurvelist;
1319 for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
1320 fprintf(stderr,"%i ",*(sdata++));
1321 fprintf(stderr,"\n");
1322#endif
1323 }
1324#endif /* OPENSSL_NO_EC */
1325#ifdef TLSEXT_TYPE_opaque_prf_input
1326 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1327 s->version != DTLS1_VERSION)
1328 {
1329 unsigned char *sdata = data;
1330
1331 if (size < 2)
1332 {
1333 *al = SSL_AD_DECODE_ERROR;
1334 return 0;
1335 }
1336 n2s(sdata, s->s3->client_opaque_prf_input_len);
1337 if (s->s3->client_opaque_prf_input_len != size - 2)
1338 {
1339 *al = SSL_AD_DECODE_ERROR;
1340 return 0;
1341 }
1342
1343 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1344 OPENSSL_free(s->s3->client_opaque_prf_input);
1345 if (s->s3->client_opaque_prf_input_len == 0)
1346 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1347 else
1348 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
1349 if (s->s3->client_opaque_prf_input == NULL)
1350 {
1351 *al = TLS1_AD_INTERNAL_ERROR;
1352 return 0;
1353 }
1354 }
1355#endif
1356 else if (type == TLSEXT_TYPE_session_ticket)
1357 {
1358 if (s->tls_session_ticket_ext_cb &&
1359 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1360 {
1361 *al = TLS1_AD_INTERNAL_ERROR;
1362 return 0;
1363 }
1364 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001365 else if (type == TLSEXT_TYPE_renegotiate)
1366 {
1367 if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1368 return 0;
1369 renegotiate_seen = 1;
1370 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001371 else if (type == TLSEXT_TYPE_signature_algorithms)
1372 {
1373 int dsize;
1374 if (sigalg_seen || size < 2)
1375 {
1376 *al = SSL_AD_DECODE_ERROR;
1377 return 0;
1378 }
1379 sigalg_seen = 1;
1380 n2s(data,dsize);
1381 size -= 2;
1382 if (dsize != size || dsize & 1)
1383 {
1384 *al = SSL_AD_DECODE_ERROR;
1385 return 0;
1386 }
Kenny Root9296b4b2013-06-24 12:03:19 -07001387 tls1_process_sigalgs(s, data, dsize);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001388 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001389 else if (type == TLSEXT_TYPE_status_request &&
1390 s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001391 {
1392
1393 if (size < 5)
1394 {
1395 *al = SSL_AD_DECODE_ERROR;
1396 return 0;
1397 }
1398
1399 s->tlsext_status_type = *data++;
1400 size--;
1401 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1402 {
1403 const unsigned char *sdata;
1404 int dsize;
1405 /* Read in responder_id_list */
1406 n2s(data,dsize);
1407 size -= 2;
1408 if (dsize > size )
1409 {
1410 *al = SSL_AD_DECODE_ERROR;
1411 return 0;
1412 }
1413 while (dsize > 0)
1414 {
1415 OCSP_RESPID *id;
1416 int idsize;
1417 if (dsize < 4)
1418 {
1419 *al = SSL_AD_DECODE_ERROR;
1420 return 0;
1421 }
1422 n2s(data, idsize);
1423 dsize -= 2 + idsize;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001424 size -= 2 + idsize;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001425 if (dsize < 0)
1426 {
1427 *al = SSL_AD_DECODE_ERROR;
1428 return 0;
1429 }
1430 sdata = data;
1431 data += idsize;
1432 id = d2i_OCSP_RESPID(NULL,
1433 &sdata, idsize);
1434 if (!id)
1435 {
1436 *al = SSL_AD_DECODE_ERROR;
1437 return 0;
1438 }
1439 if (data != sdata)
1440 {
1441 OCSP_RESPID_free(id);
1442 *al = SSL_AD_DECODE_ERROR;
1443 return 0;
1444 }
1445 if (!s->tlsext_ocsp_ids
1446 && !(s->tlsext_ocsp_ids =
1447 sk_OCSP_RESPID_new_null()))
1448 {
1449 OCSP_RESPID_free(id);
1450 *al = SSL_AD_INTERNAL_ERROR;
1451 return 0;
1452 }
1453 if (!sk_OCSP_RESPID_push(
1454 s->tlsext_ocsp_ids, id))
1455 {
1456 OCSP_RESPID_free(id);
1457 *al = SSL_AD_INTERNAL_ERROR;
1458 return 0;
1459 }
1460 }
1461
1462 /* Read in request_extensions */
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001463 if (size < 2)
1464 {
1465 *al = SSL_AD_DECODE_ERROR;
1466 return 0;
1467 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001468 n2s(data,dsize);
1469 size -= 2;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001470 if (dsize != size)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001471 {
1472 *al = SSL_AD_DECODE_ERROR;
1473 return 0;
1474 }
1475 sdata = data;
1476 if (dsize > 0)
1477 {
Brian Carlstrom7b476c42012-01-04 13:22:32 -08001478 if (s->tlsext_ocsp_exts)
1479 {
1480 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1481 X509_EXTENSION_free);
1482 }
1483
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001484 s->tlsext_ocsp_exts =
1485 d2i_X509_EXTENSIONS(NULL,
1486 &sdata, dsize);
1487 if (!s->tlsext_ocsp_exts
1488 || (data + dsize != sdata))
1489 {
1490 *al = SSL_AD_DECODE_ERROR;
1491 return 0;
1492 }
1493 }
1494 }
1495 /* We don't know what to do with any other type
1496 * so ignore it.
1497 */
1498 else
1499 s->tlsext_status_type = -1;
1500 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001501#ifndef OPENSSL_NO_HEARTBEATS
1502 else if (type == TLSEXT_TYPE_heartbeat)
1503 {
1504 switch(data[0])
1505 {
1506 case 0x01: /* Client allows us to send HB requests */
1507 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1508 break;
1509 case 0x02: /* Client doesn't accept HB requests */
1510 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1511 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1512 break;
1513 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1514 return 0;
1515 }
1516 }
1517#endif
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001518#ifndef OPENSSL_NO_NEXTPROTONEG
1519 else if (type == TLSEXT_TYPE_next_proto_neg &&
Kenny Rootee53ab12013-06-24 12:07:13 -07001520 s->s3->tmp.finish_md_len == 0 &&
1521 s->s3->alpn_selected == NULL)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001522 {
1523 /* We shouldn't accept this extension on a
1524 * renegotiation.
1525 *
1526 * s->new_session will be set on renegotiation, but we
1527 * probably shouldn't rely that it couldn't be set on
1528 * the initial renegotation too in certain cases (when
1529 * there's some other reason to disallow resuming an
1530 * earlier session -- the current code won't be doing
1531 * anything like that, but this might change).
1532
1533 * A valid sign that there's been a previous handshake
1534 * in this connection is if s->s3->tmp.finish_md_len >
1535 * 0. (We are talking about a check that will happen
1536 * in the Hello protocol round, well before a new
1537 * Finished message could have been computed.) */
1538 s->s3->next_proto_neg_seen = 1;
1539 }
1540#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001541
Adam Langley45bcfbc2013-01-16 13:43:53 -08001542 else if (type == TLSEXT_TYPE_channel_id && s->tlsext_channel_id_enabled)
1543 s->s3->tlsext_channel_id_valid = 1;
1544
Kenny Rootee53ab12013-06-24 12:07:13 -07001545 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation &&
1546 s->ctx->alpn_select_cb &&
1547 s->s3->tmp.finish_md_len == 0)
1548 {
1549 if (tls1_alpn_handle_client_hello(s, data, size, al) != 0)
1550 return 0;
1551 /* ALPN takes precedence over NPN. */
1552 s->s3->next_proto_neg_seen = 0;
1553 }
1554
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001555 /* session ticket processed earlier */
Brian Carlstromeefface2013-02-11 09:54:43 -08001556#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001557 else if (type == TLSEXT_TYPE_use_srtp)
Brian Carlstromeefface2013-02-11 09:54:43 -08001558 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001559 if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
1560 al))
1561 return 0;
Brian Carlstromeefface2013-02-11 09:54:43 -08001562 }
1563#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001564
Brian Carlstrom221304e2010-04-15 14:22:36 -07001565 data+=size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001566 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001567
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001568 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001569
1570 ri_check:
1571
1572 /* Need RI if renegotiating */
1573
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001574 if (!renegotiate_seen && s->renegotiate &&
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001575 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1576 {
1577 *al = SSL_AD_HANDSHAKE_FAILURE;
1578 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1579 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1580 return 0;
1581 }
1582
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001583 return 1;
1584 }
1585
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001586#ifndef OPENSSL_NO_NEXTPROTONEG
1587/* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1588 * elements of zero length are allowed and the set of elements must exactly fill
1589 * the length of the block. */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001590static char ssl_next_proto_validate(unsigned char *d, unsigned len)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001591 {
1592 unsigned int off = 0;
1593
1594 while (off < len)
1595 {
1596 if (d[off] == 0)
1597 return 0;
1598 off += d[off];
1599 off++;
1600 }
1601
1602 return off == len;
1603 }
1604#endif
1605
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001606int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
1607 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001608 unsigned short length;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001609 unsigned short type;
1610 unsigned short size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001611 unsigned char *data = *p;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001612 int tlsext_servername = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001613 int renegotiate_seen = 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001614
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001615#ifndef OPENSSL_NO_NEXTPROTONEG
1616 s->s3->next_proto_neg_seen = 0;
1617#endif
1618
Kenny Rootee53ab12013-06-24 12:07:13 -07001619 if (s->s3->alpn_selected)
1620 {
1621 OPENSSL_free(s->s3->alpn_selected);
1622 s->s3->alpn_selected = NULL;
1623 }
1624
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001625#ifndef OPENSSL_NO_HEARTBEATS
1626 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1627 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1628#endif
1629
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001630 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001631 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001632
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001633 n2s(data,length);
1634 if (data+length != d+n)
1635 {
1636 *al = SSL_AD_DECODE_ERROR;
1637 return 0;
1638 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001639
1640 while(data <= (d+n-4))
1641 {
1642 n2s(data,type);
1643 n2s(data,size);
1644
1645 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001646 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001647
1648 if (s->tlsext_debug_cb)
1649 s->tlsext_debug_cb(s, 1, type, data, size,
1650 s->tlsext_debug_arg);
1651
1652 if (type == TLSEXT_TYPE_server_name)
1653 {
1654 if (s->tlsext_hostname == NULL || size > 0)
1655 {
1656 *al = TLS1_AD_UNRECOGNIZED_NAME;
1657 return 0;
1658 }
1659 tlsext_servername = 1;
1660 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001661
1662#ifndef OPENSSL_NO_EC
1663 else if (type == TLSEXT_TYPE_ec_point_formats &&
1664 s->version != DTLS1_VERSION)
1665 {
1666 unsigned char *sdata = data;
1667 int ecpointformatlist_length = *(sdata++);
1668
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001669 if (ecpointformatlist_length != size - 1 ||
1670 ecpointformatlist_length < 1)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001671 {
1672 *al = TLS1_AD_DECODE_ERROR;
1673 return 0;
1674 }
1675 s->session->tlsext_ecpointformatlist_length = 0;
1676 if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
1677 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1678 {
1679 *al = TLS1_AD_INTERNAL_ERROR;
1680 return 0;
1681 }
1682 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1683 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
1684#if 0
1685 fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1686 sdata = s->session->tlsext_ecpointformatlist;
1687 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1688 fprintf(stderr,"%i ",*(sdata++));
1689 fprintf(stderr,"\n");
1690#endif
1691 }
1692#endif /* OPENSSL_NO_EC */
1693
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001694 else if (type == TLSEXT_TYPE_session_ticket)
1695 {
Brian Carlstrom221304e2010-04-15 14:22:36 -07001696 if (s->tls_session_ticket_ext_cb &&
1697 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1698 {
1699 *al = TLS1_AD_INTERNAL_ERROR;
1700 return 0;
1701 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001702 if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1703 || (size > 0))
1704 {
1705 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1706 return 0;
1707 }
1708 s->tlsext_ticket_expected = 1;
1709 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001710#ifdef TLSEXT_TYPE_opaque_prf_input
1711 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1712 s->version != DTLS1_VERSION)
1713 {
1714 unsigned char *sdata = data;
1715
1716 if (size < 2)
1717 {
1718 *al = SSL_AD_DECODE_ERROR;
1719 return 0;
1720 }
1721 n2s(sdata, s->s3->server_opaque_prf_input_len);
1722 if (s->s3->server_opaque_prf_input_len != size - 2)
1723 {
1724 *al = SSL_AD_DECODE_ERROR;
1725 return 0;
1726 }
1727
1728 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1729 OPENSSL_free(s->s3->server_opaque_prf_input);
1730 if (s->s3->server_opaque_prf_input_len == 0)
1731 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1732 else
1733 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1734
1735 if (s->s3->server_opaque_prf_input == NULL)
1736 {
1737 *al = TLS1_AD_INTERNAL_ERROR;
1738 return 0;
1739 }
1740 }
1741#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001742 else if (type == TLSEXT_TYPE_status_request &&
1743 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001744 {
1745 /* MUST be empty and only sent if we've requested
1746 * a status request message.
1747 */
1748 if ((s->tlsext_status_type == -1) || (size > 0))
1749 {
1750 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1751 return 0;
1752 }
1753 /* Set flag to expect CertificateStatus message */
1754 s->tlsext_status_expected = 1;
1755 }
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001756#ifndef OPENSSL_NO_NEXTPROTONEG
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001757 else if (type == TLSEXT_TYPE_next_proto_neg &&
1758 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001759 {
1760 unsigned char *selected;
1761 unsigned char selected_len;
1762
1763 /* We must have requested it. */
Brian Carlstromeefface2013-02-11 09:54:43 -08001764 if (s->ctx->next_proto_select_cb == NULL)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001765 {
1766 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1767 return 0;
1768 }
1769 /* The data must be valid */
1770 if (!ssl_next_proto_validate(data, size))
1771 {
1772 *al = TLS1_AD_DECODE_ERROR;
1773 return 0;
1774 }
1775 if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
1776 {
1777 *al = TLS1_AD_INTERNAL_ERROR;
1778 return 0;
1779 }
1780 s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1781 if (!s->next_proto_negotiated)
1782 {
1783 *al = TLS1_AD_INTERNAL_ERROR;
1784 return 0;
1785 }
1786 memcpy(s->next_proto_negotiated, selected, selected_len);
1787 s->next_proto_negotiated_len = selected_len;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001788 s->s3->next_proto_neg_seen = 1;
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001789 }
1790#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08001791 else if (type == TLSEXT_TYPE_channel_id)
1792 s->s3->tlsext_channel_id_valid = 1;
1793
Kenny Rootee53ab12013-06-24 12:07:13 -07001794 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation)
1795 {
1796 unsigned len;
1797
1798 /* We must have requested it. */
1799 if (s->alpn_client_proto_list == NULL)
1800 {
1801 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1802 return 0;
1803 }
1804 if (size < 4)
1805 {
1806 *al = TLS1_AD_DECODE_ERROR;
1807 return 0;
1808 }
1809 /* The extension data consists of:
1810 * uint16 list_length
1811 * uint8 proto_length;
1812 * uint8 proto[proto_length]; */
1813 len = data[0];
1814 len <<= 8;
1815 len |= data[1];
1816 if (len != (unsigned) size - 2)
1817 {
1818 *al = TLS1_AD_DECODE_ERROR;
1819 return 0;
1820 }
1821 len = data[2];
1822 if (len != (unsigned) size - 3)
1823 {
1824 *al = TLS1_AD_DECODE_ERROR;
1825 return 0;
1826 }
1827 if (s->s3->alpn_selected)
1828 OPENSSL_free(s->s3->alpn_selected);
1829 s->s3->alpn_selected = OPENSSL_malloc(len);
1830 if (!s->s3->alpn_selected)
1831 {
1832 *al = TLS1_AD_INTERNAL_ERROR;
1833 return 0;
1834 }
1835 memcpy(s->s3->alpn_selected, data + 3, len);
1836 s->s3->alpn_selected_len = len;
1837 }
1838
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001839 else if (type == TLSEXT_TYPE_renegotiate)
1840 {
1841 if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1842 return 0;
1843 renegotiate_seen = 1;
1844 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001845#ifndef OPENSSL_NO_HEARTBEATS
1846 else if (type == TLSEXT_TYPE_heartbeat)
1847 {
1848 switch(data[0])
1849 {
1850 case 0x01: /* Server allows us to send HB requests */
1851 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1852 break;
1853 case 0x02: /* Server doesn't accept HB requests */
1854 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1855 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1856 break;
1857 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1858 return 0;
1859 }
1860 }
1861#endif
Brian Carlstromeefface2013-02-11 09:54:43 -08001862#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001863 else if (type == TLSEXT_TYPE_use_srtp)
Brian Carlstromeefface2013-02-11 09:54:43 -08001864 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001865 if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
1866 al))
1867 return 0;
Brian Carlstromeefface2013-02-11 09:54:43 -08001868 }
1869#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001870
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001871 data+=size;
1872 }
1873
1874 if (data != d+n)
1875 {
1876 *al = SSL_AD_DECODE_ERROR;
1877 return 0;
1878 }
1879
1880 if (!s->hit && tlsext_servername == 1)
1881 {
1882 if (s->tlsext_hostname)
1883 {
1884 if (s->session->tlsext_hostname == NULL)
1885 {
1886 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1887 if (!s->session->tlsext_hostname)
1888 {
1889 *al = SSL_AD_UNRECOGNIZED_NAME;
1890 return 0;
1891 }
1892 }
1893 else
1894 {
1895 *al = SSL_AD_DECODE_ERROR;
1896 return 0;
1897 }
1898 }
1899 }
1900
1901 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001902
1903 ri_check:
1904
1905 /* Determine if we need to see RI. Strictly speaking if we want to
1906 * avoid an attack we should *always* see RI even on initial server
1907 * hello because the client doesn't see any renegotiation during an
1908 * attack. However this would mean we could not connect to any server
1909 * which doesn't support RI so for the immediate future tolerate RI
1910 * absence on initial connect only.
1911 */
1912 if (!renegotiate_seen
1913 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1914 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1915 {
1916 *al = SSL_AD_HANDSHAKE_FAILURE;
1917 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1918 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1919 return 0;
1920 }
1921
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001922 return 1;
1923 }
1924
Brian Carlstrom221304e2010-04-15 14:22:36 -07001925
1926int ssl_prepare_clienthello_tlsext(SSL *s)
1927 {
1928#ifndef OPENSSL_NO_EC
1929 /* If we are client and using an elliptic curve cryptography cipher suite, send the point formats
1930 * and elliptic curves we support.
1931 */
1932 int using_ecc = 0;
1933 int i;
1934 unsigned char *j;
1935 unsigned long alg_k, alg_a;
1936 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1937
1938 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1939 {
1940 SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1941
1942 alg_k = c->algorithm_mkey;
1943 alg_a = c->algorithm_auth;
1944 if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe) || (alg_a & SSL_aECDSA)))
1945 {
1946 using_ecc = 1;
1947 break;
1948 }
1949 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001950 using_ecc = using_ecc && (s->version >= TLS1_VERSION);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001951 if (using_ecc)
1952 {
1953 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1954 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1955 {
1956 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1957 return -1;
1958 }
1959 s->tlsext_ecpointformatlist_length = 3;
1960 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1961 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1962 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1963
1964 /* we support all named elliptic curves in draft-ietf-tls-ecc-12 */
1965 if (s->tlsext_ellipticcurvelist != NULL) OPENSSL_free(s->tlsext_ellipticcurvelist);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001966 s->tlsext_ellipticcurvelist_length = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001967 if ((s->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
1968 {
1969 s->tlsext_ellipticcurvelist_length = 0;
1970 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1971 return -1;
1972 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001973 for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1974 sizeof(pref_list)/sizeof(pref_list[0]); i++)
1975 {
1976 int id = tls1_ec_nid2curve_id(pref_list[i]);
1977 s2n(id,j);
1978 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001979 }
1980#endif /* OPENSSL_NO_EC */
1981
1982#ifdef TLSEXT_TYPE_opaque_prf_input
1983 {
1984 int r = 1;
1985
1986 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1987 {
1988 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1989 if (!r)
1990 return -1;
1991 }
1992
1993 if (s->tlsext_opaque_prf_input != NULL)
1994 {
1995 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1996 OPENSSL_free(s->s3->client_opaque_prf_input);
1997
1998 if (s->tlsext_opaque_prf_input_len == 0)
1999 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2000 else
2001 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
2002 if (s->s3->client_opaque_prf_input == NULL)
2003 {
2004 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
2005 return -1;
2006 }
2007 s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
2008 }
2009
2010 if (r == 2)
2011 /* at callback's request, insist on receiving an appropriate server opaque PRF input */
2012 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
2013 }
2014#endif
2015
2016 return 1;
2017 }
2018
2019int ssl_prepare_serverhello_tlsext(SSL *s)
2020 {
2021#ifndef OPENSSL_NO_EC
2022 /* If we are server and using an ECC cipher suite, send the point formats we support
2023 * if the client sent us an ECPointsFormat extension. Note that the server is not
2024 * supposed to send an EllipticCurves extension.
2025 */
2026
2027 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
2028 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
2029 int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
2030 using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
2031
2032 if (using_ecc)
2033 {
2034 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
2035 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
2036 {
2037 SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
2038 return -1;
2039 }
2040 s->tlsext_ecpointformatlist_length = 3;
2041 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
2042 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
2043 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
2044 }
2045#endif /* OPENSSL_NO_EC */
2046
2047 return 1;
2048 }
2049
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08002050int ssl_check_clienthello_tlsext_early(SSL *s)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002051 {
2052 int ret=SSL_TLSEXT_ERR_NOACK;
2053 int al = SSL_AD_UNRECOGNIZED_NAME;
2054
Brian Carlstrom221304e2010-04-15 14:22:36 -07002055#ifndef OPENSSL_NO_EC
2056 /* The handling of the ECPointFormats extension is done elsewhere, namely in
2057 * ssl3_choose_cipher in s3_lib.c.
2058 */
2059 /* The handling of the EllipticCurves extension is done elsewhere, namely in
2060 * ssl3_choose_cipher in s3_lib.c.
2061 */
2062#endif
2063
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002064 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2065 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
2066 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
2067 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
2068
Brian Carlstrom221304e2010-04-15 14:22:36 -07002069#ifdef TLSEXT_TYPE_opaque_prf_input
2070 {
2071 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
2072 * but we might be sending an alert in response to the client hello,
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08002073 * so this has to happen here in
2074 * ssl_check_clienthello_tlsext_early(). */
Brian Carlstrom221304e2010-04-15 14:22:36 -07002075
2076 int r = 1;
2077
2078 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
2079 {
2080 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
2081 if (!r)
2082 {
2083 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2084 al = SSL_AD_INTERNAL_ERROR;
2085 goto err;
2086 }
2087 }
2088
2089 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
2090 OPENSSL_free(s->s3->server_opaque_prf_input);
2091 s->s3->server_opaque_prf_input = NULL;
2092
2093 if (s->tlsext_opaque_prf_input != NULL)
2094 {
2095 if (s->s3->client_opaque_prf_input != NULL &&
2096 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
2097 {
2098 /* can only use this extension if we have a server opaque PRF input
2099 * of the same length as the client opaque PRF input! */
2100
2101 if (s->tlsext_opaque_prf_input_len == 0)
2102 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
2103 else
2104 s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
2105 if (s->s3->server_opaque_prf_input == NULL)
2106 {
2107 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2108 al = SSL_AD_INTERNAL_ERROR;
2109 goto err;
2110 }
2111 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
2112 }
2113 }
2114
2115 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
2116 {
2117 /* The callback wants to enforce use of the extension,
2118 * but we can't do that with the client opaque PRF input;
2119 * abort the handshake.
2120 */
2121 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2122 al = SSL_AD_HANDSHAKE_FAILURE;
2123 }
2124 }
2125
Brian Carlstrom221304e2010-04-15 14:22:36 -07002126 err:
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08002127#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002128 switch (ret)
2129 {
2130 case SSL_TLSEXT_ERR_ALERT_FATAL:
2131 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2132 return -1;
2133
2134 case SSL_TLSEXT_ERR_ALERT_WARNING:
2135 ssl3_send_alert(s,SSL3_AL_WARNING,al);
2136 return 1;
2137
2138 case SSL_TLSEXT_ERR_NOACK:
2139 s->servername_done=0;
2140 default:
2141 return 1;
2142 }
2143 }
2144
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08002145int ssl_check_clienthello_tlsext_late(SSL *s)
2146 {
2147 int ret = SSL_TLSEXT_ERR_OK;
2148 int al;
2149
2150 /* If status request then ask callback what to do.
2151 * Note: this must be called after servername callbacks in case
2152 * the certificate has changed, and must be called after the cipher
2153 * has been chosen because this may influence which certificate is sent
2154 */
2155 if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
2156 {
2157 int r;
2158 CERT_PKEY *certpkey;
2159 certpkey = ssl_get_server_send_pkey(s);
2160 /* If no certificate can't return certificate status */
2161 if (certpkey == NULL)
2162 {
2163 s->tlsext_status_expected = 0;
2164 return 1;
2165 }
2166 /* Set current certificate to one we will use so
2167 * SSL_get_certificate et al can pick it up.
2168 */
2169 s->cert->key = certpkey;
2170 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2171 switch (r)
2172 {
2173 /* We don't want to send a status request response */
2174 case SSL_TLSEXT_ERR_NOACK:
2175 s->tlsext_status_expected = 0;
2176 break;
2177 /* status request response should be sent */
2178 case SSL_TLSEXT_ERR_OK:
2179 if (s->tlsext_ocsp_resp)
2180 s->tlsext_status_expected = 1;
2181 else
2182 s->tlsext_status_expected = 0;
2183 break;
2184 /* something bad happened */
2185 case SSL_TLSEXT_ERR_ALERT_FATAL:
2186 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2187 al = SSL_AD_INTERNAL_ERROR;
2188 goto err;
2189 }
2190 }
2191 else
2192 s->tlsext_status_expected = 0;
2193
2194 err:
2195 switch (ret)
2196 {
2197 case SSL_TLSEXT_ERR_ALERT_FATAL:
2198 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2199 return -1;
2200
2201 case SSL_TLSEXT_ERR_ALERT_WARNING:
2202 ssl3_send_alert(s,SSL3_AL_WARNING,al);
2203 return 1;
2204
2205 default:
2206 return 1;
2207 }
2208 }
2209
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002210int ssl_check_serverhello_tlsext(SSL *s)
2211 {
2212 int ret=SSL_TLSEXT_ERR_NOACK;
2213 int al = SSL_AD_UNRECOGNIZED_NAME;
2214
Brian Carlstrom221304e2010-04-15 14:22:36 -07002215#ifndef OPENSSL_NO_EC
Brian Carlstrom976a0342010-12-03 16:11:54 -08002216 /* If we are client and using an elliptic curve cryptography cipher
2217 * suite, then if server returns an EC point formats lists extension
2218 * it must contain uncompressed.
Brian Carlstrom221304e2010-04-15 14:22:36 -07002219 */
2220 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
2221 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
2222 if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom976a0342010-12-03 16:11:54 -08002223 (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom221304e2010-04-15 14:22:36 -07002224 ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
2225 {
2226 /* we are using an ECC cipher */
2227 size_t i;
2228 unsigned char *list;
2229 int found_uncompressed = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -07002230 list = s->session->tlsext_ecpointformatlist;
2231 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
2232 {
2233 if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
2234 {
2235 found_uncompressed = 1;
2236 break;
2237 }
2238 }
2239 if (!found_uncompressed)
2240 {
2241 SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
2242 return -1;
2243 }
2244 }
2245 ret = SSL_TLSEXT_ERR_OK;
2246#endif /* OPENSSL_NO_EC */
2247
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002248 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2249 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
2250 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
2251 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
2252
Brian Carlstrom221304e2010-04-15 14:22:36 -07002253#ifdef TLSEXT_TYPE_opaque_prf_input
2254 if (s->s3->server_opaque_prf_input_len > 0)
2255 {
2256 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
2257 * So first verify that we really have a value from the server too. */
2258
2259 if (s->s3->server_opaque_prf_input == NULL)
2260 {
2261 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2262 al = SSL_AD_HANDSHAKE_FAILURE;
2263 }
2264
2265 /* Anytime the server *has* sent an opaque PRF input, we need to check
2266 * that we have a client opaque PRF input of the same size. */
2267 if (s->s3->client_opaque_prf_input == NULL ||
2268 s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
2269 {
2270 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2271 al = SSL_AD_ILLEGAL_PARAMETER;
2272 }
2273 }
2274#endif
2275
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002276 /* If we've requested certificate status and we wont get one
2277 * tell the callback
2278 */
2279 if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
Brian Carlstrom221304e2010-04-15 14:22:36 -07002280 && s->ctx && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002281 {
2282 int r;
2283 /* Set resp to NULL, resplen to -1 so callback knows
2284 * there is no response.
2285 */
2286 if (s->tlsext_ocsp_resp)
2287 {
2288 OPENSSL_free(s->tlsext_ocsp_resp);
2289 s->tlsext_ocsp_resp = NULL;
2290 }
2291 s->tlsext_ocsp_resplen = -1;
2292 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2293 if (r == 0)
2294 {
2295 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2296 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2297 }
2298 if (r < 0)
2299 {
2300 al = SSL_AD_INTERNAL_ERROR;
2301 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2302 }
2303 }
2304
2305 switch (ret)
2306 {
2307 case SSL_TLSEXT_ERR_ALERT_FATAL:
2308 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2309 return -1;
2310
2311 case SSL_TLSEXT_ERR_ALERT_WARNING:
2312 ssl3_send_alert(s,SSL3_AL_WARNING,al);
2313 return 1;
2314
2315 case SSL_TLSEXT_ERR_NOACK:
2316 s->servername_done=0;
2317 default:
2318 return 1;
2319 }
2320 }
2321
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002322/* Since the server cache lookup is done early on in the processing of the
2323 * ClientHello, and other operations depend on the result, we need to handle
2324 * any TLS session ticket extension at the same time.
2325 *
2326 * session_id: points at the session ID in the ClientHello. This code will
2327 * read past the end of this in order to parse out the session ticket
2328 * extension, if any.
2329 * len: the length of the session ID.
2330 * limit: a pointer to the first byte after the ClientHello.
2331 * ret: (output) on return, if a ticket was decrypted, then this is set to
2332 * point to the resulting session.
2333 *
2334 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2335 * ciphersuite, in which case we have no use for session tickets and one will
2336 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2337 *
2338 * Returns:
2339 * -1: fatal error, either from parsing or decrypting the ticket.
2340 * 0: no ticket was found (or was ignored, based on settings).
2341 * 1: a zero length extension was found, indicating that the client supports
2342 * session tickets but doesn't currently have one to offer.
2343 * 2: either s->tls_session_secret_cb was set, or a ticket was offered but
2344 * couldn't be decrypted because of a non-fatal error.
2345 * 3: a ticket was successfully decrypted and *ret was set.
2346 *
2347 * Side effects:
2348 * Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2349 * a new session ticket to the client because the client indicated support
2350 * (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2351 * a session ticket or we couldn't use the one it gave us, or if
2352 * s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2353 * Otherwise, s->tlsext_ticket_expected is set to 0.
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002354 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002355int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002356 const unsigned char *limit, SSL_SESSION **ret)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002357 {
2358 /* Point after session ID in client hello */
2359 const unsigned char *p = session_id + len;
2360 unsigned short i;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002361
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002362 *ret = NULL;
2363 s->tlsext_ticket_expected = 0;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002364
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002365 /* If tickets disabled behave as if no ticket present
2366 * to permit stateful resumption.
2367 */
2368 if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2369 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002370 if ((s->version <= SSL3_VERSION) || !limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002371 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002372 if (p >= limit)
2373 return -1;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002374 /* Skip past DTLS cookie */
2375 if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
2376 {
2377 i = *(p++);
2378 p+= i;
2379 if (p >= limit)
2380 return -1;
2381 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002382 /* Skip past cipher list */
2383 n2s(p, i);
2384 p+= i;
2385 if (p >= limit)
2386 return -1;
2387 /* Skip past compression algorithm list */
2388 i = *(p++);
2389 p += i;
2390 if (p > limit)
2391 return -1;
2392 /* Now at start of extensions */
2393 if ((p + 2) >= limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002394 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002395 n2s(p, i);
2396 while ((p + 4) <= limit)
2397 {
2398 unsigned short type, size;
2399 n2s(p, type);
2400 n2s(p, size);
2401 if (p + size > limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002402 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002403 if (type == TLSEXT_TYPE_session_ticket)
2404 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002405 int r;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002406 if (size == 0)
2407 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002408 /* The client will accept a ticket but doesn't
2409 * currently have one. */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002410 s->tlsext_ticket_expected = 1;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002411 return 1;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002412 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07002413 if (s->tls_session_secret_cb)
2414 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002415 /* Indicate that the ticket couldn't be
2416 * decrypted rather than generating the session
2417 * from ticket now, trigger abbreviated
2418 * handshake based on external mechanism to
2419 * calculate the master secret later. */
2420 return 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07002421 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002422 r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2423 switch (r)
2424 {
2425 case 2: /* ticket couldn't be decrypted */
2426 s->tlsext_ticket_expected = 1;
2427 return 2;
2428 case 3: /* ticket was decrypted */
2429 return r;
2430 case 4: /* ticket decrypted but need to renew */
2431 s->tlsext_ticket_expected = 1;
2432 return 3;
2433 default: /* fatal error */
2434 return -1;
2435 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002436 }
2437 p += size;
2438 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002439 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002440 }
2441
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002442/* tls_decrypt_ticket attempts to decrypt a session ticket.
2443 *
2444 * etick: points to the body of the session ticket extension.
2445 * eticklen: the length of the session tickets extenion.
2446 * sess_id: points at the session ID.
2447 * sesslen: the length of the session ID.
2448 * psess: (output) on return, if a ticket was decrypted, then this is set to
2449 * point to the resulting session.
2450 *
2451 * Returns:
2452 * -1: fatal error, either from parsing or decrypting the ticket.
2453 * 2: the ticket couldn't be decrypted.
2454 * 3: a ticket was successfully decrypted and *psess was set.
2455 * 4: same as 3, but the ticket needs to be renewed.
2456 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002457static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2458 const unsigned char *sess_id, int sesslen,
2459 SSL_SESSION **psess)
2460 {
2461 SSL_SESSION *sess;
2462 unsigned char *sdec;
2463 const unsigned char *p;
2464 int slen, mlen, renew_ticket = 0;
2465 unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2466 HMAC_CTX hctx;
2467 EVP_CIPHER_CTX ctx;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002468 SSL_CTX *tctx = s->initial_ctx;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002469 /* Need at least keyname + iv + some encrypted data */
2470 if (eticklen < 48)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002471 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002472 /* Initialize session ticket encryption and HMAC contexts */
2473 HMAC_CTX_init(&hctx);
2474 EVP_CIPHER_CTX_init(&ctx);
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002475 if (tctx->tlsext_ticket_key_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002476 {
2477 unsigned char *nctick = (unsigned char *)etick;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002478 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002479 &ctx, &hctx, 0);
2480 if (rv < 0)
2481 return -1;
2482 if (rv == 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002483 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002484 if (rv == 2)
2485 renew_ticket = 1;
2486 }
2487 else
2488 {
2489 /* Check key name matches */
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002490 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002491 return 2;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002492 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002493 tlsext_tick_md(), NULL);
2494 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002495 tctx->tlsext_tick_aes_key, etick + 16);
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002496 }
2497 /* Attempt to process session ticket, first conduct sanity and
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002498 * integrity checks on ticket.
2499 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002500 mlen = HMAC_size(&hctx);
Brian Carlstrom221304e2010-04-15 14:22:36 -07002501 if (mlen < 0)
2502 {
2503 EVP_CIPHER_CTX_cleanup(&ctx);
2504 return -1;
2505 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002506 eticklen -= mlen;
2507 /* Check HMAC of encrypted ticket */
2508 HMAC_Update(&hctx, etick, eticklen);
2509 HMAC_Final(&hctx, tick_hmac, NULL);
2510 HMAC_CTX_cleanup(&hctx);
Brian Carlstromfa75fdb2013-02-01 23:44:05 -08002511 if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002512 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002513 /* Attempt to decrypt session data */
2514 /* Move p after IV to start of encrypted ticket, update length */
2515 p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2516 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2517 sdec = OPENSSL_malloc(eticklen);
2518 if (!sdec)
2519 {
2520 EVP_CIPHER_CTX_cleanup(&ctx);
2521 return -1;
2522 }
2523 EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2524 if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002525 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002526 slen += mlen;
2527 EVP_CIPHER_CTX_cleanup(&ctx);
2528 p = sdec;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002529
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002530 sess = d2i_SSL_SESSION(NULL, &p, slen);
2531 OPENSSL_free(sdec);
2532 if (sess)
2533 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002534 /* The session ID, if non-empty, is used by some clients to
2535 * detect that the ticket has been accepted. So we copy it to
2536 * the session structure. If it is empty set length to zero
2537 * as required by standard.
2538 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002539 if (sesslen)
2540 memcpy(sess->session_id, sess_id, sesslen);
2541 sess->session_id_length = sesslen;
2542 *psess = sess;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002543 if (renew_ticket)
2544 return 4;
2545 else
2546 return 3;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002547 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002548 ERR_clear_error();
2549 /* For session parse failure, indicate that we need to send a new
2550 * ticket. */
2551 return 2;
2552 }
2553
2554/* Tables to translate from NIDs to TLS v1.2 ids */
2555
2556typedef struct
2557 {
2558 int nid;
2559 int id;
2560 } tls12_lookup;
2561
2562static tls12_lookup tls12_md[] = {
2563#ifndef OPENSSL_NO_MD5
2564 {NID_md5, TLSEXT_hash_md5},
2565#endif
2566#ifndef OPENSSL_NO_SHA
2567 {NID_sha1, TLSEXT_hash_sha1},
2568#endif
2569#ifndef OPENSSL_NO_SHA256
2570 {NID_sha224, TLSEXT_hash_sha224},
2571 {NID_sha256, TLSEXT_hash_sha256},
2572#endif
2573#ifndef OPENSSL_NO_SHA512
2574 {NID_sha384, TLSEXT_hash_sha384},
2575 {NID_sha512, TLSEXT_hash_sha512}
2576#endif
2577};
2578
2579static tls12_lookup tls12_sig[] = {
2580#ifndef OPENSSL_NO_RSA
2581 {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2582#endif
2583#ifndef OPENSSL_NO_DSA
2584 {EVP_PKEY_DSA, TLSEXT_signature_dsa},
2585#endif
2586#ifndef OPENSSL_NO_ECDSA
2587 {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2588#endif
2589};
2590
2591static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2592 {
2593 size_t i;
2594 for (i = 0; i < tlen; i++)
2595 {
2596 if (table[i].nid == nid)
2597 return table[i].id;
2598 }
2599 return -1;
2600 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002601
2602int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
2603 {
2604 int sig_id, md_id;
2605 if (!md)
2606 return 0;
2607 md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2608 sizeof(tls12_md)/sizeof(tls12_lookup));
2609 if (md_id == -1)
2610 return 0;
2611 sig_id = tls12_get_sigid(pk);
2612 if (sig_id == -1)
2613 return 0;
2614 p[0] = (unsigned char)md_id;
2615 p[1] = (unsigned char)sig_id;
2616 return 1;
2617 }
2618
Kenny Root9296b4b2013-06-24 12:03:19 -07002619/* tls12_get_sigid returns the TLS 1.2 SignatureAlgorithm value corresponding
2620 * to the given public key, or -1 if not known. */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002621int tls12_get_sigid(const EVP_PKEY *pk)
2622 {
2623 return tls12_find_id(pk->type, tls12_sig,
2624 sizeof(tls12_sig)/sizeof(tls12_lookup));
2625 }
2626
2627const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2628 {
2629 switch(hash_alg)
2630 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002631#ifndef OPENSSL_NO_SHA
Kenny Root9296b4b2013-06-24 12:03:19 -07002632 case TLSEXT_hash_sha1:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002633 return EVP_sha1();
2634#endif
2635#ifndef OPENSSL_NO_SHA256
Kenny Root9296b4b2013-06-24 12:03:19 -07002636 case TLSEXT_hash_sha224:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002637 return EVP_sha224();
2638
Kenny Root9296b4b2013-06-24 12:03:19 -07002639 case TLSEXT_hash_sha256:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002640 return EVP_sha256();
2641#endif
2642#ifndef OPENSSL_NO_SHA512
Kenny Root9296b4b2013-06-24 12:03:19 -07002643 case TLSEXT_hash_sha384:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002644 return EVP_sha384();
2645
Kenny Root9296b4b2013-06-24 12:03:19 -07002646 case TLSEXT_hash_sha512:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002647 return EVP_sha512();
2648#endif
Kenny Root9296b4b2013-06-24 12:03:19 -07002649 default:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002650 return NULL;
2651
2652 }
2653 }
2654
Kenny Root9296b4b2013-06-24 12:03:19 -07002655/* tls1_process_sigalgs processes a signature_algorithms extension and sets the
2656 * digest functions accordingly for each key type.
2657 *
2658 * See RFC 5246, section 7.4.1.4.1.
2659 *
2660 * data: points to the content of the extension, not including type and length
2661 * headers.
2662 * dsize: the number of bytes of |data|. Must be even.
2663 */
2664void tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002665 {
Kenny Root9296b4b2013-06-24 12:03:19 -07002666 int i;
2667 const EVP_MD *md, **digest_ptr;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002668 /* Extension ignored for TLS versions below 1.2 */
2669 if (TLS1_get_version(s) < TLS1_2_VERSION)
Kenny Root9296b4b2013-06-24 12:03:19 -07002670 return;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002671
Kenny Root9296b4b2013-06-24 12:03:19 -07002672 s->s3->digest_rsa = NULL;
2673 s->s3->digest_dsa = NULL;
2674 s->s3->digest_ecdsa = NULL;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002675
2676 for (i = 0; i < dsize; i += 2)
2677 {
2678 unsigned char hash_alg = data[i], sig_alg = data[i+1];
2679
2680 switch(sig_alg)
2681 {
2682#ifndef OPENSSL_NO_RSA
2683 case TLSEXT_signature_rsa:
Kenny Root9296b4b2013-06-24 12:03:19 -07002684 digest_ptr = &s->s3->digest_rsa;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002685 break;
2686#endif
2687#ifndef OPENSSL_NO_DSA
2688 case TLSEXT_signature_dsa:
Kenny Root9296b4b2013-06-24 12:03:19 -07002689 digest_ptr = &s->s3->digest_dsa;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002690 break;
2691#endif
2692#ifndef OPENSSL_NO_ECDSA
2693 case TLSEXT_signature_ecdsa:
Kenny Root9296b4b2013-06-24 12:03:19 -07002694 digest_ptr = &s->s3->digest_ecdsa;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002695 break;
2696#endif
2697 default:
2698 continue;
2699 }
2700
Kenny Root9296b4b2013-06-24 12:03:19 -07002701 if (*digest_ptr == NULL)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002702 {
2703 md = tls12_get_hash(hash_alg);
2704 if (md)
Kenny Root9296b4b2013-06-24 12:03:19 -07002705 *digest_ptr = md;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002706 }
2707
2708 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002709 }
2710
2711#endif
2712
2713#ifndef OPENSSL_NO_HEARTBEATS
2714int
2715tls1_process_heartbeat(SSL *s)
2716 {
2717 unsigned char *p = &s->s3->rrec.data[0], *pl;
2718 unsigned short hbtype;
2719 unsigned int payload;
2720 unsigned int padding = 16; /* Use minimum padding */
2721
2722 /* Read type and payload length first */
2723 hbtype = *p++;
2724 n2s(p, payload);
2725 pl = p;
2726
2727 if (s->msg_callback)
2728 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2729 &s->s3->rrec.data[0], s->s3->rrec.length,
2730 s, s->msg_callback_arg);
2731
2732 if (hbtype == TLS1_HB_REQUEST)
2733 {
2734 unsigned char *buffer, *bp;
2735 int r;
2736
2737 /* Allocate memory for the response, size is 1 bytes
2738 * message type, plus 2 bytes payload length, plus
2739 * payload, plus padding
2740 */
2741 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2742 bp = buffer;
2743
2744 /* Enter response type, length and copy payload */
2745 *bp++ = TLS1_HB_RESPONSE;
2746 s2n(payload, bp);
2747 memcpy(bp, pl, payload);
2748 bp += payload;
2749 /* Random padding */
2750 RAND_pseudo_bytes(bp, padding);
2751
2752 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
2753
2754 if (r >= 0 && s->msg_callback)
2755 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2756 buffer, 3 + payload + padding,
2757 s, s->msg_callback_arg);
2758
2759 OPENSSL_free(buffer);
2760
2761 if (r < 0)
2762 return r;
2763 }
2764 else if (hbtype == TLS1_HB_RESPONSE)
2765 {
2766 unsigned int seq;
2767
2768 /* We only send sequence numbers (2 bytes unsigned int),
2769 * and 16 random bytes, so we just try to read the
2770 * sequence number */
2771 n2s(pl, seq);
2772
2773 if (payload == 18 && seq == s->tlsext_hb_seq)
2774 {
2775 s->tlsext_hb_seq++;
2776 s->tlsext_hb_pending = 0;
2777 }
2778 }
2779
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002780 return 0;
2781 }
2782
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002783int
2784tls1_heartbeat(SSL *s)
2785 {
2786 unsigned char *buf, *p;
2787 int ret;
2788 unsigned int payload = 18; /* Sequence number + random bytes */
2789 unsigned int padding = 16; /* Use minimum padding */
2790
2791 /* Only send if peer supports and accepts HB requests... */
2792 if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2793 s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
2794 {
2795 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2796 return -1;
2797 }
2798
2799 /* ...and there is none in flight yet... */
2800 if (s->tlsext_hb_pending)
2801 {
2802 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
2803 return -1;
2804 }
2805
2806 /* ...and no handshake in progress. */
2807 if (SSL_in_init(s) || s->in_handshake)
2808 {
2809 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
2810 return -1;
2811 }
2812
2813 /* Check if padding is too long, payload and padding
2814 * must not exceed 2^14 - 3 = 16381 bytes in total.
2815 */
2816 OPENSSL_assert(payload + padding <= 16381);
2817
2818 /* Create HeartBeat message, we just use a sequence number
2819 * as payload to distuingish different messages and add
2820 * some random stuff.
2821 * - Message Type, 1 byte
2822 * - Payload Length, 2 bytes (unsigned int)
2823 * - Payload, the sequence number (2 bytes uint)
2824 * - Payload, random bytes (16 bytes uint)
2825 * - Padding
2826 */
2827 buf = OPENSSL_malloc(1 + 2 + payload + padding);
2828 p = buf;
2829 /* Message Type */
2830 *p++ = TLS1_HB_REQUEST;
2831 /* Payload length (18 bytes here) */
2832 s2n(payload, p);
2833 /* Sequence number */
2834 s2n(s->tlsext_hb_seq, p);
2835 /* 16 random bytes */
2836 RAND_pseudo_bytes(p, 16);
2837 p += 16;
2838 /* Random padding */
2839 RAND_pseudo_bytes(p, padding);
2840
2841 ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2842 if (ret >= 0)
2843 {
2844 if (s->msg_callback)
2845 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2846 buf, 3 + payload + padding,
2847 s, s->msg_callback_arg);
2848
2849 s->tlsext_hb_pending = 1;
2850 }
2851
2852 OPENSSL_free(buf);
2853
2854 return ret;
2855 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002856#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08002857
2858#if !defined(OPENSSL_NO_TLSEXT)
2859/* tls1_channel_id_hash calculates the signed data for a Channel ID on the given
2860 * SSL connection and writes it to |md|.
2861 */
2862int
2863tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s)
2864 {
2865 EVP_MD_CTX ctx;
2866 unsigned char temp_digest[EVP_MAX_MD_SIZE];
2867 unsigned temp_digest_len;
2868 int i;
2869 static const char kClientIDMagic[] = "TLS Channel ID signature";
2870
2871 if (s->s3->handshake_buffer)
2872 if (!ssl3_digest_cached_records(s))
2873 return 0;
2874
2875 EVP_DigestUpdate(md, kClientIDMagic, sizeof(kClientIDMagic));
2876
2877 EVP_MD_CTX_init(&ctx);
2878 for (i = 0; i < SSL_MAX_DIGEST; i++)
2879 {
2880 if (s->s3->handshake_dgst[i] == NULL)
2881 continue;
2882 EVP_MD_CTX_copy_ex(&ctx, s->s3->handshake_dgst[i]);
2883 EVP_DigestFinal_ex(&ctx, temp_digest, &temp_digest_len);
2884 EVP_DigestUpdate(md, temp_digest, temp_digest_len);
2885 }
2886 EVP_MD_CTX_cleanup(&ctx);
2887
2888 return 1;
2889 }
2890#endif