gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated: NEWS: -


From: gnunet
Subject: [gnunet] branch master updated: NEWS: -
Date: Sat, 29 Jul 2023 13:42:31 +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 6c9229f7a NEWS: -
6c9229f7a is described below

commit 6c9229f7a8266ea13cff1aff25269b41ce9f3b03
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Sat Jul 29 13:42:03 2023 +0200

    NEWS: -
    
    TNG: Simplify rekey message and incorporate into regular boxed message.
---
 src/include/gnunet_protocols.h          |   7 +-
 src/transport/gnunet-communicator-udp.c | 338 +++++++++++---------------------
 2 files changed, 116 insertions(+), 229 deletions(-)

diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index e78738d7b..99a1adcf4 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -2352,7 +2352,7 @@ extern "C" {
 /** M<->S<->C: PSYC message which contains a header and one or more message
  * parts. */
 #define GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_HEADER \
-  692 // FIXME: start using this where appropriate
+        692 // FIXME: start using this where appropriate
 
 /** Message part: method */
 #define GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD 693
@@ -3529,6 +3529,11 @@ extern "C" {
  */
 #define GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD 1461
 
+/**
+ * UDP Rekey.
+ */
+#define GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_REKEY 1462
+
 /**
  * Next available: 1500
  */
diff --git a/src/transport/gnunet-communicator-udp.c 
b/src/transport/gnunet-communicator-udp.c
index 5a6d8f1f9..c69fb233c 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -350,23 +350,14 @@ struct UDPBox
 struct UDPRekey
 {
   /**
-   * Key and IV identification code. KDF applied to an acknowledged
-   * base key and a sequence number.  Sequence numbers must be used
-   * monotonically increasing up to the maximum specified in
-   * `struct UDPAck`. Without further `struct UDPAck`s, the sender
-   * must fall back to sending handshakes!
+   * Type is #GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_REKEY.
    */
-  struct GNUNET_ShortHashCode kid;
+  struct GNUNET_MessageHeader header;
 
   /**
-   * 128-bit authentication tag for the following encrypted message,
-   * from GCM.  MAC starts at the @e body_start that follows and
-   * extends until the end of the UDP payload.  If the @e hmac is
-   * wrong, the receiver should check if the message might be a
-   * `struct UdpHandshakeSignature`.
+   * Ephemeral key to rekey with.
    */
-  uint8_t gcm_tag[GCM_TAG_SIZE];
-
+  struct GNUNET_CRYPTO_EcdhePublicKey ephemeral;
 };
 
 GNUNET_NETWORK_STRUCT_END
@@ -1658,76 +1649,6 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity 
*pid, void *value)
 }
 
 
-/**
- * Test if we have received a valid message in plaintext.
- * If so, handle it.
- *
- * @param sender peer to process inbound plaintext for
- * @param buf buffer we received
- * @param buf_size number of bytes in @a buf
- * @return rekey_indication GNUNET_YES if a rekey is signalled
- */
-static uint16_t
-try_handle_plaintext (struct SenderAddress *sender,
-                      const void *buf,
-                      size_t buf_size)
-{
-  const struct GNUNET_MessageHeader *hdr;
-  const struct UDPAck *ack;
-  const char *buf_pos = buf;
-  size_t bytes_remaining = buf_size;
-  uint16_t type;
-  uint16_t rekey;
-
-  if (sizeof (uint16_t) > buf_size)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Plaintext too short, dropping...\n");
-    rekey = ntohs (*(uint16_t*) buf);
-    return GNUNET_NO;
-  }
-  bytes_remaining -= sizeof (uint16_t);
-  buf_pos += sizeof (uint16_t);
-  hdr = (struct GNUNET_MessageHeader*) buf_pos;
-  if (sizeof(*hdr) > bytes_remaining)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Plaintext too short, dropping...\n");
-    return rekey; /* no data left */
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "try_handle_plaintext of size %lu (%u %lu) and type %u\n",
-              bytes_remaining,
-              ntohs (hdr->size),
-              sizeof(*hdr),
-              ntohs (hdr->type));
-  if (ntohs (hdr->size) > bytes_remaining)
-    return GNUNET_NO; /* buffer too short for indicated message length */
-  type = ntohs (hdr->type);
-  switch (type)
-  {
-  case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK:
-    /* lookup master secret by 'cmac', then update sequence_max */
-    ack = (struct UDPAck*) buf_pos;
-    GNUNET_CONTAINER_multipeermap_get_multiple (receivers,
-                                                &sender->target,
-                                                &handle_ack,
-                                                (void *) ack);
-    /* There could be more messages after the ACK, handle those as well */
-    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_PAD:
-    /* skip padding */
-    break;
-
-  default:
-    pass_plaintext_to_core (sender, buf_pos, bytes_remaining);
-  }
-  return rekey;
-}
-
-
 static void
 kce_generate_cb (void *cls)
 {
@@ -1907,6 +1828,93 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
 }
 
 
