gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated: TNG: More work on UDP communicator.


From: gnunet
Subject: [gnunet] branch master updated: TNG: More work on UDP communicator.
Date: Sat, 29 Jul 2023 23:12:58 +0200

This is an automated email from the git hooks/post-receive script.

martin-schanzenbach pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new b679501b9 TNG: More work on UDP communicator.
     new b1c63f1b6 Merge remote-tracking branch 'origin/master'
b679501b9 is described below

commit b679501b9cd5a8d4fa6ee4e4dcad7eb908249f8c
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Sat Jul 29 23:11:47 2023 +0200

    TNG: More work on UDP communicator.
---
 src/transport/gnunet-communicator-udp.c            | 768 +++++++--------------
 .../test_communicator_udp_rekey_peer1.conf         |   2 +-
 .../test_communicator_udp_rekey_peer2.conf         |   2 +-
 src/transport/transport-testing-communicator.c     |   2 +-
 4 files changed, 255 insertions(+), 519 deletions(-)

diff --git a/src/transport/gnunet-communicator-udp.c 
b/src/transport/gnunet-communicator-udp.c
index c69fb233c..f697dc02e 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -37,6 +37,7 @@
  * - support NAT connection reversal method (#5529)
  * - support other UDP-specific NAT traversal methods (#)
  */
+#include "gnunet_common.h"
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
@@ -93,7 +94,7 @@
  */
 #define GCM_TAG_SIZE (128 / 8)
 
-#define GENERATE_AT_ONCE 100
+#define GENERATE_AT_ONCE 2
 
 /**
  * If we fall below this number of available KCNs,
@@ -254,13 +255,7 @@ struct UDPAck
    * Sequence acknowledgement limit. Specifies current maximum sequence
    * number supported by receiver.
    */
-  uint32_t sequence_max GNUNET_PACKED;
-
-  /**
-   * Sequence acknowledgement limit. Specifies current maximum sequence
-   * number supported by receiver.
-   */
-  uint32_t acks_available GNUNET_PACKED;
+  uint32_t sequence_ack GNUNET_PACKED;
 
   /**
    * CMAC of the base key being acknowledged.
@@ -344,8 +339,7 @@ struct UDPBox
 };
 
 /**
- * UDP message box.  Always sent encrypted, only allowed after
- * the receiver sent a `struct UDPAck` for the base key!
+ * Plaintext of a rekey payload in a UDPBox.
  */
 struct UDPRekey
 {
@@ -479,6 +473,26 @@ struct SharedSecret
    * Number of active KCN entries.
    */
   unsigned int active_kce_count;
+
+  /**
+   * Bytes sent with this shared secret
+   */
+  size_t bytes_sent;
+
+  /**
+   * rekey initiated for this secret?
+   */
+  int rekey_initiated;
+
+  /**
+   * ID of kce working queue task
+   */
+  struct GNUNET_SCHEDULER_Task *kce_task;
+
+  /**
+   * Is the kce_task finished?
+   */
+  int kce_task_finished;
 };
 
 
@@ -488,16 +502,6 @@ struct SharedSecret
  */
 struct SenderAddress
 {
-  /**
-   * Shared secret we use with @e target for rekeying.
-   */
-  struct SharedSecret *ss_rekey;
-
-  /**
-   * Flag indicating sender is initiated rekeying for this receiver.
-   */
-  uint16_t rekeying;
-
   /**
    * To whom are we talking to.
    */
@@ -554,21 +558,6 @@ struct SenderAddress
    */
   int sender_destroy_called;
 
-
-  /**
-   * ID of kce working queue task
-   */
-  struct GNUNET_SCHEDULER_Task *kce_task;
-
-  /**
-   * ID of kce rekey working queue task
-   */
-  struct GNUNET_SCHEDULER_Task *kce_task_rekey;
-
-  /**
-   * Is the kce_task finished?
-   */
-  int kce_task_finished;
 };
 
 
@@ -578,37 +567,11 @@ struct SenderAddress
  */
 struct ReceiverAddress
 {
-
-  /**
-   * Shared secret we use with @e target for rekeying.
-   */
-  struct SharedSecret *ss_rekey;
-
-  /**
-   * Acks available when we started rekeying.
-   */
-  unsigned int rekey_acks_available;
-
-  /**
-   * Send bytes for this receiver address.
-   */
-  uint64_t rekey_send_bytes;
-
   /**
   * Timeout for this receiver address.
   */
   struct GNUNET_TIME_Absolute rekey_timeout;
 
-  /**
-   * Flag indicating sender is initiated rekeying for this receiver.
-   */
-  uint16_t rekeying;
-
-  /**
-   * Number of kce we retain for sending the rekeying shared secret.
-   */
-  int number_rekeying_kce;
-
   /**
    * To whom are we talking to.
    */
@@ -763,10 +726,6 @@ static struct GNUNET_TIME_Relative rekey_interval;
  * How often we do rekey based on number of bytes transmitted
  */
 static unsigned long long rekey_max_bytes;
-/**
- * Shared secret we finished the last kce working queue for.
- */
-struct SharedSecret *ss_finished;
 
 /**
  * Cache of pre-generated key IDs.
@@ -1066,6 +1025,11 @@ secret_destroy (struct SharedSecret *ss, int withoutKce)
                          "# KIDs active",
                          GNUNET_CONTAINER_multishortmap_size (key_cache),
                          GNUNET_NO);
+  if (NULL != ss->kce_task)
+  {
+    GNUNET_SCHEDULER_cancel (ss->kce_task);
+    ss->kce_task = NULL;
+  }
   GNUNET_free (ss);
   return GNUNET_YES;
 }
@@ -1483,12 +1447,9 @@ add_acks (struct SharedSecret *ss, int acks_to_add)
                                              1);
   }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
               "Tell transport we have %u more acks!\n",
               acks_to_add);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "%u kce for rekeying.\n",
-              receiver->number_rekeying_kce);
 
   // Until here for alternativ 1
 
@@ -1496,63 +1457,7 @@ add_acks (struct SharedSecret *ss, int acks_to_add)
 
   GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
   GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss);
-  destroy_all_secrets (ss, GNUNET_YES);
-}
-
-
-static uint32_t
-reset_rekey_kces (struct ReceiverAddress *receiver,
-                  uint32_t acks_to_add)
-{
-  int needed_for_rekeying;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "%u kce for rekeying and %u acks_to_add\n",
-              receiver->number_rekeying_kce,
-              acks_to_add);
-
-  needed_for_rekeying = (3 - receiver->number_rekeying_kce);
-  if (acks_to_add <= needed_for_rekeying)
-  {
-    receiver->number_rekeying_kce += acks_to_add;
-    acks_to_add = 0;
-  }
-  else
-  {
-    acks_to_add -= (3 - receiver->number_rekeying_kce);
-    receiver->number_rekeying_kce = 3;
-  }
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "%u kce for rekeying and %u acks_to_add\n",
-              receiver->number_rekeying_kce,
-              acks_to_add);
-  return acks_to_add;
-}
-
-
-static void
-add_acks_rekey (struct ReceiverAddress *receiver)
-{
-  uint32_t acks_to_add = receiver->ss_rekey->sequence_allowed;
-
-  if (receiver->number_rekeying_kce < 3)
-    acks_to_add = reset_rekey_kces (receiver, acks_to_add);
-  receiver->acks_available = receiver->ss_rekey->sequence_allowed;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "%u receiver->acks_available 4\n",
-              receiver->acks_available);
-  if (0 != acks_to_add)
-  {
-    add_acks (receiver->ss_rekey, acks_to_add);
-  }
-  receiver->ss_rekey = NULL;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "# rekeying successful\n");
-  GNUNET_STATISTICS_update (stats,
-                            "# rekeying successful",
-                            1,
-                            GNUNET_NO);
+  // destroy_all_secrets (ss, GNUNET_YES);
 }
 
 
@@ -1578,36 +1483,6 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity 
*pid, void *value)
               "in handle ack with cmac %s\n",
               GNUNET_h2s (&ack->cmac));
 
-  if (NULL != receiver->ss_rekey)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "We have rekey secret with cmac %s \n",
-                GNUNET_h2s (&receiver->ss_rekey->cmac));
-
-  if ((NULL != receiver->ss_rekey) && (0 == memcmp (&ack->cmac,
-                                                    &receiver->ss_rekey->cmac,
-                                                    sizeof(struct
-                                                           GNUNET_HashCode))) )
-  {
-    allowed = ntohl (ack->sequence_max);
-
-    if (allowed > receiver->ss_rekey->sequence_allowed)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "%u > %u (%u %u) for rekey secrect %s\n", allowed,
-                  receiver->ss_rekey->sequence_allowed,
-                  receiver->acks_available,
-                  ntohl (ack->acks_available),
-                  GNUNET_h2s (&receiver->ss_rekey->master));
-
-      receiver->ss_rekey->sequence_allowed = allowed;
-
-      if (GNUNET_NO == receiver->rekeying)
-        add_acks_rekey (receiver);
-
-      return GNUNET_NO;
-    }
-  }
-
   (void) pid;
   for (struct SharedSecret *ss = receiver->ss_head; NULL != ss; ss = ss->next)
   {
@@ -1615,114 +1490,36 @@ handle_ack (void *cls, const struct 
GNUNET_PeerIdentity *pid, void *value)
     {
 
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Found matching mac\n");
+                  "Found matching cmac\n");
 
-      allowed = ntohl (ack->sequence_max);
+      allowed = ntohl (ack->sequence_ack);
 
-      if (allowed > ss->sequence_allowed)
+      if (allowed <= ss->sequence_allowed)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "%u > %u (%u %u) for secret %s\n", allowed,
-                    ss->sequence_allowed,
-                    receiver->acks_available,
-                    ntohl (ack->acks_available),
-                    GNUNET_h2s (&ss->master));
-        acks_to_add = (allowed - ss->sequence_allowed);
-        if ((GNUNET_NO == receiver->rekeying) &&
-            (receiver->number_rekeying_kce < 3) )
-          acks_to_add = reset_rekey_kces (receiver, acks_to_add);
-
-        if ((0 != acks_to_add) && (GNUNET_NO == receiver->rekeying))
-        {
-          receiver->acks_available += (allowed - ss->sequence_allowed);
-          ss->sequence_allowed = allowed;
-          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                      "%u receiver->acks_available 5\n",
-                      receiver->acks_available);
-          add_acks (ss, acks_to_add);
-        }
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Ignoring ack, not giving us increased window\n.");
+        return GNUNET_NO;
       }
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "New sequence allows until %u from %u. Acks available to us: 
%u. For secret %s\n",
+                  allowed,
+                  ss->sequence_allowed,
+                  receiver->acks_available,
+                  GNUNET_h2s (&ss->master));
+      acks_to_add = (allowed - ss->sequence_allowed);
+      GNUNET_assert (0 != acks_to_add);
+      receiver->acks_available += (allowed - ss->sequence_allowed);
+      ss->sequence_allowed = allowed;
+      add_acks (ss, acks_to_add);
       return GNUNET_NO;
     }
   }
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "Matching cmac not found for ack!\n");
   return GNUNET_YES;
 }
 
 
-static void
-kce_generate_cb (void *cls)
-{
-  struct SharedSecret *ss = cls;
-
-  ss->sender->kce_task = NULL;
-
-  if (((GNUNET_NO == ss->sender->rekeying) && (ss->sender->acks_available <
-                                               KCN_TARGET) ) ||
-      ((ss->sender->ss_rekey == ss) && (GNUNET_YES == ss->sender->rekeying) &&
-       (ss->sender->acks_available < KCN_TARGET)))
-  {
-
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Precomputing %u keys for master %s\n",
-                GENERATE_AT_ONCE,
-                GNUNET_h2s (&(ss->master)));
-
-    for (int i = 0; i < GENERATE_AT_ONCE; i++)
-      kce_generate (ss, ++ss->sequence_allowed);
-
-    if (KCN_TARGET > ss->sender->acks_available)
-    {
-      ss->sender->kce_task = GNUNET_SCHEDULER_add_delayed (
-        WORKING_QUEUE_INTERVALL,
-        kce_generate_cb,
-        ss);
-    }
-    else
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "We have enough keys.\n");
-      ss_finished = ss;
-      ss->sender->kce_task_finished = GNUNET_YES;
-    }
-  }
-
-
-}
-
-
-static void
-kce_generate_rekey_cb (void *cls)
-{
-  struct SharedSecret *ss = cls;
-
-  ss->sender->kce_task_rekey = NULL;
-
-  if (NULL == ss->sender->kce_task)
-  {
-
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Precomputing keys for rekey master %s\n",
-                GNUNET_h2s (&(ss->master)));
-
-    for (int i = 0; i < GENERATE_AT_ONCE; i++)
-      kce_generate (ss, ++ss->sequence_allowed);
-
-    ss->sender->kce_task = GNUNET_SCHEDULER_add_delayed (
-      WORKING_QUEUE_INTERVALL,
-      kce_generate_cb,
-      ss);
-    ss->sender->kce_task_rekey = NULL;
-  }
-  else
-  {
-    ss->sender->kce_task_rekey = GNUNET_SCHEDULER_add_delayed (
-      WORKING_QUEUE_INTERVALL,
-      kce_generate_rekey_cb,
-      ss);
-  }
-}
-
-
 /**
  * We established a shared secret with a sender. We should try to send
  * the sender an `struct UDPAck` at the next opportunity to allow the
@@ -1730,26 +1527,18 @@ kce_generate_rekey_cb (void *cls)
  * recently).
  *
  * @param ss shared secret to generate ACKs for
- * @param initial The SharedSecret came with initial KX.
  */
 static void
-consider_ss_ack (struct SharedSecret *ss, int initial)
+consider_ss_ack (struct SharedSecret *ss)
 {
-  struct GNUNET_SCHEDULER_Task *kce_task_rekey;
-  struct GNUNET_SCHEDULER_Task *kce_task;
-  int kce_task_finished;
-
-  kce_task_rekey = ss->sender->kce_task_rekey;
-  kce_task_finished = ss->sender->kce_task_finished;
-  kce_task = ss->sender->kce_task;
-
+  struct UDPAck ack;
   GNUNET_assert (NULL != ss->sender);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Considering SS UDPAck %s\n",
               GNUNET_i2s_full (&ss->sender->target));
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "We have %u acks available.\n",
+              "Sender has %u acks available.\n",
               ss->sender->acks_available);
   /* drop ancient KeyCacheEntries */
   while ((NULL != ss->kce_head) &&
@@ -1758,73 +1547,50 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
     kce_destroy (ss->kce_tail);
 
 
-  if (GNUNET_NO == initial)
-    kce_generate (ss, ++ss->sequence_allowed);
+  ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
+  ack.header.size = htons (sizeof(ack));
+  ack.sequence_ack = htonl (ss->sequence_allowed);
+  ack.cmac = ss->cmac;
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "Notifying transport with UDPAck %s, sequence %u and master 
%s\n",
+              GNUNET_i2s_full (&ss->sender->target),
+              ss->sequence_allowed,
+              GNUNET_h2s (&(ss->master)));
+  GNUNET_TRANSPORT_communicator_notify (ch,
+                                        &ss->sender->target,
+                                        COMMUNICATOR_ADDRESS_PREFIX,
+                                        &ack.header);
+}
 
-  if (NULL != kce_task)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "kce_task is not NULL\n");
-  if (kce_task_finished)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "kce_task_finished: GNUNET_YES\n");
-  if (initial)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "initial: GNUNET_YES\n");
 
