Coverage Report

Created: 2022-11-30 06:20

/src/openssl/ssl/d1_pkt.c
Line
Count
Source (jump to first uncovered line)
1
/* ssl/d1_pkt.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 <stdio.h>
117
#include <errno.h>
118
#define USE_SOCKETS
119
#include "ssl_locl.h"
120
#include <openssl/evp.h>
121
#include <openssl/buffer.h>
122
#include <openssl/pqueue.h>
123
#include <openssl/rand.h>
124
125
/* mod 128 saturating subtract of two 64-bit values in big-endian order */
126
static int satsub64be(const unsigned char *v1, const unsigned char *v2)
127
0
{
128
0
    int ret, i;
129
130
0
    if (sizeof(long) == 8)
131
0
        do {
132
0
            const union {
133
0
                long one;
134
0
                char little;
135
0
            } is_endian = {
136
0
                1
137
0
            };
138
0
            long l;
139
140
0
            if (is_endian.little)
141
0
                break;
142
            /* not reached on little-endians */
143
            /*
144
             * following test is redundant, because input is always aligned,
145
             * but I take no chances...
146
             */
147
0
            if (((size_t)v1 | (size_t)v2) & 0x7)
148
0
                break;
149
150
0
            l = *((long *)v1);
151
0
            l -= *((long *)v2);
152
0
            if (l > 128)
153
0
                return 128;
154
0
            else if (l < -128)
155
0
                return -128;
156
0
            else
157
0
                return (int)l;
158
0
        } while (0);
159
160
0
    ret = 0;
161
0
    for (i=0; i<7; i++) {
162
0
        if (v1[i] > v2[i]) {
163
            /* v1 is larger... but by how much? */
164
0
            if (v1[i] != v2[i] + 1)
165
0
                return 128;
166
0
            while (++i <= 6) {
167
0
                if (v1[i] != 0x00 || v2[i] != 0xff)
168
0
                    return 128; /* too much */
169
0
            }
170
            /* We checked all the way to the penultimate byte,
171
             * so despite higher bytes changing we actually
172
             * know that it only changed from (e.g.)
173
             *       ... (xx)  ff ff ff ??
174
             * to   ... (xx+1) 00 00 00 ??
175
             * so we add a 'bias' of 256 for the carry that
176
             * happened, and will eventually return
177
             * 256 + v1[7] - v2[7]. */
178
0
            ret = 256;
179
0
            break;
180
0
        } else if (v2[i] > v1[i]) {
181
            /* v2 is larger... but by how much? */
182
0
            if (v2[i] != v1[i] + 1)
183
0
                return -128;
184
0
            while (++i <= 6) {
185
0
                if (v2[i] != 0x00 || v1[i] != 0xff)
186
0
                    return -128; /* too much */
187
0
            }
188
            /* Similar to the case above, we know it changed
189
             * from    ... (xx)  00 00 00 ??
190
             * to     ... (xx-1) ff ff ff ??
191
             * so we add a 'bias' of -256 for the borrow,
192
             * to return -256 + v1[7] - v2[7]. */
193
0
            ret = -256;
194
0
        }
195
0
    }
196
197
0
    ret += (int)v1[7] - (int)v2[7];
198
199
0
    if (ret > 128)
200
0
        return 128;
201
0
    else if (ret < -128)
202
0
        return -128;
203
0
    else
204
0
        return ret;
205
0
}
206
207
static int have_handshake_fragment(SSL *s, int type, unsigned char *buf,
208
                                   int len, int peek);
209
static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap);
210
static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap);
211
static DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr,
212
                                      unsigned int *is_next_epoch);
213
#if 0
214
static int dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr,
215
                                        unsigned short *priority,
216
                                        unsigned long *offset);
217
#endif
218
static int dtls1_buffer_record(SSL *s, record_pqueue *q,
219
                               unsigned char *priority);
220
static int dtls1_process_record(SSL *s, DTLS1_BITMAP *bitmap);
221
222
/* copy buffered record into SSL structure */
223
static int dtls1_copy_record(SSL *s, pitem *item)
224
0
{
225
0
    DTLS1_RECORD_DATA *rdata;
226
227
0
    rdata = (DTLS1_RECORD_DATA *)item->data;
228
229
0
    if (s->s3->rbuf.buf != NULL)
230
0
        OPENSSL_free(s->s3->rbuf.buf);
231
232
0
    s->packet = rdata->packet;
233
0
    s->packet_length = rdata->packet_length;
234
0
    memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER));
235
0
    memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD));
236
237
    /* Set proper sequence number for mac calculation */
238
0
    memcpy(&(s->s3->read_sequence[2]), &(rdata->packet[5]), 6);
239
240
0
    return (1);
241
0
}
242
243
static int
244
dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority)
245
0
{
246
0
    DTLS1_RECORD_DATA *rdata;
247
0
    pitem *item;
248
249
    /* Limit the size of the queue to prevent DOS attacks */
250
0
    if (pqueue_size(queue->q) >= 100)
251
0
        return 0;
252
253
0
    rdata = OPENSSL_malloc(sizeof(DTLS1_RECORD_DATA));
254
0
    item = pitem_new(priority, rdata);
255
0
    if (rdata == NULL || item == NULL) {
256
0
        if (rdata != NULL)
257
0
            OPENSSL_free(rdata);
258
0
        if (item != NULL)
259
0
            pitem_free(item);
260
261
0
        SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
262
0
        return -1;
263
0
    }
264
265
0
    rdata->packet = s->packet;
266
0
    rdata->packet_length = s->packet_length;
267
0
    memcpy(&(rdata->rbuf), &(s->s3->rbuf), sizeof(SSL3_BUFFER));
268
0
    memcpy(&(rdata->rrec), &(s->s3->rrec), sizeof(SSL3_RECORD));
269
270
0
    item->data = rdata;
271
272
#ifndef OPENSSL_NO_SCTP
273
    /* Store bio_dgram_sctp_rcvinfo struct */
274
    if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
275
        (s->state == SSL3_ST_SR_FINISHED_A
276
         || s->state == SSL3_ST_CR_FINISHED_A)) {
277
        BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_GET_RCVINFO,
278
                 sizeof(rdata->recordinfo), &rdata->recordinfo);
279
    }
280
#endif
281
282
0
    s->packet = NULL;
283
0
    s->packet_length = 0;
284
0
    memset(&(s->s3->rbuf), 0, sizeof(SSL3_BUFFER));
285
0
    memset(&(s->s3->rrec), 0, sizeof(SSL3_RECORD));
286
287
0
    if (!ssl3_setup_buffers(s)) {
288
0
        SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
289
0
        if (rdata->rbuf.buf != NULL)
290
0
            OPENSSL_free(rdata->rbuf.buf);
291
0
        OPENSSL_free(rdata);
292
0
        pitem_free(item);
293
0
        return (-1);
294
0
    }
295
296
    /* insert should not fail, since duplicates are dropped */
297
0
    if (pqueue_insert(queue->q, item) == NULL) {
298
0
        SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR);
299
0
        if (rdata->rbuf.buf != NULL)
300
0
            OPENSSL_free(rdata->rbuf.buf);
301
0
        OPENSSL_free(rdata);
302
0
        pitem_free(item);
303
0
        return (-1);
304
0
    }
305
306
0
    return (1);
307
0
}
308
309
static int dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue)
310
0
{
311
0
    pitem *item;
312
313
0
    item = pqueue_pop(queue->q);
314
0
    if (item) {
315
0
        dtls1_copy_record(s, item);
316
317
0
        OPENSSL_free(item->data);
318
0
        pitem_free(item);
319
320
0
        return (1);
321
0
    }
322
323
0
    return (0);
324
0
}
325
326
/*
327
 * retrieve a buffered record that belongs to the new epoch, i.e., not
328
 * processed yet
329
 */
330
#define dtls1_get_unprocessed_record(s) \
331
0
                   dtls1_retrieve_buffered_record((s), \
332
0
                   &((s)->d1->unprocessed_rcds))
333
334
/*
335
 * retrieve a buffered record that belongs to the current epoch, ie,
336
 * processed
337
 */
338
#define dtls1_get_processed_record(s) \
339
0
                   dtls1_retrieve_buffered_record((s), \
340
0
                   &((s)->d1->processed_rcds))
