Hi,

We are using DTLS API to implement a DTLS Client/Server. We notice
when the client application uses dtls_handle_timeout to re-transmit
handshake messages. The DTLS server library seems to be invoking
dtls_handle_timeout for every CLIENT HELLO message.

In order to conduct some network connectivity tests, we have disbaled
all network
traffic to reach from Server to Client. i.e The Client sends CLIENT
HELLO, Server responds with HELLO VERIFY REQUEST but this never
reaches the client by using a firewall rule between client/server
disabling all server responses to reach the client.

A handshake in progress looks as follows:


CLIENT -> CLIENT HELLO

                                DTLS Server library calls dtls_handle_timeout 
(1 sec timeout)
                                SERVER -> HELLO VERIFY REQUEST

There is a packet drop on the network layer so NO server traffic reaches the
client.

This leads to client sending a CLIENT HELLO protocol message again (As the DTLS
client application is invoking dtls_handle_timeout when timeout expires)

So client repeats:

CLIENT -> CLIENT HELLO
                                DTLS Server library calls dtls_handle_timeout 
(~2 sec)
                                SERVER -> HELLO VERIFY REQUEST


CLIENT -> CLIENT HELLO
                                DTLS Server library calls dtls_handle_timeout 
(~4 sec)
                                SERVER -> HELLO VERIFY REQUEST


CLIENT -> CLIENT HELLO
                                DTLS Server library calls dtls_handle_timeout 
(8~ sec)
                                SERVER -> HELLO VERIFY REQUEST

CLIENT -> CLIENT HELLO
                                DTLS Server library calls dtls_handle_timeout 
(16~ sec)
                                SERVER -> HELLO VERIFY REQUEST

CLIENT -> CLIENT HELLO
                                DTLS Server library calls dtls_handle_timeout 
(32~ sec)
                                SERVER -> HELLO VERIFY REQUEST

CLIENT -> CLIENT HELLO
                                DTLS Server library calls dtls_handle_timeout 
(60~ sec)
                                SERVER -> HELLO VERIFY REQUEST


Say the CLIENT HELLO comes before 60 seconds, The DTLS server does not
reply with a HELLO VERIFY REQUEST before 60 seconds
and connection does not get established (Even though we allow the
traffic from Server to reach the client).

Should the DTLS Server library even start any timers before the CLIENT
HELLO verification is successful.
As per post below:

http://www.mail-archive.com/openssl-dev@openssl.org/msg28844.html

We see in d1_pkt.c/dtls1_read_bytes

        /* Check for timeout */
        if (dtls1_handle_timeout(s) > 0)
                goto start;

and have seen handle_timeouts being called during the connection handshake.

It appears the Server does not respond until timer has expired.


(test excerpt)

(10.4.0.80 is Client
 10.4.0.87 is Server)


6:34:43.051411 IP 10.4.0.80.34071 > 10.4.0.87.5555: UDP, length 154
(CLIENT HELLO)
(0x93f4008) dtls_get_timeout timeleft expired = 0 0
dtls_start_timer set duration = 2
dtls_start_timer set duration = 2
dtls1_handle_timeout retransmit message
do_dtls1_write just before end ssl3_write_pending
(0x93f4008) dtls_get_timeout timeleft  = 15 999926
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 15 999873
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 15 999841
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 15 999814
16:34:43.052004 IP 10.4.0.87.5555 > 10.4.0.80.34071: UDP, length 48
(VERIFY REQUEST)
16:34:59.053593 IP 10.4.0.80.34071 > 10.4.0.87.5555: UDP, length 154
(CLIENT HELLO)
(0x93f4008) dtls_get_timeout timeleft expired = 0 0
dtls_start_timer set duration = 2
dtls_start_timer set duration = 2
dtls1_handle_timeout retransmit message
do_dtls1_write just before end ssl3_write_pending
(0x93f4008) dtls_get_timeout timeleft  = 31 999925
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 31 999861
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 31 999835
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 31 999807
16:34:59.053981 IP 10.4.0.87.5555 > 10.4.0.80.34071: UDP, length 48
(VERIFY REQUEST)
16:35:04.053277 arp who-has 10.4.0.87 tell 10.4.0.80
16:35:04.053283 arp reply 10.4.0.87 is-at 00:30:48:53:74:67
16:36:31.056286 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(CLIENT HELLO)
(0x93f4008) dtls_get_timeout timeleft expired = 0 0
dtls_start_timer set duration = 2
dtls_start_timer set duration = 2
dtls1_handle_timeout retransmit message
do_dtls1_write just before end ssl3_write_pending
(0x93f4008) dtls_get_timeout timeleft  = 59 999886
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999812
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999776
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999732
16:36:31.056737 IP 10.4.0.87.5555 > 10.4.0.80.34071: UDP, length 48
(VERIFY REQUEST)
(0x93f4008) dtls_get_timeout timeleft  = 58 998175
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 998087
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 998052
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 997996
16:36:32.056920 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
16:36:34.057525 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154