-  if (kce_task_finished || (GNUNET_NO == initial))
-  {
-    struct UDPAck ack;
-    struct SharedSecret *ss_tell;
+static void
+kce_generate_cb (void *cls)
+{
+  struct SharedSecret *ss = cls;
 
-    if (GNUNET_NO != initial)
-      ss_tell = ss_finished;
-    else
-      ss_tell = ss;
+  ss->kce_task = NULL;
 
-    ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
-    ack.header.size = htons (sizeof(ack));
-    ack.sequence_max = htonl (ss_tell->sequence_allowed);
-    ack.acks_available = htonl (ss->sender->acks_available);
-    ack.cmac = ss_tell->cmac;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Notifying transport of %u acks with UDPAck %s and initial %u 
and master %s\n",
-                ack.acks_available,
-                GNUNET_i2s_full (&ss_tell->sender->target),
-                initial,
-                GNUNET_h2s (&(ss_tell->master)));
-    GNUNET_TRANSPORT_communicator_notify (ch,
-                                          &ss_tell->sender->target,
-                                          COMMUNICATOR_ADDRESS_PREFIX,
-                                          &ack.header);
-    if (GNUNET_NO != initial)
-    {
-      destroy_all_secrets (ss, GNUNET_YES);
-      ss->sender->kce_task_finished = GNUNET_NO;
-    }
-  }
-  else if ((NULL == ss->sender->kce_task) && ((KCN_THRESHOLD >
-                                               ss->sender->acks_available) ||
-                                              (GNUNET_YES ==
-                                               ss->sender->rekeying) ||
-                                              (ss->sender->num_secrets >
-                                               MAX_SECRETS) ))
-  {
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Precomputing %u keys for master %s\n",
+              GENERATE_AT_ONCE,
+              GNUNET_h2s (&(ss->master)));
+  if (KCN_TARGET < ss->sender->acks_available)
+    return;
+  for (int i = 0; i < GENERATE_AT_ONCE; i++)
+    kce_generate (ss, ++ss->sequence_allowed);
 
