extensions.c 40.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include "../ssl_locl.h"
#include "statem_locl.h"

13
static int final_renegotiate(SSL *s, unsigned int context, int sent,
14
                                     int *al);
15 16
static int init_server_name(SSL *s, unsigned int context);
static int final_server_name(SSL *s, unsigned int context, int sent,
17
                                     int *al);
18
#ifndef OPENSSL_NO_EC
19
static int final_ec_pt_formats(SSL *s, unsigned int context, int sent,
20 21
                                       int *al);
#endif
22
static int init_session_ticket(SSL *s, unsigned int context);
23
#ifndef OPENSSL_NO_OCSP
24
static int init_status_request(SSL *s, unsigned int context);
25
#endif
26
#ifndef OPENSSL_NO_NEXTPROTONEG
27
static int init_npn(SSL *s, unsigned int context);
28
#endif
29 30 31
static int init_alpn(SSL *s, unsigned int context);
static int final_alpn(SSL *s, unsigned int context, int sent, int *al);
static int init_sig_algs(SSL *s, unsigned int context);
32
#ifndef OPENSSL_NO_SRP
33
static int init_srp(SSL *s, unsigned int context);
34
#endif
35 36 37
static int init_etm(SSL *s, unsigned int context);
static int init_ems(SSL *s, unsigned int context);
static int final_ems(SSL *s, unsigned int context, int sent, int *al);
38
static int init_psk_kex_modes(SSL *s, unsigned int context);
M
Matt Caswell 已提交
39
#ifndef OPENSSL_NO_EC
40
static int final_key_share(SSL *s, unsigned int context, int sent, int *al);
M
Matt Caswell 已提交
41
#endif
42
#ifndef OPENSSL_NO_SRTP
43
static int init_srtp(SSL *s, unsigned int context);
44
#endif
45
static int final_sig_algs(SSL *s, unsigned int context, int sent, int *al);
46

47
/* Structure to define a built-in extension */
48 49
typedef struct extensions_definition_st {
    /* The defined type for the extension */
50
    unsigned int type;
51 52 53 54 55
    /*
     * The context that this extension applies to, e.g. what messages and
     * protocol versions
     */
    unsigned int context;
56
    /*
57 58
     * Initialise extension before parsing. Always called for relevant contexts
     * even if extension not present
59
     */
60 61
    int (*init)(SSL *s, unsigned int context);
    /* Parse extension sent from client to server */
62 63
    int (*parse_ctos)(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
                      size_t chainidx, int *al);
64
    /* Parse extension send from server to client */
65 66
    int (*parse_stoc)(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
                      size_t chainidx, int *al);
67
    /* Construct extension sent from server to client */
68 69
    int (*construct_stoc)(SSL *s, WPACKET *pkt, unsigned int context, X509 *x,
                          size_t chainidx, int *al);
70
    /* Construct extension sent from client to server */
71 72
    int (*construct_ctos)(SSL *s, WPACKET *pkt, unsigned int context, X509 *x,
                          size_t chainidx, int *al);
73
    /*
74 75 76
     * Finalise extension after parsing. Always called where an extensions was
     * initialised even if the extension was not present. |sent| is set to 1 if
     * the extension was seen, or 0 otherwise.
77
     */
78
    int (*final)(SSL *s, unsigned int context, int sent, int *al);
79 80
} EXTENSION_DEFINITION;

M
Matt Caswell 已提交
81
/*
82
 * Definitions of all built-in extensions. NOTE: Changes in the number or order
F
FdaSilvaYY 已提交
83 84
 * of these extensions should be mirrored with equivalent changes to the 
 * indexes ( TLSEXT_IDX_* ) defined in ssl_locl.h.
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
 * Each extension has an initialiser, a client and
 * server side parser and a finaliser. The initialiser is called (if the
 * extension is relevant to the given context) even if we did not see the
 * extension in the message that we received. The parser functions are only
 * called if we see the extension in the message. The finalisers are always
 * called if the initialiser was called.
 * There are also server and client side constructor functions which are always
 * called during message construction if the extension is relevant for the
 * given context.
 * The initialisation, parsing, finalisation and construction functions are
 * always called in the order defined in this list. Some extensions may depend
 * on others having been processed first, so the order of this list is
 * significant.
 * The extension context is defined by a series of flags which specify which
 * messages the extension is relevant to. These flags also specify whether the
F
FdaSilvaYY 已提交
100
 * extension is relevant to a particular protocol or protocol version.
M
Matt Caswell 已提交
101
 *
102
 * TODO(TLS1.3): Make sure we have a test to check the consistency of these
M
Matt Caswell 已提交
103
 */
