Code style: space after 'if'
[openssl.git] / ssl / d1_lib.c
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_VMS)
66 # include <sys/timeb.h>
67 #endif
68
69 static void get_current_time(struct timeval *t);
70 static int dtls1_set_handshake_header(SSL *s, int type, unsigned long len);
71 static int dtls1_handshake_write(SSL *s);
72 const char dtls1_version_str[] = "DTLSv1" OPENSSL_VERSION_PTEXT;
73 int dtls1_listen(SSL *s, struct sockaddr *client);
74
75 const SSL3_ENC_METHOD DTLSv1_enc_data = {
76     tls1_enc,
77     tls1_mac,
78     tls1_setup_key_block,
79     tls1_generate_master_secret,
80     tls1_change_cipher_state,
81     tls1_final_finish_mac,
82     TLS1_FINISH_MAC_LENGTH,
83     tls1_cert_verify_mac,
84     TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
85     TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
86     tls1_alert_code,
87     tls1_export_keying_material,
88     SSL_ENC_FLAG_DTLS | SSL_ENC_FLAG_EXPLICIT_IV,
89     DTLS1_HM_HEADER_LENGTH,
90     dtls1_set_handshake_header,
91     dtls1_handshake_write
92 };
93
94 const SSL3_ENC_METHOD DTLSv1_2_enc_data = {
95     tls1_enc,
96     tls1_mac,
97     tls1_setup_key_block,
98     tls1_generate_master_secret,
99     tls1_change_cipher_state,
100     tls1_final_finish_mac,
101     TLS1_FINISH_MAC_LENGTH,
102     tls1_cert_verify_mac,
103     TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
104     TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
105     tls1_alert_code,
106     tls1_export_keying_material,
107     SSL_ENC_FLAG_DTLS | SSL_ENC_FLAG_EXPLICIT_IV | SSL_ENC_FLAG_SIGALGS
108         | SSL_ENC_FLAG_SHA256_PRF | SSL_ENC_FLAG_TLS1_2_CIPHERS,
109     DTLS1_HM_HEADER_LENGTH,
110     dtls1_set_handshake_header,
111     dtls1_handshake_write
112 };
113
114 long dtls1_default_timeout(void)
115 {
116     /*
117      * 2 hours, the 24 hours mentioned in the DTLSv1 spec is way too long for
118      * http, the cache would over fill
119      */
120     return (60 * 60 * 2);
121 }
122
123 int dtls1_new(SSL *s)
124 {
125     DTLS1_STATE *d1;
126
127     if (!DTLS_RECORD_LAYER_new(&s->rlayer)) {
128         return 0;
129     }
130     
131     if (!ssl3_new(s))
132         return (0);
133     if ((d1 = OPENSSL_malloc(sizeof *d1)) == NULL) {
134         ssl3_free(s);
135         return (0);
136     }
137     memset(d1, 0, sizeof *d1);
138
139     d1->buffered_messages = pqueue_new();
140     d1->sent_messages = pqueue_new();
141
142     if (s->server) {
143         d1->cookie_len = sizeof(s->d1->cookie);
144     }
145
146     d1->link_mtu = 0;
147     d1->mtu = 0;
148
149     if (!d1->buffered_messages || !d1->sent_messages) {
150         if (d1->buffered_messages)
151             pqueue_free(d1->buffered_messages);
152         if (d1->sent_messages)
153             pqueue_free(d1->sent_messages);
154         OPENSSL_free(d1);
155         ssl3_free(s);
156         return (0);
157     }
158
159     s->d1 = d1;
160     s->method->ssl_clear(s);
161     return (1);
162 }
163
164 static void dtls1_clear_queues(SSL *s)
165 {
166     pitem *item = NULL;
167     hm_fragment *frag = NULL;
168
169     while ((item = pqueue_pop(s->d1->buffered_messages)) != NULL) {
170         frag = (hm_fragment *)item->data;
171         dtls1_hm_fragment_free(frag);
172         pitem_free(item);
173     }
174
175     while ((item = pqueue_pop(s->d1->sent_messages)) != NULL) {
176         frag = (hm_fragment *)item->data;
177         dtls1_hm_fragment_free(frag);
178         pitem_free(item);
179     }
180 }
181
182 void dtls1_free(SSL *s)
183 {
184     DTLS_RECORD_LAYER_free(&s->rlayer);
185
186     ssl3_free(s);
187
188     dtls1_clear_queues(s);
189
190     pqueue_free(s->d1->buffered_messages);
191     pqueue_free(s->d1->sent_messages);
192
193     OPENSSL_free(s->d1);
194     s->d1 = NULL;
195 }
196
197 void dtls1_clear(SSL *s)
198 {
199     pqueue buffered_messages;
200     pqueue sent_messages;
201     unsigned int mtu;
202     unsigned int link_mtu;
203
204     DTLS_RECORD_LAYER_clear(&s->rlayer);
205
206     if (s->d1) {
207         buffered_messages = s->d1->buffered_messages;
208         sent_messages = s->d1->sent_messages;
209         mtu = s->d1->mtu;
210         link_mtu = s->d1->link_mtu;
211
212         dtls1_clear_queues(s);
213
214         memset(s->d1, 0, sizeof(*(s->d1)));
215
216         if (s->server) {
217             s->d1->cookie_len = sizeof(s->d1->cookie);
218         }
219
220         if (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU) {
221             s->d1->mtu = mtu;
222             s->d1->link_mtu = link_mtu;
223         }
224
225         s->d1->buffered_messages = buffered_messages;
226         s->d1->sent_messages = sent_messages;
227     }
228
229     ssl3_clear(s);
230     if (s->options & SSL_OP_CISCO_ANYCONNECT)
231         s->client_version = s->version = DTLS1_BAD_VER;
232     else if (s->method->version == DTLS_ANY_VERSION)
233         s->version = DTLS1_2_VERSION;
234     else
235         s->version = s->method->version;
236 }
237
238 long dtls1_ctrl(SSL *s, int cmd, long larg, void *parg)
239 {
240     int ret = 0;
241
242     switch (cmd) {
243     case DTLS_CTRL_GET_TIMEOUT:
244         if (dtls1_get_timeout(s, (struct timeval *)parg) != NULL) {
245             ret = 1;
246         }
247         break;
248     case DTLS_CTRL_HANDLE_TIMEOUT:
249         ret = dtls1_handle_timeout(s);
250         break;
251     case DTLS_CTRL_LISTEN:
252         ret = dtls1_listen(s, parg);
253         break;
254     case SSL_CTRL_CHECK_PROTO_VERSION:
255         /*
256          * For library-internal use; checks that the current protocol is the
257          * highest enabled version (according to s->ctx->method, as version
258          * negotiation may have changed s->method).
259          */
260         if (s->version == s->ctx->method->version)
261             return 1;
262         /*
263          * Apparently we're using a version-flexible SSL_METHOD (not at its
264          * highest protocol version).
265          */
266         if (s->ctx->method->version == DTLS_method()->version) {
267 #if DTLS_MAX_VERSION != DTLS1_2_VERSION
268 # error Code needs update for DTLS_method() support beyond DTLS1_2_VERSION.
269 #endif
270             if (!(s->options & SSL_OP_NO_DTLSv1_2))
271                 return s->version == DTLS1_2_VERSION;
272             if (!(s->options & SSL_OP_NO_DTLSv1))
273                 return s->version == DTLS1_VERSION;
274         }
275         return 0;               /* Unexpected state; fail closed. */
276     case DTLS_CTRL_SET_LINK_MTU:
277         if (larg < (long)dtls1_link_min_mtu())
278             return 0;
279         s->d1->link_mtu = larg;
280         return 1;
281     case DTLS_CTRL_GET_LINK_MIN_MTU:
282         return (long)dtls1_link_min_mtu();
283     case SSL_CTRL_SET_MTU:
284         /*
285          *  We may not have a BIO set yet so can't call dtls1_min_mtu()
286          *  We'll have to make do with dtls1_link_min_mtu() and max overhead
287          */
288         if (larg < (long)dtls1_link_min_mtu() - DTLS1_MAX_MTU_OVERHEAD)
289             return 0;
290         s->d1->mtu = larg;
291         return larg;
292     default:
293         ret = ssl3_ctrl(s, cmd, larg, parg);
294         break;
295     }
296     return (ret);
297 }
298
299 /*
300  * As it's impossible to use stream ciphers in "datagram" mode, this
301  * simple filter is designed to disengage them in DTLS. Unfortunately
302  * there is no universal way to identify stream SSL_CIPHER, so we have
303  * to explicitly list their SSL_* codes. Currently RC4 is the only one
304  * available, but if new ones emerge, they will have to be added...
305  */
306 const SSL_CIPHER *dtls1_get_cipher(unsigned int u)
307 {
308     const SSL_CIPHER *ciph = ssl3_get_cipher(u);
309
310     if (ciph != NULL) {
311         if (ciph->algorithm_enc == SSL_RC4)
312             return NULL;
313     }
314
315     return ciph;
316 }
317
318 void dtls1_start_timer(SSL *s)
319 {
320 #ifndef OPENSSL_NO_SCTP
321     /* Disable timer for SCTP */
322     if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
323         memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
324         return;
325     }
326 #endif
327
328     /* If timer is not set, initialize duration with 1 second */
329     if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0) {
330         s->d1->timeout_duration = 1;
331     }
332
333     /* Set timeout to current time */
334     get_current_time(&(s->d1->next_timeout));
335
336     /* Add duration to current time */
337     s->d1->next_timeout.tv_sec += s->d1->timeout_duration;
338     BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
339              &(s->d1->next_timeout));
340 }
341
342 struct timeval *dtls1_get_timeout(SSL *s, struct timeval *timeleft)
343 {
344     struct timeval timenow;
345
346     /* If no timeout is set, just return NULL */
347     if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0) {
348         return NULL;
349     }
350
351     /* Get current time */
352     get_current_time(&timenow);
353
354     /* If timer already expired, set remaining time to 0 */
355     if (s->d1->next_timeout.tv_sec < timenow.tv_sec ||
356         (s->d1->next_timeout.tv_sec == timenow.tv_sec &&
357          s->d1->next_timeout.tv_usec <= timenow.tv_usec)) {
358         memset(timeleft, 0, sizeof(struct timeval));
359         return timeleft;
360     }
361
362     /* Calculate time left until timer expires */
363     memcpy(timeleft, &(s->d1->next_timeout), sizeof(struct timeval));
364     timeleft->tv_sec -= timenow.tv_sec;
365     timeleft->tv_usec -= timenow.tv_usec;
366     if (timeleft->tv_usec < 0) {
367         timeleft->tv_sec--;
368         timeleft->tv_usec += 1000000;
369     }
370
371     /*
372      * If remaining time is less than 15 ms, set it to 0 to prevent issues
373      * because of small devergences with socket timeouts.
374      */
375     if (timeleft->tv_sec == 0 && timeleft->tv_usec < 15000) {
376         memset(timeleft, 0, sizeof(struct timeval));
377     }
378
379     return timeleft;
380 }
381
382 int dtls1_is_timer_expired(SSL *s)
383 {
384     struct timeval timeleft;
385
386     /* Get time left until timeout, return false if no timer running */
387     if (dtls1_get_timeout(s, &timeleft) == NULL) {
388         return 0;
389     }
390
391     /* Return false if timer is not expired yet */
392     if (timeleft.tv_sec > 0 || timeleft.tv_usec > 0) {
393         return 0;
394     }
395
396     /* Timer expired, so return true */
397     return 1;
398 }
399
400 void dtls1_double_timeout(SSL *s)
401 {
402     s->d1->timeout_duration *= 2;
403     if (s->d1->timeout_duration > 60)
404         s->d1->timeout_duration = 60;
405     dtls1_start_timer(s);
406 }
407
408 void dtls1_stop_timer(SSL *s)
409 {
410     /* Reset everything */
411     memset(&(s->d1->timeout), 0, sizeof(struct dtls1_timeout_st));
412     memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
413     s->d1->timeout_duration = 1;
414     BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0,
415              &(s->d1->next_timeout));
416     /* Clear retransmission buffer */
417     dtls1_clear_record_buffer(s);
418 }
419
420 int dtls1_check_timeout_num(SSL *s)
421 {
422     unsigned int mtu;
423
424     s->d1->timeout.num_alerts++;
425
426     /* Reduce MTU after 2 unsuccessful retransmissions */
427     if (s->d1->timeout.num_alerts > 2
428         && !(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)) {
429         mtu =
430             BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0,
431                      NULL);
432         if (mtu < s->d1->mtu)
433             s->d1->mtu = mtu;
434     }
435
436     if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT) {
437         /* fail the connection, enough alerts have been sent */
438         SSLerr(SSL_F_DTLS1_CHECK_TIMEOUT_NUM, SSL_R_READ_TIMEOUT_EXPIRED);
439         return -1;
440     }
441
442     return 0;
443 }
444
445 int dtls1_handle_timeout(SSL *s)
446 {
447     /* if no timer is expired, don't do anything */
448     if (!dtls1_is_timer_expired(s)) {
449         return 0;
450     }
451
452     dtls1_double_timeout(s);
453
454     if (dtls1_check_timeout_num(s) < 0)
455         return -1;
456
457     s->d1->timeout.read_timeouts++;
458     if (s->d1->timeout.read_timeouts > DTLS1_TMO_READ_COUNT) {
459         s->d1->timeout.read_timeouts = 1;
460     }
461 #ifndef OPENSSL_NO_HEARTBEATS
462     if (s->tlsext_hb_pending) {
463         s->tlsext_hb_pending = 0;
464         return dtls1_heartbeat(s);
465     }
466 #endif
467
468     dtls1_start_timer(s);
469     return dtls1_retransmit_buffered_messages(s);
470 }
471
472 static void get_current_time(struct timeval *t)
473 {
474 #if defined(_WIN32)
475     SYSTEMTIME st;
476     union {
477         unsigned __int64 ul;
478         FILETIME ft;
479     } now;
480
481     GetSystemTime(&st);
482     SystemTimeToFileTime(&st, &now.ft);
483 # ifdef  __MINGW32__
484     now.ul -= 116444736000000000ULL;
485 # else
486     now.ul -= 116444736000000000UI64; /* re-bias to 1/1/1970 */
487 # endif
488     t->tv_sec = (long)(now.ul / 10000000);
489     t->tv_usec = ((int)(now.ul % 10000000)) / 10;
490 #elif defined(OPENSSL_SYS_VMS)
491     struct timeb tb;
492     ftime(&tb);
493     t->tv_sec = (long)tb.time;
494     t->tv_usec = (long)tb.millitm * 1000;
495 #else
496     gettimeofday(t, NULL);
497 #endif
498 }
499
500 int dtls1_listen(SSL *s, struct sockaddr *client)
501 {
502     int ret;
503
504     /* Ensure there is no state left over from a previous invocation */
505     if (!SSL_clear(s))
506         return -1;
507
508     SSL_set_options(s, SSL_OP_COOKIE_EXCHANGE);
509     s->d1->listen = 1;
510
511     ret = SSL_accept(s);
512     if (ret <= 0)
513         return ret;
514
515     (void)BIO_dgram_get_peer(SSL_get_rbio(s), client);
516     return 1;
517 }
518
519 static int dtls1_set_handshake_header(SSL *s, int htype, unsigned long len)
520 {
521     unsigned char *p = (unsigned char *)s->init_buf->data;
522     dtls1_set_message_header(s, p, htype, len, 0, len);
523     s->init_num = (int)len + DTLS1_HM_HEADER_LENGTH;
524     s->init_off = 0;
525     /* Buffer the message to handle re-xmits */
526
527     if (!dtls1_buffer_message(s, 0))
528         return 0;
529
530     return 1;
531 }
532
533 static int dtls1_handshake_write(SSL *s)
534 {
535     return dtls1_do_write(s, SSL3_RT_HANDSHAKE);
536 }