d1_lib.c 29.2 KB
Newer Older
1
/*
R
Rich Salz 已提交
2
 * Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved.
B
Ben Laurie 已提交
3
 *
R
Rich Salz 已提交
4 5 6 7
 * 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
B
Ben Laurie 已提交
8 9 10
 */

#include <stdio.h>
11
#define USE_SOCKETS
B
Ben Laurie 已提交
12
#include <openssl/objects.h>
M
Matt Caswell 已提交
13
#include <openssl/rand.h>
B
Ben Laurie 已提交
14 15
#include "ssl_locl.h"

16
#if defined(OPENSSL_SYS_VXWORKS)
17 18 19
# include <sys/times.h>
#elif !defined(OPENSSL_SYS_WIN32)
# include <sys/time.h>
D
Dr. Stephen Henson 已提交
20 21 22
#endif

static void get_current_time(struct timeval *t);
D
Dr. Stephen Henson 已提交
23
static int dtls1_handshake_write(SSL *s);
M
Matt Caswell 已提交
24
static size_t dtls1_link_min_mtu(void);
B
Ben Laurie 已提交
25

M
Matt Caswell 已提交
26
/* XDTLS:  figure out the right values */
M
Matt Caswell 已提交
27
static const size_t g_probable_mtu[] = { 1500, 512, 256 };
M
Matt Caswell 已提交
28

29 30 31 32 33 34 35 36 37 38 39 40
const SSL3_ENC_METHOD DTLSv1_enc_data = {
    tls1_enc,
    tls1_mac,
    tls1_setup_key_block,
    tls1_generate_master_secret,
    tls1_change_cipher_state,
    tls1_final_finish_mac,
    TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
    TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
    tls1_alert_code,
    tls1_export_keying_material,
    SSL_ENC_FLAG_DTLS | SSL_ENC_FLAG_EXPLICIT_IV,
M
Matt Caswell 已提交
41
    dtls1_set_handshake_header,
42
    dtls1_close_construct_packet,
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
    dtls1_handshake_write
};

const SSL3_ENC_METHOD DTLSv1_2_enc_data = {
    tls1_enc,
    tls1_mac,
    tls1_setup_key_block,
    tls1_generate_master_secret,
    tls1_change_cipher_state,
    tls1_final_finish_mac,
    TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
    TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
    tls1_alert_code,
    tls1_export_keying_material,
    SSL_ENC_FLAG_DTLS | SSL_ENC_FLAG_EXPLICIT_IV | SSL_ENC_FLAG_SIGALGS
        | SSL_ENC_FLAG_SHA256_PRF | SSL_ENC_FLAG_TLS1_2_CIPHERS,
M
Matt Caswell 已提交
59
    dtls1_set_handshake_header,
60
    dtls1_close_construct_packet,
61 62
    dtls1_handshake_write
};
63

64
long dtls1_default_timeout(void)
65 66 67 68 69 70 71
{
    /*
     * 2 hours, the 24 hours mentioned in the DTLSv1 spec is way too long for
     * http, the cache would over fill
     */
    return (60 * 60 * 2);
}
B
Ben Laurie 已提交
72 73

int dtls1_new(SSL *s)
74 75 76
{
    DTLS1_STATE *d1;

V
Viktor Dukhovni 已提交
77
    if (!DTLS_RECORD_LAYER_new(&s->rlayer)) {
M
Matt Caswell 已提交
78 79
        return 0;
    }
F
FdaSilvaYY 已提交
80

81 82
    if (!ssl3_new(s))
        return (0);
R
Rich Salz 已提交
83
    if ((d1 = OPENSSL_zalloc(sizeof(*d1))) == NULL) {
84 85 86 87 88 89 90 91 92 93 94 95 96 97
        ssl3_free(s);
        return (0);
    }

    d1->buffered_messages = pqueue_new();
    d1->sent_messages = pqueue_new();

    if (s->server) {
        d1->cookie_len = sizeof(s->d1->cookie);
    }

    d1->link_mtu = 0;
    d1->mtu = 0;

98
    if (d1->buffered_messages == NULL || d1->sent_messages == NULL) {
R
Rich Salz 已提交
99 100
        pqueue_free(d1->buffered_messages);
        pqueue_free(d1->sent_messages);
101 102 103 104 105 106 107 108 109
        OPENSSL_free(d1);
        ssl3_free(s);
        return (0);
    }

    s->d1 = d1;
    s->method->ssl_clear(s);
    return (1);
}
B
Ben Laurie 已提交
110

D
Dr. Stephen Henson 已提交
111
static void dtls1_clear_queues(SSL *s)
112 113 114 115 116 117
{
    dtls1_clear_received_buffer(s);
    dtls1_clear_sent_buffer(s);
}

void dtls1_clear_received_buffer(SSL *s)
118
{
B
Ben Laurie 已提交
119 120
    pitem *item = NULL;
    hm_fragment *frag = NULL;
121 122

    while ((item = pqueue_pop(s->d1->buffered_messages)) != NULL) {
B
Ben Laurie 已提交
123
        frag = (hm_fragment *)item->data;
124
        dtls1_hm_fragment_free(frag);
B
Ben Laurie 已提交
125
        pitem_free(item);
126
    }
127 128 129 130 131 132
}

