extensions.c 31.1 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 14 15 16 17
static int tls_ext_final_renegotiate(SSL *s, unsigned int context, int sent,
                                     int *al);
static int tls_ext_init_server_name(SSL *s, unsigned int context);
static int tls_ext_final_server_name(SSL *s, unsigned int context, int sent,
                                     int *al);
18 19 20 21 22
#ifndef OPENSSL_NO_EC
static int tls_ext_final_ec_pt_formats(SSL *s, unsigned int context, int sent,
                                       int *al);
#endif
static int tls_ext_init_session_ticket(SSL *s, unsigned int context);
23
static int tls_ext_init_status_request(SSL *s, unsigned int context);
24 25
static int tls_ext_final_status_request(SSL *s, unsigned int context, int sent,
                                        int *al);
26 27 28 29
#ifndef OPENSSL_NO_NEXTPROTONEG
static int tls_ext_init_npn(SSL *s, unsigned int context);
#endif
static int tls_ext_init_alpn(SSL *s, unsigned int context);
30
static int tls_ext_final_alpn(SSL *s, unsigned int context, int sent, int *al);
31 32 33 34 35
static int tls_ext_init_sig_algs(SSL *s, unsigned int context);
#ifndef OPENSSL_NO_SRP
static int tls_ext_init_srp(SSL *s, unsigned int context);
#endif
static int tls_ext_init_etm(SSL *s, unsigned int context);
36 37
static int tls_ext_init_ems(SSL *s, unsigned int context);
static int tls_ext_final_ems(SSL *s, unsigned int context, int sent, int *al);
38 39 40 41
#ifndef OPENSSL_NO_SRTP
static int tls_ext_init_srtp(SSL *s, unsigned int context);
#endif

42
/* Structure to define a built-in extension */
43 44 45
typedef struct {
    /* The ID for the extension */
    unsigned int type;
46
    /*
47 48
     * Initialise extension before parsing. Always called for relevant contexts
     * even if extension not present
49 50
     */
    int (*init_ext)(SSL *s, unsigned int context);
51 52 53 54 55 56 57 58
    /* Parse extension received by server from client */
    int (*parse_client_ext)(SSL *s, PACKET *pkt, int *al);
    /* Parse extension received by client from server */
    int (*parse_server_ext)(SSL *s, PACKET *pkt, int *al);
    /* Construct extension sent by server */
    int (*construct_server_ext)(SSL *s, WPACKET *pkt, int *al);
    /* Construct extension sent by client */
    int (*construct_client_ext)(SSL *s, WPACKET *pkt, int *al);
59
    /*
60 61 62
     * 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.
63
     */
64
    int (*finalise_ext)(SSL *s, unsigned int context, int sent, int *al);
65 66 67
    unsigned int context;
} EXTENSION_DEFINITION;

M
Matt Caswell 已提交
68
/*
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
 * Definitions of all built-in extensions. NOTE: Changes in the number or order
 * of these extensions should be mirrored with equivalent changes to the indexes
 * defined in statem_locl.h.
 * 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
 * extension is relevant to a paricular protocol or protocol version.
 * 
 * TODO(TLS1.3): Make sure we have a test to check the consistency of these
M
Matt Caswell 已提交
90
 */