341
342
static int dtls1_process_buffered_records(SSL *s)
343
0
{
344
0
    pitem *item;
345
0
    SSL3_BUFFER *rb;
346
0
    SSL3_RECORD *rr;
347
0
    DTLS1_BITMAP *bitmap;
348
0
    unsigned int is_next_epoch;
349
0
    int replayok = 1;
350
351
0
    item = pqueue_peek(s->d1->unprocessed_rcds.q);
352
0
    if (item) {
353
        /* Check if epoch is current. */
354
0
        if (s->d1->unprocessed_rcds.epoch != s->d1->r_epoch)
355
0
            return 1;         /* Nothing to do. */
356
357
0
        rr = &s->s3->rrec;
358
0
        rb = &s->s3->rbuf;
359
360
0
        if (rb->left > 0) {
361
            /*
362
             * We've still got data from the current packet to read. There could
363
             * be a record from the new epoch in it - so don't overwrite it
364
             * with the unprocessed records yet (we'll do it when we've
365
             * finished reading the current packet).
366
             */
367
0
            return 1;
368
0
        }
369
370
371
        /* Process all the records. */
372
0
        while (pqueue_peek(s->d1->unprocessed_rcds.q)) {
373
0
            dtls1_get_unprocessed_record(s);
374
0
            bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch);
375
0
            if (bitmap == NULL) {
376
                /*
377
                 * Should not happen. This will only ever be NULL when the
378
                 * current record is from a different epoch. But that cannot
379
                 * be the case because we already checked the epoch above
380
                 */
381
0
                 SSLerr(SSL_F_DTLS1_PROCESS_BUFFERED_RECORDS,
382
0
                        ERR_R_INTERNAL_ERROR);
383
0
                 return 0;
384
0
            }
385
#ifndef OPENSSL_NO_SCTP
386
            /* Only do replay check if no SCTP bio */
387
            if (!BIO_dgram_is_sctp(SSL_get_rbio(s)))
388
#endif
389
0
            {
390
                /*
391
                 * Check whether this is a repeat, or aged record. We did this
392
                 * check once already when we first received the record - but
393
                 * we might have updated the window since then due to
394
                 * records we subsequently processed.
395
                 */
396
0
                replayok = dtls1_record_replay_check(s, bitmap);
397
0
            }
398
399
0
            if (!replayok || !dtls1_process_record(s, bitmap)) {
400
                /* dump this record */
401
0
                rr->length = 0;
402
0
                s->packet_length = 0;
403
0
                continue;
404
0
            }
405
406
0
            if (dtls1_buffer_record(s, &(s->d1->processed_rcds),
407
0
                                    s->s3->rrec.seq_num) < 0)
408
0
                return 0;
409
0
        }
410
0
    }
411
412
    /*
413
     * sync epoch numbers once all the unprocessed records have been
414
     * processed
415
     */
416
0
    s->d1->processed_rcds.epoch = s->d1->r_epoch;
417
0
    s->d1->unprocessed_rcds.epoch = s->d1->r_epoch + 1;
418
419
0
    return 1;
420
0
}
421
422
#if 0
423
424
static int dtls1_get_buffered_record(SSL *s)
425
{
426
    pitem *item;
427
    PQ_64BIT priority =
428
        (((PQ_64BIT) s->d1->handshake_read_seq) << 32) |
429
        ((PQ_64BIT) s->d1->r_msg_hdr.frag_off);
430
431
    /* if we're not (re)negotiating, nothing buffered */
432
    if (!SSL_in_init(s))
433
        return 0;
434
435
    item = pqueue_peek(s->d1->rcvd_records);
436
    if (item && item->priority == priority) {
437
        /*
438
         * Check if we've received the record of interest.  It must be a
439
         * handshake record, since data records as passed up without
440
         * buffering
441
         */
442
        DTLS1_RECORD_DATA *rdata;
443
        item = pqueue_pop(s->d1->rcvd_records);
444
        rdata = (DTLS1_RECORD_DATA *)item->data;
445
446
        if (s->s3->rbuf.buf != NULL)
447
            OPENSSL_free(s->s3->rbuf.buf);
448
449
        s->packet = rdata->packet;
450
        s->packet_length = rdata->packet_length;
451
        memcpy(&(s->s3->rbuf), &(rdata->rbuf), sizeof(SSL3_BUFFER));
452
        memcpy(&(s->s3->rrec), &(rdata->rrec), sizeof(SSL3_RECORD));
453
454
        OPENSSL_free(item->data);
455
        pitem_free(item);
456
457
        /* s->d1->next_expected_seq_num++; */
458
        return (1);
459
    }
460
461
    return 0;
462
}
463
464
#endif
465
466
static int dtls1_process_record(SSL *s, DTLS1_BITMAP *bitmap)
467
0
{
468
0
    int i, al;
469
0
    int enc_err;
470
0
    SSL_SESSION *sess;
471
0
    SSL3_RECORD *rr;
472
0
    unsigned int mac_size, orig_len;
473
0
    unsigned char md[EVP_MAX_MD_SIZE];
474
475
0
    rr = &(s->s3->rrec);
476
0
    sess = s->session;
477
478
    /*
479
     * At this point, s->packet_length == SSL3_RT_HEADER_LNGTH + rr->length,
480
     * and we have that many bytes in s->packet
481
     */
482
0
    rr->input = &(s->packet[DTLS1_RT_HEADER_LENGTH]);
483
484
    /*
485
     * ok, we can now read from 's->packet' data into 'rr' rr->input points
486
     * at rr->length bytes, which need to be copied into rr->data by either
487
     * the decryption or by the decompression When the data is 'copied' into
488
     * the rr->data buffer, rr->input will be pointed at the new buffer
489
     */
490
491
    /*
492
     * We now have - encrypted [ MAC [ compressed [ plain ] ] ] rr->length
493
     * bytes of encrypted compressed stuff.
494
     */
495
496
    /* check is not needed I believe */
497
0
    if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) {
498
0
        al = SSL_AD_RECORD_OVERFLOW;
499
0
        SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
500
0
        goto f_err;
501
0
    }
502
503
    /* decrypt in place in 'rr->input' */
504
0
    rr->data = rr->input;
505
506
0
    enc_err = s->method->ssl3_enc->enc(s, 0);
507
    /*-
508
     * enc_err is:
509
     *    0: (in non-constant time) if the record is publically invalid.
510
     *    1: if the padding is valid
511
     *   -1: if the padding is invalid
512
     */
513
0
    if (enc_err == 0) {
514
        /* For DTLS we simply ignore bad packets. */
515
0
        rr->length = 0;
516
0
        s->packet_length = 0;
517
0
        goto err;
518
0
    }
519
#ifdef TLS_DEBUG
520
    printf("dec %d\n", rr->length);
521
    {
522
        unsigned int z;
523
        for (z = 0; z < rr->length; z++)
524
            printf("%02X%c", rr->data[z], ((z + 1) % 16) ? ' ' : '\n');
525
    }
526
    printf("\n");
527
#endif
528
529
    /* r->length is now the compressed data plus mac */
530
0
    if ((sess != NULL) &&
531
0
        (s->enc_read_ctx != NULL) && (EVP_MD_CTX_md(s->read_hash) != NULL)) {
532
        /* s->read_hash != NULL => mac_size != -1 */
533
0
        unsigned char *mac = NULL;
534
0
        unsigned char mac_tmp[EVP_MAX_MD_SIZE];
535
0
        mac_size = EVP_MD_CTX_size(s->read_hash);
536
0
        OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
537
538
        /*
539
         * kludge: *_cbc_remove_padding passes padding length in rr->type
540
         */
541
0
        orig_len = rr->length + ((unsigned int)rr->type >> 8);
542
543
        /*
544
         * orig_len is the length of the record before any padding was
545
         * removed. This is public information, as is the MAC in use,
546
         * therefore we can safely process the record in a different amount
547
         * of time if it's too short to possibly contain a MAC.
548
         */
549
0
        if (orig_len < mac_size ||
550
            /* CBC records must have a padding length byte too. */
551
0
            (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
552
0
             orig_len < mac_size + 1)) {
553
0
            al = SSL_AD_DECODE_ERROR;
554
0
            SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_LENGTH_TOO_SHORT);
555
0
            goto f_err;
556
0
        }
557
558
0
        if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE) {
559
            /*
560
             * We update the length so that the TLS header bytes can be
561
             * constructed correctly but we need to extract the MAC in
562
             * constant time from within the record, without leaking the
563
             * contents of the padding bytes.
564
             */
565
0
            mac = mac_tmp;
566
0
            ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len);
567
0
            rr->length -= mac_size;
568
0
        } else {
569
            /*
570
             * In this case there's no padding, so |orig_len| equals
571
             * |rec->length| and we checked that there's enough bytes for
572
             * |mac_size| above.
573
             */
574
0
            rr->length -= mac_size;
575
0
            mac = &rr->data[rr->length];
576
0
        }
577
578
0
        i = s->method->ssl3_enc->mac(s, md, 0 /* not send */ );
579
0
        if (i < 0 || mac == NULL
580
0
            || CRYPTO_memcmp(md, mac, (size_t)mac_size) != 0)
581
0
            enc_err = -1;
582
0
        if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH + mac_size)
583
0
            enc_err = -1;
584
0
    }
585
586
0
    if (enc_err < 0) {
587
        /* decryption failed, silently discard message */
588
0
        rr->length = 0;
589
0
        s->packet_length = 0;
590
0
        goto err;
591
0
    }
592
593
    /* r->length is now just compressed */
594
0
    if (s->expand != NULL) {
595
0
        if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH) {
596
0
            al = SSL_AD_RECORD_OVERFLOW;
597
0
            SSLerr(SSL_F_DTLS1_PROCESS_RECORD,
598
0
                   SSL_R_COMPRESSED_LENGTH_TOO_LONG);
599
0
            goto f_err;
600
0
        }
601
0
        if (!ssl3_do_uncompress(s)) {
602
0
            al = SSL_AD_DECOMPRESSION_FAILURE;
603
0
            SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_BAD_DECOMPRESSION);
604
0
            goto f_err;
605
0
        }
606
0
    }
607
608
0
    if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH) {
609
0
        al = SSL_AD_RECORD_OVERFLOW;
610
0
        SSLerr(SSL_F_DTLS1_PROCESS_RECORD, SSL_R_DATA_LENGTH_TOO_LONG);
611
0
        goto f_err;
612
0
    }
613
614
0
    rr->off = 0;
615
    /*-
616
     * So at this point the following is true
617
     * ssl->s3->rrec.type   is the type of record
618
     * ssl->s3->rrec.length == number of bytes in record
619
     * ssl->s3->rrec.off    == offset to first valid byte
620
     * ssl->s3->rrec.data   == where to take bytes from, increment
621
     *                         after use :-).
622
     */