void dtls1_clear_sent_buffer(SSL *s)
{
    pitem *item = NULL;
    hm_fragment *frag = NULL;
B
Ben Laurie 已提交
133

134
    while ((item = pqueue_pop(s->d1->sent_messages)) != NULL) {
B
Ben Laurie 已提交
135
        frag = (hm_fragment *)item->data;
136
        dtls1_hm_fragment_free(frag);
B
Ben Laurie 已提交
137
        pitem_free(item);
138 139
    }
}
D
Dr. Stephen Henson 已提交
140

141

D
Dr. Stephen Henson 已提交
142
void dtls1_free(SSL *s)
143
{
144 145
    DTLS_RECORD_LAYER_free(&s->rlayer);

146
    ssl3_free(s);
D
Dr. Stephen Henson 已提交
147

148
    dtls1_clear_queues(s);
D
Dr. Stephen Henson 已提交
149 150

    pqueue_free(s->d1->buffered_messages);
151
    pqueue_free(s->d1->sent_messages);
D
Dr. Stephen Henson 已提交
152

153 154 155
    OPENSSL_free(s->d1);
    s->d1 = NULL;
}
B
Ben Laurie 已提交
156 157

void dtls1_clear(SSL *s)
158
{
R
Rich Salz 已提交
159 160
    pqueue *buffered_messages;
    pqueue *sent_messages;
M
Matt Caswell 已提交
161 162
    size_t mtu;
    size_t link_mtu;
163

164 165
    DTLS_RECORD_LAYER_clear(&s->rlayer);

166 167 168 169 170 171 172 173
    if (s->d1) {
        buffered_messages = s->d1->buffered_messages;
        sent_messages = s->d1->sent_messages;
        mtu = s->d1->mtu;
        link_mtu = s->d1->link_mtu;

        dtls1_clear_queues(s);

174
        memset(s->d1, 0, sizeof(*s->d1));
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

        if (s->server) {
            s->d1->cookie_len = sizeof(s->d1->cookie);
        }

        if (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU) {
            s->d1->mtu = mtu;
            s->d1->link_mtu = link_mtu;
        }

        s->d1->buffered_messages = buffered_messages;
        s->d1->sent_messages = sent_messages;
    }

    ssl3_clear(s);
190 191

    if (s->method->version == DTLS_ANY_VERSION)
192
        s->version = DTLS_MAX_VERSION;
193 194 195 196
#ifndef OPENSSL_NO_DTLS1_METHOD
    else if (s->options & SSL_OP_CISCO_ANYCONNECT)
        s->client_version = s->version = DTLS1_BAD_VER;
#endif
197 198 199
    else
        s->version = s->method->version;
}
A
Andy Polyakov 已提交
200

D
Dr. Stephen Henson 已提交
201
long dtls1_ctrl(SSL *s, int cmd, long larg, void *parg)
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
{
    int ret = 0;

    switch (cmd) {
    case DTLS_CTRL_GET_TIMEOUT:
        if (dtls1_get_timeout(s, (struct timeval *)parg) != NULL) {
            ret = 1;
        }
        break;
    case DTLS_CTRL_HANDLE_TIMEOUT:
        ret = dtls1_handle_timeout(s);
        break;
    case DTLS_CTRL_SET_LINK_MTU:
        if (larg < (long)dtls1_link_min_mtu())
            return 0;
        s->d1->link_mtu = larg;
        return 1;
    case DTLS_CTRL_GET_LINK_MIN_MTU:
        return (long)dtls1_link_min_mtu();
    case SSL_CTRL_SET_MTU:
        /*
         *  We may not have a BIO set yet so can't call dtls1_min_mtu()
         *  We'll have to make do with dtls1_link_min_mtu() and max overhead
         */
        if (larg < (long)dtls1_link_min_mtu() - DTLS1_MAX_MTU_OVERHEAD)
            return 0;
        s->d1->mtu = larg;
        return larg;
    default:
        ret = ssl3_ctrl(s, cmd, larg, parg);
        break;
    }
    return (ret);
}
D
Dr. Stephen Henson 已提交
236

D
Dr. Stephen Henson 已提交
237
void dtls1_start_timer(SSL *s)
238
{
D
Dr. Stephen Henson 已提交
239
#ifndef OPENSSL_NO_SCTP
240 241
    /* Disable timer for SCTP */
    if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
242
        memset(&s->d1->next_timeout, 0, sizeof(s->d1->next_timeout));
243 244
        return;
    }
D
Dr. Stephen Henson 已提交
245 246
#endif

247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
    /* If timer is not set, initialize duration with 1 second */
    if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0) {
        s->d1->timeout_duration = 1;
    }

    /* Set timeout to current time */
    get_current_time(&(s->d1->next_timeout));

    /* Add duration to current time */
    s->d1->next_timeout.tv_sec += s->d1->timeout_duration;
    BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
             &(s->d1->next_timeout));
}

