evaluate epochs
authorSchanzenbach, Martin <mschanzenbach@posteo.de>
Mon, 20 Apr 2020 06:24:06 +0000 (08:24 +0200)
committerSchanzenbach, Martin <mschanzenbach@posteo.de>
Mon, 20 Apr 2020 06:24:06 +0000 (08:24 +0200)
src/include/gnunet_revocation_service.h
src/revocation/gnunet-revocation.c
src/revocation/gnunet-service-revocation.c
src/revocation/plugin_block_revocation.c
src/revocation/revocation_api.c

index a5a0147081f9b1a7e48db07d32fe357dd4b64bba..226dce357d51ea2e2781700fa3ebb6956e4d647f 100644 (file)
@@ -184,7 +184,7 @@ GNUNET_REVOCATION_revoke_cancel (struct GNUNET_REVOCATION_Handle *h);
  * @param ts  revocation timestamp
  * @param pow proof of work value
  * @param matching_bits how many bits must match (configuration)
- * @return #GNUNET_YES if the @a pow is acceptable, #GNUNET_NO if not
+ * @return number of epochs valid if the @a pow is acceptable, -1 if not
  */
 int
 GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow,
index 5566162f4fabdb034e6544b742aa40d490cda83a..c33f12c9079ac42703b3eb0499849d8f5ef58b3f 100644 (file)
@@ -83,6 +83,11 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
  */
 static unsigned long long matching_bits;
 
+/**
+ * Epoch length
+ */
+static struct GNUNET_TIME_Relative epoch_length;
+
 /**
  * Task used for proof-of-work calculation.
  */
@@ -341,6 +346,7 @@ ego_callback (void *cls, const struct GNUNET_IDENTITY_Ego *ego)
   struct GNUNET_REVOCATION_Pow *pow;
   struct GNUNET_CRYPTO_EcdsaPublicKey key;
   struct GNUNET_REVOCATION_PowCalculationHandle *ph = NULL;
+  int epochs;
 
   el = NULL;
   if (NULL == ego)
@@ -365,11 +371,19 @@ ego_callback (void *cls, const struct GNUNET_IDENTITY_Ego *ego)
       GNUNET_free (pow);
       return;
     }
-    if (GNUNET_YES ==
+    if (0 < (epochs =
         GNUNET_REVOCATION_check_pow (pow,
-                                     (unsigned int) matching_bits))
+                                     (unsigned int) matching_bits)))
     {
+      struct GNUNET_TIME_Absolute ts;
+      struct GNUNET_TIME_Relative ttl;
+      ts = GNUNET_TIME_absolute_ntoh (pow->timestamp);
+      ttl = GNUNET_TIME_relative_multiply (epoch_length,
+                                           epochs);
       fprintf (stderr, "%s", _ ("Revocation certificate ready\n"));
+      fprintf (stderr, "%s %s for %s\n", _ ("Valid from"),
+               GNUNET_STRINGS_absolute_time_to_string (ts),
+               GNUNET_STRINGS_relative_time_to_string (ttl, GNUNET_NO));
       if (perform)
         perform_revocation (pow);
       else
@@ -448,6 +462,17 @@ run (void *cls,
                                "WORKBITS");
     return;
   }
+  if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (cfg,
+                                                        "REVOCATION",
+                                                        "EPOCH_LENGTH",
+                                                        &epoch_length))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               "REVOCATION",
+                               "EPOCH_LENGTH");
+    return;
+  }
+
   if (NULL != revoke_ego)
   {
     if (! perform && (NULL == filename))
@@ -472,7 +497,7 @@ run (void *cls,
       return;
     }
     GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
-    if (GNUNET_YES !=
+    if (0 >=
         GNUNET_REVOCATION_check_pow (&pow,
                                      (unsigned int) matching_bits))
     {
index 420cb392f05e9c191b09dd9d321ee155494bf420..4746a76980150c836a3912b84876012813b7d6e7 100644 (file)
@@ -167,8 +167,7 @@ new_peer_entry (const struct GNUNET_PeerIdentity *peer)
 static int
 verify_revoke_message (const struct RevokeMessage *rm)
 {
-  if (GNUNET_YES !=
-      GNUNET_REVOCATION_check_pow (&rm->proof_of_work,
+  if (0 >= GNUNET_REVOCATION_check_pow (&rm->proof_of_work,
                                    (unsigned int) revocation_work_required))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
index a57a933c36c2a6caf581a430010968a3af19a8a7..934c8d8c9740261178d02285158f8da6180d996e 100644 (file)
@@ -142,7 +142,7 @@ block_plugin_revocation_evaluate (void *cls,
     GNUNET_break_op (0);
     return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
   }
-  if (GNUNET_YES !=
+  if (0 >=
       GNUNET_REVOCATION_check_pow (&rm->proof_of_work,
                                    ic->matching_bits))
   {
index 565ce9d0d517c76bc06b7d534b097e3c82233669..f2261ff4fc32b86a6edc45ed0b15c078b6fb5a7d 100644 (file)
@@ -319,9 +319,7 @@ GNUNET_REVOCATION_revoke (const struct GNUNET_CONFIGURATION_Handle *cfg,
                                               "REVOCATION",
                                               "WORKBITS",
                                               &matching_bits)) &&
-      (GNUNET_YES !=
-       GNUNET_REVOCATION_check_pow (pow,
-                                    (unsigned int) matching_bits)))
+      (0 >= GNUNET_REVOCATION_check_pow (pow, (unsigned int) matching_bits)))
   {
     GNUNET_break (0);
     GNUNET_free (h);
@@ -410,7 +408,7 @@ calculate_score (const struct GNUNET_REVOCATION_PowCalculationHandle *ph)
  * @param ts  revocation timestamp
  * @param pow proof of work value
  * @param matching_bits how many bits must match (configuration)
- * @return #GNUNET_YES if the @a pow is acceptable, #GNUNET_NO if not
+ * @return number of epochs valid if the @a pow is acceptable, -1 if not
  */
 int
 GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow,
@@ -433,7 +431,7 @@ GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow,
     for (unsigned int j = i + 1; j < POW_COUNT; j++)
     {
       if (pow->pow[i] == pow->pow[j])
-        return GNUNET_NO;
+        return -1;
     }
   }
   GNUNET_memcpy (&buf[sizeof(uint64_t)],
@@ -460,10 +458,8 @@ GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow,
   score = score / POW_COUNT;
   if (score < difficulty)
     return GNUNET_NO;
-  // TODO verfiy signature?
-  epochs = score - difficulty + 1;
-  // TODO verify expiration
-  return GNUNET_YES;
+  epochs = score - difficulty;
+  return epochs;
 }