623
624
    /* we have pulled in a full packet so zero things */
625
0
    s->packet_length = 0;
626
627
    /* Mark receipt of record. */
628
0
    dtls1_record_bitmap_update(s, bitmap);
629
630
0
    return (1);
631
632
0
 f_err:
633
0
    ssl3_send_alert(s, SSL3_AL_FATAL, al);
634
0
 err:
635
0
    return (0);
636
0
}
637
638
/*-
639
 * Call this to get a new input record.
640
 * It will return <= 0 if more data is needed, normally due to an error
641
 * or non-blocking IO.
642
 * When it finishes, one packet has been decoded and can be found in
643
 * ssl->s3->rrec.type    - is the type of record
644
 * ssl->s3->rrec.data,   - data
645
 * ssl->s3->rrec.length, - number of bytes
646
 */
647
/* used only by dtls1_read_bytes */
648
int dtls1_get_record(SSL *s)
649
0
{
650
0
    int ssl_major, ssl_minor;
651
0
    int i, n;
652
0
    SSL3_RECORD *rr;
653
0
    unsigned char *p = NULL;
654
0
    unsigned short version;
655
0
    DTLS1_BITMAP *bitmap;
656
0
    unsigned int is_next_epoch;
657
658
0
    rr = &(s->s3->rrec);
659
660
0
 again:
661
    /*
662
     * The epoch may have changed.  If so, process all the pending records.
663
     * This is a non-blocking operation.
664
     */
665
0
    if (!dtls1_process_buffered_records(s))
666
0
        return -1;
667
668
    /* if we're renegotiating, then there may be buffered records */
669
0
    if (dtls1_get_processed_record(s))
670
0
        return 1;
671
672
    /* get something from the wire */
673
    /* check if we have the header */
674
0
    if ((s->rstate != SSL_ST_READ_BODY) ||
675
0
        (s->packet_length < DTLS1_RT_HEADER_LENGTH)) {
676
0
        n = ssl3_read_n(s, DTLS1_RT_HEADER_LENGTH, s->s3->rbuf.len, 0);
677
        /* read timeout is handled by dtls1_read_bytes */
678
0
        if (n <= 0)
679
0
            return (n);         /* error or non-blocking */
680
681
        /* this packet contained a partial record, dump it */
682
0
        if (s->packet_length != DTLS1_RT_HEADER_LENGTH) {
683
0
            s->packet_length = 0;
684
0
            goto again;
685
0
        }
686
687
0
        s->rstate = SSL_ST_READ_BODY;
688
689
0
        p = s->packet;
690
691
0
        if (s->msg_callback)
692
0
            s->msg_callback(0, 0, SSL3_RT_HEADER, p, DTLS1_RT_HEADER_LENGTH,
693
0
                            s, s->msg_callback_arg);
694
695
        /* Pull apart the header into the DTLS1_RECORD */
696
0
        rr->type = *(p++);
697
0
        ssl_major = *(p++);
698
0
        ssl_minor = *(p++);
699
0
        version = (ssl_major << 8) | ssl_minor;
700
701
        /* sequence number is 64 bits, with top 2 bytes = epoch */
702
0
        n2s(p, rr->epoch);
703
704
0
        memcpy(&(s->s3->read_sequence[2]), p, 6);
705
0
        p += 6;
706
707
0
        n2s(p, rr->length);
708
709
        /* Lets check version */
710
0
        if (!s->first_packet) {
711
0
            if (version != s->version) {
712
                /* unexpected version, silently discard */
713
0
                rr->length = 0;
714
0
                s->packet_length = 0;
715
0
                goto again;
716
0
            }
717
0
        }
718
719
0
        if ((version & 0xff00) != (s->version & 0xff00)) {
720
            /* wrong version, silently discard record */
721
0
            rr->length = 0;
722
0
            s->packet_length = 0;
723
0
            goto again;
724
0
        }
725
726
0
        if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) {
727
            /* record too long, silently discard it */
728
0
            rr->length = 0;
729
0
            s->packet_length = 0;
730
0
            goto again;
731
0
        }
732
733
        /* now s->rstate == SSL_ST_READ_BODY */
734
0
    }
735
736
    /* s->rstate == SSL_ST_READ_BODY, get and decode the data */
737
738
0
    if (rr->length > s->packet_length - DTLS1_RT_HEADER_LENGTH) {
739
        /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
740
0
        i = rr->length;
741
0
        n = ssl3_read_n(s, i, i, 1);
742
        /* this packet contained a partial record, dump it */
743
0
        if (n != i) {
744
0
            rr->length = 0;
745
0
            s->packet_length = 0;
746
0
            goto again;
747
0
        }
748
749
        /*
750
         * now n == rr->length, and s->packet_length ==
751
         * DTLS1_RT_HEADER_LENGTH + rr->length
752
         */
753
0
    }
754
0
    s->rstate = SSL_ST_READ_HEADER; /* set state for later operations */
755
756
    /* match epochs.  NULL means the packet is dropped on the floor */
757
0
    bitmap = dtls1_get_bitmap(s, rr, &is_next_epoch);
758
0
    if (bitmap == NULL) {
759
0
        rr->length = 0;
760
0
        s->packet_length = 0;   /* dump this record */
761
0
        goto again;             /* get another record */
762
0
    }
763
#ifndef OPENSSL_NO_SCTP
764
    /* Only do replay check if no SCTP bio */
765
    if (!BIO_dgram_is_sctp(SSL_get_rbio(s))) {
766
#endif
767
        /*
768
         * Check whether this is a repeat, or aged record. Don't check if
769
         * we're listening and this message is a ClientHello. They can look
770
         * as if they're replayed, since they arrive from different
771
         * connections and would be dropped unnecessarily.
772
         */
773
0
        if (!(s->d1->listen && rr->type == SSL3_RT_HANDSHAKE &&
774
0
              s->packet_length > DTLS1_RT_HEADER_LENGTH &&
775
0
              s->packet[DTLS1_RT_HEADER_LENGTH] == SSL3_MT_CLIENT_HELLO) &&
776
0
            !dtls1_record_replay_check(s, bitmap)) {
777
0
            rr->length = 0;
778
0
            s->packet_length = 0; /* dump this record */
779
0
            goto again;         /* get another record */
780
0
        }
781
#ifndef OPENSSL_NO_SCTP
782
    }
783
#endif
784
785
    /* just read a 0 length packet */
786
0
    if (rr->length == 0)
787
0
        goto again;
788
789
    /*
790
     * If this record is from the next epoch (either HM or ALERT), and a
791
     * handshake is currently in progress, buffer it since it cannot be
792
     * processed at this time. However, do not buffer anything while
793
     * listening.
794
     */
795
0
    if (is_next_epoch) {
796
0
        if ((SSL_in_init(s) || s->in_handshake) && !s->d1->listen) {
797
0
            if (dtls1_buffer_record
798
0
                (s, &(s->d1->unprocessed_rcds), rr->seq_num) < 0)
799
0
                return -1;
800
0
        }
801
0
        rr->length = 0;
802
0
        s->packet_length = 0;
803
0
        goto again;
804
0
    }
805
806
0
    if (!dtls1_process_record(s, bitmap)) {
807
0
        rr->length = 0;
808
0
        s->packet_length = 0;   /* dump this record */
809
0
        goto again;             /* get another record */
810
0
    }
811
812
0
    return (1);
813
814
0
}
815
816
/*-
817
 * Return up to 'len' payload bytes received in 'type' records.
818
 * 'type' is one of the following:
819
 *
820
 *   -  SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
821
 *   -  SSL3_RT_APPLICATION_DATA (when ssl3_read calls us)
822
 *   -  0 (during a shutdown, no data has to be returned)
823
 *
824
 * If we don't have stored data to work from, read a SSL/TLS record first
825
 * (possibly multiple records if we still don't have anything to return).
826
 *
827
 * This function must handle any surprises the peer may have for us, such as
828
 * Alert records (e.g. close_notify), ChangeCipherSpec records (not really
829
 * a surprise, but handled as if it were), or renegotiation requests.
830
 * Also if record payloads contain fragments too small to process, we store
831
 * them until there is enough for the respective protocol (the record protocol
832
 * may use arbitrary fragmentation and even interleaving):
833
 *     Change cipher spec protocol
834
 *             just 1 byte needed, no need for keeping anything stored
835
 *     Alert protocol
836
 *             2 bytes needed (AlertLevel, AlertDescription)
837
 *     Handshake protocol
838
 *             4 bytes needed (HandshakeType, uint24 length) -- we just have
839
 *             to detect unexpected Client Hello and Hello Request messages
840
 *             here, anything else is handled by higher layers
841
 *     Application data protocol
842
 *             none of our business
843
 */
