Coverage Report

Created: 2022-11-30 06:20

/src/openssl/ssl/d1_both.c
Line
Count
Source (jump to first uncovered line)
1
/* ssl/d1_both.c */
2
/*
3
 * DTLS implementation written by Nagendra Modadugu
4
 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
5
 */
6
/* ====================================================================
7
 * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 *
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 *
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in
18
 *    the documentation and/or other materials provided with the
19
 *    distribution.
20
 *
21
 * 3. All advertising materials mentioning features or use of this
22
 *    software must display the following acknowledgment:
23
 *    "This product includes software developed by the OpenSSL Project
24
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
25
 *
26
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27
 *    endorse or promote products derived from this software without
28
 *    prior written permission. For written permission, please contact
29
 *    openssl-core@openssl.org.
30
 *
31
 * 5. Products derived from this software may not be called "OpenSSL"
32
 *    nor may "OpenSSL" appear in their names without prior written
33
 *    permission of the OpenSSL Project.
34
 *
35
 * 6. Redistributions of any form whatsoever must retain the following
36
 *    acknowledgment:
37
 *    "This product includes software developed by the OpenSSL Project
38
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
39
 *
40
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51
 * OF THE POSSIBILITY OF SUCH DAMAGE.
52
 * ====================================================================
53
 *
54
 * This product includes cryptographic software written by Eric Young
55
 * (eay@cryptsoft.com).  This product includes software written by Tim
56
 * Hudson (tjh@cryptsoft.com).
57
 *
58
 */
59
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
60
 * All rights reserved.
61
 *
62
 * This package is an SSL implementation written
63
 * by Eric Young (eay@cryptsoft.com).
64
 * The implementation was written so as to conform with Netscapes SSL.
65
 *
66
 * This library is free for commercial and non-commercial use as long as
67
 * the following conditions are aheared to.  The following conditions
68
 * apply to all code found in this distribution, be it the RC4, RSA,
69
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
70
 * included with this distribution is covered by the same copyright terms
71
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
72
 *
73
 * Copyright remains Eric Young's, and as such any Copyright notices in
74
 * the code are not to be removed.
75
 * If this package is used in a product, Eric Young should be given attribution
76
 * as the author of the parts of the library used.
77
 * This can be in the form of a textual message at program startup or
78
 * in documentation (online or textual) provided with the package.
79
 *
80
 * Redistribution and use in source and binary forms, with or without
81
 * modification, are permitted provided that the following conditions
82
 * are met:
83
 * 1. Redistributions of source code must retain the copyright
84
 *    notice, this list of conditions and the following disclaimer.
85
 * 2. Redistributions in binary form must reproduce the above copyright
86
 *    notice, this list of conditions and the following disclaimer in the
87
 *    documentation and/or other materials provided with the distribution.
88
 * 3. All advertising materials mentioning features or use of this software
89
 *    must display the following acknowledgement:
90
 *    "This product includes cryptographic software written by
91
 *     Eric Young (eay@cryptsoft.com)"
92
 *    The word 'cryptographic' can be left out if the rouines from the library
93
 *    being used are not cryptographic related :-).
94
 * 4. If you include any Windows specific code (or a derivative thereof) from
95
 *    the apps directory (application code) you must include an acknowledgement:
96
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
97
 *
98
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
99
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
102
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
103
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
104
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
105
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
106
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
107
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
108
 * SUCH DAMAGE.
109
 *
110
 * The licence and distribution terms for any publically available version or
111
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
112
 * copied and put under another distribution licence
113
 * [including the GNU Public Licence.]
114
 */
115
116
#include <limits.h>
117
#include <string.h>
118
#include <stdio.h>
119
#include "ssl_locl.h"
120
#include <openssl/buffer.h>
121
#include <openssl/rand.h>
122
#include <openssl/objects.h>
123
#include <openssl/evp.h>
124
#include <openssl/x509.h>
125
126
0
#define RSMBLY_BITMASK_SIZE(msg_len) (((msg_len) + 7) / 8)
127
128
0
#define RSMBLY_BITMASK_MARK(bitmask, start, end) { \
129
0
                        if ((end) - (start) <= 8) { \
130
0
                                long ii; \
131
0
                                for (ii = (start); ii < (end); ii++) bitmask[((ii) >> 3)] |= (1 << ((ii) & 7)); \
132
0
                        } else { \
133
0
                                long ii; \
134
0
                                bitmask[((start) >> 3)] |= bitmask_start_values[((start) & 7)]; \
135
0
                                for (ii = (((start) >> 3) + 1); ii < ((((end) - 1)) >> 3); ii++) bitmask[ii] = 0xff; \
136
0
                                bitmask[(((end) - 1) >> 3)] |= bitmask_end_values[((end) & 7)]; \
137
0
                        } }
138
139
0
#define RSMBLY_BITMASK_IS_COMPLETE(bitmask, msg_len, is_complete) { \
140
0
                        long ii; \
141
0
                        OPENSSL_assert((msg_len) > 0); \
142
0
                        is_complete = 1; \
143
0
                        if (bitmask[(((msg_len) - 1) >> 3)] != bitmask_end_values[((msg_len) & 7)]) is_complete = 0; \
144
0
                        if (is_complete) for (ii = (((msg_len) - 1) >> 3) - 1; ii >= 0 ; ii--) \
145
0
                                if (bitmask[ii] != 0xff) { is_complete = 0; break; } }
146
147
#if 0
148
# define RSMBLY_BITMASK_PRINT(bitmask, msg_len) { \
149
                        long ii; \
150
                        printf("bitmask: "); for (ii = 0; ii < (msg_len); ii++) \
151
                        printf("%d ", (bitmask[ii >> 3] & (1 << (ii & 7))) >> (ii & 7)); \
152
                        printf("\n"); }
153
#endif
154
155
static unsigned char bitmask_start_values[] =
156
    { 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80 };
157
static unsigned char bitmask_end_values[] =
158
    { 0xff, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f };
159
160
/* XDTLS:  figure out the right values */
161
static const unsigned int g_probable_mtu[] = { 1500, 512, 256 };
162
163
static void dtls1_fix_message_header(SSL *s, unsigned long frag_off,
164
                                     unsigned long frag_len);
165
static unsigned char *dtls1_write_message_header(SSL *s, unsigned char *p);
166
static void dtls1_set_message_header_int(SSL *s, unsigned char mt,
167
                                         unsigned long len,
168
                                         unsigned short seq_num,
169
                                         unsigned long frag_off,
170
                                         unsigned long frag_len);
171
static long dtls1_get_message_fragment(SSL *s, int st1, int stn, long max,
172
                                       int *ok);
173
174
static hm_fragment *dtls1_hm_fragment_new(unsigned long frag_len,
175
                                          int reassembly)