+/**
+ * Test if we have received a valid message in plaintext.
+ * If so, handle it.
+ *
+ * @param sender peer to process inbound plaintext for
+ * @param buf buffer we received
+ * @param buf_size number of bytes in @a buf
+ */
+static void
+try_handle_plaintext (struct SenderAddress *sender,
+                      const void *buf,
+                      size_t buf_size)
+{
+  const struct GNUNET_MessageHeader *hdr;
+  const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_pubkey;
+  const struct UDPAck *ack;
+  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)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Plaintext too short, dropping...\n");
+    return; /* no data left */
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "try_handle_plaintext of size %lu (%u %lu) and type %u\n",
+              bytes_remaining,
+              ntohs (hdr->size),
+              sizeof(*hdr),
+              ntohs (hdr->type));
+  if (ntohs (hdr->size) > bytes_remaining)
+    return; /* buffer too short for indicated message length */
+  type = ntohs (hdr->type);
+  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);
+    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_h2s (&(ss_rekey->cmac)));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received secret with master %s.\n",
+                GNUNET_h2s (&(ss_rekey->master)));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "We have %u sequence_allowed.\n",
+                ss_rekey->sequence_allowed);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "We have a sender %p\n",
+                ss_rekey->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);
+    break;
+  case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK:
+    /* lookup master secret by 'cmac', then update sequence_max */
+    ack = (struct UDPAck*) buf_pos;
+    GNUNET_CONTAINER_multipeermap_get_multiple (receivers,
+                                                &sender->target,
+                                                &handle_ack,
+                                                (void *) ack);
+    /* There could be more messages after the ACK, handle those as well */
+    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_PAD:
+    /* skip padding */
+    break;
+
+  default:
+    pass_plaintext_to_core (sender, buf_pos, bytes_remaining);
+  }
+  return;
+}
+
+
 /**
  * We received a @a box with matching @a kce.  Decrypt and process it.
  *
@@ -1950,94 +1958,7 @@ decrypt_box (const struct UDPBox *box,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "decrypted UDPBox with kid %s\n",
               GNUNET_sh2s (&box->kid));
-  rekeying = try_handle_plaintext (ss->sender, out_buf, sizeof(out_buf));
-  if ((GNUNET_NO == rekeying) && (GNUNET_YES == ss->sender->rekeying))
-  {
-    ss->sender->rekeying = GNUNET_NO;
-    ss->sender->ss_rekey = NULL;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Receiver stopped rekeying.\n");
-  }
-  else if (GNUNET_YES == rekeying)
-  {
-    ss->sender->rekeying = GNUNET_YES;
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Got Box: Receiver doing rekeying.\n");
-  }
-}
-
-
-/**
- * We received a @a rekey with matching @a kce.  Decrypt and process it.
- *
- * @param rekey the data we received
- * @param rekey_len number of bytes in @a rekey
- * @param kce key index to decrypt @a rekey
- */
-static void
-decrypt_rekey (const struct UDPRekey *rekey,
-               size_t rekey_len,
-               struct KeyCacheEntry *kce)
-{
-  struct SharedSecret *ss = kce->ss;
-  struct SharedSecret *ss_rekey;
-  char out_buf[rekey_len - sizeof(*rekey)];
-  struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_pubkey;
-  struct SenderAddress *sender;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "decrypt_rekey.\n");
-
-  GNUNET_assert (NULL != ss->sender);
-  sender = ss->sender;
-  if (GNUNET_OK != try_decrypt (ss,
-                                rekey->gcm_tag,
-                                kce->sequence_number,
-                                (const char *) &rekey[1],
-                                sizeof(out_buf),
-                                out_buf))
-  {
-    GNUNET_STATISTICS_update (stats,
-                              "# Decryption failures with valid KCE",
-                              1,
-                              GNUNET_NO);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Decryption with kid %s failed\n",
-                GNUNET_sh2s (&rekey->kid));
-    kce_destroy (kce);
-    return;
-  }
-  kce_destroy (kce);
-  GNUNET_STATISTICS_update (stats,
-                            "# bytes decrypted with Rekey",
-                            sizeof(out_buf),
-                            GNUNET_NO);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "decrypted UDPRekey with kid %s\n",
-              GNUNET_sh2s (&rekey->kid));
-  ephemeral_pubkey = (struct GNUNET_CRYPTO_EcdhePublicKey *) out_buf;
-  ss_rekey = setup_shared_secret_dec (ephemeral_pubkey);
-  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_h2s (&(ss_rekey->cmac)));
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received secret with master %s.\n",
-              GNUNET_h2s (&(ss_rekey->master)));
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "We have %u sequence_allowed.\n",
-              ss_rekey->sequence_allowed);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "We have a sender %p\n",
-              ss_rekey->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);
-
+  try_handle_plaintext (ss->sender, out_buf, sizeof(out_buf));
 }
 
 