844
int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
845
0
{
846
0
    int al, i, j, ret;
847
0
    unsigned int n;
848
0
    SSL3_RECORD *rr;
849
0
    void (*cb) (const SSL *ssl, int type2, int val) = NULL;
850
851
0
    if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
852
0
        if (!ssl3_setup_buffers(s))
853
0
            return (-1);
854
855
    /* XXX: check what the second '&& type' is about */
856
0
    if ((type && (type != SSL3_RT_APPLICATION_DATA) &&
857
0
         (type != SSL3_RT_HANDSHAKE) && type) ||
858
0
        (peek && (type != SSL3_RT_APPLICATION_DATA))) {
859
0
        SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
860
0
        return -1;
861
0
    }
862
863
    /*
864
     * check whether there's a handshake message (client hello?) waiting
865
     */
866
0
    if ((ret = have_handshake_fragment(s, type, buf, len, peek)))
867
0
        return ret;
868
869
    /*
870
     * Now s->d1->handshake_fragment_len == 0 if type == SSL3_RT_HANDSHAKE.
871
     */
872
873
#ifndef OPENSSL_NO_SCTP
874
    /*
875
     * Continue handshake if it had to be interrupted to read app data with
876
     * SCTP.
877
     */
878
    if ((!s->in_handshake && SSL_in_init(s)) ||
879
        (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
880
         (s->state == DTLS1_SCTP_ST_SR_READ_SOCK
881
          || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)
882
         && s->s3->in_read_app_data != 2))
883
#else
884
0
    if (!s->in_handshake && SSL_in_init(s))
885
0
#endif
886
0
    {
887
        /* type == SSL3_RT_APPLICATION_DATA */
888
0
        i = s->handshake_func(s);
889
0
        if (i < 0)
890
0
            return (i);
891
0
        if (i == 0) {
892
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE);
893
0
            return (-1);
894
0
        }
895
0
    }
896
897
0
 start:
898
0
    s->rwstate = SSL_NOTHING;
899
900
    /*-
901
     * s->s3->rrec.type         - is the type of record
902
     * s->s3->rrec.data,    - data
903
     * s->s3->rrec.off,     - offset into 'data' for next read
904
     * s->s3->rrec.length,  - number of bytes.
905
     */
906
0
    rr = &(s->s3->rrec);
907
908
    /*
909
     * We are not handshaking and have no data yet, so process data buffered
910
     * during the last handshake in advance, if any.
911
     */
912
0
    if (s->state == SSL_ST_OK && rr->length == 0) {
913
0
        pitem *item;
914
0
        item = pqueue_pop(s->d1->buffered_app_data.q);
915
0
        if (item) {
916
#ifndef OPENSSL_NO_SCTP
917
            /* Restore bio_dgram_sctp_rcvinfo struct */
918
            if (BIO_dgram_is_sctp(SSL_get_rbio(s))) {
919
                DTLS1_RECORD_DATA *rdata = (DTLS1_RECORD_DATA *)item->data;
920
                BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SCTP_SET_RCVINFO,
921
                         sizeof(rdata->recordinfo), &rdata->recordinfo);
922
            }
923
#endif
924
925
0
            dtls1_copy_record(s, item);
926
927
0
            OPENSSL_free(item->data);
928
0
            pitem_free(item);
929
0
        }
930
0
    }
931
932
    /* Check for timeout */
933
0
    if (dtls1_handle_timeout(s) > 0)
934
0
        goto start;
935
936
    /* get new packet if necessary */
937
0
    if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) {
938
0
        ret = dtls1_get_record(s);
939
0
        if (ret <= 0) {
940
0
            ret = dtls1_read_failed(s, ret);
941
            /* anything other than a timeout is an error */
942
0
            if (ret <= 0)
943
0
                return (ret);
944
0
            else
945
0
                goto start;
946
0
        }
947
0
    }
948
949
0
    if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE) {
950
0
        rr->length = 0;
951
0
        goto start;
952
0
    }
953
954
    /*
955
     * Reset the count of consecutive warning alerts if we've got a non-empty
956
     * record that isn't an alert.
957
     */
958
0
    if (rr->type != SSL3_RT_ALERT && rr->length != 0)
959
0
        s->cert->alert_count = 0;
960
961
    /* we now have a packet which can be read and processed */
962
963
0
    if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec,
964
                                   * reset by ssl3_get_finished */
965
0
        && (rr->type != SSL3_RT_HANDSHAKE)) {
966
        /*
967
         * We now have application data between CCS and Finished. Most likely
968
         * the packets were reordered on their way, so buffer the application
969
         * data for later processing rather than dropping the connection.
970
         */
971
0
        if (dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num) <
972
0
            0) {
973
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
974
0
            return -1;
975
0
        }
976
0
        rr->length = 0;
977
0
        goto start;
978
0
    }
979
980
    /*
981
     * If the other end has shut down, throw anything we read away (even in
982
     * 'peek' mode)
983
     */
984
0
    if (s->shutdown & SSL_RECEIVED_SHUTDOWN) {
985
0
        rr->length = 0;
986
0
        s->rwstate = SSL_NOTHING;
987
0
        return (0);
988
0
    }
989
990
0
    if (type == rr->type) {     /* SSL3_RT_APPLICATION_DATA or
991
                                 * SSL3_RT_HANDSHAKE */
992
        /*
993
         * make sure that we are not getting application data when we are
994
         * doing a handshake for the first time
995
         */
996
0
        if (SSL_in_init(s) && (type == SSL3_RT_APPLICATION_DATA) &&
997
0
            (s->enc_read_ctx == NULL)) {
998
0
            al = SSL_AD_UNEXPECTED_MESSAGE;
999
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_APP_DATA_IN_HANDSHAKE);
1000
0
            goto f_err;
1001
0
        }
1002
1003
0
        if (len <= 0)
1004
0
            return (len);
1005
1006
0
        if ((unsigned int)len > rr->length)
1007
0
            n = rr->length;
1008
0
        else
1009
0
            n = (unsigned int)len;
1010
1011
0
        memcpy(buf, &(rr->data[rr->off]), n);
1012
0
        if (!peek) {
1013
0
            rr->length -= n;
1014
0
            rr->off += n;
1015
0
            if (rr->length == 0) {
1016
0
                s->rstate = SSL_ST_READ_HEADER;
1017
0
                rr->off = 0;
1018
0
            }
1019
0
        }
1020
#ifndef OPENSSL_NO_SCTP
1021
        /*
1022
         * We were about to renegotiate but had to read belated application
1023
         * data first, so retry.
1024
         */
1025
        if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
1026
            rr->type == SSL3_RT_APPLICATION_DATA &&
1027
            (s->state == DTLS1_SCTP_ST_SR_READ_SOCK
1028
             || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)) {
1029
            s->rwstate = SSL_READING;
1030
            BIO_clear_retry_flags(SSL_get_rbio(s));
1031
            BIO_set_retry_read(SSL_get_rbio(s));
1032
        }
1033
1034
        /*
1035
         * We might had to delay a close_notify alert because of reordered
1036
         * app data. If there was an alert and there is no message to read
1037
         * anymore, finally set shutdown.
1038
         */
1039
        if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
1040
            s->d1->shutdown_received
1041
            && !BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
1042
            s->shutdown |= SSL_RECEIVED_SHUTDOWN;
1043
            return (0);
1044
        }
1045
#endif
1046
0
        return (n);
1047
0
    }
1048
1049
    /*
1050
     * If we get here, then type != rr->type; if we have a handshake message,
1051
     * then it was unexpected (Hello Request or Client Hello).
1052
     */
1053
1054
    /*
1055
     * In case of record types for which we have 'fragment' storage, fill
1056
     * that so that we can process the data at a fixed place.
1057
     */
1058
0
    {
1059
0
        unsigned int k, dest_maxlen = 0;
1060
0
        unsigned char *dest = NULL;
1061
0
        unsigned int *dest_len = NULL;
1062
1063
0
        if (rr->type == SSL3_RT_HANDSHAKE) {
1064
0
            dest_maxlen = sizeof s->d1->handshake_fragment;
1065
0
            dest = s->d1->handshake_fragment;
1066
0
            dest_len = &s->d1->handshake_fragment_len;
1067
0
        } else if (rr->type == SSL3_RT_ALERT) {
1068
0
            dest_maxlen = sizeof(s->d1->alert_fragment);
1069
0
            dest = s->d1->alert_fragment;
1070
0
            dest_len = &s->d1->alert_fragment_len;
1071
0
        }
1072
0
#ifndef OPENSSL_NO_HEARTBEATS
1073
0
        else if (rr->type == TLS1_RT_HEARTBEAT) {
1074
0
            dtls1_process_heartbeat(s);
1075
1076
            /* Exit and notify application to read again */
1077
0
            rr->length = 0;
1078
0
            s->rwstate = SSL_READING;
1079
0
            BIO_clear_retry_flags(SSL_get_rbio(s));
1080
0
            BIO_set_retry_read(SSL_get_rbio(s));
1081
0
            return (-1);
1082
0
        }
1083
0
#endif
1084
        /* else it's a CCS message, or application data or wrong */
1085
0
        else if (rr->type != SSL3_RT_CHANGE_CIPHER_SPEC) {
1086
            /*
1087
             * Application data while renegotiating is allowed. Try again
1088
             * reading.
1089
             */
1090
0
            if (rr->type == SSL3_RT_APPLICATION_DATA) {
1091
0
                BIO *bio;
1092
0
                s->s3->in_read_app_data = 2;
1093
0
                bio = SSL_get_rbio(s);
1094
0
                s->rwstate = SSL_READING;
1095
0
                BIO_clear_retry_flags(bio);
1096
0
                BIO_set_retry_read(bio);
1097
0
                return (-1);
1098
0
            }
1099
1100
            /* Not certain if this is the right error handling */
1101
0
            al = SSL_AD_UNEXPECTED_MESSAGE;
1102
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
1103
0
            goto f_err;
1104
0
        }
1105
1106
0
        if (dest_maxlen > 0) {
1107
            /*
1108
             * XDTLS: In a pathalogical case, the Client Hello may be
1109
             * fragmented--don't always expect dest_maxlen bytes
1110
             */
1111
0
            if (rr->length < dest_maxlen) {
1112
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1113
                /*
1114
                 * for normal alerts rr->length is 2, while
1115
                 * dest_maxlen is 7 if we were to handle this
1116
                 * non-existing alert...
1117
                 */
1118
                FIX ME
1119
#endif
1120
0
                 s->rstate = SSL_ST_READ_HEADER;
1121
0
                rr->length = 0;
1122
0
                goto start;
1123
0
            }
1124
1125
            /* now move 'n' bytes: */
1126
0
            for (k = 0; k < dest_maxlen; k++) {
1127
0
                dest[k] = rr->data[rr->off++];
1128
0
                rr->length--;
1129
0
            }
1130
0
            *dest_len = dest_maxlen;
1131
0
        }
1132
0
    }