-    // TODO This task must be per sender! FIXME: This is a nice todo, but I do 
not know what must be done here to fix.
-    ss->sender->kce_task = GNUNET_SCHEDULER_add_delayed (
+  if (KCN_TARGET > ss->sender->acks_available)
+  {
+    ss->kce_task = GNUNET_SCHEDULER_add_delayed (
       WORKING_QUEUE_INTERVALL,
       kce_generate_cb,
       ss);
-    ss->sender->kce_task_finished = GNUNET_NO;
-
-  }
-  else if ((NULL == kce_task_rekey) && (GNUNET_YES ==
-                                        ss->sender->rekeying) )
-  {
-    kce_task_rekey = GNUNET_SCHEDULER_add_delayed (WORKING_QUEUE_INTERVALL,
-                                                   kce_generate_rekey_cb,
-                                                   ss);
+    return;
   }
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "We have enough keys.\n");
+  ss->kce_task_finished = GNUNET_YES;
+  consider_ss_ack (ss);
 }
 
 
@@ -1844,12 +1610,12 @@ try_handle_plaintext (struct SenderAddress *sender,
   const struct GNUNET_MessageHeader *hdr;
   const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_pubkey;
   const struct UDPAck *ack;
+  const struct UDPRekey *rekey;
   struct SharedSecret *ss_rekey;
   const char *buf_pos = buf;
   size_t bytes_remaining = buf_size;
   uint16_t type;
 
-  buf_pos += sizeof (uint16_t);
   hdr = (struct GNUNET_MessageHeader*) buf_pos;
   if (sizeof(*hdr) > bytes_remaining)
   {
@@ -1868,14 +1634,13 @@ try_handle_plaintext (struct SenderAddress *sender,
   switch (type)
   {
   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_REKEY:
-    ephemeral_pubkey = (struct GNUNET_CRYPTO_EcdhePublicKey *) buf_pos;
-    ss_rekey = setup_shared_secret_dec (ephemeral_pubkey);
+    rekey = (struct UDPRekey*) buf_pos;
+    ss_rekey = setup_shared_secret_dec (&rekey->ephemeral);
     ss_rekey->sender = sender;
     GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss_rekey);
-    sender->ss_rekey = ss_rekey;
     sender->num_secrets++;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Received secret with cmac %s\n",
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Received rekey secret with cmac %s\n",
                 GNUNET_h2s (&(ss_rekey->cmac)));
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Received secret with master %s.\n",
@@ -1889,7 +1654,14 @@ try_handle_plaintext (struct SenderAddress *sender,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "We have %u acks available.\n",
                 ss_rekey->sender->acks_available);
-    consider_ss_ack (ss_rekey, GNUNET_YES);
+    ss_rekey->kce_task = GNUNET_SCHEDULER_add_delayed (
+      WORKING_QUEUE_INTERVALL,
+      kce_generate_cb,
+      ss_rekey);
+    // FIXME: Theoretically, this could be an Ack
+    buf_pos += ntohs (hdr->size);
+    bytes_remaining -= ntohs (hdr->size);
+    pass_plaintext_to_core (sender, buf_pos, bytes_remaining);
     break;
   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK:
     /* lookup master secret by 'cmac', then update sequence_max */
@@ -1939,6 +1711,7 @@ decrypt_box (const struct UDPBox *box,
                                 sizeof(out_buf),
                                 out_buf))
   {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed decryption.\n");
     GNUNET_STATISTICS_update (stats,
                               "# Decryption failures with valid KCE",
                               1,
@@ -2180,6 +1953,18 @@ sock_read (void *cls)
                     "Found KCE with kid %s\n",
                     GNUNET_sh2s (&box->kid));
         decrypt_box (box, (size_t) rcvd, kce);
+        if ((NULL == kce->ss->kce_task) &&
+            (GNUNET_YES == kce->ss->kce_task_finished) &&
+            (kce->ss->sender->acks_available < KCN_THRESHOLD))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Sender has %u ack left which is under threshold.\n",
+                      kce->ss->sender->acks_available);
+          kce->ss->kce_task = GNUNET_SCHEDULER_add_delayed (
+            WORKING_QUEUE_INTERVALL,
+            kce_generate_cb,
+            kce->ss);
+        }
         continue;
       }
     }
