diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/d1_lib.c | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/src/lib/libssl/d1_lib.c b/src/lib/libssl/d1_lib.c index c3b77c889b..f61f718183 100644 --- a/src/lib/libssl/d1_lib.c +++ b/src/lib/libssl/d1_lib.c | |||
| @@ -82,6 +82,7 @@ SSL3_ENC_METHOD DTLSv1_enc_data={ | |||
| 82 | TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE, | 82 | TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE, |
| 83 | TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE, | 83 | TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE, |
| 84 | tls1_alert_code, | 84 | tls1_alert_code, |
| 85 | tls1_export_keying_material, | ||
| 85 | }; | 86 | }; |
| 86 | 87 | ||
| 87 | long dtls1_default_timeout(void) | 88 | long dtls1_default_timeout(void) |
| @@ -291,6 +292,15 @@ const SSL_CIPHER *dtls1_get_cipher(unsigned int u) | |||
| 291 | 292 | ||
| 292 | void dtls1_start_timer(SSL *s) | 293 | void dtls1_start_timer(SSL *s) |
| 293 | { | 294 | { |
| 295 | #ifndef OPENSSL_NO_SCTP | ||
| 296 | /* Disable timer for SCTP */ | ||
| 297 | if (BIO_dgram_is_sctp(SSL_get_wbio(s))) | ||
| 298 | { | ||
| 299 | memset(&(s->d1->next_timeout), 0, sizeof(struct timeval)); | ||
| 300 | return; | ||
| 301 | } | ||
| 302 | #endif | ||
| 303 | |||
| 294 | /* If timer is not set, initialize duration with 1 second */ | 304 | /* If timer is not set, initialize duration with 1 second */ |
| 295 | if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0) | 305 | if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0) |
| 296 | { | 306 | { |
| @@ -381,6 +391,7 @@ void dtls1_double_timeout(SSL *s) | |||
| 381 | void dtls1_stop_timer(SSL *s) | 391 | void dtls1_stop_timer(SSL *s) |
| 382 | { | 392 | { |
| 383 | /* Reset everything */ | 393 | /* Reset everything */ |
| 394 | memset(&(s->d1->timeout), 0, sizeof(struct dtls1_timeout_st)); | ||
| 384 | memset(&(s->d1->next_timeout), 0, sizeof(struct timeval)); | 395 | memset(&(s->d1->next_timeout), 0, sizeof(struct timeval)); |
| 385 | s->d1->timeout_duration = 1; | 396 | s->d1->timeout_duration = 1; |
| 386 | BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout)); | 397 | BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout)); |
| @@ -388,10 +399,28 @@ void dtls1_stop_timer(SSL *s) | |||
| 388 | dtls1_clear_record_buffer(s); | 399 | dtls1_clear_record_buffer(s); |
| 389 | } | 400 | } |
| 390 | 401 | ||
| 391 | int dtls1_handle_timeout(SSL *s) | 402 | int dtls1_check_timeout_num(SSL *s) |
| 392 | { | 403 | { |
| 393 | DTLS1_STATE *state; | 404 | s->d1->timeout.num_alerts++; |
| 405 | |||
| 406 | /* Reduce MTU after 2 unsuccessful retransmissions */ | ||
| 407 | if (s->d1->timeout.num_alerts > 2) | ||
| 408 | { | ||
| 409 | s->d1->mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL); | ||
| 410 | } | ||
| 394 | 411 | ||
| 412 | if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT) | ||
| 413 | { | ||
| 414 | /* fail the connection, enough alerts have been sent */ | ||
| 415 | SSLerr(SSL_F_DTLS1_CHECK_TIMEOUT_NUM,SSL_R_READ_TIMEOUT_EXPIRED); | ||
| 416 | return -1; | ||
| 417 | } | ||
| 418 | |||
| 419 | return 0; | ||
| 420 | } | ||
| 421 | |||
| 422 | int dtls1_handle_timeout(SSL *s) | ||
| 423 | { | ||
| 395 | /* if no timer is expired, don't do anything */ | 424 | /* if no timer is expired, don't do anything */ |
| 396 | if (!dtls1_is_timer_expired(s)) | 425 | if (!dtls1_is_timer_expired(s)) |
| 397 | { | 426 | { |
| @@ -399,20 +428,23 @@ int dtls1_handle_timeout(SSL *s) | |||
| 399 | } | 428 | } |
| 400 | 429 | ||
| 401 | dtls1_double_timeout(s); | 430 | dtls1_double_timeout(s); |
| 402 | state = s->d1; | 431 | |
| 403 | state->timeout.num_alerts++; | 432 | if (dtls1_check_timeout_num(s) < 0) |
| 404 | if ( state->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT) | ||
| 405 | { | ||
| 406 | /* fail the connection, enough alerts have been sent */ | ||
| 407 | SSLerr(SSL_F_DTLS1_HANDLE_TIMEOUT,SSL_R_READ_TIMEOUT_EXPIRED); | ||
| 408 | return -1; | 433 | return -1; |
| 434 | |||
| 435 | s->d1->timeout.read_timeouts++; | ||
| 436 | if (s->d1->timeout.read_timeouts > DTLS1_TMO_READ_COUNT) | ||
| 437 | { | ||
| 438 | s->d1->timeout.read_timeouts = 1; | ||
| 409 | } | 439 | } |
| 410 | 440 | ||
| 411 | state->timeout.read_timeouts++; | 441 | #ifndef OPENSSL_NO_HEARTBEATS |
| 412 | if ( state->timeout.read_timeouts > DTLS1_TMO_READ_COUNT) | 442 | if (s->tlsext_hb_pending) |
| 413 | { | 443 | { |
| 414 | state->timeout.read_timeouts = 1; | 444 | s->tlsext_hb_pending = 0; |
| 445 | return dtls1_heartbeat(s); | ||
| 415 | } | 446 | } |
| 447 | #endif | ||
| 416 | 448 | ||
| 417 | dtls1_start_timer(s); | 449 | dtls1_start_timer(s); |
| 418 | return dtls1_retransmit_buffered_messages(s); | 450 | return dtls1_retransmit_buffered_messages(s); |
