LCOV - code coverage report
Current view: top level - third_party/openssl/ssl - d1_pkt.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 559 0.0 %
Date: 2015-10-10 Functions: 0 16 0.0 %

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

Generated by: LCOV version 1.10