@@ -2270,7 +2055,6 @@ sock_read (void *cls)
       char pbuf[rcvd - sizeof(struct InitialKX)];
       const struct UDPConfirmation *uc;
       struct SenderAddress *sender;
-      uint16_t rekeying;
 
       kx = (const struct InitialKX *) buf;
       ss = setup_shared_secret_dec (&kx->ephemeral);
@@ -2315,6 +2099,15 @@ sock_read (void *cls)
       sender = setup_sender (&uc->sender, (const struct sockaddr *) &sa, 
salen);
       ss->sender = sender;
       GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss);
+      if ((NULL == ss->kce_task) && (GNUNET_NO ==
+                                     ss->kce_task_finished))
+      {
+        // TODO This task must be per sender! FIXME: This is a nice todo, but 
I do not know what must be done here to fix.
+        ss->kce_task = GNUNET_SCHEDULER_add_delayed (
+          WORKING_QUEUE_INTERVALL,
+          kce_generate_cb,
+          ss);
+      }
       sender->num_secrets++;
       GNUNET_STATISTICS_update (stats, "# Secrets active", 1, GNUNET_NO);
       GNUNET_STATISTICS_update (stats,
@@ -2489,20 +2282,10 @@ do_pad (gcry_cipher_hd_t out_cipher, char *dgram, 
size_t pad_size)
 }
 
 