176
0
{
177
0
    hm_fragment *frag = NULL;
178
0
    unsigned char *buf = NULL;
179
0
    unsigned char *bitmask = NULL;
180
181
0
    frag = (hm_fragment *)OPENSSL_malloc(sizeof(hm_fragment));
182
0
    if (frag == NULL)
183
0
        return NULL;
184
185
0
    if (frag_len) {
186
0
        buf = (unsigned char *)OPENSSL_malloc(frag_len);
187
0
        if (buf == NULL) {
188
0
            OPENSSL_free(frag);
189
0
            return NULL;
190
0
        }
191
0
    }
192
193
    /* zero length fragment gets zero frag->fragment */
194
0
    frag->fragment = buf;
195
196
    /* Initialize reassembly bitmask if necessary */
197
0
    if (reassembly) {
198
0
        bitmask =
199
0
            (unsigned char *)OPENSSL_malloc(RSMBLY_BITMASK_SIZE(frag_len));
200
0
        if (bitmask == NULL) {
201
0
            if (buf != NULL)
202
0
                OPENSSL_free(buf);
203
0
            OPENSSL_free(frag);
204
0
            return NULL;
205
0
        }
206
0
        memset(bitmask, 0, RSMBLY_BITMASK_SIZE(frag_len));
207
0
    }
208
209
0
    frag->reassembly = bitmask;
210
211
0
    return frag;
212
0
}
213
214
void dtls1_hm_fragment_free(hm_fragment *frag)
215
0
{
216
217
0
    if (frag->msg_header.is_ccs) {
218
0
        EVP_CIPHER_CTX_free(frag->msg_header.
219
0
                            saved_retransmit_state.enc_write_ctx);
220
0
        EVP_MD_CTX_destroy(frag->msg_header.
221
0
                           saved_retransmit_state.write_hash);
222
0
    }
223
0
    if (frag->fragment)
224
0
        OPENSSL_free(frag->fragment);
225
0
    if (frag->reassembly)
226
0
        OPENSSL_free(frag->reassembly);
227
0
    OPENSSL_free(frag);
228
0
}
229
230
static int dtls1_query_mtu(SSL *s)
231
0
{
232
0
    if (s->d1->link_mtu) {
233
0
        s->d1->mtu =
234
0
            s->d1->link_mtu - BIO_dgram_get_mtu_overhead(SSL_get_wbio(s));
235
0
        s->d1->link_mtu = 0;
236
0
    }
237
238
    /* AHA!  Figure out the MTU, and stick to the right size */
239
0
    if (s->d1->mtu < dtls1_min_mtu(s)) {
240
0
        if (!(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) {
241
0
            s->d1->mtu =
242
0
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
243
244
            /*
245
             * I've seen the kernel return bogus numbers when it doesn't know
246
             * (initial write), so just make sure we have a reasonable number
247
             */
248
0
            if (s->d1->mtu < dtls1_min_mtu(s)) {
249
                /* Set to min mtu */
250
0
                s->d1->mtu = dtls1_min_mtu(s);
251
0
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SET_MTU,
252
0
                         s->d1->mtu, NULL);
253
0
            }
254
0
        } else
255
0
            return 0;
256
0
    }
257
0
    return 1;
258
0
}
259
260
/*
261
 * send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or
262
 * SSL3_RT_CHANGE_CIPHER_SPEC)
263
 */
264
int dtls1_do_write(SSL *s, int type)
265
0
{
266
0
    int ret;
267
0
    unsigned int curr_mtu;
268
0
    int retry = 1;
269
0
    unsigned int len, frag_off, mac_size, blocksize, used_len;
270
271
0
    if (!dtls1_query_mtu(s))
272
0
        return -1;
273
274
0
    OPENSSL_assert(s->d1->mtu >= dtls1_min_mtu(s)); /* should have something
275
                                                     * reasonable now */
276
277
0
    if (s->init_off == 0 && type == SSL3_RT_HANDSHAKE)
278
0
        OPENSSL_assert(s->init_num ==
279
0
                       (int)s->d1->w_msg_hdr.msg_len +
280
0
                       DTLS1_HM_HEADER_LENGTH);
281
282
0
    if (s->write_hash) {
283
0
        if (s->enc_write_ctx
284
0
            && EVP_CIPHER_CTX_mode(s->enc_write_ctx) == EVP_CIPH_GCM_MODE)
285
0
            mac_size = 0;
286
0
        else
287
0
            mac_size = EVP_MD_CTX_size(s->write_hash);
288
0
    } else
289
0
        mac_size = 0;
290
291
0
    if (s->enc_write_ctx &&
292
0
        (EVP_CIPHER_CTX_mode(s->enc_write_ctx) == EVP_CIPH_CBC_MODE))
293
0
        blocksize = 2 * EVP_CIPHER_block_size(s->enc_write_ctx->cipher);
294
0
    else
295
0
        blocksize = 0;
296
297
0
    frag_off = 0;
298
0
    s->rwstate = SSL_NOTHING;
299
300
    /* s->init_num shouldn't ever be < 0...but just in case */
301
0
    while (s->init_num > 0) {
302
0
        if (type == SSL3_RT_HANDSHAKE && s->init_off != 0) {
303
            /* We must be writing a fragment other than the first one */
304
305
0
            if (frag_off > 0) {
306
                /* This is the first attempt at writing out this fragment */
307
308
0
                if (s->init_off <= DTLS1_HM_HEADER_LENGTH) {
309
                    /*
310
                     * Each fragment that was already sent must at least have
311
                     * contained the message header plus one other byte.
312
                     * Therefore |init_off| must have progressed by at least
313
                     * |DTLS1_HM_HEADER_LENGTH + 1| bytes. If not something went
314
                     * wrong.
315
                     */
316
0
                    return -1;
317
0
                }
318
319
                /*
320
                 * Adjust |init_off| and |init_num| to allow room for a new
321
                 * message header for this fragment.
322
                 */
323
0
                s->init_off -= DTLS1_HM_HEADER_LENGTH;
324
0
                s->init_num += DTLS1_HM_HEADER_LENGTH;
325
0
            } else {
326
                /*
327
                 * We must have been called again after a retry so use the
328
                 * fragment offset from our last attempt. We do not need
329
                 * to adjust |init_off| and |init_num| as above, because
330
                 * that should already have been done before the retry.
331
                 */
332
0
                frag_off = s->d1->w_msg_hdr.frag_off;
333
0
            }
334
0
        }
335
336
0
        used_len = BIO_wpending(SSL_get_wbio(s)) + DTLS1_RT_HEADER_LENGTH
337
0
            + mac_size + blocksize;
338
0
        if (s->d1->mtu > used_len)
339
0
            curr_mtu = s->d1->mtu - used_len;
340
0
        else
341
0
            curr_mtu = 0;
342
343
0
        if (curr_mtu <= DTLS1_HM_HEADER_LENGTH) {
344
            /*
345
             * grr.. we could get an error if MTU picked was wrong
346
             */
347
0
            ret = BIO_flush(SSL_get_wbio(s));
348
0
            if (ret <= 0) {
349
0
                s->rwstate = SSL_WRITING;
350
0
                return ret;
351
0
            }
352
0
            used_len = DTLS1_RT_HEADER_LENGTH + mac_size + blocksize;
353
0
            if (s->d1->mtu > used_len + DTLS1_HM_HEADER_LENGTH) {
354
0
                curr_mtu = s->d1->mtu - used_len;
355
0
            } else {
356
                /* Shouldn't happen */
357
0
                return -1;
358
0
            }
359
0
        }
360
361
        /*
362
         * We just checked that s->init_num > 0 so this cast should be safe
363
         */
364
0
        if (((unsigned int)s->init_num) > curr_mtu)
365
0
            len = curr_mtu;
366
0
        else
367
0
            len = s->init_num;
368
369
        /* Shouldn't ever happen */
370
0
        if (len > INT_MAX)
371
0
            len = INT_MAX;
372
373
        /*
374
         * XDTLS: this function is too long.  split out the CCS part
375
         */
376
0
        if (type == SSL3_RT_HANDSHAKE) {
377
0
            if (len < DTLS1_HM_HEADER_LENGTH) {
378
                /*
379
                 * len is so small that we really can't do anything sensible
380
                 * so fail
381
                 */
382
0
                return -1;
383
0
            }
384
0
            dtls1_fix_message_header(s, frag_off,
385
0
                                     len - DTLS1_HM_HEADER_LENGTH);
386
387
0
            dtls1_write_message_header(s,
388
0
                                       (unsigned char *)&s->init_buf->
389
0
                                       data[s->init_off]);
390
0
        }
391
392
0
        ret = dtls1_write_bytes(s, type, &s->init_buf->data[s->init_off],
393
0
                                len);
394
0
        if (ret < 0) {
395
            /*
396
             * might need to update MTU here, but we don't know which
397
             * previous packet caused the failure -- so can't really
398
             * retransmit anything.  continue as if everything is fine and
399
             * wait for an alert to handle the retransmit
400
             */
401
0
            if (retry && BIO_ctrl(SSL_get_wbio(s),
402
0
                                  BIO_CTRL_DGRAM_MTU_EXCEEDED, 0, NULL) > 0) {
403
0
                if (!(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) {
404
0
                    if (!dtls1_query_mtu(s))
405
0
                        return -1;
406
                    /* Have one more go */
407
0
                    retry = 0;
408
0
                } else
409
0
                    return -1;
410
0
            } else {
411
0
                return (-1);
412
0
            }
413
0
        } else {
414
415
            /*
416
             * bad if this assert fails, only part of the handshake message
417
             * got sent.  but why would this happen?
418
             */
419
0
            OPENSSL_assert(len == (unsigned int)ret);
420
421
0
            if (type == SSL3_RT_HANDSHAKE && !s->d1->retransmitting) {
422
                /*
423
                 * should not be done for 'Hello Request's, but in that case
424
                 * we'll ignore the result anyway
425
                 */
426
0
                unsigned char *p =
427
0
                    (unsigned char *)&s->init_buf->data[s->init_off];
428
0
                const struct hm_header_st *msg_hdr = &s->d1->w_msg_hdr;
429
0
                int xlen;
430
431
0
                if (frag_off == 0 && s->version != DTLS1_BAD_VER) {
432
                    /*
433
                     * reconstruct message header is if it is being sent in
434
                     * single fragment
435
                     */
436
0
                    *p++ = msg_hdr->type;
437
0
                    l2n3(msg_hdr->msg_len, p);
438
0
                    s2n(msg_hdr->seq, p);
439
0
                    l2n3(0, p);
440
0
                    l2n3(msg_hdr->msg_len, p);
441
0
                    p -= DTLS1_HM_HEADER_LENGTH;
442
0
                    xlen = ret;
443
0
                } else {
444
0
                    p += DTLS1_HM_HEADER_LENGTH;
445
0
                    xlen = ret - DTLS1_HM_HEADER_LENGTH;
446
0
                }
447
448
0
                ssl3_finish_mac(s, p, xlen);
449
0
            }
450
451
0
            if (ret == s->init_num) {
452
0
                if (s->msg_callback)
453
0
                    s->msg_callback(1, s->version, type, s->init_buf->data,
454
0
                                    (size_t)(s->init_off + s->init_num), s,
455
0
                                    s->msg_callback_arg);
456
457
0
                s->init_off = 0; /* done writing this message */
458
0
                s->init_num = 0;
459
460
0
                return (1);
461
0
            }
462
0
            s->init_off += ret;
463
0
            s->init_num -= ret;
464
0
            ret -= DTLS1_HM_HEADER_LENGTH;
465
0
            frag_off += ret;
466
467
            /*
468
             * We save the fragment offset for the next fragment so we have it
469
             * available in case of an IO retry. We don't know the length of the
470
             * next fragment yet so just set that to 0 for now. It will be
471
             * updated again later.
472
             */
473
0
            dtls1_fix_message_header(s, frag_off, 0);
474
0
        }
475
0
    }
476
0
    return (0);
477
0
}
478
479
/*
480
 * Obtain handshake message of message type 'mt' (any if mt == -1), maximum
481
 * acceptable body length 'max'. Read an entire handshake message.  Handshake
482
 * messages arrive in fragments.
483
 */
484
long dtls1_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
485
0
{
486
0
    int i, al;
487
0
    struct hm_header_st *msg_hdr;
488
0
    unsigned char *p;
489
0
    unsigned long msg_len;
490
491
    /*
492
     * s3->tmp is used to store messages that are unexpected, caused by the
493
     * absence of an optional handshake message
494
     */
495
0
    if (s->s3->tmp.reuse_message) {
496
0
        s->s3->tmp.reuse_message = 0;
497
0
        if ((mt >= 0) && (s->s3->tmp.message_type != mt)) {
498
0
            al = SSL_AD_UNEXPECTED_MESSAGE;
499
0
            SSLerr(SSL_F_DTLS1_GET_MESSAGE, SSL_R_UNEXPECTED_MESSAGE);
500
0
            goto f_err;
501
0
        }
502
0
        *ok = 1;
503
0
        s->init_msg = s->init_buf->data + DTLS1_HM_HEADER_LENGTH;
504
0
        s->init_num = (int)s->s3->tmp.message_size;
505
0
        return s->init_num;
506
0
    }
507
508
0
    msg_hdr = &s->d1->r_msg_hdr;
509
0
    memset(msg_hdr, 0x00, sizeof(struct hm_header_st));
510
511
0
 again:
512
0
    i = dtls1_get_message_fragment(s, st1, stn, max, ok);
513
0
    if (i == DTLS1_HM_BAD_FRAGMENT || i == DTLS1_HM_FRAGMENT_RETRY) {
514
        /* bad fragment received */
515
0
        goto again;
516
0
    } else if (i <= 0 && !*ok) {
517
0
        return i;
518
0
    }
519
520
    /*
521
     * Don't change the *message* read sequence number while listening. For
522
     * the *record* write sequence we reflect the ClientHello sequence number
523
     * when listening.
524
     */
525
0
    if (s->d1->listen)
526
0
        memcpy(s->s3->write_sequence, s->s3->read_sequence,
527
0
               sizeof(s->s3->write_sequence));
528
0
    else
529
0
        s->d1->handshake_read_seq++;
530
531
0
    if (mt >= 0 && s->s3->tmp.message_type != mt) {
532
0
        al = SSL_AD_UNEXPECTED_MESSAGE;
533
0
        SSLerr(SSL_F_DTLS1_GET_MESSAGE, SSL_R_UNEXPECTED_MESSAGE);
534
0
        goto f_err;
535
0
    }
536
537
0
    p = (unsigned char *)s->init_buf->data;
538
0
    msg_len = msg_hdr->msg_len;
539
540
    /* reconstruct message header */
541
0
    *(p++) = msg_hdr->type;
542
0
    l2n3(msg_len, p);
543
0
    s2n(msg_hdr->seq, p);
544
0
    l2n3(0, p);
545
0
    l2n3(msg_len, p);
546
0
    if (s->version != DTLS1_BAD_VER) {
547
0
        p -= DTLS1_HM_HEADER_LENGTH;
548
0
        msg_len += DTLS1_HM_HEADER_LENGTH;
549
0
    }
550
551
0
    ssl3_finish_mac(s, p, msg_len);
552
0
    if (s->msg_callback)
553
0
        s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
554
0
                        p, msg_len, s, s->msg_callback_arg);
555
556
0
    memset(msg_hdr, 0x00, sizeof(struct hm_header_st));
557
558
0
    s->init_msg = s->init_buf->data + DTLS1_HM_HEADER_LENGTH;
559
0
    return s->init_num;
560
561
0
 f_err:
562
0
    ssl3_send_alert(s, SSL3_AL_FATAL, al);
563
0
    *ok = 0;
564
0
    return -1;
565
0
}
566
567
static int dtls1_preprocess_fragment(SSL *s, struct hm_header_st *msg_hdr,
568
                                     int max)