104
#define INVALID_EXTENSION { 0x10000, 0, NULL, NULL, NULL, NULL, NULL, NULL }
105 106 107 108
static const EXTENSION_DEFINITION ext_defs[] = {
    {
        TLSEXT_TYPE_renegotiate,
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_SSL3_ALLOWED
109 110 111 112
        | EXT_TLS1_2_AND_BELOW_ONLY,
        NULL, tls_parse_ctos_renegotiate, tls_parse_stoc_renegotiate,
        tls_construct_stoc_renegotiate, tls_construct_ctos_renegotiate,
        final_renegotiate
113 114 115 116
    },
    {
        TLSEXT_TYPE_server_name,
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
117 118 119 120 121
        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
        init_server_name,
        tls_parse_ctos_server_name, tls_parse_stoc_server_name,
        tls_construct_stoc_server_name, tls_construct_ctos_server_name,
        final_server_name
122 123 124 125
    },
#ifndef OPENSSL_NO_SRP
    {
        TLSEXT_TYPE_srp,
126 127
        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
        init_srp, tls_parse_ctos_srp, NULL, NULL, tls_construct_ctos_srp, NULL
128
    },
129 130
#else
    INVALID_EXTENSION,
131 132 133 134
#endif
#ifndef OPENSSL_NO_EC
    {
        TLSEXT_TYPE_ec_point_formats,
M
Matt Caswell 已提交
135
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
136 137 138
        NULL, tls_parse_ctos_ec_pt_formats, tls_parse_stoc_ec_pt_formats,
        tls_construct_stoc_ec_pt_formats, tls_construct_ctos_ec_pt_formats,
        final_ec_pt_formats
139 140 141
    },
    {
        TLSEXT_TYPE_supported_groups,
142 143
        EXT_CLIENT_HELLO | EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
        NULL, tls_parse_ctos_supported_groups, NULL,
144
        NULL /* TODO(TLS1.3): Need to add this */,
145
        tls_construct_ctos_supported_groups, NULL
146
    },
147 148 149
#else
    INVALID_EXTENSION,
    INVALID_EXTENSION,
150 151 152
#endif
    {
        TLSEXT_TYPE_session_ticket,
153 154 155 156
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
        init_session_ticket, tls_parse_ctos_session_ticket,
        tls_parse_stoc_session_ticket, tls_construct_stoc_session_ticket,
        tls_construct_ctos_session_ticket, NULL
157 158 159
    },
    {
        TLSEXT_TYPE_signature_algorithms,
160 161
        EXT_CLIENT_HELLO,
        init_sig_algs, tls_parse_ctos_sig_algs, NULL, NULL,
162
        tls_construct_ctos_sig_algs, final_sig_algs
163
    },
164
#ifndef OPENSSL_NO_OCSP
165 166
    {
        TLSEXT_TYPE_status_request,
M
Matt Caswell 已提交
167
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
168 169 170
        | EXT_TLS1_3_CERTIFICATE,
        init_status_request, tls_parse_ctos_status_request,
        tls_parse_stoc_status_request, tls_construct_stoc_status_request,
171
        tls_construct_ctos_status_request, NULL
172
    },
173 174
#else
    INVALID_EXTENSION,
175
#endif
176 177 178
#ifndef OPENSSL_NO_NEXTPROTONEG
    {
        TLSEXT_TYPE_next_proto_neg,
179 180 181
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
        init_npn, tls_parse_ctos_npn, tls_parse_stoc_npn,
        tls_construct_stoc_next_proto_neg, tls_construct_ctos_npn, NULL
182
    },
183 184
#else
    INVALID_EXTENSION,
185 186
#endif
    {
187 188 189 190
        /*
         * Must appear in this list after server_name so that finalisation
         * happens after server_name callbacks
         */
191 192
        TLSEXT_TYPE_application_layer_protocol_negotiation,
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
193 194 195
        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
        init_alpn, tls_parse_ctos_alpn, tls_parse_stoc_alpn,
        tls_construct_stoc_alpn, tls_construct_ctos_alpn, final_alpn
196
    },
197
#ifndef OPENSSL_NO_SRTP
198 199 200
    {
        TLSEXT_TYPE_use_srtp,
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
201 202 203
        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS | EXT_DTLS_ONLY,
        init_srtp, tls_parse_ctos_use_srtp, tls_parse_stoc_use_srtp,
        tls_construct_stoc_use_srtp, tls_construct_ctos_use_srtp, NULL
204
    },
205 206
#else
    INVALID_EXTENSION,
207
#endif
208 209
    {
        TLSEXT_TYPE_encrypt_then_mac,
210
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY | EXT_SSL3_ALLOWED,
211 212
        init_etm, tls_parse_ctos_etm, tls_parse_stoc_etm,
        tls_construct_stoc_etm, tls_construct_ctos_etm, NULL
213
    },
214
#ifndef OPENSSL_NO_CT
215 216
    {
        TLSEXT_TYPE_signed_certificate_timestamp,
217 218
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
        | EXT_TLS1_3_CERTIFICATE,
219
        NULL,
220 221 222 223 224
        /*
         * No server side support for this, but can be provided by a custom
         * extension. This is an exception to the rule that custom extensions
         * cannot override built in ones.
         */
225
        NULL, tls_parse_stoc_sct, NULL, tls_construct_ctos_sct,  NULL
226
    },
227 228
#else
    INVALID_EXTENSION,
229
#endif
230 231
    {
        TLSEXT_TYPE_extended_master_secret,
232 233 234
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
        init_ems, tls_parse_ctos_ems, tls_parse_stoc_ems,
        tls_construct_stoc_ems, tls_construct_ctos_ems, final_ems
235 236 237
    },
    {
        TLSEXT_TYPE_supported_versions,
238
        EXT_CLIENT_HELLO | EXT_TLS_IMPLEMENTATION_ONLY | EXT_TLS1_3_ONLY,
239
        NULL,
240
        /* Processed inline as part of version selection */
241
        NULL, NULL, NULL, tls_construct_ctos_supported_versions, NULL
242
    },
243 244 245 246 247 248
    {
        TLSEXT_TYPE_psk_kex_modes,
        EXT_CLIENT_HELLO | EXT_TLS_IMPLEMENTATION_ONLY | EXT_TLS1_3_ONLY,
        init_psk_kex_modes, tls_parse_ctos_psk_kex_modes, NULL, NULL,
        tls_construct_ctos_psk_kex_modes, NULL
    },
M
Matt Caswell 已提交
249
#ifndef OPENSSL_NO_EC
250
    {
251 252 253 254
        /*
         * Must be in this list after supported_groups. We need that to have
         * been parsed before we do this one.
         */
255 256 257
        TLSEXT_TYPE_key_share,
        EXT_CLIENT_HELLO | EXT_TLS1_3_SERVER_HELLO
        | EXT_TLS1_3_HELLO_RETRY_REQUEST | EXT_TLS_IMPLEMENTATION_ONLY
258 259
        | EXT_TLS1_3_ONLY,
        NULL, tls_parse_ctos_key_share, tls_parse_stoc_key_share,
260 261
        tls_construct_stoc_key_share, tls_construct_ctos_key_share,
        final_key_share
262
    },
M
Matt Caswell 已提交
263
#endif
264 265 266 267 268 269
    {
        /*
         * Special unsolicited ServerHello extension only used when
         * SSL_OP_CRYPTOPRO_TLSEXT_BUG is set
         */
        TLSEXT_TYPE_cryptopro_bug,
270 271
        EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
        NULL, NULL, NULL, tls_construct_stoc_cryptopro_bug, NULL, NULL
272 273
    },
    {
274 275
        /* Must be immediately before pre_shared_key */
        /* TODO(TLS1.3): Fix me */
276
        TLSEXT_TYPE_padding,
277
        EXT_CLIENT_HELLO,
278
        NULL,
279
        /* We send this, but don't read it */
280
        NULL, NULL, NULL, tls_construct_ctos_padding, NULL
281 282 283 284 285 286
    },
    {
        /* Required by the TLSv1.3 spec to always be the last extension */
        TLSEXT_TYPE_psk,
        EXT_CLIENT_HELLO | EXT_TLS1_3_SERVER_HELLO | EXT_TLS_IMPLEMENTATION_ONLY
        | EXT_TLS1_3_ONLY,
287
        NULL, tls_parse_ctos_psk, tls_parse_stoc_psk, tls_construct_stoc_psk,
288
        tls_construct_ctos_psk, NULL
289 290 291 292 293 294
    }
};

