gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r33692 - gnunet/src/cadet


From: gnunet
Subject: [GNUnet-SVN] r33692 - gnunet/src/cadet
Date: Tue, 17 Jun 2014 14:13:33 +0200

Author: bartpolot
Date: 2014-06-17 14:13:33 +0200 (Tue, 17 Jun 2014)
New Revision: 33692

Modified:
   gnunet/src/cadet/gnunet-service-cadet_tunnel.c
   gnunet/src/cadet/gnunet-service-cadet_tunnel.h
Log:
- add rekey state

Modified: gnunet/src/cadet/gnunet-service-cadet_tunnel.c
===================================================================
--- gnunet/src/cadet/gnunet-service-cadet_tunnel.c      2014-06-17 12:13:32 UTC 
(rev 33691)
+++ gnunet/src/cadet/gnunet-service-cadet_tunnel.c      2014-06-17 12:13:33 UTC 
(rev 33692)
@@ -400,7 +400,9 @@
   int ready;
 
   GCT_debug (t, GNUNET_ERROR_TYPE_DEBUG);
-  ready = CADET_TUNNEL3_READY == t->cstate && CADET_TUNNEL3_KEY_OK == 
t->estate;
+  ready = CADET_TUNNEL3_READY == t->cstate
+          && (CADET_TUNNEL3_KEY_OK == t->estate
+              || CADET_TUNNEL3_KEY_REKEY == t->estate);
   ready = ready || GCT_is_loopback (t);
   return ready;
 }
@@ -1294,7 +1296,23 @@
     LOG (GNUNET_ERROR_TYPE_DEBUG, "  new challenge for %s: %u\n",
          GCT_2s (t), t->kx_ctx->challenge);
   }
+  else
+  {
+    struct GNUNET_TIME_Relative duration;
 
+    duration = GNUNET_TIME_absolute_get_duration (t->kx_ctx->rekey_start_time);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, " kx started %s ago\n",
+         GNUNET_STRINGS_relative_time_to_string (duration, GNUNET_YES));
+
+    // FIXME make duration of old keys configurable
+    if (duration.rel_value_us > GNUNET_TIME_UNIT_MINUTES.rel_value_us)
+    {
+      memset (&t->kx_ctx->d_key_old, 0, sizeof (t->kx_ctx->d_key_old));
+      memset (&t->kx_ctx->e_key_old, 0, sizeof (t->kx_ctx->e_key_old));
+      t->estate = CADET_TUNNEL3_KEY_PING;
+    }
+  }
+
   send_ephemeral (t);
 
   switch (t->estate)
@@ -1304,10 +1322,12 @@
       break;
     case CADET_TUNNEL3_KEY_SENT:
       break;
+    case CADET_TUNNEL3_KEY_OK:
+      t->estate = CADET_TUNNEL3_KEY_REKEY;
+      /* fall-thru */
     case CADET_TUNNEL3_KEY_PING:
-    case CADET_TUNNEL3_KEY_OK:
+    case CADET_TUNNEL3_KEY_REKEY:
       send_ping (t);
-      t->estate = CADET_TUNNEL3_KEY_PING;
       break;
     default:
       LOG (GNUNET_ERROR_TYPE_DEBUG, "Unexpected state %u\n", t->estate);
@@ -1709,6 +1729,10 @@
   {
     t->peers_ephemeral_key = msg->ephemeral_key;
     create_keys (t);
+    if (CADET_TUNNEL3_KEY_OK == t->estate)
+    {
+      t->estate = CADET_TUNNEL3_KEY_REKEY;
+    }
   }
   if (CADET_TUNNEL3_KEY_SENT == t->estate)
   {

Modified: gnunet/src/cadet/gnunet-service-cadet_tunnel.h
===================================================================
--- gnunet/src/cadet/gnunet-service-cadet_tunnel.h      2014-06-17 12:13:32 UTC 
(rev 33691)
+++ gnunet/src/cadet/gnunet-service-cadet_tunnel.h      2014-06-17 12:13:33 UTC 
(rev 33692)
@@ -90,7 +90,8 @@
   /**
    * New ephemeral key and ping sent, waiting for pong.
    * This means that we DO have the peer's ephemeral key, otherwise the
-   * state would be KEY_SENT.
+   * state would be KEY_SENT. We DO NOT have a valid session key (either no
+   * previous key or previous key expired).
    */
   CADET_TUNNEL3_KEY_PING,
 
@@ -98,6 +99,13 @@
    * Handshake completed: session key available.
    */
   CADET_TUNNEL3_KEY_OK,
+
+  /**
+   * New ephemeral key and ping sent, waiting for pong. Opposite to KEY_PING,
+   * we still have a valid session key and therefore we *can* still send
+   * traffic on the tunnel.
+   */
+  CADET_TUNNEL3_KEY_REKEY,
 };
 
 /**




reply via email to

[Prev in Thread] Current Thread [Next in Thread]