569
0
{
570
0
    size_t frag_off, frag_len, msg_len;
571
572
0
    msg_len = msg_hdr->msg_len;
573
0
    frag_off = msg_hdr->frag_off;
574
0
    frag_len = msg_hdr->frag_len;
575
576
    /* sanity checking */
577
0
    if ((frag_off + frag_len) > msg_len) {
578
0
        SSLerr(SSL_F_DTLS1_PREPROCESS_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
579
0
        return SSL_AD_ILLEGAL_PARAMETER;
580
0
    }
581
582
0
    if ((frag_off + frag_len) > (unsigned long)max) {
583
0
        SSLerr(SSL_F_DTLS1_PREPROCESS_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
584
0
        return SSL_AD_ILLEGAL_PARAMETER;
585
0
    }
586
587
0
    if (s->d1->r_msg_hdr.frag_off == 0) { /* first fragment */
588
        /*
589
         * msg_len is limited to 2^24, but is effectively checked against max
590
         * above
591
         *
592
         * Make buffer slightly larger than message length as a precaution
593
         * against small OOB reads e.g. CVE-2016-6306
594
         */
595
0
        if (!BUF_MEM_grow_clean
596
0
            (s->init_buf, msg_len + DTLS1_HM_HEADER_LENGTH + 16)) {
597
0
            SSLerr(SSL_F_DTLS1_PREPROCESS_FRAGMENT, ERR_R_BUF_LIB);
598
0
            return SSL_AD_INTERNAL_ERROR;
599
0
        }
600
601
0
        s->s3->tmp.message_size = msg_len;
602
0
        s->d1->r_msg_hdr.msg_len = msg_len;
603
0
        s->s3->tmp.message_type = msg_hdr->type;
604
0
        s->d1->r_msg_hdr.type = msg_hdr->type;
605
0
        s->d1->r_msg_hdr.seq = msg_hdr->seq;
606
0
    } else if (msg_len != s->d1->r_msg_hdr.msg_len) {
607
        /*
608
         * They must be playing with us! BTW, failure to enforce upper limit
609
         * would open possibility for buffer overrun.
610
         */
611
0
        SSLerr(SSL_F_DTLS1_PREPROCESS_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
612
0
        return SSL_AD_ILLEGAL_PARAMETER;
613
0
    }
614
615
0
    return 0;                   /* no error */
616
0
}
617
618
static int dtls1_retrieve_buffered_fragment(SSL *s, long max, int *ok)
619
0
{
620
    /*-
621
     * (0) check whether the desired fragment is available
622
     * if so:
623
     * (1) copy over the fragment to s->init_buf->data[]
624
     * (2) update s->init_num
625
     */
626
0
    pitem *item;
627
0
    hm_fragment *frag;
628
0
    int al;
629
630
0
    *ok = 0;
631
0
    do {
632
0
        item = pqueue_peek(s->d1->buffered_messages);
633
0
        if (item == NULL)
634
0
            return 0;
635
636
0
        frag = (hm_fragment *)item->data;
637
638
0
        if (frag->msg_header.seq < s->d1->handshake_read_seq) {
639
            /* This is a stale message that has been buffered so clear it */
640
0
            pqueue_pop(s->d1->buffered_messages);
641
0
            dtls1_hm_fragment_free(frag);
642
0
            pitem_free(item);
643
0
            item = NULL;
644
0
            frag = NULL;
645
0
        }
646
0
    } while (item == NULL);
647
648
649
    /* Don't return if reassembly still in progress */
650
0
    if (frag->reassembly != NULL)
651
0
        return 0;
652
653
0
    if (s->d1->handshake_read_seq == frag->msg_header.seq) {
654
0
        unsigned long frag_len = frag->msg_header.frag_len;
655
0
        pqueue_pop(s->d1->buffered_messages);
656
657
0
        al = dtls1_preprocess_fragment(s, &frag->msg_header, max);
658
659
0
        if (al == 0) {          /* no alert */
660
0
            unsigned char *p =
661
0
                (unsigned char *)s->init_buf->data + DTLS1_HM_HEADER_LENGTH;
662
0
            memcpy(&p[frag->msg_header.frag_off], frag->fragment,
663
0
                   frag->msg_header.frag_len);
664
0
        }
665
666
0
        dtls1_hm_fragment_free(frag);
667
0
        pitem_free(item);
668
669
0
        if (al == 0) {
670
0
            *ok = 1;
671
0
            return frag_len;
672
0
        }
673
674
0
        ssl3_send_alert(s, SSL3_AL_FATAL, al);
675
0
        s->init_num = 0;
676
0
        *ok = 0;
677
0
        return -1;
678
0
    } else
679
0
        return 0;
680
0
}
681
682
/*
683
 * dtls1_max_handshake_message_len returns the maximum number of bytes
684
 * permitted in a DTLS handshake message for |s|. The minimum is 16KB, but
685
 * may be greater if the maximum certificate list size requires it.
686
 */
687
static unsigned long dtls1_max_handshake_message_len(const SSL *s)
688
0
{
689
0
    unsigned long max_len =
690
0
        DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH;
691
0
    if (max_len < (unsigned long)s->max_cert_list)
692
0
        return s->max_cert_list;
693
0
    return max_len;
694
0
}
695
696
static int
697
dtls1_reassemble_fragment(SSL *s, const struct hm_header_st *msg_hdr, int *ok)
698
0
{
699
0
    hm_fragment *frag = NULL;
700
0
    pitem *item = NULL;
701
0
    int i = -1, is_complete;
702
0
    unsigned char seq64be[8];
703
0
    unsigned long frag_len = msg_hdr->frag_len;
704
705
0
    if ((msg_hdr->frag_off + frag_len) > msg_hdr->msg_len ||
706
0
        msg_hdr->msg_len > dtls1_max_handshake_message_len(s))
707
0
        goto err;
708
709
0
    if (frag_len == 0)
710
0
        return DTLS1_HM_FRAGMENT_RETRY;
711
712
    /* Try to find item in queue */
713
0
    memset(seq64be, 0, sizeof(seq64be));
714
0
    seq64be[6] = (unsigned char)(msg_hdr->seq >> 8);
715
0
    seq64be[7] = (unsigned char)msg_hdr->seq;
716
0
    item = pqueue_find(s->d1->buffered_messages, seq64be);
717
718
0
    if (item == NULL) {
719
0
        frag = dtls1_hm_fragment_new(msg_hdr->msg_len, 1);
720
0
        if (frag == NULL)
721
0
            goto err;
722
0
        memcpy(&(frag->msg_header), msg_hdr, sizeof(*msg_hdr));
723
0
        frag->msg_header.frag_len = frag->msg_header.msg_len;
724
0
        frag->msg_header.frag_off = 0;
725
0
    } else {
726
0
        frag = (hm_fragment *)item->data;
727
0
        if (frag->msg_header.msg_len != msg_hdr->msg_len) {
728
0
            item = NULL;
729
0
            frag = NULL;
730
0
            goto err;
731
0
        }
732
0
    }
733
734
    /*
735
     * If message is already reassembled, this must be a retransmit and can
736
     * be dropped. In this case item != NULL and so frag does not need to be
737
     * freed.
738
     */
739
0
    if (frag->reassembly == NULL) {
740
0
        unsigned char devnull[256];
741
742
0
        while (frag_len) {
743
0
            i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE,
744
0
                                          devnull,
745
0
                                          frag_len >
746
0
                                          sizeof(devnull) ? sizeof(devnull) :
747
0
                                          frag_len, 0);
748
0
            if (i <= 0)
749
0
                goto err;
750
0
            frag_len -= i;
751
0
        }
752
0
        return DTLS1_HM_FRAGMENT_RETRY;
753
0
    }
754
755
    /* read the body of the fragment (header has already been read */
756
0
    i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE,
757
0
                                  frag->fragment + msg_hdr->frag_off,
758
0
                                  frag_len, 0);
759
0
    if ((unsigned long)i != frag_len)
760
0
        i = -1;
761
0
    if (i <= 0)
762
0
        goto err;
763
764
0
    RSMBLY_BITMASK_MARK(frag->reassembly, (long)msg_hdr->frag_off,
765
0
                        (long)(msg_hdr->frag_off + frag_len));
766
767
0
    RSMBLY_BITMASK_IS_COMPLETE(frag->reassembly, (long)msg_hdr->msg_len,
768
0
                               is_complete);
769
770
0
    if (is_complete) {
771
0
        OPENSSL_free(frag->reassembly);
772
0
        frag->reassembly = NULL;
773
0
    }
774
775
0
    if (item == NULL) {
776
0
        item = pitem_new(seq64be, frag);
777
0
        if (item == NULL) {
778
0
            i = -1;
779
0
            goto err;
780
0
        }
781
782
0
        item = pqueue_insert(s->d1->buffered_messages, item);
783
        /*
784
         * pqueue_insert fails iff a duplicate item is inserted. However,
785
         * |item| cannot be a duplicate. If it were, |pqueue_find|, above,
786
         * would have returned it and control would never have reached this
787
         * branch.
788
         */
789
0
        OPENSSL_assert(item != NULL);
790
0
    }
791
792
0
    return DTLS1_HM_FRAGMENT_RETRY;
793
794
0
 err:
795
0
    if (frag != NULL && item == NULL)
796
0
        dtls1_hm_fragment_free(frag);
797
0
    *ok = 0;
798
0
    return i;
799
0
}
800
801
static int
802
dtls1_process_out_of_seq_message(SSL *s, const struct hm_header_st *msg_hdr,
803
                                 int *ok)
804
0
{
805
0
    int i = -1;
806
0
    hm_fragment *frag = NULL;
807
0
    pitem *item = NULL;
808
0
    unsigned char seq64be[8];
809
0
    unsigned long frag_len = msg_hdr->frag_len;
810
811
0
    if ((msg_hdr->frag_off + frag_len) > msg_hdr->msg_len)
812
0
        goto err;
813
814
    /* Try to find item in queue, to prevent duplicate entries */
815
0
    memset(seq64be, 0, sizeof(seq64be));
816
0
    seq64be[6] = (unsigned char)(msg_hdr->seq >> 8);
817
0
    seq64be[7] = (unsigned char)msg_hdr->seq;
818
0
    item = pqueue_find(s->d1->buffered_messages, seq64be);
819
820
    /*
821
     * If we already have an entry and this one is a fragment, don't discard
822
     * it and rather try to reassemble it.
823
     */
824
0
    if (item != NULL && frag_len != msg_hdr->msg_len)
825
0
        item = NULL;
826
827
    /*
828
     * Discard the message if sequence number was already there, is too far
829
     * in the future, already in the queue or if we received a FINISHED
830
     * before the SERVER_HELLO, which then must be a stale retransmit.
831
     */
832
0
    if (msg_hdr->seq <= s->d1->handshake_read_seq ||
833
0
        msg_hdr->seq > s->d1->handshake_read_seq + 10 || item != NULL ||
834
0
        (s->d1->handshake_read_seq == 0 && msg_hdr->type == SSL3_MT_FINISHED))
835
0
    {
836
0
        unsigned char devnull[256];
837
838
0
        while (frag_len) {
839
0
            i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE,
840
0
                                          devnull,
841
0
                                          frag_len >
842
0
                                          sizeof(devnull) ? sizeof(devnull) :
843
0
                                          frag_len, 0);
844
0
            if (i <= 0)
845
0
                goto err;
846
0
            frag_len -= i;
847
0
        }
848
0
    } else {
849
0
        if (frag_len != msg_hdr->msg_len)
850
0
            return dtls1_reassemble_fragment(s, msg_hdr, ok);
851
852
0
        if (frag_len > dtls1_max_handshake_message_len(s))
853
0
            goto err;
854
855
0
        frag = dtls1_hm_fragment_new(frag_len, 0);
856
0
        if (frag == NULL)
857
0
            goto err;
858
859
0
        memcpy(&(frag->msg_header), msg_hdr, sizeof(*msg_hdr));
860
861
0
        if (frag_len) {
862
            /*
863
             * read the body of the fragment (header has already been read
864
             */
865
0
            i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE,
866
0
                                          frag->fragment, frag_len, 0);
867
0
            if ((unsigned long)i != frag_len)
868
0
                i = -1;
869
0
            if (i <= 0)
870
0
                goto err;
871
0
        }
872
873
0
        item = pitem_new(seq64be, frag);
874
0
        if (item == NULL)
875
0
            goto err;
876
877
0
        item = pqueue_insert(s->d1->buffered_messages, item);
878
        /*
879
         * pqueue_insert fails iff a duplicate item is inserted. However,
880
         * |item| cannot be a duplicate. If it were, |pqueue_find|, above,
881
         * would have returned it. Then, either |frag_len| !=
882
         * |msg_hdr->msg_len| in which case |item| is set to NULL and it will
883
         * have been processed with |dtls1_reassemble_fragment|, above, or
884
         * the record will have been discarded.
885
         */
886
0
        OPENSSL_assert(item != NULL);
887
0
    }