/*
 * Verify whether we are allowed to use the extension |type| in the current
 * |context|. Returns 1 to indicate the extension is allowed or unknown or 0 to
295 296
 * indicate the extension is not allowed. If returning 1 then |*found| is set to
 * 1 if we found a definition for the extension, and |*idx| is set to its index
297
 */
298
static int verify_extension(SSL *s, unsigned int context, unsigned int type,
299 300
                            custom_ext_methods *meths, RAW_EXTENSION *rawexlist,
                            RAW_EXTENSION **found)
301 302
{
    size_t i;
303
    size_t builtin_num = OSSL_NELEM(ext_defs);
304
    const EXTENSION_DEFINITION *thisext;
305

306 307
    for (i = 0, thisext = ext_defs; i < builtin_num; i++, thisext++) {
        if (type == thisext->type) {
308
            /* Check we're allowed to use this extension in this context */
309
            if ((context & thisext->context) == 0)
310 311 312
                return 0;

            if (SSL_IS_DTLS(s)) {
313
                if ((thisext->context & EXT_TLS_ONLY) != 0)
314
                    return 0;
315
            } else if ((thisext->context & EXT_DTLS_ONLY) != 0) {
316 317 318
                    return 0;
            }

319
            *found = &rawexlist[i];
320 321 322 323
            return 1;
        }
    }

324 325 326 327 328
    if ((context & (EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO)) == 0) {
        /*
         * Custom extensions only apply to <=TLS1.2. This extension is unknown
         * in this context - we allow it
         */
329
        *found = NULL;
330 331
        return 1;
    }
332

333 334 335 336
    /* Check the custom extensions */
    if (meths != NULL) {
        for (i = builtin_num; i < builtin_num + meths->meths_count; i++) {
            if (meths->meths[i - builtin_num].ext_type == type) {
337
                *found = &rawexlist[i];
338 339
                return 1;
            }
340 341 342
        }
    }

343
    /* Unknown extension. We allow it */
344
    *found = NULL;
345
    return 1;
346 347
}

348 349 350 351 352
/*
 * Check whether the context defined for an extension |extctx| means whether
 * the extension is relevant for the current context |thisctx| or not. Returns
 * 1 if the extension is relevant for this context, and 0 otherwise
 */
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
static int extension_is_relevant(SSL *s, unsigned int extctx,
                                 unsigned int thisctx)
{
    if ((SSL_IS_DTLS(s)
                && (extctx & EXT_TLS_IMPLEMENTATION_ONLY) != 0)
            || (s->version == SSL3_VERSION
                    && (extctx & EXT_SSL3_ALLOWED) == 0)
            || (SSL_IS_TLS13(s)
                && (extctx & EXT_TLS1_2_AND_BELOW_ONLY) != 0)
            || (!SSL_IS_TLS13(s) && (extctx & EXT_TLS1_3_ONLY) != 0))
        return 0;

    return 1;
}

368 369
/*
 * Gather a list of all the extensions from the data in |packet]. |context|
370
 * tells us which message this extension is for. The raw extension data is
371 372 373 374 375
 * stored in |*res| on success. In the event of an error the alert type to use
 * is stored in |*al|. We don't actually process the content of the extensions
 * yet, except to check their types. This function also runs the initialiser
 * functions for all known extensions (whether we have collected them or not).
 * If successful the caller is responsible for freeing the contents of |*res|.
376 377 378 379 380
 *
 * Per http://tools.ietf.org/html/rfc5246#section-7.4.1.4, there may not be
 * more than one extension of the same type in a ClientHello or ServerHello.
 * This function returns 1 if all extensions are unique and we have parsed their
 * types, and 0 if the extensions contain duplicates, could not be successfully
381
 * found, or an internal error occurred. We only check duplicates for
382
 * extensions that we know about. We ignore others.
383 384
 */
int tls_collect_extensions(SSL *s, PACKET *packet, unsigned int context,
385
                           RAW_EXTENSION **res, int *al)
386 387
{
    PACKET extensions = *packet;
388
    size_t i = 0;
389
    custom_ext_methods *exts = NULL;
390
    RAW_EXTENSION *raw_extensions = NULL;
391
    const EXTENSION_DEFINITION *thisexd;
392

393 394
    *res = NULL;

395 396 397 398 399 400 401 402 403 404 405 406 407
    /*
     * Initialise server side custom extensions. Client side is done during
     * construction of extensions for the ClientHello.
     */
    if ((context & EXT_CLIENT_HELLO) != 0) {
        exts = &s->cert->srv_ext;
        custom_ext_init(&s->cert->srv_ext);
    } else if ((context & EXT_TLS1_2_SERVER_HELLO) != 0) {
        exts = &s->cert->cli_ext;
    }

    raw_extensions = OPENSSL_zalloc((OSSL_NELEM(ext_defs)
                                     + (exts != NULL ? exts->meths_count : 0))
408
                                     * sizeof(*raw_extensions));
409 410 411 412 413 414
    if (raw_extensions == NULL) {
        *al = SSL_AD_INTERNAL_ERROR;
        SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, ERR_R_MALLOC_FAILURE);
        return 0;
    }