struct timeval *dtls1_get_timeout(SSL *s, struct timeval *timeleft)
{
    struct timeval timenow;

    /* If no timeout is set, just return NULL */
    if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0) {
        return NULL;
    }

    /* Get current time */
    get_current_time(&timenow);

    /* If timer already expired, set remaining time to 0 */
    if (s->d1->next_timeout.tv_sec < timenow.tv_sec ||
        (s->d1->next_timeout.tv_sec == timenow.tv_sec &&
         s->d1->next_timeout.tv_usec <= timenow.tv_usec)) {
277
        memset(timeleft, 0, sizeof(*timeleft));
278 279 280 281 282 283 284 285 286 287 288 289 290 291
        return timeleft;
    }

    /* Calculate time left until timer expires */
    memcpy(timeleft, &(s->d1->next_timeout), sizeof(struct timeval));
    timeleft->tv_sec -= timenow.tv_sec;
    timeleft->tv_usec -= timenow.tv_usec;
    if (timeleft->tv_usec < 0) {
        timeleft->tv_sec--;
        timeleft->tv_usec += 1000000;
    }

    /*
     * If remaining time is less than 15 ms, set it to 0 to prevent issues
F
FdaSilvaYY 已提交
292
     * because of small divergences with socket timeouts.
293 294
     */
    if (timeleft->tv_sec == 0 && timeleft->tv_usec < 15000) {
295
        memset(timeleft, 0, sizeof(*timeleft));
296 297 298 299
    }

    return timeleft;
}
D
Dr. Stephen Henson 已提交
300 301

int dtls1_is_timer_expired(SSL *s)
302 303
{
    struct timeval timeleft;
D
Dr. Stephen Henson 已提交
304

305 306 307 308
    /* Get time left until timeout, return false if no timer running */
    if (dtls1_get_timeout(s, &timeleft) == NULL) {
        return 0;
    }
D
Dr. Stephen Henson 已提交
309

310 311 312 313
    /* Return false if timer is not expired yet */
    if (timeleft.tv_sec > 0 || timeleft.tv_usec > 0) {
        return 0;
    }
D
Dr. Stephen Henson 已提交
314

315 316 317
    /* Timer expired, so return true */
    return 1;
}
D
Dr. Stephen Henson 已提交
318 319

void dtls1_double_timeout(SSL *s)
320 321 322 323 324 325
{
    s->d1->timeout_duration *= 2;
    if (s->d1->timeout_duration > 60)
        s->d1->timeout_duration = 60;
    dtls1_start_timer(s);
}
D
Dr. Stephen Henson 已提交
326 327

void dtls1_stop_timer(SSL *s)
328 329
{
    /* Reset everything */
330 331
    memset(&s->d1->timeout, 0, sizeof(s->d1->timeout));
    memset(&s->d1->next_timeout, 0, sizeof(s->d1->next_timeout));
332 333 334 335
    s->d1->timeout_duration = 1;
    BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
             &(s->d1->next_timeout));
    /* Clear retransmission buffer */
336
    dtls1_clear_sent_buffer(s);
337
}
D
Dr. Stephen Henson 已提交
338

D
Dr. Stephen Henson 已提交
339
int dtls1_check_timeout_num(SSL *s)
340
{
M
Matt Caswell 已提交
341
    size_t mtu;
342 343 344 345 346 347 348

    s->d1->timeout.num_alerts++;

    /* Reduce MTU after 2 unsuccessful retransmissions */
    if (s->d1->timeout.num_alerts > 2
        && !(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) {
        mtu =
E
Emilia Kasper 已提交
349
            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL);
350 351 352 353 354 355 356 357 358 359 360 361
        if (mtu < s->d1->mtu)
            s->d1->mtu = mtu;
    }

    if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT) {
        /* fail the connection, enough alerts have been sent */
        SSLerr(SSL_F_DTLS1_CHECK_TIMEOUT_NUM, SSL_R_READ_TIMEOUT_EXPIRED);
        return -1;
    }

    return 0;
}
D
Dr. Stephen Henson 已提交
362 363

int dtls1_handle_timeout(SSL *s)
364 365 366 367 368
{
    /* if no timer is expired, don't do anything */
    if (!dtls1_is_timer_expired(s)) {
        return 0;
    }
D
Dr. Stephen Henson 已提交
369

370
    dtls1_double_timeout(s);
D
Dr. Stephen Henson 已提交
371

372 373
    if (dtls1_check_timeout_num(s) < 0)
        return -1;
D
Dr. Stephen Henson 已提交
374

375 376 377 378
    s->d1->timeout.read_timeouts++;
    if (s->d1->timeout.read_timeouts > DTLS1_TMO_READ_COUNT) {
        s->d1->timeout.read_timeouts = 1;
    }
D
Dr. Stephen Henson 已提交
379

380 381 382
    dtls1_start_timer(s);
    return dtls1_retransmit_buffered_messages(s);
}
D
Dr. Stephen Henson 已提交
383