91 92 93
static const EXTENSION_DEFINITION ext_defs[] = {
    {
        TLSEXT_TYPE_renegotiate,
94
        NULL,
M
Matt Caswell 已提交
95
        tls_parse_client_renegotiate,
96
        tls_parse_server_renegotiate,
97
        tls_construct_server_renegotiate,
98
        tls_construct_client_renegotiate,
99
        tls_ext_final_renegotiate,
100 101 102 103 104
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_SSL3_ALLOWED
        | EXT_TLS1_2_AND_BELOW_ONLY
    },
    {
        TLSEXT_TYPE_server_name,
105
        tls_ext_init_server_name,
M
Matt Caswell 已提交
106
        tls_parse_client_server_name,
107
        tls_parse_server_server_name,
108
        tls_construct_server_server_name,
109
        tls_construct_client_server_name,
110
        tls_ext_final_server_name,
111
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
112
        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS
113 114 115 116
    },
#ifndef OPENSSL_NO_SRP
    {
        TLSEXT_TYPE_srp,
117
        tls_ext_init_srp,
M
Matt Caswell 已提交
118
        tls_parse_client_srp,
119
        NULL,
M
Matt Caswell 已提交
120
        NULL,
121
        tls_construct_client_srp,
122
        NULL,
123
        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
124 125 126 127 128
    },
#endif
#ifndef OPENSSL_NO_EC
    {
        TLSEXT_TYPE_ec_point_formats,
129
        NULL,
M
Matt Caswell 已提交
130
        tls_parse_client_ec_pt_formats,
131
        tls_parse_server_ec_pt_formats,
132
        tls_construct_server_ec_pt_formats,
133
        tls_construct_client_ec_pt_formats,
134
        tls_ext_final_ec_pt_formats,
135 136 137 138
        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
    },
    {
        TLSEXT_TYPE_supported_groups,
139
        NULL,
M
Matt Caswell 已提交
140
        tls_parse_client_supported_groups,
141
        NULL,
142
        NULL /* TODO(TLS1.3): Need to add this */,
143
        tls_construct_client_supported_groups,
144 145
        NULL,
        EXT_CLIENT_HELLO | EXT_TLS1_3_ENCRYPTED_EXTENSIONS
146 147 148 149
    },
#endif
    {
        TLSEXT_TYPE_session_ticket,
150
        tls_ext_init_session_ticket,
M
Matt Caswell 已提交
151
        tls_parse_client_session_ticket,
152
        tls_parse_server_session_ticket,
153
        tls_construct_server_session_ticket,
154
        tls_construct_client_session_ticket,
155
        NULL,
156 157 158 159
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
    },
    {
        TLSEXT_TYPE_signature_algorithms,
160
        tls_ext_init_sig_algs,
M
Matt Caswell 已提交
161
        tls_parse_client_sig_algs,
162
        NULL,
M
Matt Caswell 已提交
163
        NULL,
164
        tls_construct_client_sig_algs,
165
        NULL,
166 167
        EXT_CLIENT_HELLO
    },
168
#ifndef OPENSSL_NO_OCSP
169 170
    {
        TLSEXT_TYPE_status_request,
171
        tls_ext_init_status_request,
M
Matt Caswell 已提交
172
        tls_parse_client_status_request,
173
        tls_parse_server_status_request,
174
        tls_construct_server_status_request,
175
        tls_construct_client_status_request,
176
        tls_ext_final_status_request,
M
Matt Caswell 已提交
177
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
178
        | EXT_TLS1_3_CERTIFICATE
179
    },
180
#endif
181 182 183
#ifndef OPENSSL_NO_NEXTPROTONEG
    {
        TLSEXT_TYPE_next_proto_neg,
184
        tls_ext_init_npn,
M
Matt Caswell 已提交
185
        tls_parse_client_npn,
186
        tls_parse_server_npn,
187
        tls_construct_server_next_proto_neg,
188
        tls_construct_client_npn,
189
        NULL,
190 191 192 193
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
    },
#endif
    {
194 195 196 197
        /*
         * Must appear in this list after server_name so that finalisation
         * happens after server_name callbacks
         */
198
        TLSEXT_TYPE_application_layer_protocol_negotiation,
199
        tls_ext_init_alpn,
M
Matt Caswell 已提交
200
        tls_parse_client_alpn,
201
        tls_parse_server_alpn,
202
        tls_construct_server_alpn,
203
        tls_construct_client_alpn,
204
        tls_ext_final_alpn,
205
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
206
        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS
207
    },
208
#ifndef OPENSSL_NO_SRTP
209 210
    {
        TLSEXT_TYPE_use_srtp,
211
        tls_ext_init_srtp,
M
Matt Caswell 已提交
212
        tls_parse_client_use_srtp,
213
        tls_parse_server_use_srtp,
214
        tls_construct_server_use_srtp,
215
        tls_construct_client_use_srtp,
216
        NULL,
217 218 219
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS | EXT_DTLS_ONLY
    },
220
#endif
221 222
    {
        TLSEXT_TYPE_encrypt_then_mac,
223
        tls_ext_init_etm,
M
Matt Caswell 已提交
224
        tls_parse_client_etm,
225
        tls_parse_server_etm,
226
        tls_construct_server_etm,
227
        tls_construct_client_etm,
228
        NULL,
229 230
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
    },
231
#ifndef OPENSSL_NO_CT
232 233
    {
        TLSEXT_TYPE_signed_certificate_timestamp,
234
        NULL,
235 236 237 238 239 240
        /*
         * 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.
         */
        NULL,
241
        tls_parse_server_sct,
M
Matt Caswell 已提交
242
        NULL,
243
        tls_construct_client_sct,
244
        NULL,
M
Matt Caswell 已提交
245
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
246
        | EXT_TLS1_3_CERTIFICATE
247
    },
248
#endif
249 250
    {
        TLSEXT_TYPE_extended_master_secret,
251
        tls_ext_init_ems,
M
Matt Caswell 已提交
252
        tls_parse_client_ems,
253
        tls_parse_server_ems,
254
        tls_construct_server_ems,
255
        tls_construct_client_ems,
256
        tls_ext_final_ems,
257 258 259 260
        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
    },
    {
        TLSEXT_TYPE_supported_versions,
261
        NULL,
262 263 264
        /* Processed inline as part of version selection */
        NULL,
        NULL,
M
Matt Caswell 已提交
265
        NULL,
266
        tls_construct_client_supported_versions,
267
        NULL,
268
        EXT_CLIENT_HELLO | EXT_TLS_IMPLEMENTATION_ONLY | EXT_TLS1_3_ONLY
269 270
    },
    {
271 272 273 274
        /*
         * Must be in this list after supported_groups. We need that to have
         * been parsed before we do this one.
         */
275
        TLSEXT_TYPE_key_share,
276
        NULL,
M
Matt Caswell 已提交
277
        tls_parse_client_key_share,
278
        tls_parse_server_key_share,
279
        tls_construct_server_key_share,
280
        tls_construct_client_key_share,
281
        NULL,
282 283 284
        EXT_CLIENT_HELLO | EXT_TLS1_3_SERVER_HELLO
        | EXT_TLS1_3_HELLO_RETRY_REQUEST | EXT_TLS_IMPLEMENTATION_ONLY
        | EXT_TLS1_3_ONLY
285 286 287 288 289 290 291 292 293
    },
    {
        /*
         * Special unsolicited ServerHello extension only used when
         * SSL_OP_CRYPTOPRO_TLSEXT_BUG is set
         */
        TLSEXT_TYPE_cryptopro_bug,
        NULL,
        NULL,
294
        NULL,
295 296
        tls_construct_server_cryptopro_bug,
        NULL,
297
        NULL,
298
        EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
299 300 301 302
    },
    {
        /* Last in the list because it must be added as the last extension */
        TLSEXT_TYPE_padding,
303
        NULL,
304 305 306 307 308
        /* We send this, but don't read it */
        NULL,
        NULL,
        NULL,
        tls_construct_client_padding,
309
        NULL,
310
        EXT_CLIENT_HELLO
311 312 313 314 315 316
    }
};