415 416 417
    while (PACKET_remaining(&extensions) > 0) {
        unsigned int type;
        PACKET extension;
418
        RAW_EXTENSION *thisex;
419 420 421 422

        if (!PACKET_get_net_2(&extensions, &type) ||
            !PACKET_get_length_prefixed_2(&extensions, &extension)) {
            SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, SSL_R_BAD_EXTENSION);
423
            *al = SSL_AD_DECODE_ERROR;
424 425
            goto err;
        }
426 427 428 429
        /*
         * Verify this extension is allowed. We only check duplicates for
         * extensions that we recognise.
         */
430 431
        if (!verify_extension(s, context, type, exts, raw_extensions, &thisex)
                || (thisex != NULL && thisex->present == 1)) {
432
            SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, SSL_R_BAD_EXTENSION);
433
            *al = SSL_AD_ILLEGAL_PARAMETER;
434 435
            goto err;
        }
436 437 438 439
        if (thisex != NULL) {
            thisex->data = extension;
            thisex->present = 1;
            thisex->type = type;
440 441 442
        }
    }

443 444 445 446
    /*
     * Initialise all known extensions relevant to this context, whether we have
     * found them or not
     */
447 448 449 450
    for (thisexd = ext_defs, i = 0; i < OSSL_NELEM(ext_defs); i++, thisexd++) {
        if(thisexd->init != NULL && (thisexd->context & context) != 0
                && extension_is_relevant(s, thisexd->context, context)
                && !thisexd->init(s, context)) {
451
            *al = SSL_AD_INTERNAL_ERROR;
452 453 454 455
            goto err;
        }
    }

456 457 458 459 460 461 462 463
    *res = raw_extensions;
    return 1;

 err:
    OPENSSL_free(raw_extensions);
    return 0;
}

464
/*
465 466 467
 * Runs the parser for a given extension with index |idx|. |exts| contains the
 * list of all parsed extensions previously collected by
 * tls_collect_extensions(). The parser is only run if it is applicable for the
468 469
 * given |context| and the parser has not already been run. If this is for a
 * Certificate message, then we also provide the parser with the relevant
470
 * Certificate |x| and its position in the |chainidx| with 0 being the first
471 472 473
 * Certificate. Returns 1 on success or 0 on failure. In the event of a failure
 * |*al| is populated with a suitable alert code. If an extension is not present
 * this counted as success.
474
 */
475
int tls_parse_extension(SSL *s, TLSEXT_INDEX idx, int context,
476
                        RAW_EXTENSION *exts, X509 *x, size_t chainidx, int *al)
477
{
478
    RAW_EXTENSION *currext = &exts[idx];
479 480
    int (*parser)(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
                  size_t chainidx, int *al) = NULL;
481

482 483 484
    /* Skip if the extension is not present */
    if (!currext->present)
        return 1;
485

R
Rich Salz 已提交
486 487 488 489 490
    if (s->ext.debug_cb)
        s->ext.debug_cb(s, !s->server, currext->type,
                        PACKET_data(&currext->data),
                        PACKET_remaining(&currext->data),
                        s->ext.debug_arg);
491

492 493 494
    /* Skip if we've already parsed this extension */
    if (currext->parsed)
        return 1;
495

496 497 498 499 500 501 502 503 504 505
    currext->parsed = 1;

    if (idx < OSSL_NELEM(ext_defs)) {
        /* We are handling a built-in extension */
        const EXTENSION_DEFINITION *extdef = &ext_defs[idx];

        /* Check if extension is defined for our protocol. If not, skip */
        if (!extension_is_relevant(s, extdef->context, context))
            return 1;

506
        parser = s->server ? extdef->parse_ctos : extdef->parse_stoc;
M
Matt Caswell 已提交
507

508
        if (parser != NULL)
509
            return parser(s, &currext->data, context, x, chainidx, al);
510

511 512 513 514
        /*
         * If the parser is NULL we fall through to the custom extension
         * processing
         */
515 516
    }

517 518 519
    /*
     * This is a custom extension. We only allow this if it is a non
     * resumed session on the server side.
520
     *chain
521 522 523 524 525 526 527 528 529 530 531 532 533
     * TODO(TLS1.3): We only allow old style <=TLS1.2 custom extensions.
     * We're going to need a new mechanism for TLS1.3 to specify which
     * messages to add the custom extensions to.
     */
    if ((!s->hit || !s->server)
            && (context
                & (EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO)) != 0
            && custom_ext_parse(s, s->server, currext->type,
                                PACKET_data(&currext->data),
                                PACKET_remaining(&currext->data),
                                al) <= 0)
        return 0;

534 535 536 537 538
    return 1;
}

/*
 * Parse all remaining extensions that have not yet been parsed. Also calls the
539
 * finalisation for all extensions at the end, whether we collected them or not.
540 541
 * Returns 1 for success or 0 for failure. If we are working on a Certificate
 * message then we also pass the Certificate |x| and its position in the
542 543
 * |chainidx|, with 0 being the first certificate. On failure, |*al| is
 * populated with a suitable alert code.
544
 */
545
int tls_parse_all_extensions(SSL *s, int context, RAW_EXTENSION *exts, X509 *x,
546
                             size_t chainidx, int *al)