D
Dr. Stephen Henson 已提交
384 385
static void get_current_time(struct timeval *t)
{
A
Andy Polyakov 已提交
386
#if defined(_WIN32)
387 388 389 390 391 392 393 394
    SYSTEMTIME st;
    union {
        unsigned __int64 ul;
        FILETIME ft;
    } now;

    GetSystemTime(&st);
    SystemTimeToFileTime(&st, &now.ft);
E
Emilia Kasper 已提交
395
    /* re-bias to 1/1/1970 */
396 397 398
# ifdef  __MINGW32__
    now.ul -= 116444736000000000ULL;
# else
E
Emilia Kasper 已提交
399 400 401
    /* *INDENT-OFF* */
    now.ul -= 116444736000000000UI64;
    /* *INDENT-ON* */
402 403 404
# endif
    t->tv_sec = (long)(now.ul / 10000000);
    t->tv_usec = ((int)(now.ul % 10000000)) / 10;
D
Dr. Stephen Henson 已提交
405
#else
406
    gettimeofday(t, NULL);
D
Dr. Stephen Henson 已提交
407 408
#endif
}
D
Dr. Stephen Henson 已提交
409

M
Matt Caswell 已提交
410 411 412
#define LISTEN_SUCCESS              2
#define LISTEN_SEND_VERIFY_REQUEST  1

M
Matt Caswell 已提交
413
#ifndef OPENSSL_NO_SOCK
414
int DTLSv1_listen(SSL *s, BIO_ADDR *client)
415
{
M
Matt Caswell 已提交
416 417 418
    int next, n, ret = 0, clearpkt = 0;
    unsigned char cookie[DTLS1_COOKIE_LENGTH];
    unsigned char seq[SEQ_NUM_SIZE];
E
Emilia Kasper 已提交
419
    const unsigned char *data;
420
    unsigned char *buf;
M
Matt Caswell 已提交
421
    size_t fragoff, fraglen, msglen;
M
Matt Caswell 已提交
422 423 424
    unsigned int rectype, versmajor, msgseq, msgtype, clientvers, cookielen;
    BIO *rbio, *wbio;
    BUF_MEM *bufm;
425
    BIO_ADDR *tmpclient = NULL;
M
Matt Caswell 已提交
426
    PACKET pkt, msgpkt, msgpayload, session, cookiepkt;
427

428 429 430 431 432
    if (s->handshake_func == NULL) {
        /* Not properly initialized yet */
        SSL_set_accept_state(s);
    }

M
Matt Caswell 已提交
433
    /* Ensure there is no state left over from a previous invocation */
V
Viktor Dukhovni 已提交
434
    if (!SSL_clear(s))
M
Matt Caswell 已提交
435
        return -1;
M
Matt Caswell 已提交
436

M
Matt Caswell 已提交
437 438 439 440 441
    ERR_clear_error();

    rbio = SSL_get_rbio(s);
    wbio = SSL_get_wbio(s);

442
    if (!rbio || !wbio) {
443
        SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_BIO_NOT_SET);
M
Matt Caswell 已提交
444 445 446 447 448 449
        return -1;
    }

    /*
     * We only peek at incoming ClientHello's until we're sure we are going to
     * to respond with a HelloVerifyRequest. If its a ClientHello with a valid
450
     * cookie then we leave it in the BIO for accept to handle.
M
Matt Caswell 已提交
451 452 453 454 455 456 457 458 459 460 461
     */
    BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_PEEK_MODE, 1, NULL);

    /*
     * Note: This check deliberately excludes DTLS1_BAD_VER because that version
     * requires the MAC to be calculated *including* the first ClientHello
     * (without the cookie). Since DTLSv1_listen is stateless that cannot be
     * supported. DTLS1_BAD_VER must use cookies in a stateful manner (e.g. via
     * SSL_accept)
     */
    if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00)) {
462
        SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_UNSUPPORTED_SSL_VERSION);