1133
1134
    /*-
1135
     * s->d1->handshake_fragment_len == 12  iff  rr->type == SSL3_RT_HANDSHAKE;
1136
     * s->d1->alert_fragment_len == 7      iff  rr->type == SSL3_RT_ALERT.
1137
     * (Possibly rr is 'empty' now, i.e. rr->length may be 0.)
1138
     */
1139
1140
    /* If we are a client, check for an incoming 'Hello Request': */
1141
0
    if ((!s->server) &&
1142
0
        (s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) &&
1143
0
        (s->d1->handshake_fragment[0] == SSL3_MT_HELLO_REQUEST) &&
1144
0
        (s->session != NULL) && (s->session->cipher != NULL)) {
1145
0
        s->d1->handshake_fragment_len = 0;
1146
1147
0
        if ((s->d1->handshake_fragment[1] != 0) ||
1148
0
            (s->d1->handshake_fragment[2] != 0) ||
1149
0
            (s->d1->handshake_fragment[3] != 0)) {
1150
0
            al = SSL_AD_DECODE_ERROR;
1151
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_BAD_HELLO_REQUEST);
1152
0
            goto f_err;
1153
0
        }
1154
1155
        /*
1156
         * no need to check sequence number on HELLO REQUEST messages
1157
         */
1158
1159
0
        if (s->msg_callback)
1160
0
            s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
1161
0
                            s->d1->handshake_fragment, 4, s,
1162
0
                            s->msg_callback_arg);
1163
1164
0
        if (SSL_is_init_finished(s) &&
1165
0
            !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
1166
0
            !s->s3->renegotiate) {
1167
0
            s->d1->handshake_read_seq++;
1168
0
            s->new_session = 1;
1169
0
            ssl3_renegotiate(s);
1170
0
            if (ssl3_renegotiate_check(s)) {
1171
0
                i = s->handshake_func(s);
1172
0
                if (i < 0)
1173
0
                    return (i);
1174
0
                if (i == 0) {
1175
0
                    SSLerr(SSL_F_DTLS1_READ_BYTES,
1176
0
                           SSL_R_SSL_HANDSHAKE_FAILURE);
1177
0
                    return (-1);
1178
0
                }
1179
1180
0
                if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
1181
0
                    if (s->s3->rbuf.left == 0) { /* no read-ahead left? */
1182
0
                        BIO *bio;
1183
                        /*
1184
                         * In the case where we try to read application data,
1185
                         * but we trigger an SSL handshake, we return -1 with
1186
                         * the retry option set.  Otherwise renegotiation may
1187
                         * cause nasty problems in the blocking world
1188
                         */
1189
0
                        s->rwstate = SSL_READING;
1190
0
                        bio = SSL_get_rbio(s);
1191
0
                        BIO_clear_retry_flags(bio);
1192
0
                        BIO_set_retry_read(bio);
1193
0
                        return (-1);
1194
0
                    }
1195
0
                }
1196
0
            }
1197
0
        }
1198
        /*
1199
         * we either finished a handshake or ignored the request, now try
1200
         * again to obtain the (application) data we were asked for
1201
         */
1202
0
        goto start;
1203
0
    }
1204
1205
0
    if (s->d1->alert_fragment_len >= DTLS1_AL_HEADER_LENGTH) {
1206
0
        int alert_level = s->d1->alert_fragment[0];
1207
0
        int alert_descr = s->d1->alert_fragment[1];
1208
1209
0
        s->d1->alert_fragment_len = 0;
1210
1211
0
        if (s->msg_callback)
1212
0
            s->msg_callback(0, s->version, SSL3_RT_ALERT,
1213
0
                            s->d1->alert_fragment, 2, s, s->msg_callback_arg);
1214
1215
0
        if (s->info_callback != NULL)
1216
0
            cb = s->info_callback;
1217
0
        else if (s->ctx->info_callback != NULL)
1218
0
            cb = s->ctx->info_callback;
1219
1220
0
        if (cb != NULL) {
1221
0
            j = (alert_level << 8) | alert_descr;
1222
0
            cb(s, SSL_CB_READ_ALERT, j);
1223
0
        }
1224
1225
0
        if (alert_level == SSL3_AL_WARNING) {
1226
0
            s->s3->warn_alert = alert_descr;
1227
1228
0
            s->cert->alert_count++;
1229
0
            if (s->cert->alert_count == MAX_WARN_ALERT_COUNT) {
1230
0
                al = SSL_AD_UNEXPECTED_MESSAGE;
1231
0
                SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_TOO_MANY_WARN_ALERTS);
1232
0
                goto f_err;
1233
0
            }
1234
1235
0
            if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
1236
#ifndef OPENSSL_NO_SCTP
1237
                /*
1238
                 * With SCTP and streams the socket may deliver app data
1239
                 * after a close_notify alert. We have to check this first so
1240
                 * that nothing gets discarded.
1241
                 */
1242
                if (BIO_dgram_is_sctp(SSL_get_rbio(s)) &&
1243
                    BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
1244
                    s->d1->shutdown_received = 1;
1245
                    s->rwstate = SSL_READING;
1246
                    BIO_clear_retry_flags(SSL_get_rbio(s));
1247
                    BIO_set_retry_read(SSL_get_rbio(s));
1248
                    return -1;
1249
                }
1250
#endif
1251
0
                s->shutdown |= SSL_RECEIVED_SHUTDOWN;
1252
0
                return (0);
1253
0
            }
1254
#if 0
1255
            /* XXX: this is a possible improvement in the future */
1256
            /* now check if it's a missing record */
1257
            if (alert_descr == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) {
1258
                unsigned short seq;
1259
                unsigned int frag_off;
1260
                unsigned char *p = &(s->d1->alert_fragment[2]);
1261
1262
                n2s(p, seq);
1263
                n2l3(p, frag_off);
1264
1265
                dtls1_retransmit_message(s,
1266
                                         dtls1_get_queue_priority
1267
                                         (frag->msg_header.seq, 0), frag_off,
1268
                                         &found);
1269
                if (!found && SSL_in_init(s)) {
1270
                    /*
1271
                     * fprintf( stderr,"in init = %d\n", SSL_in_init(s));
1272
                     */
1273
                    /*
1274
                     * requested a message not yet sent, send an alert
1275
                     * ourselves
1276
                     */
1277
                    ssl3_send_alert(s, SSL3_AL_WARNING,
1278
                                    DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
1279
                }
1280
            }
1281
#endif
1282
0
        } else if (alert_level == SSL3_AL_FATAL) {
1283
0
            char tmp[16];
1284
1285
0
            s->rwstate = SSL_NOTHING;
1286
0
            s->s3->fatal_alert = alert_descr;
1287
0
            SSLerr(SSL_F_DTLS1_READ_BYTES,
1288
0
                   SSL_AD_REASON_OFFSET + alert_descr);
1289
0
            BIO_snprintf(tmp, sizeof tmp, "%d", alert_descr);
1290
0
            ERR_add_error_data(2, "SSL alert number ", tmp);
1291
0
            s->shutdown |= SSL_RECEIVED_SHUTDOWN;
1292
0
            SSL_CTX_remove_session(s->session_ctx, s->session);
1293
0
            return (0);
1294
0
        } else {
1295
0
            al = SSL_AD_ILLEGAL_PARAMETER;
1296
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNKNOWN_ALERT_TYPE);
1297
0
            goto f_err;
1298
0
        }
1299
1300
0
        goto start;
1301
0
    }
1302
1303
0
    if (s->shutdown & SSL_SENT_SHUTDOWN) { /* but we have not received a
1304
                                            * shutdown */
1305
0
        s->rwstate = SSL_NOTHING;
1306
0
        rr->length = 0;
1307
0
        return (0);
1308
0
    }
1309
1310
0
    if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) {
1311
0
        struct ccs_header_st ccs_hdr;
1312
0
        unsigned int ccs_hdr_len = DTLS1_CCS_HEADER_LENGTH;
1313
1314
0
        dtls1_get_ccs_header(rr->data, &ccs_hdr);
1315
1316
0
        if (s->version == DTLS1_BAD_VER)
1317
0
            ccs_hdr_len = 3;
1318
1319
        /*
1320
         * 'Change Cipher Spec' is just a single byte, so we know exactly
1321
         * what the record payload has to look like
1322
         */
1323
        /* XDTLS: check that epoch is consistent */
1324
0
        if ((rr->length != ccs_hdr_len) ||
1325
0
            (rr->off != 0) || (rr->data[0] != SSL3_MT_CCS)) {
1326
0
            al = SSL_AD_ILLEGAL_PARAMETER;
1327
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_BAD_CHANGE_CIPHER_SPEC);
1328
0
            goto f_err;
1329
0
        }
1330
1331
0
        rr->length = 0;