547
{
548
    size_t i, numexts = OSSL_NELEM(ext_defs);
549
    const EXTENSION_DEFINITION *thisexd;
550

551 552 553 554 555 556 557 558
    /* Calculate the number of extensions in the extensions list */
    if ((context & EXT_CLIENT_HELLO) != 0) {
        numexts += s->cert->srv_ext.meths_count;
    } else if ((context & EXT_TLS1_2_SERVER_HELLO) != 0) {
        numexts += s->cert->cli_ext.meths_count;
    }

    /* Parse each extension in turn */
559
    for (i = 0; i < numexts; i++) {
560
        if (!tls_parse_extension(s, i, context, exts, x, chainidx, al))
561 562
            return 0;
    }
563

564 565 566 567
    /*
     * Finalise all known extensions relevant to this context, whether we have
     * found them or not
     */
568 569 570 571
    for (i = 0, thisexd = ext_defs; i < OSSL_NELEM(ext_defs); i++, thisexd++) {
        if(thisexd->final != NULL
                && (thisexd->context & context) != 0
                && !thisexd->final(s, context, exts[i].present, al))
572 573 574
            return 0;
    }

575 576 577 578
    return 1;
}

/*
579
 * Construct all the extensions relevant to the current |context| and write
580
 * them to |pkt|. If this is an extension for a Certificate in a Certificate
581 582 583 584 585
 * message, then |x| will be set to the Certificate we are handling, and
 * |chainidx| will indicate the position in the chainidx we are processing (with
 * 0 being the first in the chain). Returns 1 on success or 0 on failure. If a
 * failure occurs then |al| is populated with a suitable alert code. On a
 * failure construction stops at the first extension to fail to construct.
586
 */
M
Matt Caswell 已提交
587
int tls_construct_extensions(SSL *s, WPACKET *pkt, unsigned int context,
588
                             X509 *x, size_t chainidx, int *al)
M
Matt Caswell 已提交
589
{
590 591
    size_t i;
    int addcustom = 0, min_version, max_version = 0, reason, tmpal;
592
    const EXTENSION_DEFINITION *thisexd;
M
Matt Caswell 已提交
593

594
    /*
595
     * Normally if something goes wrong during construction it's an internal
596 597
     * error. We can always override this later.
     */
598
    tmpal = SSL_AD_INTERNAL_ERROR;
599

M
Matt Caswell 已提交
600 601 602
    if (!WPACKET_start_sub_packet_u16(pkt)
               /*
                * If extensions are of zero length then we don't even add the
603
                * extensions length bytes to a ClientHello/ServerHello in SSLv3
M
Matt Caswell 已提交
604
                */
605 606
            || ((context & (EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO)) != 0
               && s->version == SSL3_VERSION
M
Matt Caswell 已提交
607 608 609
               && !WPACKET_set_flags(pkt,
                                     WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))) {
        SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, ERR_R_INTERNAL_ERROR);
610
        goto err;
M
Matt Caswell 已提交
611 612
    }

613 614 615 616
    if ((context & EXT_CLIENT_HELLO) != 0) {
        reason = ssl_get_client_min_max_version(s, &min_version, &max_version);
        if (reason != 0) {
            SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, reason);
617
            goto err;
618 619 620 621 622 623 624 625 626 627 628
        }
    }

    /* Add custom extensions first */
    if ((context & EXT_CLIENT_HELLO) != 0) {
        custom_ext_init(&s->cert->cli_ext);
        addcustom = 1;
    } else if ((context & EXT_TLS1_2_SERVER_HELLO) != 0) {
        /*
         * We already initialised the custom extensions during ClientHello
         * parsing.
M
Matt Caswell 已提交
629
         *
630 631 632 633 634 635 636
         * TODO(TLS1.3): We're going to need a new custom extension mechanism
         * for TLS1.3, so that custom extensions can specify which of the
         * multiple message they wish to add themselves to.
         */
        addcustom = 1;
    }

637
    if (addcustom && !custom_ext_add(s, s->server, pkt, &tmpal)) {
638
        SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, ERR_R_INTERNAL_ERROR);
639
        goto err;
640 641
    }

642
    for (i = 0, thisexd = ext_defs; i < OSSL_NELEM(ext_defs); i++, thisexd++) {
643 644
        int (*construct)(SSL *s, WPACKET *pkt, unsigned int context, X509 *x,
                         size_t chainidx, int *al);
M
Matt Caswell 已提交
645

M
Matt Caswell 已提交
646
        /* Skip if not relevant for our context */
647
        if ((thisexd->context & context) == 0)
M
Matt Caswell 已提交
648 649
            continue;

650 651
        construct = s->server ? thisexd->construct_stoc
                              : thisexd->construct_ctos;
M
Matt Caswell 已提交
652 653 654

        /* Check if this extension is defined for our protocol. If not, skip */
        if ((SSL_IS_DTLS(s)
655
                    && (thisexd->context & EXT_TLS_IMPLEMENTATION_ONLY)
M
Matt Caswell 已提交
656
                       != 0)
M
Matt Caswell 已提交
657
                || (s->version == SSL3_VERSION
658
                        && (thisexd->context & EXT_SSL3_ALLOWED) == 0)
M
Matt Caswell 已提交
659
                || (SSL_IS_TLS13(s)
660
                    && (thisexd->context & EXT_TLS1_2_AND_BELOW_ONLY)
M
Matt Caswell 已提交
661
                       != 0)
M
Matt Caswell 已提交
662
                || (!SSL_IS_TLS13(s)
663
                    && (thisexd->context & EXT_TLS1_3_ONLY) != 0
M
Matt Caswell 已提交
664
                    && (context & EXT_CLIENT_HELLO) == 0)
665
                || ((thisexd->context & EXT_TLS1_3_ONLY) != 0
666 667
                    && (context & EXT_CLIENT_HELLO) != 0
                    && (SSL_IS_DTLS(s) || max_version < TLS1_3_VERSION))
M
Matt Caswell 已提交
668 669 670
                || construct == NULL)
            continue;

671
        if (!construct(s, pkt, context, x, chainidx, &tmpal))
672
            goto err;
M
Matt Caswell 已提交
673 674 675 676
    }

    if (!WPACKET_close(pkt)) {
        SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, ERR_R_INTERNAL_ERROR);
677
        goto err;
M
Matt Caswell 已提交
678 679 680
    }

    return 1;
681 682 683 684

 err:
    *al = tmpal;
    return 0;
M
Matt Caswell 已提交
685
}
686