-/**
- * Signature of functions implementing the sending functionality of a
- * message queue.
- *
- * @param mq the message queue
- * @param msg the message to send
- * @param impl_state our `struct ReceiverAddress`
- */
 static void
-mq_send_kx (struct GNUNET_MQ_Handle *mq,
-            const struct GNUNET_MessageHeader *msg,
-            void *impl_state)
+send_msg_with_kx (const struct GNUNET_MessageHeader *msg, struct
+                  ReceiverAddress *receiver)
 {
-  struct ReceiverAddress *receiver = impl_state;
   uint16_t msize = ntohs (msg->size);
   struct UdpHandshakeSignature uhs;
   struct UDPConfirmation uc;
@@ -2510,10 +2293,8 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
   char dgram[receiver->kx_mtu + sizeof(uc) + sizeof(kx)];
   size_t dpos;
   gcry_cipher_hd_t out_cipher;
-  uint16_t rekey_nbo;
   struct SharedSecret *ss;
 
-  GNUNET_assert (mq == receiver->kx_mq);
   if (msize > receiver->kx_mtu)
   {
     GNUNET_break (0);
@@ -2555,13 +2336,6 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
                                            &uc,
                                            sizeof(uc)));
   dpos += sizeof(uc);
-  rekey_nbo = htons (receiver->rekeying);
-  GNUNET_assert (0 == gcry_cipher_encrypt (out_cipher,
-                                           &dgram[dpos],
-                                           sizeof (uint16_t),
-                                           &rekey_nbo,
-                                           sizeof(uint16_t)));
-  dpos += sizeof (uint16_t);
   /* Append encrypted payload to dgram */
   GNUNET_assert (
     0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
@@ -2584,53 +2358,54 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
               msize,
               GNUNET_a2s (receiver->address,
                           receiver->address_len));
-  GNUNET_MQ_impl_send_continue (mq);
 }
 
 
+/**
+ * Signature of functions implementing the sending functionality of a
+ * message queue.
+ *
+ * @param mq the message queue
+ * @param msg the message to send
+ * @param impl_state our `struct ReceiverAddress`
+ */
 static void
-check_for_rekeying (struct ReceiverAddress *receiver)
+mq_send_kx (struct GNUNET_MQ_Handle *mq,
+            const struct GNUNET_MessageHeader *msg,
+            void *impl_state)
 {
+  struct ReceiverAddress *receiver = impl_state;
 
-  struct GNUNET_TIME_Relative rt;
+  GNUNET_assert (mq == receiver->kx_mq);
+  send_msg_with_kx (msg, receiver);
+  GNUNET_MQ_impl_send_continue (mq);
+}
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Timeout is %llu\n.",
-              (unsigned long long) receiver->rekey_timeout.abs_value_us);
 