888
889
0
    return DTLS1_HM_FRAGMENT_RETRY;
890
891
0
 err:
892
0
    if (frag != NULL && item == NULL)
893
0
        dtls1_hm_fragment_free(frag);
894
0
    *ok = 0;
895
0
    return i;
896
0
}
897
898
static long
899
dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok)
900
0
{
901
0
    unsigned char wire[DTLS1_HM_HEADER_LENGTH];
902
0
    unsigned long len, frag_off, frag_len;
903
0
    int i, al;
904
0
    struct hm_header_st msg_hdr;
905
906
0
 redo:
907
    /* see if we have the required fragment already */
908
0
    if ((frag_len = dtls1_retrieve_buffered_fragment(s, max, ok)) || *ok) {
909
0
        if (*ok)
910
0
            s->init_num = frag_len;
911
0
        return frag_len;
912
0
    }
913
914
    /* read handshake message header */
915
0
    i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, wire,
916
0
                                  DTLS1_HM_HEADER_LENGTH, 0);
917
0
    if (i <= 0) {               /* nbio, or an error */
918
0
        s->rwstate = SSL_READING;
919
0
        *ok = 0;
920
0
        return i;
921
0
    }
922
    /* Handshake fails if message header is incomplete */
923
0
    if (i != DTLS1_HM_HEADER_LENGTH) {
924
0
        al = SSL_AD_UNEXPECTED_MESSAGE;
925
0
        SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT, SSL_R_UNEXPECTED_MESSAGE);