687 688 689 690 691 692 693 694
/*
 * Built in extension finalisation and initialisation functions. All initialise
 * or finalise the associated extension type for the given |context|. For
 * finalisers |sent| is set to 1 if we saw the extension during parsing, and 0
 * otherwise. These functions return 1 on success or 0 on failure. In the event
 * of a failure then |*al| is populated with a suitable error code.
 */

695
static int final_renegotiate(SSL *s, unsigned int context, int sent,
696 697
                                     int *al)
{
698 699 700 701 702 703 704 705 706
    if (!s->server) {
        /*
         * Check if we can connect to a server that doesn't support safe
         * renegotiation
         */
        if (!(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
                && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)
                && !sent) {
            *al = SSL_AD_HANDSHAKE_FAILURE;
M
Matt Caswell 已提交
707
            SSLerr(SSL_F_FINAL_RENEGOTIATE,
708 709 710 711
                   SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
            return 0;
        }

712
        return 1;
713
    }
714 715 716 717 718 719

    /* Need RI if renegotiating */
    if (s->renegotiate
            && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)
            && !sent) {
        *al = SSL_AD_HANDSHAKE_FAILURE;
M
Matt Caswell 已提交
720
        SSLerr(SSL_F_FINAL_RENEGOTIATE,
721 722 723 724
               SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
        return 0;
    }

725

726 727 728
    return 1;
}

729
static int init_server_name(SSL *s, unsigned int context)
730 731 732 733 734 735 736
{
    if (s->server)
        s->servername_done = 0;

    return 1;
}

737
static int final_server_name(SSL *s, unsigned int context, int sent,
738 739 740 741 742
                                     int *al)
{
    int ret = SSL_TLSEXT_ERR_NOACK;
    int altmp = SSL_AD_UNRECOGNIZED_NAME;

R
Rich Salz 已提交
743 744 745
    if (s->ctx != NULL && s->ctx->ext.servername_cb != 0)
        ret = s->ctx->ext.servername_cb(s, &altmp,
                                        s->ctx->ext.servername_arg);
746 747 748 749
    else if (s->session_ctx != NULL
             && s->session_ctx->ext.servername_cb != 0)
        ret = s->session_ctx->ext.servername_cb(s, &altmp,
                                       s->session_ctx->ext.servername_arg);
750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768

    switch (ret) {
    case SSL_TLSEXT_ERR_ALERT_FATAL:
        *al = altmp;
        return 0;

    case SSL_TLSEXT_ERR_ALERT_WARNING:
        *al = altmp;
        return 1;

    case SSL_TLSEXT_ERR_NOACK:
        s->servername_done = 0;
        return 1;

    default:
        return 1;
    }
}

769
#ifndef OPENSSL_NO_EC
770
static int final_ec_pt_formats(SSL *s, unsigned int context, int sent,
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
                                       int *al)
{
    unsigned long alg_k, alg_a;

    if (s->server)
        return 1;

    alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
    alg_a = s->s3->tmp.new_cipher->algorithm_auth;

    /*
     * If we are client and using an elliptic curve cryptography cipher
     * suite, then if server returns an EC point formats lists extension it
     * must contain uncompressed.
     */
R
Rich Salz 已提交
786 787 788 789
    if (s->ext.ecpointformats != NULL
            && s->ext.ecpointformats_len > 0
            && s->session->ext.ecpointformats != NULL
            && s->session->ext.ecpointformats_len > 0
790
            && ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))) {
791 792
        /* we are using an ECC cipher */
        size_t i;
R
Rich Salz 已提交
793
        unsigned char *list = s->session->ext.ecpointformats;
794

R
Rich Salz 已提交
795
        for (i = 0; i < s->session->ext.ecpointformats_len; i++) {
796
            if (*list++ == TLSEXT_ECPOINTFORMAT_uncompressed)
797 798
                break;
        }
R
Rich Salz 已提交
799
        if (i == s->session->ext.ecpointformats_len) {
M
Matt Caswell 已提交
800
            SSLerr(SSL_F_FINAL_EC_PT_FORMATS,
801 802 803 804 805 806 807 808 809
                   SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
            return 0;
        }
    }

    return 1;
}
#endif

810
static int init_session_ticket(SSL *s, unsigned int context)
811 812
{
    if (!s->server)
R
Rich Salz 已提交
813
        s->ext.ticket_expected = 0;
814 815 816 817

    return 1;
}

818
#ifndef OPENSSL_NO_OCSP
819
static int init_status_request(SSL *s, unsigned int context)
820
{
821
    if (s->server) {
R
Rich Salz 已提交
822
        s->ext.status_type = TLSEXT_STATUSTYPE_nothing;
823 824 825 826 827
    } else {
        /*
         * Ensure we get sensible values passed to tlsext_status_cb in the event
         * that we don't receive a status message
         */
828 829 830
        OPENSSL_free(s->ext.ocsp.resp);
        s->ext.ocsp.resp = NULL;
        s->ext.ocsp.resp_len = 0;
831
    }
832 833 834

    return 1;
}
835
#endif
836

837
#ifndef OPENSSL_NO_NEXTPROTONEG
838
static int init_npn(SSL *s, unsigned int context)
839
{
R
Rich Salz 已提交
840
    s->s3->npn_seen = 0;
841 842 843 844 845

    return 1;
}
#endif

846
static int init_alpn(SSL *s, unsigned int context)
847
{
848 849
    OPENSSL_free(s->s3->alpn_selected);
    s->s3->alpn_selected = NULL;
850 851 852 853 854 855 856 857 858
    if (s->server) {
        s->s3->alpn_selected_len = 0;
        OPENSSL_free(s->s3->alpn_proposed);
        s->s3->alpn_proposed = NULL;
        s->s3->alpn_proposed_len = 0;
    }
    return 1;
}