-  if (0 == receiver->rekey_timeout.abs_value_us)
-  {
-    receiver->rekey_timeout = GNUNET_TIME_relative_to_absolute (
-      rekey_interval);
-  }
-  else
-  {
-    rt = GNUNET_TIME_absolute_get_remaining (receiver->rekey_timeout);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Relative time is %llu and timeout is %llu\n.",
-                (unsigned long long) rt.rel_value_us,
-                (unsigned long long) receiver->rekey_timeout.abs_value_us);
+static void
+create_rekey (struct ReceiverAddress *receiver, struct SharedSecret *ss, struct
+              UDPRekey *rekey)
+{
+  uint8_t is_ss_rekey_sequence_allowed_zero = GNUNET_NO;
+  uint8_t is_acks_available_below = GNUNET_NO;
+  uint8_t send_rekey = GNUNET_NO;
+  struct SharedSecret *ss_rekey;
 
-    if ((0 == rt.rel_value_us) || (receiver->rekey_send_bytes >
-                                   rekey_max_bytes) )
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Bytes send %llu greater than %llu max bytes\n.",
-                  (unsigned long long) receiver->rekey_send_bytes,
-                  rekey_max_bytes);
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Relative time is %llu and timeout is %llu\n.",
-                  (unsigned long long) rt.rel_value_us,
-                  (unsigned long long) receiver->rekey_timeout.abs_value_us);
-
-      receiver->rekey_timeout.abs_value_us = 0;
-      receiver->rekey_send_bytes = 0;
-      receiver->ss_rekey = NULL;
-      // destroy_all_secrets (ss, GNUNET_NO);
-      receiver->rekeying = GNUNET_YES;
-      receiver->rekey_acks_available = receiver->acks_available;
-    }
-  }
+  ss->rekey_initiated = GNUNET_YES;
+  /* setup key material */
+  ss_rekey = setup_shared_secret_ephemeral (&rekey->ephemeral,
+                                            receiver);
+  ss_rekey->sequence_allowed = 0;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Setup secret with k = %s\n",
+              GNUNET_h2s (&(ss_rekey->master)));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Setup secret with H(k) = %s\n",
+              GNUNET_h2s (&(ss_rekey->cmac)));
+
+  /* Append encrypted payload to dgram */
+  rekey->header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_REKEY);
+  rekey->header.size = htons (sizeof (struct UDPRekey));
 }
 
 
@@ -2643,100 +2418,72 @@ send_UDPRekey (struct ReceiverAddress *receiver, 
struct SharedSecret *ss)
   uint16_t not_below;
   struct UDPBox *box;
   struct UDPRekey rekey;
-  struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_pubkey;
+  struct SharedSecret *ss_rekey;
   size_t dpos;
 
   char rekey_dgram[sizeof (struct UDPBox) + sizeof(struct UDPRekey)
                    + receiver->d_mtu];
-
-  if (NULL == receiver->ss_rekey)
+  if (GNUNET_YES == ss->rekey_initiated)
   {
-    /* setup key material */
-    receiver->ss_rekey = setup_shared_secret_ephemeral (&ephemeral_pubkey,
-                                                        receiver);
-    receiver->ss_rekey->sequence_allowed = 0;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Setup secret with cmac %s\n",
-                GNUNET_h2s (&(receiver->ss_rekey->cmac)));
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Setup secret with master %s.\n",
-                GNUNET_h2s (&(receiver->ss_rekey->master)));
-  }
-  /* WTF is this */
-  not_below = (receiver->rekey_acks_available
-               - (receiver->rekey_acks_available % 3)) / 3;
-  is_ss_rekey_sequence_allowed_zero = (0 ==
-                                       receiver->ss_rekey->sequence_allowed);
-  is_acks_available_below = (receiver->acks_available >= not_below);
-  send_rekey = (0 == (receiver->acks_available - not_below) % not_below) &&
-               is_acks_available_below && is_ss_rekey_sequence_allowed_zero;
+    return;
+  }
+  ss->rekey_initiated = GNUNET_YES;
+  /* setup key material */
+  ss_rekey = setup_shared_secret_ephemeral (&rekey.ephemeral,
+                                            receiver);
+  ss_rekey->sequence_allowed = 0;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "send_rekey: %u, %u, %u\n",
-              send_rekey,
-              receiver->rekey_acks_available,
-              receiver->acks_available);
+              "Setup secret with k = %s\n",
+              GNUNET_h2s (&(ss_rekey->master)));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Setup secret with H(k) = %s\n",
+              GNUNET_h2s (&(ss_rekey->cmac)));
 