/*
 * 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
317 318
 * 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
319
 */
320 321
static int verify_extension(SSL *s, unsigned int context, unsigned int type,
                            custom_ext_methods *meths, int *found, size_t *idx)
322 323
{
    size_t i;
324
    size_t builtin_num = OSSL_NELEM(ext_defs);
325

326
    for (i = 0; i < builtin_num; i++) {
327 328 329 330 331 332 333 334 335 336 337 338
        if (type == ext_defs[i].type) {
            /* Check we're allowed to use this extension in this context */
            if ((context & ext_defs[i].context) == 0)
                return 0;

            if (SSL_IS_DTLS(s)) {
                if ((ext_defs[i].context & EXT_TLS_ONLY) != 0)
                    return 0;
            } else if ((ext_defs[i].context & EXT_DTLS_ONLY) != 0) {
                    return 0;
            }

339 340
            *found = 1;
            *idx = i;
341 342 343 344
            return 1;
        }
    }

345 346 347 348 349 350 351 352
    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
         */
        *found = 0;
        return 1;
    }
353

354 355 356 357 358 359 360 361
    /* 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) {
                *found = 1;
                *idx = i;
                return 1;
            }
362 363 364
        }
    }

365 366 367
    /* Unknown extension. We allow it */
    *found = 0;
    return 1;