M
Matt Caswell 已提交
463 464 465 466 467
        return -1;
    }

    if (s->init_buf == NULL) {
        if ((bufm = BUF_MEM_new()) == NULL) {
468
            SSLerr(SSL_F_DTLSV1_LISTEN, ERR_R_MALLOC_FAILURE);
M
Matt Caswell 已提交
469 470 471 472 473
            return -1;
        }

        if (!BUF_MEM_grow(bufm, SSL3_RT_MAX_PLAIN_LENGTH)) {
            BUF_MEM_free(bufm);
474
            SSLerr(SSL_F_DTLSV1_LISTEN, ERR_R_MALLOC_FAILURE);
M
Matt Caswell 已提交
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495
            return -1;
        }
        s->init_buf = bufm;
    }
    buf = (unsigned char *)s->init_buf->data;

    do {
        /* Get a packet */

        clear_sys_error();
        /*
         * Technically a ClientHello could be SSL3_RT_MAX_PLAIN_LENGTH
         * + DTLS1_RT_HEADER_LENGTH bytes long. Normally init_buf does not store
         * the record header as well, but we do here. We've set up init_buf to
         * be the standard size for simplicity. In practice we shouldn't ever
         * receive a ClientHello as long as this. If we do it will get dropped
         * in the record length check below.
         */
        n = BIO_read(rbio, buf, SSL3_RT_MAX_PLAIN_LENGTH);

        if (n <= 0) {
496
            if (BIO_should_retry(rbio)) {
M
Matt Caswell 已提交
497 498 499 500 501 502 503 504 505 506
                /* Non-blocking IO */
                goto end;
            }
            return -1;
        }

        /* If we hit any problems we need to clear this packet from the BIO */
        clearpkt = 1;

        if (!PACKET_buf_init(&pkt, buf, n)) {
507
            SSLerr(SSL_F_DTLSV1_LISTEN, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
508 509 510 511 512 513 514 515 516 517 518 519 520 521
            return -1;
        }

        /*
         * Parse the received record. If there are any problems with it we just
         * dump it - with no alert. RFC6347 says this "Unlike TLS, DTLS is
         * resilient in the face of invalid records (e.g., invalid formatting,
         * length, MAC, etc.).  In general, invalid records SHOULD be silently
         * discarded, thus preserving the association; however, an error MAY be
         * logged for diagnostic purposes."
         */

        /* this packet contained a partial record, dump it */
        if (n < DTLS1_RT_HEADER_LENGTH) {
522
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_RECORD_TOO_SMALL);
M
Matt Caswell 已提交
523 524 525 526 527 528 529 530 531 532
            goto end;
        }

        if (s->msg_callback)
            s->msg_callback(0, 0, SSL3_RT_HEADER, buf,
                            DTLS1_RT_HEADER_LENGTH, s, s->msg_callback_arg);

        /* Get the record header */
        if (!PACKET_get_1(&pkt, &rectype)
            || !PACKET_get_1(&pkt, &versmajor)) {
533
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_LENGTH_MISMATCH);
M
Matt Caswell 已提交
534 535 536
            goto end;
        }

E
Emilia Kasper 已提交
537
        if (rectype != SSL3_RT_HANDSHAKE) {
538
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_UNEXPECTED_MESSAGE);
M
Matt Caswell 已提交
539 540 541 542 543 544 545 546
            goto end;
        }

        /*
         * Check record version number. We only check that the major version is
         * the same.
         */
        if (versmajor != DTLS1_VERSION_MAJOR) {
547
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
M
Matt Caswell 已提交
548 549 550 551 552 553
            goto end;
        }

        if (!PACKET_forward(&pkt, 1)
            /* Save the sequence number: 64 bits, with top 2 bytes = epoch */
            || !PACKET_copy_bytes(&pkt, seq, SEQ_NUM_SIZE)
554
            || !PACKET_get_length_prefixed_2(&pkt, &msgpkt)) {
555
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_LENGTH_MISMATCH);
M
Matt Caswell 已提交
556 557
            goto end;
        }
558 559 560 561
        /*
         * We allow data remaining at the end of the packet because there could
         * be a second record (but we ignore it)
         */
M
Matt Caswell 已提交
562 563 564

        /* This is an initial ClientHello so the epoch has to be 0 */
        if (seq[0] != 0 || seq[1] != 0) {
565
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_UNEXPECTED_MESSAGE);
M
Matt Caswell 已提交
566 567 568 569 570 571 572 573
            goto end;
        }

        /* Get a pointer to the raw message for the later callback */
        data = PACKET_data(&msgpkt);

        /* Finished processing the record header, now process the message */
        if (!PACKET_get_1(&msgpkt, &msgtype)
574
            || !PACKET_get_net_3_len(&msgpkt, &msglen)
M
Matt Caswell 已提交
575
            || !PACKET_get_net_2(&msgpkt, &msgseq)
576 577
            || !PACKET_get_net_3_len(&msgpkt, &fragoff)
            || !PACKET_get_net_3_len(&msgpkt, &fraglen)
578
            || !PACKET_get_sub_packet(&msgpkt, &msgpayload, fraglen)
M
Matt Caswell 已提交
579
            || PACKET_remaining(&msgpkt) != 0) {
580
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_LENGTH_MISMATCH);
M
Matt Caswell 已提交
581 582 583 584
            goto end;
        }

        if (msgtype != SSL3_MT_CLIENT_HELLO) {
585
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_UNEXPECTED_MESSAGE);
M
Matt Caswell 已提交
586 587 588 589
            goto end;
        }

        /* Message sequence number can only be 0 or 1 */
590
        if (msgseq > 2) {
591
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_INVALID_SEQUENCE_NUMBER);
M
Matt Caswell 已提交
592 593 594
            goto end;
        }