1332
1333
0
        if (s->msg_callback)
1334
0
            s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC,
1335
0
                            rr->data, 1, s, s->msg_callback_arg);
1336
1337
        /*
1338
         * We can't process a CCS now, because previous handshake messages
1339
         * are still missing, so just drop it.
1340
         */
1341
0
        if (!s->d1->change_cipher_spec_ok) {
1342
0
            goto start;
1343
0
        }
1344
1345
0
        s->d1->change_cipher_spec_ok = 0;
1346
1347
0
        s->s3->change_cipher_spec = 1;
1348
0
        if (!ssl3_do_change_cipher_spec(s))
1349
0
            goto err;
1350
1351
        /* do this whenever CCS is processed */
1352
0
        dtls1_reset_seq_numbers(s, SSL3_CC_READ);
1353
1354
0
        if (s->version == DTLS1_BAD_VER)
1355
0
            s->d1->handshake_read_seq++;
1356
1357
#ifndef OPENSSL_NO_SCTP
1358
        /*
1359
         * Remember that a CCS has been received, so that an old key of
1360
         * SCTP-Auth can be deleted when a CCS is sent. Will be ignored if no
1361
         * SCTP is used
1362
         */
1363
        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD, 1, NULL);
1364
#endif
1365
1366
0
        goto start;
1367
0
    }
1368
1369
    /*
1370
     * Unexpected handshake message (Client Hello, or protocol violation)
1371
     */
1372
0
    if ((s->d1->handshake_fragment_len >= DTLS1_HM_HEADER_LENGTH) &&
1373
0
        !s->in_handshake) {
1374
0
        struct hm_header_st msg_hdr;
1375
1376
        /* this may just be a stale retransmit */
1377
0
        dtls1_get_message_header(rr->data, &msg_hdr);
1378
0
        if (rr->epoch != s->d1->r_epoch) {
1379
0
            rr->length = 0;
1380
0
            goto start;
1381
0
        }
1382
1383
        /*
1384
         * If we are server, we may have a repeated FINISHED of the client
1385
         * here, then retransmit our CCS and FINISHED.
1386
         */
1387
0
        if (msg_hdr.type == SSL3_MT_FINISHED) {
1388
0
            if (dtls1_check_timeout_num(s) < 0)
1389
0
                return -1;
1390
1391
0
            dtls1_retransmit_buffered_messages(s);
1392
0
            rr->length = 0;
1393
0
            goto start;
1394
0
        }
1395
1396
0
        if (((s->state & SSL_ST_MASK) == SSL_ST_OK) &&
1397
0
            !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) {
1398
#if 0                           /* worked only because C operator preferences
1399
                                 * are not as expected (and because this is
1400
                                 * not really needed for clients except for
1401
                                 * detecting protocol violations): */
1402
            s->state = SSL_ST_BEFORE | (s->server)
1403
                ? SSL_ST_ACCEPT : SSL_ST_CONNECT;
1404
#else
1405
0
            s->state = s->server ? SSL_ST_ACCEPT : SSL_ST_CONNECT;
1406
0
#endif
1407
0
            s->renegotiate = 1;
1408
0
            s->new_session = 1;
1409
0
        }
1410
0
        i = s->handshake_func(s);
1411
0
        if (i < 0)
1412
0
            return (i);
1413
0
        if (i == 0) {
1414
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE);
1415
0
            return (-1);
1416
0
        }
1417
1418
0
        if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
1419
0
            if (s->s3->rbuf.left == 0) { /* no read-ahead left? */
1420
0
                BIO *bio;
1421
                /*
1422
                 * In the case where we try to read application data, but we
1423
                 * trigger an SSL handshake, we return -1 with the retry
1424
                 * option set.  Otherwise renegotiation may cause nasty
1425
                 * problems in the blocking world
1426
                 */
1427
0
                s->rwstate = SSL_READING;
1428
0
                bio = SSL_get_rbio(s);
1429
0
                BIO_clear_retry_flags(bio);
1430
0
                BIO_set_retry_read(bio);
1431
0
                return (-1);
1432
0
            }
1433
0
        }
1434
0
        goto start;
1435
0
    }
1436
1437
0
    switch (rr->type) {
1438
0
    default:
1439
0
#ifndef OPENSSL_NO_TLS
1440
        /* TLS just ignores unknown message types */
1441
0
        if (s->version == TLS1_VERSION) {
1442
0
            rr->length = 0;
1443
0
            goto start;
1444
0
        }
1445
0
#endif
1446
0
        al = SSL_AD_UNEXPECTED_MESSAGE;
1447
0
        SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
1448
0
        goto f_err;
1449
0
    case SSL3_RT_CHANGE_CIPHER_SPEC:
1450
0
    case SSL3_RT_ALERT:
1451
0
    case SSL3_RT_HANDSHAKE:
1452
        /*
1453
         * we already handled all of these, with the possible exception of
1454
         * SSL3_RT_HANDSHAKE when s->in_handshake is set, but that should not
1455
         * happen when type != rr->type
1456
         */
1457
0
        al = SSL_AD_UNEXPECTED_MESSAGE;
1458
0
        SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR);
1459
0
        goto f_err;
1460
0
    case SSL3_RT_APPLICATION_DATA:
1461
        /*
1462
         * At this point, we were expecting handshake data, but have
1463
         * application data.  If the library was running inside ssl3_read()
1464
         * (i.e. in_read_app_data is set) and it makes sense to read
1465
         * application data at this point (session renegotiation not yet
1466
         * started), we will indulge it.
1467
         */
1468
0
        if (s->s3->in_read_app_data &&
1469
0
            (s->s3->total_renegotiations != 0) &&
1470
0
            (((s->state & SSL_ST_CONNECT) &&
1471
0
              (s->state >= SSL3_ST_CW_CLNT_HELLO_A) &&
1472
0
              (s->state <= SSL3_ST_CR_SRVR_HELLO_A)
1473
0
             ) || ((s->state & SSL_ST_ACCEPT) &&
1474
0
                   (s->state <= SSL3_ST_SW_HELLO_REQ_A) &&
1475
0
                   (s->state >= SSL3_ST_SR_CLNT_HELLO_A)
1476
0
             )
1477
0
            )) {
1478
0
            s->s3->in_read_app_data = 2;
1479
0
            return (-1);
1480
0
        } else {
1481
0
            al = SSL_AD_UNEXPECTED_MESSAGE;
1482
0
            SSLerr(SSL_F_DTLS1_READ_BYTES, SSL_R_UNEXPECTED_RECORD);
1483
0
            goto f_err;
1484
0
        }
1485
0
    }
1486
    /* not reached */
1487
1488
0
 f_err:
1489
0
    ssl3_send_alert(s, SSL3_AL_FATAL, al);
1490
0
 err:
1491
0
    return (-1);
1492
0
}
1493
1494
int dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len)
1495
0
{
1496
0
    int i;
1497
1498
#ifndef OPENSSL_NO_SCTP
1499
    /*
1500
     * Check if we have to continue an interrupted handshake for reading
1501
     * belated app data with SCTP.
1502
     */
1503
    if ((SSL_in_init(s) && !s->in_handshake) ||
1504
        (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
1505
         (s->state == DTLS1_SCTP_ST_SR_READ_SOCK
1506
          || s->state == DTLS1_SCTP_ST_CR_READ_SOCK)))
1507
#else
1508
0
    if (SSL_in_init(s) && !s->in_handshake)
1509
0
#endif
1510
0
    {
1511
0
        i = s->handshake_func(s);
1512
0
        if (i < 0)
1513
0
            return (i);
1514
0
        if (i == 0) {
1515
0
            SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES,
1516
0
                   SSL_R_SSL_HANDSHAKE_FAILURE);
1517
0
            return -1;
1518
0
        }
1519
0
    }
1520
1521
0
    if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
1522
0
        SSLerr(SSL_F_DTLS1_WRITE_APP_DATA_BYTES, SSL_R_DTLS_MESSAGE_TOO_BIG);
1523
0
        return -1;
1524
0
    }
1525
1526
0
    i = dtls1_write_bytes(s, type, buf_, len);
1527
0
    return i;
1528
0
}
1529
1530
        /*
1531
         * this only happens when a client hello is received and a handshake
1532
         * is started.
1533
         */
1534
static int
1535
have_handshake_fragment(SSL *s, int type, unsigned char *buf,
1536
                        int len, int peek)
1537
0
{
1538
1539
0
    if ((type == SSL3_RT_HANDSHAKE) && (s->d1->handshake_fragment_len > 0))
1540
        /* (partially) satisfy request from storage */
1541
0
    {
1542
0
        unsigned char *src = s->d1->handshake_fragment;
1543
0
        unsigned char *dst = buf;
1544
0
        unsigned int k, n;
1545
1546
        /* peek == 0 */
1547
0
        n = 0;
1548
0
        while ((len > 0) && (s->d1->handshake_fragment_len > 0)) {
1549
0
            *dst++ = *src++;
1550
0
            len--;
1551
0
            s->d1->handshake_fragment_len--;
1552
0
            n++;
1553
0
        }
1554
        /* move any remaining fragment bytes: */
1555
0
        for (k = 0; k < s->d1->handshake_fragment_len; k++)
1556
0
            s->d1->handshake_fragment[k] = *src++;
1557
0
        return n;
1558
0
    }
1559
1560
0
    return 0;
1561
0
}
1562
1563
/*
1564
 * Call this to write data in records of type 'type' It will return <= 0 if
1565
 * not all data has been sent or non-blocking IO.
1566
 */