368 369
}

370 371 372 373 374
/*
 * 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
 */
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
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;
}

390 391
/*
 * Gather a list of all the extensions from the data in |packet]. |context|
392 393 394 395 396
 * tells us which message this extension is for. The raw extension data is
 * stored in |*res|. 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).
397 398 399 400 401
 *
 * 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
402 403
 * collected, or an internal error occurred. We only check duplicates for
 * extensions that we know about. We ignore others.
404 405
 */
int tls_collect_extensions(SSL *s, PACKET *packet, unsigned int context,
406
                           RAW_EXTENSION **res, int *al)
407 408
{
    PACKET extensions = *packet;
409 410 411
    size_t i = 0, idx;
    int found = 0;
    custom_ext_methods *exts = NULL;
412 413
    RAW_EXTENSION *raw_extensions = NULL;

414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
    /*
     * 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))
                                     * sizeof(RAW_EXTENSION));
    if (raw_extensions == NULL) {
        *al = SSL_AD_INTERNAL_ERROR;
        SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, ERR_R_MALLOC_FAILURE);
        return 0;
    }

434 435 436 437 438 439 440
    while (PACKET_remaining(&extensions) > 0) {
        unsigned int type;
        PACKET extension;

        if (!PACKET_get_net_2(&extensions, &type) ||
            !PACKET_get_length_prefixed_2(&extensions, &extension)) {
            SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, SSL_R_BAD_EXTENSION);
441
            *al = SSL_AD_DECODE_ERROR;
442 443
            goto err;
        }
444 445 446 447 448 449 450
        /*
         * Verify this extension is allowed. We only check duplicates for
         * extensions that we recognise.
         */
        if (!verify_extension(s, context, type, exts, &found, &idx)
                || (found == 1
                    && raw_extensions[idx].present == 1)) {
451
            SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, SSL_R_BAD_EXTENSION);
452
            *al = SSL_AD_ILLEGAL_PARAMETER;
453 454
            goto err;
        }
455 456 457 458
        if (found) {
            raw_extensions[idx].data = extension;
            raw_extensions[idx].present = 1;
            raw_extensions[idx].type = type;
459 460 461
        }
    }

462 463 464 465 466 467
    /*
     * Initialise all known extensions relevant to this context, whether we have
     * found them or not
     */
    for (i = 0; i < OSSL_NELEM(ext_defs); i++) {
        if(ext_defs[i].init_ext != NULL && (ext_defs[i].context & context) != 0
468
                && extension_is_relevant(s, ext_defs[i].context, context)
469
                && !ext_defs[i].init_ext(s, context)) {
470
            *al = SSL_AD_INTERNAL_ERROR;
471 472 473 474
            goto err;
        }
    }

475 476 477 478 479 480 481 482
    *res = raw_extensions;
    return 1;

 err:
    OPENSSL_free(raw_extensions);
    return 0;
}

483
/*
484 485 486 487 488 489
 * 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
 * given |context| and the parser has not already been run. 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.
490
 */
491 492
int tls_parse_extension(SSL *s, unsigned int idx, int context,
                        RAW_EXTENSION *exts, int *al)
