aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-09-03 14:19:46 +0000
committerChristian Grothoff <christian@grothoff.org>2015-09-03 14:19:46 +0000
commit526a96f0b6eb60899a1eaa2b281b2728980c5ee0 (patch)
treec8aade8e658e7bae319f9c94f80cb517f18ae946 /src/util
parent8049927717b940abf3af8e697eb381871a3ca3d5 (diff)
downloadgnunet-526a96f0b6eb60899a1eaa2b281b2728980c5ee0.tar.gz
gnunet-526a96f0b6eb60899a1eaa2b281b2728980c5ee0.zip
-add benchmark for RSA crypto
Diffstat (limited to 'src/util')
-rw-r--r--src/util/Makefile.am6
-rw-r--r--src/util/crypto_rsa.c20
-rw-r--r--src/util/perf_crypto_rsa.c204
3 files changed, 229 insertions, 1 deletions
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index ca3a361aa..90a0717ab 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -248,6 +248,7 @@ libgnunet_plugin_test_la_LDFLAGS = \
248if HAVE_BENCHMARKS 248if HAVE_BENCHMARKS
249 BENCHMARKS = \ 249 BENCHMARKS = \
250 perf_crypto_hash \ 250 perf_crypto_hash \
251 perf_crypto_rsa \
251 perf_crypto_paillier \ 252 perf_crypto_paillier \
252 perf_crypto_symmetric \ 253 perf_crypto_symmetric \
253 perf_crypto_asymmetric \ 254 perf_crypto_asymmetric \
@@ -626,6 +627,11 @@ perf_crypto_hash_SOURCES = \
626perf_crypto_hash_LDADD = \ 627perf_crypto_hash_LDADD = \
627 libgnunetutil.la 628 libgnunetutil.la
628 629
630perf_crypto_rsa_SOURCES = \
631 perf_crypto_rsa.c
632perf_crypto_rsa_LDADD = \
633 libgnunetutil.la
634
629perf_crypto_symmetric_SOURCES = \ 635perf_crypto_symmetric_SOURCES = \
630 perf_crypto_symmetric.c 636 perf_crypto_symmetric.c
631perf_crypto_symmetric_LDADD = \ 637perf_crypto_symmetric_LDADD = \
diff --git a/src/util/crypto_rsa.c b/src/util/crypto_rsa.c
index 3b36cc341..bde77ad56 100644
--- a/src/util/crypto_rsa.c
+++ b/src/util/crypto_rsa.c
@@ -608,7 +608,7 @@ GNUNET_CRYPTO_rsa_blinding_key_encode (const struct GNUNET_CRYPTO_rsa_BlindingKe
608 */ 608 */
609struct GNUNET_CRYPTO_rsa_BlindingKey * 609struct GNUNET_CRYPTO_rsa_BlindingKey *
610GNUNET_CRYPTO_rsa_blinding_key_decode (const char *buf, 610GNUNET_CRYPTO_rsa_blinding_key_decode (const char *buf,
611 size_t len) 611 size_t len)
612{ 612{
613 struct GNUNET_CRYPTO_rsa_BlindingKey *bkey; 613 struct GNUNET_CRYPTO_rsa_BlindingKey *bkey;
614 size_t rsize; 614 size_t rsize;
@@ -753,6 +753,7 @@ GNUNET_CRYPTO_rsa_sign (const struct GNUNET_CRYPTO_rsa_PrivateKey *key,
753 size_t msg_len) 753 size_t msg_len)
754{ 754{
755 struct GNUNET_CRYPTO_rsa_Signature *sig; 755 struct GNUNET_CRYPTO_rsa_Signature *sig;
756 struct GNUNET_CRYPTO_rsa_PublicKey *public_key;
756 gcry_sexp_t result; 757 gcry_sexp_t result;
757 gcry_sexp_t data; 758 gcry_sexp_t data;
758 759
@@ -766,6 +767,23 @@ GNUNET_CRYPTO_rsa_sign (const struct GNUNET_CRYPTO_rsa_PrivateKey *key,
766 GNUNET_break (0); 767 GNUNET_break (0);
767 return NULL; 768 return NULL;
768 } 769 }
770
771 /* verify signature (guards against Lenstra's attack with fault injection...) */
772 public_key = GNUNET_CRYPTO_rsa_private_key_get_public (key);
773 if (0 !=
774 gcry_pk_verify (result,
775 data,
776 public_key->sexp))
777 {
778 GNUNET_break (0);
779 GNUNET_CRYPTO_rsa_public_key_free (public_key);
780 gcry_sexp_release (data);
781 gcry_sexp_release (result);
782 return NULL;
783 }
784 GNUNET_CRYPTO_rsa_public_key_free (public_key);
785
786 /* return signature */
769 gcry_sexp_release (data); 787 gcry_sexp_release (data);
770 sig = GNUNET_new (struct GNUNET_CRYPTO_rsa_Signature); 788 sig = GNUNET_new (struct GNUNET_CRYPTO_rsa_Signature);
771 sig->sexp = result; 789 sig->sexp = result;
diff --git a/src/util/perf_crypto_rsa.c b/src/util/perf_crypto_rsa.c
new file mode 100644
index 000000000..b2cf5cb61
--- /dev/null
+++ b/src/util/perf_crypto_rsa.c
@@ -0,0 +1,204 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2014 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21/**
22 * @author Christian Grothoff
23 * @file util/perf_crypto_rsa.c
24 * @brief measure performance of RSA signing
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28#include <gauger.h>
29
30
31/**
32 * Evaluate RSA performance.
33 *
34 * @param len keylength to evaluate with
35 */
36static void
37eval (unsigned int len)
38{
39 struct GNUNET_TIME_Absolute start;
40 struct GNUNET_CRYPTO_rsa_Signature *sig;
41 struct GNUNET_CRYPTO_rsa_Signature *rsig;
42 struct GNUNET_CRYPTO_rsa_PublicKey *public_key;
43 struct GNUNET_CRYPTO_rsa_PrivateKey *private_key;
44 struct GNUNET_CRYPTO_rsa_BlindingKey *bkey;
45 unsigned int i;
46 char sbuf[128];
47 char *bbuf;
48 size_t bbuf_len;
49 struct GNUNET_HashCode hc;
50
51 start = GNUNET_TIME_absolute_get ();
52 for (i=0;i<10;i++)
53 {
54 private_key = GNUNET_CRYPTO_rsa_private_key_create (len);
55 GNUNET_CRYPTO_rsa_private_key_free (private_key);
56 }
57 printf ("10x %u-key generation took %s\n",
58 len,
59 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
60 GNUNET_YES));
61 GNUNET_snprintf (sbuf,
62 sizeof (sbuf),
63 "RSA %u-key generation",
64 len);
65 GAUGER ("UTIL", sbuf,
66 64 * 1024 / (1 +
67 GNUNET_TIME_absolute_get_duration
68 (start).rel_value_us / 1000LL), "keys/ms");
69 private_key = GNUNET_CRYPTO_rsa_private_key_create (len);
70 public_key = GNUNET_CRYPTO_rsa_private_key_get_public (private_key);
71 start = GNUNET_TIME_absolute_get ();
72 for (i=0;i<10;i++)
73 {
74 bkey = GNUNET_CRYPTO_rsa_blinding_key_create (len);
75 GNUNET_CRYPTO_rsa_blinding_key_free (bkey);
76 }
77 printf ("10x %u-blinding key generation took %s\n",
78 len,
79 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
80 GNUNET_YES));
81 GNUNET_snprintf (sbuf,
82 sizeof (sbuf),
83 "RSA %u-blinding key generation",
84 len);
85 GAUGER ("UTIL", sbuf,
86 64 * 1024 / (1 +
87 GNUNET_TIME_absolute_get_duration
88 (start).rel_value_us / 1000LL), "keys/ms");
89 bkey = GNUNET_CRYPTO_rsa_blinding_key_create (len);
90 start = GNUNET_TIME_absolute_get ();
91 GNUNET_CRYPTO_hash ("test", 4, &hc);
92 for (i=0;i<10;i++)
93 {
94 bbuf_len = GNUNET_CRYPTO_rsa_blind (&hc,
95 bkey,
96 public_key,
97 &bbuf);
98 GNUNET_free (bbuf);
99 }
100 printf ("10x %u-blinding took %s\n",
101 len,
102 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
103 GNUNET_YES));
104 GNUNET_snprintf (sbuf,
105 sizeof (sbuf),
106 "RSA %u-blinding",
107 len);
108 GAUGER ("UTIL",
109 sbuf,
110 64 * 1024 / (1 +
111 GNUNET_TIME_absolute_get_duration
112 (start).rel_value_us / 1000LL), "ops/ms");
113 bbuf_len = GNUNET_CRYPTO_rsa_blind (&hc,
114 bkey,
115 public_key,
116 &bbuf);
117 start = GNUNET_TIME_absolute_get ();
118 for (i=0;i<10;i++)
119 {
120 sig = GNUNET_CRYPTO_rsa_sign (private_key,
121 bbuf,
122 bbuf_len);
123 GNUNET_CRYPTO_rsa_signature_free (sig);
124 }
125 printf ("10x %u-signing took %s\n",
126 len,
127 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
128 GNUNET_YES));
129 GNUNET_snprintf (sbuf,
130 sizeof (sbuf),
131 "RSA %u-signing",
132 len);
133 GAUGER ("UTIL",
134 sbuf,
135 64 * 1024 / (1 +
136 GNUNET_TIME_absolute_get_duration
137 (start).rel_value_us / 1000LL), "ops/ms");
138 sig = GNUNET_CRYPTO_rsa_sign (private_key,
139 bbuf,
140 bbuf_len);
141 start = GNUNET_TIME_absolute_get ();
142 for (i=0;i<10;i++)
143 {
144 rsig = GNUNET_CRYPTO_rsa_unblind (sig,
145 bkey,
146 public_key);
147 GNUNET_CRYPTO_rsa_signature_free (rsig);
148 }
149 printf ("10x %u-unblinding took %s\n",
150 len,
151 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
152 GNUNET_YES));
153 GNUNET_snprintf (sbuf,
154 sizeof (sbuf),
155 "RSA %u-unblinding",
156 len);
157 GAUGER ("UTIL",
158 sbuf,
159 64 * 1024 / (1 +
160 GNUNET_TIME_absolute_get_duration
161 (start).rel_value_us / 1000LL), "ops/ms");
162 rsig = GNUNET_CRYPTO_rsa_unblind (sig,
163 bkey,
164 public_key);
165 start = GNUNET_TIME_absolute_get ();
166 for (i=0;i<10;i++)
167 {
168 GNUNET_assert (GNUNET_OK ==
169 GNUNET_CRYPTO_rsa_verify (&hc,
170 rsig,
171 public_key));
172 }
173 printf ("10x %u-verifying took %s\n",
174 len,
175 GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (start),
176 GNUNET_YES));
177 GNUNET_snprintf (sbuf,
178 sizeof (sbuf),
179 "RSA %u-verification",
180 len);
181 GAUGER ("UTIL",
182 sbuf,
183 64 * 1024 / (1 +
184 GNUNET_TIME_absolute_get_duration
185 (start).rel_value_us / 1000LL), "ops/ms");
186 GNUNET_CRYPTO_rsa_signature_free (sig);
187 GNUNET_CRYPTO_rsa_public_key_free (public_key);
188 GNUNET_CRYPTO_rsa_private_key_free (private_key);
189 GNUNET_CRYPTO_rsa_blinding_key_free (bkey);
190 GNUNET_free (bbuf);
191}
192
193
194int
195main (int argc, char *argv[])
196{
197 eval (1024);
198 eval (2048);
199 /* eval (4096); */
200 return 0;
201}
202
203
204/* end of perf_crypto_rsa.c */