595 596 597 598 599 600 601 602 603
        /*
         * We don't support fragment reassembly for ClientHellos whilst
         * listening because that would require server side state (which is
         * against the whole point of the ClientHello/HelloVerifyRequest
         * mechanism). Instead we only look at the first ClientHello fragment
         * and require that the cookie must be contained within it.
         */
        if (fragoff != 0 || fraglen > msglen) {
            /* Non initial ClientHello fragment (or bad fragment) */
604
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_FRAGMENTED_CLIENT_HELLO);
M
Matt Caswell 已提交
605 606 607 608 609
            goto end;
        }

        if (s->msg_callback)
            s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, data,
610
                            fraglen + DTLS1_HM_HEADER_LENGTH, s,
M
Matt Caswell 已提交
611 612 613
                            s->msg_callback_arg);

        if (!PACKET_get_net_2(&msgpayload, &clientvers)) {
614
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_LENGTH_MISMATCH);
M
Matt Caswell 已提交
615 616 617 618 619 620
            goto end;
        }

        /*
         * Verify client version is supported
         */
621 622
        if (DTLS_VERSION_LT(clientvers, (unsigned int)s->method->version) &&
            s->method->version != DTLS_ANY_VERSION) {
623
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_WRONG_VERSION_NUMBER);
M
Matt Caswell 已提交
624 625 626 627 628 629
            goto end;
        }

        if (!PACKET_forward(&msgpayload, SSL3_RANDOM_SIZE)
            || !PACKET_get_length_prefixed_1(&msgpayload, &session)
            || !PACKET_get_length_prefixed_1(&msgpayload, &cookiepkt)) {
630 631 632 633
            /*
             * Could be malformed or the cookie does not fit within the initial
             * ClientHello fragment. Either way we can't handle it.
             */
634
            SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_LENGTH_MISMATCH);
M
Matt Caswell 已提交
635 636 637 638 639 640 641 642 643 644 645 646 647 648
            goto end;
        }

        /*
         * Check if we have a cookie or not. If not we need to send a
         * HelloVerifyRequest.
         */
        if (PACKET_remaining(&cookiepkt) == 0) {
            next = LISTEN_SEND_VERIFY_REQUEST;
        } else {
            /*
             * We have a cookie, so lets check it.
             */
            if (s->ctx->app_verify_cookie_cb == NULL) {
649
                SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_NO_VERIFY_COOKIE_CALLBACK);
M
Matt Caswell 已提交
650 651 652
                /* This is fatal */
                return -1;
            }
E
Emilia Kasper 已提交
653
            if (s->ctx->app_verify_cookie_cb(s, PACKET_data(&cookiepkt),
M
Matt Caswell 已提交
654
                    (unsigned int)PACKET_remaining(&cookiepkt)) == 0) {
M
Matt Caswell 已提交
655 656 657 658 659 660 661 662 663 664 665 666
                /*
                 * We treat invalid cookies in the same was as no cookie as
                 * per RFC6347
                 */
                next = LISTEN_SEND_VERIFY_REQUEST;
            } else {
                /* Cookie verification succeeded */
                next = LISTEN_SUCCESS;
            }
        }

        if (next == LISTEN_SEND_VERIFY_REQUEST) {
667 668 669 670
            WPACKET wpkt;
            unsigned int version;
            size_t wreclen;

M
Matt Caswell 已提交
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686
            /*
             * There was no cookie in the ClientHello so we need to send a
             * HelloVerifyRequest. If this fails we do not worry about trying
             * to resend, we just drop it.
             */

            /*
             * Dump the read packet, we don't need it any more. Ignore return
             * value
             */
            BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_PEEK_MODE, 0, NULL);
            BIO_read(rbio, buf, SSL3_RT_MAX_PLAIN_LENGTH);
            BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_PEEK_MODE, 1, NULL);

            /* Generate the cookie */
            if (s->ctx->app_gen_cookie_cb == NULL ||
M
Matt Caswell 已提交
687 688
                s->ctx->app_gen_cookie_cb(s, cookie, &cookielen) == 0 ||
                cookielen > 255) {
689
                SSLerr(SSL_F_DTLSV1_LISTEN, SSL_R_COOKIE_GEN_CALLBACK_FAILURE);
M
Matt Caswell 已提交
690 691 692 693 694 695 696 697 698
                /* This is fatal */
                return -1;
            }

            /*
             * Special case: for hello verify request, client version 1.0 and we
             * haven't decided which version to use yet send back using version
             * 1.0 header: otherwise some clients will ignore it.
             */