493
{
494 495
    RAW_EXTENSION *currext = &exts[idx];
    int (*parser)(SSL *s, PACKET *pkt, int *al) = NULL;
496

497 498 499
    /* Skip if the extension is not present */
    if (!currext->present)
        return 1;
500

501 502 503 504 505
    if (s->tlsext_debug_cb)
        s->tlsext_debug_cb(s, !s->server, currext->type,
                           PACKET_data(&currext->data),
                           PACKET_remaining(&currext->data),
                           s->tlsext_debug_arg);
506

507 508 509
    /* Skip if we've already parsed this extension */
    if (currext->parsed)
        return 1;
510

511 512 513 514 515 516 517 518 519 520 521
    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;

        parser = s->server ? extdef->parse_client_ext : extdef->parse_server_ext;
M
Matt Caswell 已提交
522

523 524
        if (parser != NULL) {
            if (!parser(s, &currext->data, al))
525 526
                return 0;

527
            return 1;
528 529
        }

530 531 532 533
        /*
         * If the parser is NULL we fall through to the custom extension
         * processing
         */
534 535
    }

536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
    /*
     * This is a custom extension. We only allow this if it is a non
     * resumed session on the server side.
     *
     * 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;

553 554 555 556 557
    return 1;
}

/*
 * Parse all remaining extensions that have not yet been parsed. Also calls the
558 559 560
 * finalisation for all extensions at the end, whether we collected them or not.
 * Returns 1 for success or 0 for failure. On failure, |*al| is populated with a
 * suitable alert code.
561
 */
562
int tls_parse_all_extensions(SSL *s, int context, RAW_EXTENSION *exts, int *al)
563
{
564
    size_t loop, numexts = OSSL_NELEM(ext_defs);
565

566 567 568 569 570 571 572 573 574 575 576 577
    /* 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 */
    for (loop = 0; loop < numexts; loop++) {
        if (!tls_parse_extension(s, loop, context, exts, al))
            return 0;
    }
578

579 580 581 582 583 584
    /*
     * Finalise all known extensions relevant to this context, whether we have
     * found them or not
     */
    for (loop = 0; loop < OSSL_NELEM(ext_defs); loop++) {
        if(ext_defs[loop].finalise_ext != NULL
585 586 587
                && (ext_defs[loop].context & context) != 0
                && !ext_defs[loop].finalise_ext(s, context, exts[loop].present,
                                                al))
588 589 590
            return 0;
    }

591 592 593 594
    return 1;
}

/*
595 596 597
 * Construct all the extensions relevant to the current |context| and write
 * them to |pkt|. Returns 1 on success or 0 on failure. If a failure occurs then
 * |al| is populated with a suitable alert code.
598
 */
M
Matt Caswell 已提交
599 600 601 602 603
int tls_construct_extensions(SSL *s, WPACKET *pkt, unsigned int context,
                             int *al)
{
    size_t loop;
    int addcustom = 0;
604
    int min_version, max_version = 0, reason, tmpal;
M
Matt Caswell 已提交
605

606
    /*
607
     * Normally if something goes wrong during construction it's an internal
608 609
     * error. We can always override this later.
     */
610
    tmpal = SSL_AD_INTERNAL_ERROR;
611

M
Matt Caswell 已提交
612 613 614
    if (!WPACKET_start_sub_packet_u16(pkt)
               /*
                * If extensions are of zero length then we don't even add the
615
                * extensions length bytes to a ClientHello/ServerHello in SSLv3
M
Matt Caswell 已提交
616
                */
617 618
            || ((context & (EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO)) != 0
               && s->version == SSL3_VERSION
M
Matt Caswell 已提交
619 620 621
               && !WPACKET_set_flags(pkt,
                                     WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))) {
        SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, ERR_R_INTERNAL_ERROR);
622
        goto err;
M
Matt Caswell 已提交
623 624
    }

625 626 627 628
    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);
629
            goto err;
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
        }
    }

    /* 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.
         * 
         * 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;
    }

649
    if (addcustom && !custom_ext_add(s, s->server, pkt, &tmpal)) {
650
        SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, ERR_R_INTERNAL_ERROR);
651
        goto err;
652 653
    }

M
Matt Caswell 已提交
654
    for (loop = 0; loop < OSSL_NELEM(ext_defs); loop++) {
M
Matt Caswell 已提交
655 656
        int (*construct)(SSL *s, WPACKET *pkt, int *al);

M
Matt Caswell 已提交
657 658 659 660
        /* Skip if not relevant for our context */
        if ((ext_defs[loop].context & context) == 0)
            continue;

