convert fs publish to MQ
[oweals/gnunet.git] / src / core / gnunet-service-core_kx.c
index 9d8fb415b1d3e0adaffcd238e38c0ad7186240de..6a1924e5409b327b3deb842d6360cd050a3c9405 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2009-2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009-2013 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -659,11 +659,9 @@ send_key (struct GSC_KeyExchangeInfo *kx);
  * Task that will retry #send_key() if our previous attempt failed.
  *
  * @param cls our `struct GSC_KeyExchangeInfo`
- * @param tc scheduler context
  */
 static void
-set_key_retry_task (void *cls,
-                    const struct GNUNET_SCHEDULER_TaskContext *tc)
+set_key_retry_task (void *cls)
 {
   struct GSC_KeyExchangeInfo *kx = cls;
 
@@ -687,6 +685,8 @@ setup_fresh_ping (struct GSC_KeyExchangeInfo *kx)
   struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
 
   pm = &kx->ping;
+  kx->ping_challenge = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                                 UINT32_MAX);
   pm->header.size = htons (sizeof (struct PingMessage));
   pm->header.type = htons (GNUNET_MESSAGE_TYPE_CORE_PING);
   pm->iv_seed = calculate_seed (kx);
@@ -745,9 +745,10 @@ GSC_KX_start (const struct GNUNET_PeerIdentity *pid)
   {
     /* peer with "higher" identity starts a delayed  KX, if the "lower" peer
      * does not start a KX since he sees no reasons to do so  */
-    kx->retry_set_key_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-                                                           &set_key_retry_task,
-                                                           kx);
+    kx->retry_set_key_task
+      = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+                                     &set_key_retry_task,
+                                     kx);
   }
   return kx;
 }
@@ -836,8 +837,8 @@ derive_session_keys (struct GSC_KeyExchangeInfo *kx)
 
 
 /**
- * We received a SET_KEY message.  Validate and update
- * our key material and status.
+ * We received a #GNUNET_MESSAGE_TYPE_CORE_EPHEMERAL_KEY message.
+ * Validate and update our key material and status.
  *
  * @param kx key exchange status for the corresponding peer
  * @param msg the set key message we received
@@ -915,9 +916,9 @@ GSC_KX_handle_ephemeral_key (struct GSC_KeyExchangeInfo *kx,
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                _("Ephemeral key message from peer `%s' rejected as its validity range does not match our system time (%llu not in [%llu,%llu]).\n"),
                GNUNET_i2s (&kx->peer),
-               now.abs_value_us,
-               start_t.abs_value_us,
-               end_t.abs_value_us);
+               (unsigned long long) now.abs_value_us,
+                (unsigned long long) start_t.abs_value_us,
+                (unsigned long long) end_t.abs_value_us);
     return;
   }
   kx->other_ephemeral_key = m->ephemeral_key;
@@ -1058,16 +1059,14 @@ GSC_KX_handle_ping (struct GSC_KeyExchangeInfo *kx,
               &GSC_my_identity,
               sizeof (struct GNUNET_PeerIdentity)))
   {
-    char sender[9];
-    char peer[9];
-
-    GNUNET_snprintf (sender, sizeof (sender), "%8s", GNUNET_i2s (&kx->peer));
-    GNUNET_snprintf (peer, sizeof (peer), "%8s", GNUNET_i2s (&t.target));
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                _("Received PING from `%s' for different identity: I am `%s', PONG identity: `%s'\n"),
-                sender,
-                GNUNET_i2s (&GSC_my_identity),
-                peer);
+    if (GNUNET_CORE_KX_STATE_REKEY_SENT != kx->status)
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Decryption of PING from peer `%s' failed\n",
+                  GNUNET_i2s (&kx->peer));
+    else
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Decryption of PING from peer `%s' failed after rekey (harmless)\n",
+                  GNUNET_i2s (&kx->peer));
     GNUNET_break_op (0);
     return;
   }
@@ -1104,11 +1103,9 @@ GSC_KX_handle_ping (struct GSC_KeyExchangeInfo *kx,
  * (and we should prevent this by sending a PING).
  *
  * @param cls the `struct GSC_KeyExchangeInfo`
- * @param tc scheduler context (not used)
  */
 static void
-send_keep_alive (void *cls,
-                 const struct GNUNET_SCHEDULER_TaskContext *tc)
+send_keep_alive (void *cls)
 {
   struct GSC_KeyExchangeInfo *kx = cls;
   struct GNUNET_TIME_Relative retry;
@@ -1398,7 +1395,7 @@ GSC_KX_encrypt_and_transmit (struct GSC_KeyExchangeInfo *kx,
                              used - ENCRYPTED_HEADER_SIZE));
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Encrypted %u bytes for %s\n",
-              used - ENCRYPTED_HEADER_SIZE,
+              (unsigned int) (used - ENCRYPTED_HEADER_SIZE),
               GNUNET_i2s (&kx->peer));
   derive_auth_key (&auth_key,
                   &kx->encrypt_key,
@@ -1520,7 +1517,7 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx,
     return;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Decrypted %u bytes from %s\n",
-              size - ENCRYPTED_HEADER_SIZE,
+              (unsigned int) (size - ENCRYPTED_HEADER_SIZE),
               GNUNET_i2s (&kx->peer));
   pt = (struct EncryptedMessage *) buf;
 
@@ -1698,11 +1695,9 @@ sign_ephemeral_key ()
  * Task run to trigger rekeying.
  *
  * @param cls closure, NULL
- * @param tc scheduler context
  */
 static void
-do_rekey (void *cls,
-         const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_rekey (void *cls)
 {
   struct GSC_KeyExchangeInfo *pos;
 
@@ -1711,6 +1706,8 @@ do_rekey (void *cls,
                                             NULL);
   if (NULL != my_ephemeral_key)
     GNUNET_free (my_ephemeral_key);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Rekeying\n");
   my_ephemeral_key = GNUNET_CRYPTO_ecdhe_key_create ();
   GNUNET_assert (NULL != my_ephemeral_key);
   sign_ephemeral_key ();