@@ -2245,26 +2166,6 @@ sock_read (void *cls)
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Read %lu bytes\n", rcvd);
 
-    if (rcvd > sizeof(struct UDPRekey))
-    {
-      const struct UDPRekey *rekey;
-      const struct UDPBox *box;
-      struct KeyCacheEntry *kce;
-      int do_decrypt = GNUNET_NO;
-
-      rekey = (const struct UDPRekey *) buf;
-      kce = GNUNET_CONTAINER_multishortmap_get (key_cache, &rekey->kid);
-
-      if ((NULL != kce) && (GNUNET_YES == kce->ss->sender->rekeying))
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "UDPRekey with kid %s\n",
-                    GNUNET_sh2s (&rekey->kid));
-        decrypt_rekey (rekey, (size_t) rcvd, kce);
-        return;
-      }
-    }
-
     /* first, see if it is a UDPBox */
     if (rcvd > sizeof(struct UDPBox))
     {
@@ -2420,24 +2321,7 @@ sock_read (void *cls)
                                 "# messages decrypted without BOX",
                                 1,
                                 GNUNET_NO);
-      rekeying = try_handle_plaintext (sender, &uc[1], sizeof(pbuf)
-                                       - sizeof(*uc));
-      if ((GNUNET_NO == rekeying) && (GNUNET_YES == ss->sender->rekeying))
-      {
-        ss->sender->rekeying = GNUNET_NO;
-        sender->ss_rekey = NULL;
-        // destroy_all_secrets (ss, GNUNET_NO);
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "Receiver stopped rekeying.\n");
-      }
-      else if (GNUNET_NO == rekeying)
-        consider_ss_ack (ss, GNUNET_YES);
-      else
-      {
-        ss->sender->rekeying = GNUNET_YES;
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "Got KX: Receiver doing rekeying.\n");
-      }
+      try_handle_plaintext (sender, &uc[1], sizeof(pbuf) - sizeof(*uc));
     }
   }
 }
@@ -2757,11 +2641,13 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct 
SharedSecret *ss)
   uint8_t is_acks_available_below = GNUNET_NO;
   uint8_t send_rekey = GNUNET_NO;
   uint16_t not_below;
-  struct UDPRekey *rekey;
+  struct UDPBox *box;
+  struct UDPRekey rekey;
   struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_pubkey;
   size_t dpos;
 
-  char rekey_dgram[sizeof(struct UDPRekey) + receiver->d_mtu];
+  char rekey_dgram[sizeof (struct UDPBox) + sizeof(struct UDPRekey)
+                   + receiver->d_mtu];
 
   if (NULL == receiver->ss_rekey)
   {
@@ -2776,6 +2662,7 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct 
SharedSecret *ss)
                 "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 ==
@@ -2801,30 +2688,31 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct 
SharedSecret *ss)
 
     if (NULL != ss)
     {
-      rekey = (struct UDPRekey *) rekey_dgram;
+      box = (struct UDPBox *) rekey_dgram;
       ss->sequence_used++;
-      get_kid (&ss->master, ss->sequence_used, &rekey->kid);
+      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 */
-      dpos = sizeof(struct UDPRekey);
+      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_dgram[dpos],
-                                  sizeof(ephemeral_pubkey),
-                                  &ephemeral_pubkey,
-                                  sizeof(ephemeral_pubkey)));
-      dpos += sizeof(ephemeral_pubkey);
+        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,
-                                              rekey->gcm_tag,
-                                              sizeof(rekey->gcm_tag)));
+                                              box->gcm_tag,
+                                              sizeof(box->gcm_tag)));
       gcry_cipher_close (rekey_out_cipher);
 
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Sending rekey with kid %s and new pubkey\n",
-                  GNUNET_sh2s (&rekey->kid));
+                  GNUNET_sh2s (&box->kid));
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Sending rekey with cmac %s\n",
                   GNUNET_h2s (&(receiver->ss_rekey->cmac)));
@@ -2901,7 +2789,6 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
     struct UDPBox *box;
     gcry_cipher_hd_t out_cipher;
     size_t dpos;
-    uint16_t rekey_nbo;
 
     box = (struct UDPBox *) dgram;
     ss->sequence_used++;
@@ -2909,11 +2796,6 @@ 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);
-    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);
     GNUNET_assert (
       0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
     dpos += msize;

-- 
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]