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