t1_lib.c revision 306230
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
120const char tls1_version_str[] = "TLSv1" OPENSSL_VERSION_PTEXT;
121
122#ifndef OPENSSL_NO_TLSEXT
123static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
124                              const unsigned char *sess_id, int sesslen,
125                              SSL_SESSION **psess);
126#endif
127
128SSL3_ENC_METHOD TLSv1_enc_data = {
129    tls1_enc,
130    tls1_mac,
131    tls1_setup_key_block,
132    tls1_generate_master_secret,
133    tls1_change_cipher_state,
134    tls1_final_finish_mac,
135    TLS1_FINISH_MAC_LENGTH,
136    tls1_cert_verify_mac,
137    TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
138    TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
139    tls1_alert_code,
140    tls1_export_keying_material,
141};
142
143long 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
152int tls1_new(SSL *s)
153{
154    if (!ssl3_new(s))
155        return (0);
156    s->method->ssl_clear(s);
157    return (1);
158}
159
160void 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
170void tls1_clear(SSL *s)
171{
172    ssl3_clear(s);
173    s->version = s->method->version;
174}
175
176#ifndef OPENSSL_NO_EC
177
178static 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
206static 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
246int 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
255int 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
346static 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
360int 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
368unsigned 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
704unsigned 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 */
915static 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 (limit - data <= 2)
946        return;
947    data += 2;
948
949    if (limit - data < 4)
950        return;
951    n2s(data, type);
952    n2s(data, size);
953
954    if (type != TLSEXT_TYPE_server_name)
955        return;
956
957    if (limit - data < size)
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 (limit - data != (int)(len1 + len2))
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 (limit - data != (int)(len))
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
984int 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 (limit - data < 2)
1023        goto err;
1024
1025    n2s(data, len);
1026
1027    if (limit - data != len)
1028        goto err;
1029
1030    while (limit - data >= 4) {
1031        n2s(data, type);
1032        n2s(data, size);
1033
1034        if (limit - data < size)
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
1288                /*
1289                 * We remove any OCSP_RESPIDs from a previous handshake
1290                 * to prevent unbounded memory growth - CVE-2016-6304
1291                 */
1292                sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids,
1293                                        OCSP_RESPID_free);
1294                if (dsize > 0) {
1295                    s->tlsext_ocsp_ids = sk_OCSP_RESPID_new_null();
1296                    if (s->tlsext_ocsp_ids == NULL) {
1297                        *al = SSL_AD_INTERNAL_ERROR;
1298                        return 0;
1299                    }
1300                } else {
1301                    s->tlsext_ocsp_ids = NULL;
1302                }
1303
1304                while (dsize > 0) {
1305                    OCSP_RESPID *id;
1306                    int idsize;
1307                    if (dsize < 4)
1308                        goto err;
1309                    n2s(data, idsize);
1310                    dsize -= 2 + idsize;
1311                    size -= 2 + idsize;
1312                    if (dsize < 0)
1313                        goto err;
1314                    sdata = data;
1315                    data += idsize;
1316                    id = d2i_OCSP_RESPID(NULL, &sdata, idsize);
1317                    if (!id)
1318                        goto err;
1319                    if (data != sdata) {
1320                        OCSP_RESPID_free(id);
1321                        goto err;
1322                    }
1323                    if (!sk_OCSP_RESPID_push(s->tlsext_ocsp_ids, id)) {
1324                        OCSP_RESPID_free(id);
1325                        *al = SSL_AD_INTERNAL_ERROR;
1326                        return 0;
1327                    }
1328                }
1329
1330                /* Read in request_extensions */
1331                if (size < 2)
1332                    goto err;
1333                n2s(data, dsize);
1334                size -= 2;
1335                if (dsize != size)
1336                    goto err;
1337                sdata = data;
1338                if (dsize > 0) {
1339                    if (s->tlsext_ocsp_exts) {
1340                        sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
1341                                                   X509_EXTENSION_free);
1342                    }
1343
1344                    s->tlsext_ocsp_exts =
1345                        d2i_X509_EXTENSIONS(NULL, &sdata, dsize);
1346                    if (!s->tlsext_ocsp_exts || (data + dsize != sdata))
1347                        goto err;
1348                }
1349            }
1350            /*
1351             * We don't know what to do with any other type * so ignore it.
1352             */
1353            else
1354                s->tlsext_status_type = -1;
1355        }
1356# ifndef OPENSSL_NO_HEARTBEATS
1357        else if (type == TLSEXT_TYPE_heartbeat) {
1358            switch (data[0]) {
1359            case 0x01:         /* Client allows us to send HB requests */
1360                s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1361                break;
1362            case 0x02:         /* Client doesn't accept HB requests */
1363                s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1364                s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1365                break;
1366            default:
1367                *al = SSL_AD_ILLEGAL_PARAMETER;
1368                return 0;
1369            }
1370        }
1371# endif
1372# ifndef OPENSSL_NO_NEXTPROTONEG
1373        else if (type == TLSEXT_TYPE_next_proto_neg &&
1374                 s->s3->tmp.finish_md_len == 0) {
1375            /*-
1376             * We shouldn't accept this extension on a
1377             * renegotiation.
1378             *
1379             * s->new_session will be set on renegotiation, but we
1380             * probably shouldn't rely that it couldn't be set on
1381             * the initial renegotation too in certain cases (when
1382             * there's some other reason to disallow resuming an
1383             * earlier session -- the current code won't be doing
1384             * anything like that, but this might change).
1385             *
1386             * A valid sign that there's been a previous handshake
1387             * in this connection is if s->s3->tmp.finish_md_len >
1388             * 0.  (We are talking about a check that will happen
1389             * in the Hello protocol round, well before a new
1390             * Finished message could have been computed.)
1391             */
1392            s->s3->next_proto_neg_seen = 1;
1393        }
1394# endif
1395
1396        /* session ticket processed earlier */
1397# ifndef OPENSSL_NO_SRTP
1398        else if (SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s)
1399                 && type == TLSEXT_TYPE_use_srtp) {
1400            if (ssl_parse_clienthello_use_srtp_ext(s, data, size, al))
1401                return 0;
1402        }
1403# endif
1404
1405        data += size;
1406    }
1407
1408    /* Spurious data on the end */
1409    if (data != limit)
1410        goto err;
1411
1412    *p = data;
1413
1414 ri_check:
1415
1416    /* Need RI if renegotiating */
1417
1418    if (!renegotiate_seen && s->renegotiate &&
1419        !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) {
1420        *al = SSL_AD_HANDSHAKE_FAILURE;
1421        SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,
1422               SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1423        return 0;
1424    }
1425
1426    return 1;
1427err:
1428    *al = SSL_AD_DECODE_ERROR;
1429    return 0;
1430}
1431
1432# ifndef OPENSSL_NO_NEXTPROTONEG
1433/*
1434 * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1435 * elements of zero length are allowed and the set of elements must exactly
1436 * fill the length of the block.
1437 */
1438static char ssl_next_proto_validate(unsigned char *d, unsigned len)
1439{
1440    unsigned int off = 0;
1441
1442    while (off < len) {
1443        if (d[off] == 0)
1444            return 0;
1445        off += d[off];
1446        off++;
1447    }
1448
1449    return off == len;
1450}
1451# endif
1452
1453int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1454                                 int n, int *al)
1455{
1456    unsigned short length;
1457    unsigned short type;
1458    unsigned short size;
1459    unsigned char *data = *p;
1460    int tlsext_servername = 0;
1461    int renegotiate_seen = 0;
1462
1463# ifndef OPENSSL_NO_NEXTPROTONEG
1464    s->s3->next_proto_neg_seen = 0;
1465# endif
1466    s->tlsext_ticket_expected = 0;
1467
1468# ifndef OPENSSL_NO_HEARTBEATS
1469    s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1470                             SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1471# endif
1472
1473    if ((d + n) - data <= 2)
1474        goto ri_check;
1475
1476    n2s(data, length);
1477    if ((d + n) - data != length) {
1478        *al = SSL_AD_DECODE_ERROR;
1479        return 0;
1480    }
1481
1482    while ((d + n) - data >= 4) {
1483        n2s(data, type);
1484        n2s(data, size);
1485
1486        if ((d + n) - data < size)
1487            goto ri_check;
1488
1489        if (s->tlsext_debug_cb)
1490            s->tlsext_debug_cb(s, 1, type, data, size, s->tlsext_debug_arg);
1491
1492        if (type == TLSEXT_TYPE_server_name) {
1493            if (s->tlsext_hostname == NULL || size > 0) {
1494                *al = TLS1_AD_UNRECOGNIZED_NAME;
1495                return 0;
1496            }
1497            tlsext_servername = 1;
1498        }
1499# ifndef OPENSSL_NO_EC
1500        else if (type == TLSEXT_TYPE_ec_point_formats) {
1501            unsigned char *sdata = data;
1502            int ecpointformatlist_length = *(sdata++);
1503
1504            if (ecpointformatlist_length != size - 1 ||
1505                ecpointformatlist_length < 1) {
1506                *al = TLS1_AD_DECODE_ERROR;
1507                return 0;
1508            }
1509            if (!s->hit) {
1510                s->session->tlsext_ecpointformatlist_length = 0;
1511                if (s->session->tlsext_ecpointformatlist != NULL)
1512                    OPENSSL_free(s->session->tlsext_ecpointformatlist);
1513                if ((s->session->tlsext_ecpointformatlist =
1514                     OPENSSL_malloc(ecpointformatlist_length)) == NULL) {
1515                    *al = TLS1_AD_INTERNAL_ERROR;
1516                    return 0;
1517                }
1518                s->session->tlsext_ecpointformatlist_length =
1519                    ecpointformatlist_length;
1520                memcpy(s->session->tlsext_ecpointformatlist, sdata,
1521                       ecpointformatlist_length);
1522            }
1523#  if 0
1524            fprintf(stderr,
1525                    "ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
1526            sdata = s->session->tlsext_ecpointformatlist;
1527            for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
1528                fprintf(stderr, "%i ", *(sdata++));
1529            fprintf(stderr, "\n");
1530#  endif
1531        }
1532# endif                         /* OPENSSL_NO_EC */
1533
1534        else if (type == TLSEXT_TYPE_session_ticket) {
1535            if (s->tls_session_ticket_ext_cb &&
1536                !s->tls_session_ticket_ext_cb(s, data, size,
1537                                              s->tls_session_ticket_ext_cb_arg))
1538            {
1539                *al = TLS1_AD_INTERNAL_ERROR;
1540                return 0;
1541            }
1542            if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
1543                || (size > 0)) {
1544                *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1545                return 0;
1546            }
1547            s->tlsext_ticket_expected = 1;
1548        }
1549# ifdef TLSEXT_TYPE_opaque_prf_input
1550        else if (type == TLSEXT_TYPE_opaque_prf_input &&
1551                 s->version != DTLS1_VERSION) {
1552            unsigned char *sdata = data;
1553
1554            if (size < 2) {
1555                *al = SSL_AD_DECODE_ERROR;
1556                return 0;
1557            }
1558            n2s(sdata, s->s3->server_opaque_prf_input_len);
1559            if (s->s3->server_opaque_prf_input_len != size - 2) {
1560                *al = SSL_AD_DECODE_ERROR;
1561                return 0;
1562            }
1563
1564            if (s->s3->server_opaque_prf_input != NULL) {
1565                /* shouldn't really happen */
1566                OPENSSL_free(s->s3->server_opaque_prf_input);
1567            }
1568            if (s->s3->server_opaque_prf_input_len == 0) {
1569                /* dummy byte just to get non-NULL */
1570                s->s3->server_opaque_prf_input = OPENSSL_malloc(1);
1571            } else {
1572                s->s3->server_opaque_prf_input =
1573                    BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
1574            }
1575
1576            if (s->s3->server_opaque_prf_input == NULL) {
1577                *al = TLS1_AD_INTERNAL_ERROR;
1578                return 0;
1579            }
1580        }
1581# endif
1582        else if (type == TLSEXT_TYPE_status_request &&
1583                 s->version != DTLS1_VERSION) {
1584            /*
1585             * MUST be empty and only sent if we've requested a status
1586             * request message.
1587             */
1588            if ((s->tlsext_status_type == -1) || (size > 0)) {
1589                *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1590                return 0;
1591            }
1592            /* Set flag to expect CertificateStatus message */
1593            s->tlsext_status_expected = 1;
1594        }
1595# ifndef OPENSSL_NO_NEXTPROTONEG
1596        else if (type == TLSEXT_TYPE_next_proto_neg &&
1597                 s->s3->tmp.finish_md_len == 0) {
1598            unsigned char *selected;
1599            unsigned char selected_len;
1600
1601            /* We must have requested it. */
1602            if (s->ctx->next_proto_select_cb == NULL) {
1603                *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1604                return 0;
1605            }
1606            /* The data must be valid */
1607            if (!ssl_next_proto_validate(data, size)) {
1608                *al = TLS1_AD_DECODE_ERROR;
1609                return 0;
1610            }
1611            if (s->
1612                ctx->next_proto_select_cb(s, &selected, &selected_len, data,
1613                                          size,
1614                                          s->ctx->next_proto_select_cb_arg) !=
1615                SSL_TLSEXT_ERR_OK) {
1616                *al = TLS1_AD_INTERNAL_ERROR;
1617                return 0;
1618            }
1619            s->next_proto_negotiated = OPENSSL_malloc(selected_len);
1620            if (!s->next_proto_negotiated) {
1621                *al = TLS1_AD_INTERNAL_ERROR;
1622                return 0;
1623            }
1624            memcpy(s->next_proto_negotiated, selected, selected_len);
1625            s->next_proto_negotiated_len = selected_len;
1626            s->s3->next_proto_neg_seen = 1;
1627        }
1628# endif
1629        else if (type == TLSEXT_TYPE_renegotiate) {
1630            if (!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1631                return 0;
1632            renegotiate_seen = 1;
1633        }
1634# ifndef OPENSSL_NO_HEARTBEATS
1635        else if (type == TLSEXT_TYPE_heartbeat) {
1636            switch (data[0]) {
1637            case 0x01:         /* Server allows us to send HB requests */
1638                s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1639                break;
1640            case 0x02:         /* Server doesn't accept HB requests */
1641                s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1642                s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1643                break;
1644            default:
1645                *al = SSL_AD_ILLEGAL_PARAMETER;
1646                return 0;
1647            }
1648        }
1649# endif
1650# ifndef OPENSSL_NO_SRTP
1651        else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) {
1652            if (ssl_parse_serverhello_use_srtp_ext(s, data, size, al))
1653                return 0;
1654        }
1655# endif
1656
1657        data += size;
1658    }
1659
1660    if (data != d + n) {
1661        *al = SSL_AD_DECODE_ERROR;
1662        return 0;
1663    }
1664
1665    if (!s->hit && tlsext_servername == 1) {
1666        if (s->tlsext_hostname) {
1667            if (s->session->tlsext_hostname == NULL) {
1668                s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
1669                if (!s->session->tlsext_hostname) {
1670                    *al = SSL_AD_UNRECOGNIZED_NAME;
1671                    return 0;
1672                }
1673            } else {
1674                *al = SSL_AD_DECODE_ERROR;
1675                return 0;
1676            }
1677        }
1678    }
1679
1680    *p = data;
1681
1682 ri_check:
1683
1684    /*
1685     * Determine if we need to see RI. Strictly speaking if we want to avoid
1686     * an attack we should *always* see RI even on initial server hello
1687     * because the client doesn't see any renegotiation during an attack.
1688     * However this would mean we could not connect to any server which
1689     * doesn't support RI so for the immediate future tolerate RI absence on
1690     * initial connect only.
1691     */
1692    if (!renegotiate_seen && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
1693        && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) {
1694        *al = SSL_AD_HANDSHAKE_FAILURE;
1695        SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,
1696               SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1697        return 0;
1698    }
1699
1700    return 1;
1701}
1702
1703int ssl_prepare_clienthello_tlsext(SSL *s)
1704{
1705# ifndef OPENSSL_NO_EC
1706    /*
1707     * If we are client and using an elliptic curve cryptography cipher
1708     * suite, send the point formats and elliptic curves we support.
1709     */
1710    int using_ecc = 0;
1711    int i;
1712    unsigned char *j;
1713    unsigned long alg_k, alg_a;
1714    STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
1715
1716    for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++) {
1717        SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
1718
1719        alg_k = c->algorithm_mkey;
1720        alg_a = c->algorithm_auth;
1721        if ((alg_k & (SSL_kEECDH | SSL_kECDHr | SSL_kECDHe)
1722             || (alg_a & SSL_aECDSA))) {
1723            using_ecc = 1;
1724            break;
1725        }
1726    }
1727    using_ecc = using_ecc && (s->version >= TLS1_VERSION);
1728    if (using_ecc) {
1729        if (s->tlsext_ecpointformatlist != NULL)
1730            OPENSSL_free(s->tlsext_ecpointformatlist);
1731        if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL) {
1732            SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,
1733                   ERR_R_MALLOC_FAILURE);
1734            return -1;
1735        }
1736        s->tlsext_ecpointformatlist_length = 3;
1737        s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1738        s->tlsext_ecpointformatlist[1] =
1739            TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1740        s->tlsext_ecpointformatlist[2] =
1741            TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1742
1743        /* we support all named elliptic curves in RFC 4492 */
1744        if (s->tlsext_ellipticcurvelist != NULL)
1745            OPENSSL_free(s->tlsext_ellipticcurvelist);
1746        s->tlsext_ellipticcurvelist_length =
1747            sizeof(pref_list) / sizeof(pref_list[0]) * 2;
1748        if ((s->tlsext_ellipticcurvelist =
1749             OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == NULL) {
1750            s->tlsext_ellipticcurvelist_length = 0;
1751            SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,
1752                   ERR_R_MALLOC_FAILURE);
1753            return -1;
1754        }
1755        for (i = 0, j = s->tlsext_ellipticcurvelist; (unsigned int)i <
1756             sizeof(pref_list) / sizeof(pref_list[0]); i++) {
1757            int id = tls1_ec_nid2curve_id(pref_list[i]);
1758            s2n(id, j);
1759        }
1760    }
1761# endif                         /* OPENSSL_NO_EC */
1762
1763# ifdef TLSEXT_TYPE_opaque_prf_input
1764    {
1765        int r = 1;
1766
1767        if (s->ctx->tlsext_opaque_prf_input_callback != 0) {
1768            r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0,
1769                                                         s->
1770                                                         ctx->tlsext_opaque_prf_input_callback_arg);
1771            if (!r)
1772                return -1;
1773        }
1774
1775        if (s->tlsext_opaque_prf_input != NULL) {
1776            if (s->s3->client_opaque_prf_input != NULL) {
1777                /* shouldn't really happen */
1778                OPENSSL_free(s->s3->client_opaque_prf_input);
1779            }
1780
1781            if (s->tlsext_opaque_prf_input_len == 0) {
1782                /* dummy byte just to get non-NULL */
1783                s->s3->client_opaque_prf_input = OPENSSL_malloc(1);
1784            } else {
1785                s->s3->client_opaque_prf_input =
1786                    BUF_memdup(s->tlsext_opaque_prf_input,
1787                               s->tlsext_opaque_prf_input_len);
1788            }
1789            if (s->s3->client_opaque_prf_input == NULL) {
1790                SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,
1791                       ERR_R_MALLOC_FAILURE);
1792                return -1;
1793            }
1794            s->s3->client_opaque_prf_input_len =
1795                s->tlsext_opaque_prf_input_len;
1796        }
1797
1798        if (r == 2)
1799            /*
1800             * at callback's request, insist on receiving an appropriate
1801             * server opaque PRF input
1802             */
1803            s->s3->server_opaque_prf_input_len =
1804                s->tlsext_opaque_prf_input_len;
1805    }
1806# endif
1807
1808    return 1;
1809}
1810
1811int ssl_prepare_serverhello_tlsext(SSL *s)
1812{
1813# ifndef OPENSSL_NO_EC
1814    /*
1815     * If we are server and using an ECC cipher suite, send the point formats
1816     * we support if the client sent us an ECPointsFormat extension.  Note
1817     * that the server is not supposed to send an EllipticCurves extension.
1818     */
1819
1820    unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1821    unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1822    int using_ecc = (alg_k & (SSL_kEECDH | SSL_kECDHr | SSL_kECDHe))
1823        || (alg_a & SSL_aECDSA);
1824    using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
1825
1826    if (using_ecc) {
1827        if (s->tlsext_ecpointformatlist != NULL)
1828            OPENSSL_free(s->tlsext_ecpointformatlist);
1829        if ((s->tlsext_ecpointformatlist = OPENSSL_malloc(3)) == NULL) {
1830            SSLerr(SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT,
1831                   ERR_R_MALLOC_FAILURE);
1832            return -1;
1833        }
1834        s->tlsext_ecpointformatlist_length = 3;
1835        s->tlsext_ecpointformatlist[0] = TLSEXT_ECPOINTFORMAT_uncompressed;
1836        s->tlsext_ecpointformatlist[1] =
1837            TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
1838        s->tlsext_ecpointformatlist[2] =
1839            TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
1840    }
1841# endif                         /* OPENSSL_NO_EC */
1842
1843    return 1;
1844}
1845
1846int ssl_check_clienthello_tlsext_early(SSL *s)
1847{
1848    int ret = SSL_TLSEXT_ERR_NOACK;
1849    int al = SSL_AD_UNRECOGNIZED_NAME;
1850
1851# ifndef OPENSSL_NO_EC
1852    /*
1853     * The handling of the ECPointFormats extension is done elsewhere, namely
1854     * in ssl3_choose_cipher in s3_lib.c.
1855     */
1856    /*
1857     * The handling of the EllipticCurves extension is done elsewhere, namely
1858     * in ssl3_choose_cipher in s3_lib.c.
1859     */
1860# endif
1861
1862    if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
1863        ret =
1864            s->ctx->tlsext_servername_callback(s, &al,
1865                                               s->ctx->tlsext_servername_arg);
1866    else if (s->initial_ctx != NULL
1867             && s->initial_ctx->tlsext_servername_callback != 0)
1868        ret =
1869            s->initial_ctx->tlsext_servername_callback(s, &al,
1870                                                       s->
1871                                                       initial_ctx->tlsext_servername_arg);
1872
1873# ifdef TLSEXT_TYPE_opaque_prf_input
1874    {
1875        /*
1876         * This sort of belongs into ssl_prepare_serverhello_tlsext(), but we
1877         * might be sending an alert in response to the client hello, so this
1878         * has to happen here in ssl_check_clienthello_tlsext_early().
1879         */
1880
1881        int r = 1;
1882
1883        if (s->ctx->tlsext_opaque_prf_input_callback != 0) {
1884            r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0,
1885                                                         s->
1886                                                         ctx->tlsext_opaque_prf_input_callback_arg);
1887            if (!r) {
1888                ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1889                al = SSL_AD_INTERNAL_ERROR;
1890                goto err;
1891            }
1892        }
1893
1894        if (s->s3->server_opaque_prf_input != NULL) {
1895            /* shouldn't really happen */
1896            OPENSSL_free(s->s3->server_opaque_prf_input);
1897        }
1898        s->s3->server_opaque_prf_input = NULL;
1899
1900        if (s->tlsext_opaque_prf_input != NULL) {
1901            if (s->s3->client_opaque_prf_input != NULL &&
1902                s->s3->client_opaque_prf_input_len ==
1903                s->tlsext_opaque_prf_input_len) {
1904                /*
1905                 * can only use this extension if we have a server opaque PRF
1906                 * input of the same length as the client opaque PRF input!
1907                 */
1908
1909                if (s->tlsext_opaque_prf_input_len == 0) {
1910                    /* dummy byte just to get non-NULL */
1911                    s->s3->server_opaque_prf_input = OPENSSL_malloc(1);
1912                } else {
1913                    s->s3->server_opaque_prf_input =
1914                        BUF_memdup(s->tlsext_opaque_prf_input,
1915                                   s->tlsext_opaque_prf_input_len);
1916                }
1917                if (s->s3->server_opaque_prf_input == NULL) {
1918                    ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1919                    al = SSL_AD_INTERNAL_ERROR;
1920                    goto err;
1921                }
1922                s->s3->server_opaque_prf_input_len =
1923                    s->tlsext_opaque_prf_input_len;
1924            }
1925        }
1926
1927        if (r == 2 && s->s3->server_opaque_prf_input == NULL) {
1928            /*
1929             * The callback wants to enforce use of the extension, but we
1930             * can't do that with the client opaque PRF input; abort the
1931             * handshake.
1932             */
1933            ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1934            al = SSL_AD_HANDSHAKE_FAILURE;
1935        }
1936    }
1937
1938 err:
1939# endif
1940    switch (ret) {
1941    case SSL_TLSEXT_ERR_ALERT_FATAL:
1942        ssl3_send_alert(s, SSL3_AL_FATAL, al);
1943        return -1;
1944
1945    case SSL_TLSEXT_ERR_ALERT_WARNING:
1946        ssl3_send_alert(s, SSL3_AL_WARNING, al);
1947        return 1;
1948
1949    case SSL_TLSEXT_ERR_NOACK:
1950        s->servername_done = 0;
1951    default:
1952        return 1;
1953    }
1954}
1955
1956int ssl_check_clienthello_tlsext_late(SSL *s)
1957{
1958    int ret = SSL_TLSEXT_ERR_OK;
1959    int al;
1960
1961    /*
1962     * If status request then ask callback what to do. Note: this must be
1963     * called after servername callbacks in case the certificate has
1964     * changed, and must be called after the cipher has been chosen because
1965     * this may influence which certificate is sent
1966     */
1967    if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb) {
1968        int r;
1969        CERT_PKEY *certpkey;
1970        certpkey = ssl_get_server_send_pkey(s);
1971        /* If no certificate can't return certificate status */
1972        if (certpkey == NULL) {
1973            s->tlsext_status_expected = 0;
1974            return 1;
1975        }
1976        /*
1977         * Set current certificate to one we will use so SSL_get_certificate
1978         * et al can pick it up.
1979         */
1980        s->cert->key = certpkey;
1981        r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1982        switch (r) {
1983            /* We don't want to send a status request response */
1984        case SSL_TLSEXT_ERR_NOACK:
1985            s->tlsext_status_expected = 0;
1986            break;
1987            /* status request response should be sent */
1988        case SSL_TLSEXT_ERR_OK:
1989            if (s->tlsext_ocsp_resp)
1990                s->tlsext_status_expected = 1;
1991            else
1992                s->tlsext_status_expected = 0;
1993            break;
1994            /* something bad happened */
1995        case SSL_TLSEXT_ERR_ALERT_FATAL:
1996            ret = SSL_TLSEXT_ERR_ALERT_FATAL;
1997            al = SSL_AD_INTERNAL_ERROR;
1998            goto err;
1999        }
2000    } else
2001        s->tlsext_status_expected = 0;
2002
2003 err:
2004    switch (ret) {
2005    case SSL_TLSEXT_ERR_ALERT_FATAL:
2006        ssl3_send_alert(s, SSL3_AL_FATAL, al);
2007        return -1;
2008
2009    case SSL_TLSEXT_ERR_ALERT_WARNING:
2010        ssl3_send_alert(s, SSL3_AL_WARNING, al);
2011        return 1;
2012
2013    default:
2014        return 1;
2015    }
2016}
2017
2018int ssl_check_serverhello_tlsext(SSL *s)
2019{
2020    int ret = SSL_TLSEXT_ERR_NOACK;
2021    int al = SSL_AD_UNRECOGNIZED_NAME;
2022
2023# ifndef OPENSSL_NO_EC
2024    /*
2025     * If we are client and using an elliptic curve cryptography cipher
2026     * suite, then if server returns an EC point formats lists extension it
2027     * must contain uncompressed.
2028     */
2029    unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
2030    unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
2031    if ((s->tlsext_ecpointformatlist != NULL)
2032        && (s->tlsext_ecpointformatlist_length > 0)
2033        && (s->session->tlsext_ecpointformatlist != NULL)
2034        && (s->session->tlsext_ecpointformatlist_length > 0)
2035        && ((alg_k & (SSL_kEECDH | SSL_kECDHr | SSL_kECDHe))
2036            || (alg_a & SSL_aECDSA))) {
2037        /* we are using an ECC cipher */
2038        size_t i;
2039        unsigned char *list;
2040        int found_uncompressed = 0;
2041        list = s->session->tlsext_ecpointformatlist;
2042        for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++) {
2043            if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed) {
2044                found_uncompressed = 1;
2045                break;
2046            }
2047        }
2048        if (!found_uncompressed) {
2049            SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,
2050                   SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
2051            return -1;
2052        }
2053    }
2054    ret = SSL_TLSEXT_ERR_OK;
2055# endif                         /* OPENSSL_NO_EC */
2056
2057    if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2058        ret =
2059            s->ctx->tlsext_servername_callback(s, &al,
2060                                               s->ctx->tlsext_servername_arg);
2061    else if (s->initial_ctx != NULL
2062             && s->initial_ctx->tlsext_servername_callback != 0)
2063        ret =
2064            s->initial_ctx->tlsext_servername_callback(s, &al,
2065                                                       s->
2066                                                       initial_ctx->tlsext_servername_arg);
2067
2068# ifdef TLSEXT_TYPE_opaque_prf_input
2069    if (s->s3->server_opaque_prf_input_len > 0) {
2070        /*
2071         * This case may indicate that we, as a client, want to insist on
2072         * using opaque PRF inputs. So first verify that we really have a
2073         * value from the server too.
2074         */
2075
2076        if (s->s3->server_opaque_prf_input == NULL) {
2077            ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2078            al = SSL_AD_HANDSHAKE_FAILURE;
2079        }
2080
2081        /*
2082         * Anytime the server *has* sent an opaque PRF input, we need to
2083         * check that we have a client opaque PRF input of the same size.
2084         */
2085        if (s->s3->client_opaque_prf_input == NULL ||
2086            s->s3->client_opaque_prf_input_len !=
2087            s->s3->server_opaque_prf_input_len) {
2088            ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2089            al = SSL_AD_ILLEGAL_PARAMETER;
2090        }
2091    }
2092# endif
2093
2094    /*
2095     * If we've requested certificate status and we wont get one tell the
2096     * callback
2097     */
2098    if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
2099        && s->ctx && s->ctx->tlsext_status_cb) {
2100        int r;
2101        /*
2102         * Set resp to NULL, resplen to -1 so callback knows there is no
2103         * response.
2104         */
2105        if (s->tlsext_ocsp_resp) {
2106            OPENSSL_free(s->tlsext_ocsp_resp);
2107            s->tlsext_ocsp_resp = NULL;
2108        }
2109        s->tlsext_ocsp_resplen = -1;
2110        r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2111        if (r == 0) {
2112            al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2113            ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2114        }
2115        if (r < 0) {
2116            al = SSL_AD_INTERNAL_ERROR;
2117            ret = SSL_TLSEXT_ERR_ALERT_FATAL;
2118        }
2119    }
2120
2121    switch (ret) {
2122    case SSL_TLSEXT_ERR_ALERT_FATAL:
2123        ssl3_send_alert(s, SSL3_AL_FATAL, al);
2124        return -1;
2125
2126    case SSL_TLSEXT_ERR_ALERT_WARNING:
2127        ssl3_send_alert(s, SSL3_AL_WARNING, al);
2128        return 1;
2129
2130    case SSL_TLSEXT_ERR_NOACK:
2131        s->servername_done = 0;
2132    default:
2133        return 1;
2134    }
2135}
2136
2137/*-
2138 * Since the server cache lookup is done early on in the processing of the
2139 * ClientHello, and other operations depend on the result, we need to handle
2140 * any TLS session ticket extension at the same time.
2141 *
2142 *   session_id: points at the session ID in the ClientHello. This code will
2143 *       read past the end of this in order to parse out the session ticket
2144 *       extension, if any.
2145 *   len: the length of the session ID.
2146 *   limit: a pointer to the first byte after the ClientHello.
2147 *   ret: (output) on return, if a ticket was decrypted, then this is set to
2148 *       point to the resulting session.
2149 *
2150 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2151 * ciphersuite, in which case we have no use for session tickets and one will
2152 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2153 *
2154 * Returns:
2155 *   -1: fatal error, either from parsing or decrypting the ticket.
2156 *    0: no ticket was found (or was ignored, based on settings).
2157 *    1: a zero length extension was found, indicating that the client supports
2158 *       session tickets but doesn't currently have one to offer.
2159 *    2: either s->tls_session_secret_cb was set, or a ticket was offered but
2160 *       couldn't be decrypted because of a non-fatal error.
2161 *    3: a ticket was successfully decrypted and *ret was set.
2162 *
2163 * Side effects:
2164 *   Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2165 *   a new session ticket to the client because the client indicated support
2166 *   (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2167 *   a session ticket or we couldn't use the one it gave us, or if
2168 *   s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2169 *   Otherwise, s->tlsext_ticket_expected is set to 0.
2170 */
2171int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
2172                        const unsigned char *limit, SSL_SESSION **ret)
2173{
2174    /* Point after session ID in client hello */
2175    const unsigned char *p = session_id + len;
2176    unsigned short i;
2177
2178    *ret = NULL;
2179    s->tlsext_ticket_expected = 0;
2180
2181    /*
2182     * If tickets disabled behave as if no ticket present to permit stateful
2183     * resumption.
2184     */
2185    if (SSL_get_options(s) & SSL_OP_NO_TICKET)
2186        return 0;
2187    if ((s->version <= SSL3_VERSION) || !limit)
2188        return 0;
2189    if (p >= limit)
2190        return -1;
2191    /* Skip past DTLS cookie */
2192    if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER) {
2193        i = *(p++);
2194
2195        if (limit - p <= i)
2196            return -1;
2197
2198        p += i;
2199    }
2200    /* Skip past cipher list */
2201    n2s(p, i);
2202    if (limit - p <= i)
2203        return -1;
2204    p += i;
2205
2206    /* Skip past compression algorithm list */
2207    i = *(p++);
2208    if (limit - p < i)
2209        return -1;
2210    p += i;
2211
2212    /* Now at start of extensions */
2213    if (limit - p <= 2)
2214        return 0;
2215    n2s(p, i);
2216    while (limit - p >= 4) {
2217        unsigned short type, size;
2218        n2s(p, type);
2219        n2s(p, size);
2220        if (limit - p < size)
2221            return 0;
2222        if (type == TLSEXT_TYPE_session_ticket) {
2223            int r;
2224            if (size == 0) {
2225                /*
2226                 * The client will accept a ticket but doesn't currently have
2227                 * one.
2228                 */
2229                s->tlsext_ticket_expected = 1;
2230                return 1;
2231            }
2232            if (s->tls_session_secret_cb) {
2233                /*
2234                 * Indicate that the ticket couldn't be decrypted rather than
2235                 * generating the session from ticket now, trigger
2236                 * abbreviated handshake based on external mechanism to
2237                 * calculate the master secret later.
2238                 */
2239                return 2;
2240            }
2241            r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
2242            switch (r) {
2243            case 2:            /* ticket couldn't be decrypted */
2244                s->tlsext_ticket_expected = 1;
2245                return 2;
2246            case 3:            /* ticket was decrypted */
2247                return r;
2248            case 4:            /* ticket decrypted but need to renew */
2249                s->tlsext_ticket_expected = 1;
2250                return 3;
2251            default:           /* fatal error */
2252                return -1;
2253            }
2254        }
2255        p += size;
2256    }
2257    return 0;
2258}
2259
2260/*-
2261 * tls_decrypt_ticket attempts to decrypt a session ticket.
2262 *
2263 *   etick: points to the body of the session ticket extension.
2264 *   eticklen: the length of the session tickets extenion.
2265 *   sess_id: points at the session ID.
2266 *   sesslen: the length of the session ID.
2267 *   psess: (output) on return, if a ticket was decrypted, then this is set to
2268 *       point to the resulting session.
2269 *
2270 * Returns:
2271 *   -1: fatal error, either from parsing or decrypting the ticket.
2272 *    2: the ticket couldn't be decrypted.
2273 *    3: a ticket was successfully decrypted and *psess was set.
2274 *    4: same as 3, but the ticket needs to be renewed.
2275 */
2276static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
2277                              int eticklen, const unsigned char *sess_id,
2278                              int sesslen, SSL_SESSION **psess)
2279{
2280    SSL_SESSION *sess;
2281    unsigned char *sdec;
2282    const unsigned char *p;
2283    int slen, mlen, renew_ticket = 0;
2284    unsigned char tick_hmac[EVP_MAX_MD_SIZE];
2285    HMAC_CTX hctx;
2286    EVP_CIPHER_CTX ctx;
2287    SSL_CTX *tctx = s->initial_ctx;
2288
2289    /* Initialize session ticket encryption and HMAC contexts */
2290    HMAC_CTX_init(&hctx);
2291    EVP_CIPHER_CTX_init(&ctx);
2292    if (tctx->tlsext_ticket_key_cb) {
2293        unsigned char *nctick = (unsigned char *)etick;
2294        int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
2295                                            &ctx, &hctx, 0);
2296        if (rv < 0)
2297            return -1;
2298        if (rv == 0)
2299            return 2;
2300        if (rv == 2)
2301            renew_ticket = 1;
2302    } else {
2303        /* Check key name matches */
2304        if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
2305            return 2;
2306        HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
2307                     tlsext_tick_md(), NULL);
2308        EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
2309                           tctx->tlsext_tick_aes_key, etick + 16);
2310    }
2311    /*
2312     * Attempt to process session ticket, first conduct sanity and integrity
2313     * checks on ticket.
2314     */
2315    mlen = HMAC_size(&hctx);
2316    if (mlen < 0) {
2317        EVP_CIPHER_CTX_cleanup(&ctx);
2318        return -1;
2319    }
2320    /* Sanity check ticket length: must exceed keyname + IV + HMAC */
2321    if (eticklen <= 16 + EVP_CIPHER_CTX_iv_length(&ctx) + mlen) {
2322        HMAC_CTX_cleanup(&hctx);
2323        EVP_CIPHER_CTX_cleanup(&ctx);
2324        return 2;
2325    }
2326
2327    eticklen -= mlen;
2328    /* Check HMAC of encrypted ticket */
2329    HMAC_Update(&hctx, etick, eticklen);
2330    HMAC_Final(&hctx, tick_hmac, NULL);
2331    HMAC_CTX_cleanup(&hctx);
2332    if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) {
2333        EVP_CIPHER_CTX_cleanup(&ctx);
2334        return 2;
2335    }
2336    /* Attempt to decrypt session data */
2337    /* Move p after IV to start of encrypted ticket, update length */
2338    p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2339    eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
2340    sdec = OPENSSL_malloc(eticklen);
2341    if (!sdec) {
2342        EVP_CIPHER_CTX_cleanup(&ctx);
2343        return -1;
2344    }
2345    EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
2346    if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0) {
2347        EVP_CIPHER_CTX_cleanup(&ctx);
2348        OPENSSL_free(sdec);
2349        return 2;
2350    }
2351    slen += mlen;
2352    EVP_CIPHER_CTX_cleanup(&ctx);
2353    p = sdec;
2354
2355    sess = d2i_SSL_SESSION(NULL, &p, slen);
2356    OPENSSL_free(sdec);
2357    if (sess) {
2358        /*
2359         * The session ID, if non-empty, is used by some clients to detect
2360         * that the ticket has been accepted. So we copy it to the session
2361         * structure. If it is empty set length to zero as required by
2362         * standard.
2363         */
2364        if (sesslen)
2365            memcpy(sess->session_id, sess_id, sesslen);
2366        sess->session_id_length = sesslen;
2367        *psess = sess;
2368        if (renew_ticket)
2369            return 4;
2370        else
2371            return 3;
2372    }
2373    ERR_clear_error();
2374    /*
2375     * For session parse failure, indicate that we need to send a new ticket.
2376     */
2377    return 2;
2378}
2379
2380/* Tables to translate from NIDs to TLS v1.2 ids */
2381
2382typedef struct {
2383    int nid;
2384    int id;
2385} tls12_lookup;
2386
2387static tls12_lookup tls12_md[] = {
2388# ifndef OPENSSL_NO_MD5
2389    {NID_md5, TLSEXT_hash_md5},
2390# endif
2391# ifndef OPENSSL_NO_SHA
2392    {NID_sha1, TLSEXT_hash_sha1},
2393# endif
2394# ifndef OPENSSL_NO_SHA256
2395    {NID_sha224, TLSEXT_hash_sha224},
2396    {NID_sha256, TLSEXT_hash_sha256},
2397# endif
2398# ifndef OPENSSL_NO_SHA512
2399    {NID_sha384, TLSEXT_hash_sha384},
2400    {NID_sha512, TLSEXT_hash_sha512}
2401# endif
2402};
2403
2404static tls12_lookup tls12_sig[] = {
2405# ifndef OPENSSL_NO_RSA
2406    {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2407# endif
2408# ifndef OPENSSL_NO_DSA
2409    {EVP_PKEY_DSA, TLSEXT_signature_dsa},
2410# endif
2411# ifndef OPENSSL_NO_ECDSA
2412    {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
2413# endif
2414};
2415
2416static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
2417{
2418    size_t i;
2419    for (i = 0; i < tlen; i++) {
2420        if (table[i].nid == nid)
2421            return table[i].id;
2422    }
2423    return -1;
2424}
2425
2426# if 0
2427static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
2428{
2429    size_t i;
2430    for (i = 0; i < tlen; i++) {
2431        if (table[i].id == id)
2432            return table[i].nid;
2433    }
2434    return -1;
2435}
2436# endif
2437
2438int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk,
2439                         const EVP_MD *md)
2440{
2441    int sig_id, md_id;
2442    if (!md)
2443        return 0;
2444    md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
2445                          sizeof(tls12_md) / sizeof(tls12_lookup));
2446    if (md_id == -1)
2447        return 0;
2448    sig_id = tls12_get_sigid(pk);
2449    if (sig_id == -1)
2450        return 0;
2451    p[0] = (unsigned char)md_id;
2452    p[1] = (unsigned char)sig_id;
2453    return 1;
2454}
2455
2456int tls12_get_sigid(const EVP_PKEY *pk)
2457{
2458    return tls12_find_id(pk->type, tls12_sig,
2459                         sizeof(tls12_sig) / sizeof(tls12_lookup));
2460}
2461
2462const EVP_MD *tls12_get_hash(unsigned char hash_alg)
2463{
2464    switch (hash_alg) {
2465# ifndef OPENSSL_NO_SHA
2466    case TLSEXT_hash_sha1:
2467        return EVP_sha1();
2468# endif
2469# ifndef OPENSSL_NO_SHA256
2470    case TLSEXT_hash_sha224:
2471        return EVP_sha224();
2472
2473    case TLSEXT_hash_sha256:
2474        return EVP_sha256();
2475# endif
2476# ifndef OPENSSL_NO_SHA512
2477    case TLSEXT_hash_sha384:
2478        return EVP_sha384();
2479
2480    case TLSEXT_hash_sha512:
2481        return EVP_sha512();
2482# endif
2483    default:
2484        return NULL;
2485
2486    }
2487}
2488
2489/* Set preferred digest for each key type */
2490
2491int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2492{
2493    int i, idx;
2494    const EVP_MD *md;
2495    CERT *c = s->cert;
2496    /* Extension ignored for TLS versions below 1.2 */
2497    if (TLS1_get_version(s) < TLS1_2_VERSION)
2498        return 1;
2499    /* Should never happen */
2500    if (!c)
2501        return 0;
2502
2503    c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
2504    c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
2505    c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
2506    c->pkeys[SSL_PKEY_ECC].digest = NULL;
2507
2508    for (i = 0; i < dsize; i += 2) {
2509        unsigned char hash_alg = data[i], sig_alg = data[i + 1];
2510
2511        switch (sig_alg) {
2512# ifndef OPENSSL_NO_RSA
2513        case TLSEXT_signature_rsa:
2514            idx = SSL_PKEY_RSA_SIGN;
2515            break;
2516# endif
2517# ifndef OPENSSL_NO_DSA
2518        case TLSEXT_signature_dsa:
2519            idx = SSL_PKEY_DSA_SIGN;
2520            break;
2521# endif
2522# ifndef OPENSSL_NO_ECDSA
2523        case TLSEXT_signature_ecdsa:
2524            idx = SSL_PKEY_ECC;
2525            break;
2526# endif
2527        default:
2528            continue;
2529        }
2530
2531        if (c->pkeys[idx].digest == NULL) {
2532            md = tls12_get_hash(hash_alg);
2533            if (md) {
2534                c->pkeys[idx].digest = md;
2535                if (idx == SSL_PKEY_RSA_SIGN)
2536                    c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
2537            }
2538        }
2539
2540    }
2541
2542    /*
2543     * Set any remaining keys to default values. NOTE: if alg is not
2544     * supported it stays as NULL.
2545     */
2546# ifndef OPENSSL_NO_DSA
2547    if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
2548        c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
2549# endif
2550# ifndef OPENSSL_NO_RSA
2551    if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest) {
2552        c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
2553        c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
2554    }
2555# endif
2556# ifndef OPENSSL_NO_ECDSA
2557    if (!c->pkeys[SSL_PKEY_ECC].digest)
2558        c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
2559# endif
2560    return 1;
2561}
2562
2563#endif
2564
2565#ifndef OPENSSL_NO_HEARTBEATS
2566int tls1_process_heartbeat(SSL *s)
2567{
2568    unsigned char *p = &s->s3->rrec.data[0], *pl;
2569    unsigned short hbtype;
2570    unsigned int payload;
2571    unsigned int padding = 16;  /* Use minimum padding */
2572
2573    if (s->msg_callback)
2574        s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2575                        &s->s3->rrec.data[0], s->s3->rrec.length,
2576                        s, s->msg_callback_arg);
2577
2578    /* Read type and payload length first */
2579    if (1 + 2 + 16 > s->s3->rrec.length)
2580        return 0;               /* silently discard */
2581    hbtype = *p++;
2582    n2s(p, payload);
2583    if (1 + 2 + payload + 16 > s->s3->rrec.length)
2584        return 0;               /* silently discard per RFC 6520 sec. 4 */
2585    pl = p;
2586
2587    if (hbtype == TLS1_HB_REQUEST) {
2588        unsigned char *buffer, *bp;
2589        int r;
2590
2591        /*
2592         * Allocate memory for the response, size is 1 bytes message type,
2593         * plus 2 bytes payload length, plus payload, plus padding
2594         */
2595        buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2596        bp = buffer;
2597
2598        /* Enter response type, length and copy payload */
2599        *bp++ = TLS1_HB_RESPONSE;
2600        s2n(payload, bp);
2601        memcpy(bp, pl, payload);
2602        bp += payload;
2603        /* Random padding */
2604        if (RAND_pseudo_bytes(bp, padding) < 0) {
2605            OPENSSL_free(buffer);
2606            return -1;
2607        }
2608
2609        r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer,
2610                             3 + payload + padding);
2611
2612        if (r >= 0 && s->msg_callback)
2613            s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2614                            buffer, 3 + payload + padding,
2615                            s, s->msg_callback_arg);
2616
2617        OPENSSL_free(buffer);
2618
2619        if (r < 0)
2620            return r;
2621    } else if (hbtype == TLS1_HB_RESPONSE) {
2622        unsigned int seq;
2623
2624        /*
2625         * We only send sequence numbers (2 bytes unsigned int), and 16
2626         * random bytes, so we just try to read the sequence number
2627         */
2628        n2s(pl, seq);
2629
2630        if (payload == 18 && seq == s->tlsext_hb_seq) {
2631            s->tlsext_hb_seq++;
2632            s->tlsext_hb_pending = 0;
2633        }
2634    }
2635
2636    return 0;
2637}
2638
2639int tls1_heartbeat(SSL *s)
2640{
2641    unsigned char *buf, *p;
2642    int ret = -1;
2643    unsigned int payload = 18;  /* Sequence number + random bytes */
2644    unsigned int padding = 16;  /* Use minimum padding */
2645
2646    /* Only send if peer supports and accepts HB requests... */
2647    if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2648        s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS) {
2649        SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2650        return -1;
2651    }
2652
2653    /* ...and there is none in flight yet... */
2654    if (s->tlsext_hb_pending) {
2655        SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PENDING);
2656        return -1;
2657    }
2658
2659    /* ...and no handshake in progress. */
2660    if (SSL_in_init(s) || s->in_handshake) {
2661        SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_UNEXPECTED_MESSAGE);
2662        return -1;
2663    }
2664
2665    /*
2666     * Check if padding is too long, payload and padding must not exceed 2^14
2667     * - 3 = 16381 bytes in total.
2668     */
2669    OPENSSL_assert(payload + padding <= 16381);
2670
2671    /*-
2672     * Create HeartBeat message, we just use a sequence number
2673     * as payload to distuingish different messages and add
2674     * some random stuff.
2675     *  - Message Type, 1 byte
2676     *  - Payload Length, 2 bytes (unsigned int)
2677     *  - Payload, the sequence number (2 bytes uint)
2678     *  - Payload, random bytes (16 bytes uint)
2679     *  - Padding
2680     */
2681    buf = OPENSSL_malloc(1 + 2 + payload + padding);
2682    p = buf;
2683    /* Message Type */
2684    *p++ = TLS1_HB_REQUEST;
2685    /* Payload length (18 bytes here) */
2686    s2n(payload, p);
2687    /* Sequence number */
2688    s2n(s->tlsext_hb_seq, p);
2689    /* 16 random bytes */
2690    if (RAND_pseudo_bytes(p, 16) < 0) {
2691        SSLerr(SSL_F_TLS1_HEARTBEAT, ERR_R_INTERNAL_ERROR);
2692        goto err;
2693    }
2694    p += 16;
2695    /* Random padding */
2696    if (RAND_pseudo_bytes(p, padding) < 0) {
2697        SSLerr(SSL_F_TLS1_HEARTBEAT, ERR_R_INTERNAL_ERROR);
2698        goto err;
2699    }
2700
2701    ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2702    if (ret >= 0) {
2703        if (s->msg_callback)
2704            s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2705                            buf, 3 + payload + padding,
2706                            s, s->msg_callback_arg);
2707
2708        s->tlsext_hb_pending = 1;
2709    }
2710
2711err:
2712    OPENSSL_free(buf);
2713
2714    return ret;
2715}
2716#endif
2717