From: Christian Grothoff Date: Sat, 23 Mar 2013 20:00:45 +0000 (+0000) Subject: -towards implementing #2685 X-Git-Tag: initial-import-from-subversion-38251~9501 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=d5eec64dbfd73da3f179d9223a3108a6bff5ed71;p=oweals%2Fgnunet.git -towards implementing #2685 --- diff --git a/src/nse/Makefile.am b/src/nse/Makefile.am index a67ffeaf8..971d4c1b1 100644 --- a/src/nse/Makefile.am +++ b/src/nse/Makefile.am @@ -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 diff --git a/src/nse/gnunet-service-nse.c b/src/nse/gnunet-service-nse.c index b3707ca75..3047860b8 100644 --- a/src/nse/gnunet-service-nse.c +++ b/src/nse/gnunet-service-nse.c @@ -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 + /** * 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; diff --git a/src/nse/nse.conf.in b/src/nse/nse.conf.in index 84f1f6c22..374617fa8 100644 --- a/src/nse/nse.conf.in +++ b/src/nse/nse.conf.in @@ -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 index 000000000..e462c129f --- /dev/null +++ b/src/nse/perf_kdf.c @@ -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 +#include + + + +/** + * 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 */