-fixing #2434, plus some code cleanup
[oweals/gnunet.git] / src / core / gnunet-service-core_kx.c
index b29d15731ea69aa5c9c3b453a935071995f41d0a..31f5bb494f36111c3f34636b0ebde2fc234bdaf2 100644 (file)
@@ -41,7 +41,7 @@
 /**
  * Set to GNUNET_YES to perform some slightly expensive internal invariant checks.
  */
-#define EXTRA_CHECKS GNUNET_NO
+#define EXTRA_CHECKS GNUNET_YES
 
 /**
  * How long do we wait for SET_KEY confirmation initially?
@@ -207,7 +207,7 @@ struct EncryptedMessage
    * (excluding this value itself) will be encrypted and authenticated.
    * ENCRYPTED_HEADER_SIZE must be set to the offset of the *next* field.
    */
-  GNUNET_HashCode hmac;
+  struct GNUNET_HashCode hmac;
 
   /**
    * Sequence number, in network byte order.  This field
@@ -675,7 +675,7 @@ process_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
   struct SetKeyMessage *skm;
 
   CHECK_KX (kx);
-  if (err_msg != NULL)
+  if (NULL != err_msg)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 _("Error in communication with PEERINFO service\n"));
@@ -687,10 +687,10 @@ process_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
                                       &set_key_retry_task, kx);
     return;
   }
-  if (peer == NULL)
+  if (NULL == peer)
   {
     kx->pitr = NULL;
-    if (kx->public_key != NULL)
+    if (NULL != kx->public_key)
       return;                   /* done here */
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Failed to obtain public key for peer `%4s', delaying processing of SET_KEY\n",
@@ -707,7 +707,7 @@ process_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
     return;
   }
   GNUNET_break (0 == memcmp (peer, &kx->peer, sizeof (struct GNUNET_PeerIdentity)));
-  if (kx->public_key != NULL)
+  if (NULL != kx->public_key)
   {
     /* already have public key, why are we here? */
     GNUNET_break (0);
@@ -774,7 +774,7 @@ GSC_KX_stop (struct GSC_KeyExchangeInfo *kx)
 {
   GNUNET_STATISTICS_update (GSC_stats, gettext_noop ("# key exchanges stopped"),
                             1, GNUNET_NO);
-  if (kx->pitr != NULL)
+  if (NULL != kx->pitr)
   {
     GNUNET_PEERINFO_iterate_cancel (kx->pitr);
     kx->pitr = NULL;
@@ -831,7 +831,7 @@ GSC_KX_handle_set_key (struct GSC_KeyExchangeInfo *kx,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Core service receives `%s' request from `%4s'.\n", "SET_KEY",
               GNUNET_i2s (&kx->peer));
-  if (kx->public_key == NULL)
+  if (NULL == kx->public_key)
   {
     GNUNET_free_non_null (kx->skm_received);
     kx->skm_received = (struct SetKeyMessage *) GNUNET_copy_message (msg);
@@ -877,6 +877,12 @@ GSC_KX_handle_set_key (struct GSC_KeyExchangeInfo *kx,
       (GNUNET_OK != GNUNET_CRYPTO_aes_check_session_key (&k)))
   {
     /* failed to decrypt !? */
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+               "Invalid key %x decrypted by %s from message %u (origin: %s)\n",
+               (unsigned int) GNUNET_CRYPTO_crc32_n (&k, sizeof (struct GNUNET_CRYPTO_AesSessionKey)),
+               GNUNET_i2s (&GSC_my_identity),
+               (unsigned int) GNUNET_CRYPTO_crc32_n (&m->encrypted_key, sizeof (struct GNUNET_CRYPTO_RsaEncryptedData)),
+               GNUNET_h2s (&kx->peer.hashPubKey));
     GNUNET_break_op (0);
     return;
   }
@@ -926,14 +932,14 @@ GSC_KX_handle_set_key (struct GSC_KeyExchangeInfo *kx,
     GNUNET_break (0);
     break;
   }
-  if (kx->ping_received != NULL)
+  if (NULL != kx->ping_received)
   {
     ping = kx->ping_received;
     kx->ping_received = NULL;
     GSC_KX_handle_ping (kx, &ping->header);
     GNUNET_free (ping);
   }
-  if (kx->pong_received != NULL)
+  if (NULL != kx->pong_received)
   {
     pong = kx->pong_received;
     kx->pong_received = NULL;
@@ -1058,6 +1064,13 @@ setup_fresh_setkey (struct GSC_KeyExchangeInfo *kx)
                                                     GNUNET_CRYPTO_AesSessionKey),
                                             kx->public_key,
                                             &skm->encrypted_key));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Encrypting key %x for %s resulting in message %u (origin: %s)\n",
+             (unsigned int) GNUNET_CRYPTO_crc32_n (&kx->encrypt_key, sizeof (struct GNUNET_CRYPTO_AesSessionKey)),
+             GNUNET_i2s (&kx->peer),
+             (unsigned int) GNUNET_CRYPTO_crc32_n (&skm->encrypted_key, sizeof (struct GNUNET_CRYPTO_RsaEncryptedData)),
+             GNUNET_h2s (&GSC_my_identity.hashPubKey));
+
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CRYPTO_rsa_sign (my_private_key, &skm->purpose,
                                          &skm->signature));
