gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r16944 - in gnunet/src: include transport


From: gnunet
Subject: [GNUnet-SVN] r16944 - in gnunet/src: include transport
Date: Mon, 19 Sep 2011 10:55:11 +0200

Author: grothoff
Date: 2011-09-19 10:55:11 +0200 (Mon, 19 Sep 2011)
New Revision: 16944

Modified:
   gnunet/src/include/gnunet_signatures.h
   gnunet/src/transport/gnunet-service-transport.c
   gnunet/src/transport/gnunet-service-transport_neighbours.c
Log:
generate valid disconnect message -- Mantis #1789

Modified: gnunet/src/include/gnunet_signatures.h
===================================================================
--- gnunet/src/include/gnunet_signatures.h      2011-09-19 08:29:44 UTC (rev 
16943)
+++ gnunet/src/include/gnunet_signatures.h      2011-09-19 08:55:11 UTC (rev 
16944)
@@ -48,12 +48,10 @@
 #define GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN 1
 
 /**
- * Signature for confirming that this peer connected to another peer
- * using a particular address (LEGACY)
+ * Signature for confirming that this peer intends to disconnect.
  */
-#define GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_USING 2
+#define GNUNET_SIGNATURE_PURPOSE_TRANSPORT_DISCONNECT 2
 
-
 /**
  * Purpose is to set a session key.
  */

Modified: gnunet/src/transport/gnunet-service-transport.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport.c     2011-09-19 08:29:44 UTC 
(rev 16943)
+++ gnunet/src/transport/gnunet-service-transport.c     2011-09-19 08:55:11 UTC 
(rev 16944)
@@ -205,8 +205,8 @@
        * * way to communicate with this peer (other peer switched transport) */
       break;
     case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT:
-      /* TODO: do some validation to prevent an attacker from sending
-       * a fake disconnect message... */
+      /* FIXME: do some validation to prevent an attacker from sending
+       * a fake disconnect message... */         
       GST_neighbours_force_disconnect (peer);
       break;
     case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE:

Modified: gnunet/src/transport/gnunet-service-transport_neighbours.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_neighbours.c  2011-09-19 
08:29:44 UTC (rev 16943)
+++ gnunet/src/transport/gnunet-service-transport_neighbours.c  2011-09-19 
08:55:11 UTC (rev 16944)
@@ -78,6 +78,39 @@
 };
 
 
+struct SessionDisconnectMessage
+{
+  /**
+   * Header of type 'GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT'
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Always zero.
+   */
+  uint32_t reserved GNUNET_PACKED;
+
+  /**
+   * Purpose of the signature.  Extends over the timestamp.
+   * Purpose should be GNUNET_SIGNATURE_PURPOSE_TRANSPORT_DISCONNECT.
+   */
+  struct GNUNET_CRYPTO_RsaSignaturePurpose purpose;
+
+  /**
+   * Absolute time at the sender.  Only the most recent connect
+   * message implies which session is preferred by the sender.
+   */
+  struct GNUNET_TIME_AbsoluteNBO timestamp;
+
+  /**
+   * Signature of the peer that sends us the disconnect.  Only
+   * valid if the timestamp is AFTER the timestamp from the
+   * corresponding 'CONNECT' message.
+   */
+  struct GNUNET_CRYPTO_RsaSignature signature;
+};
+
+
 /**
  * For each neighbour we keep a list of messages
  * that we still want to transmit to the neighbour.
@@ -1023,7 +1056,7 @@
 {
   struct NeighbourMapEntry *n;
   struct GNUNET_TRANSPORT_PluginFunctions *papi;
-  struct GNUNET_MessageHeader disconnect_msg;
+  struct SessionDisconnectMessage disconnect_msg;
 
   GNUNET_assert (neighbours != NULL);
 
@@ -1033,8 +1066,17 @@
   if (GNUNET_YES == n->is_connected)
   {
     /* we're actually connected, send DISCONNECT message */
-    disconnect_msg.size = htons (sizeof (struct GNUNET_MessageHeader));
-    disconnect_msg.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT);
+    disconnect_msg.header.size = htons (sizeof (struct 
SessionDisconnectMessage));
+    disconnect_msg.header.type = htons 
(GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT);
+    disconnect_msg.reserved = htonl (0);
+    disconnect_msg.purpose.size = htonl (sizeof (struct 
GNUNET_CRYPTO_RsaSignaturePurpose) +
+                                        sizeof (struct 
GNUNET_TIME_AbsoluteNBO));
+    disconnect_msg.purpose.purpose = htonl 
(GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT);
+    disconnect_msg.timestamp = GNUNET_TIME_absolute_hton 
(GNUNET_TIME_absolute_get ());
+    GNUNET_assert (GNUNET_OK ==
+                  GNUNET_CRYPTO_rsa_sign (GST_my_private_key,
+                                          &disconnect_msg.purpose,
+                                          &disconnect_msg.signature));
     papi = GST_plugins_find (n->plugin_name);
     if (papi != NULL)
       papi->send (papi->cls, target, (const void *) &disconnect_msg,




reply via email to

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