Home | History | Annotate | Download | only in ssl
      1 /* ssl/d1_lib.c */
      2 /*
      3  * DTLS implementation written by Nagendra Modadugu
      4  * (nagendra (at) 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 (at) 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 (at) cryptsoft.com).  This product includes software written by Tim
     56  * Hudson (tjh (at) 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 	case SSL_CTRL_CHECK_PROTO_VERSION:
    270 		/* For library-internal use; checks that the current protocol
    271 		 * is the highest enabled version (according to s->ctx->method,
    272 		 * as version negotiation may have changed s->method). */
    273 #if DTLS_MAX_VERSION != DTLS1_VERSION
    274 #  error Code needs update for DTLS_method() support beyond DTLS1_VERSION.
    275 #endif
    276 		/* Just one protocol version is supported so far;
    277 		 * fail closed if the version is not as expected. */
    278 		return s->version == DTLS_MAX_VERSION;
    279 
    280 	default:
    281 		ret = ssl3_ctrl(s, cmd, larg, parg);
    282 		break;
    283 		}
    284 	return(ret);
    285 	}
    286 
    287 /*
    288  * As it's impossible to use stream ciphers in "datagram" mode, this
    289  * simple filter is designed to disengage them in DTLS. Unfortunately
    290  * there is no universal way to identify stream SSL_CIPHER, so we have
    291  * to explicitly list their SSL_* codes. Currently RC4 is the only one
    292  * available, but if new ones emerge, they will have to be added...
    293  */
    294 const SSL_CIPHER *dtls1_get_cipher(unsigned int u)
    295 	{
    296 	const SSL_CIPHER *ciph = ssl3_get_cipher(u);
    297 
    298 	if (ciph != NULL)
    299 		{
    300 		if (ciph->algorithm_enc == SSL_RC4)
    301 			return NULL;
    302 		}
    303 
    304 	return ciph;
    305 	}
    306 
    307 void dtls1_start_timer(SSL *s)
    308 	{
    309 #ifndef OPENSSL_NO_SCTP
    310 	/* Disable timer for SCTP */
    311 	if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
    312 		{
    313 		memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
    314 		return;
    315 		}
    316 #endif
    317 
    318 	/* If timer is not set, initialize duration with 1 second */
    319 	if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0)
    320 		{
    321 		s->d1->timeout_duration = 1;
    322 		}
    323 
    324 	/* Set timeout to current time */
    325 	get_current_time(&(s->d1->next_timeout));
    326 
    327 	/* Add duration to current time */
    328 	s->d1->next_timeout.tv_sec += s->d1->timeout_duration;
    329 	BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout));
    330 	}
    331 
    332 struct timeval* dtls1_get_timeout(SSL *s, struct timeval* timeleft)
    333 	{
    334 	struct timeval timenow;
    335 
    336 	/* If no timeout is set, just return NULL */
    337 	if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0)
    338 		{
    339 		return NULL;
    340 		}
    341 
    342 	/* Get current time */
    343 	get_current_time(&timenow);
    344 
    345 	/* If timer already expired, set remaining time to 0 */
    346 	if (s->d1->next_timeout.tv_sec < timenow.tv_sec ||
    347 		(s->d1->next_timeout.tv_sec == timenow.tv_sec &&
    348 		 s->d1->next_timeout.tv_usec <= timenow.tv_usec))
    349 		{
    350 		memset(timeleft, 0, sizeof(struct timeval));
    351 		return timeleft;
    352 		}
    353 
    354 	/* Calculate time left until timer expires */
    355 	memcpy(timeleft, &(s->d1->next_timeout), sizeof(struct timeval));
    356 	timeleft->tv_sec -= timenow.tv_sec;
    357 	timeleft->tv_usec -= timenow.tv_usec;
    358 	if (timeleft->tv_usec < 0)
    359 		{
    360 		timeleft->tv_sec--;
    361 		timeleft->tv_usec += 1000000;
    362 		}
    363 
    364 	/* If remaining time is less than 15 ms, set it to 0
    365 	 * to prevent issues because of small devergences with
    366 	 * socket timeouts.
    367 	 */
    368 	if (timeleft->tv_sec == 0 && timeleft->tv_usec < 15000)
    369 		{
    370 		memset(timeleft, 0, sizeof(struct timeval));
    371 		}
    372 
    373 
    374 	return timeleft;
    375 	}
    376 
    377 int dtls1_is_timer_expired(SSL *s)
    378 	{
    379 	struct timeval timeleft;
    380 
    381 	/* Get time left until timeout, return false if no timer running */
    382 	if (dtls1_get_timeout(s, &timeleft) == NULL)
    383 		{
    384 		return 0;
    385 		}
    386 
    387 	/* Return false if timer is not expired yet */
    388 	if (timeleft.tv_sec > 0 || timeleft.tv_usec > 0)
    389 		{
    390 		return 0;
    391 		}
    392 
    393 	/* Timer expired, so return true */
    394 	return 1;
    395 	}
    396 
    397 void dtls1_double_timeout(SSL *s)
    398 	{
    399 	s->d1->timeout_duration *= 2;
    400 	if (s->d1->timeout_duration > 60)
    401 		s->d1->timeout_duration = 60;
    402 	dtls1_start_timer(s);
    403 	}
    404 
    405 void dtls1_stop_timer(SSL *s)
    406 	{
    407 	/* Reset everything */
    408 	memset(&(s->d1->timeout), 0, sizeof(struct dtls1_timeout_st));
    409 	memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
    410 	s->d1->timeout_duration = 1;
    411 	BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout));
    412 	/* Clear retransmission buffer */
    413 	dtls1_clear_record_buffer(s);
    414 	}
    415 
    416 int dtls1_check_timeout_num(SSL *s)
    417 	{
    418 	s->d1->timeout.num_alerts++;
    419 
    420 	/* Reduce MTU after 2 unsuccessful retransmissions */
    421 	if (s->d1->timeout.num_alerts > 2)
    422 		{
    423 		s->d1->mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL);
    424 		}
    425 
    426 	if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT)
    427 		{
    428 		/* fail the connection, enough alerts have been sent */
    429 		SSLerr(SSL_F_DTLS1_CHECK_TIMEOUT_NUM,SSL_R_READ_TIMEOUT_EXPIRED);
    430 		return -1;
    431 		}
    432 
    433 	return 0;
    434 	}
    435 
    436 int dtls1_handle_timeout(SSL *s)
    437 	{
    438 	/* if no timer is expired, don't do anything */
    439 	if (!dtls1_is_timer_expired(s))
    440 		{
    441 		return 0;
    442 		}
    443 
    444 	dtls1_double_timeout(s);
    445 
    446 	if (dtls1_check_timeout_num(s) < 0)
    447 		return -1;
    448 
    449 	s->d1->timeout.read_timeouts++;
    450 	if (s->d1->timeout.read_timeouts > DTLS1_TMO_READ_COUNT)
    451 		{
    452 		s->d1->timeout.read_timeouts = 1;
    453 		}
    454 
    455 #ifndef OPENSSL_NO_HEARTBEATS
    456 	if (s->tlsext_hb_pending)
    457 		{
    458 		s->tlsext_hb_pending = 0;
    459 		return dtls1_heartbeat(s);
    460 		}
    461 #endif
    462 
    463 	dtls1_start_timer(s);
    464 	return dtls1_retransmit_buffered_messages(s);
    465 	}
    466 
    467 static void get_current_time(struct timeval *t)
    468 {
    469 #ifdef OPENSSL_SYS_WIN32
    470 	struct _timeb tb;
    471 	_ftime(&tb);
    472 	t->tv_sec = (long)tb.time;
    473 	t->tv_usec = (long)tb.millitm * 1000;
    474 #elif defined(OPENSSL_SYS_VMS)
    475 	struct timeb tb;
    476 	ftime(&tb);
    477 	t->tv_sec = (long)tb.time;
    478 	t->tv_usec = (long)tb.millitm * 1000;
    479 #else
    480 	gettimeofday(t, NULL);
    481 #endif
    482 }
    483 
    484 int dtls1_listen(SSL *s, struct sockaddr *client)
    485 	{
    486 	int ret;
    487 
    488 	SSL_set_options(s, SSL_OP_COOKIE_EXCHANGE);
    489 	s->d1->listen = 1;
    490 
    491 	ret = SSL_accept(s);
    492 	if (ret <= 0) return ret;
    493 
    494 	(void) BIO_dgram_get_peer(SSL_get_rbio(s), client);
    495 	return 1;
    496 	}
    497