1567
int dtls1_write_bytes(SSL *s, int type, const void *buf, int len)
1568
0
{
1569
0
    int i;
1570
1571
0
    OPENSSL_assert(len <= SSL3_RT_MAX_PLAIN_LENGTH);
1572
0
    s->rwstate = SSL_NOTHING;
1573
0
    i = do_dtls1_write(s, type, buf, len, 0);
1574
0
    return i;
1575
0
}
1576
1577
int do_dtls1_write(SSL *s, int type, const unsigned char *buf,
1578
                   unsigned int len, int create_empty_fragment)
1579
0
{
1580
0
    unsigned char *p, *pseq;
1581
0
    int i, mac_size, clear = 0;
1582
0
    int prefix_len = 0;
1583
0
    int eivlen;
1584
0
    SSL3_RECORD *wr;
1585
0
    SSL3_BUFFER *wb;
1586
0
    SSL_SESSION *sess;
1587
1588
    /*
1589
     * first check if there is a SSL3_BUFFER still being written out.  This
1590
     * will happen with non blocking IO
1591
     */
1592
0
    if (s->s3->wbuf.left != 0) {
1593
0
        OPENSSL_assert(0);      /* XDTLS: want to see if we ever get here */
1594
0
        return (ssl3_write_pending(s, type, buf, len));
1595
0
    }
1596
1597
    /* If we have an alert to send, lets send it */
1598
0
    if (s->s3->alert_dispatch) {
1599
0
        i = s->method->ssl_dispatch_alert(s);
1600
0
        if (i <= 0)
1601
0
            return (i);
1602
        /* if it went, fall through and send more stuff */
1603
0
    }
1604
1605
0
    if (len == 0 && !create_empty_fragment)
1606
0
        return 0;
1607
1608
0
    wr = &(s->s3->wrec);
1609
0
    wb = &(s->s3->wbuf);
1610
0
    sess = s->session;
1611
1612
0
    if ((sess == NULL) ||
1613
0
        (s->enc_write_ctx == NULL) || (EVP_MD_CTX_md(s->write_hash) == NULL))
1614
0
        clear = 1;
1615
1616
0
    if (clear)
1617
0
        mac_size = 0;
1618
0
    else {
1619
0
        mac_size = EVP_MD_CTX_size(s->write_hash);
1620
0
        if (mac_size < 0)
1621
0
            goto err;
1622
0
    }
1623
1624
    /* DTLS implements explicit IV, so no need for empty fragments */
1625
#if 0
1626
    /*
1627
     * 'create_empty_fragment' is true only when this function calls itself
1628
     */
1629
    if (!clear && !create_empty_fragment && !s->s3->empty_fragment_done
1630
        && SSL_version(s) != DTLS1_VERSION && SSL_version(s) != DTLS1_BAD_VER)
1631
    {
1632
        /*
1633
         * countermeasure against known-IV weakness in CBC ciphersuites (see
1634
         * http://www.openssl.org/~bodo/tls-cbc.txt)
1635
         */
1636
1637
        if (s->s3->need_empty_fragments && type == SSL3_RT_APPLICATION_DATA) {
1638
            /*
1639
             * recursive function call with 'create_empty_fragment' set; this
1640
             * prepares and buffers the data for an empty fragment (these
1641
             * 'prefix_len' bytes are sent out later together with the actual
1642
             * payload)
1643
             */
1644
            prefix_len = s->method->do_ssl_write(s, type, buf, 0, 1);
1645
            if (prefix_len <= 0)
1646
                goto err;
1647
1648
            if (s->s3->wbuf.len <
1649
                (size_t)prefix_len + SSL3_RT_MAX_PACKET_SIZE) {
1650
                /* insufficient space */
1651
                SSLerr(SSL_F_DO_DTLS1_WRITE, ERR_R_INTERNAL_ERROR);
1652
                goto err;
1653
            }
1654
        }
1655
1656
        s->s3->empty_fragment_done = 1;
1657
    }
1658
#endif
1659
0
    p = wb->buf + prefix_len;
1660
1661
    /* write the header */
1662
1663
0
    *(p++) = type & 0xff;
1664
0
    wr->type = type;
1665
    /*
1666
     * Special case: for hello verify request, client version 1.0 and we
1667
     * haven't decided which version to use yet send back using version 1.0
1668
     * header: otherwise some clients will ignore it.
1669
     */
1670
0
    if (s->method->version == DTLS_ANY_VERSION) {
1671
0
        *(p++) = DTLS1_VERSION >> 8;
1672
0
        *(p++) = DTLS1_VERSION & 0xff;
1673
0
    } else {
1674
0
        *(p++) = s->version >> 8;
1675
0
        *(p++) = s->version & 0xff;
1676
0
    }
1677
1678
    /* field where we are to write out packet epoch, seq num and len */
1679
0
    pseq = p;
1680
0
    p += 10;
1681
1682
    /* Explicit IV length, block ciphers appropriate version flag */
1683
0
    if (s->enc_write_ctx) {
1684
0
        int mode = EVP_CIPHER_CTX_mode(s->enc_write_ctx);
1685
0
        if (mode == EVP_CIPH_CBC_MODE) {
1686
0
            eivlen = EVP_CIPHER_CTX_iv_length(s->enc_write_ctx);
1687
0
            if (eivlen <= 1)
1688
0
                eivlen = 0;
1689
0
        }
1690
        /* Need explicit part of IV for GCM mode */
1691
0
        else if (mode == EVP_CIPH_GCM_MODE)
1692
0
            eivlen = EVP_GCM_TLS_EXPLICIT_IV_LEN;
1693
0
        else
1694
0
            eivlen = 0;
1695
0
    } else
1696
0
        eivlen = 0;
1697
1698
    /* lets setup the record stuff. */
1699
0
    wr->data = p + eivlen;      /* make room for IV in case of CBC */
1700
0
    wr->length = (int)len;
1701
0
    wr->input = (unsigned char *)buf;
1702
1703
    /*
1704
     * we now 'read' from wr->input, wr->length bytes into wr->data
1705
     */
1706
1707
    /* first we compress */
1708
0
    if (s->compress != NULL) {
1709
0
        if (!ssl3_do_compress(s)) {
1710
0
            SSLerr(SSL_F_DO_DTLS1_WRITE, SSL_R_COMPRESSION_FAILURE);
1711
0
            goto err;
1712
0
        }
1713
0
    } else {
1714
0
        memcpy(wr->data, wr->input, wr->length);
1715
0
        wr->input = wr->data;
1716
0
    }
1717
1718
    /*
1719
     * we should still have the output to wr->data and the input from
1720
     * wr->input.  Length should be wr->length. wr->data still points in the
1721
     * wb->buf
1722
     */
1723
1724
0
    if (mac_size != 0) {
1725
0
        if (s->method->ssl3_enc->mac(s, &(p[wr->length + eivlen]), 1) < 0)
1726
0
            goto err;
1727
0
        wr->length += mac_size;
1728
0
    }
1729
1730
    /* this is true regardless of mac size */
1731
0
    wr->input = p;
1732
0
    wr->data = p;
1733
1734
0
    if (eivlen)
1735
0
        wr->length += eivlen;
1736
1737
0
    if (s->method->ssl3_enc->enc(s, 1) < 1)
1738
0
        goto err;
1739
1740
    /* record length after mac and block padding */
1741
    /*
1742
     * if (type == SSL3_RT_APPLICATION_DATA || (type == SSL3_RT_ALERT && !
1743
     * SSL_in_init(s)))
1744
     */
1745
1746
    /* there's only one epoch between handshake and app data */
1747
1748
0
    s2n(s->d1->w_epoch, pseq);
1749
1750
    /* XDTLS: ?? */
1751
    /*
1752
     * else s2n(s->d1->handshake_epoch, pseq);
1753
     */
1754
1755
0
    memcpy(pseq, &(s->s3->write_sequence[2]), 6);
1756
0
    pseq += 6;
1757
0
    s2n(wr->length, pseq);
1758
1759
0
    if (s->msg_callback)
1760
0
        s->msg_callback(1, 0, SSL3_RT_HEADER, pseq - DTLS1_RT_HEADER_LENGTH,
1761
0
                        DTLS1_RT_HEADER_LENGTH, s, s->msg_callback_arg);
1762
1763
    /*
1764
     * we should now have wr->data pointing to the encrypted data, which is
1765
     * wr->length long
1766
     */
1767
0
    wr->type = type;            /* not needed but helps for debugging */
1768
0
    wr->length += DTLS1_RT_HEADER_LENGTH;
1769
1770
#if 0                           /* this is now done at the message layer */
1771
    /* buffer the record, making it easy to handle retransmits */
1772
    if (type == SSL3_RT_HANDSHAKE || type == SSL3_RT_CHANGE_CIPHER_SPEC)
1773
        dtls1_buffer_record(s, wr->data, wr->length,
1774
                            *((PQ_64BIT *) & (s->s3->write_sequence[0])));
1775
#endif
1776
1777
0
    ssl3_record_sequence_update(&(s->s3->write_sequence[0]));
1778
1779
0
    if (create_empty_fragment) {
1780
        /*
1781
         * we are in a recursive call; just return the length, don't write
1782
         * out anything here
1783
         */
1784
0
        return wr->length;
1785
0
    }
1786
1787
    /* now let's set up wb */
1788
0
    wb->left = prefix_len + wr->length;
1789
0
    wb->offset = 0;
1790
1791
    /*
1792
     * memorize arguments so that ssl3_write_pending can detect bad write
1793
     * retries later
1794
     */
1795
0
    s->s3->wpend_tot = len;
1796
0
    s->s3->wpend_buf = buf;
1797
0
    s->s3->wpend_type = type;
1798
0
    s->s3->wpend_ret = len;
1799
1800
    /* we now just need to write the buffer */
1801
0
    return ssl3_write_pending(s, type, buf, len);
1802
0
 err:
1803
0
    return -1;
1804
0
}
1805
1806
static int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap)
1807
0
{
1808
0
    int cmp;
1809
0
    unsigned int shift;
1810
0
    const unsigned char *seq = s->s3->read_sequence;
1811
1812
0
    cmp = satsub64be(seq, bitmap->max_seq_num);
1813
0
    if (cmp > 0) {
1814
0
        memcpy(s->s3->rrec.seq_num, seq, 8);
1815
0
        return 1;               /* this record in new */
1816
0
    }
1817
0
    shift = -cmp;
1818
0
    if (shift >= sizeof(bitmap->map) * 8)
1819
0
        return 0;               /* stale, outside the window */
1820
0
    else if (bitmap->map & (1UL << shift))
1821
0
        return 0;               /* record previously received */
1822
1823
0
    memcpy(s->s3->rrec.seq_num, seq, 8);
1824
0
    return 1;
1825
0
}
1826
1827
static void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap)
1828
0
{
1829
0
    int cmp;
1830
0
    unsigned int shift;
1831
0
    const unsigned char *seq = s->s3->read_sequence;
1832
1833
0
    cmp = satsub64be(seq, bitmap->max_seq_num);
1834
0
    if (cmp > 0) {
1835
0
        shift = cmp;
1836
0
        if (shift < sizeof(bitmap->map) * 8)
1837
0
            bitmap->map <<= shift, bitmap->map |= 1UL;
1838
0
        else
1839
0
            bitmap->map = 1UL;
1840
0
        memcpy(bitmap->max_seq_num, seq, 8);
1841
0
    } else {
1842
0
        shift = -cmp;
1843
0
        if (shift < sizeof(bitmap->map) * 8)
1844
0
            bitmap->map |= 1UL << shift;
1845
0
    }
1846
0
}
1847
1848
int dtls1_dispatch_alert(SSL *s)
1849
0
{
1850
0
    int i, j;
1851
0
    void (*cb) (const SSL *ssl, int type, int val) = NULL;
1852
0
    unsigned char buf[DTLS1_AL_HEADER_LENGTH];
1853
0
    unsigned char *ptr = &buf[0];
1854
1855
0
    s->s3->alert_dispatch = 0;
1856
1857
0
    memset(buf, 0x00, sizeof(buf));
1858
0
    *ptr++ = s->s3->send_alert[0];
1859
0
    *ptr++ = s->s3->send_alert[1];
1860
1861
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1862
    if (s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE) {
1863
        s2n(s->d1->handshake_read_seq, ptr);
1864
# if 0
1865
        if (s->d1->r_msg_hdr.frag_off == 0)
1866
            /*
1867
             * waiting for a new msg
1868
             */
1869
            else
1870
            s2n(s->d1->r_msg_hdr.seq, ptr); /* partial msg read */
1871
# endif
1872
1873
# if 0
1874
        fprintf(stderr,
1875
                "s->d1->handshake_read_seq = %d, s->d1->r_msg_hdr.seq = %d\n",
1876
                s->d1->handshake_read_seq, s->d1->r_msg_hdr.seq);
1877
# endif
1878
        l2n3(s->d1->r_msg_hdr.frag_off, ptr);
1879
    }
1880
#endif
1881
1882
0
    i = do_dtls1_write(s, SSL3_RT_ALERT, &buf[0], sizeof(buf), 0);
1883
0
    if (i <= 0) {
1884
0
        s->s3->alert_dispatch = 1;
1885
        /* fprintf( stderr, "not done with alert\n" ); */
1886
0
    } else {
1887
0
        if (s->s3->send_alert[0] == SSL3_AL_FATAL
1888
#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1889
            || s->s3->send_alert[1] == DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
1890
#endif
1891
0
            )
1892
0
            (void)BIO_flush(s->wbio);
1893
1894
0
        if (s->msg_callback)
1895
0
            s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3->send_alert,
1896
0
                            2, s, s->msg_callback_arg);
1897
1898
0
        if (s->info_callback != NULL)
1899
0
            cb = s->info_callback;
1900
0
        else if (s->ctx->info_callback != NULL)
1901
0
            cb = s->ctx->info_callback;
1902
1903
0
        if (cb != NULL) {
1904
0
            j = (s->s3->send_alert[0] << 8) | s->s3->send_alert[1];
1905
0
            cb(s, SSL_CB_WRITE_ALERT, j);
1906
0
        }
1907
0
    }