(Now NO Server VERIFY REQUEST being sent until timer expires)
(0x93f4008) dtls_get_timeout timeleft  = 56 998910
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998853
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998824
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998796
16:36:36.055854 arp who-has 10.4.0.87 tell 10.4.0.80
16:36:36.055883 arp reply 10.4.0.87 is-at 00:30:48:53:74:67
16:36:38.057812 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 52 998492
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 998414
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 998371
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 998321
16:36:46.056386 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 44 999946
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 44 999900
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 44 999880
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 44 999853
16:37:02.057537 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 28 998792
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 28 998711
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 28 998669
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 28 998620
16:37:07.057325 arp who-has 10.4.0.87 tell 10.4.0.80
16:37:07.057333 arp reply 10.4.0.87 is-at 00:30:48:53:74:67
16:38:34.072307 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft expired = 0 0
dtls_start_timer set duration = 2
dtls_start_timer set duration = 2
dtls1_handle_timeout retransmit message
do_dtls1_write just before end ssl3_write_pending
(0x93f4008) dtls_get_timeout timeleft  = 59 999887
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999794
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999774
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999747
16:38:34.072837 IP 10.4.0.87.5555 > 10.4.0.80.34111: UDP, length 48
16:38:35.073819 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 58 998596
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 998522
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 998484
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 998433
16:38:37.073698 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 56 998715
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998634
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998594
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998543
16:38:39.070892 arp who-has 10.4.0.87 tell 10.4.0.80
16:38:39.070913 arp reply 10.4.0.87 is-at 00:30:48:53:74:67
16:38:41.074917 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 52 997529
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 997446
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 997410
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 997361
16:38:49.076478 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 44 996087
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 44 996046
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 44 996031
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 44 996011
16:39:05.077624 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 28 994862
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 28 994813
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 28 994792
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 28 994764
16:39:10.077335 arp who-has 10.4.0.87 tell 10.4.0.80
16:39:10.077369 arp reply 10.4.0.87 is-at 00:30:48:53:74:67
16:40:37.084404 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft expired = 0 0
dtls_start_timer set duration = 2
dtls_start_timer set duration = 2
dtls1_handle_timeout retransmit message
do_dtls1_write just before end ssl3_write_pending
(0x93f4008) dtls_get_timeout timeleft  = 59 999847
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999780
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999739
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 59 999674
16:40:37.085251 IP 10.4.0.87.5555 > 10.4.0.80.34111: UDP, length 48
16:40:38.085004 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 58 999757
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 999679
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 999641
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 58 999588
16:40:40.085632 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 56 999150
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 999053
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 999018
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 56 998961
16:40:42.083894 arp who-has 10.4.0.87 tell 10.4.0.80
16:40:42.083903 arp reply 10.4.0.87 is-at 00:30:48:53:74:67
16:40:44.085915 IP 10.4.0.80.34111 > 10.4.0.87.5555: UDP, length 154
(0x93f4008) dtls_get_timeout timeleft  = 52 998976
dtls1_handle_timeout not expired
(0x93f4008) dtls_get_timeout timeleft  = 52 998924



Thanks,
-Yogi
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to