926
0
        goto f_err;
927
0
    }
928
929
    /* parse the message fragment header */
930
0
    dtls1_get_message_header(wire, &msg_hdr);
931
932
0
    len = msg_hdr.msg_len;
933
0
    frag_off = msg_hdr.frag_off;
934
0
    frag_len = msg_hdr.frag_len;
935
936
    /*
937
     * We must have at least frag_len bytes left in the record to be read.
938
     * Fragments must not span records.
939
     */
940
0
    if (frag_len > s->s3->rrec.length) {
941
0
        al = SSL3_AD_ILLEGAL_PARAMETER;
942
0
        SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT, SSL_R_BAD_LENGTH);
943
0
        goto f_err;
944
0
    }
945
946
    /*
947
     * if this is a future (or stale) message it gets buffered
948
     * (or dropped)--no further processing at this time
949
     * While listening, we accept seq 1 (ClientHello with cookie)
950
     * although we're still expecting seq 0 (ClientHello)
951
     */
952
0
    if (msg_hdr.seq != s->d1->handshake_read_seq
953
0
        && !(s->d1->listen && msg_hdr.seq == 1))
954
0
        return dtls1_process_out_of_seq_message(s, &msg_hdr, ok);
955
956
0
    if (frag_len && frag_len < len)
957
0
        return dtls1_reassemble_fragment(s, &msg_hdr, ok);
958
959
0
    if (!s->server && s->d1->r_msg_hdr.frag_off == 0 &&
960
0
        wire[0] == SSL3_MT_HELLO_REQUEST) {
961
        /*
962
         * The server may always send 'Hello Request' messages -- we are
963
         * doing a handshake anyway now, so ignore them if their format is
964
         * correct. Does not count for 'Finished' MAC.
965
         */
966
0
        if (wire[1] == 0 && wire[2] == 0 && wire[3] == 0) {
967
0
            if (s->msg_callback)
968
0
                s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
969
0
                                wire, DTLS1_HM_HEADER_LENGTH, s,
970
0
                                s->msg_callback_arg);
971
972
0
            s->init_num = 0;
973
0
            goto redo;
974
0
        } else {                /* Incorrectly formated Hello request */
975
976
0
            al = SSL_AD_UNEXPECTED_MESSAGE;
977
0
            SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT,
978
0
                   SSL_R_UNEXPECTED_MESSAGE);
979
0
            goto f_err;
980
0
        }
981
0
    }
982
983
0
    if ((al = dtls1_preprocess_fragment(s, &msg_hdr, max)))
984
0
        goto f_err;
985
986
0
    if (frag_len > 0) {
987
0
        unsigned char *p =
988
0
            (unsigned char *)s->init_buf->data + DTLS1_HM_HEADER_LENGTH;
989
990
0
        i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE,
991
0
                                      &p[frag_off], frag_len, 0);
992
993
        /*
994
         * This shouldn't ever fail due to NBIO because we already checked
995
         * that we have enough data in the record
996
         */
997
0
        if (i <= 0) {
998
0
            s->rwstate = SSL_READING;
999
0
            *ok = 0;
1000
0
            return i;
1001
0
        }
1002
0
    } else
1003
0
        i = 0;
1004
1005
    /*
1006
     * XDTLS: an incorrectly formatted fragment should cause the handshake
1007
     * to fail
1008
     */
1009
0
    if (i != (int)frag_len) {
1010
0
        al = SSL3_AD_ILLEGAL_PARAMETER;
1011
0
        SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT, SSL3_AD_ILLEGAL_PARAMETER);
1012
0
        goto f_err;
1013
0
    }
1014
1015
0
    *ok = 1;
1016
0
    s->state = stn;
1017
1018
    /*
1019
     * Note that s->init_num is *not* used as current offset in
1020
     * s->init_buf->data, but as a counter summing up fragments' lengths: as
1021
     * soon as they sum up to handshake packet length, we assume we have got
1022
     * all the fragments.
1023
     */
1024
0
    s->init_num = frag_len;