@@ -1106,13 +1119,14 @@ send_keep_alive (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
   kx->keep_alive_task = GNUNET_SCHEDULER_NO_TASK;
   left = GNUNET_TIME_absolute_get_remaining (kx->timeout);
-  if (left.rel_value == 0)
+  if (0 == left.rel_value)
   {
     GNUNET_STATISTICS_update (GSC_stats,
                               gettext_noop ("# sessions terminated by timeout"),
                               1, GNUNET_NO);
     GSC_SESSIONS_end (&kx->peer);
     kx->status = KX_STATE_DOWN;
+    send_key (kx);
     return;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending KEEPALIVE to `%s'\n",
@@ -1165,6 +1179,7 @@ trigger_rekey (void *cls,
 {
   struct GSC_KeyExchangeInfo *kx = cls;
   
+  GNUNET_break (KX_STATE_UP == kx->status);
   kx->status = KX_STATE_REKEY;
   kx->set_key_retry_frequency = INITIAL_SET_KEY_RETRY_FREQUENCY;
   kx->retry_set_key_task =
@@ -1212,7 +1227,7 @@ GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx,
   uint16_t msize;
 
   msize = ntohs (msg->size);
-  if (msize != sizeof (struct PongMessage))
+  if (sizeof (struct PongMessage) != msize)
   {
     GNUNET_break_op (0);
     return;
@@ -1291,8 +1306,8 @@ GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx,
     GSC_SESSIONS_create (&kx->peer, kx);
     CHECK_KX (kx);
     schedule_rekey (kx);
-    GNUNET_assert (kx->keep_alive_task == GNUNET_SCHEDULER_NO_TASK);
-    if (kx->emsg_received != NULL)
+    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == kx->keep_alive_task);
+    if (NULL != kx->emsg_received)
     {
       emsg = kx->emsg_received;
       kx->emsg_received = NULL;
@@ -1333,14 +1348,14 @@ static void
 send_key (struct GSC_KeyExchangeInfo *kx)
 {
   CHECK_KX (kx);
-  if (kx->retry_set_key_task != GNUNET_SCHEDULER_NO_TASK)
+  if (GNUNET_SCHEDULER_NO_TASK != kx->retry_set_key_task)
   {
      GNUNET_SCHEDULER_cancel (kx->retry_set_key_task);
      kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK;
   }
   if (KX_STATE_UP == kx->status)
     return;                     /* nothing to do */
-  if (kx->public_key == NULL)
+  if (NULL == kx->public_key)
   {
     /* lookup public key, then try again */
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1498,7 +1513,7 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx,
 {
   const struct EncryptedMessage *m;
   struct EncryptedMessage *pt;  /* plaintext */
-  GNUNET_HashCode ph;
+  struct GNUNET_HashCode ph;
   uint32_t snum;
   struct GNUNET_TIME_Absolute t;
   struct GNUNET_CRYPTO_AesInitializationVector iv;
@@ -1523,10 +1538,10 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx,
                               1, GNUNET_NO);
     return;
   }
-  if (kx->status == KX_STATE_KEY_RECEIVED)
+  if (KX_STATE_KEY_RECEIVED == kx->status)
   {
     /* defer */
-    GNUNET_free_non_null (kx->ping_received);
+    GNUNET_free_non_null (kx->emsg_received);
     kx->emsg_received = (struct EncryptedMessage *) GNUNET_copy_message (msg);
     return;
   }
@@ -1535,7 +1550,7 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx,
                    kx->decrypt_key_created);
   GNUNET_CRYPTO_hmac (&auth_key, &m->sequence_number,
                       size - ENCRYPTED_HEADER_SIZE, &ph);
-  if (0 != memcmp (&ph, &m->hmac, sizeof (GNUNET_HashCode)))
+  if (0 != memcmp (&ph, &m->hmac, sizeof (struct GNUNET_HashCode)))
   {
     /* checksum failed */
     GNUNET_break_op (0);
@@ -1643,7 +1658,7 @@ GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx,
  * @param client who sent us the message (struct GSC_KeyExchangeInfo)
  * @param m the message
  */
-static void
+static int
 deliver_message (void *cls, void *client, const struct GNUNET_MessageHeader *m)
 {
   struct DeliverMessageContext *dmc = client;
@@ -1653,7 +1668,7 @@ deliver_message (void *cls, void *client, const struct GNUNET_MessageHeader *m)
   case GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP:
   case GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP:
     GSC_SESSIONS_set_typemap (dmc->peer, m);
-    return;
+    return GNUNET_OK;
   default:
     GSC_CLIENTS_deliver_message (dmc->peer, dmc->atsi, dmc->atsi_count, m,
                                  ntohs (m->size),
@@ -1662,6 +1677,7 @@ deliver_message (void *cls, void *client, const struct GNUNET_MessageHeader *m)
                                  sizeof (struct GNUNET_MessageHeader),
                                  GNUNET_CORE_OPTION_SEND_HDR_INBOUND);
   }
+  return GNUNET_OK;
 }
 
 
@@ -1686,7 +1702,7 @@ GSC_KX_init ()
   }
   my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
   GNUNET_free (keyfile);
-  if (my_private_key == NULL)
+  if (NULL == my_private_key)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 _("Core service could not access hostkey.  Exiting.\n"));
@@ -1715,17 +1731,17 @@ GSC_KX_init ()
 void
 GSC_KX_done ()
 {
-  if (my_private_key != NULL)
+  if (NULL != my_private_key)
   {
     GNUNET_CRYPTO_rsa_key_free (my_private_key);
     my_private_key = NULL;
   }
-  if (peerinfo != NULL)
+  if (NULL != peerinfo)
   {
     GNUNET_PEERINFO_disconnect (peerinfo);
     peerinfo = NULL;
   }
-  if (mst != NULL)
+  if (NULL != mst)
   {
     GNUNET_SERVER_mst_destroy (mst);
     mst = NULL;