1908
0
    return (i);
1909
0
}
1910
1911
static DTLS1_BITMAP *dtls1_get_bitmap(SSL *s, SSL3_RECORD *rr,
1912
                                      unsigned int *is_next_epoch)
1913
0
{
1914
1915
0
    *is_next_epoch = 0;
1916
1917
    /* In current epoch, accept HM, CCS, DATA, & ALERT */
1918
0
    if (rr->epoch == s->d1->r_epoch)
1919
0
        return &s->d1->bitmap;
1920
1921
    /*
1922
     * Only HM and ALERT messages can be from the next epoch and only if we
1923
     * have already processed all of the unprocessed records from the last
1924
     * epoch
1925
     */
1926
0
    else if (rr->epoch == (unsigned long)(s->d1->r_epoch + 1) &&
1927
0
             s->d1->unprocessed_rcds.epoch != s->d1->r_epoch &&
1928
0
             (rr->type == SSL3_RT_HANDSHAKE || rr->type == SSL3_RT_ALERT)) {
1929
0
        *is_next_epoch = 1;
1930
0
        return &s->d1->next_bitmap;
1931
0
    }
1932
1933
0
    return NULL;
1934
0
}
1935
1936
#if 0
1937
static int
1938
dtls1_record_needs_buffering(SSL *s, SSL3_RECORD *rr,
1939
                             unsigned short *priority, unsigned long *offset)
1940
{
1941
1942
    /* alerts are passed up immediately */
1943
    if (rr->type == SSL3_RT_APPLICATION_DATA || rr->type == SSL3_RT_ALERT)
1944
        return 0;
1945
1946
    /*
1947
     * Only need to buffer if a handshake is underway. (this implies that
1948
     * Hello Request and Client Hello are passed up immediately)
1949
     */
1950
    if (SSL_in_init(s)) {
1951
        unsigned char *data = rr->data;
1952
        /* need to extract the HM/CCS sequence number here */
1953
        if (rr->type == SSL3_RT_HANDSHAKE ||
1954
            rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) {
1955
            unsigned short seq_num;
1956
            struct hm_header_st msg_hdr;
1957
            struct ccs_header_st ccs_hdr;
1958
1959
            if (rr->type == SSL3_RT_HANDSHAKE) {
1960
                dtls1_get_message_header(data, &msg_hdr);
1961
                seq_num = msg_hdr.seq;
1962
                *offset = msg_hdr.frag_off;
1963
            } else {
1964
                dtls1_get_ccs_header(data, &ccs_hdr);
1965
                seq_num = ccs_hdr.seq;
1966
                *offset = 0;
1967
            }
1968
1969
            /*
1970
             * this is either a record we're waiting for, or a retransmit of
1971
             * something we happened to previously receive (higher layers
1972
             * will drop the repeat silently
1973
             */
1974
            if (seq_num < s->d1->handshake_read_seq)
1975
                return 0;
1976
            if (rr->type == SSL3_RT_HANDSHAKE &&
1977
                seq_num == s->d1->handshake_read_seq &&
1978
                msg_hdr.frag_off < s->d1->r_msg_hdr.frag_off)
1979
                return 0;
1980
            else if (seq_num == s->d1->handshake_read_seq &&
1981
                     (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC ||
1982
                      msg_hdr.frag_off == s->d1->r_msg_hdr.frag_off))
1983
                return 0;
1984
            else {
1985
                *priority = seq_num;
1986
                return 1;
1987
            }
1988
        } else                  /* unknown record type */
1989
            return 0;
1990
    }
1991
1992
    return 0;
1993
}
1994
#endif
1995
1996
void dtls1_reset_seq_numbers(SSL *s, int rw)
1997
0
{
1998
0
    unsigned char *seq;
1999
0
    unsigned int seq_bytes = sizeof(s->s3->read_sequence);
2000
2001
0
    if (rw & SSL3_CC_READ) {
2002
0
        seq = s->s3->read_sequence;
2003
0
        s->d1->r_epoch++;
2004
0
        memcpy(&(s->d1->bitmap), &(s->d1->next_bitmap), sizeof(DTLS1_BITMAP));
2005
0
        memset(&(s->d1->next_bitmap), 0x00, sizeof(DTLS1_BITMAP));
2006
2007
        /*
2008
         * We must not use any buffered messages received from the previous
2009
         * epoch
2010
         */
2011
0
        dtls1_clear_received_buffer(s);
2012
0
    } else {
2013
0
        seq = s->s3->write_sequence;
2014
0
        memcpy(s->d1->last_write_sequence, seq,
2015
0
               sizeof(s->s3->write_sequence));
2016
0
        s->d1->w_epoch++;
2017
0
    }
2018
2019
0
    memset(seq, 0x00, seq_bytes);
2020
0
}