1 /* ssl/d1_lib.c */
   2 /*
   3  * DTLS implementation written by Nagendra Modadugu
   4  * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
   5  */
   6 /* ====================================================================
   7  * Copyright (c) 1999-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 
  60 #include <stdio.h>
  61 #define USE_SOCKETS
  62 #include <openssl/objects.h>
  63 #include "ssl_locl.h"
  64 
  65 #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS)
  66 #include <sys/timeb.h>
  67 #endif
  68 
  69 static void get_current_time(struct timeval *t);
  70 const char dtls1_version_str[]="DTLSv1" OPENSSL_VERSION_PTEXT;
  71 int dtls1_listen(SSL *s, struct sockaddr *client);
  72 
  73 SSL3_ENC_METHOD DTLSv1_enc_data={
  74     dtls1_enc,
  75         tls1_mac,
  76         tls1_setup_key_block,
  77         tls1_generate_master_secret,
  78         tls1_change_cipher_state,
  79         tls1_final_finish_mac,
  80         TLS1_FINISH_MAC_LENGTH,
  81         tls1_cert_verify_mac,
  82         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
  83         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
  84         tls1_alert_code,
  85         tls1_export_keying_material,
  86         };
  87 
  88 long dtls1_default_timeout(void)
  89         {
  90         /* 2 hours, the 24 hours mentioned in the DTLSv1 spec
  91          * is way too long for http, the cache would over fill */
  92         return(60*60*2);
  93         }
  94 
  95 int dtls1_new(SSL *s)
  96         {
  97         DTLS1_STATE *d1;
  98 
  99         if (!ssl3_new(s)) return(0);
 100         if ((d1=OPENSSL_malloc(sizeof *d1)) == NULL) return (0);
 101         memset(d1,0, sizeof *d1);
 102 
 103         /* d1->handshake_epoch=0; */
 104 
 105         d1->unprocessed_rcds.q=pqueue_new();
 106         d1->processed_rcds.q=pqueue_new();
 107         d1->buffered_messages = pqueue_new();
 108         d1->sent_messages=pqueue_new();
 109         d1->buffered_app_data.q=pqueue_new();
 110 
 111         if ( s->server)
 112                 {
 113                 d1->cookie_len = sizeof(s->d1->cookie);
 114                 }
 115 
 116         if( ! d1->unprocessed_rcds.q || ! d1->processed_rcds.q
 117         || ! d1->buffered_messages || ! d1->sent_messages || ! d1->buffered_app_data.q)
 118                 {
 119         if ( d1->unprocessed_rcds.q) pqueue_free(d1->unprocessed_rcds.q);
 120         if ( d1->processed_rcds.q) pqueue_free(d1->processed_rcds.q);
 121         if ( d1->buffered_messages) pqueue_free(d1->buffered_messages);
 122                 if ( d1->sent_messages) pqueue_free(d1->sent_messages);
 123                 if ( d1->buffered_app_data.q) pqueue_free(d1->buffered_app_data.q);
 124                 OPENSSL_free(d1);
 125                 return (0);
 126                 }
 127 
 128         s->d1=d1;
 129         s->method->ssl_clear(s);
 130         return(1);
 131         }
 132 
 133 static void dtls1_clear_queues(SSL *s)
 134         {
 135     pitem *item = NULL;
 136     hm_fragment *frag = NULL;
 137         DTLS1_RECORD_DATA *rdata;
 138 
 139     while( (item = pqueue_pop(s->d1->unprocessed_rcds.q)) != NULL)
 140         {
 141                 rdata = (DTLS1_RECORD_DATA *) item->data;
 142                 if (rdata->rbuf.buf)
 143                         {
 144                         OPENSSL_free(rdata->rbuf.buf);
 145                         }
 146         OPENSSL_free(item->data);
 147         pitem_free(item);
 148         }
 149 
 150     while( (item = pqueue_pop(s->d1->processed_rcds.q)) != NULL)
 151         {
 152                 rdata = (DTLS1_RECORD_DATA *) item->data;
 153                 if (rdata->rbuf.buf)
 154                         {
 155                         OPENSSL_free(rdata->rbuf.buf);
 156                         }
 157         OPENSSL_free(item->data);
 158         pitem_free(item);
 159         }
 160 
 161     while( (item = pqueue_pop(s->d1->buffered_messages)) != NULL)
 162         {
 163         frag = (hm_fragment *)item->data;
 164         OPENSSL_free(frag->fragment);
 165         OPENSSL_free(frag);
 166         pitem_free(item);
 167         }
 168 
 169     while ( (item = pqueue_pop(s->d1->sent_messages)) != NULL)
 170         {
 171         frag = (hm_fragment *)item->data;
 172         OPENSSL_free(frag->fragment);
 173         OPENSSL_free(frag);
 174         pitem_free(item);
 175         }
 176 
 177         while ( (item = pqueue_pop(s->d1->buffered_app_data.q)) != NULL)
 178                 {
 179                 rdata = (DTLS1_RECORD_DATA *) item->data;
 180                 if (rdata->rbuf.buf)
 181                         {
 182                         OPENSSL_free(rdata->rbuf.buf);
 183                         }
 184                 OPENSSL_free(item->data);
 185                 pitem_free(item);
 186                 }
 187         }
 188 
 189 void dtls1_free(SSL *s)
 190         {
 191         ssl3_free(s);
 192 
 193         dtls1_clear_queues(s);
 194 
 195     pqueue_free(s->d1->unprocessed_rcds.q);
 196     pqueue_free(s->d1->processed_rcds.q);
 197     pqueue_free(s->d1->buffered_messages);
 198         pqueue_free(s->d1->sent_messages);
 199         pqueue_free(s->d1->buffered_app_data.q);
 200 
 201         OPENSSL_free(s->d1);
 202         s->d1 = NULL;
 203         }
 204 
 205 void dtls1_clear(SSL *s)
 206         {
 207     pqueue unprocessed_rcds;
 208     pqueue processed_rcds;
 209     pqueue buffered_messages;
 210         pqueue sent_messages;
 211         pqueue buffered_app_data;
 212         unsigned int mtu;
 213 
 214         if (s->d1)
 215                 {
 216                 unprocessed_rcds = s->d1->unprocessed_rcds.q;
 217                 processed_rcds = s->d1->processed_rcds.q;
 218                 buffered_messages = s->d1->buffered_messages;
 219                 sent_messages = s->d1->sent_messages;
 220                 buffered_app_data = s->d1->buffered_app_data.q;
 221                 mtu = s->d1->mtu;
 222 
 223                 dtls1_clear_queues(s);
 224 
 225                 memset(s->d1, 0, sizeof(*(s->d1)));
 226 
 227                 if (s->server)
 228                         {
 229                         s->d1->cookie_len = sizeof(s->d1->cookie);
 230                         }
 231 
 232                 if (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)
 233                         {
 234                         s->d1->mtu = mtu;
 235                         }
 236 
 237                 s->d1->unprocessed_rcds.q = unprocessed_rcds;
 238                 s->d1->processed_rcds.q = processed_rcds;
 239                 s->d1->buffered_messages = buffered_messages;
 240                 s->d1->sent_messages = sent_messages;
 241                 s->d1->buffered_app_data.q = buffered_app_data;
 242                 }
 243 
 244         ssl3_clear(s);
 245         if (s->options & SSL_OP_CISCO_ANYCONNECT)
 246                 s->version=DTLS1_BAD_VER;
 247         else
 248                 s->version=DTLS1_VERSION;
 249         }
 250 
 251 long dtls1_ctrl(SSL *s, int cmd, long larg, void *parg)
 252         {
 253         int ret=0;
 254 
 255         switch (cmd)
 256                 {
 257         case DTLS_CTRL_GET_TIMEOUT:
 258                 if (dtls1_get_timeout(s, (struct timeval*) parg) != NULL)
 259                         {
 260                         ret = 1;
 261                         }
 262                 break;
 263         case DTLS_CTRL_HANDLE_TIMEOUT:
 264                 ret = dtls1_handle_timeout(s);
 265                 break;
 266         case DTLS_CTRL_LISTEN:
 267                 ret = dtls1_listen(s, parg);
 268                 break;
 269 
 270         default:
 271                 ret = ssl3_ctrl(s, cmd, larg, parg);
 272                 break;
 273                 }
 274         return(ret);
 275         }
 276 
 277 /*
 278  * As it's impossible to use stream ciphers in "datagram" mode, this
 279  * simple filter is designed to disengage them in DTLS. Unfortunately
 280  * there is no universal way to identify stream SSL_CIPHER, so we have
 281  * to explicitly list their SSL_* codes. Currently RC4 is the only one
 282  * available, but if new ones emerge, they will have to be added...
 283  */
 284 const SSL_CIPHER *dtls1_get_cipher(unsigned int u)
 285         {
 286         const SSL_CIPHER *ciph = ssl3_get_cipher(u);
 287 
 288         if (ciph != NULL)
 289                 {
 290                 if (ciph->algorithm_enc == SSL_RC4)
 291                         return NULL;
 292                 }
 293 
 294         return ciph;
 295         }
 296 
 297 void dtls1_start_timer(SSL *s)
 298         {
 299 #ifndef OPENSSL_NO_SCTP
 300         /* Disable timer for SCTP */
 301         if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
 302                 {
 303                 memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
 304                 return;
 305                 }
 306 #endif
 307 
 308         /* If timer is not set, initialize duration with 1 second */
 309         if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0)
 310                 {
 311                 s->d1->timeout_duration = 1;
 312                 }
 313 
 314         /* Set timeout to current time */
 315         get_current_time(&(s->d1->next_timeout));
 316 
 317         /* Add duration to current time */
 318         s->d1->next_timeout.tv_sec += s->d1->timeout_duration;
 319         BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout));
 320         }
 321 
 322 struct timeval* dtls1_get_timeout(SSL *s, struct timeval* timeleft)
 323         {
 324         struct timeval timenow;
 325 
 326         /* If no timeout is set, just return NULL */
 327         if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0)
 328                 {
 329                 return NULL;
 330                 }
 331 
 332         /* Get current time */
 333         get_current_time(&timenow);
 334 
 335         /* If timer already expired, set remaining time to 0 */
 336         if (s->d1->next_timeout.tv_sec < timenow.tv_sec ||
 337                 (s->d1->next_timeout.tv_sec == timenow.tv_sec &&
 338                  s->d1->next_timeout.tv_usec <= timenow.tv_usec))
 339                 {
 340                 memset(timeleft, 0, sizeof(struct timeval));
 341                 return timeleft;
 342                 }
 343 
 344         /* Calculate time left until timer expires */
 345         memcpy(timeleft, &(s->d1->next_timeout), sizeof(struct timeval));
 346         timeleft->tv_sec -= timenow.tv_sec;
 347         timeleft->tv_usec -= timenow.tv_usec;
 348         if (timeleft->tv_usec < 0)
 349                 {
 350                 timeleft->tv_sec--;
 351                 timeleft->tv_usec += 1000000;
 352                 }
 353 
 354         /* If remaining time is less than 15 ms, set it to 0
 355          * to prevent issues because of small devergences with
 356          * socket timeouts.
 357          */
 358         if (timeleft->tv_sec == 0 && timeleft->tv_usec < 15000)
 359                 {
 360                 memset(timeleft, 0, sizeof(struct timeval));
 361                 }
 362 
 363 
 364         return timeleft;
 365         }
 366 
 367 int dtls1_is_timer_expired(SSL *s)
 368         {
 369         struct timeval timeleft;
 370 
 371         /* Get time left until timeout, return false if no timer running */
 372         if (dtls1_get_timeout(s, &timeleft) == NULL)
 373                 {
 374                 return 0;
 375                 }
 376 
 377         /* Return false if timer is not expired yet */
 378         if (timeleft.tv_sec > 0 || timeleft.tv_usec > 0)
 379                 {
 380                 return 0;
 381                 }
 382 
 383         /* Timer expired, so return true */
 384         return 1;
 385         }
 386 
 387 void dtls1_double_timeout(SSL *s)
 388         {
 389         s->d1->timeout_duration *= 2;
 390         if (s->d1->timeout_duration > 60)
 391                 s->d1->timeout_duration = 60;
 392         dtls1_start_timer(s);
 393         }
 394 
 395 void dtls1_stop_timer(SSL *s)
 396         {
 397         /* Reset everything */
 398         memset(&(s->d1->timeout), 0, sizeof(struct dtls1_timeout_st));
 399         memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
 400         s->d1->timeout_duration = 1;
 401         BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout));
 402         /* Clear retransmission buffer */
 403         dtls1_clear_record_buffer(s);
 404         }
 405 
 406 int dtls1_check_timeout_num(SSL *s)
 407         {
 408         s->d1->timeout.num_alerts++;
 409 
 410         /* Reduce MTU after 2 unsuccessful retransmissions */
 411         if (s->d1->timeout.num_alerts > 2)
 412                 {
 413                 s->d1->mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL);
 414                 }
 415 
 416         if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT)
 417                 {
 418                 /* fail the connection, enough alerts have been sent */
 419                 SSLerr(SSL_F_DTLS1_CHECK_TIMEOUT_NUM,SSL_R_READ_TIMEOUT_EXPIRED);
 420                 return -1;
 421                 }
 422 
 423         return 0;
 424         }
 425 
 426 int dtls1_handle_timeout(SSL *s)
 427         {
 428         /* if no timer is expired, don't do anything */
 429         if (!dtls1_is_timer_expired(s))
 430                 {
 431                 return 0;
 432                 }
 433 
 434         dtls1_double_timeout(s);
 435 
 436         if (dtls1_check_timeout_num(s) < 0)
 437                 return -1;
 438 
 439         s->d1->timeout.read_timeouts++;
 440         if (s->d1->timeout.read_timeouts > DTLS1_TMO_READ_COUNT)
 441                 {
 442                 s->d1->timeout.read_timeouts = 1;
 443                 }
 444 
 445 #ifndef OPENSSL_NO_HEARTBEATS
 446         if (s->tlsext_hb_pending)
 447                 {
 448                 s->tlsext_hb_pending = 0;
 449                 return dtls1_heartbeat(s);
 450                 }
 451 #endif
 452 
 453         dtls1_start_timer(s);
 454         return dtls1_retransmit_buffered_messages(s);
 455         }
 456 
 457 static void get_current_time(struct timeval *t)
 458 {
 459 #ifdef OPENSSL_SYS_WIN32
 460         struct _timeb tb;
 461         _ftime(&tb);
 462         t->tv_sec = (long)tb.time;
 463         t->tv_usec = (long)tb.millitm * 1000;
 464 #elif defined(OPENSSL_SYS_VMS)
 465         struct timeb tb;
 466         ftime(&tb);
 467         t->tv_sec = (long)tb.time;
 468         t->tv_usec = (long)tb.millitm * 1000;
 469 #else
 470         gettimeofday(t, NULL);
 471 #endif
 472 }
 473 
 474 int dtls1_listen(SSL *s, struct sockaddr *client)
 475         {
 476         int ret;
 477 
 478         SSL_set_options(s, SSL_OP_COOKIE_EXCHANGE);
 479         s->d1->listen = 1;
 480 
 481         ret = SSL_accept(s);
 482         if (ret <= 0) return ret;
 483 
 484         (void) BIO_dgram_get_peer(SSL_get_rbio(s), client);
 485         return 1;
 486         }