commit 4f60bca1c1cb5ba07730d8f20a4647cc9494b6c6 Author: Nick Mathewson nickm@torproject.org Date: Wed Nov 28 15:39:00 2012 -0500
Add benchmark to test onionskin performance. --- src/test/bench.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/src/test/bench.c b/src/test/bench.c index 2e65d0b..cf8ba4a 100644 --- a/src/test/bench.c +++ b/src/test/bench.c @@ -15,9 +15,12 @@ const char tor_git_revision[] = ""; #include "orconfig.h"
#define RELAY_PRIVATE +#define CONFIG_PRIVATE
#include "or.h" +#include "onion.h" #include "relay.h" +#include "config.h"
#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) static uint64_t nanostart; @@ -97,6 +100,66 @@ bench_aes(void) }
static void +bench_onion_TAP(void) +{ + const int iters = 1<<9; + int i; + crypto_pk_t *key, *key2; + uint64_t start, end; + char os[ONIONSKIN_CHALLENGE_LEN]; + char or[ONIONSKIN_REPLY_LEN]; + crypto_dh_t *dh_out; + + key = crypto_pk_new(); + key2 = crypto_pk_new(); + crypto_pk_generate_key_with_bits(key, 1024); + crypto_pk_generate_key_with_bits(key2, 1024); + + reset_perftime(); + start = perftime(); + for (i = 0; i < iters; ++i) { + onion_skin_create(key, &dh_out, os); + crypto_dh_free(dh_out); + } + end = perftime(); + printf("Client-side, part 1: %f msec.\n", NANOCOUNT(start, end, iters)/1e6); + + onion_skin_create(key, &dh_out, os); + start = perftime(); + for (i = 0; i < iters; ++i) { + char key_out[CPATH_KEY_MATERIAL_LEN]; + onion_skin_server_handshake(os, key, NULL, or, key_out, sizeof(key_out)); + } + end = perftime(); + printf("Server-side, key guessed right: %f msec\n", + NANOCOUNT(start, end, iters)/1e6); + + start = perftime(); + for (i = 0; i < iters; ++i) { + char key_out[CPATH_KEY_MATERIAL_LEN]; + onion_skin_server_handshake(os, key2, key, or, key_out, sizeof(key_out)); + } + end = perftime(); + printf("Server-side, key guessed wrong: %f msec.\n", + NANOCOUNT(start, end, iters)/1e6); + + start = perftime(); + for (i = 0; i < iters; ++i) { + crypto_dh_t *dh; + char key_out[CPATH_KEY_MATERIAL_LEN]; + int s; + dh = crypto_dh_dup(dh_out); + s = onion_skin_client_handshake(dh, or, key_out, sizeof(key_out)); + tor_assert(s == 0); + } + end = perftime(); + printf("Client-side, part 2: %f msec.\n", + NANOCOUNT(start, end, iters)/1e6); + + crypto_pk_free(key); +} + +static void bench_cell_aes(void) { uint64_t start, end; @@ -261,6 +324,7 @@ typedef struct benchmark_t { static struct benchmark_t benchmarks[] = { ENT(dmap), ENT(aes), + ENT(onion_TAP), ENT(cell_aes), ENT(cell_ops), {NULL,NULL,0} @@ -286,6 +350,8 @@ main(int argc, const char **argv) int i; int list=0, n_enabled=0; benchmark_t *b; + char *errmsg; + or_options_t *options;
tor_threads_init();
@@ -306,6 +372,16 @@ main(int argc, const char **argv) reset_perftime();
crypto_seed_rng(1); + options = options_new(); + init_logging(); + options->command = CMD_RUN_UNITTESTS; + options->DataDirectory = tor_strdup(""); + options_init(options); + if (set_options(options, &errmsg) < 0) { + printf("Failed to set initial options: %s\n", errmsg); + tor_free(errmsg); + return 1; + }
for (b = benchmarks; b->name; ++b) { if (b->enabled || n_enabled == 0) {
tor-commits@lists.torproject.org