From ea544ab2cae7f4f969a705d33d10da1a004cbd70 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 30 Nov 2019 22:43:08 +0100 Subject: [PATCH] create crypto_pow, in preparation for #3795 --- src/include/gnunet_crypto_lib.h | 13 ++++++++ src/nse/gnunet-service-nse.c | 27 ++------------- src/util/Makefile.am | 1 + src/util/crypto_pow.c | 58 +++++++++++++++++++++++++++++++++ src/util/gnunet-scrypt.c | 25 +------------- 5 files changed, 75 insertions(+), 49 deletions(-) create mode 100644 src/util/crypto_pow.c diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h index 507705e50..4a42c5c74 100644 --- a/src/include/gnunet_crypto_lib.h +++ b/src/include/gnunet_crypto_lib.h @@ -654,6 +654,19 @@ GNUNET_CRYPTO_hash (const void *block, struct GNUNET_HashCode *ret); +/** + * Calculate the 'proof-of-work' hash (an expensive hash). + * + * @param buf data to hash + * @param buf_len number of bytes in @a buf + * @param result where to write the resulting hash + */ +void +GNUNET_CRYPTO_pow_hash (const void *buf, + size_t buf_len, + struct GNUNET_HashCode *result); + + /** * Context for cummulative hashing. */ diff --git a/src/nse/gnunet-service-nse.c b/src/nse/gnunet-service-nse.c index 3e72be1c5..3f04314a6 100644 --- a/src/nse/gnunet-service-nse.c +++ b/src/nse/gnunet-service-nse.c @@ -487,29 +487,6 @@ 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 @a 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_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. * @@ -828,7 +805,7 @@ check_proof_of_work (const struct GNUNET_CRYPTO_EddsaPublicKey *pkey, GNUNET_memcpy (&buf[sizeof(val)], pkey, sizeof(struct GNUNET_CRYPTO_EddsaPublicKey)); - pow_hash (buf, sizeof(buf), &result); + GNUNET_CRYPTO_pow_hash (buf, sizeof(buf), &result); return (count_leading_zeroes (&result) >= nse_work_required) ? GNUNET_YES : GNUNET_NO; } @@ -880,7 +857,7 @@ find_proof (void *cls) while ((counter != UINT64_MAX) && (i < ROUND_SIZE)) { GNUNET_memcpy (buf, &counter, sizeof(uint64_t)); - pow_hash (buf, sizeof(buf), &result); + GNUNET_CRYPTO_pow_hash (buf, sizeof(buf), &result); if (nse_work_required <= count_leading_zeroes (&result)) { my_proof = counter; diff --git a/src/util/Makefile.am b/src/util/Makefile.am index 67e131810..0f6251f96 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -64,6 +64,7 @@ libgnunetutil_la_SOURCES = \ crypto_kdf.c \ crypto_mpi.c \ crypto_paillier.c \ + crypto_pow.c \ crypto_random.c \ crypto_rsa.c \ disk.c \ diff --git a/src/util/crypto_pow.c b/src/util/crypto_pow.c new file mode 100644 index 000000000..b4dfbf53a --- /dev/null +++ b/src/util/crypto_pow.c @@ -0,0 +1,58 @@ +/* + This file is part of GNUnet. + Copyright (C) 2012, 2013, 2019 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + 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 + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later + */ +/** + * @file util/crypto_pow.c + * @brief proof-of-work hashing + * @author Christian Grothoff + * @author Bart Polot + */ + +#include "platform.h" +#include "gnunet_crypto_lib.h" +#include + + +/** + * Calculate the 'proof-of-work' hash (an expensive hash). + * We're using a non-standard formula to avoid issues with + * ASICs appearing (see #3795). + * + * @param buf data to hash + * @param buf_len number of bytes in @a buf + * @param result where to write the resulting hash + */ +void +GNUNET_CRYPTO_pow_hash (const void *buf, size_t buf_len, struct + GNUNET_HashCode *result) +{ + GNUNET_break ( + 0 == gcry_kdf_derive (buf, + buf_len, + GCRY_KDF_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)); +} + + +/* end of crypto_pow.c */ diff --git a/src/util/gnunet-scrypt.c b/src/util/gnunet-scrypt.c index 8d8451950..d84f486a7 100644 --- a/src/util/gnunet-scrypt.c +++ b/src/util/gnunet-scrypt.c @@ -67,29 +67,6 @@ shutdown_task (void *cls) } -/** - * Calculate the 'proof-of-work' hash (an expensive hash). - * - * @param buf data to hash - * @param buf_len number of bytes in @a 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_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)); -} - - /** * Count the leading zeroes in hash. * @@ -140,7 +117,7 @@ find_proof (void *cls) while ((counter != UINT64_MAX) && (i < ROUND_SIZE)) { GNUNET_memcpy (buf, &counter, sizeof(uint64_t)); - pow_hash (buf, sizeof(buf), &result); + GNUNET_CRYPTO_pow_hash (buf, sizeof(buf), &result); if (nse_work_required <= count_leading_zeroes (&result)) { proof = counter; -- 2.25.1