859
static int final_alpn(SSL *s, unsigned int context, int sent, int *al)
860 861 862 863 864 865 866
{
    const unsigned char *selected = NULL;
    unsigned char selected_len = 0;

    if (!s->server)
        return 1;

R
Rich Salz 已提交
867 868 869 870 871
    if (s->ctx->ext.alpn_select_cb != NULL && s->s3->alpn_proposed != NULL) {
        int r = s->ctx->ext.alpn_select_cb(s, &selected, &selected_len,
                                           s->s3->alpn_proposed,
                                           (unsigned int)s->s3->alpn_proposed_len,
                                           s->ctx->ext.alpn_select_cb_arg);
872 873 874 875 876 877 878 879 880 881 882

        if (r == SSL_TLSEXT_ERR_OK) {
            OPENSSL_free(s->s3->alpn_selected);
            s->s3->alpn_selected = OPENSSL_memdup(selected, selected_len);
            if (s->s3->alpn_selected == NULL) {
                *al = SSL_AD_INTERNAL_ERROR;
                return 0;
            }
            s->s3->alpn_selected_len = selected_len;
#ifndef OPENSSL_NO_NEXTPROTONEG
            /* ALPN takes precedence over NPN. */
R
Rich Salz 已提交
883
            s->s3->npn_seen = 0;
884 885 886 887 888 889 890 891 892 893
#endif
        } else {
            *al = SSL_AD_NO_APPLICATION_PROTOCOL;
            return 0;
        }
    }

    return 1;
}

894
static int init_sig_algs(SSL *s, unsigned int context)
895 896 897 898 899 900 901 902 903
{
    /* Clear any signature algorithms extension received */
    OPENSSL_free(s->s3->tmp.peer_sigalgs);
    s->s3->tmp.peer_sigalgs = NULL;

    return 1;
}

#ifndef OPENSSL_NO_SRP
904
static int init_srp(SSL *s, unsigned int context)
905 906 907 908 909 910 911 912
{
    OPENSSL_free(s->srp_ctx.login);
    s->srp_ctx.login = NULL;

    return 1;
}
#endif

913
static int init_etm(SSL *s, unsigned int context)
914
{
915
    s->ext.use_etm = 0;
916 917 918 919

    return 1;
}

920
static int init_ems(SSL *s, unsigned int context)
921 922 923 924 925 926 927
{
    if (!s->server)
        s->s3->flags &= ~TLS1_FLAGS_RECEIVED_EXTMS;

    return 1;
}

928
static int final_ems(SSL *s, unsigned int context, int sent, int *al)
929 930 931 932 933 934 935 936 937
{
    if (!s->server && s->hit) {
        /*
         * Check extended master secret extension is consistent with
         * original session.
         */
        if (!(s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) !=
            !(s->session->flags & SSL_SESS_FLAG_EXTMS)) {
            *al = SSL_AD_HANDSHAKE_FAILURE;
M
Matt Caswell 已提交
938
            SSLerr(SSL_F_FINAL_EMS, SSL_R_INCONSISTENT_EXTMS);
939 940 941
            return 0;
        }
    }
942 943 944 945 946

    return 1;
}

#ifndef OPENSSL_NO_SRTP
947
static int init_srtp(SSL *s, unsigned int context)
948 949 950 951 952 953 954
{
    if (s->server)
        s->srtp_profile = NULL;

    return 1;
}
#endif
955 956 957 958 959 960 961 962 963 964 965

static int final_sig_algs(SSL *s, unsigned int context, int sent, int *al)
{
    if (!sent && SSL_IS_TLS13(s)) {
        *al = TLS13_AD_MISSING_EXTENSION;
        SSLerr(SSL_F_FINAL_SIG_ALGS, SSL_R_MISSING_SIGALGS_EXTENSION);
        return 0;
    }

    return 1;
}
966

M
Matt Caswell 已提交
967
#ifndef OPENSSL_NO_EC
968 969 970 971 972 973 974
static int final_key_share(SSL *s, unsigned int context, int sent, int *al)
{
    if (!SSL_IS_TLS13(s))
        return 1;

    /*
     * If
975 976
     *     we are a client
     *     AND
977 978 979 980 981
     *     we have no key_share
     *     AND
     *     (we are not resuming
     *      OR the kex_mode doesn't allow non key_share resumes)
     * THEN
982
     *     fail;
983
     */
984 985
    if (!s->server
            && !sent
986 987
            && (!s->hit
                || (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE) == 0)) {
988
        /* Nothing left we can do - just fail */
989 990 991 992
        *al = SSL_AD_HANDSHAKE_FAILURE;
        SSLerr(SSL_F_FINAL_KEY_SHARE, SSL_R_NO_SUITABLE_KEY_SHARE);
        return 0;
    }
993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
    /*
     * If
     *     we are a server
     *     AND
     *     we have no key_share
     * THEN
     *     If
     *         we didn't already send a HelloRetryRequest
     *         AND
     *         the client sent a key_share extension
     *         AND
     *         (we are not resuming
     *          OR the kex_mode allows key_share resumes)
     *         AND
     *         a shared group exists
     *     THEN
     *         send a HelloRetryRequest
     *     ELSE If
     *         we are not resuming
     *         OR
     *         the kex_mode doesn't allow non key_share resumes
     *     THEN
     *         fail;
     */
    if (s->server && s->s3->peer_tmp == NULL) {
        /* No suitable share */
        if (s->hello_retry_request == 0 && sent
                && (!s->hit
                    || (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE_DHE)
                       != 0)) {
            const unsigned char *pcurves, *pcurvestmp, *clntcurves;
            size_t num_curves, clnt_num_curves, i;
1025
            unsigned int group_id = 0;
1026

1027
            /* Check if a shared group exists */
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045

            /* Get the clients list of supported groups. */
            if (!tls1_get_curvelist(s, 1, &clntcurves, &clnt_num_curves)) {
                *al = SSL_AD_INTERNAL_ERROR;
                SSLerr(SSL_F_FINAL_KEY_SHARE, ERR_R_INTERNAL_ERROR);
                return 0;
            }

            /* Get our list of available groups */
            if (!tls1_get_curvelist(s, 0, &pcurves, &num_curves)) {
                *al = SSL_AD_INTERNAL_ERROR;
                SSLerr(SSL_F_FINAL_KEY_SHARE, ERR_R_INTERNAL_ERROR);
                return 0;
            }

            /* Find the first group we allow that is also in client's list */
            for (i = 0, pcurvestmp = pcurves; i < num_curves;
                 i++, pcurvestmp += 2) {
M
Matt Caswell 已提交
1046
                group_id = bytestogroup(pcurvestmp);
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070

                if (check_in_list(s, group_id, clntcurves, clnt_num_curves, 1))
                    break;
            }

            if (i < num_curves) {
                /* A shared group exists so send a HelloRetryRequest */
                s->s3->group_id = group_id;
                s->hello_retry_request = 1;
                return 1;
            }
        }
        if (!s->hit
                || (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE) == 0) {
            /* Nothing left we can do - just fail */
            *al = SSL_AD_HANDSHAKE_FAILURE;
            SSLerr(SSL_F_FINAL_KEY_SHARE, SSL_R_NO_SUITABLE_KEY_SHARE);
            return 0;
        }
    }

    /* We have a key_share so don't send any more HelloRetryRequest messages */
    if (s->server)
        s->hello_retry_request = 0;
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084

    /*
     * For a client side resumption with no key_share we need to generate
     * the handshake secret (otherwise this is done during key_share
     * processing).
     */
    if (!sent && !s->server && !tls13_generate_handshake_secret(s, NULL, 0)) {
        *al = SSL_AD_INTERNAL_ERROR;
        SSLerr(SSL_F_FINAL_KEY_SHARE, ERR_R_INTERNAL_ERROR);
        return 0;
    }

    return 1;
}
M
Matt Caswell 已提交
1085
#endif
1086

