Retain SSLv2 methods as functions that return NULL
[openssl.git] / ssl / t1_lib.c
1 /* 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  */
58 /* ====================================================================
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  */
111
112 #include <stdio.h>
113 #include <openssl/objects.h>
114 #include <openssl/evp.h>
115 #include <openssl/hmac.h>
116 #include <openssl/ocsp.h>
117 #include <openssl/rand.h>
118 #include "ssl_locl.h"
119
120 const char tls1_version_str[] = "TLSv1" OPENSSL_VERSION_PTEXT;
121
122 #ifndef OPENSSL_NO_TLSEXT
123 static 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
128 SSL3_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,
140     tls1_export_keying_material,
141 };
142
143 long tls1_default_timeout(void)
144 {
145     /*
146      * 2 hours, the 24 hours mentioned in the TLSv1 spec is way too long for
147      * http, the cache would over fill
148      */
149     return (60 * 60 * 2);
150 }
151
152 int tls1_new(SSL *s)
153 {
154     if (!ssl3_new(s))
155         return (0);
156     s->method->ssl_clear(s);
157     return (1);
158 }
159
160 void tls1_free(SSL *s)
161 {
162 #ifndef OPENSSL_NO_TLSEXT
163     if (s->tlsext_session_ticket) {
164         OPENSSL_free(s->tlsext_session_ticket);
165     }
166 #endif                          /* OPENSSL_NO_TLSEXT */
167     ssl3_free(s);
168 }
169
170 void tls1_clear(SSL *s)
171 {
172     ssl3_clear(s);
173     s->version = s->method->version;
174 }
175
176 #ifndef OPENSSL_NO_EC
177
178 static int nid_list[] = {
179     NID_sect163k1,              /* sect163k1 (1) */
180     NID_sect163r1,              /* sect163r1 (2) */
181     NID_sect163r2,              /* sect163r2 (3) */
182     NID_sect193r1,              /* sect193r1 (4) */
183     NID_sect193r2,              /* sect193r2 (5) */
184     NID_sect233k1,              /* sect233k1 (6) */
185     NID_sect233r1,              /* sect233r1 (7) */
186     NID_sect239k1,              /* sect239k1 (8) */
187     NID_sect283k1,              /* sect283k1 (9) */
188     NID_sect283r1,              /* sect283r1 (10) */
189     NID_sect409k1,              /* sect409k1 (11) */
190     NID_sect409r1,              /* sect409r1 (12) */
191     NID_sect571k1,              /* sect571k1 (13) */
192     NID_sect571r1,              /* sect571r1 (14) */
193     NID_secp160k1,              /* secp160k1 (15) */
194     NID_secp160r1,              /* secp160r1 (16) */
195     NID_secp160r2,              /* secp160r2 (17) */
196     NID_secp192k1,              /* secp192k1 (18) */
197     NID_X9_62_prime192v1,       /* secp192r1 (19) */
198     NID_secp224k1,              /* secp224k1 (20) */
199     NID_secp224r1,              /* secp224r1 (21) */
200     NID_secp256k1,              /* secp256k1 (22) */
201     NID_X9_62_prime256v1,       /* secp256r1 (23) */
202     NID_secp384r1,              /* secp384r1 (24) */
203     NID_secp521r1               /* secp521r1 (25) */
204 };
205
206 static int pref_list[] = {
207 # ifndef OPENSSL_NO_EC2M
208     NID_sect571r1,              /* sect571r1 (14) */
209     NID_sect571k1,              /* sect571k1 (13) */
210 # endif
211     NID_secp521r1,              /* secp521r1 (25) */
212 # ifndef OPENSSL_NO_EC2M
213     NID_sect409k1,              /* sect409k1 (11) */
214     NID_sect409r1,              /* sect409r1 (12) */
215 # endif
216     NID_secp384r1,              /* secp384r1 (24) */
217 # ifndef OPENSSL_NO_EC2M
218     NID_sect283k1,              /* sect283k1 (9) */
219     NID_sect283r1,              /* sect283r1 (10) */
220 # endif
221     NID_secp256k1,              /* secp256k1 (22) */
222     NID_X9_62_prime256v1,       /* secp256r1 (23) */
223 # ifndef OPENSSL_NO_EC2M
224     NID_sect239k1,              /* sect239k1 (8) */
225     NID_sect233k1,              /* sect233k1 (6) */
226     NID_sect233r1,              /* sect233r1 (7) */
227 # endif
228     NID_secp224k1,              /* secp224k1 (20) */
229     NID_secp224r1,              /* secp224r1 (21) */
230 # ifndef OPENSSL_NO_EC2M
231     NID_sect193r1,              /* sect193r1 (4) */
232     NID_sect193r2,              /* sect193r2 (5) */
233 # endif
234     NID_secp192k1,              /* secp192k1 (18) */
235     NID_X9_62_prime192v1,       /* secp192r1 (19) */
236 # ifndef OPENSSL_NO_EC2M
237     NID_sect163k1,              /* sect163k1 (1) */
238     NID_sect163r1,              /* sect163r1 (2) */
239     NID_sect163r2,              /* sect163r2 (3) */
240 # endif
241     NID_secp160k1,              /* secp160k1 (15) */
242     NID_secp160r1,              /* secp160r1 (16) */
243     NID_secp160r2,              /* secp160r2 (17) */
244 };
245
246 int tls1_ec_curve_id2nid(int curve_id)
247 {
248     /* ECC curves from RFC 4492 */
249     if ((curve_id < 1) || ((unsigned int)curve_id >
250                            sizeof(nid_list) / sizeof(nid_list[0])))
251         return 0;
252     return nid_list[curve_id - 1];
253 }
254
255 int tls1_ec_nid2curve_id(int nid)
256 {
257     /* ECC curves from RFC 4492 */
258     switch (nid) {
259     case NID_sect163k1:        /* sect163k1 (1) */
260         return 1;
261     case NID_sect163r1:        /* sect163r1 (2) */
262         return 2;
263     case NID_sect163r2:        /* sect163r2 (3) */
264         return 3;
265     case NID_sect193r1:        /* sect193r1 (4) */
266         return 4;
267     case NID_sect193r2:        /* sect193r2 (5) */
268         return 5;
269     case NID_sect233k1:        /* sect233k1 (6) */
270         return 6;
271     case NID_sect233r1:        /* sect233r1 (7) */
272         return 7;
273     case NID_sect239k1:        /* sect239k1 (8) */
274         return 8;
275     case NID_sect283k1:        /* sect283k1 (9) */
276         return 9;
277     case NID_sect283r1:        /* sect283r1 (10) */
278         return 10;
279     case NID_sect409k1:        /* sect409k1 (11) */
280         return 11;
281     case NID_sect409r1:        /* sect409r1 (12) */
282         return 12;
283     case NID_sect571k1:        /* sect571k1 (13) */
284         return 13;
285     case NID_sect571r1:        /* sect571r1 (14) */
286         return 14;
287     case NID_secp160k1:        /* secp160k1 (15) */
288         return 15;
289     case NID_secp160r1:        /* secp160r1 (16) */
290         return 16;
291     case NID_secp160r2:        /* secp160r2 (17) */
292         return 17;
293     case NID_secp192k1:        /* secp192k1 (18) */
294         return 18;
295     case NID_X9_62_prime192v1: /* secp192r1 (19) */
296         return 19;
297     case NID_secp224k1:        /* secp224k1 (20) */
298         return 20;
299     case NID_secp224r1:        /* secp224r1 (21) */
300         return 21;
301     case NID_secp256k1:        /* secp256k1 (22) */
302         return 22;
303     case NID_X9_62_prime256v1: /* secp256r1 (23) */
304         return 23;
305     case NID_secp384r1:        /* secp384r1 (24) */
306         return 24;
307     case NID_secp521r1:        /* secp521r1 (25) */
308         return 25;
309     default:
310         return 0;
311     }
312 }
313 #endif                          /* OPENSSL_NO_EC */
314
315 #ifndef OPENSSL_NO_TLSEXT
316
317 /*
318  * List of supported signature algorithms and hashes. Should make this
319  * customisable at some point, for now include everything we support.
320  */
321
322 # ifdef OPENSSL_NO_RSA
323 #  define tlsext_sigalg_rsa(md) /* */
324 # else
325 #  define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
326 # endif
327
328 # ifdef OPENSSL_NO_DSA
329 #  define tlsext_sigalg_dsa(md) /* */
330 # else
331 #  define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
332 # endif
333
334 # ifdef OPENSSL_NO_ECDSA
335 #  define tlsext_sigalg_ecdsa(md)
336                                 /* */
337 # else
338 #  define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
339 # endif
340
341 # define tlsext_sigalg(md) \
342                 tlsext_sigalg_rsa(md) \
343                 tlsext_sigalg_dsa(md) \
344                 tlsext_sigalg_ecdsa(md)
345
346 static unsigned char tls12_sigalgs[] = {
347 # ifndef OPENSSL_NO_SHA512
348     tlsext_sigalg(TLSEXT_hash_sha512)
349         tlsext_sigalg(TLSEXT_hash_sha384)
350 # endif
351 # ifndef OPENSSL_NO_SHA256
352         tlsext_sigalg(TLSEXT_hash_sha256)
353         tlsext_sigalg(TLSEXT_hash_sha224)
354 # endif
355 # ifndef OPENSSL_NO_SHA
356         tlsext_sigalg(TLSEXT_hash_sha1)
357 # endif
358 };
359
360 int tls12_get_req_sig_algs(SSL *s, unsigned char *p)
361 {
362     size_t slen = sizeof(tls12_sigalgs);
363     if (p)
364         memcpy(p, tls12_sigalgs, slen);
365     return (int)slen;
366 }
367
368 unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf,
369                                           unsigned char *limit)
370 {
371     int extdatalen = 0;
372     unsigned char *orig = buf;
373     unsigned char *ret = buf;
374
375     /* don't add extensions for SSLv3 unless doing secure renegotiation */
376     if (s->client_version == SSL3_VERSION && !s->s3->send_connection_binding)
377         return orig;
378
379     ret += 2;
380
381     if (ret >= limit)
382         return NULL;            /* this really never occurs, but ... */
383
384     if (s->tlsext_hostname != NULL) {
385         /* Add TLS extension servername to the Client Hello message */
386         unsigned long size_str;
387         long lenmax;
388
389         /*-
390          * check for enough space.
391          * 4 for the servername type and entension length
392          * 2 for servernamelist length
393          * 1 for the hostname type
394          * 2 for hostname length
395          * + hostname length
396          */
397
398         if ((lenmax = limit - ret - 9) < 0
399             || (size_str =
400                 strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
401             return NULL;
402
403         /* extension type and length */
404         s2n(TLSEXT_TYPE_server_name, ret);
405         s2n(size_str + 5, ret);
406
407         /* length of servername list */
408         s2n(size_str + 3, ret);
409
410         /* hostname type, length and hostname */
411         *(ret++) = (unsigned char)TLSEXT_NAMETYPE_host_name;
412         s2n(size_str, ret);
413         memcpy(ret, s->tlsext_hostname, size_str);
414         ret += size_str;
415     }
416
417     /* Add RI if renegotiating */
418     if (s->renegotiate) {
419         int el;
420
421         if (!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0)) {
422             SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
423             return NULL;
424         }
425
426         if ((limit - ret - 4 - el) < 0)
427             return NULL;
428
429         s2n(TLSEXT_TYPE_renegotiate, ret);
430         s2n(el, ret);
431
432         if (!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el)) {
433             SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
434             return NULL;
435         }
436
437         ret += el;
438     }
439 # ifndef OPENSSL_NO_SRP
440     /* Add SRP username if there is one */
441     if (s->srp_ctx.login != NULL) { /* Add TLS extension SRP username to the
442                                      * Client Hello message */
443
444         int login_len = strlen(s->srp_ctx.login);
445         if (login_len > 255 || login_len == 0) {
446             SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
447             return NULL;
448         }
449
450         /*-
451          * check for enough space.
452          * 4 for the srp type type and entension length
453          * 1 for the srp user identity
454          * + srp user identity length
455          */
456         if ((limit - ret - 5 - login_len) < 0)
457             return NULL;
458
459         /* fill in the extension */
460         s2n(TLSEXT_TYPE_srp, ret);
461         s2n(login_len + 1, ret);
462         (*ret++) = (unsigned char)login_len;
463         memcpy(ret, s->srp_ctx.login, login_len);
464         ret += login_len;
465     }
466 # endif
467
468 # ifndef OPENSSL_NO_EC
469     if (s->tlsext_ecpointformatlist != NULL) {
470         /*
471          * Add TLS extension ECPointFormats to the ClientHello message
472          */
473         long lenmax;
474
475         if ((lenmax = limit - ret - 5) < 0)
476             return NULL;
477         if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax)
478             return NULL;
479         if (s->tlsext_ecpointformatlist_length > 255) {
480             SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
481             return NULL;
482         }
483
484         s2n(TLSEXT_TYPE_ec_point_formats, ret);
485         s2n(s->tlsext_ecpointformatlist_length + 1, ret);
486         *(ret++) = (unsigned char)s->tlsext_ecpointformatlist_length;
487         memcpy(ret, s->tlsext_ecpointformatlist,
488                s->tlsext_ecpointformatlist_length);
489         ret += s->tlsext_ecpointformatlist_length;
490     }
491     if (s->tlsext_ellipticcurvelist != NULL) {
492         /*
493          * Add TLS extension EllipticCurves to the ClientHello message
494          */
495         long lenmax;
496
497         if ((lenmax = limit - ret - 6) < 0)
498             return NULL;
499         if (s->tlsext_ellipticcurvelist_length > (unsigned long)lenmax)
500             return NULL;
501         if (s->tlsext_ellipticcurvelist_length > 65532) {
502             SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
503             return NULL;
504         }
505
506         s2n(TLSEXT_TYPE_elliptic_curves, ret);
507         s2n(s->tlsext_ellipticcurvelist_length + 2, ret);
508
509         s2n(s->tlsext_ellipticcurvelist_length, ret);
510         memcpy(ret, s->tlsext_ellipticcurvelist,
511                s->tlsext_ellipticcurvelist_length);
512         ret += s->tlsext_ellipticcurvelist_length;
513     }
514 # endif                         /* OPENSSL_NO_EC */
515
516     if (!(SSL_get_options(s) & SSL_OP_NO_TICKET)) {
517         int ticklen;
518         if (!s->new_session && s->session && s->session->tlsext_tick)
519             ticklen = s->session->tlsext_ticklen;
520         else if (s->session && s->tlsext_session_ticket &&
521                  s->tlsext_session_ticket->data) {
522             ticklen = s->tlsext_session_ticket->length;
523             s->session->tlsext_tick = OPENSSL_malloc(ticklen);
524             if (!s->session->tlsext_tick)
525                 return NULL;
526             memcpy(s->session->tlsext_tick,
527                    s->tlsext_session_ticket->data, ticklen);
528             s->session->tlsext_ticklen = ticklen;
529         } else
530             ticklen = 0;
531         if (ticklen == 0 && s->tlsext_session_ticket &&
532             s->tlsext_session_ticket->data == NULL)
533             goto skip_ext;
534         /*
535          * Check for enough room 2 for extension type, 2 for len rest for
536          * ticket
537          */
538         if ((long)(limit - ret - 4 - ticklen) < 0)
539             return NULL;
540         s2n(TLSEXT_TYPE_session_ticket, ret);
541         s2n(ticklen, ret);
542         if (ticklen) {
543             memcpy(ret, s->session->tlsext_tick, ticklen);
544             ret += ticklen;
545         }
546     }
547  skip_ext:
548
549     if (TLS1_get_client_version(s) >= TLS1_2_VERSION) {
550         if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
551             return NULL;
552         s2n(TLSEXT_TYPE_signature_algorithms, ret);
553         s2n(sizeof(tls12_sigalgs) + 2, ret);
554         s2n(sizeof(tls12_sigalgs), ret);
555         memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
556         ret += sizeof(tls12_sigalgs);
557     }
558 # ifdef TLSEXT_TYPE_opaque_prf_input
559     if (s->s3->client_opaque_prf_input != NULL && s->version != DTLS1_VERSION) {
560         size_t col = s->s3->client_opaque_prf_input_len;
561
562         if ((long)(limit - ret - 6 - col < 0))
563             return NULL;
564         if (col > 0xFFFD)       /* can't happen */
565             return NULL;
566
567         s2n(TLSEXT_TYPE_opaque_prf_input, ret);
568         s2n(col + 2, ret);
569         s2n(col, ret);
570         memcpy(ret, s->s3->client_opaque_prf_input, col);
571         ret += col;
572     }
573 # endif
574
575     if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
576         s->version != DTLS1_VERSION) {
577         int i;
578         long extlen, idlen, itmp;
579         OCSP_RESPID *id;
580
581         idlen = 0;
582         for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) {
583             id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
584             itmp = i2d_OCSP_RESPID(id, NULL);
585             if (itmp <= 0)
586                 return NULL;
587             idlen += itmp + 2;
588         }
589
590         if (s->tlsext_ocsp_exts) {
591             extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
592             if (extlen < 0)
593                 return NULL;
594         } else
595             extlen = 0;
596
597         if ((long)(limit - ret - 7 - extlen - idlen) < 0)
598             return NULL;
599         s2n(TLSEXT_TYPE_status_request, ret);
600         if (extlen + idlen > 0xFFF0)
601             return NULL;
602         s2n(extlen + idlen + 5, ret);
603         *(ret++) = TLSEXT_STATUSTYPE_ocsp;
604         s2n(idlen, ret);
605         for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) {
606             /* save position of id len */
607             unsigned char *q = ret;
608             id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
609             /* skip over id len */
610             ret += 2;
611             itmp = i2d_OCSP_RESPID(id, &ret);
612             /* write id len */
613             s2n(itmp, q);
614         }
615         s2n(extlen, ret);
616         if (extlen > 0)
617             i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
618     }
619 # ifndef OPENSSL_NO_HEARTBEATS
620     /* Add Heartbeat extension */
621     if ((limit - ret - 4 - 1) < 0)
622         return NULL;
623     s2n(TLSEXT_TYPE_heartbeat, ret);
624     s2n(1, ret);
625     /*-
626      * Set mode:
627      * 1: peer may send requests
628      * 2: peer not allowed to send requests
629      */
630     if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
631         *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
632     else
633         *(ret++) = SSL_TLSEXT_HB_ENABLED;
634 # endif
635
636 # ifndef OPENSSL_NO_NEXTPROTONEG
637     if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len) {
638         /*
639          * The client advertises an emtpy extension to indicate its support
640          * for Next Protocol Negotiation
641          */
642         if (limit - ret - 4 < 0)
643             return NULL;
644         s2n(TLSEXT_TYPE_next_proto_neg, ret);
645         s2n(0, ret);
646     }
647 # endif
648
649 # ifndef OPENSSL_NO_SRTP
650     if (SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s)) {
651         int el;
652
653         ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
654
655         if ((limit - ret - 4 - el) < 0)
656             return NULL;
657
658         s2n(TLSEXT_TYPE_use_srtp, ret);
659         s2n(el, ret);
660
661         if (ssl_add_clienthello_use_srtp_ext(s, ret, &el, el)) {
662             SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
663             return NULL;
664         }
665         ret += el;
666     }
667 # endif
668     /*
669      * Add padding to workaround bugs in F5 terminators. See
670      * https://tools.ietf.org/html/draft-agl-tls-padding-03 NB: because this
671      * code works out the length of all existing extensions it MUST always
672      * appear last.
673      */
674     if (s->options & SSL_OP_TLSEXT_PADDING) {
675         int hlen = ret - (unsigned char *)s->init_buf->data;
676         /*
677          * The code in s23_clnt.c to build ClientHello messages includes the
678          * 5-byte record header in the buffer, while the code in s3_clnt.c
679          * does not.
680          */
681         if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
682             hlen -= 5;
683         if (hlen > 0xff && hlen < 0x200) {
684             hlen = 0x200 - hlen;
685             if (hlen >= 4)
686                 hlen -= 4;
687             else
688                 hlen = 0;
689
690             s2n(TLSEXT_TYPE_padding, ret);
691             s2n(hlen, ret);
692             memset(ret, 0, hlen);
693             ret += hlen;
694         }
695     }
696
697     if ((extdatalen = ret - orig - 2) == 0)
698         return orig;
699
700     s2n(extdatalen, orig);
701     return ret;
702 }
703
704 unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
705                                           unsigned char *limit)
706 {
707     int extdatalen = 0;
708     unsigned char *orig = buf;
709     unsigned char *ret = buf;
710 # ifndef OPENSSL_NO_NEXTPROTONEG
711     int next_proto_neg_seen;
712 # endif
713
714     /*
715      * don't add extensions for SSLv3, unless doing secure renegotiation
716      */
717     if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
718         return orig;
719
720     ret += 2;
721     if (ret >= limit)
722         return NULL;            /* this really never occurs, but ... */
723
724     if (!s->hit && s->servername_done == 1
725         && s->session->tlsext_hostname != NULL) {
726         if ((long)(limit - ret - 4) < 0)
727             return NULL;
728
729         s2n(TLSEXT_TYPE_server_name, ret);
730         s2n(0, ret);
731     }
732
733     if (s->s3->send_connection_binding) {
734         int el;
735
736         if (!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0)) {
737             SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
738             return NULL;
739         }
740
741         if ((limit - ret - 4 - el) < 0)
742             return NULL;
743
744         s2n(TLSEXT_TYPE_renegotiate, ret);
745         s2n(el, ret);
746
747         if (!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el)) {
748             SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
749             return NULL;
750         }
751
752         ret += el;
753     }
754 # ifndef OPENSSL_NO_EC
755     if (s->tlsext_ecpointformatlist != NULL) {
756         /*
757          * Add TLS extension ECPointFormats to the ServerHello message
758          */
759         long lenmax;
760
761         if ((lenmax = limit - ret - 5) < 0)
762             return NULL;
763         if (s->tlsext_ecpointformatlist_length > (unsigned long)lenmax)
764             return NULL;
765         if (s->tlsext_ecpointformatlist_length > 255) {
766             SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
767             return NULL;
768         }
769
770         s2n(TLSEXT_TYPE_ec_point_formats, ret);
771         s2n(s->tlsext_ecpointformatlist_length + 1, ret);
772         *(ret++) = (unsigned char)s->tlsext_ecpointformatlist_length;
773         memcpy(ret, s->tlsext_ecpointformatlist,
774                s->tlsext_ecpointformatlist_length);
775         ret += s->tlsext_ecpointformatlist_length;
776
777     }
778     /*
779      * Currently the server should not respond with a SupportedCurves
780      * extension
781      */
782 # endif                         /* OPENSSL_NO_EC */
783
784     if (s->tlsext_ticket_expected && !(SSL_get_options(s) & SSL_OP_NO_TICKET)) {
785         if ((long)(limit - ret - 4) < 0)
786             return NULL;
787         s2n(TLSEXT_TYPE_session_ticket, ret);
788         s2n(0, ret);
789     }
790
791     if (s->tlsext_status_expected) {
792         if ((long)(limit - ret - 4) < 0)
793             return NULL;
794         s2n(TLSEXT_TYPE_status_request, ret);
795         s2n(0, ret);
796     }
797 # ifdef TLSEXT_TYPE_opaque_prf_input
798     if (s->s3->server_opaque_prf_input != NULL && s->version != DTLS1_VERSION) {
799         size_t sol = s->s3->server_opaque_prf_input_len;
800
801         if ((long)(limit - ret - 6 - sol) < 0)
802             return NULL;
803         if (sol > 0xFFFD)       /* can't happen */
804             return NULL;
805
806         s2n(TLSEXT_TYPE_opaque_prf_input, ret);
807         s2n(sol + 2, ret);
808         s2n(sol, ret);
809         memcpy(ret, s->s3->server_opaque_prf_input, sol);
810         ret += sol;
811     }
812 # endif
813
814 # ifndef OPENSSL_NO_SRTP
815     if (SSL_IS_DTLS(s) && s->srtp_profile) {
816         int el;
817
818         ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
819
820         if ((limit - ret - 4 - el) < 0)
821             return NULL;
822
823         s2n(TLSEXT_TYPE_use_srtp, ret);
824         s2n(el, ret);
825
826         if (ssl_add_serverhello_use_srtp_ext(s, ret, &el, el)) {
827             SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
828             return NULL;
829         }
830         ret += el;
831     }
832 # endif
833
834     if (((s->s3->tmp.new_cipher->id & 0xFFFF) == 0x80
835          || (s->s3->tmp.new_cipher->id & 0xFFFF) == 0x81)
836         && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG)) {
837         const unsigned char cryptopro_ext[36] = {
838             0xfd, 0xe8,         /* 65000 */
839             0x00, 0x20,         /* 32 bytes length */
840             0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
841             0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
842             0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
843             0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17
844         };
845         if (limit - ret < 36)
846             return NULL;
847         memcpy(ret, cryptopro_ext, 36);
848         ret += 36;
849
850     }
851 # ifndef OPENSSL_NO_HEARTBEATS
852     /* Add Heartbeat extension if we've received one */
853     if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) {
854         if ((limit - ret - 4 - 1) < 0)
855             return NULL;
856         s2n(TLSEXT_TYPE_heartbeat, ret);
857         s2n(1, ret);
858         /*-
859          * Set mode:
860          * 1: peer may send requests
861          * 2: peer not allowed to send requests
862          */
863         if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
864             *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
865         else
866             *(ret++) = SSL_TLSEXT_HB_ENABLED;
867
868     }
869 # endif
870
871 # ifndef OPENSSL_NO_NEXTPROTONEG
872     next_proto_neg_seen = s->s3->next_proto_neg_seen;
873     s->s3->next_proto_neg_seen = 0;
874     if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb) {
875         const unsigned char *npa;
876         unsigned int npalen;
877         int r;
878
879         r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen,
880                                               s->
881                                               ctx->next_protos_advertised_cb_arg);
882         if (r == SSL_TLSEXT_ERR_OK) {
883             if ((long)(limit - ret - 4 - npalen) < 0)
884                 return NULL;
885             s2n(TLSEXT_TYPE_next_proto_neg, ret);
886             s2n(npalen, ret);
887             memcpy(ret, npa, npalen);
888             ret += npalen;
889             s->s3->next_proto_neg_seen = 1;
890         }
891     }
892 # endif
893
894     if ((extdatalen = ret - orig - 2) == 0)
895         return orig;
896
897     s2n(extdatalen, orig);
898     return ret;
899 }
900
901 # ifndef OPENSSL_NO_EC
902 /*-
903  * ssl_check_for_safari attempts to fingerprint Safari using OS X
904  * SecureTransport using the TLS extension block in |d|, of length |n|.
905  * Safari, since 10.6, sends exactly these extensions, in this order:
906  *   SNI,
907  *   elliptic_curves
908  *   ec_point_formats
909  *
910  * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
911  * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
912  * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
913  * 10.8..10.8.3 (which don't work).
914  */
915 static void ssl_check_for_safari(SSL *s, const unsigned char *data,
916                                  const unsigned char *limit)
917 {
918     unsigned short type, size;
919     static const unsigned char kSafariExtensionsBlock[] = {
920         0x00, 0x0a,             /* elliptic_curves extension */
921         0x00, 0x08,             /* 8 bytes */
922         0x00, 0x06,             /* 6 bytes of curve ids */
923         0x00, 0x17,             /* P-256 */
924         0x00, 0x18,             /* P-384 */
925         0x00, 0x19,             /* P-521 */
926
927         0x00, 0x0b,             /* ec_point_formats */
928         0x00, 0x02,             /* 2 bytes */
929         0x01,                   /* 1 point format */
930         0x00,                   /* uncompressed */
931     };
932
933     /* The following is only present in TLS 1.2 */
934     static const unsigned char kSafariTLS12ExtensionsBlock[] = {
935         0x00, 0x0d,             /* signature_algorithms */
936         0x00, 0x0c,             /* 12 bytes */
937         0x00, 0x0a,             /* 10 bytes */
938         0x05, 0x01,             /* SHA-384/RSA */
939         0x04, 0x01,             /* SHA-256/RSA */
940         0x02, 0x01,             /* SHA-1/RSA */
941         0x04, 0x03,             /* SHA-256/ECDSA */
942         0x02, 0x03,             /* SHA-1/ECDSA */
943     };
944
945     if (data >= (limit - 2))
946         return;
947     data += 2;
948
949     if (data > (limit - 4))
950         return;
951     n2s(data, type);
952     n2s(data, size);
953
954     if (type != TLSEXT_TYPE_server_name)
955         return;
956
957     if (data + size > limit)
958         return;
959     data += size;
960
961     if (TLS1_get_client_version(s) >= TLS1_2_VERSION) {
962         const size_t len1 = sizeof(kSafariExtensionsBlock);
963         const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
964
965         if (data + len1 + len2 != limit)
966             return;
967         if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
968             return;
969         if (memcmp(data + len1, kSafariTLS12ExtensionsBlock, len2) != 0)
970             return;
971     } else {
972         const size_t len = sizeof(kSafariExtensionsBlock);
973
974         if (data + len != limit)
975             return;
976         if (memcmp(data, kSafariExtensionsBlock, len) != 0)
977             return;
978     }
979
980     s->s3->is_probably_safari = 1;
981 }
982 # endif                         /* !OPENSSL_NO_EC */
983
984 int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p,
985                                  unsigned char *limit, int *al)
986 {
987     unsigned short type;
988     unsigned short size;
989     unsigned short len;
990     unsigned char *data = *p;
991     int renegotiate_seen = 0;
992     int sigalg_seen = 0;
993
994     s->servername_done = 0;
995     s->tlsext_status_type = -1;
996 # ifndef OPENSSL_NO_NEXTPROTONEG
997     s->s3->next_proto_neg_seen = 0;
998 # endif
999
1000 # ifndef OPENSSL_NO_HEARTBEATS
1001     s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1002                              SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1003 # endif
1004
1005 # ifndef OPENSSL_NO_EC
1006     if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
1007         ssl_check_for_safari(s, data, limit);
1008 # endif                         /* !OPENSSL_NO_EC */
1009
1010 # ifndef OPENSSL_NO_SRP
1011     if (s->srp_ctx.login != NULL) {
1012         OPENSSL_free(s->srp_ctx.login);
1013         s->srp_ctx.login = NULL;
1014     }
1015 # endif
1016
1017     s->srtp_profile = NULL;
1018
1019     if (data == limit)
1020         goto ri_check;
1021
1022     if (data > (limit - 2))
1023         goto err;
1024
1025     n2s(data, len);
1026
1027     if (data + len != limit)
1028         goto err;
1029
1030     while (data <= (limit - 4)) {
1031         n2s(data, type);
1032         n2s(data, size);
1033
1034         if (data + size > (limit))
1035             goto err;
1036 # if 0
1037         fprintf(stderr, "Received extension type %d size %d\n", type, size);
1038 # endif
1039         if (s->tlsext_debug_cb)
1040             s->tlsext_debug_cb(s, 0, type, data, size, s->tlsext_debug_arg);
1041 /*-
1042  * The servername extension is treated as follows:
1043  *
1044  * - Only the hostname type is supported with a maximum length of 255.
1045  * - The servername is rejected if too long or if it contains zeros,
1046  *   in which case an fatal alert is generated.
1047  * - The servername field is maintained together with the session cache.
1048  * - When a session is resumed, the servername call back invoked in order
1049  *   to allow the application to position itself to the right context.
1050  * - The servername is acknowledged if it is new for a session or when
1051  *   it is identical to a previously used for the same session.
1052  *   Applications can control the behaviour.  They can at any time
1053  *   set a 'desirable' servername for a new SSL object. This can be the
1054  *   case for example with HTTPS when a Host: header field is received and
1055  *   a renegotiation is requested. In this case, a possible servername
1056  *   presented in the new client hello is only acknowledged if it matches
1057  *   the value of the Host: field.
1058  * - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
1059  *   if they provide for changing an explicit servername context for the
1060  *   session, i.e. when the session has been established with a servername
1061  *   extension.
1062  * - On session reconnect, the servername extension may be absent.
1063  *
1064  */
1065
1066         if (type == TLSEXT_TYPE_server_name) {
1067             unsigned char *sdata;
1068             int servname_type;
1069             int dsize;
1070
1071             if (size < 2)
1072                 goto err;
1073             n2s(data, dsize);
1074             size -= 2;
1075             if (dsize > size)
1076                 goto err;
1077
1078             sdata = data;
1079             while (dsize > 3) {
1080                 servname_type = *(sdata++);
1081                 n2s(sdata, len);
1082                 dsize -= 3;
1083
1084                 if (len > dsize)
1085                     goto err;
1086
1087                 if (s->servername_done == 0)
1088                     switch (servname_type) {
1089                     case TLSEXT_NAMETYPE_host_name:
1090                         if (!s->hit) {
1091                             if (s->session->tlsext_hostname)
1092                                 goto err;
1093
1094                             if (len > TLSEXT_MAXLEN_host_name) {
1095                                 *al = TLS1_AD_UNRECOGNIZED_NAME;
1096                                 return 0;
1097                             }
1098                             if ((s->session->tlsext_hostname =
1099                                  OPENSSL_malloc(len + 1)) == NULL) {
1100                                 *al = TLS1_AD_INTERNAL_ERROR;
1101                                 return 0;
1102                             }
1103                             memcpy(s->session->tlsext_hostname, sdata, len);
1104                             s->session->tlsext_hostname[len] = '\0';
1105                             if (strlen(s->session->tlsext_hostname) != len) {
1106                                 OPENSSL_free(s->session->tlsext_hostname);
1107                                 s->session->tlsext_hostname = NULL;
1108                                 *al = TLS1_AD_UNRECOGNIZED_NAME;
1109                                 return 0;
1110                             }
1111                             s->servername_done = 1;
1112
1113                         } else
1114                             s->servername_done = s->session->tlsext_hostname
1115                                 && strlen(s->session->tlsext_hostname) == len
1116                                 && strncmp(s->session->tlsext_hostname,
1117                                            (char *)sdata, len) == 0;
1118
1119                         break;
1120
1121                     default:
1122                         break;
1123                     }
1124
1125                 dsize -= len;
1126             }
1127             if (dsize != 0)
1128                 goto err;
1129
1130         }
1131 # ifndef OPENSSL_NO_SRP
1132         else if (type == TLSEXT_TYPE_srp) {
1133             if (size == 0 || ((len = data[0])) != (size - 1))
1134                 goto err;
1135             if (s->srp_ctx.login != NULL)
1136                 goto err;
1137             if ((s->srp_ctx.login = OPENSSL_malloc(len + 1)) == NULL)
1138                 return -1;
1139             memcpy(s->srp_ctx.login, &data[1], len);
1140             s->srp_ctx.login[len] = '\0';
1141
1142             if (strlen(s->srp_ctx.login) != len)
1143                 goto err;
1144         }
1145 # endif
1146
1147 # ifndef OPENSSL_NO_EC
1148         else if (type == TLSEXT_TYPE_ec_point_formats) {
1149             unsigned char *sdata = data;
1150             int ecpointformatlist_length = *(sdata++);
1151
1152             if (ecpointformatlist_length != size - 1)
1153                 goto err;
1154             if (!s->hit) {
1155                 if (s->session->tlsext_ecpointformatlist) {
1156                     OPENSSL_free(s->session->tlsext_ecpointformatlist);
1157                     s->session->tlsext_ecpointformatlist = NULL;
1158                 }
1159                 s->session->tlsext_ecpointformatlist_length = 0;
1160                 if ((s->session->tlsext_ecpointformatlist =
1161                      OPENSSL_malloc(ecpointformatlist_length)) == NULL) {
1162                     *al = TLS1_AD_INTERNAL_ERROR;
1163                     return 0;
1164                 }
1165                 s->session->tlsext_ecpointformatlist_length =
1166                     ecpointformatlist_length;
1167                 memcpy(s->session->tlsext_ecpointformatlist, sdata,
1168                        ecpointformatlist_length);
1169             }
1170 #  if 0
1171             fprintf(stderr,
1172                     "ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ",
1173                     s->session->tlsext_ecpointformatlist_length);
1174             sdata = s->session->tlsext_ecpointformatlist;
1175             for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1176                 fprintf(stderr, "%i ", *(sdata++));
1177             fprintf(stderr, "\n");
1178 #  endif
1179         } else if (type == TLSEXT_TYPE_elliptic_curves) {
1180             unsigned char *sdata = data;
1181             int ellipticcurvelist_length = (*(sdata++) << 8);
1182             ellipticcurvelist_length += (*(sdata++));
1183
1184             if (ellipticcurvelist_length != size - 2 ||
1185                 ellipticcurvelist_length < 1 ||
1186                 /* Each NamedCurve is 2 bytes. */
1187                 ellipticcurvelist_length & 1)
1188                     goto err;
1189
1190             if (!s->hit) {
1191                 if (s->session->tlsext_ellipticcurvelist)
1192                     goto err;
1193
1194                 s->session->tlsext_ellipticcurvelist_length = 0;
1195                 if ((s->session->tlsext_ellipticcurvelist =
1196                      OPENSSL_malloc(ellipticcurvelist_length)) == NULL) {
1197                     *al = TLS1_AD_INTERNAL_ERROR;
1198                     return 0;
1199                 }
1200                 s->session->tlsext_ellipticcurvelist_length =
1201                     ellipticcurvelist_length;
1202                 memcpy(s->session->tlsext_ellipticcurvelist, sdata,
1203                        ellipticcurvelist_length);
1204             }
1205 #  if 0
1206             fprintf(stderr,
1207                     "ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ",
1208                     s->session->tlsext_ellipticcurvelist_length);
1209             sdata = s->session->tlsext_ellipticcurvelist;
1210             for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
1211                 fprintf(stderr, "%i ", *(sdata++));
1212             fprintf(stderr, "\n");
1213 #  endif
1214         }
1215 # endif                         /* OPENSSL_NO_EC */
1216 # ifdef TLSEXT_TYPE_opaque_prf_input
1217         else if (type == TLSEXT_TYPE_opaque_prf_input &&
1218                  s->version != DTLS1_VERSION) {
1219             unsigned char *sdata = data;
1220
1221             if (size < 2) {
1222                 *al = SSL_AD_DECODE_ERROR;
1223                 return 0;
1224             }
1225             n2s(sdata, s->s3->client_opaque_prf_input_len);
1226             if (s->s3->client_opaque_prf_input_len != size - 2) {
1227                 *al = SSL_AD_DECODE_ERROR;
1228                 return 0;
1229             }
1230
1231             if (s->s3->client_opaque_prf_input != NULL) {
1232                 /* shouldn't really happen */
1233                 OPENSSL_free(s->s3->client_opaque_prf_input);
1234             }
1235
1236             /* dummy byte just to get non-NULL */
1237             if (s->s3->client_opaque_prf_input_len == 0)
1238                 s->s3->client_opaque_prf_input = OPENSSL_malloc(1);
1239             else
1240                 s->s3->client_opaque_prf_input =
1241                     BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
1242             if (s->s3->client_opaque_prf_input == NULL) {
1243                 *al = TLS1_AD_INTERNAL_ERROR;
1244                 return 0;
1245             }
1246         }
1247 # endif
1248         else if (type == TLSEXT_TYPE_session_ticket) {
1249             if (s->tls_session_ticket_ext_cb &&
1250                 !s->tls_session_ticket_ext_cb(s, data, size,
1251                                               s->tls_session_ticket_ext_cb_arg))
1252             {
1253                 *al = TLS1_AD_INTERNAL_ERROR;
1254                 return 0;
1255             }
1256         } else if (type == TLSEXT_TYPE_renegotiate) {
1257             if (!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1258                 return 0;
1259             renegotiate_seen = 1;
1260         } else if (type == TLSEXT_TYPE_signature_algorithms) {
1261             int dsize;
1262             if (sigalg_seen || size < 2)
1263                 goto err;
1264             sigalg_seen = 1;
1265             n2s(data, dsize);
1266             size -= 2;
1267             if (dsize != size || dsize & 1)
1268                 goto err;
1269             if (!tls1_process_sigalgs(s, data, dsize))
1270                 goto err;
1271         } else if (type == TLSEXT_TYPE_status_request &&
1272                    s->version != DTLS1_VERSION) {
1273
1274             if (size < 5)
1275                 goto err;
1276
1277             s->tlsext_status_type = *data++;
1278             size--;
1279             if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp) {
1280                 const unsigned char *sdata;
1281                 int dsize;
1282                 /* Read in responder_id_list */
1283                 n2s(data, dsize);
1284                 size -= 2;
1285                 if (dsize > size)
1286                     goto err;
1287                 while (dsize > 0) {
1288                     OCSP_RESPID *id;
1289                     int idsize;
1290                     if (dsize < 4)
1291                         goto err;
1292                     n2s(data, idsize);
1293                     dsize -= 2 + idsize;
1294                     size -= 2 + idsize;
1295                     if (dsize < 0)
1296                         goto err;
1297                     sdata = data;
1298                     data += idsize;
1299                     id = d2i_OCSP_RESPID(NULL, &sdata, idsize);
1300                     if (!id)
1301                         goto err;
1302                     if (data != sdata) {
1303                         OCSP_RESPID_free(id);
1304                         goto err;
1305                     }
1306                     if (!s->tlsext_ocsp_ids
1307                         && !(s->tlsext_ocsp_ids =
1308                              sk_OCSP_RESPID_new_null())) {
1309                         OCSP_RESPID_free(id);
1310                         *al = SSL_AD_INTERNAL_ERROR;
1311                         return 0;
1312                     }
1313                     if (!sk_OCSP_RESPID_push(s->tlsext_ocsp_ids, id)) {
1314                         OCSP_RESPID_free(id);
1315                         *al = SSL_AD_INTERNAL_ERROR;
1316                         return 0;
1317                     }
1318                 }
1319
1320                 /* Read in request_extensions */
1321                 if (size < 2)
1322                     goto err;
1323                 n2s(data, dsize);
1324                 size -= 2;
1325                 if (dsize != size)
1326                     goto err;
1327                 sdata = data;
1328                 if (dsize > 0) {
1329                     if (s->tlsext_ocsp_exts) {
1330                         sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1331                                                    X509_EXTENSION_free);
1332                     }
1333
1334                     s->tlsext_ocsp_exts =
1335                         d2i_X509_EXTENSIONS(NULL, &sdata, dsize);
1336                     if (!s->tlsext_ocsp_exts || (data + dsize != sdata))
1337                         goto err;
1338                 }
1339             }
1340             /*
1341              * We don't know what to do with any other type * so ignore it.
1342              */
1343             else
1344                 s->tlsext_status_type = -1;
1345         }
1346 # ifndef OPENSSL_NO_HEARTBEATS
1347         else if (type == TLSEXT_TYPE_heartbeat) {
1348             switch (data[0]) {
1349             case 0x01:         /* Client allows us to send HB requests */
1350                 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1351                 break;
1352             case 0x02:         /* Client doesn't accept HB requests */
1353                 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1354                 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1355                 break;
1356             default:
1357                 *al = SSL_AD_ILLEGAL_PARAMETER;
1358                 return 0;
1359             }
1360         }
1361 # endif
1362 # ifndef OPENSSL_NO_NEXTPROTONEG
1363         else if (type == TLSEXT_TYPE_next_proto_neg &&
1364                  s->s3->tmp.finish_md_len == 0) {
1365             /*-
1366              * We shouldn't accept this extension on a
1367              * renegotiation.
1368              *
1369              * s->new_session will be set on renegotiation, but we
1370              * probably shouldn't rely that it couldn't be set on
1371              * the initial renegotation too in certain cases (when
1372              * there's some other reason to disallow resuming an
1373              * earlier session -- the current code won't be doing
1374              * anything like that, but this might change).
1375              *
1376              * A valid sign that there's been a previous handshake
1377              * in this connection is if s->s3->tmp.finish_md_len >
1378              * 0.  (We are talking about a check that will happen
1379              * in the Hello protocol round, well before a new
1380              * Finished message could have been computed.)
1381              */
1382             s->s3->next_proto_neg_seen = 1;
1383         }
1384 # endif
1385
1386         /* session ticket processed earlier */
1387 # ifndef OPENSSL_NO_SRTP
1388         else if (SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s)
1389                  && type == TLSEXT_TYPE_use_srtp) {
1390             if (ssl_parse_clienthello_use_srtp_ext(s, data, size, al))
1391                 return 0;
1392         }
1393 # endif
1394
1395         data += size;
1396     }
1397
1398     /* Spurious data on the end */
1399     if (data != limit)
1400         goto err;
1401
1402     *p = data;
1403
1404  ri_check:
1405
1406     /* Need RI if renegotiating */
1407
1408     if (!renegotiate_seen && s->renegotiate &&
1409         !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) {
1410         *al = SSL_AD_HANDSHAKE_FAILURE;
1411         SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1412                SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1413         return 0;
1414     }
1415
1416     return 1;
1417 err:
1418     *al = SSL_AD_DECODE_ERROR;
1419     return 0;
1420 }
1421
1422 # ifndef OPENSSL_NO_NEXTPROTONEG
1423 /*
1424  * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1425  * elements of zero length are allowed and the set of elements must exactly
1426  * fill the length of the block.
1427  */
1428 static char ssl_next_proto_validate(unsigned char *d, unsigned len)
1429 {
1430     unsigned int off = 0;
1431
1432     while (off < len) {
1433         if (d[off] == 0)
1434             return 0;
1435         off += d[off];
1436         off++;
1437     }
1438
1439     return off == len;
1440 }
1441 # endif
1442
1443 int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1444                                  int n, int *al)
1445 {
1446     unsigned short length;
1447     unsigned short type;
1448     unsigned short size;
1449     unsigned char *data = *p;
1450     int tlsext_servername = 0;
1451     int renegotiate_seen = 0;
1452
1453 # ifndef OPENSSL_NO_NEXTPROTONEG
1454     s->s3->next_proto_neg_seen = 0;
1455 # endif
1456     s->tlsext_ticket_expected = 0;
1457
1458 # ifndef OPENSSL_NO_HEARTBEATS
1459     s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1460                              SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1461 # endif
1462
1463     if (data >= (d + n - 2))
1464         goto ri_check;
1465
1466     n2s(data, length);
1467     if (data + length != d + n) {
1468         *al = SSL_AD_DECODE_ERROR;
1469         return 0;
1470     }
1471
1472     while (data <= (d + n - 4)) {
1473         n2s(data, type);
1474         n2s(data, size);
1475
1476         if (data + size > (d + n))
1477             goto ri_check;
1478
1479         if (s->tlsext_debug_cb)
1480             s->tlsext_debug_cb(s, 1, type, data, size, s->tlsext_debug_arg);
1481
1482         if (type == TLSEXT_TYPE_server_name) {
1483             if (s->tlsext_hostname == NULL || size > 0) {
1484                 *al = TLS1_AD_UNRECOGNIZED_NAME;
1485                 return 0;
1486             }
1487             tlsext_servername = 1;
1488         }
1489 # ifndef OPENSSL_NO_EC
1490         else if (type == TLSEXT_TYPE_ec_point_formats) {
1491             unsigned char *sdata = data;
1492             int ecpointformatlist_length = *(sdata++);
1493
1494             if (ecpointformatlist_length != size - 1 ||
1495                 ecpointformatlist_length < 1) {
1496                 *al = TLS1_AD_DECODE_ERROR;
1497                 return 0;
1498             }
1499             if (!s->hit) {
1500                 s->session->tlsext_ecpointformatlist_length = 0;
1501                 if (s->session->tlsext_ecpointformatlist != NULL)
1502                     OPENSSL_free(s->session->tlsext_ecpointformatlist);
1503                 if ((s->session->tlsext_ecpointformatlist =
1504                      OPENSSL_malloc(ecpointformatlist_length)) == NULL) {
1505                     *al = TLS1_AD_INTERNAL_ERROR;
1506                     return 0;
1507                 }
1508                 s->session->tlsext_ecpointformatlist_length =
1509                     ecpointformatlist_length;
1510                 memcpy(s->session->tlsext_ecpointformatlist, sdata,
1511                        ecpointformatlist_length);
1512             }
1513 #  if 0
1514             fprintf(stderr,
1515                     "ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1516             sdata = s->session->tlsext_ecpointformatlist;
1517             for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1518                 fprintf(stderr, "%i ", *(sdata++));
1519             fprintf(stderr, "\n");
1520 #  endif
1521         }
1522 # endif                         /* OPENSSL_NO_EC */
1523
1524         else if (type == TLSEXT_TYPE_session_ticket) {
1525             if (s->tls_session_ticket_ext_cb &&
1526                 !s->tls_session_ticket_ext_cb(s, data, size,
1527                                               s->tls_session_ticket_ext_cb_arg))
1528             {
1529                 *al = TLS1_AD_INTERNAL_ERROR;
1530                 return 0;
1531             }
1532             if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1533                 || (size > 0)) {
1534                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1535                 return 0;
1536             }
1537             s->tlsext_ticket_expected = 1;
1538         }
1539 # ifdef TLSEXT_TYPE_opaque_prf_input
1540         else if (type == TLSEXT_TYPE_opaque_prf_input &&
1541                  s->version != DTLS1_VERSION) {
1542             unsigned char *sdata = data;
1543
1544             if (size < 2) {
1545                 *al = SSL_AD_DECODE_ERROR;
1546                 return 0;
1547             }
1548             n2s(sdata, s->s3->server_opaque_prf_input_len);
1549             if (s->s3->server_opaque_prf_input_len != size - 2) {
1550                 *al = SSL_AD_DECODE_ERROR;
1551                 return 0;
1552             }
1553
1554             if (s->s3->server_opaque_prf_input != NULL) {
1555                 /* shouldn't really happen */
1556                 OPENSSL_free(s->s3->server_opaque_prf_input);
1557             }
1558             if (s->s3->server_opaque_prf_input_len == 0) {
1559                 /* dummy byte just to get non-NULL */
1560                 s->s3->server_opaque_prf_input = OPENSSL_malloc(1);
1561             } else {
1562                 s->s3->server_opaque_prf_input =
1563                     BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1564             }
1565
1566             if (s->s3->server_opaque_prf_input == NULL) {
1567                 *al = TLS1_AD_INTERNAL_ERROR;
1568                 return 0;
1569             }
1570         }
1571 # endif
1572         else if (type == TLSEXT_TYPE_status_request &&
1573                  s->version != DTLS1_VERSION) {
1574             /*
1575              * MUST be empty and only sent if we've requested a status
1576              * request message.
1577              */
1578             if ((s->tlsext_status_type == -1) || (size > 0)) {
1579                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1580                 return 0;
1581             }
1582             /* Set flag to expect CertificateStatus message */
1583             s->tlsext_status_expected = 1;
1584         }
1585 # ifndef OPENSSL_NO_NEXTPROTONEG
1586         else if (type == TLSEXT_TYPE_next_proto_neg &&
1587                  s->s3->tmp.finish_md_len == 0) {
1588             unsigned char *selected;
1589             unsigned char selected_len;
1590
1591             /* We must have requested it. */
1592             if (s->ctx->next_proto_select_cb == NULL) {
1593                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1594                 return 0;
1595             }
1596             /* The data must be valid */
1597             if (!ssl_next_proto_validate(data, size)) {
1598                 *al = TLS1_AD_DECODE_ERROR;
1599                 return 0;
1600             }
1601             if (s->
1602                 ctx->next_proto_select_cb(s, &selected, &selected_len, data,
1603                                           size,
1604                                           s->ctx->next_proto_select_cb_arg) !=
1605                 SSL_TLSEXT_ERR_OK) {
1606                 *al = TLS1_AD_INTERNAL_ERROR;
1607                 return 0;
1608             }
1609             s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1610             if (!s->next_proto_negotiated) {
1611                 *al = TLS1_AD_INTERNAL_ERROR;
1612                 return 0;
1613             }
1614             memcpy(s->next_proto_negotiated, selected, selected_len);
1615             s->next_proto_negotiated_len = selected_len;
1616             s->s3->next_proto_neg_seen = 1;
1617         }
1618 # endif
1619         else if (type == TLSEXT_TYPE_renegotiate) {
1620             if (!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1621                 return 0;
1622             renegotiate_seen = 1;
1623         }
1624 # ifndef OPENSSL_NO_HEARTBEATS
1625         else if (type == TLSEXT_TYPE_heartbeat) {
1626             switch (data[0]) {
1627             case 0x01:         /* Server allows us to send HB requests */
1628                 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1629                 break;
1630             case 0x02:         /* Server doesn't accept HB requests */
1631                 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1632                 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1633                 break;
1634             default:
1635                 *al = SSL_AD_ILLEGAL_PARAMETER;
1636                 return 0;
1637             }
1638         }
1639 # endif
1640 # ifndef OPENSSL_NO_SRTP
1641         else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) {
1642             if (ssl_parse_serverhello_use_srtp_ext(s, data, size, al))
1643                 return 0;
1644         }
1645 # endif
1646
1647         data += size;
1648     }
1649
1650     if (data != d + n) {
1651         *al = SSL_AD_DECODE_ERROR;
1652         return 0;
1653     }
1654
1655     if (!s->hit && tlsext_servername == 1) {
1656         if (s->tlsext_hostname) {
1657             if (s->session->tlsext_hostname == NULL) {
1658                 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1659                 if (!s->session->tlsext_hostname) {
1660                     *al = SSL_AD_UNRECOGNIZED_NAME;
1661                     return 0;
1662                 }
1663             } else {
1664                 *al = SSL_AD_DECODE_ERROR;
1665                 return 0;
1666             }
1667         }
1668     }
1669
1670     *p = data;
1671
1672  ri_check:
1673
1674     /*
1675      * Determine if we need to see RI. Strictly speaking if we want to avoid
1676      * an attack we should *always* see RI even on initial server hello
1677      * because the client doesn't see any renegotiation during an attack.
1678      * However this would mean we could not connect to any server which
1679      * doesn't support RI so for the immediate future tolerate RI absence on
1680      * initial connect only.
1681      */
1682     if (!renegotiate_seen && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1683         && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) {
1684         *al = SSL_AD_HANDSHAKE_FAILURE;
1685         SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1686                SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1687         return 0;
1688     }
1689
1690     return 1;
1691 }
1692
1693 int ssl_prepare_clienthello_tlsext(SSL *s)
1694 {
1695 # ifndef OPENSSL_NO_EC
1696     /*
1697      * If we are client and using an elliptic curve cryptography cipher
1698      * suite, send the point formats and elliptic curves we support.
1699      */
1700     int using_ecc = 0;
1701     int i;
1702     unsigned char *j;
1703     unsigned long alg_k, alg_a;
1704     STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1705
1706     for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++) {
1707         SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1708
1709         alg_k = c->algorithm_mkey;
1710         alg_a = c->algorithm_auth;
1711         if ((alg_k & (SSL_kEECDH | SSL_kECDHr | SSL_kECDHe)
1712              || (alg_a & SSL_aECDSA))) {
1713             using_ecc = 1;
1714             break;
1715         }
1716     }
1717     using_ecc = using_ecc && (s->version >= TLS1_VERSION);
1718     if (using_ecc) {
1719         if (s->tlsext_ecpointformatlist != NULL)
1720             OPENSSL_free(s->tlsext_ecpointformatlist);
1721         if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL) {
1722             SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,
1723                    ERR_R_MALLOC_FAILURE);
1724             return -1;
1725         }
1726         s->tlsext_ecpointformatlist_length = 3;
1727         s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1728         s->tlsext_ecpointformatlist[1] =
1729             TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1730         s->tlsext_ecpointformatlist[2] =
1731             TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1732
1733         /* we support all named elliptic curves in RFC 4492 */
1734         if (s->tlsext_ellipticcurvelist != NULL)
1735             OPENSSL_free(s->tlsext_ellipticcurvelist);
1736         s->tlsext_ellipticcurvelist_length =
1737             sizeof(pref_list) / sizeof(pref_list[0]) * 2;
1738         if ((s->tlsext_ellipticcurvelist =
1739              OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL) {
1740             s->tlsext_ellipticcurvelist_length = 0;
1741             SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,
1742                    ERR_R_MALLOC_FAILURE);
1743             return -1;
1744         }
1745         for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1746              sizeof(pref_list) / sizeof(pref_list[0]); i++) {
1747             int id = tls1_ec_nid2curve_id(pref_list[i]);
1748             s2n(id, j);
1749         }
1750     }
1751 # endif                         /* OPENSSL_NO_EC */
1752
1753 # ifdef TLSEXT_TYPE_opaque_prf_input
1754     {
1755         int r = 1;
1756
1757         if (s->ctx->tlsext_opaque_prf_input_callback != 0) {
1758             r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0,
1759                                                          s->
1760                                                          ctx->tlsext_opaque_prf_input_callback_arg);
1761             if (!r)
1762                 return -1;
1763         }
1764
1765         if (s->tlsext_opaque_prf_input != NULL) {
1766             if (s->s3->client_opaque_prf_input != NULL) {
1767                 /* shouldn't really happen */
1768                 OPENSSL_free(s->s3->client_opaque_prf_input);
1769             }
1770
1771             if (s->tlsext_opaque_prf_input_len == 0) {
1772                 /* dummy byte just to get non-NULL */
1773                 s->s3->client_opaque_prf_input = OPENSSL_malloc(1);
1774             } else {
1775                 s->s3->client_opaque_prf_input =
1776                     BUF_memdup(s->tlsext_opaque_prf_input,
1777                                s->tlsext_opaque_prf_input_len);
1778             }
1779             if (s->s3->client_opaque_prf_input == NULL) {
1780                 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,
1781                        ERR_R_MALLOC_FAILURE);
1782                 return -1;
1783             }
1784             s->s3->client_opaque_prf_input_len =
1785                 s->tlsext_opaque_prf_input_len;
1786         }
1787
1788         if (r == 2)
1789             /*
1790              * at callback's request, insist on receiving an appropriate
1791              * server opaque PRF input
1792              */
1793             s->s3->server_opaque_prf_input_len =
1794                 s->tlsext_opaque_prf_input_len;
1795     }
1796 # endif
1797
1798     return 1;
1799 }
1800
1801 int ssl_prepare_serverhello_tlsext(SSL *s)
1802 {
1803 # ifndef OPENSSL_NO_EC
1804     /*
1805      * If we are server and using an ECC cipher suite, send the point formats
1806      * we support if the client sent us an ECPointsFormat extension.  Note
1807      * that the server is not supposed to send an EllipticCurves extension.
1808      */
1809
1810     unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1811     unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1812     int using_ecc = (alg_k & (SSL_kEECDH | SSL_kECDHr | SSL_kECDHe))
1813         || (alg_a & SSL_aECDSA);
1814     using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1815
1816     if (using_ecc) {
1817         if (s->tlsext_ecpointformatlist != NULL)
1818             OPENSSL_free(s->tlsext_ecpointformatlist);
1819         if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL) {
1820             SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,
1821                    ERR_R_MALLOC_FAILURE);
1822             return -1;
1823         }
1824         s->tlsext_ecpointformatlist_length = 3;
1825         s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1826         s->tlsext_ecpointformatlist[1] =
1827             TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1828         s->tlsext_ecpointformatlist[2] =
1829             TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1830     }
1831 # endif                         /* OPENSSL_NO_EC */
1832
1833     return 1;
1834 }
1835
1836 int ssl_check_clienthello_tlsext_early(SSL *s)
1837 {
1838     int ret = SSL_TLSEXT_ERR_NOACK;
1839     int al = SSL_AD_UNRECOGNIZED_NAME;
1840
1841 # ifndef OPENSSL_NO_EC
1842     /*
1843      * The handling of the ECPointFormats extension is done elsewhere, namely
1844      * in ssl3_choose_cipher in s3_lib.c.
1845      */
1846     /*
1847      * The handling of the EllipticCurves extension is done elsewhere, namely
1848      * in ssl3_choose_cipher in s3_lib.c.
1849      */
1850 # endif
1851
1852     if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1853         ret =
1854             s->ctx->tlsext_servername_callback(s, &al,
1855                                                s->ctx->tlsext_servername_arg);
1856     else if (s->initial_ctx != NULL
1857              && s->initial_ctx->tlsext_servername_callback != 0)
1858         ret =
1859             s->initial_ctx->tlsext_servername_callback(s, &al,
1860                                                        s->
1861                                                        initial_ctx->tlsext_servername_arg);
1862
1863 # ifdef TLSEXT_TYPE_opaque_prf_input
1864     {
1865         /*
1866          * This sort of belongs into ssl_prepare_serverhello_tlsext(), but we
1867          * might be sending an alert in response to the client hello, so this
1868          * has to happen here in ssl_check_clienthello_tlsext_early().
1869          */
1870
1871         int r = 1;
1872
1873         if (s->ctx->tlsext_opaque_prf_input_callback != 0) {
1874             r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0,
1875                                                          s->
1876                                                          ctx->tlsext_opaque_prf_input_callback_arg);
1877             if (!r) {
1878                 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1879                 al = SSL_AD_INTERNAL_ERROR;
1880                 goto err;
1881             }
1882         }
1883
1884         if (s->s3->server_opaque_prf_input != NULL) {
1885             /* shouldn't really happen */
1886             OPENSSL_free(s->s3->server_opaque_prf_input);
1887         }
1888         s->s3->server_opaque_prf_input = NULL;
1889
1890         if (s->tlsext_opaque_prf_input != NULL) {
1891             if (s->s3->client_opaque_prf_input != NULL &&
1892                 s->s3->client_opaque_prf_input_len ==
1893                 s->tlsext_opaque_prf_input_len) {
1894                 /*
1895                  * can only use this extension if we have a server opaque PRF
1896                  * input of the same length as the client opaque PRF input!
1897                  */
1898
1899                 if (s->tlsext_opaque_prf_input_len == 0) {
1900                     /* dummy byte just to get non-NULL */
1901                     s->s3->server_opaque_prf_input = OPENSSL_malloc(1);
1902                 } else {
1903                     s->s3->server_opaque_prf_input =
1904                         BUF_memdup(s->tlsext_opaque_prf_input,
1905                                    s->tlsext_opaque_prf_input_len);
1906                 }
1907                 if (s->s3->server_opaque_prf_input == NULL) {
1908                     ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1909                     al = SSL_AD_INTERNAL_ERROR;
1910                     goto err;
1911                 }
1912                 s->s3->server_opaque_prf_input_len =
1913                     s->tlsext_opaque_prf_input_len;
1914             }
1915         }
1916
1917         if (r == 2 && s->s3->server_opaque_prf_input == NULL) {
1918             /*
1919              * The callback wants to enforce use of the extension, but we
1920              * can't do that with the client opaque PRF input; abort the
1921              * handshake.
1922              */
1923             ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1924             al = SSL_AD_HANDSHAKE_FAILURE;
1925         }
1926     }
1927
1928  err:
1929 # endif
1930     switch (ret) {
1931     case SSL_TLSEXT_ERR_ALERT_FATAL:
1932         ssl3_send_alert(s, SSL3_AL_FATAL, al);
1933         return -1;
1934
1935     case SSL_TLSEXT_ERR_ALERT_WARNING:
1936         ssl3_send_alert(s, SSL3_AL_WARNING, al);
1937         return 1;
1938
1939     case SSL_TLSEXT_ERR_NOACK:
1940         s->servername_done = 0;
1941     default:
1942         return 1;
1943     }
1944 }
1945
1946 int ssl_check_clienthello_tlsext_late(SSL *s)
1947 {
1948     int ret = SSL_TLSEXT_ERR_OK;
1949     int al;
1950
1951     /*
1952      * If status request then ask callback what to do. Note: this must be
1953      * called after servername callbacks in case the certificate has
1954      * changed, and must be called after the cipher has been chosen because
1955      * this may influence which certificate is sent
1956      */
1957     if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb) {
1958         int r;
1959         CERT_PKEY *certpkey;
1960         certpkey = ssl_get_server_send_pkey(s);
1961         /* If no certificate can't return certificate status */
1962         if (certpkey == NULL) {
1963             s->tlsext_status_expected = 0;
1964             return 1;
1965         }
1966         /*
1967          * Set current certificate to one we will use so SSL_get_certificate
1968          * et al can pick it up.
1969          */
1970         s->cert->key = certpkey;
1971         r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1972         switch (r) {
1973             /* We don't want to send a status request response */
1974         case SSL_TLSEXT_ERR_NOACK:
1975             s->tlsext_status_expected = 0;
1976             break;
1977             /* status request response should be sent */
1978         case SSL_TLSEXT_ERR_OK:
1979             if (s->tlsext_ocsp_resp)
1980                 s->tlsext_status_expected = 1;
1981             else
1982                 s->tlsext_status_expected = 0;
1983             break;
1984             /* something bad happened */
1985         case SSL_TLSEXT_ERR_ALERT_FATAL:
1986             ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1987             al = SSL_AD_INTERNAL_ERROR;
1988             goto err;
1989         }
1990     } else
1991         s->tlsext_status_expected = 0;
1992
1993  err:
1994     switch (ret) {
1995     case SSL_TLSEXT_ERR_ALERT_FATAL:
1996         ssl3_send_alert(s, SSL3_AL_FATAL, al);
1997         return -1;
1998
1999     case SSL_TLSEXT_ERR_ALERT_WARNING:
2000         ssl3_send_alert(s, SSL3_AL_WARNING, al);
2001         return 1;
2002
2003     default:
2004         return 1;
2005     }
2006 }
2007
2008 int ssl_check_serverhello_tlsext(SSL *s)
2009 {
2010     int ret = SSL_TLSEXT_ERR_NOACK;
2011     int al = SSL_AD_UNRECOGNIZED_NAME;
2012
2013 # ifndef OPENSSL_NO_EC
2014     /*
2015      * If we are client and using an elliptic curve cryptography cipher
2016      * suite, then if server returns an EC point formats lists extension it
2017      * must contain uncompressed.
2018      */
2019     unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
2020     unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
2021     if ((s->tlsext_ecpointformatlist != NULL)
2022         && (s->tlsext_ecpointformatlist_length > 0)
2023         && (s->session->tlsext_ecpointformatlist != NULL)
2024         && (s->session->tlsext_ecpointformatlist_length > 0)
2025         && ((alg_k & (SSL_kEECDH | SSL_kECDHr | SSL_kECDHe))
2026             || (alg_a & SSL_aECDSA))) {
2027         /* we are using an ECC cipher */
2028         size_t i;
2029         unsigned char *list;
2030         int found_uncompressed = 0;
2031         list = s->session->tlsext_ecpointformatlist;
2032         for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++) {
2033             if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed) {
2034                 found_uncompressed = 1;
2035                 break;
2036             }
2037         }
2038         if (!found_uncompressed) {
2039             SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,
2040                    SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
2041             return -1;
2042         }
2043     }
2044     ret = SSL_TLSEXT_ERR_OK;
2045 # endif                         /* OPENSSL_NO_EC */
2046
2047     if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2048         ret =
2049             s->ctx->tlsext_servername_callback(s, &al,
2050                                                s->ctx->tlsext_servername_arg);
2051     else if (s->initial_ctx != NULL
2052              && s->initial_ctx->tlsext_servername_callback != 0)
2053         ret =
2054             s->initial_ctx->tlsext_servername_callback(s, &al,
2055                                                        s->
2056                                                        initial_ctx->tlsext_servername_arg);
2057
2058 # ifdef TLSEXT_TYPE_opaque_prf_input
2059     if (s->s3->server_opaque_prf_input_len > 0) {
2060         /*
2061          * This case may indicate that we, as a client, want to insist on
2062          * using opaque PRF inputs. So first verify that we really have a
2063          * value from the server too.
2064          */
2065
2066         if (s->s3->server_opaque_prf_input == NULL) {
2067             ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2068             al = SSL_AD_HANDSHAKE_FAILURE;
2069         }
2070
2071         /*
2072          * Anytime the server *has* sent an opaque PRF input, we need to
2073          * check that we have a client opaque PRF input of the same size.
2074          */
2075         if (s->s3->client_opaque_prf_input == NULL ||
2076             s->s3->client_opaque_prf_input_len !=
2077             s->s3->server_opaque_prf_input_len) {
2078             ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2079             al = SSL_AD_ILLEGAL_PARAMETER;
2080         }
2081     }
2082 # endif
2083
2084     OPENSSL_free(s->tlsext_ocsp_resp);
2085     s->tlsext_ocsp_resp = NULL;
2086     s->tlsext_ocsp_resplen = -1;
2087     /*
2088      * If we've requested certificate status and we wont get one tell the
2089      * callback
2090      */
2091     if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
2092         && !(s->hit) && s->ctx && s->ctx->tlsext_status_cb) {
2093         int r;
2094         /*
2095          * Call callback with resp == NULL and resplen == -1 so callback
2096          * knows there is no response
2097          */
2098         r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2099         if (r == 0) {
2100             al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2101             ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2102         }
2103         if (r < 0) {
2104             al = SSL_AD_INTERNAL_ERROR;
2105             ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2106         }
2107     }
2108
2109     switch (ret) {
2110     case SSL_TLSEXT_ERR_ALERT_FATAL:
2111         ssl3_send_alert(s, SSL3_AL_FATAL, al);
2112         return -1;
2113
2114     case SSL_TLSEXT_ERR_ALERT_WARNING:
2115         ssl3_send_alert(s, SSL3_AL_WARNING, al);
2116         return 1;
2117
2118     case SSL_TLSEXT_ERR_NOACK:
2119         s->servername_done = 0;
2120     default:
2121         return 1;
2122     }
2123 }
2124
2125 /*-
2126  * Since the server cache lookup is done early on in the processing of the
2127  * ClientHello, and other operations depend on the result, we need to handle
2128  * any TLS session ticket extension at the same time.
2129  *
2130  *   session_id: points at the session ID in the ClientHello. This code will
2131  *       read past the end of this in order to parse out the session ticket
2132  *       extension, if any.
2133  *   len: the length of the session ID.
2134  *   limit: a pointer to the first byte after the ClientHello.
2135  *   ret: (output) on return, if a ticket was decrypted, then this is set to
2136  *       point to the resulting session.
2137  *
2138  * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2139  * ciphersuite, in which case we have no use for session tickets and one will
2140  * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2141  *
2142  * Returns:
2143  *   -1: fatal error, either from parsing or decrypting the ticket.
2144  *    0: no ticket was found (or was ignored, based on settings).
2145  *    1: a zero length extension was found, indicating that the client supports
2146  *       session tickets but doesn't currently have one to offer.
2147  *    2: either s->tls_session_secret_cb was set, or a ticket was offered but
2148  *       couldn't be decrypted because of a non-fatal error.
2149  *    3: a ticket was successfully decrypted and *ret was set.
2150  *
2151  * Side effects:
2152  *   Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2153  *   a new session ticket to the client because the client indicated support
2154  *   (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2155  *   a session ticket or we couldn't use the one it gave us, or if
2156  *   s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2157  *   Otherwise, s->tlsext_ticket_expected is set to 0.
2158  */
2159 int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
2160                         const unsigned char *limit, SSL_SESSION **ret)
2161 {
2162     /* Point after session ID in client hello */
2163     const unsigned char *p = session_id + len;
2164     unsigned short i;
2165
2166     *ret = NULL;
2167     s->tlsext_ticket_expected = 0;
2168
2169     /*
2170      * If tickets disabled behave as if no ticket present to permit stateful
2171      * resumption.
2172      */
2173     if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2174         return 0;
2175     if ((s->version <= SSL3_VERSION) || !limit)
2176         return 0;
2177     if (p >= limit)
2178         return -1;
2179     /* Skip past DTLS cookie */
2180     if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER) {
2181         i = *(p++);
2182         p += i;
2183         if (p >= limit)
2184             return -1;
2185     }
2186     /* Skip past cipher list */
2187     n2s(p, i);
2188     p += i;
2189     if (p >= limit)
2190         return -1;
2191     /* Skip past compression algorithm list */
2192     i = *(p++);
2193     p += i;
2194     if (p > limit)
2195         return -1;
2196     /* Now at start of extensions */
2197     if ((p + 2) >= limit)
2198         return 0;
2199     n2s(p, i);
2200     while ((p + 4) <= limit) {
2201         unsigned short type, size;
2202         n2s(p, type);
2203         n2s(p, size);
2204         if (p + size > limit)
2205             return 0;
2206         if (type == TLSEXT_TYPE_session_ticket) {
2207             int r;
2208             if (size == 0) {
2209                 /*
2210                  * The client will accept a ticket but doesn't currently have
2211                  * one.
2212                  */
2213                 s->tlsext_ticket_expected = 1;
2214                 return 1;
2215             }
2216             if (s->tls_session_secret_cb) {
2217                 /*
2218                  * Indicate that the ticket couldn't be decrypted rather than
2219                  * generating the session from ticket now, trigger
2220                  * abbreviated handshake based on external mechanism to
2221                  * calculate the master secret later.
2222                  */
2223                 return 2;
2224             }
2225             r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2226             switch (r) {
2227             case 2:            /* ticket couldn't be decrypted */
2228                 s->tlsext_ticket_expected = 1;
2229                 return 2;
2230             case 3:            /* ticket was decrypted */
2231                 return r;
2232             case 4:            /* ticket decrypted but need to renew */
2233                 s->tlsext_ticket_expected = 1;
2234                 return 3;
2235             default:           /* fatal error */
2236                 return -1;
2237             }
2238         }
2239         p += size;
2240     }
2241     return 0;
2242 }
2243
2244 /*-
2245  * tls_decrypt_ticket attempts to decrypt a session ticket.
2246  *
2247  *   etick: points to the body of the session ticket extension.
2248  *   eticklen: the length of the session tickets extenion.
2249  *   sess_id: points at the session ID.
2250  *   sesslen: the length of the session ID.
2251  *   psess: (output) on return, if a ticket was decrypted, then this is set to
2252  *       point to the resulting session.
2253  *
2254  * Returns:
2255  *   -1: fatal error, either from parsing or decrypting the ticket.
2256  *    2: the ticket couldn't be decrypted.
2257  *    3: a ticket was successfully decrypted and *psess was set.
2258  *    4: same as 3, but the ticket needs to be renewed.
2259  */
2260 static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
2261                               int eticklen, const unsigned char *sess_id,
2262                               int sesslen, SSL_SESSION **psess)
2263 {
2264     SSL_SESSION *sess;
2265     unsigned char *sdec;
2266     const unsigned char *p;
2267     int slen, mlen, renew_ticket = 0;
2268     unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2269     HMAC_CTX hctx;
2270     EVP_CIPHER_CTX ctx;
2271     SSL_CTX *tctx = s->initial_ctx;
2272     /* Need at least keyname + iv + some encrypted data */
2273     if (eticklen < 48)
2274         return 2;
2275     /* Initialize session ticket encryption and HMAC contexts */
2276     HMAC_CTX_init(&hctx);
2277     EVP_CIPHER_CTX_init(&ctx);
2278     if (tctx->tlsext_ticket_key_cb) {
2279         unsigned char *nctick = (unsigned char *)etick;
2280         int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
2281                                             &ctx, &hctx, 0);
2282         if (rv < 0)
2283             return -1;
2284         if (rv == 0)
2285             return 2;
2286         if (rv == 2)
2287             renew_ticket = 1;
2288     } else {
2289         /* Check key name matches */
2290         if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
2291             return 2;
2292         if (HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
2293                          tlsext_tick_md(), NULL) <= 0
2294                 || EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
2295                                       tctx->tlsext_tick_aes_key,
2296                                       etick + 16) <= 0) {
2297             goto err;
2298        }
2299     }
2300     /*
2301      * Attempt to process session ticket, first conduct sanity and integrity
2302      * checks on ticket.
2303      */
2304     mlen = HMAC_size(&hctx);
2305     if (mlen < 0) {
2306         goto err;
2307     }
2308     eticklen -= mlen;
2309     /* Check HMAC of encrypted ticket */
2310     if (HMAC_Update(&hctx, etick, eticklen) <= 0
2311             || HMAC_Final(&hctx, tick_hmac, NULL) <= 0) {
2312         goto err;
2313     }
2314     HMAC_CTX_cleanup(&hctx);
2315     if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) {
2316         EVP_CIPHER_CTX_cleanup(&ctx);
2317         return 2;
2318     }
2319     /* Attempt to decrypt session data */
2320     /* Move p after IV to start of encrypted ticket, update length */
2321     p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2322     eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2323     sdec = OPENSSL_malloc(eticklen);
2324     if (!sdec || EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen) <= 0) {
2325         EVP_CIPHER_CTX_cleanup(&ctx);
2326         return -1;
2327     }
2328     if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0) {
2329         EVP_CIPHER_CTX_cleanup(&ctx);
2330         OPENSSL_free(sdec);
2331         return 2;
2332     }
2333     slen += mlen;
2334     EVP_CIPHER_CTX_cleanup(&ctx);
2335     p = sdec;
2336
2337     sess = d2i_SSL_SESSION(NULL, &p, slen);
2338     OPENSSL_free(sdec);
2339     if (sess) {
2340         /*
2341          * The session ID, if non-empty, is used by some clients to detect
2342          * that the ticket has been accepted. So we copy it to the session
2343          * structure. If it is empty set length to zero as required by
2344          * standard.
2345          */
2346         if (sesslen)
2347             memcpy(sess->session_id, sess_id, sesslen);
2348         sess->session_id_length = sesslen;
2349         *psess = sess;
2350         if (renew_ticket)
2351             return 4;
2352         else
2353             return 3;
2354     }
2355     ERR_clear_error();
2356     /*
2357      * For session parse failure, indicate that we need to send a new ticket.
2358      */
2359     return 2;
2360 err:
2361     EVP_CIPHER_CTX_cleanup(&ctx);
2362     HMAC_CTX_cleanup(&hctx);
2363     return -1;
2364 }
2365
2366 /* Tables to translate from NIDs to TLS v1.2 ids */
2367
2368 typedef struct {
2369     int nid;
2370     int id;
2371 } tls12_lookup;
2372
2373 static tls12_lookup tls12_md[] = {
2374 # ifndef OPENSSL_NO_MD5
2375     {NID_md5, TLSEXT_hash_md5},
2376 # endif
2377 # ifndef OPENSSL_NO_SHA
2378     {NID_sha1, TLSEXT_hash_sha1},
2379 # endif
2380 # ifndef OPENSSL_NO_SHA256
2381     {NID_sha224, TLSEXT_hash_sha224},
2382     {NID_sha256, TLSEXT_hash_sha256},
2383 # endif
2384 # ifndef OPENSSL_NO_SHA512
2385     {NID_sha384, TLSEXT_hash_sha384},
2386     {NID_sha512, TLSEXT_hash_sha512}
2387 # endif
2388 };
2389
2390 static tls12_lookup tls12_sig[] = {
2391 # ifndef OPENSSL_NO_RSA
2392     {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2393 # endif
2394 # ifndef OPENSSL_NO_DSA
2395     {EVP_PKEY_DSA, TLSEXT_signature_dsa},
2396 # endif
2397 # ifndef OPENSSL_NO_ECDSA
2398     {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2399 # endif
2400 };
2401
2402 static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2403 {
2404     size_t i;
2405     for (i = 0; i < tlen; i++) {
2406         if (table[i].nid == nid)
2407             return table[i].id;
2408     }
2409     return -1;
2410 }
2411
2412 # if 0
2413 static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
2414 {
2415     size_t i;
2416     for (i = 0; i < tlen; i++) {
2417         if (table[i].id == id)
2418             return table[i].nid;
2419     }
2420     return -1;
2421 }
2422 # endif
2423
2424 int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk,
2425                          const EVP_MD *md)
2426 {
2427     int sig_id, md_id;
2428     if (!md)
2429         return 0;
2430     md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2431                           sizeof(tls12_md) / sizeof(tls12_lookup));
2432     if (md_id == -1)
2433         return 0;
2434     sig_id = tls12_get_sigid(pk);
2435     if (sig_id == -1)
2436         return 0;
2437     p[0] = (unsigned char)md_id;
2438     p[1] = (unsigned char)sig_id;
2439     return 1;
2440 }
2441
2442 int tls12_get_sigid(const EVP_PKEY *pk)
2443 {
2444     return tls12_find_id(pk->type, tls12_sig,
2445                          sizeof(tls12_sig) / sizeof(tls12_lookup));
2446 }
2447
2448 const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2449 {
2450     switch (hash_alg) {
2451 # ifndef OPENSSL_NO_SHA
2452     case TLSEXT_hash_sha1:
2453         return EVP_sha1();
2454 # endif
2455 # ifndef OPENSSL_NO_SHA256
2456     case TLSEXT_hash_sha224:
2457         return EVP_sha224();
2458
2459     case TLSEXT_hash_sha256:
2460         return EVP_sha256();
2461 # endif
2462 # ifndef OPENSSL_NO_SHA512
2463     case TLSEXT_hash_sha384:
2464         return EVP_sha384();
2465
2466     case TLSEXT_hash_sha512:
2467         return EVP_sha512();
2468 # endif
2469     default:
2470         return NULL;
2471
2472     }
2473 }
2474
2475 /* Set preferred digest for each key type */
2476
2477 int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2478 {
2479     int i, idx;
2480     const EVP_MD *md;
2481     CERT *c = s->cert;
2482     /* Extension ignored for TLS versions below 1.2 */
2483     if (TLS1_get_version(s) < TLS1_2_VERSION)
2484         return 1;
2485     /* Should never happen */
2486     if (!c)
2487         return 0;
2488
2489     c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
2490     c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
2491     c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
2492     c->pkeys[SSL_PKEY_ECC].digest = NULL;
2493
2494     for (i = 0; i < dsize; i += 2) {
2495         unsigned char hash_alg = data[i], sig_alg = data[i + 1];
2496
2497         switch (sig_alg) {
2498 # ifndef OPENSSL_NO_RSA
2499         case TLSEXT_signature_rsa:
2500             idx = SSL_PKEY_RSA_SIGN;
2501             break;
2502 # endif
2503 # ifndef OPENSSL_NO_DSA
2504         case TLSEXT_signature_dsa:
2505             idx = SSL_PKEY_DSA_SIGN;
2506             break;
2507 # endif
2508 # ifndef OPENSSL_NO_ECDSA
2509         case TLSEXT_signature_ecdsa:
2510             idx = SSL_PKEY_ECC;
2511             break;
2512 # endif
2513         default:
2514             continue;
2515         }
2516
2517         if (c->pkeys[idx].digest == NULL) {
2518             md = tls12_get_hash(hash_alg);
2519             if (md) {
2520                 c->pkeys[idx].digest = md;
2521                 if (idx == SSL_PKEY_RSA_SIGN)
2522                     c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
2523             }
2524         }
2525
2526     }
2527
2528     /*
2529      * Set any remaining keys to default values. NOTE: if alg is not
2530      * supported it stays as NULL.
2531      */
2532 # ifndef OPENSSL_NO_DSA
2533     if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
2534         c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
2535 # endif
2536 # ifndef OPENSSL_NO_RSA
2537     if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest) {
2538         c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
2539         c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
2540     }
2541 # endif
2542 # ifndef OPENSSL_NO_ECDSA
2543     if (!c->pkeys[SSL_PKEY_ECC].digest)
2544         c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
2545 # endif
2546     return 1;
2547 }
2548
2549 #endif
2550
2551 #ifndef OPENSSL_NO_HEARTBEATS
2552 int tls1_process_heartbeat(SSL *s)
2553 {
2554     unsigned char *p = &s->s3->rrec.data[0], *pl;
2555     unsigned short hbtype;
2556     unsigned int payload;
2557     unsigned int padding = 16;  /* Use minimum padding */
2558
2559     if (s->msg_callback)
2560         s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2561                         &s->s3->rrec.data[0], s->s3->rrec.length,
2562                         s, s->msg_callback_arg);
2563
2564     /* Read type and payload length first */
2565     if (1 + 2 + 16 > s->s3->rrec.length)
2566         return 0;               /* silently discard */
2567     hbtype = *p++;
2568     n2s(p, payload);
2569     if (1 + 2 + payload + 16 > s->s3->rrec.length)
2570         return 0;               /* silently discard per RFC 6520 sec. 4 */
2571     pl = p;
2572
2573     if (hbtype == TLS1_HB_REQUEST) {
2574         unsigned char *buffer, *bp;
2575         int r;
2576
2577         /*
2578          * Allocate memory for the response, size is 1 bytes message type,
2579          * plus 2 bytes payload length, plus payload, plus padding
2580          */
2581         buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2582         bp = buffer;
2583
2584         /* Enter response type, length and copy payload */
2585         *bp++ = TLS1_HB_RESPONSE;
2586         s2n(payload, bp);
2587         memcpy(bp, pl, payload);
2588         bp += payload;
2589         /* Random padding */
2590         if (RAND_pseudo_bytes(bp, padding) < 0) {
2591             OPENSSL_free(buffer);
2592             return -1;
2593         }
2594
2595         r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer,
2596                              3 + payload + padding);
2597
2598         if (r >= 0 && s->msg_callback)
2599             s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2600                             buffer, 3 + payload + padding,
2601                             s, s->msg_callback_arg);
2602
2603         OPENSSL_free(buffer);
2604
2605         if (r < 0)
2606             return r;
2607     } else if (hbtype == TLS1_HB_RESPONSE) {
2608         unsigned int seq;
2609
2610         /*
2611          * We only send sequence numbers (2 bytes unsigned int), and 16
2612          * random bytes, so we just try to read the sequence number
2613          */
2614         n2s(pl, seq);
2615
2616         if (payload == 18 && seq == s->tlsext_hb_seq) {
2617             s->tlsext_hb_seq++;
2618             s->tlsext_hb_pending = 0;
2619         }
2620     }
2621
2622     return 0;
2623 }
2624
2625 int tls1_heartbeat(SSL *s)
2626 {
2627     unsigned char *buf, *p;
2628     int ret = -1;
2629     unsigned int payload = 18;  /* Sequence number + random bytes */
2630     unsigned int padding = 16;  /* Use minimum padding */
2631
2632     /* Only send if peer supports and accepts HB requests... */
2633     if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2634         s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS) {
2635         SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2636         return -1;
2637     }
2638
2639     /* ...and there is none in flight yet... */
2640     if (s->tlsext_hb_pending) {
2641         SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PENDING);
2642         return -1;
2643     }
2644
2645     /* ...and no handshake in progress. */
2646     if (SSL_in_init(s) || s->in_handshake) {
2647         SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_UNEXPECTED_MESSAGE);
2648         return -1;
2649     }
2650
2651     /*
2652      * Check if padding is too long, payload and padding must not exceed 2^14
2653      * - 3 = 16381 bytes in total.
2654      */
2655     OPENSSL_assert(payload + padding <= 16381);
2656
2657     /*-
2658      * Create HeartBeat message, we just use a sequence number
2659      * as payload to distuingish different messages and add
2660      * some random stuff.
2661      *  - Message Type, 1 byte
2662      *  - Payload Length, 2 bytes (unsigned int)
2663      *  - Payload, the sequence number (2 bytes uint)
2664      *  - Payload, random bytes (16 bytes uint)
2665      *  - Padding
2666      */
2667     buf = OPENSSL_malloc(1 + 2 + payload + padding);
2668     p = buf;
2669     /* Message Type */
2670     *p++ = TLS1_HB_REQUEST;
2671     /* Payload length (18 bytes here) */
2672     s2n(payload, p);
2673     /* Sequence number */
2674     s2n(s->tlsext_hb_seq, p);
2675     /* 16 random bytes */
2676     if (RAND_pseudo_bytes(p, 16) < 0) {
2677         SSLerr(SSL_F_TLS1_HEARTBEAT, ERR_R_INTERNAL_ERROR);
2678         goto err;
2679     }
2680     p += 16;
2681     /* Random padding */
2682     if (RAND_pseudo_bytes(p, padding) < 0) {
2683         SSLerr(SSL_F_TLS1_HEARTBEAT, ERR_R_INTERNAL_ERROR);
2684         goto err;
2685     }
2686
2687     ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2688     if (ret >= 0) {
2689         if (s->msg_callback)
2690             s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2691                             buf, 3 + payload + padding,
2692                             s, s->msg_callback_arg);
2693
2694         s->tlsext_hb_pending = 1;
2695     }
2696
2697 err:
2698     OPENSSL_free(buf);
2699
2700     return ret;
2701 }
2702 #endif