1025
0
    return frag_len;
1026
1027
0
 f_err:
1028
0
    ssl3_send_alert(s, SSL3_AL_FATAL, al);
1029
0
    s->init_num = 0;
1030
1031
0
    *ok = 0;
1032
0
    return (-1);
1033
0
}
1034
1035
/*-
1036
 * for these 2 messages, we need to
1037
 * ssl->enc_read_ctx                    re-init
1038
 * ssl->s3->read_sequence               zero
1039
 * ssl->s3->read_mac_secret             re-init
1040
 * ssl->session->read_sym_enc           assign
1041
 * ssl->session->read_compression       assign
1042
 * ssl->session->read_hash              assign
1043
 */
1044
int dtls1_send_change_cipher_spec(SSL *s, int a, int b)
1045
0
{
1046
0
    unsigned char *p;
1047
1048
0
    if (s->state == a) {
1049
0
        p = (unsigned char *)s->init_buf->data;
1050
0
        *p++ = SSL3_MT_CCS;
1051
0
        s->d1->handshake_write_seq = s->d1->next_handshake_write_seq;
1052
0
        s->init_num = DTLS1_CCS_HEADER_LENGTH;
1053
1054
0
        if (s->version == DTLS1_BAD_VER) {
1055
0
            s->d1->next_handshake_write_seq++;
1056
0
            s2n(s->d1->handshake_write_seq, p);
1057
0
            s->init_num += 2;
1058
0
        }
1059
1060
0
        s->init_off = 0;
1061
1062
0
        dtls1_set_message_header_int(s, SSL3_MT_CCS, 0,
1063
0
                                     s->d1->handshake_write_seq, 0, 0);
1064
1065
        /* buffer the message to handle re-xmits */
1066
0
        dtls1_buffer_message(s, 1);
1067
1068
0
        s->state = b;
1069
0
    }
1070
1071
    /* SSL3_ST_CW_CHANGE_B */
1072
0
    return (dtls1_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC));
1073
0
}
1074
1075
int dtls1_read_failed(SSL *s, int code)
1076
0
{
1077
0
    if (code > 0) {
1078
#ifdef TLS_DEBUG
1079
        fprintf(stderr, "invalid state reached %s:%d", __FILE__, __LINE__);
1080
#endif
1081
0
        return 1;
1082
0
    }
1083
1084
0
    if (!dtls1_is_timer_expired(s)) {
1085
        /*
1086
         * not a timeout, none of our business, let higher layers handle
1087
         * this.  in fact it's probably an error
1088
         */
1089
0
        return code;
1090
0
    }
1091
0
#ifndef OPENSSL_NO_HEARTBEATS
1092
    /* done, no need to send a retransmit */
1093
0
    if (!SSL_in_init(s) && !s->tlsext_hb_pending)
1094
#else
1095
    /* done, no need to send a retransmit */
1096
    if (!SSL_in_init(s))
1097
#endif
1098
0
    {
1099
0
        BIO_set_flags(SSL_get_rbio(s), BIO_FLAGS_READ);
1100
0
        return code;
1101
0
    }
1102
#if 0                           /* for now, each alert contains only one
1103
                                 * record number */
1104
    item = pqueue_peek(state->rcvd_records);
1105
    if (item) {
1106
        /* send an alert immediately for all the missing records */
1107
    } else
1108
#endif
1109
1110
#if 0                           /* no more alert sending, just retransmit the
1111
                                 * last set of messages */
1112
    if (state->timeout.read_timeouts >= DTLS1_TMO_READ_COUNT)
1113
        ssl3_send_alert(s, SSL3_AL_WARNING,
1114
                        DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1115
#endif
1116
1117
0
    return dtls1_handle_timeout(s);
1118
0
}
1119
1120
int dtls1_get_queue_priority(unsigned short seq, int is_ccs)
1121
0
{
1122
    /*
1123
     * The index of the retransmission queue actually is the message sequence
1124
     * number, since the queue only contains messages of a single handshake.
1125
     * However, the ChangeCipherSpec has no message sequence number and so
1126
     * using only the sequence will result in the CCS and Finished having the
1127
     * same index. To prevent this, the sequence number is multiplied by 2.
1128
     * In case of a CCS 1 is subtracted. This does not only differ CSS and
1129
     * Finished, it also maintains the order of the index (important for
1130
     * priority queues) and fits in the unsigned short variable.
1131
     */
1132
0
    return seq * 2 - is_ccs;
1133
0
}
1134
1135
int dtls1_retransmit_buffered_messages(SSL *s)
1136
0
{
1137
0
    pqueue sent = s->d1->sent_messages;
1138
0
    piterator iter;
1139
0
    pitem *item;
1140
0
    hm_fragment *frag;
1141
0
    int found = 0;
1142
1143
0
    iter = pqueue_iterator(sent);
1144
1145
0
    for (item = pqueue_next(&iter); item != NULL; item = pqueue_next(&iter)) {
1146
0
        frag = (hm_fragment *)item->data;
1147
0
        if (dtls1_retransmit_message(s, (unsigned short)
1148
0
                                     dtls1_get_queue_priority
1149
0
                                     (frag->msg_header.seq,
1150
0
                                      frag->msg_header.is_ccs), 0,
1151
0
                                     &found) <= 0 && found) {
1152
#ifdef TLS_DEBUG
1153
            fprintf(stderr, "dtls1_retransmit_message() failed\n");
1154
#endif
1155
0
            return -1;
1156
0
        }
1157
0
    }
1158
1159
0
    return 1;
1160
0
}
1161
1162
int dtls1_buffer_message(SSL *s, int is_ccs)
1163
0
{
1164
0
    pitem *item;
1165
0
    hm_fragment *frag;
1166
0
    unsigned char seq64be[8];
1167
1168
    /*
1169
     * this function is called immediately after a message has been
1170
     * serialized
1171
     */
1172
0
    OPENSSL_assert(s->init_off == 0);
1173
1174
0
    frag = dtls1_hm_fragment_new(s->init_num, 0);
1175
0
    if (!frag)
1176
0
        return 0;
1177
1178
0
    memcpy(frag->fragment, s->init_buf->data, s->init_num);
1179
1180
0
    if (is_ccs) {
1181
        /* For DTLS1_BAD_VER the header length is non-standard */
1182
0
        OPENSSL_assert(s->d1->w_msg_hdr.msg_len +
1183
0
                       ((s->version==DTLS1_BAD_VER)?3:DTLS1_CCS_HEADER_LENGTH)
1184
0
                       == (unsigned int)s->init_num);
1185
0
    } else {
1186
0
        OPENSSL_assert(s->d1->w_msg_hdr.msg_len +
1187
0
                       DTLS1_HM_HEADER_LENGTH == (unsigned int)s->init_num);
1188
0
    }
1189
1190
0
    frag->msg_header.msg_len = s->d1->w_msg_hdr.msg_len;
1191
0
    frag->msg_header.seq = s->d1->w_msg_hdr.seq;
1192
0
    frag->msg_header.type = s->d1->w_msg_hdr.type;
1193
0
    frag->msg_header.frag_off = 0;
1194
0
    frag->msg_header.frag_len = s->d1->w_msg_hdr.msg_len;
1195
0
    frag->msg_header.is_ccs = is_ccs;
1196
1197
    /* save current state */
1198
0
    frag->msg_header.saved_retransmit_state.enc_write_ctx = s->enc_write_ctx;
1199
0
    frag->msg_header.saved_retransmit_state.write_hash = s->write_hash;
1200
0
    frag->msg_header.saved_retransmit_state.compress = s->compress;
1201
0
    frag->msg_header.saved_retransmit_state.session = s->session;
1202
0
    frag->msg_header.saved_retransmit_state.epoch = s->d1->w_epoch;
1203
1204
0
    memset(seq64be, 0, sizeof(seq64be));
1205
0
    seq64be[6] =
1206
0
        (unsigned
1207
0
         char)(dtls1_get_queue_priority(frag->msg_header.seq,
1208
0
                                        frag->msg_header.is_ccs) >> 8);
1209
0
    seq64be[7] =
1210
0
        (unsigned
1211
0
         char)(dtls1_get_queue_priority(frag->msg_header.seq,
1212
0
                                        frag->msg_header.is_ccs));
1213
1214
0
    item = pitem_new(seq64be, frag);
1215
0
    if (item == NULL) {
1216
0
        dtls1_hm_fragment_free(frag);
1217
0
        return 0;
1218
0
    }
1219
#if 0
1220
    fprintf(stderr, "buffered messge: \ttype = %xx\n", msg_buf->type);
1221
    fprintf(stderr, "\t\t\t\t\tlen = %d\n", msg_buf->len);
1222
    fprintf(stderr, "\t\t\t\t\tseq_num = %d\n", msg_buf->seq_num);
1223
#endif
1224
1225
0
    pqueue_insert(s->d1->sent_messages, item);
1226
0
    return 1;
1227
0
}
1228
1229
int
1230
dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
1231
                         int *found)