661 662
        construct = s->server ? ext_defs[loop].construct_server_ext
                              : ext_defs[loop].construct_client_ext;
M
Matt Caswell 已提交
663 664 665

        /* Check if this extension is defined for our protocol. If not, skip */
        if ((SSL_IS_DTLS(s)
M
Matt Caswell 已提交
666 667
                    && (ext_defs[loop].context & EXT_TLS_IMPLEMENTATION_ONLY)
                       != 0)
M
Matt Caswell 已提交
668
                || (s->version == SSL3_VERSION
M
Matt Caswell 已提交
669
                        && (ext_defs[loop].context & EXT_SSL3_ALLOWED) == 0)
M
Matt Caswell 已提交
670
                || (SSL_IS_TLS13(s)
M
Matt Caswell 已提交
671 672
                    && (ext_defs[loop].context & EXT_TLS1_2_AND_BELOW_ONLY)
                       != 0)
M
Matt Caswell 已提交
673
                || (!SSL_IS_TLS13(s)
M
Matt Caswell 已提交
674 675
                    && (ext_defs[loop].context & EXT_TLS1_3_ONLY) != 0
                    && (context & EXT_CLIENT_HELLO) == 0)
676 677 678
                || ((ext_defs[loop].context & EXT_TLS1_3_ONLY) != 0
                    && (context & EXT_CLIENT_HELLO) != 0
                    && (SSL_IS_DTLS(s) || max_version < TLS1_3_VERSION))
M
Matt Caswell 已提交
679 680 681
                || construct == NULL)
            continue;

682 683
        if (!construct(s, pkt, &tmpal))
            goto err;
M
Matt Caswell 已提交
684 685 686 687
    }

    if (!WPACKET_close(pkt)) {
        SSLerr(SSL_F_TLS_CONSTRUCT_EXTENSIONS, ERR_R_INTERNAL_ERROR);
688
        goto err;
M
Matt Caswell 已提交
689 690 691
    }

    return 1;
692 693 694 695

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

698 699 700 701 702 703 704 705
/*
 * 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.
 */

706 707 708
static int tls_ext_final_renegotiate(SSL *s, unsigned int context, int sent,
                                     int *al)
{
709 710 711 712 713 714 715 716 717 718 719 720 721 722
    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;
            SSLerr(SSL_F_TLS_EXT_FINAL_RENEGOTIATE,
                   SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
            return 0;
        }

723
        return 1;
724
    }
725 726 727 728 729 730 731 732 733 734 735

    /* Need RI if renegotiating */
    if (s->renegotiate
            && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)
            && !sent) {
        *al = SSL_AD_HANDSHAKE_FAILURE;
        SSLerr(SSL_F_TLS_EXT_FINAL_RENEGOTIATE,
               SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
        return 0;
    }

736

737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779
    return 1;
}

static int tls_ext_init_server_name(SSL *s, unsigned int context)
{
    if (s->server)
        s->servername_done = 0;

    return 1;
}

static int tls_ext_final_server_name(SSL *s, unsigned int context, int sent,
                                     int *al)
{
    int ret = SSL_TLSEXT_ERR_NOACK;
    int altmp = SSL_AD_UNRECOGNIZED_NAME;

    if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
        ret = s->ctx->tlsext_servername_callback(s, &altmp,
                                                 s->ctx->tlsext_servername_arg);
    else if (s->initial_ctx != NULL
             && s->initial_ctx->tlsext_servername_callback != 0)
        ret = s->initial_ctx->tlsext_servername_callback(s, &altmp,
                                       s->initial_ctx->tlsext_servername_arg);

    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;
    }
}