1087 1088 1089 1090 1091
static int init_psk_kex_modes(SSL *s, unsigned int context)
{
    s->ext.psk_kex_mode = TLSEXT_KEX_MODE_FLAG_NONE;
    return 1;
}
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102

int tls_psk_do_binder(SSL *s, const EVP_MD *md, const unsigned char *msgstart,
                      size_t binderoffset, const unsigned char *binderin,
                      unsigned char *binderout,
                      SSL_SESSION *sess, int sign)
{
    EVP_PKEY *mackey = NULL;
    EVP_MD_CTX *mctx = NULL;
    unsigned char hash[EVP_MAX_MD_SIZE], binderkey[EVP_MAX_MD_SIZE];
    unsigned char finishedkey[EVP_MAX_MD_SIZE], tmpbinder[EVP_MAX_MD_SIZE];
    const char resumption_label[] = "resumption psk binder key";
1103
    size_t bindersize, hashsize = EVP_MD_size(md);
1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
    int ret = -1;

    /* Generate the early_secret */
    if (!tls13_generate_secret(s, md, NULL, sess->master_key,
                               sess->master_key_length,
                               (unsigned char *)&s->early_secret)) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

    /*
     * Create the handshake hash for the binder key...the messages so far are
     * empty!
     */
    mctx = EVP_MD_CTX_new();
    if (mctx == NULL
            || EVP_DigestInit_ex(mctx, md, NULL) <= 0
            || EVP_DigestFinal_ex(mctx, hash, NULL) <= 0) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

    /* Generate the binder key */
    if (!tls13_hkdf_expand(s, md, s->early_secret,
                           (unsigned char *)resumption_label,
                           sizeof(resumption_label) - 1, hash, binderkey,
                           hashsize)) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

    /* Generate the finished key */
    if (!tls13_derive_finishedkey(s, md, binderkey, finishedkey, hashsize)) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

1141 1142 1143 1144 1145
    if (EVP_DigestInit_ex(mctx, md, NULL) <= 0) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

1146
    /*
1147 1148 1149
     * Get a hash of the ClientHello up to the start of the binders. If we are
     * following a HelloRetryRequest then this includes the hash of the first
     * ClientHello and the HelloRetryRequest itself.
1150
     */
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
    if (s->hello_retry_request) {
        size_t hdatalen;
        void *hdata;

        hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, &hdata);
        if (hdatalen <= 0) {
            SSLerr(SSL_F_TLS_PSK_DO_BINDER, SSL_R_BAD_HANDSHAKE_LENGTH);
            goto err;
        }

        /*
         * For servers the handshake buffer data will include the second
         * ClientHello - which we don't want - so we need to take that bit off.
         */
        if (s->server) {
            if (hdatalen < s->init_num + SSL3_HM_HEADER_LENGTH) {
                SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
                goto err;
            }
            hdatalen -= s->init_num + SSL3_HM_HEADER_LENGTH;
        }

        if (EVP_DigestUpdate(mctx, hdata, hdatalen) <= 0) {
            SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
            goto err;
        }
    }

    if (EVP_DigestUpdate(mctx, msgstart, binderoffset) <= 0
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
            || EVP_DigestFinal_ex(mctx, hash, NULL) <= 0) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

    mackey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, finishedkey, hashsize);
    if (mackey == NULL) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

    if (!sign)
        binderout = tmpbinder;

    bindersize = hashsize;
    if (EVP_DigestSignInit(mctx, NULL, md, NULL, mackey) <= 0
            || EVP_DigestSignUpdate(mctx, hash, hashsize) <= 0
            || EVP_DigestSignFinal(mctx, binderout, &bindersize) <= 0
            || bindersize != hashsize) {
        SSLerr(SSL_F_TLS_PSK_DO_BINDER, ERR_R_INTERNAL_ERROR);
        goto err;
    }

    if (sign) {
        ret = 1;
    } else {
        /* HMAC keys can't do EVP_DigestVerify* - use CRYPTO_memcmp instead */
        ret = (CRYPTO_memcmp(binderin, binderout, hashsize) == 0);
    }

 err:
    OPENSSL_cleanse(binderkey, sizeof(binderkey));
    OPENSSL_cleanse(finishedkey, sizeof(finishedkey));
    EVP_PKEY_free(mackey);
    EVP_MD_CTX_free(mctx);

    return ret;
}