1232
0
{
1233
0
    int ret;
1234
    /* XDTLS: for now assuming that read/writes are blocking */
1235
0
    pitem *item;
1236
0
    hm_fragment *frag;
1237
0
    unsigned long header_length;
1238
0
    unsigned char seq64be[8];
1239
0
    struct dtls1_retransmit_state saved_state;
1240
0
    unsigned char save_write_sequence[8] = {0, 0, 0, 0, 0, 0, 0, 0};
1241
1242
    /*-
1243
      OPENSSL_assert(s->init_num == 0);
1244
      OPENSSL_assert(s->init_off == 0);
1245
     */
1246
1247
    /* XDTLS:  the requested message ought to be found, otherwise error */
1248
0
    memset(seq64be, 0, sizeof(seq64be));
1249
0
    seq64be[6] = (unsigned char)(seq >> 8);
1250
0
    seq64be[7] = (unsigned char)seq;
1251
1252
0
    item = pqueue_find(s->d1->sent_messages, seq64be);
1253
0
    if (item == NULL) {
1254
#ifdef TLS_DEBUG
1255
        fprintf(stderr, "retransmit:  message %d non-existant\n", seq);
1256
#endif
1257
0
        *found = 0;
1258
0
        return 0;
1259
0
    }
1260
1261
0
    *found = 1;
1262
0
    frag = (hm_fragment *)item->data;
1263
1264
0
    if (frag->msg_header.is_ccs)
1265
0
        header_length = DTLS1_CCS_HEADER_LENGTH;
1266
0
    else
1267
0
        header_length = DTLS1_HM_HEADER_LENGTH;
1268
1269
0
    memcpy(s->init_buf->data, frag->fragment,
1270
0
           frag->msg_header.msg_len + header_length);
1271
0
    s->init_num = frag->msg_header.msg_len + header_length;
1272
1273
0
    dtls1_set_message_header_int(s, frag->msg_header.type,
1274
0
                                 frag->msg_header.msg_len,
1275
0
                                 frag->msg_header.seq, 0,
1276
0
                                 frag->msg_header.frag_len);
1277
1278
    /* save current state */
1279
0
    saved_state.enc_write_ctx = s->enc_write_ctx;
1280
0
    saved_state.write_hash = s->write_hash;
1281
0
    saved_state.compress = s->compress;
1282
0
    saved_state.session = s->session;
1283
0
    saved_state.epoch = s->d1->w_epoch;
1284
0
    saved_state.epoch = s->d1->w_epoch;
1285
1286
0
    s->d1->retransmitting = 1;
1287
1288
    /* restore state in which the message was originally sent */
1289
0
    s->enc_write_ctx = frag->msg_header.saved_retransmit_state.enc_write_ctx;
1290
0
    s->write_hash = frag->msg_header.saved_retransmit_state.write_hash;
1291
0
    s->compress = frag->msg_header.saved_retransmit_state.compress;
1292
0
    s->session = frag->msg_header.saved_retransmit_state.session;
1293
0
    s->d1->w_epoch = frag->msg_header.saved_retransmit_state.epoch;
1294
1295
0
    if (frag->msg_header.saved_retransmit_state.epoch ==
1296
0
        saved_state.epoch - 1) {
1297
0
        memcpy(save_write_sequence, s->s3->write_sequence,
1298
0
               sizeof(s->s3->write_sequence));
1299
0
        memcpy(s->s3->write_sequence, s->d1->last_write_sequence,
1300
0
               sizeof(s->s3->write_sequence));
1301
0
    }
1302
1303
0
    ret = dtls1_do_write(s, frag->msg_header.is_ccs ?
1304
0
                         SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE);
1305
1306
    /* restore current state */
1307
0
    s->enc_write_ctx = saved_state.enc_write_ctx;
1308
0
    s->write_hash = saved_state.write_hash;
1309
0
    s->compress = saved_state.compress;
1310
0
    s->session = saved_state.session;
1311
0
    s->d1->w_epoch = saved_state.epoch;
1312
1313
0
    if (frag->msg_header.saved_retransmit_state.epoch ==
1314
0
        saved_state.epoch - 1) {
1315
0
        memcpy(s->d1->last_write_sequence, s->s3->write_sequence,
1316
0
               sizeof(s->s3->write_sequence));
1317
0
        memcpy(s->s3->write_sequence, save_write_sequence,
1318
0
               sizeof(s->s3->write_sequence));
1319
0
    }
1320
1321
0
    s->d1->retransmitting = 0;
1322
1323
0
    (void)BIO_flush(SSL_get_wbio(s));
1324
0
    return ret;
1325
0
}
1326
1327
unsigned char *dtls1_set_message_header(SSL *s, unsigned char *p,
1328
                                        unsigned char mt, unsigned long len,
1329
                                        unsigned long frag_off,
1330
                                        unsigned long frag_len)
1331
0
{
1332
    /* Don't change sequence numbers while listening */
1333
0
    if (frag_off == 0 && !s->d1->listen) {
1334
0
        s->d1->handshake_write_seq = s->d1->next_handshake_write_seq;
1335
0
        s->d1->next_handshake_write_seq++;
1336
0
    }
1337
1338
0
    dtls1_set_message_header_int(s, mt, len, s->d1->handshake_write_seq,
1339
0
                                 frag_off, frag_len);
1340
1341
0
    return p += DTLS1_HM_HEADER_LENGTH;
1342
0
}
1343
1344
/* don't actually do the writing, wait till the MTU has been retrieved */
1345
static void
1346
dtls1_set_message_header_int(SSL *s, unsigned char mt,
1347
                             unsigned long len, unsigned short seq_num,
1348
                             unsigned long frag_off, unsigned long frag_len)
1349
0
{
1350
0
    struct hm_header_st *msg_hdr = &s->d1->w_msg_hdr;
1351
1352
0
    msg_hdr->type = mt;
1353
0
    msg_hdr->msg_len = len;
1354
0
    msg_hdr->seq = seq_num;
1355
0
    msg_hdr->frag_off = frag_off;
1356
0
    msg_hdr->frag_len = frag_len;
1357
0
}
1358
1359
static void
1360
dtls1_fix_message_header(SSL *s, unsigned long frag_off,
1361
                         unsigned long frag_len)
