/*
This file is part of GNUnet.
Copyright (C) 2014 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
*/
/**
* @author Lucien Heuzeveldt
* @author Gian Demarmels
* @file util/perf_crypto_cs.c
* @brief measure performance of Clause Blind Schnorr Signatures
*/
#include "platform.h"
#include "gnunet_util_lib.h"
#include
#define ITER 10
/**
* Evaluate Clause Blind Schnorr Signature performance.
*
*/
static void
eval ()
{
struct GNUNET_TIME_Absolute start;
unsigned int i;
struct GNUNET_CRYPTO_CsPrivateKey priv;
struct GNUNET_CRYPTO_CsPublicKey pub;
struct GNUNET_CRYPTO_CsRSecret r_priv[2];
struct GNUNET_CRYPTO_CsRPublic r_pub[2];
char message[] = "test message";
size_t message_len = strlen ("test message");
// derive a test nonce
struct GNUNET_CRYPTO_CsNonce nonce;
GNUNET_assert (GNUNET_YES == GNUNET_CRYPTO_hkdf (nonce.nonce,
sizeof(nonce.nonce),
GCRY_MD_SHA512,
GCRY_MD_SHA256,
"nonce",
strlen ("nonce"),
"nonce_secret",
strlen ("nonce_secret"),
NULL,
0));
struct GNUNET_CRYPTO_CsBlindingSecret bs[2];
struct GNUNET_CRYPTO_CsC blinded_cs[2];
struct GNUNET_CRYPTO_CsRPublic blinded_r_pub[2];
struct GNUNET_CRYPTO_CsBlindS blinded_s;
struct GNUNET_CRYPTO_CsS signature_scalar;
struct GNUNET_CRYPTO_CsSignature sig;
// BENCHMARK keygen
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
GNUNET_CRYPTO_cs_private_key_generate (&priv);
GNUNET_CRYPTO_cs_private_key_get_public (&priv, &pub);
}
printf ("10x key generation took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
// BENCHMARK r derive and calc R pub
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
GNUNET_CRYPTO_cs_r_derive (&nonce, &priv, r_priv);
GNUNET_CRYPTO_cs_r_get_public (&r_priv[0], &r_pub[0]);
GNUNET_CRYPTO_cs_r_get_public (&r_priv[1], &r_pub[1]);
}
printf ("10x r0, r1 derive and R1,R2 calculation took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
// BENCHMARK derive blinding secrets
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
GNUNET_CRYPTO_cs_blinding_secrets_derive (&nonce,
bs);
}
printf ("10x derive blinding secrets took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
// BENCHMARK calculating C
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
GNUNET_CRYPTO_cs_calc_blinded_c (bs,
r_pub,
&pub,
message,
message_len,
blinded_cs,
blinded_r_pub);
}
printf ("10x calculating the blinded c took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
// BENCHMARK sign derive
unsigned int b;
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
b = GNUNET_CRYPTO_cs_sign_derive (&priv,
r_priv,
blinded_cs,
&nonce,
&blinded_s);
}
printf ("10x signing blinded c took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
// BENCHMARK unblind signature
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
GNUNET_CRYPTO_cs_unblind (&blinded_s, &bs[b], &signature_scalar);
sig.r_point = blinded_r_pub[b];
sig.s_scalar = signature_scalar;
}
printf ("10x unblinding s took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
// BENCHMARK verify signature
start = GNUNET_TIME_absolute_get ();
for (i = 0; i < ITER; i++)
{
GNUNET_CRYPTO_cs_verify (&sig,
&pub,
message,
message_len);
}
printf ("10x verifying signatures took %s\n",
GNUNET_STRINGS_relative_time_to_string (
GNUNET_TIME_absolute_get_duration (start),
GNUNET_YES));
}
int
main (int argc, char *argv[])
{
eval ();
return 0;
}