699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
            version = (s->method->version == DTLS_ANY_VERSION) ? DTLS1_VERSION
                                                               : s->version;

            /* Construct the record and message headers */
            if (!WPACKET_init(&wpkt, s->init_buf)
                    || !WPACKET_put_bytes_u8(&wpkt, SSL3_RT_HANDSHAKE)
                    || !WPACKET_put_bytes_u16(&wpkt, version)
                       /*
                        * Record sequence number is always the same as in the
                        * received ClientHello
                        */
                    || !WPACKET_memcpy(&wpkt, seq, SEQ_NUM_SIZE)
                       /* End of record, start sub packet for message */
                    || !WPACKET_start_sub_packet_u16(&wpkt)
                       /* Message type */
                    || !WPACKET_put_bytes_u8(&wpkt,
                                             DTLS1_MT_HELLO_VERIFY_REQUEST)
                       /*
                        * Message length - doesn't follow normal TLS convention:
                        * the length isn't the last thing in the message header.
                        * We'll need to fill this in later when we know the
                        * length. Set it to zero for now
                        */
                    || !WPACKET_put_bytes_u24(&wpkt, 0)
                       /*
                        * Message sequence number is always 0 for a
                        * HelloVerifyRequest
                        */
                    || !WPACKET_put_bytes_u16(&wpkt, 0)
                       /*
                        * We never fragment a HelloVerifyRequest, so fragment
                        * offset is 0
                        */
                    || !WPACKET_put_bytes_u24(&wpkt, 0)
                       /*
                        * Fragment length is the same as message length, but
                        * this *is* the last thing in the message header so we
                        * can just start a sub-packet. No need to come back
                        * later for this one.
                        */
                    || !WPACKET_start_sub_packet_u24(&wpkt)
                       /* Create the actual HelloVerifyRequest body */
                    || !dtls_raw_hello_verify_request(&wpkt, cookie, cookielen)
                       /* Close message body */
                    || !WPACKET_close(&wpkt)
                       /* Close record body */
                    || !WPACKET_close(&wpkt)
                    || !WPACKET_get_total_written(&wpkt, &wreclen)
                    || !WPACKET_finish(&wpkt)) {
                SSLerr(SSL_F_DTLSV1_LISTEN, ERR_R_INTERNAL_ERROR);
                WPACKET_cleanup(&wpkt);
                /* This is fatal */
                return -1;
M
Matt Caswell 已提交
752 753 754
            }

            /*
755 756 757 758 759
             * Fix up the message len in the message header. Its the same as the
             * fragment len which has been filled in by WPACKET, so just copy
             * that. Destination for the message len is after the record header
             * plus one byte for the message content type. The source is the
             * last 3 bytes of the message header
M
Matt Caswell 已提交
760
             */
761 762 763
            memcpy(&buf[DTLS1_RT_HEADER_LENGTH + 1],
                   &buf[DTLS1_RT_HEADER_LENGTH + DTLS1_HM_HEADER_LENGTH - 3],
                   3);
M
Matt Caswell 已提交
764 765 766 767 768

            if (s->msg_callback)
                s->msg_callback(1, 0, SSL3_RT_HEADER, buf,
                                DTLS1_RT_HEADER_LENGTH, s, s->msg_callback_arg);

M
Matt Caswell 已提交
769 770 771 772 773
            if ((tmpclient = BIO_ADDR_new()) == NULL) {
                SSLerr(SSL_F_DTLSV1_LISTEN, ERR_R_MALLOC_FAILURE);
                goto end;
            }

M
Matt Caswell 已提交
774
            /*
F
FdaSilvaYY 已提交
775
             * This is unnecessary if rbio and wbio are one and the same - but
M
Matt Caswell 已提交
776 777
             * maybe they're not. We ignore errors here - some BIOs do not
             * support this.
M
Matt Caswell 已提交
778
             */
779
            if (BIO_dgram_get_peer(rbio, tmpclient) > 0) {
M
Matt Caswell 已提交
780
                (void)BIO_dgram_set_peer(wbio, tmpclient);
M
Matt Caswell 已提交
781
            }
782 783
            BIO_ADDR_free(tmpclient);
            tmpclient = NULL;
M
Matt Caswell 已提交
784

M
Matt Caswell 已提交
785
            /* TODO(size_t): convert this call */
786
            if (BIO_write(wbio, buf, wreclen) < (int)wreclen) {
787
                if (BIO_should_retry(wbio)) {
M
Matt Caswell 已提交
788 789 790 791 792 793 794 795 796 797
                    /*
                     * Non-blocking IO...but we're stateless, so we're just
                     * going to drop this packet.
                     */
                    goto end;
                }
                return -1;
            }

            if (BIO_flush(wbio) <= 0) {
798
                if (BIO_should_retry(wbio)) {
M
Matt Caswell 已提交
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
                    /*
                     * Non-blocking IO...but we're stateless, so we're just
                     * going to drop this packet.
                     */
                    goto end;
                }
                return -1;
            }
        }
    } while (next != LISTEN_SUCCESS);

    /*
     * Set expected sequence numbers to continue the handshake.
     */
    s->d1->handshake_read_seq = 1;
    s->d1->handshake_write_seq = 1;
    s->d1->next_handshake_write_seq = 1;
    DTLS_RECORD_LAYER_set_write_sequence(&s->rlayer, seq);

    /*
     * We are doing cookie exchange, so make sure we set that option in the
     * SSL object
     */
822
    SSL_set_options(s, SSL_OP_COOKIE_EXCHANGE);
D
Dr. Stephen Henson 已提交
823

