blob: 53b805f25d9aa02e4bf525927ba957dcf87bc804 [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 Carlstromeefface2013-02-11 09:54:43 -0800662#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700663 if(SSL_get_srtp_profiles(s))
664 {
665 int el;
666
667 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
668
669 if((limit - p - 4 - el) < 0) return NULL;
670
671 s2n(TLSEXT_TYPE_use_srtp,ret);
672 s2n(el,ret);
673
674 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
675 {
676 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
677 return NULL;
678 }
679 ret += el;
680 }
Brian Carlstromeefface2013-02-11 09:54:43 -0800681#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700682
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800683 if ((extdatalen = ret-p-2)== 0)
684 return p;
685
686 s2n(extdatalen,p);
687 return ret;
688 }
689
690unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
691 {
692 int extdatalen=0;
693 unsigned char *ret = p;
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000694#ifndef OPENSSL_NO_NEXTPROTONEG
695 int next_proto_neg_seen;
696#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800697
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800698 /* don't add extensions for SSLv3, unless doing secure renegotiation */
699 if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
700 return p;
701
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800702 ret+=2;
703 if (ret>=limit) return NULL; /* this really never occurs, but ... */
704
705 if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
706 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700707 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800708
709 s2n(TLSEXT_TYPE_server_name,ret);
710 s2n(0,ret);
711 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800712
713 if(s->s3->send_connection_binding)
714 {
715 int el;
716
717 if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
718 {
719 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
720 return NULL;
721 }
722
723 if((limit - p - 4 - el) < 0) return NULL;
724
725 s2n(TLSEXT_TYPE_renegotiate,ret);
726 s2n(el,ret);
727
728 if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
729 {
730 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
731 return NULL;
732 }
733
734 ret += el;
735 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700736
737#ifndef OPENSSL_NO_EC
738 if (s->tlsext_ecpointformatlist != NULL &&
739 s->version != DTLS1_VERSION)
740 {
741 /* Add TLS extension ECPointFormats to the ServerHello message */
742 long lenmax;
743
744 if ((lenmax = limit - ret - 5) < 0) return NULL;
745 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
746 if (s->tlsext_ecpointformatlist_length > 255)
747 {
748 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
749 return NULL;
750 }
751
752 s2n(TLSEXT_TYPE_ec_point_formats,ret);
753 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
754 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
755 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
756 ret+=s->tlsext_ecpointformatlist_length;
757
758 }
759 /* Currently the server should not respond with a SupportedCurves extension */
760#endif /* OPENSSL_NO_EC */
761
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800762 if (s->tlsext_ticket_expected
763 && !(SSL_get_options(s) & SSL_OP_NO_TICKET))
764 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700765 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800766 s2n(TLSEXT_TYPE_session_ticket,ret);
767 s2n(0,ret);
768 }
769
770 if (s->tlsext_status_expected)
771 {
772 if ((long)(limit - ret - 4) < 0) return NULL;
773 s2n(TLSEXT_TYPE_status_request,ret);
774 s2n(0,ret);
775 }
776
Brian Carlstrom221304e2010-04-15 14:22:36 -0700777#ifdef TLSEXT_TYPE_opaque_prf_input
778 if (s->s3->server_opaque_prf_input != NULL &&
779 s->version != DTLS1_VERSION)
780 {
781 size_t sol = s->s3->server_opaque_prf_input_len;
782
783 if ((long)(limit - ret - 6 - sol) < 0)
784 return NULL;
785 if (sol > 0xFFFD) /* can't happen */
786 return NULL;
787
788 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
789 s2n(sol + 2, ret);
790 s2n(sol, ret);
791 memcpy(ret, s->s3->server_opaque_prf_input, sol);
792 ret += sol;
793 }
794#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700795
Brian Carlstromeefface2013-02-11 09:54:43 -0800796#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700797 if(s->srtp_profile)
798 {
799 int el;
800
801 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
802
803 if((limit - p - 4 - el) < 0) return NULL;
804
805 s2n(TLSEXT_TYPE_use_srtp,ret);
806 s2n(el,ret);
807
808 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
809 {
810 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
811 return NULL;
812 }
813 ret+=el;
814 }
Brian Carlstromeefface2013-02-11 09:54:43 -0800815#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700816
Brian Carlstrom221304e2010-04-15 14:22:36 -0700817 if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81)
818 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
819 { const unsigned char cryptopro_ext[36] = {
820 0xfd, 0xe8, /*65000*/
821 0x00, 0x20, /*32 bytes length*/
822 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
823 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
824 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
825 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
826 if (limit-ret<36) return NULL;
827 memcpy(ret,cryptopro_ext,36);
828 ret+=36;
829
830 }
831
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700832#ifndef OPENSSL_NO_HEARTBEATS
833 /* Add Heartbeat extension if we've received one */
834 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
835 {
836 s2n(TLSEXT_TYPE_heartbeat,ret);
837 s2n(1,ret);
838 /* Set mode:
839 * 1: peer may send requests
840 * 2: peer not allowed to send requests
841 */
842 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
843 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
844 else
845 *(ret++) = SSL_TLSEXT_HB_ENABLED;
846
847 }
848#endif
849
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000850#ifndef OPENSSL_NO_NEXTPROTONEG
851 next_proto_neg_seen = s->s3->next_proto_neg_seen;
852 s->s3->next_proto_neg_seen = 0;
853 if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
854 {
855 const unsigned char *npa;
856 unsigned int npalen;
857 int r;
858
859 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
860 if (r == SSL_TLSEXT_ERR_OK)
861 {
862 if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
863 s2n(TLSEXT_TYPE_next_proto_neg,ret);
864 s2n(npalen,ret);
865 memcpy(ret, npa, npalen);
866 ret += npalen;
867 s->s3->next_proto_neg_seen = 1;
868 }
869 }
870#endif
871
Adam Langley45bcfbc2013-01-16 13:43:53 -0800872 /* If the client advertised support for Channel ID, and we have it
873 * enabled, then we want to echo it back. */
874 if (s->s3->tlsext_channel_id_valid)
875 {
876 if (limit - ret - 4 < 0)
877 return NULL;
878 s2n(TLSEXT_TYPE_channel_id,ret);
879 s2n(0,ret);
880 }
881
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800882 if ((extdatalen = ret-p-2)== 0)
883 return p;
884
885 s2n(extdatalen,p);
886 return ret;
887 }
888
889int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
890 {
891 unsigned short type;
892 unsigned short size;
893 unsigned short len;
894 unsigned char *data = *p;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800895 int renegotiate_seen = 0;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700896 int sigalg_seen = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800897
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800898 s->servername_done = 0;
899 s->tlsext_status_type = -1;
Kenny Root9296b4b2013-06-24 12:03:19 -0700900
901 /* Reset TLS 1.2 digest functions to defaults because they don't carry
902 * over to a renegotiation. */
903 s->s3->digest_rsa = NULL;
904 s->s3->digest_dsa = NULL;
905 s->s3->digest_ecdsa = NULL;
906
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700907#ifndef OPENSSL_NO_NEXTPROTONEG
908 s->s3->next_proto_neg_seen = 0;
909#endif
910
911#ifndef OPENSSL_NO_HEARTBEATS
912 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
913 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
914#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800915
916 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800917 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800918 n2s(data,len);
919
920 if (data > (d+n-len))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800921 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800922
923 while (data <= (d+n-4))
924 {
925 n2s(data,type);
926 n2s(data,size);
927
928 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800929 goto ri_check;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700930#if 0
931 fprintf(stderr,"Received extension type %d size %d\n",type,size);
932#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800933 if (s->tlsext_debug_cb)
934 s->tlsext_debug_cb(s, 0, type, data, size,
935 s->tlsext_debug_arg);
936/* The servername extension is treated as follows:
937
938 - Only the hostname type is supported with a maximum length of 255.
939 - The servername is rejected if too long or if it contains zeros,
940 in which case an fatal alert is generated.
941 - The servername field is maintained together with the session cache.
942 - When a session is resumed, the servername call back invoked in order
943 to allow the application to position itself to the right context.
944 - The servername is acknowledged if it is new for a session or when
945 it is identical to a previously used for the same session.
946 Applications can control the behaviour. They can at any time
947 set a 'desirable' servername for a new SSL object. This can be the
948 case for example with HTTPS when a Host: header field is received and
949 a renegotiation is requested. In this case, a possible servername
950 presented in the new client hello is only acknowledged if it matches
951 the value of the Host: field.
952 - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
953 if they provide for changing an explicit servername context for the session,
954 i.e. when the session has been established with a servername extension.
955 - On session reconnect, the servername extension may be absent.
956
957*/
958
959 if (type == TLSEXT_TYPE_server_name)
960 {
961 unsigned char *sdata;
962 int servname_type;
963 int dsize;
964
965 if (size < 2)
966 {
967 *al = SSL_AD_DECODE_ERROR;
968 return 0;
969 }
970 n2s(data,dsize);
971 size -= 2;
972 if (dsize > size )
973 {
974 *al = SSL_AD_DECODE_ERROR;
975 return 0;
976 }
977
978 sdata = data;
979 while (dsize > 3)
980 {
981 servname_type = *(sdata++);
982 n2s(sdata,len);
983 dsize -= 3;
984
985 if (len > dsize)
986 {
987 *al = SSL_AD_DECODE_ERROR;
988 return 0;
989 }
990 if (s->servername_done == 0)
991 switch (servname_type)
992 {
993 case TLSEXT_NAMETYPE_host_name:
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800994 if (!s->hit)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800995 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800996 if(s->session->tlsext_hostname)
997 {
998 *al = SSL_AD_DECODE_ERROR;
999 return 0;
1000 }
1001 if (len > TLSEXT_MAXLEN_host_name)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001002 {
1003 *al = TLS1_AD_UNRECOGNIZED_NAME;
1004 return 0;
1005 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001006 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
1007 {
1008 *al = TLS1_AD_INTERNAL_ERROR;
1009 return 0;
1010 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001011 memcpy(s->session->tlsext_hostname, sdata, len);
1012 s->session->tlsext_hostname[len]='\0';
1013 if (strlen(s->session->tlsext_hostname) != len) {
1014 OPENSSL_free(s->session->tlsext_hostname);
1015 s->session->tlsext_hostname = NULL;
1016 *al = TLS1_AD_UNRECOGNIZED_NAME;
1017 return 0;
1018 }
1019 s->servername_done = 1;
1020
1021 }
1022 else
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001023 s->servername_done = s->session->tlsext_hostname
1024 && strlen(s->session->tlsext_hostname) == len
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001025 && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
1026
1027 break;
1028
1029 default:
1030 break;
1031 }
1032
1033 dsize -= len;
1034 }
1035 if (dsize != 0)
1036 {
1037 *al = SSL_AD_DECODE_ERROR;
1038 return 0;
1039 }
1040
1041 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001042#ifndef OPENSSL_NO_SRP
1043 else if (type == TLSEXT_TYPE_srp)
1044 {
1045 if (size <= 0 || ((len = data[0])) != (size -1))
1046 {
1047 *al = SSL_AD_DECODE_ERROR;
1048 return 0;
1049 }
1050 if (s->srp_ctx.login != NULL)
1051 {
1052 *al = SSL_AD_DECODE_ERROR;
1053 return 0;
1054 }
1055 if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
1056 return -1;
1057 memcpy(s->srp_ctx.login, &data[1], len);
1058 s->srp_ctx.login[len]='\0';
1059
1060 if (strlen(s->srp_ctx.login) != len)
1061 {
1062 *al = SSL_AD_DECODE_ERROR;
1063 return 0;
1064 }
1065 }
1066#endif
Brian Carlstrom221304e2010-04-15 14:22:36 -07001067
1068#ifndef OPENSSL_NO_EC
1069 else if (type == TLSEXT_TYPE_ec_point_formats &&
1070 s->version != DTLS1_VERSION)
1071 {
1072 unsigned char *sdata = data;
1073 int ecpointformatlist_length = *(sdata++);
1074
1075 if (ecpointformatlist_length != size - 1)
1076 {
1077 *al = TLS1_AD_DECODE_ERROR;
1078 return 0;
1079 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001080 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001081 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001082 if(s->session->tlsext_ecpointformatlist)
1083 {
Brian Carlstrom976a0342010-12-03 16:11:54 -08001084 OPENSSL_free(s->session->tlsext_ecpointformatlist);
1085 s->session->tlsext_ecpointformatlist = NULL;
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001086 }
1087 s->session->tlsext_ecpointformatlist_length = 0;
1088 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1089 {
1090 *al = TLS1_AD_INTERNAL_ERROR;
1091 return 0;
1092 }
1093 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1094 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001095 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001096#if 0
1097 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
1098 sdata = s->session->tlsext_ecpointformatlist;
1099 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1100 fprintf(stderr,"%i ",*(sdata++));
1101 fprintf(stderr,"\n");
1102#endif
1103 }
1104 else if (type == TLSEXT_TYPE_elliptic_curves &&
1105 s->version != DTLS1_VERSION)
1106 {
1107 unsigned char *sdata = data;
1108 int ellipticcurvelist_length = (*(sdata++) << 8);
1109 ellipticcurvelist_length += (*(sdata++));
1110
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001111 if (ellipticcurvelist_length != size - 2 ||
1112 ellipticcurvelist_length < 1)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001113 {
1114 *al = TLS1_AD_DECODE_ERROR;
1115 return 0;
1116 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001117 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001118 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001119 if(s->session->tlsext_ellipticcurvelist)
1120 {
1121 *al = TLS1_AD_DECODE_ERROR;
1122 return 0;
1123 }
1124 s->session->tlsext_ellipticcurvelist_length = 0;
1125 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
1126 {
1127 *al = TLS1_AD_INTERNAL_ERROR;
1128 return 0;
1129 }
1130 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
1131 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001132 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001133#if 0
1134 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
1135 sdata = s->session->tlsext_ellipticcurvelist;
1136 for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
1137 fprintf(stderr,"%i ",*(sdata++));
1138 fprintf(stderr,"\n");
1139#endif
1140 }
1141#endif /* OPENSSL_NO_EC */
1142#ifdef TLSEXT_TYPE_opaque_prf_input
1143 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1144 s->version != DTLS1_VERSION)
1145 {
1146 unsigned char *sdata = data;
1147
1148 if (size < 2)
1149 {
1150 *al = SSL_AD_DECODE_ERROR;
1151 return 0;
1152 }
1153 n2s(sdata, s->s3->client_opaque_prf_input_len);
1154 if (s->s3->client_opaque_prf_input_len != size - 2)
1155 {
1156 *al = SSL_AD_DECODE_ERROR;
1157 return 0;
1158 }
1159
1160 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1161 OPENSSL_free(s->s3->client_opaque_prf_input);
1162 if (s->s3->client_opaque_prf_input_len == 0)
1163 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1164 else
1165 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
1166 if (s->s3->client_opaque_prf_input == NULL)
1167 {
1168 *al = TLS1_AD_INTERNAL_ERROR;
1169 return 0;
1170 }
1171 }
1172#endif
1173 else if (type == TLSEXT_TYPE_session_ticket)
1174 {
1175 if (s->tls_session_ticket_ext_cb &&
1176 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1177 {
1178 *al = TLS1_AD_INTERNAL_ERROR;
1179 return 0;
1180 }
1181 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001182 else if (type == TLSEXT_TYPE_renegotiate)
1183 {
1184 if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1185 return 0;
1186 renegotiate_seen = 1;
1187 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001188 else if (type == TLSEXT_TYPE_signature_algorithms)
1189 {
1190 int dsize;
1191 if (sigalg_seen || size < 2)
1192 {
1193 *al = SSL_AD_DECODE_ERROR;
1194 return 0;
1195 }
1196 sigalg_seen = 1;
1197 n2s(data,dsize);
1198 size -= 2;
1199 if (dsize != size || dsize & 1)
1200 {
1201 *al = SSL_AD_DECODE_ERROR;
1202 return 0;
1203 }
Kenny Root9296b4b2013-06-24 12:03:19 -07001204 tls1_process_sigalgs(s, data, dsize);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001205 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001206 else if (type == TLSEXT_TYPE_status_request &&
1207 s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001208 {
1209
1210 if (size < 5)
1211 {
1212 *al = SSL_AD_DECODE_ERROR;
1213 return 0;
1214 }
1215
1216 s->tlsext_status_type = *data++;
1217 size--;
1218 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1219 {
1220 const unsigned char *sdata;
1221 int dsize;
1222 /* Read in responder_id_list */
1223 n2s(data,dsize);
1224 size -= 2;
1225 if (dsize > size )
1226 {
1227 *al = SSL_AD_DECODE_ERROR;
1228 return 0;
1229 }
1230 while (dsize > 0)
1231 {
1232 OCSP_RESPID *id;
1233 int idsize;
1234 if (dsize < 4)
1235 {
1236 *al = SSL_AD_DECODE_ERROR;
1237 return 0;
1238 }
1239 n2s(data, idsize);
1240 dsize -= 2 + idsize;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001241 size -= 2 + idsize;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001242 if (dsize < 0)
1243 {
1244 *al = SSL_AD_DECODE_ERROR;
1245 return 0;
1246 }
1247 sdata = data;
1248 data += idsize;
1249 id = d2i_OCSP_RESPID(NULL,
1250 &sdata, idsize);
1251 if (!id)
1252 {
1253 *al = SSL_AD_DECODE_ERROR;
1254 return 0;
1255 }
1256 if (data != sdata)
1257 {
1258 OCSP_RESPID_free(id);
1259 *al = SSL_AD_DECODE_ERROR;
1260 return 0;
1261 }
1262 if (!s->tlsext_ocsp_ids
1263 && !(s->tlsext_ocsp_ids =
1264 sk_OCSP_RESPID_new_null()))
1265 {
1266 OCSP_RESPID_free(id);
1267 *al = SSL_AD_INTERNAL_ERROR;
1268 return 0;
1269 }
1270 if (!sk_OCSP_RESPID_push(
1271 s->tlsext_ocsp_ids, id))
1272 {
1273 OCSP_RESPID_free(id);
1274 *al = SSL_AD_INTERNAL_ERROR;
1275 return 0;
1276 }
1277 }
1278
1279 /* Read in request_extensions */
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001280 if (size < 2)
1281 {
1282 *al = SSL_AD_DECODE_ERROR;
1283 return 0;
1284 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001285 n2s(data,dsize);
1286 size -= 2;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001287 if (dsize != size)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001288 {
1289 *al = SSL_AD_DECODE_ERROR;
1290 return 0;
1291 }
1292 sdata = data;
1293 if (dsize > 0)
1294 {
Brian Carlstrom7b476c42012-01-04 13:22:32 -08001295 if (s->tlsext_ocsp_exts)
1296 {
1297 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1298 X509_EXTENSION_free);
1299 }
1300
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001301 s->tlsext_ocsp_exts =
1302 d2i_X509_EXTENSIONS(NULL,
1303 &sdata, dsize);
1304 if (!s->tlsext_ocsp_exts
1305 || (data + dsize != sdata))
1306 {
1307 *al = SSL_AD_DECODE_ERROR;
1308 return 0;
1309 }
1310 }
1311 }
1312 /* We don't know what to do with any other type
1313 * so ignore it.
1314 */
1315 else
1316 s->tlsext_status_type = -1;
1317 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001318#ifndef OPENSSL_NO_HEARTBEATS
1319 else if (type == TLSEXT_TYPE_heartbeat)
1320 {
1321 switch(data[0])
1322 {
1323 case 0x01: /* Client allows us to send HB requests */
1324 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1325 break;
1326 case 0x02: /* Client doesn't accept HB requests */
1327 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1328 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1329 break;
1330 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1331 return 0;
1332 }
1333 }
1334#endif
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001335#ifndef OPENSSL_NO_NEXTPROTONEG
1336 else if (type == TLSEXT_TYPE_next_proto_neg &&
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001337 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001338 {
1339 /* We shouldn't accept this extension on a
1340 * renegotiation.
1341 *
1342 * s->new_session will be set on renegotiation, but we
1343 * probably shouldn't rely that it couldn't be set on
1344 * the initial renegotation too in certain cases (when
1345 * there's some other reason to disallow resuming an
1346 * earlier session -- the current code won't be doing
1347 * anything like that, but this might change).
1348
1349 * A valid sign that there's been a previous handshake
1350 * in this connection is if s->s3->tmp.finish_md_len >
1351 * 0. (We are talking about a check that will happen
1352 * in the Hello protocol round, well before a new
1353 * Finished message could have been computed.) */
1354 s->s3->next_proto_neg_seen = 1;
1355 }
1356#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001357
Adam Langley45bcfbc2013-01-16 13:43:53 -08001358 else if (type == TLSEXT_TYPE_channel_id && s->tlsext_channel_id_enabled)
1359 s->s3->tlsext_channel_id_valid = 1;
1360
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001361 /* session ticket processed earlier */
Brian Carlstromeefface2013-02-11 09:54:43 -08001362#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001363 else if (type == TLSEXT_TYPE_use_srtp)
Brian Carlstromeefface2013-02-11 09:54:43 -08001364 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001365 if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
1366 al))
1367 return 0;
Brian Carlstromeefface2013-02-11 09:54:43 -08001368 }
1369#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001370
Brian Carlstrom221304e2010-04-15 14:22:36 -07001371 data+=size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001372 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001373
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001374 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001375
1376 ri_check:
1377
1378 /* Need RI if renegotiating */
1379
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001380 if (!renegotiate_seen && s->renegotiate &&
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001381 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1382 {
1383 *al = SSL_AD_HANDSHAKE_FAILURE;
1384 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1385 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1386 return 0;
1387 }
1388
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001389 return 1;
1390 }
1391
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001392#ifndef OPENSSL_NO_NEXTPROTONEG
1393/* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1394 * elements of zero length are allowed and the set of elements must exactly fill
1395 * the length of the block. */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001396static char ssl_next_proto_validate(unsigned char *d, unsigned len)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001397 {
1398 unsigned int off = 0;
1399
1400 while (off < len)
1401 {
1402 if (d[off] == 0)
1403 return 0;
1404 off += d[off];
1405 off++;
1406 }
1407
1408 return off == len;
1409 }
1410#endif
1411
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001412int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
1413 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001414 unsigned short length;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001415 unsigned short type;
1416 unsigned short size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001417 unsigned char *data = *p;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001418 int tlsext_servername = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001419 int renegotiate_seen = 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001420
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001421#ifndef OPENSSL_NO_NEXTPROTONEG
1422 s->s3->next_proto_neg_seen = 0;
1423#endif
1424
1425#ifndef OPENSSL_NO_HEARTBEATS
1426 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1427 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1428#endif
1429
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001430 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001431 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001432
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001433 n2s(data,length);
1434 if (data+length != d+n)
1435 {
1436 *al = SSL_AD_DECODE_ERROR;
1437 return 0;
1438 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001439
1440 while(data <= (d+n-4))
1441 {
1442 n2s(data,type);
1443 n2s(data,size);
1444
1445 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001446 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001447
1448 if (s->tlsext_debug_cb)
1449 s->tlsext_debug_cb(s, 1, type, data, size,
1450 s->tlsext_debug_arg);
1451
1452 if (type == TLSEXT_TYPE_server_name)
1453 {
1454 if (s->tlsext_hostname == NULL || size > 0)
1455 {
1456 *al = TLS1_AD_UNRECOGNIZED_NAME;
1457 return 0;
1458 }
1459 tlsext_servername = 1;
1460 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001461
1462#ifndef OPENSSL_NO_EC
1463 else if (type == TLSEXT_TYPE_ec_point_formats &&
1464 s->version != DTLS1_VERSION)
1465 {
1466 unsigned char *sdata = data;
1467 int ecpointformatlist_length = *(sdata++);
1468
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001469 if (ecpointformatlist_length != size - 1 ||
1470 ecpointformatlist_length < 1)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001471 {
1472 *al = TLS1_AD_DECODE_ERROR;
1473 return 0;
1474 }
1475 s->session->tlsext_ecpointformatlist_length = 0;
1476 if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
1477 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1478 {
1479 *al = TLS1_AD_INTERNAL_ERROR;
1480 return 0;
1481 }
1482 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1483 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
1484#if 0
1485 fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1486 sdata = s->session->tlsext_ecpointformatlist;
1487 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1488 fprintf(stderr,"%i ",*(sdata++));
1489 fprintf(stderr,"\n");
1490#endif
1491 }
1492#endif /* OPENSSL_NO_EC */
1493
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001494 else if (type == TLSEXT_TYPE_session_ticket)
1495 {
Brian Carlstrom221304e2010-04-15 14:22:36 -07001496 if (s->tls_session_ticket_ext_cb &&
1497 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1498 {
1499 *al = TLS1_AD_INTERNAL_ERROR;
1500 return 0;
1501 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001502 if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1503 || (size > 0))
1504 {
1505 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1506 return 0;
1507 }
1508 s->tlsext_ticket_expected = 1;
1509 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001510#ifdef TLSEXT_TYPE_opaque_prf_input
1511 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1512 s->version != DTLS1_VERSION)
1513 {
1514 unsigned char *sdata = data;
1515
1516 if (size < 2)
1517 {
1518 *al = SSL_AD_DECODE_ERROR;
1519 return 0;
1520 }
1521 n2s(sdata, s->s3->server_opaque_prf_input_len);
1522 if (s->s3->server_opaque_prf_input_len != size - 2)
1523 {
1524 *al = SSL_AD_DECODE_ERROR;
1525 return 0;
1526 }
1527
1528 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1529 OPENSSL_free(s->s3->server_opaque_prf_input);
1530 if (s->s3->server_opaque_prf_input_len == 0)
1531 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1532 else
1533 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1534
1535 if (s->s3->server_opaque_prf_input == NULL)
1536 {
1537 *al = TLS1_AD_INTERNAL_ERROR;
1538 return 0;
1539 }
1540 }
1541#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001542 else if (type == TLSEXT_TYPE_status_request &&
1543 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001544 {
1545 /* MUST be empty and only sent if we've requested
1546 * a status request message.
1547 */
1548 if ((s->tlsext_status_type == -1) || (size > 0))
1549 {
1550 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1551 return 0;
1552 }
1553 /* Set flag to expect CertificateStatus message */
1554 s->tlsext_status_expected = 1;
1555 }
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001556#ifndef OPENSSL_NO_NEXTPROTONEG
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001557 else if (type == TLSEXT_TYPE_next_proto_neg &&
1558 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001559 {
1560 unsigned char *selected;
1561 unsigned char selected_len;
1562
1563 /* We must have requested it. */
Brian Carlstromeefface2013-02-11 09:54:43 -08001564 if (s->ctx->next_proto_select_cb == NULL)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001565 {
1566 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1567 return 0;
1568 }
1569 /* The data must be valid */
1570 if (!ssl_next_proto_validate(data, size))
1571 {
1572 *al = TLS1_AD_DECODE_ERROR;
1573 return 0;
1574 }
1575 if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
1576 {
1577 *al = TLS1_AD_INTERNAL_ERROR;
1578 return 0;
1579 }
1580 s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1581 if (!s->next_proto_negotiated)
1582 {
1583 *al = TLS1_AD_INTERNAL_ERROR;
1584 return 0;
1585 }
1586 memcpy(s->next_proto_negotiated, selected, selected_len);
1587 s->next_proto_negotiated_len = selected_len;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001588 s->s3->next_proto_neg_seen = 1;
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001589 }
1590#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08001591 else if (type == TLSEXT_TYPE_channel_id)
1592 s->s3->tlsext_channel_id_valid = 1;
1593
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001594 else if (type == TLSEXT_TYPE_renegotiate)
1595 {
1596 if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1597 return 0;
1598 renegotiate_seen = 1;
1599 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001600#ifndef OPENSSL_NO_HEARTBEATS
1601 else if (type == TLSEXT_TYPE_heartbeat)
1602 {
1603 switch(data[0])
1604 {
1605 case 0x01: /* Server allows us to send HB requests */
1606 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1607 break;
1608 case 0x02: /* Server doesn't accept HB requests */
1609 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1610 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1611 break;
1612 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1613 return 0;
1614 }
1615 }
1616#endif
Brian Carlstromeefface2013-02-11 09:54:43 -08001617#ifndef OPENSSL_NO_SRTP
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001618 else if (type == TLSEXT_TYPE_use_srtp)
Brian Carlstromeefface2013-02-11 09:54:43 -08001619 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001620 if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
1621 al))
1622 return 0;
Brian Carlstromeefface2013-02-11 09:54:43 -08001623 }
1624#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001625
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001626 data+=size;
1627 }
1628
1629 if (data != d+n)
1630 {
1631 *al = SSL_AD_DECODE_ERROR;
1632 return 0;
1633 }
1634
1635 if (!s->hit && tlsext_servername == 1)
1636 {
1637 if (s->tlsext_hostname)
1638 {
1639 if (s->session->tlsext_hostname == NULL)
1640 {
1641 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1642 if (!s->session->tlsext_hostname)
1643 {
1644 *al = SSL_AD_UNRECOGNIZED_NAME;
1645 return 0;
1646 }
1647 }
1648 else
1649 {
1650 *al = SSL_AD_DECODE_ERROR;
1651 return 0;
1652 }
1653 }
1654 }
1655
1656 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001657
1658 ri_check:
1659
1660 /* Determine if we need to see RI. Strictly speaking if we want to
1661 * avoid an attack we should *always* see RI even on initial server
1662 * hello because the client doesn't see any renegotiation during an
1663 * attack. However this would mean we could not connect to any server
1664 * which doesn't support RI so for the immediate future tolerate RI
1665 * absence on initial connect only.
1666 */
1667 if (!renegotiate_seen
1668 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1669 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1670 {
1671 *al = SSL_AD_HANDSHAKE_FAILURE;
1672 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1673 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1674 return 0;
1675 }
1676
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001677 return 1;
1678 }
1679
Brian Carlstrom221304e2010-04-15 14:22:36 -07001680
1681int ssl_prepare_clienthello_tlsext(SSL *s)
1682 {
1683#ifndef OPENSSL_NO_EC
1684 /* If we are client and using an elliptic curve cryptography cipher suite, send the point formats
1685 * and elliptic curves we support.
1686 */
1687 int using_ecc = 0;
1688 int i;
1689 unsigned char *j;
1690 unsigned long alg_k, alg_a;
1691 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1692
1693 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1694 {
1695 SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1696
1697 alg_k = c->algorithm_mkey;
1698 alg_a = c->algorithm_auth;
1699 if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe) || (alg_a & SSL_aECDSA)))
1700 {
1701 using_ecc = 1;
1702 break;
1703 }
1704 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001705 using_ecc = using_ecc && (s->version >= TLS1_VERSION);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001706 if (using_ecc)
1707 {
1708 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1709 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1710 {
1711 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1712 return -1;
1713 }
1714 s->tlsext_ecpointformatlist_length = 3;
1715 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1716 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1717 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1718
1719 /* we support all named elliptic curves in draft-ietf-tls-ecc-12 */
1720 if (s->tlsext_ellipticcurvelist != NULL) OPENSSL_free(s->tlsext_ellipticcurvelist);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001721 s->tlsext_ellipticcurvelist_length = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001722 if ((s->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
1723 {
1724 s->tlsext_ellipticcurvelist_length = 0;
1725 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1726 return -1;
1727 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001728 for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1729 sizeof(pref_list)/sizeof(pref_list[0]); i++)
1730 {
1731 int id = tls1_ec_nid2curve_id(pref_list[i]);
1732 s2n(id,j);
1733 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001734 }
1735#endif /* OPENSSL_NO_EC */
1736
1737#ifdef TLSEXT_TYPE_opaque_prf_input
1738 {
1739 int r = 1;
1740
1741 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1742 {
1743 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1744 if (!r)
1745 return -1;
1746 }
1747
1748 if (s->tlsext_opaque_prf_input != NULL)
1749 {
1750 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1751 OPENSSL_free(s->s3->client_opaque_prf_input);
1752
1753 if (s->tlsext_opaque_prf_input_len == 0)
1754 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1755 else
1756 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1757 if (s->s3->client_opaque_prf_input == NULL)
1758 {
1759 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1760 return -1;
1761 }
1762 s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1763 }
1764
1765 if (r == 2)
1766 /* at callback's request, insist on receiving an appropriate server opaque PRF input */
1767 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1768 }
1769#endif
1770
1771 return 1;
1772 }
1773
1774int ssl_prepare_serverhello_tlsext(SSL *s)
1775 {
1776#ifndef OPENSSL_NO_EC
1777 /* If we are server and using an ECC cipher suite, send the point formats we support
1778 * if the client sent us an ECPointsFormat extension. Note that the server is not
1779 * supposed to send an EllipticCurves extension.
1780 */
1781
1782 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1783 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1784 int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
1785 using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1786
1787 if (using_ecc)
1788 {
1789 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1790 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1791 {
1792 SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1793 return -1;
1794 }
1795 s->tlsext_ecpointformatlist_length = 3;
1796 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1797 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1798 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1799 }
1800#endif /* OPENSSL_NO_EC */
1801
1802 return 1;
1803 }
1804
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001805int ssl_check_clienthello_tlsext_early(SSL *s)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001806 {
1807 int ret=SSL_TLSEXT_ERR_NOACK;
1808 int al = SSL_AD_UNRECOGNIZED_NAME;
1809
Brian Carlstrom221304e2010-04-15 14:22:36 -07001810#ifndef OPENSSL_NO_EC
1811 /* The handling of the ECPointFormats extension is done elsewhere, namely in
1812 * ssl3_choose_cipher in s3_lib.c.
1813 */
1814 /* The handling of the EllipticCurves extension is done elsewhere, namely in
1815 * ssl3_choose_cipher in s3_lib.c.
1816 */
1817#endif
1818
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001819 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1820 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1821 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1822 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1823
Brian Carlstrom221304e2010-04-15 14:22:36 -07001824#ifdef TLSEXT_TYPE_opaque_prf_input
1825 {
1826 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
1827 * but we might be sending an alert in response to the client hello,
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001828 * so this has to happen here in
1829 * ssl_check_clienthello_tlsext_early(). */
Brian Carlstrom221304e2010-04-15 14:22:36 -07001830
1831 int r = 1;
1832
1833 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1834 {
1835 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1836 if (!r)
1837 {
1838 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1839 al = SSL_AD_INTERNAL_ERROR;
1840 goto err;
1841 }
1842 }
1843
1844 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1845 OPENSSL_free(s->s3->server_opaque_prf_input);
1846 s->s3->server_opaque_prf_input = NULL;
1847
1848 if (s->tlsext_opaque_prf_input != NULL)
1849 {
1850 if (s->s3->client_opaque_prf_input != NULL &&
1851 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
1852 {
1853 /* can only use this extension if we have a server opaque PRF input
1854 * of the same length as the client opaque PRF input! */
1855
1856 if (s->tlsext_opaque_prf_input_len == 0)
1857 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1858 else
1859 s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1860 if (s->s3->server_opaque_prf_input == NULL)
1861 {
1862 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1863 al = SSL_AD_INTERNAL_ERROR;
1864 goto err;
1865 }
1866 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1867 }
1868 }
1869
1870 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
1871 {
1872 /* The callback wants to enforce use of the extension,
1873 * but we can't do that with the client opaque PRF input;
1874 * abort the handshake.
1875 */
1876 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1877 al = SSL_AD_HANDSHAKE_FAILURE;
1878 }
1879 }
1880
Brian Carlstrom221304e2010-04-15 14:22:36 -07001881 err:
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001882#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001883 switch (ret)
1884 {
1885 case SSL_TLSEXT_ERR_ALERT_FATAL:
1886 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1887 return -1;
1888
1889 case SSL_TLSEXT_ERR_ALERT_WARNING:
1890 ssl3_send_alert(s,SSL3_AL_WARNING,al);
1891 return 1;
1892
1893 case SSL_TLSEXT_ERR_NOACK:
1894 s->servername_done=0;
1895 default:
1896 return 1;
1897 }
1898 }
1899
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001900int ssl_check_clienthello_tlsext_late(SSL *s)
1901 {
1902 int ret = SSL_TLSEXT_ERR_OK;
1903 int al;
1904
1905 /* If status request then ask callback what to do.
1906 * Note: this must be called after servername callbacks in case
1907 * the certificate has changed, and must be called after the cipher
1908 * has been chosen because this may influence which certificate is sent
1909 */
1910 if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
1911 {
1912 int r;
1913 CERT_PKEY *certpkey;
1914 certpkey = ssl_get_server_send_pkey(s);
1915 /* If no certificate can't return certificate status */
1916 if (certpkey == NULL)
1917 {
1918 s->tlsext_status_expected = 0;
1919 return 1;
1920 }
1921 /* Set current certificate to one we will use so
1922 * SSL_get_certificate et al can pick it up.
1923 */
1924 s->cert->key = certpkey;
1925 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1926 switch (r)
1927 {
1928 /* We don't want to send a status request response */
1929 case SSL_TLSEXT_ERR_NOACK:
1930 s->tlsext_status_expected = 0;
1931 break;
1932 /* status request response should be sent */
1933 case SSL_TLSEXT_ERR_OK:
1934 if (s->tlsext_ocsp_resp)
1935 s->tlsext_status_expected = 1;
1936 else
1937 s->tlsext_status_expected = 0;
1938 break;
1939 /* something bad happened */
1940 case SSL_TLSEXT_ERR_ALERT_FATAL:
1941 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1942 al = SSL_AD_INTERNAL_ERROR;
1943 goto err;
1944 }
1945 }
1946 else
1947 s->tlsext_status_expected = 0;
1948
1949 err:
1950 switch (ret)
1951 {
1952 case SSL_TLSEXT_ERR_ALERT_FATAL:
1953 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1954 return -1;
1955
1956 case SSL_TLSEXT_ERR_ALERT_WARNING:
1957 ssl3_send_alert(s,SSL3_AL_WARNING,al);
1958 return 1;
1959
1960 default:
1961 return 1;
1962 }
1963 }
1964
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001965int ssl_check_serverhello_tlsext(SSL *s)
1966 {
1967 int ret=SSL_TLSEXT_ERR_NOACK;
1968 int al = SSL_AD_UNRECOGNIZED_NAME;
1969
Brian Carlstrom221304e2010-04-15 14:22:36 -07001970#ifndef OPENSSL_NO_EC
Brian Carlstrom976a0342010-12-03 16:11:54 -08001971 /* If we are client and using an elliptic curve cryptography cipher
1972 * suite, then if server returns an EC point formats lists extension
1973 * it must contain uncompressed.
Brian Carlstrom221304e2010-04-15 14:22:36 -07001974 */
1975 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1976 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1977 if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom976a0342010-12-03 16:11:54 -08001978 (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom221304e2010-04-15 14:22:36 -07001979 ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
1980 {
1981 /* we are using an ECC cipher */
1982 size_t i;
1983 unsigned char *list;
1984 int found_uncompressed = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001985 list = s->session->tlsext_ecpointformatlist;
1986 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1987 {
1988 if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
1989 {
1990 found_uncompressed = 1;
1991 break;
1992 }
1993 }
1994 if (!found_uncompressed)
1995 {
1996 SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
1997 return -1;
1998 }
1999 }
2000 ret = SSL_TLSEXT_ERR_OK;
2001#endif /* OPENSSL_NO_EC */
2002
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002003 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2004 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
2005 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
2006 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
2007
Brian Carlstrom221304e2010-04-15 14:22:36 -07002008#ifdef TLSEXT_TYPE_opaque_prf_input
2009 if (s->s3->server_opaque_prf_input_len > 0)
2010 {
2011 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
2012 * So first verify that we really have a value from the server too. */
2013
2014 if (s->s3->server_opaque_prf_input == NULL)
2015 {
2016 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2017 al = SSL_AD_HANDSHAKE_FAILURE;
2018 }
2019
2020 /* Anytime the server *has* sent an opaque PRF input, we need to check
2021 * that we have a client opaque PRF input of the same size. */
2022 if (s->s3->client_opaque_prf_input == NULL ||
2023 s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
2024 {
2025 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2026 al = SSL_AD_ILLEGAL_PARAMETER;
2027 }
2028 }
2029#endif
2030
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002031 /* If we've requested certificate status and we wont get one
2032 * tell the callback
2033 */
2034 if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
Brian Carlstrom221304e2010-04-15 14:22:36 -07002035 && s->ctx && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002036 {
2037 int r;
2038 /* Set resp to NULL, resplen to -1 so callback knows
2039 * there is no response.
2040 */
2041 if (s->tlsext_ocsp_resp)
2042 {
2043 OPENSSL_free(s->tlsext_ocsp_resp);
2044 s->tlsext_ocsp_resp = NULL;
2045 }
2046 s->tlsext_ocsp_resplen = -1;
2047 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2048 if (r == 0)
2049 {
2050 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2051 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2052 }
2053 if (r < 0)
2054 {
2055 al = SSL_AD_INTERNAL_ERROR;
2056 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2057 }
2058 }
2059
2060 switch (ret)
2061 {
2062 case SSL_TLSEXT_ERR_ALERT_FATAL:
2063 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2064 return -1;
2065
2066 case SSL_TLSEXT_ERR_ALERT_WARNING:
2067 ssl3_send_alert(s,SSL3_AL_WARNING,al);
2068 return 1;
2069
2070 case SSL_TLSEXT_ERR_NOACK:
2071 s->servername_done=0;
2072 default:
2073 return 1;
2074 }
2075 }
2076
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002077/* Since the server cache lookup is done early on in the processing of the
2078 * ClientHello, and other operations depend on the result, we need to handle
2079 * any TLS session ticket extension at the same time.
2080 *
2081 * session_id: points at the session ID in the ClientHello. This code will
2082 * read past the end of this in order to parse out the session ticket
2083 * extension, if any.
2084 * len: the length of the session ID.
2085 * limit: a pointer to the first byte after the ClientHello.
2086 * ret: (output) on return, if a ticket was decrypted, then this is set to
2087 * point to the resulting session.
2088 *
2089 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2090 * ciphersuite, in which case we have no use for session tickets and one will
2091 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2092 *
2093 * Returns:
2094 * -1: fatal error, either from parsing or decrypting the ticket.
2095 * 0: no ticket was found (or was ignored, based on settings).
2096 * 1: a zero length extension was found, indicating that the client supports
2097 * session tickets but doesn't currently have one to offer.
2098 * 2: either s->tls_session_secret_cb was set, or a ticket was offered but
2099 * couldn't be decrypted because of a non-fatal error.
2100 * 3: a ticket was successfully decrypted and *ret was set.
2101 *
2102 * Side effects:
2103 * Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2104 * a new session ticket to the client because the client indicated support
2105 * (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2106 * a session ticket or we couldn't use the one it gave us, or if
2107 * s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2108 * Otherwise, s->tlsext_ticket_expected is set to 0.
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002109 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002110int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002111 const unsigned char *limit, SSL_SESSION **ret)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002112 {
2113 /* Point after session ID in client hello */
2114 const unsigned char *p = session_id + len;
2115 unsigned short i;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002116
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002117 *ret = NULL;
2118 s->tlsext_ticket_expected = 0;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002119
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002120 /* If tickets disabled behave as if no ticket present
2121 * to permit stateful resumption.
2122 */
2123 if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2124 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002125 if ((s->version <= SSL3_VERSION) || !limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002126 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002127 if (p >= limit)
2128 return -1;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002129 /* Skip past DTLS cookie */
2130 if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
2131 {
2132 i = *(p++);
2133 p+= i;
2134 if (p >= limit)
2135 return -1;
2136 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002137 /* Skip past cipher list */
2138 n2s(p, i);
2139 p+= i;
2140 if (p >= limit)
2141 return -1;
2142 /* Skip past compression algorithm list */
2143 i = *(p++);
2144 p += i;
2145 if (p > limit)
2146 return -1;
2147 /* Now at start of extensions */
2148 if ((p + 2) >= limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002149 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002150 n2s(p, i);
2151 while ((p + 4) <= limit)
2152 {
2153 unsigned short type, size;
2154 n2s(p, type);
2155 n2s(p, size);
2156 if (p + size > limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002157 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002158 if (type == TLSEXT_TYPE_session_ticket)
2159 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002160 int r;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002161 if (size == 0)
2162 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002163 /* The client will accept a ticket but doesn't
2164 * currently have one. */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002165 s->tlsext_ticket_expected = 1;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002166 return 1;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002167 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07002168 if (s->tls_session_secret_cb)
2169 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002170 /* Indicate that the ticket couldn't be
2171 * decrypted rather than generating the session
2172 * from ticket now, trigger abbreviated
2173 * handshake based on external mechanism to
2174 * calculate the master secret later. */
2175 return 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07002176 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002177 r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2178 switch (r)
2179 {
2180 case 2: /* ticket couldn't be decrypted */
2181 s->tlsext_ticket_expected = 1;
2182 return 2;
2183 case 3: /* ticket was decrypted */
2184 return r;
2185 case 4: /* ticket decrypted but need to renew */
2186 s->tlsext_ticket_expected = 1;
2187 return 3;
2188 default: /* fatal error */
2189 return -1;
2190 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002191 }
2192 p += size;
2193 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002194 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002195 }
2196
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002197/* tls_decrypt_ticket attempts to decrypt a session ticket.
2198 *
2199 * etick: points to the body of the session ticket extension.
2200 * eticklen: the length of the session tickets extenion.
2201 * sess_id: points at the session ID.
2202 * sesslen: the length of the session ID.
2203 * psess: (output) on return, if a ticket was decrypted, then this is set to
2204 * point to the resulting session.
2205 *
2206 * Returns:
2207 * -1: fatal error, either from parsing or decrypting the ticket.
2208 * 2: the ticket couldn't be decrypted.
2209 * 3: a ticket was successfully decrypted and *psess was set.
2210 * 4: same as 3, but the ticket needs to be renewed.
2211 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002212static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2213 const unsigned char *sess_id, int sesslen,
2214 SSL_SESSION **psess)
2215 {
2216 SSL_SESSION *sess;
2217 unsigned char *sdec;
2218 const unsigned char *p;
2219 int slen, mlen, renew_ticket = 0;
2220 unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2221 HMAC_CTX hctx;
2222 EVP_CIPHER_CTX ctx;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002223 SSL_CTX *tctx = s->initial_ctx;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002224 /* Need at least keyname + iv + some encrypted data */
2225 if (eticklen < 48)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002226 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002227 /* Initialize session ticket encryption and HMAC contexts */
2228 HMAC_CTX_init(&hctx);
2229 EVP_CIPHER_CTX_init(&ctx);
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002230 if (tctx->tlsext_ticket_key_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002231 {
2232 unsigned char *nctick = (unsigned char *)etick;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002233 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002234 &ctx, &hctx, 0);
2235 if (rv < 0)
2236 return -1;
2237 if (rv == 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002238 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002239 if (rv == 2)
2240 renew_ticket = 1;
2241 }
2242 else
2243 {
2244 /* Check key name matches */
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002245 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002246 return 2;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002247 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002248 tlsext_tick_md(), NULL);
2249 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002250 tctx->tlsext_tick_aes_key, etick + 16);
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002251 }
2252 /* Attempt to process session ticket, first conduct sanity and
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002253 * integrity checks on ticket.
2254 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002255 mlen = HMAC_size(&hctx);
Brian Carlstrom221304e2010-04-15 14:22:36 -07002256 if (mlen < 0)
2257 {
2258 EVP_CIPHER_CTX_cleanup(&ctx);
2259 return -1;
2260 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002261 eticklen -= mlen;
2262 /* Check HMAC of encrypted ticket */
2263 HMAC_Update(&hctx, etick, eticklen);
2264 HMAC_Final(&hctx, tick_hmac, NULL);
2265 HMAC_CTX_cleanup(&hctx);
Brian Carlstromfa75fdb2013-02-01 23:44:05 -08002266 if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002267 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002268 /* Attempt to decrypt session data */
2269 /* Move p after IV to start of encrypted ticket, update length */
2270 p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2271 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2272 sdec = OPENSSL_malloc(eticklen);
2273 if (!sdec)
2274 {
2275 EVP_CIPHER_CTX_cleanup(&ctx);
2276 return -1;
2277 }
2278 EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2279 if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002280 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002281 slen += mlen;
2282 EVP_CIPHER_CTX_cleanup(&ctx);
2283 p = sdec;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002284
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002285 sess = d2i_SSL_SESSION(NULL, &p, slen);
2286 OPENSSL_free(sdec);
2287 if (sess)
2288 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002289 /* The session ID, if non-empty, is used by some clients to
2290 * detect that the ticket has been accepted. So we copy it to
2291 * the session structure. If it is empty set length to zero
2292 * as required by standard.
2293 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002294 if (sesslen)
2295 memcpy(sess->session_id, sess_id, sesslen);
2296 sess->session_id_length = sesslen;
2297 *psess = sess;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002298 if (renew_ticket)
2299 return 4;
2300 else
2301 return 3;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002302 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002303 ERR_clear_error();
2304 /* For session parse failure, indicate that we need to send a new
2305 * ticket. */
2306 return 2;
2307 }
2308
2309/* Tables to translate from NIDs to TLS v1.2 ids */
2310
2311typedef struct
2312 {
2313 int nid;
2314 int id;
2315 } tls12_lookup;
2316
2317static tls12_lookup tls12_md[] = {
2318#ifndef OPENSSL_NO_MD5
2319 {NID_md5, TLSEXT_hash_md5},
2320#endif
2321#ifndef OPENSSL_NO_SHA
2322 {NID_sha1, TLSEXT_hash_sha1},
2323#endif
2324#ifndef OPENSSL_NO_SHA256
2325 {NID_sha224, TLSEXT_hash_sha224},
2326 {NID_sha256, TLSEXT_hash_sha256},
2327#endif
2328#ifndef OPENSSL_NO_SHA512
2329 {NID_sha384, TLSEXT_hash_sha384},
2330 {NID_sha512, TLSEXT_hash_sha512}
2331#endif
2332};
2333
2334static tls12_lookup tls12_sig[] = {
2335#ifndef OPENSSL_NO_RSA
2336 {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2337#endif
2338#ifndef OPENSSL_NO_DSA
2339 {EVP_PKEY_DSA, TLSEXT_signature_dsa},
2340#endif
2341#ifndef OPENSSL_NO_ECDSA
2342 {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2343#endif
2344};
2345
2346static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2347 {
2348 size_t i;
2349 for (i = 0; i < tlen; i++)
2350 {
2351 if (table[i].nid == nid)
2352 return table[i].id;
2353 }
2354 return -1;
2355 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002356
2357int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
2358 {
2359 int sig_id, md_id;
2360 if (!md)
2361 return 0;
2362 md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2363 sizeof(tls12_md)/sizeof(tls12_lookup));
2364 if (md_id == -1)
2365 return 0;
2366 sig_id = tls12_get_sigid(pk);
2367 if (sig_id == -1)
2368 return 0;
2369 p[0] = (unsigned char)md_id;
2370 p[1] = (unsigned char)sig_id;
2371 return 1;
2372 }
2373
Kenny Root9296b4b2013-06-24 12:03:19 -07002374/* tls12_get_sigid returns the TLS 1.2 SignatureAlgorithm value corresponding
2375 * to the given public key, or -1 if not known. */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002376int tls12_get_sigid(const EVP_PKEY *pk)
2377 {
2378 return tls12_find_id(pk->type, tls12_sig,
2379 sizeof(tls12_sig)/sizeof(tls12_lookup));
2380 }
2381
2382const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2383 {
2384 switch(hash_alg)
2385 {
2386#ifndef OPENSSL_NO_MD5
2387 case TLSEXT_hash_md5:
2388#ifdef OPENSSL_FIPS
2389 if (FIPS_mode())
2390 return NULL;
2391#endif
2392 return EVP_md5();
2393#endif
2394#ifndef OPENSSL_NO_SHA
Kenny Root9296b4b2013-06-24 12:03:19 -07002395 case TLSEXT_hash_sha1:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002396 return EVP_sha1();
2397#endif
2398#ifndef OPENSSL_NO_SHA256
Kenny Root9296b4b2013-06-24 12:03:19 -07002399 case TLSEXT_hash_sha224:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002400 return EVP_sha224();
2401
Kenny Root9296b4b2013-06-24 12:03:19 -07002402 case TLSEXT_hash_sha256:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002403 return EVP_sha256();
2404#endif
2405#ifndef OPENSSL_NO_SHA512
Kenny Root9296b4b2013-06-24 12:03:19 -07002406 case TLSEXT_hash_sha384:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002407 return EVP_sha384();
2408
Kenny Root9296b4b2013-06-24 12:03:19 -07002409 case TLSEXT_hash_sha512:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002410 return EVP_sha512();
2411#endif
Kenny Root9296b4b2013-06-24 12:03:19 -07002412 default:
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002413 return NULL;
2414
2415 }
2416 }
2417
Kenny Root9296b4b2013-06-24 12:03:19 -07002418/* tls1_process_sigalgs processes a signature_algorithms extension and sets the
2419 * digest functions accordingly for each key type.
2420 *
2421 * See RFC 5246, section 7.4.1.4.1.
2422 *
2423 * data: points to the content of the extension, not including type and length
2424 * headers.
2425 * dsize: the number of bytes of |data|. Must be even.
2426 */
2427void tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002428 {
Kenny Root9296b4b2013-06-24 12:03:19 -07002429 int i;
2430 const EVP_MD *md, **digest_ptr;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002431 /* Extension ignored for TLS versions below 1.2 */
2432 if (TLS1_get_version(s) < TLS1_2_VERSION)
Kenny Root9296b4b2013-06-24 12:03:19 -07002433 return;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002434
Kenny Root9296b4b2013-06-24 12:03:19 -07002435 s->s3->digest_rsa = NULL;
2436 s->s3->digest_dsa = NULL;
2437 s->s3->digest_ecdsa = NULL;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002438
2439 for (i = 0; i < dsize; i += 2)
2440 {
2441 unsigned char hash_alg = data[i], sig_alg = data[i+1];
2442
2443 switch(sig_alg)
2444 {
2445#ifndef OPENSSL_NO_RSA
2446 case TLSEXT_signature_rsa:
Kenny Root9296b4b2013-06-24 12:03:19 -07002447 digest_ptr = &s->s3->digest_rsa;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002448 break;
2449#endif
2450#ifndef OPENSSL_NO_DSA
2451 case TLSEXT_signature_dsa:
Kenny Root9296b4b2013-06-24 12:03:19 -07002452 digest_ptr = &s->s3->digest_dsa;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002453 break;
2454#endif
2455#ifndef OPENSSL_NO_ECDSA
2456 case TLSEXT_signature_ecdsa:
Kenny Root9296b4b2013-06-24 12:03:19 -07002457 digest_ptr = &s->s3->digest_ecdsa;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002458 break;
2459#endif
2460 default:
2461 continue;
2462 }
2463
Kenny Root9296b4b2013-06-24 12:03:19 -07002464 if (*digest_ptr == NULL)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002465 {
2466 md = tls12_get_hash(hash_alg);
2467 if (md)
Kenny Root9296b4b2013-06-24 12:03:19 -07002468 *digest_ptr = md;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002469 }
2470
2471 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002472 }
2473
2474#endif
2475
2476#ifndef OPENSSL_NO_HEARTBEATS
2477int
2478tls1_process_heartbeat(SSL *s)
2479 {
2480 unsigned char *p = &s->s3->rrec.data[0], *pl;
2481 unsigned short hbtype;
2482 unsigned int payload;
2483 unsigned int padding = 16; /* Use minimum padding */
2484
2485 /* Read type and payload length first */
2486 hbtype = *p++;
2487 n2s(p, payload);
2488 pl = p;
2489
2490 if (s->msg_callback)
2491 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2492 &s->s3->rrec.data[0], s->s3->rrec.length,
2493 s, s->msg_callback_arg);
2494
2495 if (hbtype == TLS1_HB_REQUEST)
2496 {
2497 unsigned char *buffer, *bp;
2498 int r;
2499
2500 /* Allocate memory for the response, size is 1 bytes
2501 * message type, plus 2 bytes payload length, plus
2502 * payload, plus padding
2503 */
2504 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2505 bp = buffer;
2506
2507 /* Enter response type, length and copy payload */
2508 *bp++ = TLS1_HB_RESPONSE;
2509 s2n(payload, bp);
2510 memcpy(bp, pl, payload);
2511 bp += payload;
2512 /* Random padding */
2513 RAND_pseudo_bytes(bp, padding);
2514
2515 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
2516
2517 if (r >= 0 && s->msg_callback)
2518 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2519 buffer, 3 + payload + padding,
2520 s, s->msg_callback_arg);
2521
2522 OPENSSL_free(buffer);
2523
2524 if (r < 0)
2525 return r;
2526 }
2527 else if (hbtype == TLS1_HB_RESPONSE)
2528 {
2529 unsigned int seq;
2530
2531 /* We only send sequence numbers (2 bytes unsigned int),
2532 * and 16 random bytes, so we just try to read the
2533 * sequence number */
2534 n2s(pl, seq);
2535
2536 if (payload == 18 && seq == s->tlsext_hb_seq)
2537 {
2538 s->tlsext_hb_seq++;
2539 s->tlsext_hb_pending = 0;
2540 }
2541 }
2542
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002543 return 0;
2544 }
2545
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002546int
2547tls1_heartbeat(SSL *s)
2548 {
2549 unsigned char *buf, *p;
2550 int ret;
2551 unsigned int payload = 18; /* Sequence number + random bytes */
2552 unsigned int padding = 16; /* Use minimum padding */
2553
2554 /* Only send if peer supports and accepts HB requests... */
2555 if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2556 s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
2557 {
2558 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2559 return -1;
2560 }
2561
2562 /* ...and there is none in flight yet... */
2563 if (s->tlsext_hb_pending)
2564 {
2565 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
2566 return -1;
2567 }
2568
2569 /* ...and no handshake in progress. */
2570 if (SSL_in_init(s) || s->in_handshake)
2571 {
2572 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
2573 return -1;
2574 }
2575
2576 /* Check if padding is too long, payload and padding
2577 * must not exceed 2^14 - 3 = 16381 bytes in total.
2578 */
2579 OPENSSL_assert(payload + padding <= 16381);
2580
2581 /* Create HeartBeat message, we just use a sequence number
2582 * as payload to distuingish different messages and add
2583 * some random stuff.
2584 * - Message Type, 1 byte
2585 * - Payload Length, 2 bytes (unsigned int)
2586 * - Payload, the sequence number (2 bytes uint)
2587 * - Payload, random bytes (16 bytes uint)
2588 * - Padding
2589 */
2590 buf = OPENSSL_malloc(1 + 2 + payload + padding);
2591 p = buf;
2592 /* Message Type */
2593 *p++ = TLS1_HB_REQUEST;
2594 /* Payload length (18 bytes here) */
2595 s2n(payload, p);
2596 /* Sequence number */
2597 s2n(s->tlsext_hb_seq, p);
2598 /* 16 random bytes */
2599 RAND_pseudo_bytes(p, 16);
2600 p += 16;
2601 /* Random padding */
2602 RAND_pseudo_bytes(p, padding);
2603
2604 ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2605 if (ret >= 0)
2606 {
2607 if (s->msg_callback)
2608 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2609 buf, 3 + payload + padding,
2610 s, s->msg_callback_arg);
2611
2612 s->tlsext_hb_pending = 1;
2613 }
2614
2615 OPENSSL_free(buf);
2616
2617 return ret;
2618 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002619#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08002620
2621#if !defined(OPENSSL_NO_TLSEXT)
2622/* tls1_channel_id_hash calculates the signed data for a Channel ID on the given
2623 * SSL connection and writes it to |md|.
2624 */
2625int
2626tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s)
2627 {
2628 EVP_MD_CTX ctx;
2629 unsigned char temp_digest[EVP_MAX_MD_SIZE];
2630 unsigned temp_digest_len;
2631 int i;
2632 static const char kClientIDMagic[] = "TLS Channel ID signature";
2633
2634 if (s->s3->handshake_buffer)
2635 if (!ssl3_digest_cached_records(s))
2636 return 0;
2637
2638 EVP_DigestUpdate(md, kClientIDMagic, sizeof(kClientIDMagic));
2639
2640 EVP_MD_CTX_init(&ctx);
2641 for (i = 0; i < SSL_MAX_DIGEST; i++)
2642 {
2643 if (s->s3->handshake_dgst[i] == NULL)
2644 continue;
2645 EVP_MD_CTX_copy_ex(&ctx, s->s3->handshake_dgst[i]);
2646 EVP_DigestFinal_ex(&ctx, temp_digest, &temp_digest_len);
2647 EVP_DigestUpdate(md, temp_digest, temp_digest_len);
2648 }
2649 EVP_MD_CTX_cleanup(&ctx);
2650
2651 return 1;
2652 }
2653#endif