1362
0
{
1363
0
    struct hm_header_st *msg_hdr = &s->d1->w_msg_hdr;
1364
1365
0
    msg_hdr->frag_off = frag_off;
1366
0
    msg_hdr->frag_len = frag_len;
1367
0
}
1368
1369
static unsigned char *dtls1_write_message_header(SSL *s, unsigned char *p)
1370
0
{
1371
0
    struct hm_header_st *msg_hdr = &s->d1->w_msg_hdr;
1372
1373
0
    *p++ = msg_hdr->type;
1374
0
    l2n3(msg_hdr->msg_len, p);
1375
1376
0
    s2n(msg_hdr->seq, p);
1377
0
    l2n3(msg_hdr->frag_off, p);
1378
0
    l2n3(msg_hdr->frag_len, p);
1379
1380
0
    return p;
1381
0
}
1382
1383
unsigned int dtls1_link_min_mtu(void)
1384
0
{
1385
0
    return (g_probable_mtu[(sizeof(g_probable_mtu) /
1386
0
                            sizeof(g_probable_mtu[0])) - 1]);
1387
0
}
1388
1389
unsigned int dtls1_min_mtu(SSL *s)
1390
0
{
1391
0
    return dtls1_link_min_mtu() - BIO_dgram_get_mtu_overhead(SSL_get_wbio(s));
1392
0
}
1393
1394
void
1395
dtls1_get_message_header(unsigned char *data, struct hm_header_st *msg_hdr)
1396
0
{
1397
0
    memset(msg_hdr, 0x00, sizeof(struct hm_header_st));
1398
0
    msg_hdr->type = *(data++);
1399
0
    n2l3(data, msg_hdr->msg_len);
1400
1401
0
    n2s(data, msg_hdr->seq);
1402
0
    n2l3(data, msg_hdr->frag_off);
1403
0
    n2l3(data, msg_hdr->frag_len);
1404
0
}
1405
1406
void dtls1_get_ccs_header(unsigned char *data, struct ccs_header_st *ccs_hdr)
1407
0
{
1408
0
    memset(ccs_hdr, 0x00, sizeof(struct ccs_header_st));
1409
1410
0
    ccs_hdr->type = *(data++);
1411
0
}
1412
1413
int dtls1_shutdown(SSL *s)
1414
0
{
1415
0
    int ret;
1416
#ifndef OPENSSL_NO_SCTP
1417
    BIO *wbio;
1418
1419
    wbio = SSL_get_wbio(s);
1420
    if (wbio != NULL && BIO_dgram_is_sctp(wbio) &&
1421
        !(s->shutdown & SSL_SENT_SHUTDOWN)) {
1422
        ret = BIO_dgram_sctp_wait_for_dry(wbio);
1423
        if (ret < 0)
1424
            return -1;
1425
1426
        if (ret == 0)
1427
            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN, 1,
1428
                     NULL);
1429
    }
1430
#endif
1431
0
    ret = ssl3_shutdown(s);
1432
#ifndef OPENSSL_NO_SCTP
1433
    BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN, 0, NULL);
1434
#endif
1435
0
    return ret;
1436
0
}
1437
1438
#ifndef OPENSSL_NO_HEARTBEATS
1439
int dtls1_process_heartbeat(SSL *s)
1440
0
{
1441
0
    unsigned char *p = &s->s3->rrec.data[0], *pl;
1442
0
    unsigned short hbtype;
1443
0
    unsigned int payload;
1444
0
    unsigned int padding = 16;  /* Use minimum padding */
1445
1446
0
    if (s->msg_callback)
1447
0
        s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
1448
0
                        &s->s3->rrec.data[0], s->s3->rrec.length,
1449
0
                        s, s->msg_callback_arg);
1450
1451
    /* Read type and payload length first */
1452
0
    if (1 + 2 + 16 > s->s3->rrec.length)
1453
0
        return 0;               /* silently discard */
1454
0
    if (s->s3->rrec.length > SSL3_RT_MAX_PLAIN_LENGTH)
1455
0
        return 0;               /* silently discard per RFC 6520 sec. 4 */
1456
1457
0
    hbtype = *p++;
1458
0
    n2s(p, payload);
1459
0
    if (1 + 2 + payload + 16 > s->s3->rrec.length)
1460
0
        return 0;               /* silently discard per RFC 6520 sec. 4 */
1461
0
    pl = p;
1462
1463
0
    if (hbtype == TLS1_HB_REQUEST) {
1464
0
        unsigned char *buffer, *bp;
1465
0
        unsigned int write_length = 1 /* heartbeat type */  +
1466
0
            2 /* heartbeat length */  +
1467
0
            payload + padding;
1468
0
        int r;
1469
1470
0
        if (write_length > SSL3_RT_MAX_PLAIN_LENGTH)
1471
0
            return 0;
1472
1473
        /*
1474
         * Allocate memory for the response, size is 1 byte message type,
1475
         * plus 2 bytes payload length, plus payload, plus padding
1476
         */
1477
0
        buffer = OPENSSL_malloc(write_length);
1478
0
        if (buffer == NULL)
1479
0
            return -1;
1480
0
        bp = buffer;
1481
1482
        /* Enter response type, length and copy payload */
1483
0
        *bp++ = TLS1_HB_RESPONSE;
1484
0
        s2n(payload, bp);
1485
0
        memcpy(bp, pl, payload);
1486
0
        bp += payload;
1487
        /* Random padding */
1488
0
        if (RAND_bytes(bp, padding) <= 0) {
1489
0
            OPENSSL_free(buffer);
1490
0
            return -1;
1491
0
        }
1492
1493
0
        r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length);
1494
1495
0
        if (r >= 0 && s->msg_callback)
1496
0
            s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
1497
0
                            buffer, write_length, s, s->msg_callback_arg);
1498
1499
0
        OPENSSL_free(buffer);
1500
1501
0
        if (r < 0)
1502
0
            return r;
1503
0
    } else if (hbtype == TLS1_HB_RESPONSE) {
1504
0
        unsigned int seq;
1505
1506
        /*
1507
         * We only send sequence numbers (2 bytes unsigned int), and 16
1508
         * random bytes, so we just try to read the sequence number
1509
         */
1510
0
        n2s(pl, seq);
1511
1512
0
        if (payload == 18 && seq == s->tlsext_hb_seq) {
1513
0
            dtls1_stop_timer(s);
1514
0
            s->tlsext_hb_seq++;
1515
0
            s->tlsext_hb_pending = 0;
1516
0
        }
1517
0
    }
1518
1519
0
    return 0;
1520
0
}
1521
1522
int dtls1_heartbeat(SSL *s)
1523
0
{
1524
0
    unsigned char *buf, *p;
1525
0
    int ret = -1;
1526
0
    unsigned int payload = 18;  /* Sequence number + random bytes */
1527
0
    unsigned int padding = 16;  /* Use minimum padding */
1528
1529
    /* Only send if peer supports and accepts HB requests... */
1530
0
    if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
1531
0
        s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS) {
1532
0
        SSLerr(SSL_F_DTLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
1533
0
        return -1;
1534
0
    }
1535
1536
    /* ...and there is none in flight yet... */
1537
0
    if (s->tlsext_hb_pending) {
1538
0
        SSLerr(SSL_F_DTLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PENDING);
1539
0
        return -1;
1540
0
    }
1541
1542
    /* ...and no handshake in progress. */
1543
0
    if (SSL_in_init(s) || s->in_handshake) {
1544
0
        SSLerr(SSL_F_DTLS1_HEARTBEAT, SSL_R_UNEXPECTED_MESSAGE);
1545
0
        return -1;
1546
0
    }
1547
1548
    /*
1549
     * Check if padding is too long, payload and padding must not exceed 2^14
1550
     * - 3 = 16381 bytes in total.
1551
     */
1552
0
    OPENSSL_assert(payload + padding <= 16381);
1553
1554
    /*-
1555
     * Create HeartBeat message, we just use a sequence number
1556
     * as payload to distuingish different messages and add
1557
     * some random stuff.
1558
     *  - Message Type, 1 byte
1559
     *  - Payload Length, 2 bytes (unsigned int)
1560
     *  - Payload, the sequence number (2 bytes uint)
1561
     *  - Payload, random bytes (16 bytes uint)
1562
     *  - Padding
1563
     */
1564
0
    buf = OPENSSL_malloc(1 + 2 + payload + padding);
1565
0
    if (buf == NULL)
1566
0
        goto err;
1567
0
    p = buf;
1568
    /* Message Type */
1569
0
    *p++ = TLS1_HB_REQUEST;
1570
    /* Payload length (18 bytes here) */
1571
0
    s2n(payload, p);
1572
    /* Sequence number */
1573
0
    s2n(s->tlsext_hb_seq, p);
1574
    /* 16 random bytes */
1575
0
    if (RAND_bytes(p, 16) <= 0)
1576
0
        goto err;
1577
0
    p += 16;
1578
    /* Random padding */
1579
0
    if (RAND_bytes(p, padding) <= 0)
1580
0
        goto err;
1581
1582
0
    ret = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
1583
0
    if (ret >= 0) {
1584
0
        if (s->msg_callback)
1585
0
            s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
1586
0
                            buf, 3 + payload + padding,
1587
0
                            s, s->msg_callback_arg);
1588
1589
0
        dtls1_start_timer(s);
1590
0
        s->tlsext_hb_pending = 1;
1591
0
    }
1592
1593
0
err:
1594
0
    OPENSSL_free(buf);
1595
1596
0
    return ret;
1597
0
}
1598
#endif