824 825 826 827 828
    /*
     * Tell the state machine that we've done the initial hello verify
     * exchange
     */
    ossl_statem_set_hello_verify_done(s);
M
Matt Caswell 已提交
829

E
Emilia Kasper 已提交
830 831 832
    /*
     * Some BIOs may not support this. If we fail we clear the client address
     */
M
Matt Caswell 已提交
833 834
    if (BIO_dgram_get_peer(rbio, client) <= 0)
        BIO_ADDR_clear(client);
D
Dr. Stephen Henson 已提交
835

M
Matt Caswell 已提交
836 837
    ret = 1;
    clearpkt = 0;
E
Emilia Kasper 已提交
838
 end:
839
    BIO_ADDR_free(tmpclient);
M
Matt Caswell 已提交
840 841 842 843 844 845
    BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_PEEK_MODE, 0, NULL);
    if (clearpkt) {
        /* Dump this packet. Ignore return value */
        BIO_read(rbio, buf, SSL3_RT_MAX_PLAIN_LENGTH);
    }
    return ret;
846
}
M
Matt Caswell 已提交
847
#endif
D
Dr. Stephen Henson 已提交
848 849

static int dtls1_handshake_write(SSL *s)
850 851 852
{
    return dtls1_do_write(s, SSL3_RT_HANDSHAKE);
}
M
Matt Caswell 已提交
853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900

int dtls1_shutdown(SSL *s)
{
    int ret;
#ifndef OPENSSL_NO_SCTP
    BIO *wbio;

    wbio = SSL_get_wbio(s);
    if (wbio != NULL && BIO_dgram_is_sctp(wbio) &&
        !(s->shutdown & SSL_SENT_SHUTDOWN)) {
        ret = BIO_dgram_sctp_wait_for_dry(wbio);
        if (ret < 0)
            return -1;

        if (ret == 0)
            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN, 1,
                     NULL);
    }
#endif
    ret = ssl3_shutdown(s);
#ifndef OPENSSL_NO_SCTP
    BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN, 0, NULL);
#endif
    return ret;
}

int dtls1_query_mtu(SSL *s)
{
    if (s->d1->link_mtu) {
        s->d1->mtu =
            s->d1->link_mtu - BIO_dgram_get_mtu_overhead(SSL_get_wbio(s));
        s->d1->link_mtu = 0;
    }

    /* AHA!  Figure out the MTU, and stick to the right size */
    if (s->d1->mtu < dtls1_min_mtu(s)) {
        if (!(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) {
            s->d1->mtu =
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);

            /*
             * I've seen the kernel return bogus numbers when it doesn't know
             * (initial write), so just make sure we have a reasonable number
             */
            if (s->d1->mtu < dtls1_min_mtu(s)) {
                /* Set to min mtu */
                s->d1->mtu = dtls1_min_mtu(s);
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SET_MTU,
M
Matt Caswell 已提交
901
                         (long)s->d1->mtu, NULL);
M
Matt Caswell 已提交
902 903 904 905 906 907 908
            }
        } else
            return 0;
    }
    return 1;
}

M
Matt Caswell 已提交
909
static size_t dtls1_link_min_mtu(void)
M
Matt Caswell 已提交
910 911 912 913 914
{
    return (g_probable_mtu[(sizeof(g_probable_mtu) /
                            sizeof(g_probable_mtu[0])) - 1]);
}

M
Matt Caswell 已提交
915
size_t dtls1_min_mtu(SSL *s)
M
Matt Caswell 已提交
916 917 918
{
    return dtls1_link_min_mtu() - BIO_dgram_get_mtu_overhead(SSL_get_wbio(s));
}
D
David Woodhouse 已提交
919 920 921 922 923 924 925 926 927 928 929 930 931 932

size_t DTLS_get_data_mtu(const SSL *s)
{
    size_t mac_overhead, int_overhead, blocksize, ext_overhead;
    const SSL_CIPHER *ciph = SSL_get_current_cipher(s);
    size_t mtu = s->d1->mtu;

    if (ciph == NULL)
        return 0;

    if (!ssl_cipher_get_overhead(ciph, &mac_overhead, &int_overhead,
                                 &blocksize, &ext_overhead))
        return 0;

933
    if (SSL_READ_ETM(s))
D
David Woodhouse 已提交
934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
        ext_overhead += mac_overhead;
    else
        int_overhead += mac_overhead;

    /* Subtract external overhead (e.g. IV/nonce, separate MAC) */
    if (ext_overhead + DTLS1_RT_HEADER_LENGTH >= mtu)
        return 0;
    mtu -= ext_overhead + DTLS1_RT_HEADER_LENGTH;

    /* Round encrypted payload down to cipher block size (for CBC etc.)
     * No check for overflow since 'mtu % blocksize' cannot exceed mtu. */
    if (blocksize)
        mtu -= (mtu % blocksize);

    /* Subtract internal overhead (e.g. CBC padding len byte) */
    if (int_overhead >= mtu)
        return 0;
    mtu -= int_overhead;

    return mtu;
}