-towards implementing #2685
authorChristian Grothoff <christian@grothoff.org>
Sat, 23 Mar 2013 20:00:45 +0000 (20:00 +0000)
committerChristian Grothoff <christian@grothoff.org>
Sat, 23 Mar 2013 20:00:45 +0000 (20:00 +0000)
src/nse/Makefile.am
src/nse/gnunet-service-nse.c
src/nse/nse.conf.in
src/nse/perf_kdf.c [new file with mode: 0644]

index a67ffeaf8e7c29240beab69c6ddd7b9383089e0c..971d4c1b1b35a9649b6fe93b1d78f7b6c21d26f0 100644 (file)
@@ -53,7 +53,7 @@ gnunet_service_nse_LDADD = \
   $(top_builddir)/src/util/libgnunetutil.la \
   $(top_builddir)/src/core/libgnunetcore.la \
   $(top_builddir)/src/statistics/libgnunetstatistics.la \
-  -lm \
+  -lm -lgcrypt \
   $(GN_LIBINTL)
 gnunet_service_nse_DEPENDENCIES = \
   libgnunetnse.la                               
@@ -64,6 +64,7 @@ endif
 
 check_PROGRAMS = \
  test_nse_api \
+ perf_kdf \
  $(MULTIPEER_TEST)
 
 
@@ -86,6 +87,12 @@ test_nse_multipeer_LDADD = \
   $(top_builddir)/src/testbed/libgnunettestbed.la \
   -lm
 
+perf_kdf_SOURCES = \
+ perf_kdf.c
+perf_kdf_LDADD = \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  -lgcrypt 
+
 EXTRA_DIST = \
   test_nse.conf \
   nse_profiler_test.conf
index b3707ca7599ee41b23cf2cf8e72523968df629e7..3047860b82fa524fa600a7060311bf9996e166bb 100644 (file)
@@ -1,6 +1,6 @@
 /*
   This file is part of GNUnet.
-  (C) 2009, 2010, 2011, 2012 Christian Grothoff (and other contributing authors)
+  (C) 2009, 2010, 2011, 2012, 2013 Christian Grothoff (and other contributing authors)
 
   GNUnet is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published
@@ -45,6 +45,8 @@
 #include "gnunet_core_service.h"
 #include "gnunet_nse_service.h"
 #include "nse.h"
+#include <gcrypt.h>
+
 
 /**
  * Should messages be delayed randomly?  This option should be set to
@@ -476,6 +478,28 @@ get_delay_randomization (uint32_t matching_bits)
 }
 
 
+/**
+ * Calculate the 'proof-of-work' hash (an expensive hash).
+ *
+ * @param buf data to hash
+ * @param buf_len number of bytes in 'buf'
+ * @param result where to write the resulting hash
+ */
+static void
+pow_hash (const void *buf,
+         size_t buf_len,
+         struct GNUNET_HashCode *result)
+{
+  GNUNET_break (0 == 
+               gcry_kdf_derive (buf, buf_len,
+                                GCRY_KDF_PBKDF2 /* FIX: use SCRYPT! */,
+                                1 /* subalgo */,
+                                "gnunet-proof-of-work", strlen ("gnunet-proof-of-work"),
+                                2 /* iterations; keep cost of individual op small */,
+                                sizeof (struct GNUNET_HashCode), result));
+}
+
+
 /**
  * Get the number of matching bits that the given timestamp has to the given peer ID.
  *
@@ -835,7 +859,7 @@ check_proof_of_work (const struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded *pkey,
   memcpy (buf, &val, sizeof (val));
   memcpy (&buf[sizeof (val)], pkey,
           sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded));
-  GNUNET_CRYPTO_hash (buf, sizeof (buf), &result);
+  pow_hash (buf, sizeof (buf), &result);
   return (count_leading_zeroes (&result) >=
           nse_work_required) ? GNUNET_YES : GNUNET_NO;
 }
@@ -886,7 +910,7 @@ find_proof (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   while ((counter != UINT64_MAX) && (i < ROUND_SIZE))
   {
     memcpy (buf, &counter, sizeof (uint64_t));
-    GNUNET_CRYPTO_hash (buf, sizeof (buf), &result);
+    pow_hash (buf, sizeof (buf), &result);
     if (nse_work_required <= count_leading_zeroes (&result))
     {
       my_proof = counter;
index 84f1f6c22ffca19386f204776b3270147d8f1fe5..374617fa82f4b6a0a025b493ce468ce881639d82 100644 (file)
@@ -19,6 +19,7 @@ WORKDELAY = 5 ms
 # Note: changing any of the values below will make this peer
 # completely incompatible with other peers! 
 INTERVAL = 1 h
-# 26 is about 10 minutes on a modern i7 (single-core)
+# 26 is about 100 minutes on a modern i7 (single-core) for PBKDF2;
+# need to re-calibrate once we have SCRYPT!
 WORKBITS = 26
 
diff --git a/src/nse/perf_kdf.c b/src/nse/perf_kdf.c
new file mode 100644 (file)
index 0000000..e462c12
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+     This file is part of GNUnet.
+     (C) 2002, 2003, 2004, 2006, 2013 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     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.
+*/
+
+/**
+ * @author Christian Grothoff
+ * @file nse/perf_kdf.c
+ * @brief measure performance of KDF hash function
+ */
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_util_lib.h"
+#include <gcrypt.h>
+#include <gauger.h>
+
+
+
+/**
+ * Calculate the 'proof-of-work' hash (an expensive hash).
+ *
+ * @param buf data to hash
+ * @param buf_len number of bytes in 'buf'
+ * @param result where to write the resulting hash
+ */
+static void
+pow_hash (const void *buf,
+         size_t buf_len,
+         struct GNUNET_HashCode *result)
+{
+  GNUNET_break (0 == 
+               gcry_kdf_derive (buf, buf_len,
+                                GCRY_KDF_PBKDF2 /* FIX: use SCRYPT! */,
+                                1 /* subalgo */,
+                                "gnunet-proof-of-work", strlen ("gnunet-proof-of-work"),
+                                2 /* iterations; keep cost of individual op small */,
+                                sizeof (struct GNUNET_HashCode), result));
+}
+
+
+static void
+perfHash ()
+{
+  struct GNUNET_HashCode hc;
+  unsigned int i;
+  char buf[64];
+
+  memset (buf, 1,  sizeof (buf));
+  for (i = 0; i < 1024; i++)
+    pow_hash (buf, sizeof (buf), &hc);
+}
+
+
+int
+main (int argc, char *argv[])
+{
+  struct GNUNET_TIME_Absolute start;
+
+  start = GNUNET_TIME_absolute_get ();
+  perfHash ();
+  printf ("Hash perf took %s\n",
+          GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
+                                                 GNUNET_YES));
+  GAUGER ("NSE", "Proof-of-work hashing",
+          1024 / (1 +
+                 GNUNET_TIME_absolute_get_duration
+                 (start).rel_value), "hashes/s");
+  return 0;
+}
+
+/* end of perf_kdf.c */