-  if (send_rekey)
-  {
-    GNUNET_assert (0 != receiver->number_rekeying_kce);
-    gcry_cipher_hd_t rekey_out_cipher;
+  gcry_cipher_hd_t rekey_out_cipher;
 
-    while (NULL != ss && ss->sequence_used >= ss->sequence_allowed)
-    {
-      ss = ss->prev;
-    }
+  /* Find suitable secret to encrypt this rekey message */
+  // while (NULL != ss && ss->sequence_used >= ss->sequence_allowed)
+  //  ss = ss->prev;
 
-    if (NULL != ss)
-    {
-      box = (struct UDPBox *) rekey_dgram;
-      ss->sequence_used++;
-      get_kid (&ss->master, ss->sequence_used, &box->kid);
-      receiver->number_rekeying_kce--;
-      setup_cipher (&ss->master, ss->sequence_used, &rekey_out_cipher);
-      /* Append encrypted payload to dgram */
-      rekey.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_REKEY);
-      rekey.header.size = htons (sizeof (struct UDPRekey));
-
-      GNUNET_assert (
-        0 == gcry_cipher_encrypt (rekey_out_cipher, &rekey,
-                                  sizeof(struct UDPRekey),
-                                  &box[1],
-                                  sizeof(struct UDPRekey)));
-      dpos = sizeof(struct UDPRekey) + sizeof (struct UDPBox);
-      do_pad (rekey_out_cipher, &rekey_dgram[dpos], sizeof(rekey_dgram)
-              - dpos);
-      GNUNET_assert (0 == gcry_cipher_gettag (rekey_out_cipher,
-                                              box->gcm_tag,
-                                              sizeof(box->gcm_tag)));
-      gcry_cipher_close (rekey_out_cipher);
+  box = (struct UDPBox *) rekey_dgram;
+  ss->sequence_used++;
+  get_kid (&ss->master, ss->sequence_used, &box->kid);
+  setup_cipher (&ss->master, ss->sequence_used, &rekey_out_cipher);
+  /* Append encrypted payload to dgram */
+  rekey.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_REKEY);
+  rekey.header.size = htons (sizeof (struct UDPRekey));
 
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Sending rekey with kid %s and new pubkey\n",
-                  GNUNET_sh2s (&box->kid));
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Sending rekey with cmac %s\n",
-                  GNUNET_h2s (&(receiver->ss_rekey->cmac)));
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "%u rekey kces left.\n",
-                  receiver->number_rekeying_kce);
+  GNUNET_assert (
+    0 == gcry_cipher_encrypt (rekey_out_cipher, &box[1],
+                              sizeof(struct UDPRekey),
+                              &rekey,
+                              sizeof(struct UDPRekey)));
+  dpos = sizeof(struct UDPRekey) + sizeof (struct UDPBox);
+  do_pad (rekey_out_cipher, &rekey_dgram[dpos], sizeof(rekey_dgram)
+          - dpos);
+  GNUNET_assert (0 == gcry_cipher_gettag (rekey_out_cipher,
+                                          box->gcm_tag,
+                                          sizeof(box->gcm_tag)));
+  gcry_cipher_close (rekey_out_cipher);
 
-      if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
-                                              rekey_dgram,
-                                              sizeof(rekey_dgram),
-                                              receiver->address,
-                                              receiver->address_len))
-        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "Sending rekey with kid %s and new pubkey\n",
+              GNUNET_sh2s (&box->kid));
+  if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
+                                          rekey_dgram,
+                                          sizeof(rekey_dgram),
+                                          receiver->address,
+                                          receiver->address_len))
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
 
-      receiver->acks_available--;
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "%u receiver->acks_available 1\n",
-                  receiver->acks_available);
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Sending UDPRekey to %s\n", GNUNET_a2s (receiver->address,
-                                                          receiver->
-                                                          address_len));
-    }
-  }
+  /* FIXME what is this */
+  receiver->acks_available--;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "%u receiver->acks_available 1\n",
+              receiver->acks_available);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Sending UDPRekey to %s\n", GNUNET_a2s (receiver->address,
+                                                      receiver->address_len));
 }
 
 
@@ -2754,6 +2501,8 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
            void *impl_state)
 {
   struct ReceiverAddress *receiver = impl_state;
+  struct UDPRekey rekey;
+  int inject_rekey = GNUNET_NO;
   uint16_t msize = ntohs (msg->size);
 
   GNUNET_assert (mq == receiver->d_mq);
@@ -2776,16 +2525,35 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
   /* begin "BOX" encryption method, scan for ACKs from tail! */
   for (struct SharedSecret *ss = receiver->ss_tail; NULL != ss; ss = ss->prev)
   {
+    size_t payload_len = sizeof(struct UDPBox) + receiver->d_mtu;
+    if (ss->sequence_used >= ss->sequence_allowed)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Skipping ss because no acks to use.\n");
+      continue;
+    }
+    if (ss->bytes_sent > rekey_max_bytes - sizeof (struct UDPRekey)
+        - receiver->d_mtu)
+    {
+      if (ss->rekey_initiated == GNUNET_NO)
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Injecting rekey for ss with byte sent %u\n",
+                    ss->bytes_sent);
+        create_rekey (receiver, ss, &rekey);
+        inject_rekey = GNUNET_YES;
+        payload_len += sizeof (rekey);
+        ss->rekey_initiated = GNUNET_YES;
+      }
+    }
     if (0 < ss->sequence_used)
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Trying to send UDPBox with shared secrect %s sequence_used 
%u and ss->sequence_allowed %u\n",
                   GNUNET_h2s (&ss->master),
                   ss->sequence_used,
                   ss->sequence_allowed);
