blob: 90a88ce51c3052ee1c19b52d7cfc0e2c8e9f66ff [file] [log] [blame]
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001/* ssl/t1_lib.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
Brian Carlstrom221304e2010-04-15 14:22:36 -070058/* ====================================================================
59 * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800111
112#include <stdio.h>
113#include <openssl/objects.h>
114#include <openssl/evp.h>
115#include <openssl/hmac.h>
116#include <openssl/ocsp.h>
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700117#include <openssl/rand.h>
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800118#include "ssl_locl.h"
119
120const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
121
122#ifndef OPENSSL_NO_TLSEXT
123static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
124 const unsigned char *sess_id, int sesslen,
125 SSL_SESSION **psess);
126#endif
127
128SSL3_ENC_METHOD TLSv1_enc_data={
129 tls1_enc,
130 tls1_mac,
131 tls1_setup_key_block,
132 tls1_generate_master_secret,
133 tls1_change_cipher_state,
134 tls1_final_finish_mac,
135 TLS1_FINISH_MAC_LENGTH,
136 tls1_cert_verify_mac,
137 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
138 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
139 tls1_alert_code,
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700140 tls1_export_keying_material,
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800141 };
142
143long tls1_default_timeout(void)
144 {
145 /* 2 hours, the 24 hours mentioned in the TLSv1 spec
146 * is way too long for http, the cache would over fill */
147 return(60*60*2);
148 }
149
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800150int tls1_new(SSL *s)
151 {
152 if (!ssl3_new(s)) return(0);
153 s->method->ssl_clear(s);
154 return(1);
155 }
156
157void tls1_free(SSL *s)
158 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700159#ifndef OPENSSL_NO_TLSEXT
160 if (s->tlsext_session_ticket)
161 {
162 OPENSSL_free(s->tlsext_session_ticket);
163 }
164#endif /* OPENSSL_NO_TLSEXT */
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800165 ssl3_free(s);
166 }
167
168void tls1_clear(SSL *s)
169 {
170 ssl3_clear(s);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700171 s->version = s->method->version;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800172 }
173
Brian Carlstrom221304e2010-04-15 14:22:36 -0700174#ifndef OPENSSL_NO_EC
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700175
Brian Carlstrom221304e2010-04-15 14:22:36 -0700176static int nid_list[] =
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800177 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700178 NID_sect163k1, /* sect163k1 (1) */
179 NID_sect163r1, /* sect163r1 (2) */
180 NID_sect163r2, /* sect163r2 (3) */
181 NID_sect193r1, /* sect193r1 (4) */
182 NID_sect193r2, /* sect193r2 (5) */
183 NID_sect233k1, /* sect233k1 (6) */
184 NID_sect233r1, /* sect233r1 (7) */
185 NID_sect239k1, /* sect239k1 (8) */
186 NID_sect283k1, /* sect283k1 (9) */
187 NID_sect283r1, /* sect283r1 (10) */
188 NID_sect409k1, /* sect409k1 (11) */
189 NID_sect409r1, /* sect409r1 (12) */
190 NID_sect571k1, /* sect571k1 (13) */
191 NID_sect571r1, /* sect571r1 (14) */
192 NID_secp160k1, /* secp160k1 (15) */
193 NID_secp160r1, /* secp160r1 (16) */
194 NID_secp160r2, /* secp160r2 (17) */
195 NID_secp192k1, /* secp192k1 (18) */
196 NID_X9_62_prime192v1, /* secp192r1 (19) */
197 NID_secp224k1, /* secp224k1 (20) */
198 NID_secp224r1, /* secp224r1 (21) */
199 NID_secp256k1, /* secp256k1 (22) */
200 NID_X9_62_prime256v1, /* secp256r1 (23) */
201 NID_secp384r1, /* secp384r1 (24) */
202 NID_secp521r1 /* secp521r1 (25) */
203 };
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700204
205static int pref_list[] =
206 {
207 NID_sect571r1, /* sect571r1 (14) */
208 NID_sect571k1, /* sect571k1 (13) */
209 NID_secp521r1, /* secp521r1 (25) */
210 NID_sect409k1, /* sect409k1 (11) */
211 NID_sect409r1, /* sect409r1 (12) */
212 NID_secp384r1, /* secp384r1 (24) */
213 NID_sect283k1, /* sect283k1 (9) */
214 NID_sect283r1, /* sect283r1 (10) */
215 NID_secp256k1, /* secp256k1 (22) */
216 NID_X9_62_prime256v1, /* secp256r1 (23) */
217 NID_sect239k1, /* sect239k1 (8) */
218 NID_sect233k1, /* sect233k1 (6) */
219 NID_sect233r1, /* sect233r1 (7) */
220 NID_secp224k1, /* secp224k1 (20) */
221 NID_secp224r1, /* secp224r1 (21) */
222 NID_sect193r1, /* sect193r1 (4) */
223 NID_sect193r2, /* sect193r2 (5) */
224 NID_secp192k1, /* secp192k1 (18) */
225 NID_X9_62_prime192v1, /* secp192r1 (19) */
226 NID_sect163k1, /* sect163k1 (1) */
227 NID_sect163r1, /* sect163r1 (2) */
228 NID_sect163r2, /* sect163r2 (3) */
229 NID_secp160k1, /* secp160k1 (15) */
230 NID_secp160r1, /* secp160r1 (16) */
231 NID_secp160r2, /* secp160r2 (17) */
232 };
233
Brian Carlstrom221304e2010-04-15 14:22:36 -0700234int tls1_ec_curve_id2nid(int curve_id)
235 {
236 /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
237 if ((curve_id < 1) || ((unsigned int)curve_id >
238 sizeof(nid_list)/sizeof(nid_list[0])))
239 return 0;
240 return nid_list[curve_id-1];
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800241 }
242
Brian Carlstrom221304e2010-04-15 14:22:36 -0700243int tls1_ec_nid2curve_id(int nid)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800244 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700245 /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
246 switch (nid)
247 {
248 case NID_sect163k1: /* sect163k1 (1) */
249 return 1;
250 case NID_sect163r1: /* sect163r1 (2) */
251 return 2;
252 case NID_sect163r2: /* sect163r2 (3) */
253 return 3;
254 case NID_sect193r1: /* sect193r1 (4) */
255 return 4;
256 case NID_sect193r2: /* sect193r2 (5) */
257 return 5;
258 case NID_sect233k1: /* sect233k1 (6) */
259 return 6;
260 case NID_sect233r1: /* sect233r1 (7) */
261 return 7;
262 case NID_sect239k1: /* sect239k1 (8) */
263 return 8;
264 case NID_sect283k1: /* sect283k1 (9) */
265 return 9;
266 case NID_sect283r1: /* sect283r1 (10) */
267 return 10;
268 case NID_sect409k1: /* sect409k1 (11) */
269 return 11;
270 case NID_sect409r1: /* sect409r1 (12) */
271 return 12;
272 case NID_sect571k1: /* sect571k1 (13) */
273 return 13;
274 case NID_sect571r1: /* sect571r1 (14) */
275 return 14;
276 case NID_secp160k1: /* secp160k1 (15) */
277 return 15;
278 case NID_secp160r1: /* secp160r1 (16) */
279 return 16;
280 case NID_secp160r2: /* secp160r2 (17) */
281 return 17;
282 case NID_secp192k1: /* secp192k1 (18) */
283 return 18;
284 case NID_X9_62_prime192v1: /* secp192r1 (19) */
285 return 19;
286 case NID_secp224k1: /* secp224k1 (20) */
287 return 20;
288 case NID_secp224r1: /* secp224r1 (21) */
289 return 21;
290 case NID_secp256k1: /* secp256k1 (22) */
291 return 22;
292 case NID_X9_62_prime256v1: /* secp256r1 (23) */
293 return 23;
294 case NID_secp384r1: /* secp384r1 (24) */
295 return 24;
296 case NID_secp521r1: /* secp521r1 (25) */
297 return 25;
298 default:
299 return 0;
300 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800301 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700302#endif /* OPENSSL_NO_EC */
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800303
304#ifndef OPENSSL_NO_TLSEXT
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700305
306/* List of supported signature algorithms and hashes. Should make this
307 * customisable at some point, for now include everything we support.
308 */
309
310#ifdef OPENSSL_NO_RSA
311#define tlsext_sigalg_rsa(md) /* */
312#else
313#define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
314#endif
315
316#ifdef OPENSSL_NO_DSA
317#define tlsext_sigalg_dsa(md) /* */
318#else
319#define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
320#endif
321
322#ifdef OPENSSL_NO_ECDSA
323#define tlsext_sigalg_ecdsa(md) /* */
324#else
325#define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
326#endif
327
328#define tlsext_sigalg(md) \
329 tlsext_sigalg_rsa(md) \
330 tlsext_sigalg_dsa(md) \
331 tlsext_sigalg_ecdsa(md)
332
333static unsigned char tls12_sigalgs[] = {
334#ifndef OPENSSL_NO_SHA512
335 tlsext_sigalg(TLSEXT_hash_sha512)
336 tlsext_sigalg(TLSEXT_hash_sha384)
337#endif
338#ifndef OPENSSL_NO_SHA256
339 tlsext_sigalg(TLSEXT_hash_sha256)
340 tlsext_sigalg(TLSEXT_hash_sha224)
341#endif
342#ifndef OPENSSL_NO_SHA
343 tlsext_sigalg(TLSEXT_hash_sha1)
344#endif
345#ifndef OPENSSL_NO_MD5
346 tlsext_sigalg_rsa(TLSEXT_hash_md5)
347#endif
348};
349
350int tls12_get_req_sig_algs(SSL *s, unsigned char *p)
351 {
352 size_t slen = sizeof(tls12_sigalgs);
353#ifdef OPENSSL_FIPS
354 /* If FIPS mode don't include MD5 which is last */
355 if (FIPS_mode())
356 slen -= 2;
357#endif
358 if (p)
359 memcpy(p, tls12_sigalgs, slen);
360 return (int)slen;
361 }
362
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800363unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
364 {
365 int extdatalen=0;
366 unsigned char *ret = p;
367
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800368 /* don't add extensions for SSLv3 unless doing secure renegotiation */
369 if (s->client_version == SSL3_VERSION
370 && !s->s3->send_connection_binding)
371 return p;
372
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800373 ret+=2;
374
375 if (ret>=limit) return NULL; /* this really never occurs, but ... */
376
377 if (s->tlsext_hostname != NULL)
378 {
379 /* Add TLS extension servername to the Client Hello message */
380 unsigned long size_str;
381 long lenmax;
382
383 /* check for enough space.
384 4 for the servername type and entension length
385 2 for servernamelist length
386 1 for the hostname type
387 2 for hostname length
388 + hostname length
389 */
390
391 if ((lenmax = limit - ret - 9) < 0
Brian Carlstrom221304e2010-04-15 14:22:36 -0700392 || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800393 return NULL;
394
395 /* extension type and length */
396 s2n(TLSEXT_TYPE_server_name,ret);
397 s2n(size_str+5,ret);
398
399 /* length of servername list */
400 s2n(size_str+3,ret);
401
402 /* hostname type, length and hostname */
403 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
404 s2n(size_str,ret);
405 memcpy(ret, s->tlsext_hostname, size_str);
406 ret+=size_str;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800407 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700408
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800409 /* Add RI if renegotiating */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700410 if (s->renegotiate)
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800411 {
412 int el;
413
414 if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
415 {
416 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
417 return NULL;
418 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800419
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800420 if((limit - p - 4 - el) < 0) return NULL;
421
422 s2n(TLSEXT_TYPE_renegotiate,ret);
423 s2n(el,ret);
424
425 if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
426 {
427 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
428 return NULL;
429 }
430
431 ret += el;
432 }
433
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700434#ifndef OPENSSL_NO_SRP
435 /* Add SRP username if there is one */
436 if (s->srp_ctx.login != NULL)
437 { /* Add TLS extension SRP username to the Client Hello message */
438
439 int login_len = strlen(s->srp_ctx.login);
440 if (login_len > 255 || login_len == 0)
441 {
442 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
443 return NULL;
444 }
445
446 /* check for enough space.
447 4 for the srp type type and entension length
448 1 for the srp user identity
449 + srp user identity length
450 */
451 if ((limit - ret - 5 - login_len) < 0) return NULL;
452
453 /* fill in the extension */
454 s2n(TLSEXT_TYPE_srp,ret);
455 s2n(login_len+1,ret);
456 (*ret++) = (unsigned char) login_len;
457 memcpy(ret, s->srp_ctx.login, login_len);
458 ret+=login_len;
459 }
460#endif
461
Brian Carlstrom221304e2010-04-15 14:22:36 -0700462#ifndef OPENSSL_NO_EC
463 if (s->tlsext_ecpointformatlist != NULL &&
464 s->version != DTLS1_VERSION)
465 {
466 /* Add TLS extension ECPointFormats to the ClientHello message */
467 long lenmax;
468
469 if ((lenmax = limit - ret - 5) < 0) return NULL;
470 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
471 if (s->tlsext_ecpointformatlist_length > 255)
472 {
473 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
474 return NULL;
475 }
476
477 s2n(TLSEXT_TYPE_ec_point_formats,ret);
478 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
479 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
480 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
481 ret+=s->tlsext_ecpointformatlist_length;
482 }
483 if (s->tlsext_ellipticcurvelist != NULL &&
484 s->version != DTLS1_VERSION)
485 {
486 /* Add TLS extension EllipticCurves to the ClientHello message */
487 long lenmax;
488
489 if ((lenmax = limit - ret - 6) < 0) return NULL;
490 if (s->tlsext_ellipticcurvelist_length > (unsigned long)lenmax) return NULL;
491 if (s->tlsext_ellipticcurvelist_length > 65532)
492 {
493 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
494 return NULL;
495 }
496
497 s2n(TLSEXT_TYPE_elliptic_curves,ret);
498 s2n(s->tlsext_ellipticcurvelist_length + 2, ret);
499
500 /* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
501 * elliptic_curve_list, but the examples use two bytes.
502 * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
503 * resolves this to two bytes.
504 */
505 s2n(s->tlsext_ellipticcurvelist_length, ret);
506 memcpy(ret, s->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist_length);
507 ret+=s->tlsext_ellipticcurvelist_length;
508 }
509#endif /* OPENSSL_NO_EC */
510
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800511 if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
512 {
513 int ticklen;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800514 if (!s->new_session && s->session && s->session->tlsext_tick)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800515 ticklen = s->session->tlsext_ticklen;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700516 else if (s->session && s->tlsext_session_ticket &&
517 s->tlsext_session_ticket->data)
518 {
519 ticklen = s->tlsext_session_ticket->length;
520 s->session->tlsext_tick = OPENSSL_malloc(ticklen);
521 if (!s->session->tlsext_tick)
522 return NULL;
523 memcpy(s->session->tlsext_tick,
524 s->tlsext_session_ticket->data,
525 ticklen);
526 s->session->tlsext_ticklen = ticklen;
527 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800528 else
529 ticklen = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700530 if (ticklen == 0 && s->tlsext_session_ticket &&
531 s->tlsext_session_ticket->data == NULL)
532 goto skip_ext;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800533 /* Check for enough room 2 for extension type, 2 for len
534 * rest for ticket
535 */
Brian Carlstrom221304e2010-04-15 14:22:36 -0700536 if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800537 s2n(TLSEXT_TYPE_session_ticket,ret);
538 s2n(ticklen,ret);
539 if (ticklen)
540 {
541 memcpy(ret, s->session->tlsext_tick, ticklen);
542 ret += ticklen;
543 }
544 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700545 skip_ext:
546
Brian Carlstromed2ff7a2012-03-28 00:55:55 -0700547 if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700548 {
549 if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
550 return NULL;
551 s2n(TLSEXT_TYPE_signature_algorithms,ret);
552 s2n(sizeof(tls12_sigalgs) + 2, ret);
553 s2n(sizeof(tls12_sigalgs), ret);
554 memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
555 ret += sizeof(tls12_sigalgs);
556 }
557
Brian Carlstrom221304e2010-04-15 14:22:36 -0700558#ifdef TLSEXT_TYPE_opaque_prf_input
559 if (s->s3->client_opaque_prf_input != NULL &&
560 s->version != DTLS1_VERSION)
561 {
562 size_t col = s->s3->client_opaque_prf_input_len;
563
564 if ((long)(limit - ret - 6 - col < 0))
565 return NULL;
566 if (col > 0xFFFD) /* can't happen */
567 return NULL;
568
569 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
570 s2n(col + 2, ret);
571 s2n(col, ret);
572 memcpy(ret, s->s3->client_opaque_prf_input, col);
573 ret += col;
574 }
575#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800576
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800577 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
578 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800579 {
580 int i;
581 long extlen, idlen, itmp;
582 OCSP_RESPID *id;
583
584 idlen = 0;
585 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
586 {
587 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
588 itmp = i2d_OCSP_RESPID(id, NULL);
589 if (itmp <= 0)
590 return NULL;
591 idlen += itmp + 2;
592 }
593
594 if (s->tlsext_ocsp_exts)
595 {
596 extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
597 if (extlen < 0)
598 return NULL;
599 }
600 else
601 extlen = 0;
602
603 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
604 s2n(TLSEXT_TYPE_status_request, ret);
605 if (extlen + idlen > 0xFFF0)
606 return NULL;
607 s2n(extlen + idlen + 5, ret);
608 *(ret++) = TLSEXT_STATUSTYPE_ocsp;
609 s2n(idlen, ret);
610 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
611 {
612 /* save position of id len */
613 unsigned char *q = ret;
614 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
615 /* skip over id len */
616 ret += 2;
617 itmp = i2d_OCSP_RESPID(id, &ret);
618 /* write id len */
619 s2n(itmp, q);
620 }
621 s2n(extlen, ret);
622 if (extlen > 0)
623 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
624 }
625
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700626#ifndef OPENSSL_NO_HEARTBEATS
627 /* Add Heartbeat extension */
628 s2n(TLSEXT_TYPE_heartbeat,ret);
629 s2n(1,ret);
630 /* Set mode:
631 * 1: peer may send requests
632 * 2: peer not allowed to send requests
633 */
634 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
635 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
636 else
637 *(ret++) = SSL_TLSEXT_HB_ENABLED;
638#endif
639
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000640#ifndef OPENSSL_NO_NEXTPROTONEG
641 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
642 {
643 /* The client advertises an emtpy extension to indicate its
644 * support for Next Protocol Negotiation */
645 if (limit - ret - 4 < 0)
646 return NULL;
647 s2n(TLSEXT_TYPE_next_proto_neg,ret);
648 s2n(0,ret);
649 }
650#endif
651
Adam Langley45bcfbc2013-01-16 13:43:53 -0800652 if (s->tlsext_channel_id_enabled)
653 {
654 /* The client advertises an emtpy extension to indicate its
655 * support for Channel ID. */
656 if (limit - ret - 4 < 0)
657 return NULL;
658 s2n(TLSEXT_TYPE_channel_id,ret);
659 s2n(0,ret);
660 }
661
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700662 if(SSL_get_srtp_profiles(s))
663 {
664 int el;
665
666 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
667
668 if((limit - p - 4 - el) < 0) return NULL;
669
670 s2n(TLSEXT_TYPE_use_srtp,ret);
671 s2n(el,ret);
672
673 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
674 {
675 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
676 return NULL;
677 }
678 ret += el;
679 }
680
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800681 if ((extdatalen = ret-p-2)== 0)
682 return p;
683
684 s2n(extdatalen,p);
685 return ret;
686 }
687
688unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
689 {
690 int extdatalen=0;
691 unsigned char *ret = p;
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000692#ifndef OPENSSL_NO_NEXTPROTONEG
693 int next_proto_neg_seen;
694#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800695
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800696 /* don't add extensions for SSLv3, unless doing secure renegotiation */
697 if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
698 return p;
699
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800700 ret+=2;
701 if (ret>=limit) return NULL; /* this really never occurs, but ... */
702
703 if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
704 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700705 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800706
707 s2n(TLSEXT_TYPE_server_name,ret);
708 s2n(0,ret);
709 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800710
711 if(s->s3->send_connection_binding)
712 {
713 int el;
714
715 if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
716 {
717 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
718 return NULL;
719 }
720
721 if((limit - p - 4 - el) < 0) return NULL;
722
723 s2n(TLSEXT_TYPE_renegotiate,ret);
724 s2n(el,ret);
725
726 if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
727 {
728 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
729 return NULL;
730 }
731
732 ret += el;
733 }
Brian Carlstrom221304e2010-04-15 14:22:36 -0700734
735#ifndef OPENSSL_NO_EC
736 if (s->tlsext_ecpointformatlist != NULL &&
737 s->version != DTLS1_VERSION)
738 {
739 /* Add TLS extension ECPointFormats to the ServerHello message */
740 long lenmax;
741
742 if ((lenmax = limit - ret - 5) < 0) return NULL;
743 if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax) return NULL;
744 if (s->tlsext_ecpointformatlist_length > 255)
745 {
746 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
747 return NULL;
748 }
749
750 s2n(TLSEXT_TYPE_ec_point_formats,ret);
751 s2n(s->tlsext_ecpointformatlist_length + 1,ret);
752 *(ret++) = (unsigned char) s->tlsext_ecpointformatlist_length;
753 memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length);
754 ret+=s->tlsext_ecpointformatlist_length;
755
756 }
757 /* Currently the server should not respond with a SupportedCurves extension */
758#endif /* OPENSSL_NO_EC */
759
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800760 if (s->tlsext_ticket_expected
761 && !(SSL_get_options(s) & SSL_OP_NO_TICKET))
762 {
Brian Carlstrom221304e2010-04-15 14:22:36 -0700763 if ((long)(limit - ret - 4) < 0) return NULL;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800764 s2n(TLSEXT_TYPE_session_ticket,ret);
765 s2n(0,ret);
766 }
767
768 if (s->tlsext_status_expected)
769 {
770 if ((long)(limit - ret - 4) < 0) return NULL;
771 s2n(TLSEXT_TYPE_status_request,ret);
772 s2n(0,ret);
773 }
774
Brian Carlstrom221304e2010-04-15 14:22:36 -0700775#ifdef TLSEXT_TYPE_opaque_prf_input
776 if (s->s3->server_opaque_prf_input != NULL &&
777 s->version != DTLS1_VERSION)
778 {
779 size_t sol = s->s3->server_opaque_prf_input_len;
780
781 if ((long)(limit - ret - 6 - sol) < 0)
782 return NULL;
783 if (sol > 0xFFFD) /* can't happen */
784 return NULL;
785
786 s2n(TLSEXT_TYPE_opaque_prf_input, ret);
787 s2n(sol + 2, ret);
788 s2n(sol, ret);
789 memcpy(ret, s->s3->server_opaque_prf_input, sol);
790 ret += sol;
791 }
792#endif
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700793
794 if(s->srtp_profile)
795 {
796 int el;
797
798 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
799
800 if((limit - p - 4 - el) < 0) return NULL;
801
802 s2n(TLSEXT_TYPE_use_srtp,ret);
803 s2n(el,ret);
804
805 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
806 {
807 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
808 return NULL;
809 }
810 ret+=el;
811 }
812
Brian Carlstrom221304e2010-04-15 14:22:36 -0700813 if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81)
814 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
815 { const unsigned char cryptopro_ext[36] = {
816 0xfd, 0xe8, /*65000*/
817 0x00, 0x20, /*32 bytes length*/
818 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
819 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
820 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
821 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
822 if (limit-ret<36) return NULL;
823 memcpy(ret,cryptopro_ext,36);
824 ret+=36;
825
826 }
827
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700828#ifndef OPENSSL_NO_HEARTBEATS
829 /* Add Heartbeat extension if we've received one */
830 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
831 {
832 s2n(TLSEXT_TYPE_heartbeat,ret);
833 s2n(1,ret);
834 /* Set mode:
835 * 1: peer may send requests
836 * 2: peer not allowed to send requests
837 */
838 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
839 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
840 else
841 *(ret++) = SSL_TLSEXT_HB_ENABLED;
842
843 }
844#endif
845
Kristian Monsenbf9ac262010-11-29 16:05:31 +0000846#ifndef OPENSSL_NO_NEXTPROTONEG
847 next_proto_neg_seen = s->s3->next_proto_neg_seen;
848 s->s3->next_proto_neg_seen = 0;
849 if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
850 {
851 const unsigned char *npa;
852 unsigned int npalen;
853 int r;
854
855 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
856 if (r == SSL_TLSEXT_ERR_OK)
857 {
858 if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
859 s2n(TLSEXT_TYPE_next_proto_neg,ret);
860 s2n(npalen,ret);
861 memcpy(ret, npa, npalen);
862 ret += npalen;
863 s->s3->next_proto_neg_seen = 1;
864 }
865 }
866#endif
867
Adam Langley45bcfbc2013-01-16 13:43:53 -0800868 /* If the client advertised support for Channel ID, and we have it
869 * enabled, then we want to echo it back. */
870 if (s->s3->tlsext_channel_id_valid)
871 {
872 if (limit - ret - 4 < 0)
873 return NULL;
874 s2n(TLSEXT_TYPE_channel_id,ret);
875 s2n(0,ret);
876 }
877
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800878 if ((extdatalen = ret-p-2)== 0)
879 return p;
880
881 s2n(extdatalen,p);
882 return ret;
883 }
884
885int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
886 {
887 unsigned short type;
888 unsigned short size;
889 unsigned short len;
890 unsigned char *data = *p;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800891 int renegotiate_seen = 0;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700892 int sigalg_seen = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800893
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800894 s->servername_done = 0;
895 s->tlsext_status_type = -1;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -0700896#ifndef OPENSSL_NO_NEXTPROTONEG
897 s->s3->next_proto_neg_seen = 0;
898#endif
899
900#ifndef OPENSSL_NO_HEARTBEATS
901 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
902 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
903#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800904
905 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800906 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800907 n2s(data,len);
908
909 if (data > (d+n-len))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800910 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800911
912 while (data <= (d+n-4))
913 {
914 n2s(data,type);
915 n2s(data,size);
916
917 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -0800918 goto ri_check;
Brian Carlstrom221304e2010-04-15 14:22:36 -0700919#if 0
920 fprintf(stderr,"Received extension type %d size %d\n",type,size);
921#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800922 if (s->tlsext_debug_cb)
923 s->tlsext_debug_cb(s, 0, type, data, size,
924 s->tlsext_debug_arg);
925/* The servername extension is treated as follows:
926
927 - Only the hostname type is supported with a maximum length of 255.
928 - The servername is rejected if too long or if it contains zeros,
929 in which case an fatal alert is generated.
930 - The servername field is maintained together with the session cache.
931 - When a session is resumed, the servername call back invoked in order
932 to allow the application to position itself to the right context.
933 - The servername is acknowledged if it is new for a session or when
934 it is identical to a previously used for the same session.
935 Applications can control the behaviour. They can at any time
936 set a 'desirable' servername for a new SSL object. This can be the
937 case for example with HTTPS when a Host: header field is received and
938 a renegotiation is requested. In this case, a possible servername
939 presented in the new client hello is only acknowledged if it matches
940 the value of the Host: field.
941 - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
942 if they provide for changing an explicit servername context for the session,
943 i.e. when the session has been established with a servername extension.
944 - On session reconnect, the servername extension may be absent.
945
946*/
947
948 if (type == TLSEXT_TYPE_server_name)
949 {
950 unsigned char *sdata;
951 int servname_type;
952 int dsize;
953
954 if (size < 2)
955 {
956 *al = SSL_AD_DECODE_ERROR;
957 return 0;
958 }
959 n2s(data,dsize);
960 size -= 2;
961 if (dsize > size )
962 {
963 *al = SSL_AD_DECODE_ERROR;
964 return 0;
965 }
966
967 sdata = data;
968 while (dsize > 3)
969 {
970 servname_type = *(sdata++);
971 n2s(sdata,len);
972 dsize -= 3;
973
974 if (len > dsize)
975 {
976 *al = SSL_AD_DECODE_ERROR;
977 return 0;
978 }
979 if (s->servername_done == 0)
980 switch (servname_type)
981 {
982 case TLSEXT_NAMETYPE_host_name:
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800983 if (!s->hit)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800984 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800985 if(s->session->tlsext_hostname)
986 {
987 *al = SSL_AD_DECODE_ERROR;
988 return 0;
989 }
990 if (len > TLSEXT_MAXLEN_host_name)
The Android Open Source Project656d9c72009-03-03 19:30:25 -0800991 {
992 *al = TLS1_AD_UNRECOGNIZED_NAME;
993 return 0;
994 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -0800995 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
996 {
997 *al = TLS1_AD_INTERNAL_ERROR;
998 return 0;
999 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001000 memcpy(s->session->tlsext_hostname, sdata, len);
1001 s->session->tlsext_hostname[len]='\0';
1002 if (strlen(s->session->tlsext_hostname) != len) {
1003 OPENSSL_free(s->session->tlsext_hostname);
1004 s->session->tlsext_hostname = NULL;
1005 *al = TLS1_AD_UNRECOGNIZED_NAME;
1006 return 0;
1007 }
1008 s->servername_done = 1;
1009
1010 }
1011 else
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001012 s->servername_done = s->session->tlsext_hostname
1013 && strlen(s->session->tlsext_hostname) == len
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001014 && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
1015
1016 break;
1017
1018 default:
1019 break;
1020 }
1021
1022 dsize -= len;
1023 }
1024 if (dsize != 0)
1025 {
1026 *al = SSL_AD_DECODE_ERROR;
1027 return 0;
1028 }
1029
1030 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001031#ifndef OPENSSL_NO_SRP
1032 else if (type == TLSEXT_TYPE_srp)
1033 {
1034 if (size <= 0 || ((len = data[0])) != (size -1))
1035 {
1036 *al = SSL_AD_DECODE_ERROR;
1037 return 0;
1038 }
1039 if (s->srp_ctx.login != NULL)
1040 {
1041 *al = SSL_AD_DECODE_ERROR;
1042 return 0;
1043 }
1044 if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
1045 return -1;
1046 memcpy(s->srp_ctx.login, &data[1], len);
1047 s->srp_ctx.login[len]='\0';
1048
1049 if (strlen(s->srp_ctx.login) != len)
1050 {
1051 *al = SSL_AD_DECODE_ERROR;
1052 return 0;
1053 }
1054 }
1055#endif
Brian Carlstrom221304e2010-04-15 14:22:36 -07001056
1057#ifndef OPENSSL_NO_EC
1058 else if (type == TLSEXT_TYPE_ec_point_formats &&
1059 s->version != DTLS1_VERSION)
1060 {
1061 unsigned char *sdata = data;
1062 int ecpointformatlist_length = *(sdata++);
1063
1064 if (ecpointformatlist_length != size - 1)
1065 {
1066 *al = TLS1_AD_DECODE_ERROR;
1067 return 0;
1068 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001069 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001070 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001071 if(s->session->tlsext_ecpointformatlist)
1072 {
Brian Carlstrom976a0342010-12-03 16:11:54 -08001073 OPENSSL_free(s->session->tlsext_ecpointformatlist);
1074 s->session->tlsext_ecpointformatlist = NULL;
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001075 }
1076 s->session->tlsext_ecpointformatlist_length = 0;
1077 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1078 {
1079 *al = TLS1_AD_INTERNAL_ERROR;
1080 return 0;
1081 }
1082 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1083 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001084 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001085#if 0
1086 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
1087 sdata = s->session->tlsext_ecpointformatlist;
1088 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1089 fprintf(stderr,"%i ",*(sdata++));
1090 fprintf(stderr,"\n");
1091#endif
1092 }
1093 else if (type == TLSEXT_TYPE_elliptic_curves &&
1094 s->version != DTLS1_VERSION)
1095 {
1096 unsigned char *sdata = data;
1097 int ellipticcurvelist_length = (*(sdata++) << 8);
1098 ellipticcurvelist_length += (*(sdata++));
1099
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001100 if (ellipticcurvelist_length != size - 2 ||
1101 ellipticcurvelist_length < 1)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001102 {
1103 *al = TLS1_AD_DECODE_ERROR;
1104 return 0;
1105 }
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001106 if (!s->hit)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001107 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001108 if(s->session->tlsext_ellipticcurvelist)
1109 {
1110 *al = TLS1_AD_DECODE_ERROR;
1111 return 0;
1112 }
1113 s->session->tlsext_ellipticcurvelist_length = 0;
1114 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
1115 {
1116 *al = TLS1_AD_INTERNAL_ERROR;
1117 return 0;
1118 }
1119 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
1120 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001121 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001122#if 0
1123 fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
1124 sdata = s->session->tlsext_ellipticcurvelist;
1125 for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
1126 fprintf(stderr,"%i ",*(sdata++));
1127 fprintf(stderr,"\n");
1128#endif
1129 }
1130#endif /* OPENSSL_NO_EC */
1131#ifdef TLSEXT_TYPE_opaque_prf_input
1132 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1133 s->version != DTLS1_VERSION)
1134 {
1135 unsigned char *sdata = data;
1136
1137 if (size < 2)
1138 {
1139 *al = SSL_AD_DECODE_ERROR;
1140 return 0;
1141 }
1142 n2s(sdata, s->s3->client_opaque_prf_input_len);
1143 if (s->s3->client_opaque_prf_input_len != size - 2)
1144 {
1145 *al = SSL_AD_DECODE_ERROR;
1146 return 0;
1147 }
1148
1149 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1150 OPENSSL_free(s->s3->client_opaque_prf_input);
1151 if (s->s3->client_opaque_prf_input_len == 0)
1152 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1153 else
1154 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
1155 if (s->s3->client_opaque_prf_input == NULL)
1156 {
1157 *al = TLS1_AD_INTERNAL_ERROR;
1158 return 0;
1159 }
1160 }
1161#endif
1162 else if (type == TLSEXT_TYPE_session_ticket)
1163 {
1164 if (s->tls_session_ticket_ext_cb &&
1165 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1166 {
1167 *al = TLS1_AD_INTERNAL_ERROR;
1168 return 0;
1169 }
1170 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001171 else if (type == TLSEXT_TYPE_renegotiate)
1172 {
1173 if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1174 return 0;
1175 renegotiate_seen = 1;
1176 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001177 else if (type == TLSEXT_TYPE_signature_algorithms)
1178 {
1179 int dsize;
1180 if (sigalg_seen || size < 2)
1181 {
1182 *al = SSL_AD_DECODE_ERROR;
1183 return 0;
1184 }
1185 sigalg_seen = 1;
1186 n2s(data,dsize);
1187 size -= 2;
1188 if (dsize != size || dsize & 1)
1189 {
1190 *al = SSL_AD_DECODE_ERROR;
1191 return 0;
1192 }
1193 if (!tls1_process_sigalgs(s, data, dsize))
1194 {
1195 *al = SSL_AD_DECODE_ERROR;
1196 return 0;
1197 }
1198 }
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001199 else if (type == TLSEXT_TYPE_status_request &&
1200 s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001201 {
1202
1203 if (size < 5)
1204 {
1205 *al = SSL_AD_DECODE_ERROR;
1206 return 0;
1207 }
1208
1209 s->tlsext_status_type = *data++;
1210 size--;
1211 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
1212 {
1213 const unsigned char *sdata;
1214 int dsize;
1215 /* Read in responder_id_list */
1216 n2s(data,dsize);
1217 size -= 2;
1218 if (dsize > size )
1219 {
1220 *al = SSL_AD_DECODE_ERROR;
1221 return 0;
1222 }
1223 while (dsize > 0)
1224 {
1225 OCSP_RESPID *id;
1226 int idsize;
1227 if (dsize < 4)
1228 {
1229 *al = SSL_AD_DECODE_ERROR;
1230 return 0;
1231 }
1232 n2s(data, idsize);
1233 dsize -= 2 + idsize;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001234 size -= 2 + idsize;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001235 if (dsize < 0)
1236 {
1237 *al = SSL_AD_DECODE_ERROR;
1238 return 0;
1239 }
1240 sdata = data;
1241 data += idsize;
1242 id = d2i_OCSP_RESPID(NULL,
1243 &sdata, idsize);
1244 if (!id)
1245 {
1246 *al = SSL_AD_DECODE_ERROR;
1247 return 0;
1248 }
1249 if (data != sdata)
1250 {
1251 OCSP_RESPID_free(id);
1252 *al = SSL_AD_DECODE_ERROR;
1253 return 0;
1254 }
1255 if (!s->tlsext_ocsp_ids
1256 && !(s->tlsext_ocsp_ids =
1257 sk_OCSP_RESPID_new_null()))
1258 {
1259 OCSP_RESPID_free(id);
1260 *al = SSL_AD_INTERNAL_ERROR;
1261 return 0;
1262 }
1263 if (!sk_OCSP_RESPID_push(
1264 s->tlsext_ocsp_ids, id))
1265 {
1266 OCSP_RESPID_free(id);
1267 *al = SSL_AD_INTERNAL_ERROR;
1268 return 0;
1269 }
1270 }
1271
1272 /* Read in request_extensions */
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001273 if (size < 2)
1274 {
1275 *al = SSL_AD_DECODE_ERROR;
1276 return 0;
1277 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001278 n2s(data,dsize);
1279 size -= 2;
Brian Carlstrom81c4de72011-02-08 14:54:39 -08001280 if (dsize != size)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001281 {
1282 *al = SSL_AD_DECODE_ERROR;
1283 return 0;
1284 }
1285 sdata = data;
1286 if (dsize > 0)
1287 {
Brian Carlstrom7b476c42012-01-04 13:22:32 -08001288 if (s->tlsext_ocsp_exts)
1289 {
1290 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1291 X509_EXTENSION_free);
1292 }
1293
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001294 s->tlsext_ocsp_exts =
1295 d2i_X509_EXTENSIONS(NULL,
1296 &sdata, dsize);
1297 if (!s->tlsext_ocsp_exts
1298 || (data + dsize != sdata))
1299 {
1300 *al = SSL_AD_DECODE_ERROR;
1301 return 0;
1302 }
1303 }
1304 }
1305 /* We don't know what to do with any other type
1306 * so ignore it.
1307 */
1308 else
1309 s->tlsext_status_type = -1;
1310 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001311#ifndef OPENSSL_NO_HEARTBEATS
1312 else if (type == TLSEXT_TYPE_heartbeat)
1313 {
1314 switch(data[0])
1315 {
1316 case 0x01: /* Client allows us to send HB requests */
1317 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1318 break;
1319 case 0x02: /* Client doesn't accept HB requests */
1320 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1321 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1322 break;
1323 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1324 return 0;
1325 }
1326 }
1327#endif
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001328#ifndef OPENSSL_NO_NEXTPROTONEG
1329 else if (type == TLSEXT_TYPE_next_proto_neg &&
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001330 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001331 {
1332 /* We shouldn't accept this extension on a
1333 * renegotiation.
1334 *
1335 * s->new_session will be set on renegotiation, but we
1336 * probably shouldn't rely that it couldn't be set on
1337 * the initial renegotation too in certain cases (when
1338 * there's some other reason to disallow resuming an
1339 * earlier session -- the current code won't be doing
1340 * anything like that, but this might change).
1341
1342 * A valid sign that there's been a previous handshake
1343 * in this connection is if s->s3->tmp.finish_md_len >
1344 * 0. (We are talking about a check that will happen
1345 * in the Hello protocol round, well before a new
1346 * Finished message could have been computed.) */
1347 s->s3->next_proto_neg_seen = 1;
1348 }
1349#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001350
Adam Langley45bcfbc2013-01-16 13:43:53 -08001351 else if (type == TLSEXT_TYPE_channel_id && s->tlsext_channel_id_enabled)
1352 s->s3->tlsext_channel_id_valid = 1;
1353
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001354 /* session ticket processed earlier */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001355 else if (type == TLSEXT_TYPE_use_srtp)
1356 {
1357 if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
1358 al))
1359 return 0;
1360 }
1361
Brian Carlstrom221304e2010-04-15 14:22:36 -07001362 data+=size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001363 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001364
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001365 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001366
1367 ri_check:
1368
1369 /* Need RI if renegotiating */
1370
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001371 if (!renegotiate_seen && s->renegotiate &&
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001372 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1373 {
1374 *al = SSL_AD_HANDSHAKE_FAILURE;
1375 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1376 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1377 return 0;
1378 }
1379
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001380 return 1;
1381 }
1382
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001383#ifndef OPENSSL_NO_NEXTPROTONEG
1384/* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1385 * elements of zero length are allowed and the set of elements must exactly fill
1386 * the length of the block. */
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001387static char ssl_next_proto_validate(unsigned char *d, unsigned len)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001388 {
1389 unsigned int off = 0;
1390
1391 while (off < len)
1392 {
1393 if (d[off] == 0)
1394 return 0;
1395 off += d[off];
1396 off++;
1397 }
1398
1399 return off == len;
1400 }
1401#endif
1402
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001403int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
1404 {
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001405 unsigned short length;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001406 unsigned short type;
1407 unsigned short size;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001408 unsigned char *data = *p;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001409 int tlsext_servername = 0;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001410 int renegotiate_seen = 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001411
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001412#ifndef OPENSSL_NO_NEXTPROTONEG
1413 s->s3->next_proto_neg_seen = 0;
1414#endif
1415
1416#ifndef OPENSSL_NO_HEARTBEATS
1417 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1418 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1419#endif
1420
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001421 if (data >= (d+n-2))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001422 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001423
Brian Carlstrom43c12e32010-11-16 11:19:35 -08001424 n2s(data,length);
1425 if (data+length != d+n)
1426 {
1427 *al = SSL_AD_DECODE_ERROR;
1428 return 0;
1429 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001430
1431 while(data <= (d+n-4))
1432 {
1433 n2s(data,type);
1434 n2s(data,size);
1435
1436 if (data+size > (d+n))
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001437 goto ri_check;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001438
1439 if (s->tlsext_debug_cb)
1440 s->tlsext_debug_cb(s, 1, type, data, size,
1441 s->tlsext_debug_arg);
1442
1443 if (type == TLSEXT_TYPE_server_name)
1444 {
1445 if (s->tlsext_hostname == NULL || size > 0)
1446 {
1447 *al = TLS1_AD_UNRECOGNIZED_NAME;
1448 return 0;
1449 }
1450 tlsext_servername = 1;
1451 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001452
1453#ifndef OPENSSL_NO_EC
1454 else if (type == TLSEXT_TYPE_ec_point_formats &&
1455 s->version != DTLS1_VERSION)
1456 {
1457 unsigned char *sdata = data;
1458 int ecpointformatlist_length = *(sdata++);
1459
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001460 if (ecpointformatlist_length != size - 1 ||
1461 ecpointformatlist_length < 1)
Brian Carlstrom221304e2010-04-15 14:22:36 -07001462 {
1463 *al = TLS1_AD_DECODE_ERROR;
1464 return 0;
1465 }
1466 s->session->tlsext_ecpointformatlist_length = 0;
1467 if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
1468 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
1469 {
1470 *al = TLS1_AD_INTERNAL_ERROR;
1471 return 0;
1472 }
1473 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
1474 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
1475#if 0
1476 fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1477 sdata = s->session->tlsext_ecpointformatlist;
1478 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1479 fprintf(stderr,"%i ",*(sdata++));
1480 fprintf(stderr,"\n");
1481#endif
1482 }
1483#endif /* OPENSSL_NO_EC */
1484
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001485 else if (type == TLSEXT_TYPE_session_ticket)
1486 {
Brian Carlstrom221304e2010-04-15 14:22:36 -07001487 if (s->tls_session_ticket_ext_cb &&
1488 !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
1489 {
1490 *al = TLS1_AD_INTERNAL_ERROR;
1491 return 0;
1492 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001493 if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1494 || (size > 0))
1495 {
1496 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1497 return 0;
1498 }
1499 s->tlsext_ticket_expected = 1;
1500 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001501#ifdef TLSEXT_TYPE_opaque_prf_input
1502 else if (type == TLSEXT_TYPE_opaque_prf_input &&
1503 s->version != DTLS1_VERSION)
1504 {
1505 unsigned char *sdata = data;
1506
1507 if (size < 2)
1508 {
1509 *al = SSL_AD_DECODE_ERROR;
1510 return 0;
1511 }
1512 n2s(sdata, s->s3->server_opaque_prf_input_len);
1513 if (s->s3->server_opaque_prf_input_len != size - 2)
1514 {
1515 *al = SSL_AD_DECODE_ERROR;
1516 return 0;
1517 }
1518
1519 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1520 OPENSSL_free(s->s3->server_opaque_prf_input);
1521 if (s->s3->server_opaque_prf_input_len == 0)
1522 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1523 else
1524 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1525
1526 if (s->s3->server_opaque_prf_input == NULL)
1527 {
1528 *al = TLS1_AD_INTERNAL_ERROR;
1529 return 0;
1530 }
1531 }
1532#endif
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001533 else if (type == TLSEXT_TYPE_status_request &&
1534 s->version != DTLS1_VERSION)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001535 {
1536 /* MUST be empty and only sent if we've requested
1537 * a status request message.
1538 */
1539 if ((s->tlsext_status_type == -1) || (size > 0))
1540 {
1541 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1542 return 0;
1543 }
1544 /* Set flag to expect CertificateStatus message */
1545 s->tlsext_status_expected = 1;
1546 }
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001547#ifndef OPENSSL_NO_NEXTPROTONEG
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001548 else if (type == TLSEXT_TYPE_next_proto_neg &&
1549 s->s3->tmp.finish_md_len == 0)
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001550 {
1551 unsigned char *selected;
1552 unsigned char selected_len;
1553
1554 /* We must have requested it. */
1555 if ((s->ctx->next_proto_select_cb == NULL))
1556 {
1557 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1558 return 0;
1559 }
1560 /* The data must be valid */
1561 if (!ssl_next_proto_validate(data, size))
1562 {
1563 *al = TLS1_AD_DECODE_ERROR;
1564 return 0;
1565 }
1566 if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
1567 {
1568 *al = TLS1_AD_INTERNAL_ERROR;
1569 return 0;
1570 }
1571 s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1572 if (!s->next_proto_negotiated)
1573 {
1574 *al = TLS1_AD_INTERNAL_ERROR;
1575 return 0;
1576 }
1577 memcpy(s->next_proto_negotiated, selected, selected_len);
1578 s->next_proto_negotiated_len = selected_len;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001579 s->s3->next_proto_neg_seen = 1;
Kristian Monsenbf9ac262010-11-29 16:05:31 +00001580 }
1581#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08001582 else if (type == TLSEXT_TYPE_channel_id)
1583 s->s3->tlsext_channel_id_valid = 1;
1584
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001585 else if (type == TLSEXT_TYPE_renegotiate)
1586 {
1587 if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1588 return 0;
1589 renegotiate_seen = 1;
1590 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001591#ifndef OPENSSL_NO_HEARTBEATS
1592 else if (type == TLSEXT_TYPE_heartbeat)
1593 {
1594 switch(data[0])
1595 {
1596 case 0x01: /* Server allows us to send HB requests */
1597 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1598 break;
1599 case 0x02: /* Server doesn't accept HB requests */
1600 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1601 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1602 break;
1603 default: *al = SSL_AD_ILLEGAL_PARAMETER;
1604 return 0;
1605 }
1606 }
1607#endif
1608 else if (type == TLSEXT_TYPE_use_srtp)
1609 {
1610 if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
1611 al))
1612 return 0;
1613 }
1614
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001615 data+=size;
1616 }
1617
1618 if (data != d+n)
1619 {
1620 *al = SSL_AD_DECODE_ERROR;
1621 return 0;
1622 }
1623
1624 if (!s->hit && tlsext_servername == 1)
1625 {
1626 if (s->tlsext_hostname)
1627 {
1628 if (s->session->tlsext_hostname == NULL)
1629 {
1630 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1631 if (!s->session->tlsext_hostname)
1632 {
1633 *al = SSL_AD_UNRECOGNIZED_NAME;
1634 return 0;
1635 }
1636 }
1637 else
1638 {
1639 *al = SSL_AD_DECODE_ERROR;
1640 return 0;
1641 }
1642 }
1643 }
1644
1645 *p = data;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08001646
1647 ri_check:
1648
1649 /* Determine if we need to see RI. Strictly speaking if we want to
1650 * avoid an attack we should *always* see RI even on initial server
1651 * hello because the client doesn't see any renegotiation during an
1652 * attack. However this would mean we could not connect to any server
1653 * which doesn't support RI so for the immediate future tolerate RI
1654 * absence on initial connect only.
1655 */
1656 if (!renegotiate_seen
1657 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1658 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
1659 {
1660 *al = SSL_AD_HANDSHAKE_FAILURE;
1661 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1662 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1663 return 0;
1664 }
1665
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001666 return 1;
1667 }
1668
Brian Carlstrom221304e2010-04-15 14:22:36 -07001669
1670int ssl_prepare_clienthello_tlsext(SSL *s)
1671 {
1672#ifndef OPENSSL_NO_EC
1673 /* If we are client and using an elliptic curve cryptography cipher suite, send the point formats
1674 * and elliptic curves we support.
1675 */
1676 int using_ecc = 0;
1677 int i;
1678 unsigned char *j;
1679 unsigned long alg_k, alg_a;
1680 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1681
1682 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
1683 {
1684 SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1685
1686 alg_k = c->algorithm_mkey;
1687 alg_a = c->algorithm_auth;
1688 if ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe) || (alg_a & SSL_aECDSA)))
1689 {
1690 using_ecc = 1;
1691 break;
1692 }
1693 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001694 using_ecc = using_ecc && (s->version >= TLS1_VERSION);
Brian Carlstrom221304e2010-04-15 14:22:36 -07001695 if (using_ecc)
1696 {
1697 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1698 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1699 {
1700 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1701 return -1;
1702 }
1703 s->tlsext_ecpointformatlist_length = 3;
1704 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1705 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1706 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1707
1708 /* we support all named elliptic curves in draft-ietf-tls-ecc-12 */
1709 if (s->tlsext_ellipticcurvelist != NULL) OPENSSL_free(s->tlsext_ellipticcurvelist);
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001710 s->tlsext_ellipticcurvelist_length = sizeof(pref_list)/sizeof(pref_list[0]) * 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001711 if ((s->tlsext_ellipticcurvelist = OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL)
1712 {
1713 s->tlsext_ellipticcurvelist_length = 0;
1714 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1715 return -1;
1716 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07001717 for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1718 sizeof(pref_list)/sizeof(pref_list[0]); i++)
1719 {
1720 int id = tls1_ec_nid2curve_id(pref_list[i]);
1721 s2n(id,j);
1722 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07001723 }
1724#endif /* OPENSSL_NO_EC */
1725
1726#ifdef TLSEXT_TYPE_opaque_prf_input
1727 {
1728 int r = 1;
1729
1730 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1731 {
1732 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1733 if (!r)
1734 return -1;
1735 }
1736
1737 if (s->tlsext_opaque_prf_input != NULL)
1738 {
1739 if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
1740 OPENSSL_free(s->s3->client_opaque_prf_input);
1741
1742 if (s->tlsext_opaque_prf_input_len == 0)
1743 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1744 else
1745 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1746 if (s->s3->client_opaque_prf_input == NULL)
1747 {
1748 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1749 return -1;
1750 }
1751 s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1752 }
1753
1754 if (r == 2)
1755 /* at callback's request, insist on receiving an appropriate server opaque PRF input */
1756 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1757 }
1758#endif
1759
1760 return 1;
1761 }
1762
1763int ssl_prepare_serverhello_tlsext(SSL *s)
1764 {
1765#ifndef OPENSSL_NO_EC
1766 /* If we are server and using an ECC cipher suite, send the point formats we support
1767 * if the client sent us an ECPointsFormat extension. Note that the server is not
1768 * supposed to send an EllipticCurves extension.
1769 */
1770
1771 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1772 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1773 int using_ecc = (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
1774 using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1775
1776 if (using_ecc)
1777 {
1778 if (s->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->tlsext_ecpointformatlist);
1779 if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL)
1780 {
1781 SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
1782 return -1;
1783 }
1784 s->tlsext_ecpointformatlist_length = 3;
1785 s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1786 s->tlsext_ecpointformatlist[1] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1787 s->tlsext_ecpointformatlist[2] = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1788 }
1789#endif /* OPENSSL_NO_EC */
1790
1791 return 1;
1792 }
1793
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001794int ssl_check_clienthello_tlsext_early(SSL *s)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001795 {
1796 int ret=SSL_TLSEXT_ERR_NOACK;
1797 int al = SSL_AD_UNRECOGNIZED_NAME;
1798
Brian Carlstrom221304e2010-04-15 14:22:36 -07001799#ifndef OPENSSL_NO_EC
1800 /* The handling of the ECPointFormats extension is done elsewhere, namely in
1801 * ssl3_choose_cipher in s3_lib.c.
1802 */
1803 /* The handling of the EllipticCurves extension is done elsewhere, namely in
1804 * ssl3_choose_cipher in s3_lib.c.
1805 */
1806#endif
1807
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001808 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1809 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1810 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1811 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1812
Brian Carlstrom221304e2010-04-15 14:22:36 -07001813#ifdef TLSEXT_TYPE_opaque_prf_input
1814 {
1815 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
1816 * but we might be sending an alert in response to the client hello,
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001817 * so this has to happen here in
1818 * ssl_check_clienthello_tlsext_early(). */
Brian Carlstrom221304e2010-04-15 14:22:36 -07001819
1820 int r = 1;
1821
1822 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
1823 {
1824 r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
1825 if (!r)
1826 {
1827 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1828 al = SSL_AD_INTERNAL_ERROR;
1829 goto err;
1830 }
1831 }
1832
1833 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
1834 OPENSSL_free(s->s3->server_opaque_prf_input);
1835 s->s3->server_opaque_prf_input = NULL;
1836
1837 if (s->tlsext_opaque_prf_input != NULL)
1838 {
1839 if (s->s3->client_opaque_prf_input != NULL &&
1840 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
1841 {
1842 /* can only use this extension if we have a server opaque PRF input
1843 * of the same length as the client opaque PRF input! */
1844
1845 if (s->tlsext_opaque_prf_input_len == 0)
1846 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
1847 else
1848 s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
1849 if (s->s3->server_opaque_prf_input == NULL)
1850 {
1851 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1852 al = SSL_AD_INTERNAL_ERROR;
1853 goto err;
1854 }
1855 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
1856 }
1857 }
1858
1859 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
1860 {
1861 /* The callback wants to enforce use of the extension,
1862 * but we can't do that with the client opaque PRF input;
1863 * abort the handshake.
1864 */
1865 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1866 al = SSL_AD_HANDSHAKE_FAILURE;
1867 }
1868 }
1869
Brian Carlstrom221304e2010-04-15 14:22:36 -07001870 err:
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001871#endif
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001872 switch (ret)
1873 {
1874 case SSL_TLSEXT_ERR_ALERT_FATAL:
1875 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1876 return -1;
1877
1878 case SSL_TLSEXT_ERR_ALERT_WARNING:
1879 ssl3_send_alert(s,SSL3_AL_WARNING,al);
1880 return 1;
1881
1882 case SSL_TLSEXT_ERR_NOACK:
1883 s->servername_done=0;
1884 default:
1885 return 1;
1886 }
1887 }
1888
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08001889int ssl_check_clienthello_tlsext_late(SSL *s)
1890 {
1891 int ret = SSL_TLSEXT_ERR_OK;
1892 int al;
1893
1894 /* If status request then ask callback what to do.
1895 * Note: this must be called after servername callbacks in case
1896 * the certificate has changed, and must be called after the cipher
1897 * has been chosen because this may influence which certificate is sent
1898 */
1899 if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
1900 {
1901 int r;
1902 CERT_PKEY *certpkey;
1903 certpkey = ssl_get_server_send_pkey(s);
1904 /* If no certificate can't return certificate status */
1905 if (certpkey == NULL)
1906 {
1907 s->tlsext_status_expected = 0;
1908 return 1;
1909 }
1910 /* Set current certificate to one we will use so
1911 * SSL_get_certificate et al can pick it up.
1912 */
1913 s->cert->key = certpkey;
1914 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1915 switch (r)
1916 {
1917 /* We don't want to send a status request response */
1918 case SSL_TLSEXT_ERR_NOACK:
1919 s->tlsext_status_expected = 0;
1920 break;
1921 /* status request response should be sent */
1922 case SSL_TLSEXT_ERR_OK:
1923 if (s->tlsext_ocsp_resp)
1924 s->tlsext_status_expected = 1;
1925 else
1926 s->tlsext_status_expected = 0;
1927 break;
1928 /* something bad happened */
1929 case SSL_TLSEXT_ERR_ALERT_FATAL:
1930 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1931 al = SSL_AD_INTERNAL_ERROR;
1932 goto err;
1933 }
1934 }
1935 else
1936 s->tlsext_status_expected = 0;
1937
1938 err:
1939 switch (ret)
1940 {
1941 case SSL_TLSEXT_ERR_ALERT_FATAL:
1942 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1943 return -1;
1944
1945 case SSL_TLSEXT_ERR_ALERT_WARNING:
1946 ssl3_send_alert(s,SSL3_AL_WARNING,al);
1947 return 1;
1948
1949 default:
1950 return 1;
1951 }
1952 }
1953
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001954int ssl_check_serverhello_tlsext(SSL *s)
1955 {
1956 int ret=SSL_TLSEXT_ERR_NOACK;
1957 int al = SSL_AD_UNRECOGNIZED_NAME;
1958
Brian Carlstrom221304e2010-04-15 14:22:36 -07001959#ifndef OPENSSL_NO_EC
Brian Carlstrom976a0342010-12-03 16:11:54 -08001960 /* If we are client and using an elliptic curve cryptography cipher
1961 * suite, then if server returns an EC point formats lists extension
1962 * it must contain uncompressed.
Brian Carlstrom221304e2010-04-15 14:22:36 -07001963 */
1964 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1965 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1966 if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom976a0342010-12-03 16:11:54 -08001967 (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) &&
Brian Carlstrom221304e2010-04-15 14:22:36 -07001968 ((alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
1969 {
1970 /* we are using an ECC cipher */
1971 size_t i;
1972 unsigned char *list;
1973 int found_uncompressed = 0;
Brian Carlstrom221304e2010-04-15 14:22:36 -07001974 list = s->session->tlsext_ecpointformatlist;
1975 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1976 {
1977 if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
1978 {
1979 found_uncompressed = 1;
1980 break;
1981 }
1982 }
1983 if (!found_uncompressed)
1984 {
1985 SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
1986 return -1;
1987 }
1988 }
1989 ret = SSL_TLSEXT_ERR_OK;
1990#endif /* OPENSSL_NO_EC */
1991
The Android Open Source Project656d9c72009-03-03 19:30:25 -08001992 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1993 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
1994 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
1995 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
1996
Brian Carlstrom221304e2010-04-15 14:22:36 -07001997#ifdef TLSEXT_TYPE_opaque_prf_input
1998 if (s->s3->server_opaque_prf_input_len > 0)
1999 {
2000 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
2001 * So first verify that we really have a value from the server too. */
2002
2003 if (s->s3->server_opaque_prf_input == NULL)
2004 {
2005 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2006 al = SSL_AD_HANDSHAKE_FAILURE;
2007 }
2008
2009 /* Anytime the server *has* sent an opaque PRF input, we need to check
2010 * that we have a client opaque PRF input of the same size. */
2011 if (s->s3->client_opaque_prf_input == NULL ||
2012 s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
2013 {
2014 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2015 al = SSL_AD_ILLEGAL_PARAMETER;
2016 }
2017 }
2018#endif
2019
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002020 /* If we've requested certificate status and we wont get one
2021 * tell the callback
2022 */
2023 if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
Brian Carlstrom221304e2010-04-15 14:22:36 -07002024 && s->ctx && s->ctx->tlsext_status_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002025 {
2026 int r;
2027 /* Set resp to NULL, resplen to -1 so callback knows
2028 * there is no response.
2029 */
2030 if (s->tlsext_ocsp_resp)
2031 {
2032 OPENSSL_free(s->tlsext_ocsp_resp);
2033 s->tlsext_ocsp_resp = NULL;
2034 }
2035 s->tlsext_ocsp_resplen = -1;
2036 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2037 if (r == 0)
2038 {
2039 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2040 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2041 }
2042 if (r < 0)
2043 {
2044 al = SSL_AD_INTERNAL_ERROR;
2045 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2046 }
2047 }
2048
2049 switch (ret)
2050 {
2051 case SSL_TLSEXT_ERR_ALERT_FATAL:
2052 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2053 return -1;
2054
2055 case SSL_TLSEXT_ERR_ALERT_WARNING:
2056 ssl3_send_alert(s,SSL3_AL_WARNING,al);
2057 return 1;
2058
2059 case SSL_TLSEXT_ERR_NOACK:
2060 s->servername_done=0;
2061 default:
2062 return 1;
2063 }
2064 }
2065
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002066/* Since the server cache lookup is done early on in the processing of the
2067 * ClientHello, and other operations depend on the result, we need to handle
2068 * any TLS session ticket extension at the same time.
2069 *
2070 * session_id: points at the session ID in the ClientHello. This code will
2071 * read past the end of this in order to parse out the session ticket
2072 * extension, if any.
2073 * len: the length of the session ID.
2074 * limit: a pointer to the first byte after the ClientHello.
2075 * ret: (output) on return, if a ticket was decrypted, then this is set to
2076 * point to the resulting session.
2077 *
2078 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2079 * ciphersuite, in which case we have no use for session tickets and one will
2080 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2081 *
2082 * Returns:
2083 * -1: fatal error, either from parsing or decrypting the ticket.
2084 * 0: no ticket was found (or was ignored, based on settings).
2085 * 1: a zero length extension was found, indicating that the client supports
2086 * session tickets but doesn't currently have one to offer.
2087 * 2: either s->tls_session_secret_cb was set, or a ticket was offered but
2088 * couldn't be decrypted because of a non-fatal error.
2089 * 3: a ticket was successfully decrypted and *ret was set.
2090 *
2091 * Side effects:
2092 * Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2093 * a new session ticket to the client because the client indicated support
2094 * (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2095 * a session ticket or we couldn't use the one it gave us, or if
2096 * s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2097 * Otherwise, s->tlsext_ticket_expected is set to 0.
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002098 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002099int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002100 const unsigned char *limit, SSL_SESSION **ret)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002101 {
2102 /* Point after session ID in client hello */
2103 const unsigned char *p = session_id + len;
2104 unsigned short i;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002105
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002106 *ret = NULL;
2107 s->tlsext_ticket_expected = 0;
Nagendra Modadugue45f1062009-09-30 11:36:48 -07002108
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002109 /* If tickets disabled behave as if no ticket present
2110 * to permit stateful resumption.
2111 */
2112 if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2113 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002114 if ((s->version <= SSL3_VERSION) || !limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002115 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002116 if (p >= limit)
2117 return -1;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002118 /* Skip past DTLS cookie */
2119 if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
2120 {
2121 i = *(p++);
2122 p+= i;
2123 if (p >= limit)
2124 return -1;
2125 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002126 /* Skip past cipher list */
2127 n2s(p, i);
2128 p+= i;
2129 if (p >= limit)
2130 return -1;
2131 /* Skip past compression algorithm list */
2132 i = *(p++);
2133 p += i;
2134 if (p > limit)
2135 return -1;
2136 /* Now at start of extensions */
2137 if ((p + 2) >= limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002138 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002139 n2s(p, i);
2140 while ((p + 4) <= limit)
2141 {
2142 unsigned short type, size;
2143 n2s(p, type);
2144 n2s(p, size);
2145 if (p + size > limit)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002146 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002147 if (type == TLSEXT_TYPE_session_ticket)
2148 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002149 int r;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002150 if (size == 0)
2151 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002152 /* The client will accept a ticket but doesn't
2153 * currently have one. */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002154 s->tlsext_ticket_expected = 1;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002155 return 1;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002156 }
Brian Carlstrom221304e2010-04-15 14:22:36 -07002157 if (s->tls_session_secret_cb)
2158 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002159 /* Indicate that the ticket couldn't be
2160 * decrypted rather than generating the session
2161 * from ticket now, trigger abbreviated
2162 * handshake based on external mechanism to
2163 * calculate the master secret later. */
2164 return 2;
Brian Carlstrom221304e2010-04-15 14:22:36 -07002165 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002166 r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2167 switch (r)
2168 {
2169 case 2: /* ticket couldn't be decrypted */
2170 s->tlsext_ticket_expected = 1;
2171 return 2;
2172 case 3: /* ticket was decrypted */
2173 return r;
2174 case 4: /* ticket decrypted but need to renew */
2175 s->tlsext_ticket_expected = 1;
2176 return 3;
2177 default: /* fatal error */
2178 return -1;
2179 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002180 }
2181 p += size;
2182 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002183 return 0;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002184 }
2185
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002186/* tls_decrypt_ticket attempts to decrypt a session ticket.
2187 *
2188 * etick: points to the body of the session ticket extension.
2189 * eticklen: the length of the session tickets extenion.
2190 * sess_id: points at the session ID.
2191 * sesslen: the length of the session ID.
2192 * psess: (output) on return, if a ticket was decrypted, then this is set to
2193 * point to the resulting session.
2194 *
2195 * Returns:
2196 * -1: fatal error, either from parsing or decrypting the ticket.
2197 * 2: the ticket couldn't be decrypted.
2198 * 3: a ticket was successfully decrypted and *psess was set.
2199 * 4: same as 3, but the ticket needs to be renewed.
2200 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002201static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2202 const unsigned char *sess_id, int sesslen,
2203 SSL_SESSION **psess)
2204 {
2205 SSL_SESSION *sess;
2206 unsigned char *sdec;
2207 const unsigned char *p;
2208 int slen, mlen, renew_ticket = 0;
2209 unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2210 HMAC_CTX hctx;
2211 EVP_CIPHER_CTX ctx;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002212 SSL_CTX *tctx = s->initial_ctx;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002213 /* Need at least keyname + iv + some encrypted data */
2214 if (eticklen < 48)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002215 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002216 /* Initialize session ticket encryption and HMAC contexts */
2217 HMAC_CTX_init(&hctx);
2218 EVP_CIPHER_CTX_init(&ctx);
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002219 if (tctx->tlsext_ticket_key_cb)
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002220 {
2221 unsigned char *nctick = (unsigned char *)etick;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002222 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002223 &ctx, &hctx, 0);
2224 if (rv < 0)
2225 return -1;
2226 if (rv == 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002227 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002228 if (rv == 2)
2229 renew_ticket = 1;
2230 }
2231 else
2232 {
2233 /* Check key name matches */
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002234 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002235 return 2;
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002236 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002237 tlsext_tick_md(), NULL);
2238 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
Brian Carlstrom98d58bb2010-03-09 09:56:55 -08002239 tctx->tlsext_tick_aes_key, etick + 16);
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002240 }
2241 /* Attempt to process session ticket, first conduct sanity and
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002242 * integrity checks on ticket.
2243 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002244 mlen = HMAC_size(&hctx);
Brian Carlstrom221304e2010-04-15 14:22:36 -07002245 if (mlen < 0)
2246 {
2247 EVP_CIPHER_CTX_cleanup(&ctx);
2248 return -1;
2249 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002250 eticklen -= mlen;
2251 /* Check HMAC of encrypted ticket */
2252 HMAC_Update(&hctx, etick, eticklen);
2253 HMAC_Final(&hctx, tick_hmac, NULL);
2254 HMAC_CTX_cleanup(&hctx);
Brian Carlstromfa75fdb2013-02-01 23:44:05 -08002255 if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002256 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002257 /* Attempt to decrypt session data */
2258 /* Move p after IV to start of encrypted ticket, update length */
2259 p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2260 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2261 sdec = OPENSSL_malloc(eticklen);
2262 if (!sdec)
2263 {
2264 EVP_CIPHER_CTX_cleanup(&ctx);
2265 return -1;
2266 }
2267 EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2268 if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002269 return 2;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002270 slen += mlen;
2271 EVP_CIPHER_CTX_cleanup(&ctx);
2272 p = sdec;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002273
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002274 sess = d2i_SSL_SESSION(NULL, &p, slen);
2275 OPENSSL_free(sdec);
2276 if (sess)
2277 {
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002278 /* The session ID, if non-empty, is used by some clients to
2279 * detect that the ticket has been accepted. So we copy it to
2280 * the session structure. If it is empty set length to zero
2281 * as required by standard.
2282 */
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002283 if (sesslen)
2284 memcpy(sess->session_id, sess_id, sesslen);
2285 sess->session_id_length = sesslen;
2286 *psess = sess;
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002287 if (renew_ticket)
2288 return 4;
2289 else
2290 return 3;
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002291 }
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002292 ERR_clear_error();
2293 /* For session parse failure, indicate that we need to send a new
2294 * ticket. */
2295 return 2;
2296 }
2297
2298/* Tables to translate from NIDs to TLS v1.2 ids */
2299
2300typedef struct
2301 {
2302 int nid;
2303 int id;
2304 } tls12_lookup;
2305
2306static tls12_lookup tls12_md[] = {
2307#ifndef OPENSSL_NO_MD5
2308 {NID_md5, TLSEXT_hash_md5},
2309#endif
2310#ifndef OPENSSL_NO_SHA
2311 {NID_sha1, TLSEXT_hash_sha1},
2312#endif
2313#ifndef OPENSSL_NO_SHA256
2314 {NID_sha224, TLSEXT_hash_sha224},
2315 {NID_sha256, TLSEXT_hash_sha256},
2316#endif
2317#ifndef OPENSSL_NO_SHA512
2318 {NID_sha384, TLSEXT_hash_sha384},
2319 {NID_sha512, TLSEXT_hash_sha512}
2320#endif
2321};
2322
2323static tls12_lookup tls12_sig[] = {
2324#ifndef OPENSSL_NO_RSA
2325 {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2326#endif
2327#ifndef OPENSSL_NO_DSA
2328 {EVP_PKEY_DSA, TLSEXT_signature_dsa},
2329#endif
2330#ifndef OPENSSL_NO_ECDSA
2331 {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2332#endif
2333};
2334
2335static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2336 {
2337 size_t i;
2338 for (i = 0; i < tlen; i++)
2339 {
2340 if (table[i].nid == nid)
2341 return table[i].id;
2342 }
2343 return -1;
2344 }
2345#if 0
2346static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
2347 {
2348 size_t i;
2349 for (i = 0; i < tlen; i++)
2350 {
2351 if (table[i].id == id)
2352 return table[i].nid;
2353 }
2354 return -1;
2355 }
2356#endif
2357
2358int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
2359 {
2360 int sig_id, md_id;
2361 if (!md)
2362 return 0;
2363 md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2364 sizeof(tls12_md)/sizeof(tls12_lookup));
2365 if (md_id == -1)
2366 return 0;
2367 sig_id = tls12_get_sigid(pk);
2368 if (sig_id == -1)
2369 return 0;
2370 p[0] = (unsigned char)md_id;
2371 p[1] = (unsigned char)sig_id;
2372 return 1;
2373 }
2374
2375int tls12_get_sigid(const EVP_PKEY *pk)
2376 {
2377 return tls12_find_id(pk->type, tls12_sig,
2378 sizeof(tls12_sig)/sizeof(tls12_lookup));
2379 }
2380
2381const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2382 {
2383 switch(hash_alg)
2384 {
2385#ifndef OPENSSL_NO_MD5
2386 case TLSEXT_hash_md5:
2387#ifdef OPENSSL_FIPS
2388 if (FIPS_mode())
2389 return NULL;
2390#endif
2391 return EVP_md5();
2392#endif
2393#ifndef OPENSSL_NO_SHA
2394 case TLSEXT_hash_sha1:
2395 return EVP_sha1();
2396#endif
2397#ifndef OPENSSL_NO_SHA256
2398 case TLSEXT_hash_sha224:
2399 return EVP_sha224();
2400
2401 case TLSEXT_hash_sha256:
2402 return EVP_sha256();
2403#endif
2404#ifndef OPENSSL_NO_SHA512
2405 case TLSEXT_hash_sha384:
2406 return EVP_sha384();
2407
2408 case TLSEXT_hash_sha512:
2409 return EVP_sha512();
2410#endif
2411 default:
2412 return NULL;
2413
2414 }
2415 }
2416
2417/* Set preferred digest for each key type */
2418
2419int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2420 {
2421 int i, idx;
2422 const EVP_MD *md;
2423 CERT *c = s->cert;
2424 /* Extension ignored for TLS versions below 1.2 */
2425 if (TLS1_get_version(s) < TLS1_2_VERSION)
2426 return 1;
2427 /* Should never happen */
2428 if (!c)
2429 return 0;
2430
2431 c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
2432 c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
2433 c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
2434 c->pkeys[SSL_PKEY_ECC].digest = NULL;
2435
2436 for (i = 0; i < dsize; i += 2)
2437 {
2438 unsigned char hash_alg = data[i], sig_alg = data[i+1];
2439
2440 switch(sig_alg)
2441 {
2442#ifndef OPENSSL_NO_RSA
2443 case TLSEXT_signature_rsa:
2444 idx = SSL_PKEY_RSA_SIGN;
2445 break;
2446#endif
2447#ifndef OPENSSL_NO_DSA
2448 case TLSEXT_signature_dsa:
2449 idx = SSL_PKEY_DSA_SIGN;
2450 break;
2451#endif
2452#ifndef OPENSSL_NO_ECDSA
2453 case TLSEXT_signature_ecdsa:
2454 idx = SSL_PKEY_ECC;
2455 break;
2456#endif
2457 default:
2458 continue;
2459 }
2460
2461 if (c->pkeys[idx].digest == NULL)
2462 {
2463 md = tls12_get_hash(hash_alg);
2464 if (md)
2465 {
2466 c->pkeys[idx].digest = md;
2467 if (idx == SSL_PKEY_RSA_SIGN)
2468 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
2469 }
2470 }
2471
2472 }
2473
2474
2475 /* Set any remaining keys to default values. NOTE: if alg is not
2476 * supported it stays as NULL.
2477 */
2478#ifndef OPENSSL_NO_DSA
2479 if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08002480 c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002481#endif
2482#ifndef OPENSSL_NO_RSA
2483 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
2484 {
2485 c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
2486 c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
2487 }
2488#endif
2489#ifndef OPENSSL_NO_ECDSA
2490 if (!c->pkeys[SSL_PKEY_ECC].digest)
Brian Carlstrom04ef91b2013-02-05 09:20:38 -08002491 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002492#endif
2493 return 1;
2494 }
2495
2496#endif
2497
2498#ifndef OPENSSL_NO_HEARTBEATS
2499int
2500tls1_process_heartbeat(SSL *s)
2501 {
2502 unsigned char *p = &s->s3->rrec.data[0], *pl;
2503 unsigned short hbtype;
2504 unsigned int payload;
2505 unsigned int padding = 16; /* Use minimum padding */
2506
2507 /* Read type and payload length first */
2508 hbtype = *p++;
2509 n2s(p, payload);
2510 pl = p;
2511
2512 if (s->msg_callback)
2513 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2514 &s->s3->rrec.data[0], s->s3->rrec.length,
2515 s, s->msg_callback_arg);
2516
2517 if (hbtype == TLS1_HB_REQUEST)
2518 {
2519 unsigned char *buffer, *bp;
2520 int r;
2521
2522 /* Allocate memory for the response, size is 1 bytes
2523 * message type, plus 2 bytes payload length, plus
2524 * payload, plus padding
2525 */
2526 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2527 bp = buffer;
2528
2529 /* Enter response type, length and copy payload */
2530 *bp++ = TLS1_HB_RESPONSE;
2531 s2n(payload, bp);
2532 memcpy(bp, pl, payload);
2533 bp += payload;
2534 /* Random padding */
2535 RAND_pseudo_bytes(bp, padding);
2536
2537 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
2538
2539 if (r >= 0 && s->msg_callback)
2540 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2541 buffer, 3 + payload + padding,
2542 s, s->msg_callback_arg);
2543
2544 OPENSSL_free(buffer);
2545
2546 if (r < 0)
2547 return r;
2548 }
2549 else if (hbtype == TLS1_HB_RESPONSE)
2550 {
2551 unsigned int seq;
2552
2553 /* We only send sequence numbers (2 bytes unsigned int),
2554 * and 16 random bytes, so we just try to read the
2555 * sequence number */
2556 n2s(pl, seq);
2557
2558 if (payload == 18 && seq == s->tlsext_hb_seq)
2559 {
2560 s->tlsext_hb_seq++;
2561 s->tlsext_hb_pending = 0;
2562 }
2563 }
2564
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002565 return 0;
2566 }
2567
Brian Carlstrom392aa7c2012-03-15 16:03:43 -07002568int
2569tls1_heartbeat(SSL *s)
2570 {
2571 unsigned char *buf, *p;
2572 int ret;
2573 unsigned int payload = 18; /* Sequence number + random bytes */
2574 unsigned int padding = 16; /* Use minimum padding */
2575
2576 /* Only send if peer supports and accepts HB requests... */
2577 if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2578 s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
2579 {
2580 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2581 return -1;
2582 }
2583
2584 /* ...and there is none in flight yet... */
2585 if (s->tlsext_hb_pending)
2586 {
2587 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
2588 return -1;
2589 }
2590
2591 /* ...and no handshake in progress. */
2592 if (SSL_in_init(s) || s->in_handshake)
2593 {
2594 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
2595 return -1;
2596 }
2597
2598 /* Check if padding is too long, payload and padding
2599 * must not exceed 2^14 - 3 = 16381 bytes in total.
2600 */
2601 OPENSSL_assert(payload + padding <= 16381);
2602
2603 /* Create HeartBeat message, we just use a sequence number
2604 * as payload to distuingish different messages and add
2605 * some random stuff.
2606 * - Message Type, 1 byte
2607 * - Payload Length, 2 bytes (unsigned int)
2608 * - Payload, the sequence number (2 bytes uint)
2609 * - Payload, random bytes (16 bytes uint)
2610 * - Padding
2611 */
2612 buf = OPENSSL_malloc(1 + 2 + payload + padding);
2613 p = buf;
2614 /* Message Type */
2615 *p++ = TLS1_HB_REQUEST;
2616 /* Payload length (18 bytes here) */
2617 s2n(payload, p);
2618 /* Sequence number */
2619 s2n(s->tlsext_hb_seq, p);
2620 /* 16 random bytes */
2621 RAND_pseudo_bytes(p, 16);
2622 p += 16;
2623 /* Random padding */
2624 RAND_pseudo_bytes(p, padding);
2625
2626 ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2627 if (ret >= 0)
2628 {
2629 if (s->msg_callback)
2630 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2631 buf, 3 + payload + padding,
2632 s, s->msg_callback_arg);
2633
2634 s->tlsext_hb_pending = 1;
2635 }
2636
2637 OPENSSL_free(buf);
2638
2639 return ret;
2640 }
The Android Open Source Project656d9c72009-03-03 19:30:25 -08002641#endif
Adam Langley45bcfbc2013-01-16 13:43:53 -08002642
2643#if !defined(OPENSSL_NO_TLSEXT)
2644/* tls1_channel_id_hash calculates the signed data for a Channel ID on the given
2645 * SSL connection and writes it to |md|.
2646 */
2647int
2648tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s)
2649 {
2650 EVP_MD_CTX ctx;
2651 unsigned char temp_digest[EVP_MAX_MD_SIZE];
2652 unsigned temp_digest_len;
2653 int i;
2654 static const char kClientIDMagic[] = "TLS Channel ID signature";
2655
2656 if (s->s3->handshake_buffer)
2657 if (!ssl3_digest_cached_records(s))
2658 return 0;
2659
2660 EVP_DigestUpdate(md, kClientIDMagic, sizeof(kClientIDMagic));
2661
2662 EVP_MD_CTX_init(&ctx);
2663 for (i = 0; i < SSL_MAX_DIGEST; i++)
2664 {
2665 if (s->s3->handshake_dgst[i] == NULL)
2666 continue;
2667 EVP_MD_CTX_copy_ex(&ctx, s->s3->handshake_dgst[i]);
2668 EVP_DigestFinal_ex(&ctx, temp_digest, &temp_digest_len);
2669 EVP_DigestUpdate(md, temp_digest, temp_digest_len);
2670 }
2671 EVP_MD_CTX_cleanup(&ctx);
2672
2673 return 1;
2674 }
2675#endif