blob: 9972b1a578fb9cfab7c538a7279412ba6719ad22 [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
345#ifndef OPENSSL_NO_MD5
346 tlsext_sigalg_rsa(TLSEXT_hash_md5)
347#endif
348};
349
350int tls12_get_req_sig_algs(SSL *s, unsigned char *p)
351 {
352 size_t slen = sizeof(tls12_sigalgs);
353#ifdef OPENSSL_FIPS
354 /* If FIPS mode don't include MD5 which is last */
355 if (FIPS_mode())
356 slen -= 2;
357#endif
358 if (p)
359 memcpy(p, tls12_sigalgs, slen);
360 return (int)slen;
361 }
362
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800363unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
364 {
365 int extdatalen=0;
366 unsigned char *ret = p;
367
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800368 /* don't add extensions for SSLv3 unless doing secure renegotiation */
369 if (s->client_version == SSL3_VERSION
370 && !s->s3->send_connection_binding)
371 return p;
372
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800373 ret+=2;
374
375 if (ret>=limit) return NULL; /* this really never occurs, but ... */
376
377 if (s->tlsext_hostname != NULL)
378 {
379 /* Add TLS extension servername to the Client Hello message */
380 unsigned long size_str;
381 long lenmax;
382
383 /* check for enough space.
384 4 for the servername type and entension length
385 2 for servernamelist length
386 1 for the hostname type
387 2 for hostname length
388 + hostname length
389 */
390
391 if ((lenmax = limit - ret - 9) < 0
Brian Carlstrom221304e2010-04-15 14:22:36 -0700392 || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800393 return NULL;
394
395 /* extension type and length */
396 s2n(TLSEXT_TYPE_server_name,ret);
397 s2n(size_str+5,ret);
398
399 /* length of servername list */
400 s2n(size_str+3,ret);
401
402 /* hostname type, length and hostname */
403 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
404 s2n(size_str,ret);
405 memcpy(ret, s->tlsext_hostname, size_str);
406 ret+=size_str;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800407 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700408
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800409 /* Add RI if renegotiating */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700410 if (s->renegotiate)
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800411 {
412 int el;
413
414 if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
415 {
416 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
417 return NULL;
418 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800419
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800420 if((limit - p - 4 - el) < 0) return NULL;
421
422 s2n(TLSEXT_TYPE_renegotiate,ret);
423 s2n(el,ret);
424
425 if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
426 {
427 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
428 return NULL;
429 }
430
431 ret += el;
432 }
433
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700434#ifndef OPENSSL_NO_SRP
435 /* Add SRP username if there is one */
436 if (s->srp_ctx.login != NULL)
437 { /* Add TLS extension SRP username to the Client Hello message */
438
439 int login_len = strlen(s->srp_ctx.login);
440 if (login_len > 255 || login_len == 0)
441 {
442 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
443 return NULL;
444 }
445
446 /* check for enough space.
447 4 for the srp type type and entension length
448 1 for the srp user identity
449 + srp user identity length
450 */
451 if ((limit - ret - 5 - login_len) < 0) return NULL;
452
453 /* fill in the extension */
454 s2n(TLSEXT_TYPE_srp,ret);
455 s2n(login_len+1,ret);
456 (*ret++) = (unsigned char) login_len;
457 memcpy(ret, s->srp_ctx.login, login_len);
458 ret+=login_len;
459 }
460#endif
461
Brian Carlstrom221304e2010-04-15 14:22:36 -0700462#ifndef OPENSSL_NO_EC
463 if (s->tlsext_ecpointformatlist != NULL &&
464 s->version != DTLS1_VERSION)
465 {
466 /* Add TLS extension ECPointFormats to the ClientHello message */
467 long lenmax;
468
469 if ((lenmax = limit - ret - 5) < 0) return NULL;
470 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
471 if (s->tlsext_ecpointformatlist_length > 255)
472 {
473 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
474 return NULL;
475 }
476
477 s2n(TLSEXT_TYPE_ec_point_formats,ret);
478 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
479 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
480 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
481 ret+=s->tlsext_ecpointformatlist_length;
482 }
483 if (s->tlsext_ellipticcurvelist != NULL &&
484 s->version != DTLS1_VERSION)
485 {
486 /* Add TLS extension EllipticCurves to the ClientHello message */
487 long lenmax;
488
489 if ((lenmax = limit - ret - 6) < 0) return NULL;
490 if (s->tlsext_ellipticcurvelist_length > (unsigned long)lenmax) return NULL;
491 if (s->tlsext_ellipticcurvelist_length > 65532)
492 {
493 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
494 return NULL;
495 }
496
497 s2n(TLSEXT_TYPE_elliptic_curves,ret);
498 s2n(s->tlsext_ellipticcurvelist_length + 2, ret);
499
500 /* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
501 * elliptic_curve_list, but the examples use two bytes.
502 * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
503 * resolves this to two bytes.
504 */
505 s2n(s->tlsext_ellipticcurvelist_length, ret);
506 memcpy(ret, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length);
507 ret+=s->tlsext_ellipticcurvelist_length;
508 }
509#endif /* OPENSSL_NO_EC */
510
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800511 if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
512 {
513 int ticklen;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800514 if (!s->new_session && s->session && s->session->tlsext_tick)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800515 ticklen = s->session->tlsext_ticklen;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700516 else if (s->session && s->tlsext_session_ticket &&
517 s->tlsext_session_ticket->data)
518 {
519 ticklen = s->tlsext_session_ticket->length;
520 s->session->tlsext_tick = OPENSSL_malloc(ticklen);
521 if (!s->session->tlsext_tick)
522 return NULL;
523 memcpy(s->session->tlsext_tick,
524 s->tlsext_session_ticket->data,
525 ticklen);
526 s->session->tlsext_ticklen = ticklen;
527 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800528 else
529 ticklen = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700530 if (ticklen == 0 && s->tlsext_session_ticket &&
531 s->tlsext_session_ticket->data == NULL)
532 goto skip_ext;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800533 /* Check for enough room 2 for extension type, 2 for len
534 * rest for ticket
535 */
Brian Carlstrom221304e2010-04-15 14:22:36 -0700536 if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800537 s2n(TLSEXT_TYPE_session_ticket,ret);
538 s2n(ticklen,ret);
539 if (ticklen)
540 {
541 memcpy(ret, s->session->tlsext_tick, ticklen);
542 ret += ticklen;
543 }
544 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700545 skip_ext:
546
Brian Carlstromed2ff7a2012-03-28 00:55:55 -0700547 if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700548 {
549 if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
550 return NULL;
551 s2n(TLSEXT_TYPE_signature_algorithms,ret);
552 s2n(sizeof(tls12_sigalgs) + 2, ret);
553 s2n(sizeof(tls12_sigalgs), ret);
554 memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
555 ret += sizeof(tls12_sigalgs);
556 }
557
Brian Carlstrom221304e2010-04-15 14:22:36 -0700558#ifdef TLSEXT_TYPE_opaque_prf_input
559 if (s->s3->client_opaque_prf_input != NULL &&
560 s->version != DTLS1_VERSION)
561 {
562 size_t col = s->s3->client_opaque_prf_input_len;
563
564 if ((long)(limit - ret - 6 - col < 0))
565 return NULL;
566 if (col > 0xFFFD) /* can't happen */
567 return NULL;
568
569 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
570 s2n(col + 2, ret);
571 s2n(col, ret);
572 memcpy(ret, s->s3->client_opaque_prf_input, col);
573 ret += col;
574 }
575#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800576
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800577 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
578 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800579 {
580 int i;
581 long extlen, idlen, itmp;
582 OCSP_RESPID *id;
583
584 idlen = 0;
585 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
586 {
587 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
588 itmp = i2d_OCSP_RESPID(id, NULL);
589 if (itmp <= 0)
590 return NULL;
591 idlen += itmp + 2;
592 }
593
594 if (s->tlsext_ocsp_exts)
595 {
596 extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
597 if (extlen < 0)
598 return NULL;
599 }
600 else
601 extlen = 0;
602
603 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
604 s2n(TLSEXT_TYPE_status_request, ret);
605 if (extlen + idlen > 0xFFF0)
606 return NULL;
607 s2n(extlen + idlen + 5, ret);
608 *(ret++) = TLSEXT_STATUSTYPE_ocsp;
609 s2n(idlen, ret);
610 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
611 {
612 /* save position of id len */
613 unsigned char *q = ret;
614 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
615 /* skip over id len */
616 ret += 2;
617 itmp = i2d_OCSP_RESPID(id, &ret);
618 /* write id len */
619 s2n(itmp, q);
620 }
621 s2n(extlen, ret);
622 if (extlen > 0)
623 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
624 }
625
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700626#ifndef OPENSSL_NO_HEARTBEATS
627 /* Add Heartbeat extension */
628 s2n(TLSEXT_TYPE_heartbeat,ret);
629 s2n(1,ret);
630 /* Set mode:
631 * 1: peer may send requests
632 * 2: peer not allowed to send requests
633 */
634 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
635 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
636 else
637 *(ret++) = SSL_TLSEXT_HB_ENABLED;
638#endif
639
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000640#ifndef OPENSSL_NO_NEXTPROTONEG
641 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
642 {
643 /* The client advertises an emtpy extension to indicate its
644 * support for Next Protocol Negotiation */
645 if (limit - ret - 4 < 0)
646 return NULL;
647 s2n(TLSEXT_TYPE_next_proto_neg,ret);
648 s2n(0,ret);
649 }
650#endif
651
Adam Langley45bcfbc2013-01-16 13:43:53 -0800652 if (s->tlsext_channel_id_enabled)
653 {
654 /* The client advertises an emtpy extension to indicate its
655 * support for Channel ID. */
656 if (limit - ret - 4 < 0)
657 return NULL;
658 s2n(TLSEXT_TYPE_channel_id,ret);
659 s2n(0,ret);
660 }
661
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700662 if(SSL_get_srtp_profiles(s))
663 {
664 int el;
665
666 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
667
668 if((limit - p - 4 - el) < 0) return NULL;
669
670 s2n(TLSEXT_TYPE_use_srtp,ret);
671 s2n(el,ret);
672
673 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
674 {
675 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
676 return NULL;
677 }
678 ret += el;
679 }
680
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800681 if ((extdatalen = ret-p-2)== 0)
682 return p;
683
684 s2n(extdatalen,p);
685 return ret;
686 }
687
688unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
689 {
690 int extdatalen=0;
691 unsigned char *ret = p;
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000692#ifndef OPENSSL_NO_NEXTPROTONEG
693 int next_proto_neg_seen;
694#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800695
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800696 /* don't add extensions for SSLv3, unless doing secure renegotiation */
697 if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
698 return p;
699
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800700 ret+=2;
701 if (ret>=limit) return NULL; /* this really never occurs, but ... */
702
703 if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
704 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700705 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800706
707 s2n(TLSEXT_TYPE_server_name,ret);
708 s2n(0,ret);
709 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800710
711 if(s->s3->send_connection_binding)
712 {
713 int el;
714
715 if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
716 {
717 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
718 return NULL;
719 }
720
721 if((limit - p - 4 - el) < 0) return NULL;
722
723 s2n(TLSEXT_TYPE_renegotiate,ret);
724 s2n(el,ret);
725
726 if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
727 {
728 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
729 return NULL;
730 }
731
732 ret += el;
733 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700734
735#ifndef OPENSSL_NO_EC
736 if (s->tlsext_ecpointformatlist != NULL &&
737 s->version != DTLS1_VERSION)
738 {
739 /* Add TLS extension ECPointFormats to the ServerHello message */
740 long lenmax;
741
742 if ((lenmax = limit - ret - 5) < 0) return NULL;
743 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
744 if (s->tlsext_ecpointformatlist_length > 255)
745 {
746 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
747 return NULL;
748 }
749
750 s2n(TLSEXT_TYPE_ec_point_formats,ret);
751 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
752 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
753 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
754 ret+=s->tlsext_ecpointformatlist_length;
755
756 }
757 /* Currently the server should not respond with a SupportedCurves extension */
758#endif /* OPENSSL_NO_EC */
759
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800760 if (s->tlsext_ticket_expected
761 && !(SSL_get_options(s) & SSL_OP_NO_TICKET))
762 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700763 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800764 s2n(TLSEXT_TYPE_session_ticket,ret);
765 s2n(0,ret);
766 }
767
768 if (s->tlsext_status_expected)
769 {
770 if ((long)(limit - ret - 4) < 0) return NULL;
771 s2n(TLSEXT_TYPE_status_request,ret);
772 s2n(0,ret);
773 }
774
Brian Carlstrom221304e2010-04-15 14:22:36 -0700775#ifdef TLSEXT_TYPE_opaque_prf_input
776 if (s->s3->server_opaque_prf_input != NULL &&
777 s->version != DTLS1_VERSION)
778 {
779 size_t sol = s->s3->server_opaque_prf_input_len;
780
781 if ((long)(limit - ret - 6 - sol) < 0)
782 return NULL;
783 if (sol > 0xFFFD) /* can't happen */
784 return NULL;
785
786 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
787 s2n(sol + 2, ret);
788 s2n(sol, ret);
789 memcpy(ret, s->s3->server_opaque_prf_input, sol);
790 ret += sol;
791 }
792#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700793
794 if(s->srtp_profile)
795 {
796 int el;
797
798 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
799
800 if((limit - p - 4 - el) < 0) return NULL;
801
802 s2n(TLSEXT_TYPE_use_srtp,ret);
803 s2n(el,ret);
804
805 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
806 {
807 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
808 return NULL;
809 }
810 ret+=el;
811 }
812
Brian Carlstrom221304e2010-04-15 14:22:36 -0700813 if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81)
814 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
815 { const unsigned char cryptopro_ext[36] = {
816 0xfd, 0xe8, /*65000*/
817 0x00, 0x20, /*32 bytes length*/
818 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
819 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
820 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
821 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
822 if (limit-ret<36) return NULL;
823 memcpy(ret,cryptopro_ext,36);
824 ret+=36;
825
826 }
827
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700828#ifndef OPENSSL_NO_HEARTBEATS
829 /* Add Heartbeat extension if we've received one */
830 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
831 {
832 s2n(TLSEXT_TYPE_heartbeat,ret);
833 s2n(1,ret);
834 /* Set mode:
835 * 1: peer may send requests
836 * 2: peer not allowed to send requests
837 */
838 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
839 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
840 else
841 *(ret++) = SSL_TLSEXT_HB_ENABLED;
842
843 }
844#endif
845
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000846#ifndef OPENSSL_NO_NEXTPROTONEG
847 next_proto_neg_seen = s->s3->next_proto_neg_seen;
848 s->s3->next_proto_neg_seen = 0;
849 if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
850 {
851 const unsigned char *npa;
852 unsigned int npalen;
853 int r;
854
855 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
856 if (r == SSL_TLSEXT_ERR_OK)
857 {
858 if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
859 s2n(TLSEXT_TYPE_next_proto_neg,ret);
860 s2n(npalen,ret);
861 memcpy(ret, npa, npalen);
862 ret += npalen;
863 s->s3->next_proto_neg_seen = 1;
864 }
865 }
866#endif
867
Adam Langley45bcfbc2013-01-16 13:43:53 -0800868 /* If the client advertised support for Channel ID, and we have it
869 * enabled, then we want to echo it back. */
870 if (s->s3->tlsext_channel_id_valid)
871 {
872 if (limit - ret - 4 < 0)
873 return NULL;
874 s2n(TLSEXT_TYPE_channel_id,ret);
875 s2n(0,ret);
876 }
877
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800878 if ((extdatalen = ret-p-2)== 0)
879 return p;
880
881 s2n(extdatalen,p);
882 return ret;
883 }
884
885int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
886 {
887 unsigned short type;
888 unsigned short size;
889 unsigned short len;
890 unsigned char *data = *p;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800891 int renegotiate_seen = 0;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700892 int sigalg_seen = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800893
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800894 s->servername_done = 0;
895 s->tlsext_status_type = -1;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700896#ifndef OPENSSL_NO_NEXTPROTONEG
897 s->s3->next_proto_neg_seen = 0;
898#endif
899
900#ifndef OPENSSL_NO_HEARTBEATS
901 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
902 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
903#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800904
905 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800906 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800907 n2s(data,len);
908
909 if (data > (d+n-len))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800910 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800911
912 while (data <= (d+n-4))
913 {
914 n2s(data,type);
915 n2s(data,size);
916
917 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800918 goto ri_check;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700919#if 0
920 fprintf(stderr,"Received extension type %d size %d\n",type,size);
921#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800922 if (s->tlsext_debug_cb)
923 s->tlsext_debug_cb(s, 0, type, data, size,
924 s->tlsext_debug_arg);
925/* The servername extension is treated as follows:
926
927 - Only the hostname type is supported with a maximum length of 255.
928 - The servername is rejected if too long or if it contains zeros,
929 in which case an fatal alert is generated.
930 - The servername field is maintained together with the session cache.
931 - When a session is resumed, the servername call back invoked in order
932 to allow the application to position itself to the right context.
933 - The servername is acknowledged if it is new for a session or when
934 it is identical to a previously used for the same session.
935 Applications can control the behaviour. They can at any time
936 set a 'desirable' servername for a new SSL object. This can be the
937 case for example with HTTPS when a Host: header field is received and
938 a renegotiation is requested. In this case, a possible servername
939 presented in the new client hello is only acknowledged if it matches
940 the value of the Host: field.
941 - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
942 if they provide for changing an explicit servername context for the session,
943 i.e. when the session has been established with a servername extension.
944 - On session reconnect, the servername extension may be absent.
945
946*/
947
948 if (type == TLSEXT_TYPE_server_name)
949 {
950 unsigned char *sdata;
951 int servname_type;
952 int dsize;
953
954 if (size < 2)
955 {
956 *al = SSL_AD_DECODE_ERROR;
957 return 0;
958 }
959 n2s(data,dsize);
960 size -= 2;
961 if (dsize > size )
962 {
963 *al = SSL_AD_DECODE_ERROR;
964 return 0;
965 }
966
967 sdata = data;
968 while (dsize > 3)
969 {
970 servname_type = *(sdata++);
971 n2s(sdata,len);
972 dsize -= 3;
973
974 if (len > dsize)
975 {
976 *al = SSL_AD_DECODE_ERROR;
977 return 0;
978 }
979 if (s->servername_done == 0)
980 switch (servname_type)
981 {
982 case TLSEXT_NAMETYPE_host_name:
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800983 if (!s->hit)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800984 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800985 if(s->session->tlsext_hostname)
986 {
987 *al = SSL_AD_DECODE_ERROR;
988 return 0;
989 }
990 if (len > TLSEXT_MAXLEN_host_name)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800991 {
992 *al = TLS1_AD_UNRECOGNIZED_NAME;
993 return 0;
994 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800995 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
996 {
997 *al = TLS1_AD_INTERNAL_ERROR;
998 return 0;
999 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001000 memcpy(s->session->tlsext_hostname, sdata, len);
1001 s->session->tlsext_hostname[len]='\0';
1002 if (strlen(s->session->tlsext_hostname) != len) {
1003 OPENSSL_free(s->session->tlsext_hostname);
1004 s->session->tlsext_hostname = NULL;
1005 *al = TLS1_AD_UNRECOGNIZED_NAME;
1006 return 0;
1007 }
1008 s->servername_done = 1;
1009
1010 }
1011 else
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001012 s->servername_done = s->session->tlsext_hostname
1013 && strlen(s->session->tlsext_hostname) == len
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001014 && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
1015
1016 break;
1017
1018 default:
1019 break;
1020 }
1021
1022 dsize -= len;
1023 }
1024 if (dsize != 0)
1025 {
1026 *al = SSL_AD_DECODE_ERROR;
1027 return 0;
1028 }
1029
1030 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001031#ifndef OPENSSL_NO_SRP
1032 else if (type == TLSEXT_TYPE_srp)
1033 {
1034 if (size <= 0 || ((len = data[0])) != (size -1))
1035 {
1036 *al = SSL_AD_DECODE_ERROR;
1037 return 0;
1038 }
1039 if (s->srp_ctx.login != NULL)
1040 {
1041 *al = SSL_AD_DECODE_ERROR;
1042 return 0;
1043 }
1044 if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
1045 return -1;
1046 memcpy(s->srp_ctx.login, &data[1], len);
1047 s->srp_ctx.login[len]='\0';
1048
1049 if (strlen(s->srp_ctx.login) != len)
1050 {
1051 *al = SSL_AD_DECODE_ERROR;
1052 return 0;
1053 }
1054 }
1055#endif
Brian Carlstrom221304e2010-04-15 14:22:36 -07001056
1057#ifndef OPENSSL_NO_EC
1058 else if (type == TLSEXT_TYPE_ec_point_formats &&
1059 s->version != DTLS1_VERSION)
1060 {
1061 unsigned char *sdata = data;
1062 int ecpointformatlist_length = *(sdata++);
1063
1064 if (ecpointformatlist_length != size - 1)
1065 {
1066 *al = TLS1_AD_DECODE_ERROR;
1067 return 0;
1068 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001069 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001070 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001071 if(s->session->tlsext_ecpointformatlist)
1072 {
Brian Carlstrom976a0342010-12-03 16:11:54 -08001073 OPENSSL_free(s->session->tlsext_ecpointformatlist);
1074 s->session->tlsext_ecpointformatlist = NULL;
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001075 }
1076 s->session->tlsext_ecpointformatlist_length = 0;
1077 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1078 {
1079 *al = TLS1_AD_INTERNAL_ERROR;
1080 return 0;
1081 }
1082 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1083 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001084 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001085#if 0
1086 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
1087 sdata = s->session->tlsext_ecpointformatlist;
1088 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1089 fprintf(stderr,"%i ",*(sdata++));
1090 fprintf(stderr,"\n");
1091#endif
1092 }
1093 else if (type == TLSEXT_TYPE_elliptic_curves &&
1094 s->version != DTLS1_VERSION)
1095 {
1096 unsigned char *sdata = data;
1097 int ellipticcurvelist_length = (*(sdata++) << 8);
1098 ellipticcurvelist_length += (*(sdata++));
1099
1100 if (ellipticcurvelist_length != size - 2)
1101 {
1102 *al = TLS1_AD_DECODE_ERROR;
1103 return 0;
1104 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001105 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001106 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001107 if(s->session->tlsext_ellipticcurvelist)
1108 {
1109 *al = TLS1_AD_DECODE_ERROR;
1110 return 0;
1111 }
1112 s->session->tlsext_ellipticcurvelist_length = 0;
1113 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
1114 {
1115 *al = TLS1_AD_INTERNAL_ERROR;
1116 return 0;
1117 }
1118 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
1119 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001120 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001121#if 0
1122 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
1123 sdata = s->session->tlsext_ellipticcurvelist;
1124 for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
1125 fprintf(stderr,"%i ",*(sdata++));
1126 fprintf(stderr,"\n");
1127#endif
1128 }
1129#endif /* OPENSSL_NO_EC */
1130#ifdef TLSEXT_TYPE_opaque_prf_input
1131 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1132 s->version != DTLS1_VERSION)
1133 {
1134 unsigned char *sdata = data;
1135
1136 if (size < 2)
1137 {
1138 *al = SSL_AD_DECODE_ERROR;
1139 return 0;
1140 }
1141 n2s(sdata, s->s3->client_opaque_prf_input_len);
1142 if (s->s3->client_opaque_prf_input_len != size - 2)
1143 {
1144 *al = SSL_AD_DECODE_ERROR;
1145 return 0;
1146 }
1147
1148 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1149 OPENSSL_free(s->s3->client_opaque_prf_input);
1150 if (s->s3->client_opaque_prf_input_len == 0)
1151 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1152 else
1153 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
1154 if (s->s3->client_opaque_prf_input == NULL)
1155 {
1156 *al = TLS1_AD_INTERNAL_ERROR;
1157 return 0;
1158 }
1159 }
1160#endif
1161 else if (type == TLSEXT_TYPE_session_ticket)
1162 {
1163 if (s->tls_session_ticket_ext_cb &&
1164 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1165 {
1166 *al = TLS1_AD_INTERNAL_ERROR;
1167 return 0;
1168 }
1169 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001170 else if (type == TLSEXT_TYPE_renegotiate)
1171 {
1172 if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1173 return 0;
1174 renegotiate_seen = 1;
1175 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001176 else if (type == TLSEXT_TYPE_signature_algorithms)
1177 {
1178 int dsize;
1179 if (sigalg_seen || size < 2)
1180 {
1181 *al = SSL_AD_DECODE_ERROR;
1182 return 0;
1183 }
1184 sigalg_seen = 1;
1185 n2s(data,dsize);
1186 size -= 2;
1187 if (dsize != size || dsize & 1)
1188 {
1189 *al = SSL_AD_DECODE_ERROR;
1190 return 0;
1191 }
1192 if (!tls1_process_sigalgs(s, data, dsize))
1193 {
1194 *al = SSL_AD_DECODE_ERROR;
1195 return 0;
1196 }
1197 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001198 else if (type == TLSEXT_TYPE_status_request &&
1199 s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001200 {
1201
1202 if (size < 5)
1203 {
1204 *al = SSL_AD_DECODE_ERROR;
1205 return 0;
1206 }
1207
1208 s->tlsext_status_type = *data++;
1209 size--;
1210 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1211 {
1212 const unsigned char *sdata;
1213 int dsize;
1214 /* Read in responder_id_list */
1215 n2s(data,dsize);
1216 size -= 2;
1217 if (dsize > size )
1218 {
1219 *al = SSL_AD_DECODE_ERROR;
1220 return 0;
1221 }
1222 while (dsize > 0)
1223 {
1224 OCSP_RESPID *id;
1225 int idsize;
1226 if (dsize < 4)
1227 {
1228 *al = SSL_AD_DECODE_ERROR;
1229 return 0;
1230 }
1231 n2s(data, idsize);
1232 dsize -= 2 + idsize;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001233 size -= 2 + idsize;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001234 if (dsize < 0)
1235 {
1236 *al = SSL_AD_DECODE_ERROR;
1237 return 0;
1238 }
1239 sdata = data;
1240 data += idsize;
1241 id = d2i_OCSP_RESPID(NULL,
1242 &sdata, idsize);
1243 if (!id)
1244 {
1245 *al = SSL_AD_DECODE_ERROR;
1246 return 0;
1247 }
1248 if (data != sdata)
1249 {
1250 OCSP_RESPID_free(id);
1251 *al = SSL_AD_DECODE_ERROR;
1252 return 0;
1253 }
1254 if (!s->tlsext_ocsp_ids
1255 && !(s->tlsext_ocsp_ids =
1256 sk_OCSP_RESPID_new_null()))
1257 {
1258 OCSP_RESPID_free(id);
1259 *al = SSL_AD_INTERNAL_ERROR;
1260 return 0;
1261 }
1262 if (!sk_OCSP_RESPID_push(
1263 s->tlsext_ocsp_ids, id))
1264 {
1265 OCSP_RESPID_free(id);
1266 *al = SSL_AD_INTERNAL_ERROR;
1267 return 0;
1268 }
1269 }
1270
1271 /* Read in request_extensions */
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001272 if (size < 2)
1273 {
1274 *al = SSL_AD_DECODE_ERROR;
1275 return 0;
1276 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001277 n2s(data,dsize);
1278 size -= 2;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001279 if (dsize != size)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001280 {
1281 *al = SSL_AD_DECODE_ERROR;
1282 return 0;
1283 }
1284 sdata = data;
1285 if (dsize > 0)
1286 {
Brian Carlstrom7b476c42012-01-04 13:22:32 -08001287 if (s->tlsext_ocsp_exts)
1288 {
1289 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1290 X509_EXTENSION_free);
1291 }
1292
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001293 s->tlsext_ocsp_exts =
1294 d2i_X509_EXTENSIONS(NULL,
1295 &sdata, dsize);
1296 if (!s->tlsext_ocsp_exts
1297 || (data + dsize != sdata))
1298 {
1299 *al = SSL_AD_DECODE_ERROR;
1300 return 0;
1301 }
1302 }
1303 }
1304 /* We don't know what to do with any other type
1305 * so ignore it.
1306 */
1307 else
1308 s->tlsext_status_type = -1;
1309 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001310#ifndef OPENSSL_NO_HEARTBEATS
1311 else if (type == TLSEXT_TYPE_heartbeat)
1312 {
1313 switch(data[0])
1314 {
1315 case 0x01: /* Client allows us to send HB requests */
1316 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1317 break;
1318 case 0x02: /* Client doesn't accept HB requests */
1319 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1320 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1321 break;
1322 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1323 return 0;
1324 }
1325 }
1326#endif
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001327#ifndef OPENSSL_NO_NEXTPROTONEG
1328 else if (type == TLSEXT_TYPE_next_proto_neg &&
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001329 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001330 {
1331 /* We shouldn't accept this extension on a
1332 * renegotiation.
1333 *
1334 * s->new_session will be set on renegotiation, but we
1335 * probably shouldn't rely that it couldn't be set on
1336 * the initial renegotation too in certain cases (when
1337 * there's some other reason to disallow resuming an
1338 * earlier session -- the current code won't be doing
1339 * anything like that, but this might change).
1340
1341 * A valid sign that there's been a previous handshake
1342 * in this connection is if s->s3->tmp.finish_md_len >
1343 * 0. (We are talking about a check that will happen
1344 * in the Hello protocol round, well before a new
1345 * Finished message could have been computed.) */
1346 s->s3->next_proto_neg_seen = 1;
1347 }
1348#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001349
Adam Langley45bcfbc2013-01-16 13:43:53 -08001350 else if (type == TLSEXT_TYPE_channel_id && s->tlsext_channel_id_enabled)
1351 s->s3->tlsext_channel_id_valid = 1;
1352
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001353 /* session ticket processed earlier */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001354 else if (type == TLSEXT_TYPE_use_srtp)
1355 {
1356 if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
1357 al))
1358 return 0;
1359 }
1360
Brian Carlstrom221304e2010-04-15 14:22:36 -07001361 data+=size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001362 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001363
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001364 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001365
1366 ri_check:
1367
1368 /* Need RI if renegotiating */
1369
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001370 if (!renegotiate_seen && s->renegotiate &&
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001371 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1372 {
1373 *al = SSL_AD_HANDSHAKE_FAILURE;
1374 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1375 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1376 return 0;
1377 }
1378
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001379 return 1;
1380 }
1381
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001382#ifndef OPENSSL_NO_NEXTPROTONEG
1383/* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1384 * elements of zero length are allowed and the set of elements must exactly fill
1385 * the length of the block. */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001386static char ssl_next_proto_validate(unsigned char *d, unsigned len)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001387 {
1388 unsigned int off = 0;
1389
1390 while (off < len)
1391 {
1392 if (d[off] == 0)
1393 return 0;
1394 off += d[off];
1395 off++;
1396 }
1397
1398 return off == len;
1399 }
1400#endif
1401
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001402int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
1403 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001404 unsigned short length;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001405 unsigned short type;
1406 unsigned short size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001407 unsigned char *data = *p;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001408 int tlsext_servername = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001409 int renegotiate_seen = 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001410
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001411#ifndef OPENSSL_NO_NEXTPROTONEG
1412 s->s3->next_proto_neg_seen = 0;
1413#endif
1414
1415#ifndef OPENSSL_NO_HEARTBEATS
1416 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1417 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1418#endif
1419
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001420 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001421 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001422
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001423 n2s(data,length);
1424 if (data+length != d+n)
1425 {
1426 *al = SSL_AD_DECODE_ERROR;
1427 return 0;
1428 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001429
1430 while(data <= (d+n-4))
1431 {
1432 n2s(data,type);
1433 n2s(data,size);
1434
1435 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001436 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001437
1438 if (s->tlsext_debug_cb)
1439 s->tlsext_debug_cb(s, 1, type, data, size,
1440 s->tlsext_debug_arg);
1441
1442 if (type == TLSEXT_TYPE_server_name)
1443 {
1444 if (s->tlsext_hostname == NULL || size > 0)
1445 {
1446 *al = TLS1_AD_UNRECOGNIZED_NAME;
1447 return 0;
1448 }
1449 tlsext_servername = 1;
1450 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001451
1452#ifndef OPENSSL_NO_EC
1453 else if (type == TLSEXT_TYPE_ec_point_formats &&
1454 s->version != DTLS1_VERSION)
1455 {
1456 unsigned char *sdata = data;
1457 int ecpointformatlist_length = *(sdata++);
1458
1459 if (ecpointformatlist_length != size - 1)
1460 {
1461 *al = TLS1_AD_DECODE_ERROR;
1462 return 0;
1463 }
1464 s->session->tlsext_ecpointformatlist_length = 0;
1465 if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
1466 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1467 {
1468 *al = TLS1_AD_INTERNAL_ERROR;
1469 return 0;
1470 }
1471 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1472 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
1473#if 0
1474 fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1475 sdata = s->session->tlsext_ecpointformatlist;
1476 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1477 fprintf(stderr,"%i ",*(sdata++));
1478 fprintf(stderr,"\n");
1479#endif
1480 }
1481#endif /* OPENSSL_NO_EC */
1482
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001483 else if (type == TLSEXT_TYPE_session_ticket)
1484 {
Brian Carlstrom221304e2010-04-15 14:22:36 -07001485 if (s->tls_session_ticket_ext_cb &&
1486 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1487 {
1488 *al = TLS1_AD_INTERNAL_ERROR;
1489 return 0;
1490 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001491 if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1492 || (size > 0))
1493 {
1494 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1495 return 0;
1496 }
1497 s->tlsext_ticket_expected = 1;
1498 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001499#ifdef TLSEXT_TYPE_opaque_prf_input
1500 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1501 s->version != DTLS1_VERSION)
1502 {
1503 unsigned char *sdata = data;
1504
1505 if (size < 2)
1506 {
1507 *al = SSL_AD_DECODE_ERROR;
1508 return 0;
1509 }
1510 n2s(sdata, s->s3->server_opaque_prf_input_len);
1511 if (s->s3->server_opaque_prf_input_len != size - 2)
1512 {
1513 *al = SSL_AD_DECODE_ERROR;
1514 return 0;
1515 }
1516
1517 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1518 OPENSSL_free(s->s3->server_opaque_prf_input);
1519 if (s->s3->server_opaque_prf_input_len == 0)
1520 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1521 else
1522 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1523
1524 if (s->s3->server_opaque_prf_input == NULL)
1525 {
1526 *al = TLS1_AD_INTERNAL_ERROR;
1527 return 0;
1528 }
1529 }
1530#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001531 else if (type == TLSEXT_TYPE_status_request &&
1532 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001533 {
1534 /* MUST be empty and only sent if we've requested
1535 * a status request message.
1536 */
1537 if ((s->tlsext_status_type == -1) || (size > 0))
1538 {
1539 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1540 return 0;
1541 }
1542 /* Set flag to expect CertificateStatus message */
1543 s->tlsext_status_expected = 1;
1544 }
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001545#ifndef OPENSSL_NO_NEXTPROTONEG
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001546 else if (type == TLSEXT_TYPE_next_proto_neg &&
1547 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001548 {
1549 unsigned char *selected;
1550 unsigned char selected_len;
1551
1552 /* We must have requested it. */
1553 if ((s->ctx->next_proto_select_cb == NULL))
1554 {
1555 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1556 return 0;
1557 }
1558 /* The data must be valid */
1559 if (!ssl_next_proto_validate(data, size))
1560 {
1561 *al = TLS1_AD_DECODE_ERROR;
1562 return 0;
1563 }
1564 if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
1565 {
1566 *al = TLS1_AD_INTERNAL_ERROR;
1567 return 0;
1568 }
1569 s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1570 if (!s->next_proto_negotiated)
1571 {
1572 *al = TLS1_AD_INTERNAL_ERROR;
1573 return 0;
1574 }
1575 memcpy(s->next_proto_negotiated, selected, selected_len);
1576 s->next_proto_negotiated_len = selected_len;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001577 s->s3->next_proto_neg_seen = 1;
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001578 }
1579#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08001580 else if (type == TLSEXT_TYPE_channel_id)
1581 s->s3->tlsext_channel_id_valid = 1;
1582
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001583 else if (type == TLSEXT_TYPE_renegotiate)
1584 {
1585 if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1586 return 0;
1587 renegotiate_seen = 1;
1588 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001589#ifndef OPENSSL_NO_HEARTBEATS
1590 else if (type == TLSEXT_TYPE_heartbeat)
1591 {
1592 switch(data[0])
1593 {
1594 case 0x01: /* Server allows us to send HB requests */
1595 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1596 break;
1597 case 0x02: /* Server doesn't accept HB requests */
1598 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1599 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1600 break;
1601 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1602 return 0;
1603 }
1604 }
1605#endif
1606 else if (type == TLSEXT_TYPE_use_srtp)
1607 {
1608 if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
1609 al))
1610 return 0;
1611 }
1612
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001613 data+=size;
1614 }
1615
1616 if (data != d+n)
1617 {
1618 *al = SSL_AD_DECODE_ERROR;
1619 return 0;
1620 }
1621
1622 if (!s->hit && tlsext_servername == 1)
1623 {
1624 if (s->tlsext_hostname)
1625 {
1626 if (s->session->tlsext_hostname == NULL)
1627 {
1628 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1629 if (!s->session->tlsext_hostname)
1630 {
1631 *al = SSL_AD_UNRECOGNIZED_NAME;
1632 return 0;
1633 }
1634 }
1635 else
1636 {
1637 *al = SSL_AD_DECODE_ERROR;
1638 return 0;
1639 }
1640 }
1641 }
1642
1643 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001644
1645 ri_check:
1646
1647 /* Determine if we need to see RI. Strictly speaking if we want to
1648 * avoid an attack we should *always* see RI even on initial server
1649 * hello because the client doesn't see any renegotiation during an
1650 * attack. However this would mean we could not connect to any server
1651 * which doesn't support RI so for the immediate future tolerate RI
1652 * absence on initial connect only.
1653 */
1654 if (!renegotiate_seen
1655 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1656 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1657 {
1658 *al = SSL_AD_HANDSHAKE_FAILURE;
1659 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1660 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1661 return 0;
1662 }
1663
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001664 return 1;
1665 }
1666
Brian Carlstrom221304e2010-04-15 14:22:36 -07001667
1668int ssl_prepare_clienthello_tlsext(SSL *s)
1669 {
1670#ifndef OPENSSL_NO_EC
1671 /* If we are client and using an elliptic curve cryptography cipher suite, send the point formats
1672 * and elliptic curves we support.
1673 */
1674 int using_ecc = 0;
1675 int i;
1676 unsigned char *j;
1677 unsigned long alg_k, alg_a;
1678 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1679
1680 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1681 {
1682 SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1683
1684 alg_k = c->algorithm_mkey;
1685 alg_a = c->algorithm_auth;
1686 if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe) || (alg_a & SSL_aECDSA)))
1687 {
1688 using_ecc = 1;
1689 break;
1690 }
1691 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001692 using_ecc = using_ecc && (s->version >= TLS1_VERSION);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001693 if (using_ecc)
1694 {
1695 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1696 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1697 {
1698 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1699 return -1;
1700 }
1701 s->tlsext_ecpointformatlist_length = 3;
1702 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1703 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1704 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1705
1706 /* we support all named elliptic curves in draft-ietf-tls-ecc-12 */
1707 if (s->tlsext_ellipticcurvelist != NULL) OPENSSL_free(s->tlsext_ellipticcurvelist);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001708 s->tlsext_ellipticcurvelist_length = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001709 if ((s->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
1710 {
1711 s->tlsext_ellipticcurvelist_length = 0;
1712 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1713 return -1;
1714 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001715 for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1716 sizeof(pref_list)/sizeof(pref_list[0]); i++)
1717 {
1718 int id = tls1_ec_nid2curve_id(pref_list[i]);
1719 s2n(id,j);
1720 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001721 }
1722#endif /* OPENSSL_NO_EC */
1723
1724#ifdef TLSEXT_TYPE_opaque_prf_input
1725 {
1726 int r = 1;
1727
1728 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1729 {
1730 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1731 if (!r)
1732 return -1;
1733 }
1734
1735 if (s->tlsext_opaque_prf_input != NULL)
1736 {
1737 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1738 OPENSSL_free(s->s3->client_opaque_prf_input);
1739
1740 if (s->tlsext_opaque_prf_input_len == 0)
1741 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1742 else
1743 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1744 if (s->s3->client_opaque_prf_input == NULL)
1745 {
1746 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1747 return -1;
1748 }
1749 s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1750 }
1751
1752 if (r == 2)
1753 /* at callback's request, insist on receiving an appropriate server opaque PRF input */
1754 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1755 }
1756#endif
1757
1758 return 1;
1759 }
1760
1761int ssl_prepare_serverhello_tlsext(SSL *s)
1762 {
1763#ifndef OPENSSL_NO_EC
1764 /* If we are server and using an ECC cipher suite, send the point formats we support
1765 * if the client sent us an ECPointsFormat extension. Note that the server is not
1766 * supposed to send an EllipticCurves extension.
1767 */
1768
1769 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1770 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1771 int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
1772 using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1773
1774 if (using_ecc)
1775 {
1776 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1777 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1778 {
1779 SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1780 return -1;
1781 }
1782 s->tlsext_ecpointformatlist_length = 3;
1783 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1784 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1785 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1786 }
1787#endif /* OPENSSL_NO_EC */
1788
1789 return 1;
1790 }
1791
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001792int ssl_check_clienthello_tlsext(SSL *s)
1793 {
1794 int ret=SSL_TLSEXT_ERR_NOACK;
1795 int al = SSL_AD_UNRECOGNIZED_NAME;
1796
Brian Carlstrom221304e2010-04-15 14:22:36 -07001797#ifndef OPENSSL_NO_EC
1798 /* The handling of the ECPointFormats extension is done elsewhere, namely in
1799 * ssl3_choose_cipher in s3_lib.c.
1800 */
1801 /* The handling of the EllipticCurves extension is done elsewhere, namely in
1802 * ssl3_choose_cipher in s3_lib.c.
1803 */
1804#endif
1805
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001806 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1807 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1808 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1809 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1810
1811 /* If status request then ask callback what to do.
1812 * Note: this must be called after servername callbacks in case
1813 * the certificate has changed.
1814 */
Brian Carlstrom221304e2010-04-15 14:22:36 -07001815 if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001816 {
1817 int r;
1818 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1819 switch (r)
1820 {
1821 /* We don't want to send a status request response */
1822 case SSL_TLSEXT_ERR_NOACK:
1823 s->tlsext_status_expected = 0;
1824 break;
1825 /* status request response should be sent */
1826 case SSL_TLSEXT_ERR_OK:
1827 if (s->tlsext_ocsp_resp)
1828 s->tlsext_status_expected = 1;
1829 else
1830 s->tlsext_status_expected = 0;
1831 break;
1832 /* something bad happened */
1833 case SSL_TLSEXT_ERR_ALERT_FATAL:
1834 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1835 al = SSL_AD_INTERNAL_ERROR;
1836 goto err;
1837 }
1838 }
1839 else
1840 s->tlsext_status_expected = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001841
1842#ifdef TLSEXT_TYPE_opaque_prf_input
1843 {
1844 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
1845 * but we might be sending an alert in response to the client hello,
1846 * so this has to happen here in ssl_check_clienthello_tlsext(). */
1847
1848 int r = 1;
1849
1850 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1851 {
1852 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1853 if (!r)
1854 {
1855 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1856 al = SSL_AD_INTERNAL_ERROR;
1857 goto err;
1858 }
1859 }
1860
1861 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1862 OPENSSL_free(s->s3->server_opaque_prf_input);
1863 s->s3->server_opaque_prf_input = NULL;
1864
1865 if (s->tlsext_opaque_prf_input != NULL)
1866 {
1867 if (s->s3->client_opaque_prf_input != NULL &&
1868 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
1869 {
1870 /* can only use this extension if we have a server opaque PRF input
1871 * of the same length as the client opaque PRF input! */
1872
1873 if (s->tlsext_opaque_prf_input_len == 0)
1874 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1875 else
1876 s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1877 if (s->s3->server_opaque_prf_input == NULL)
1878 {
1879 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1880 al = SSL_AD_INTERNAL_ERROR;
1881 goto err;
1882 }
1883 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1884 }
1885 }
1886
1887 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
1888 {
1889 /* The callback wants to enforce use of the extension,
1890 * but we can't do that with the client opaque PRF input;
1891 * abort the handshake.
1892 */
1893 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1894 al = SSL_AD_HANDSHAKE_FAILURE;
1895 }
1896 }
1897
1898#endif
1899 err:
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001900 switch (ret)
1901 {
1902 case SSL_TLSEXT_ERR_ALERT_FATAL:
1903 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1904 return -1;
1905
1906 case SSL_TLSEXT_ERR_ALERT_WARNING:
1907 ssl3_send_alert(s,SSL3_AL_WARNING,al);
1908 return 1;
1909
1910 case SSL_TLSEXT_ERR_NOACK:
1911 s->servername_done=0;
1912 default:
1913 return 1;
1914 }
1915 }
1916
1917int ssl_check_serverhello_tlsext(SSL *s)
1918 {
1919 int ret=SSL_TLSEXT_ERR_NOACK;
1920 int al = SSL_AD_UNRECOGNIZED_NAME;
1921
Brian Carlstrom221304e2010-04-15 14:22:36 -07001922#ifndef OPENSSL_NO_EC
Brian Carlstrom976a0342010-12-03 16:11:54 -08001923 /* If we are client and using an elliptic curve cryptography cipher
1924 * suite, then if server returns an EC point formats lists extension
1925 * it must contain uncompressed.
Brian Carlstrom221304e2010-04-15 14:22:36 -07001926 */
1927 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1928 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1929 if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom976a0342010-12-03 16:11:54 -08001930 (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom221304e2010-04-15 14:22:36 -07001931 ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
1932 {
1933 /* we are using an ECC cipher */
1934 size_t i;
1935 unsigned char *list;
1936 int found_uncompressed = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001937 list = s->session->tlsext_ecpointformatlist;
1938 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1939 {
1940 if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
1941 {
1942 found_uncompressed = 1;
1943 break;
1944 }
1945 }
1946 if (!found_uncompressed)
1947 {
1948 SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
1949 return -1;
1950 }
1951 }
1952 ret = SSL_TLSEXT_ERR_OK;
1953#endif /* OPENSSL_NO_EC */
1954
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001955 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1956 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1957 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1958 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1959
Brian Carlstrom221304e2010-04-15 14:22:36 -07001960#ifdef TLSEXT_TYPE_opaque_prf_input
1961 if (s->s3->server_opaque_prf_input_len > 0)
1962 {
1963 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
1964 * So first verify that we really have a value from the server too. */
1965
1966 if (s->s3->server_opaque_prf_input == NULL)
1967 {
1968 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1969 al = SSL_AD_HANDSHAKE_FAILURE;
1970 }
1971
1972 /* Anytime the server *has* sent an opaque PRF input, we need to check
1973 * that we have a client opaque PRF input of the same size. */
1974 if (s->s3->client_opaque_prf_input == NULL ||
1975 s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
1976 {
1977 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1978 al = SSL_AD_ILLEGAL_PARAMETER;
1979 }
1980 }
1981#endif
1982
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001983 /* If we've requested certificate status and we wont get one
1984 * tell the callback
1985 */
1986 if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001987 && s->ctx && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001988 {
1989 int r;
1990 /* Set resp to NULL, resplen to -1 so callback knows
1991 * there is no response.
1992 */
1993 if (s->tlsext_ocsp_resp)
1994 {
1995 OPENSSL_free(s->tlsext_ocsp_resp);
1996 s->tlsext_ocsp_resp = NULL;
1997 }
1998 s->tlsext_ocsp_resplen = -1;
1999 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2000 if (r == 0)
2001 {
2002 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2003 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2004 }
2005 if (r < 0)
2006 {
2007 al = SSL_AD_INTERNAL_ERROR;
2008 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2009 }
2010 }
2011
2012 switch (ret)
2013 {
2014 case SSL_TLSEXT_ERR_ALERT_FATAL:
2015 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2016 return -1;
2017
2018 case SSL_TLSEXT_ERR_ALERT_WARNING:
2019 ssl3_send_alert(s,SSL3_AL_WARNING,al);
2020 return 1;
2021
2022 case SSL_TLSEXT_ERR_NOACK:
2023 s->servername_done=0;
2024 default:
2025 return 1;
2026 }
2027 }
2028
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002029/* Since the server cache lookup is done early on in the processing of the
2030 * ClientHello, and other operations depend on the result, we need to handle
2031 * any TLS session ticket extension at the same time.
2032 *
2033 * session_id: points at the session ID in the ClientHello. This code will
2034 * read past the end of this in order to parse out the session ticket
2035 * extension, if any.
2036 * len: the length of the session ID.
2037 * limit: a pointer to the first byte after the ClientHello.
2038 * ret: (output) on return, if a ticket was decrypted, then this is set to
2039 * point to the resulting session.
2040 *
2041 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2042 * ciphersuite, in which case we have no use for session tickets and one will
2043 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2044 *
2045 * Returns:
2046 * -1: fatal error, either from parsing or decrypting the ticket.
2047 * 0: no ticket was found (or was ignored, based on settings).
2048 * 1: a zero length extension was found, indicating that the client supports
2049 * session tickets but doesn't currently have one to offer.
2050 * 2: either s->tls_session_secret_cb was set, or a ticket was offered but
2051 * couldn't be decrypted because of a non-fatal error.
2052 * 3: a ticket was successfully decrypted and *ret was set.
2053 *
2054 * Side effects:
2055 * Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2056 * a new session ticket to the client because the client indicated support
2057 * (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2058 * a session ticket or we couldn't use the one it gave us, or if
2059 * s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2060 * Otherwise, s->tlsext_ticket_expected is set to 0.
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002061 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002062int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002063 const unsigned char *limit, SSL_SESSION **ret)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002064 {
2065 /* Point after session ID in client hello */
2066 const unsigned char *p = session_id + len;
2067 unsigned short i;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002068
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002069 *ret = NULL;
2070 s->tlsext_ticket_expected = 0;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002071
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002072 /* If tickets disabled behave as if no ticket present
2073 * to permit stateful resumption.
2074 */
2075 if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2076 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002077 if ((s->version <= SSL3_VERSION) || !limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002078 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002079 if (p >= limit)
2080 return -1;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002081 /* Skip past DTLS cookie */
2082 if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
2083 {
2084 i = *(p++);
2085 p+= i;
2086 if (p >= limit)
2087 return -1;
2088 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002089 /* Skip past cipher list */
2090 n2s(p, i);
2091 p+= i;
2092 if (p >= limit)
2093 return -1;
2094 /* Skip past compression algorithm list */
2095 i = *(p++);
2096 p += i;
2097 if (p > limit)
2098 return -1;
2099 /* Now at start of extensions */
2100 if ((p + 2) >= limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002101 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002102 n2s(p, i);
2103 while ((p + 4) <= limit)
2104 {
2105 unsigned short type, size;
2106 n2s(p, type);
2107 n2s(p, size);
2108 if (p + size > limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002109 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002110 if (type == TLSEXT_TYPE_session_ticket)
2111 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002112 int r;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002113 if (size == 0)
2114 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002115 /* The client will accept a ticket but doesn't
2116 * currently have one. */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002117 s->tlsext_ticket_expected = 1;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002118 return 1;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002119 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07002120 if (s->tls_session_secret_cb)
2121 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002122 /* Indicate that the ticket couldn't be
2123 * decrypted rather than generating the session
2124 * from ticket now, trigger abbreviated
2125 * handshake based on external mechanism to
2126 * calculate the master secret later. */
2127 return 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07002128 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002129 r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2130 switch (r)
2131 {
2132 case 2: /* ticket couldn't be decrypted */
2133 s->tlsext_ticket_expected = 1;
2134 return 2;
2135 case 3: /* ticket was decrypted */
2136 return r;
2137 case 4: /* ticket decrypted but need to renew */
2138 s->tlsext_ticket_expected = 1;
2139 return 3;
2140 default: /* fatal error */
2141 return -1;
2142 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002143 }
2144 p += size;
2145 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002146 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002147 }
2148
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002149/* tls_decrypt_ticket attempts to decrypt a session ticket.
2150 *
2151 * etick: points to the body of the session ticket extension.
2152 * eticklen: the length of the session tickets extenion.
2153 * sess_id: points at the session ID.
2154 * sesslen: the length of the session ID.
2155 * psess: (output) on return, if a ticket was decrypted, then this is set to
2156 * point to the resulting session.
2157 *
2158 * Returns:
2159 * -1: fatal error, either from parsing or decrypting the ticket.
2160 * 2: the ticket couldn't be decrypted.
2161 * 3: a ticket was successfully decrypted and *psess was set.
2162 * 4: same as 3, but the ticket needs to be renewed.
2163 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002164static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2165 const unsigned char *sess_id, int sesslen,
2166 SSL_SESSION **psess)
2167 {
2168 SSL_SESSION *sess;
2169 unsigned char *sdec;
2170 const unsigned char *p;
2171 int slen, mlen, renew_ticket = 0;
2172 unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2173 HMAC_CTX hctx;
2174 EVP_CIPHER_CTX ctx;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002175 SSL_CTX *tctx = s->initial_ctx;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002176 /* Need at least keyname + iv + some encrypted data */
2177 if (eticklen < 48)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002178 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002179 /* Initialize session ticket encryption and HMAC contexts */
2180 HMAC_CTX_init(&hctx);
2181 EVP_CIPHER_CTX_init(&ctx);
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002182 if (tctx->tlsext_ticket_key_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002183 {
2184 unsigned char *nctick = (unsigned char *)etick;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002185 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002186 &ctx, &hctx, 0);
2187 if (rv < 0)
2188 return -1;
2189 if (rv == 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002190 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002191 if (rv == 2)
2192 renew_ticket = 1;
2193 }
2194 else
2195 {
2196 /* Check key name matches */
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002197 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002198 return 2;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002199 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002200 tlsext_tick_md(), NULL);
2201 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002202 tctx->tlsext_tick_aes_key, etick + 16);
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002203 }
2204 /* Attempt to process session ticket, first conduct sanity and
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002205 * integrity checks on ticket.
2206 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002207 mlen = HMAC_size(&hctx);
Brian Carlstrom221304e2010-04-15 14:22:36 -07002208 if (mlen < 0)
2209 {
2210 EVP_CIPHER_CTX_cleanup(&ctx);
2211 return -1;
2212 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002213 eticklen -= mlen;
2214 /* Check HMAC of encrypted ticket */
2215 HMAC_Update(&hctx, etick, eticklen);
2216 HMAC_Final(&hctx, tick_hmac, NULL);
2217 HMAC_CTX_cleanup(&hctx);
Brian Carlstromfa75fdb2013-02-01 23:44:05 -08002218 if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002219 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002220 /* Attempt to decrypt session data */
2221 /* Move p after IV to start of encrypted ticket, update length */
2222 p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2223 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2224 sdec = OPENSSL_malloc(eticklen);
2225 if (!sdec)
2226 {
2227 EVP_CIPHER_CTX_cleanup(&ctx);
2228 return -1;
2229 }
2230 EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2231 if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002232 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002233 slen += mlen;
2234 EVP_CIPHER_CTX_cleanup(&ctx);
2235 p = sdec;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002236
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002237 sess = d2i_SSL_SESSION(NULL, &p, slen);
2238 OPENSSL_free(sdec);
2239 if (sess)
2240 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002241 /* The session ID, if non-empty, is used by some clients to
2242 * detect that the ticket has been accepted. So we copy it to
2243 * the session structure. If it is empty set length to zero
2244 * as required by standard.
2245 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002246 if (sesslen)
2247 memcpy(sess->session_id, sess_id, sesslen);
2248 sess->session_id_length = sesslen;
2249 *psess = sess;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002250 if (renew_ticket)
2251 return 4;
2252 else
2253 return 3;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002254 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002255 ERR_clear_error();
2256 /* For session parse failure, indicate that we need to send a new
2257 * ticket. */
2258 return 2;
2259 }
2260
2261/* Tables to translate from NIDs to TLS v1.2 ids */
2262
2263typedef struct
2264 {
2265 int nid;
2266 int id;
2267 } tls12_lookup;
2268
2269static tls12_lookup tls12_md[] = {
2270#ifndef OPENSSL_NO_MD5
2271 {NID_md5, TLSEXT_hash_md5},
2272#endif
2273#ifndef OPENSSL_NO_SHA
2274 {NID_sha1, TLSEXT_hash_sha1},
2275#endif
2276#ifndef OPENSSL_NO_SHA256
2277 {NID_sha224, TLSEXT_hash_sha224},
2278 {NID_sha256, TLSEXT_hash_sha256},
2279#endif
2280#ifndef OPENSSL_NO_SHA512
2281 {NID_sha384, TLSEXT_hash_sha384},
2282 {NID_sha512, TLSEXT_hash_sha512}
2283#endif
2284};
2285
2286static tls12_lookup tls12_sig[] = {
2287#ifndef OPENSSL_NO_RSA
2288 {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2289#endif
2290#ifndef OPENSSL_NO_DSA
2291 {EVP_PKEY_DSA, TLSEXT_signature_dsa},
2292#endif
2293#ifndef OPENSSL_NO_ECDSA
2294 {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2295#endif
2296};
2297
2298static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2299 {
2300 size_t i;
2301 for (i = 0; i < tlen; i++)
2302 {
2303 if (table[i].nid == nid)
2304 return table[i].id;
2305 }
2306 return -1;
2307 }
2308#if 0
2309static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
2310 {
2311 size_t i;
2312 for (i = 0; i < tlen; i++)
2313 {
2314 if (table[i].id == id)
2315 return table[i].nid;
2316 }
2317 return -1;
2318 }
2319#endif
2320
2321int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
2322 {
2323 int sig_id, md_id;
2324 if (!md)
2325 return 0;
2326 md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2327 sizeof(tls12_md)/sizeof(tls12_lookup));
2328 if (md_id == -1)
2329 return 0;
2330 sig_id = tls12_get_sigid(pk);
2331 if (sig_id == -1)
2332 return 0;
2333 p[0] = (unsigned char)md_id;
2334 p[1] = (unsigned char)sig_id;
2335 return 1;
2336 }
2337
2338int tls12_get_sigid(const EVP_PKEY *pk)
2339 {
2340 return tls12_find_id(pk->type, tls12_sig,
2341 sizeof(tls12_sig)/sizeof(tls12_lookup));
2342 }
2343
2344const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2345 {
2346 switch(hash_alg)
2347 {
2348#ifndef OPENSSL_NO_MD5
2349 case TLSEXT_hash_md5:
2350#ifdef OPENSSL_FIPS
2351 if (FIPS_mode())
2352 return NULL;
2353#endif
2354 return EVP_md5();
2355#endif
2356#ifndef OPENSSL_NO_SHA
2357 case TLSEXT_hash_sha1:
2358 return EVP_sha1();
2359#endif
2360#ifndef OPENSSL_NO_SHA256
2361 case TLSEXT_hash_sha224:
2362 return EVP_sha224();
2363
2364 case TLSEXT_hash_sha256:
2365 return EVP_sha256();
2366#endif
2367#ifndef OPENSSL_NO_SHA512
2368 case TLSEXT_hash_sha384:
2369 return EVP_sha384();
2370
2371 case TLSEXT_hash_sha512:
2372 return EVP_sha512();
2373#endif
2374 default:
2375 return NULL;
2376
2377 }
2378 }
2379
2380/* Set preferred digest for each key type */
2381
2382int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2383 {
2384 int i, idx;
2385 const EVP_MD *md;
2386 CERT *c = s->cert;
2387 /* Extension ignored for TLS versions below 1.2 */
2388 if (TLS1_get_version(s) < TLS1_2_VERSION)
2389 return 1;
2390 /* Should never happen */
2391 if (!c)
2392 return 0;
2393
2394 c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
2395 c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
2396 c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
2397 c->pkeys[SSL_PKEY_ECC].digest = NULL;
2398
2399 for (i = 0; i < dsize; i += 2)
2400 {
2401 unsigned char hash_alg = data[i], sig_alg = data[i+1];
2402
2403 switch(sig_alg)
2404 {
2405#ifndef OPENSSL_NO_RSA
2406 case TLSEXT_signature_rsa:
2407 idx = SSL_PKEY_RSA_SIGN;
2408 break;
2409#endif
2410#ifndef OPENSSL_NO_DSA
2411 case TLSEXT_signature_dsa:
2412 idx = SSL_PKEY_DSA_SIGN;
2413 break;
2414#endif
2415#ifndef OPENSSL_NO_ECDSA
2416 case TLSEXT_signature_ecdsa:
2417 idx = SSL_PKEY_ECC;
2418 break;
2419#endif
2420 default:
2421 continue;
2422 }
2423
2424 if (c->pkeys[idx].digest == NULL)
2425 {
2426 md = tls12_get_hash(hash_alg);
2427 if (md)
2428 {
2429 c->pkeys[idx].digest = md;
2430 if (idx == SSL_PKEY_RSA_SIGN)
2431 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
2432 }
2433 }
2434
2435 }
2436
2437
2438 /* Set any remaining keys to default values. NOTE: if alg is not
2439 * supported it stays as NULL.
2440 */
2441#ifndef OPENSSL_NO_DSA
2442 if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
2443 c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_dss1();
2444#endif
2445#ifndef OPENSSL_NO_RSA
2446 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
2447 {
2448 c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
2449 c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
2450 }
2451#endif
2452#ifndef OPENSSL_NO_ECDSA
2453 if (!c->pkeys[SSL_PKEY_ECC].digest)
2454 c->pkeys[SSL_PKEY_ECC].digest = EVP_ecdsa();
2455#endif
2456 return 1;
2457 }
2458
2459#endif
2460
2461#ifndef OPENSSL_NO_HEARTBEATS
2462int
2463tls1_process_heartbeat(SSL *s)
2464 {
2465 unsigned char *p = &s->s3->rrec.data[0], *pl;
2466 unsigned short hbtype;
2467 unsigned int payload;
2468 unsigned int padding = 16; /* Use minimum padding */
2469
2470 /* Read type and payload length first */
2471 hbtype = *p++;
2472 n2s(p, payload);
2473 pl = p;
2474
2475 if (s->msg_callback)
2476 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2477 &s->s3->rrec.data[0], s->s3->rrec.length,
2478 s, s->msg_callback_arg);
2479
2480 if (hbtype == TLS1_HB_REQUEST)
2481 {
2482 unsigned char *buffer, *bp;
2483 int r;
2484
2485 /* Allocate memory for the response, size is 1 bytes
2486 * message type, plus 2 bytes payload length, plus
2487 * payload, plus padding
2488 */
2489 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2490 bp = buffer;
2491
2492 /* Enter response type, length and copy payload */
2493 *bp++ = TLS1_HB_RESPONSE;
2494 s2n(payload, bp);
2495 memcpy(bp, pl, payload);
2496 bp += payload;
2497 /* Random padding */
2498 RAND_pseudo_bytes(bp, padding);
2499
2500 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
2501
2502 if (r >= 0 && s->msg_callback)
2503 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2504 buffer, 3 + payload + padding,
2505 s, s->msg_callback_arg);
2506
2507 OPENSSL_free(buffer);
2508
2509 if (r < 0)
2510 return r;
2511 }
2512 else if (hbtype == TLS1_HB_RESPONSE)
2513 {
2514 unsigned int seq;
2515
2516 /* We only send sequence numbers (2 bytes unsigned int),
2517 * and 16 random bytes, so we just try to read the
2518 * sequence number */
2519 n2s(pl, seq);
2520
2521 if (payload == 18 && seq == s->tlsext_hb_seq)
2522 {
2523 s->tlsext_hb_seq++;
2524 s->tlsext_hb_pending = 0;
2525 }
2526 }
2527
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002528 return 0;
2529 }
2530
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002531int
2532tls1_heartbeat(SSL *s)
2533 {
2534 unsigned char *buf, *p;
2535 int ret;
2536 unsigned int payload = 18; /* Sequence number + random bytes */
2537 unsigned int padding = 16; /* Use minimum padding */
2538
2539 /* Only send if peer supports and accepts HB requests... */
2540 if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2541 s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
2542 {
2543 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2544 return -1;
2545 }
2546
2547 /* ...and there is none in flight yet... */
2548 if (s->tlsext_hb_pending)
2549 {
2550 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
2551 return -1;
2552 }
2553
2554 /* ...and no handshake in progress. */
2555 if (SSL_in_init(s) || s->in_handshake)
2556 {
2557 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
2558 return -1;
2559 }
2560
2561 /* Check if padding is too long, payload and padding
2562 * must not exceed 2^14 - 3 = 16381 bytes in total.
2563 */
2564 OPENSSL_assert(payload + padding <= 16381);
2565
2566 /* Create HeartBeat message, we just use a sequence number
2567 * as payload to distuingish different messages and add
2568 * some random stuff.
2569 * - Message Type, 1 byte
2570 * - Payload Length, 2 bytes (unsigned int)
2571 * - Payload, the sequence number (2 bytes uint)
2572 * - Payload, random bytes (16 bytes uint)
2573 * - Padding
2574 */
2575 buf = OPENSSL_malloc(1 + 2 + payload + padding);
2576 p = buf;
2577 /* Message Type */
2578 *p++ = TLS1_HB_REQUEST;
2579 /* Payload length (18 bytes here) */
2580 s2n(payload, p);
2581 /* Sequence number */
2582 s2n(s->tlsext_hb_seq, p);
2583 /* 16 random bytes */
2584 RAND_pseudo_bytes(p, 16);
2585 p += 16;
2586 /* Random padding */
2587 RAND_pseudo_bytes(p, padding);
2588
2589 ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2590 if (ret >= 0)
2591 {
2592 if (s->msg_callback)
2593 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2594 buf, 3 + payload + padding,
2595 s, s->msg_callback_arg);
2596
2597 s->tlsext_hb_pending = 1;
2598 }
2599
2600 OPENSSL_free(buf);
2601
2602 return ret;
2603 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002604#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08002605
2606#if !defined(OPENSSL_NO_TLSEXT)
2607/* tls1_channel_id_hash calculates the signed data for a Channel ID on the given
2608 * SSL connection and writes it to |md|.
2609 */
2610int
2611tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s)
2612 {
2613 EVP_MD_CTX ctx;
2614 unsigned char temp_digest[EVP_MAX_MD_SIZE];
2615 unsigned temp_digest_len;
2616 int i;
2617 static const char kClientIDMagic[] = "TLS Channel ID signature";
2618
2619 if (s->s3->handshake_buffer)
2620 if (!ssl3_digest_cached_records(s))
2621 return 0;
2622
2623 EVP_DigestUpdate(md, kClientIDMagic, sizeof(kClientIDMagic));
2624
2625 EVP_MD_CTX_init(&ctx);
2626 for (i = 0; i < SSL_MAX_DIGEST; i++)
2627 {
2628 if (s->s3->handshake_dgst[i] == NULL)
2629 continue;
2630 EVP_MD_CTX_copy_ex(&ctx, s->s3->handshake_dgst[i]);
2631 EVP_DigestFinal_ex(&ctx, temp_digest, &temp_digest_len);
2632 EVP_DigestUpdate(md, temp_digest, temp_digest_len);
2633 }
2634 EVP_MD_CTX_cleanup(&ctx);
2635
2636 return 1;
2637 }
2638#endif