780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
#ifndef OPENSSL_NO_EC
static int tls_ext_final_ec_pt_formats(SSL *s, unsigned int context, int sent,
                                       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.
     */
    if ((s->tlsext_ecpointformatlist != NULL)
        && (s->tlsext_ecpointformatlist_length > 0)
        && (s->session->tlsext_ecpointformatlist != NULL)
        && (s->session->tlsext_ecpointformatlist_length > 0)
        && ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))) {
        /* we are using an ECC cipher */
        size_t i;
        unsigned char *list;
        int found_uncompressed = 0;
        list = s->session->tlsext_ecpointformatlist;
        for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++) {
            if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed) {
                found_uncompressed = 1;
                break;
            }
        }
        if (!found_uncompressed) {
            SSLerr(SSL_F_TLS_EXT_FINAL_EC_PT_FORMATS,
                   SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
            return 0;
        }
    }

    return 1;
}
#endif

static int tls_ext_init_session_ticket(SSL *s, unsigned int context)
{
    if (!s->server)
        s->tlsext_ticket_expected = 0;

    return 1;
}

832 833 834 835 836 837 838 839
static int tls_ext_init_status_request(SSL *s, unsigned int context)
{
    if (s->server)
        s->tlsext_status_type = -1;

    return 1;
}

840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
static int tls_ext_final_status_request(SSL *s, unsigned int context, int sent,
                                        int *al)
{
    if (s->server)
        return 1;

    /*
     * Ensure we get sensible values passed to tlsext_status_cb in the event
     * that we don't receive a status message
     */
    OPENSSL_free(s->tlsext_ocsp_resp);
    s->tlsext_ocsp_resp = NULL;
    s->tlsext_ocsp_resplen = 0;

    return 1;
}

857 858 859
#ifndef OPENSSL_NO_NEXTPROTONEG
static int tls_ext_init_npn(SSL *s, unsigned int context)
{
860
    s->s3->next_proto_neg_seen = 0;
861 862 863 864 865 866 867

    return 1;
}
#endif

static int tls_ext_init_alpn(SSL *s, unsigned int context)
{
868 869
    OPENSSL_free(s->s3->alpn_selected);
    s->s3->alpn_selected = NULL;
870 871 872 873 874 875 876 877 878
    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;
}

879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913
static int tls_ext_final_alpn(SSL *s, unsigned int context, int sent, int *al)
{
    const unsigned char *selected = NULL;
    unsigned char selected_len = 0;

    if (!s->server)
        return 1;

    if (s->ctx->alpn_select_cb != NULL && s->s3->alpn_proposed != NULL) {
        int r = s->ctx->alpn_select_cb(s, &selected, &selected_len,
                                       s->s3->alpn_proposed,
                                       (unsigned int)s->s3->alpn_proposed_len,
                                       s->ctx->alpn_select_cb_arg);

        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. */
            s->s3->next_proto_neg_seen = 0;
#endif
        } else {
            *al = SSL_AD_NO_APPLICATION_PROTOCOL;
            return 0;
        }
    }

    return 1;
}

914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934
static int tls_ext_init_sig_algs(SSL *s, unsigned int context)
{
    /* 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
static int tls_ext_init_srp(SSL *s, unsigned int context)
{
    OPENSSL_free(s->srp_ctx.login);
    s->srp_ctx.login = NULL;

    return 1;
}
#endif

static int tls_ext_init_etm(SSL *s, unsigned int context)
{
935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
    s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;

    return 1;
}

static int tls_ext_init_ems(SSL *s, unsigned int context)
{
    if (!s->server)
        s->s3->flags &= ~TLS1_FLAGS_RECEIVED_EXTMS;

    return 1;
}

static int tls_ext_final_ems(SSL *s, unsigned int context, int sent, int *al)
{
    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;
            SSLerr(SSL_F_TLS_EXT_FINAL_EMS, SSL_R_INCONSISTENT_EXTMS);
            return 0;
        }
    }
962 963 964 965 966 967 968 969 970 971 972 973 974

    return 1;
}

#ifndef OPENSSL_NO_SRTP
static int tls_ext_init_srtp(SSL *s, unsigned int context)
{
    if (s->server)
        s->srtp_profile = NULL;

    return 1;
}
#endif