-    if (ss->sequence_used >= ss->sequence_allowed)
-      continue;
 
-    char dgram[sizeof(struct UDPBox) + receiver->d_mtu];
+    char dgram[payload_len];
     struct UDPBox *box;
     gcry_cipher_hd_t out_cipher;
     size_t dpos;
@@ -2796,6 +2564,10 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
     setup_cipher (&ss->master, ss->sequence_used, &out_cipher);
     /* Append encrypted payload to dgram */
     dpos = sizeof(struct UDPBox);
+    GNUNET_assert (
+      0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], sizeof (rekey),
+                                &rekey, sizeof (rekey)));
+    dpos += sizeof (rekey);
     GNUNET_assert (
       0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
     dpos += msize;
@@ -2805,50 +2577,24 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
                                             sizeof(box->gcm_tag)));
     gcry_cipher_close (out_cipher);
 
-    receiver->rekey_send_bytes += sizeof(struct UDPBox) + receiver->d_mtu;
-
     if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
                                             dgram,
-                                            sizeof(dgram),
+                                            payload_len, // FIXME why always 
send sizeof dgram?
                                             receiver->address,
                                             receiver->address_len))
       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Sending UDPBox with payload size %u, %u acks left\n",
+                "Sending UDPBox with payload size %u, %u acks left, %u bytes 
sent\n",
                 msize,
                 receiver->acks_available);
+    ss->bytes_sent += sizeof (dgram);
     GNUNET_MQ_impl_send_continue (mq);
     receiver->acks_available--;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "%u receiver->acks_available 2\n",
-                receiver->acks_available);
-    check_for_rekeying (receiver);
-    if (0 == receiver->acks_available - receiver->number_rekeying_kce)
-    {
-      /* We have no more ACKs */
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "No more acks\n");
-      if (GNUNET_YES == receiver->rekeying)
-      {
-        receiver->rekeying = GNUNET_NO;
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "Sender stopped rekeying\n");
-
-        if ((NULL != receiver->ss_rekey) && (0 <
-                                             receiver->ss_rekey->
-                                             sequence_allowed) )
-          add_acks_rekey (receiver);
-      }
-      else
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "rekeying\n");
-        send_UDPRekey (receiver, ss);
-      }
-    }
-
     return;
   }
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "No suitable ss found, sending as KX...\n");
+  send_msg_with_kx (msg, receiver);
 }
 
 
@@ -3111,16 +2857,6 @@ get_sender_delete_it (void *cls,
   (void) cls;
   (void) target;
 
-  if (NULL != sender->kce_task_rekey)
-  {
-    GNUNET_SCHEDULER_cancel (sender->kce_task_rekey);
-    sender->kce_task_rekey = NULL;
-  }
-  if (NULL != sender->kce_task)
-  {
-    GNUNET_SCHEDULER_cancel (sender->kce_task);
-    sender->kce_task = NULL;
-  }
 
   sender_destroy (sender);
   return GNUNET_OK;
diff --git a/src/transport/test_communicator_udp_rekey_peer1.conf 
b/src/transport/test_communicator_udp_rekey_peer1.conf
index de99b926f..e2ebbc4c8 100644
--- a/src/transport/test_communicator_udp_rekey_peer1.conf
+++ b/src/transport/test_communicator_udp_rekey_peer1.conf
@@ -46,7 +46,7 @@ BINDTO = 60002
 DISABLE_V6 = YES
 MAX_QUEUE_LENGTH=5000
 REKEY_INTERVAL = 100ms
-REKEY_MAX_BYTES=9MiB
+REKEY_MAX_BYTES=90KiB
 
 [communicator-test]
 BACKCHANNEL_ENABLED = YES
diff --git a/src/transport/test_communicator_udp_rekey_peer2.conf 
b/src/transport/test_communicator_udp_rekey_peer2.conf
index 379901128..0b51364c3 100644
--- a/src/transport/test_communicator_udp_rekey_peer2.conf
+++ b/src/transport/test_communicator_udp_rekey_peer2.conf
@@ -46,7 +46,7 @@ BINDTO = 60003
 DISABLE_V6 = YES
 MAX_QUEUE_LENGTH=5000
 REKEY_INTERVAL = 100ms
-REKEY_MAX_BYTES=9MiB
+REKEY_MAX_BYTES=90KiB
 
 [communicator-test]
 BACKCHANNEL_ENABLED = YES
diff --git a/src/transport/transport-testing-communicator.c 
b/src/transport/transport-testing-communicator.c
index e1090eaeb..d0e32a544 100644
--- a/src/transport/transport-testing-communicator.c
+++ b/src/transport/transport-testing-communicator.c
@@ -260,7 +260,7 @@ handle_communicator_backchannel (void *cls,
   }
   /* Find client providing this communicator */
   /* Finally, deliver backchannel message to communicator */
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
+  LOG (GNUNET_ERROR_TYPE_ERROR,
        "Delivering backchannel message of type %u to %s\n",
        ntohs (msg->type),
        target_communicator);

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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