summaryrefslogtreecommitdiff
path: root/src/benchmark-cipher.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2011-05-20 21:32:58 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-05-21 08:30:49 +0200
commit96a87b6029804f7b0e5970e3c67140822205b181 (patch)
treea530aecbb4f9d098e6c53c3858ae4504cb7c180f /src/benchmark-cipher.c
parent2bd4123f0ad3b694e8cfadc15d0fe1b16e36bc49 (diff)
downloadgnutls-96a87b6029804f7b0e5970e3c67140822205b181.tar.gz
benchmark ECDH and DH.
Diffstat (limited to 'src/benchmark-cipher.c')
-rw-r--r--src/benchmark-cipher.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/benchmark-cipher.c b/src/benchmark-cipher.c
new file mode 100644
index 0000000000..0af831cd1c
--- /dev/null
+++ b/src/benchmark-cipher.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuTLS.
+ *
+ * GnuTLS 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuTLS 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 this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Written by Nikos Mavrogiannopoulos <nmav@gnutls.org>.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <gnutls/gnutls.h>
+#include <gnutls/crypto.h>
+#include <time.h>
+#include <signal.h>
+#include "timespec.h" /* gnulib gettime */
+#include "benchmark.h"
+
+static unsigned char data[64 * 1024];
+
+
+static void
+tls_log_func (int level, const char *str)
+{
+ fprintf (stderr, "|<%d>| %s", level, str);
+}
+
+static void
+cipher_mac_bench (int algo, int mac_algo, int size)
+{
+ int ret;
+ gnutls_cipher_hd_t ctx;
+ gnutls_hmac_hd_t mac_ctx;
+ void *_key, *_iv;
+ gnutls_datum_t key, iv;
+ int blocksize = gnutls_cipher_get_block_size (algo);
+ int keysize = gnutls_cipher_get_key_size (algo);
+ int step = size*1024;
+ struct benchmark_st st;
+
+ _key = malloc (keysize);
+ if (_key == NULL)
+ return;
+ memset (_key, 0xf0, keysize);
+
+ _iv = malloc (blocksize);
+ if (_iv == NULL)
+ return;
+ memset (_iv, 0xf0, blocksize);
+
+ iv.data = _iv;
+ iv.size = blocksize;
+
+ key.data = _key;
+ key.size = keysize;
+
+ printf ("Checking %s with %s (%dkb payload)... ", gnutls_cipher_get_name (algo),
+ gnutls_mac_get_name(mac_algo), size);
+ fflush (stdout);
+
+ start_benchmark(&st);
+
+ ret = gnutls_hmac_init(&mac_ctx, mac_algo, key.data, key.size);
+ if (ret < 0)
+ {
+ fprintf (stderr, "error: %s\n", gnutls_strerror (ret));
+ goto leave;
+ }
+
+ ret = gnutls_cipher_init (&ctx, algo, &key, &iv);
+ if (ret < 0)
+ {
+ fprintf (stderr, "error: %s\n", gnutls_strerror (ret));
+ goto leave;
+ }
+
+ gnutls_hmac(mac_ctx, data, 1024);
+
+ do
+ {
+ gnutls_hmac(mac_ctx, data, step);
+ gnutls_cipher_encrypt (ctx, data, step);
+ st.size += step;
+ }
+ while (benchmark_must_finish == 0);
+
+ gnutls_cipher_deinit (ctx);
+ gnutls_hmac_deinit(mac_ctx, NULL);
+
+ stop_benchmark (&st);
+
+leave:
+ free (_key);
+ free (_iv);
+
+}
+
+
+static void
+cipher_bench (int algo, int size, int aead)
+{
+ int ret;
+ gnutls_cipher_hd_t ctx;
+ void *_key, *_iv;
+ gnutls_datum_t key, iv;
+ int blocksize = gnutls_cipher_get_block_size (algo);
+ int keysize = gnutls_cipher_get_key_size (algo);
+ int step = size*1024;
+ struct benchmark_st st;
+
+ _key = malloc (keysize);
+ if (_key == NULL)
+ return;
+ memset (_key, 0xf0, keysize);
+
+ _iv = malloc (blocksize);
+ if (_iv == NULL)
+ return;
+ memset (_iv, 0xf0, blocksize);
+
+ iv.data = _iv;
+ if (aead) iv.size = 12;
+ else iv.size = blocksize;
+
+ key.data = _key;
+ key.size = keysize;
+
+ printf ("Checking %s (%dkb payload)... ", gnutls_cipher_get_name (algo),
+ size);
+ fflush (stdout);
+
+ start_benchmark(&st);
+
+ ret = gnutls_cipher_init (&ctx, algo, &key, &iv);
+ if (ret < 0)
+ {
+ fprintf (stderr, "error: %s\n", gnutls_strerror (ret));
+ goto leave;
+ }
+
+ if (aead)
+ gnutls_cipher_add_auth (ctx, data, 1024);
+
+ do
+ {
+ gnutls_cipher_encrypt (ctx, data, step);
+ st.size += step;
+ }
+ while (benchmark_must_finish == 0);
+
+ gnutls_cipher_deinit (ctx);
+
+ stop_benchmark(&st);
+
+leave:
+ free (_key);
+ free (_iv);
+}
+
+static void
+mac_bench (int algo, int size)
+{
+ void *_key;
+ int blocksize = gnutls_hmac_get_len (algo);
+ int step = size*1024;
+ struct benchmark_st st;
+
+ _key = malloc (blocksize);
+ if (_key == NULL)
+ return;
+ memset (_key, 0xf0, blocksize);
+
+ printf ("Checking %s (%dkb payload)... ", gnutls_mac_get_name (algo), size);
+ fflush (stdout);
+
+ start_benchmark(&st);
+
+ do
+ {
+ gnutls_hmac_fast (algo, _key, blocksize, data, step, _key);
+ st.size += step;
+ }
+ while (benchmark_must_finish == 0);
+
+ stop_benchmark(&st);
+
+ free (_key);
+}
+
+int
+main (int argc, char **argv)
+{
+ int debug_level = 0;
+
+ if (argc > 1)
+ debug_level = 2;
+
+ gnutls_global_set_log_function (tls_log_func);
+ gnutls_global_set_log_level (debug_level);
+ gnutls_global_init ();
+
+ gnutls_rnd( GNUTLS_RND_NONCE, data, sizeof(data));
+
+ cipher_bench ( GNUTLS_CIPHER_AES_128_GCM, 16, 1);
+ cipher_mac_bench ( GNUTLS_CIPHER_AES_128_CBC, GNUTLS_MAC_SHA256, 16);
+ cipher_mac_bench ( GNUTLS_CIPHER_AES_128_CBC, GNUTLS_MAC_SHA1, 16);
+
+ mac_bench (GNUTLS_MAC_SHA1, 16);
+
+ mac_bench (GNUTLS_MAC_SHA256, 16);
+
+ cipher_bench (GNUTLS_CIPHER_3DES_CBC, 16, 0);
+
+ cipher_bench (GNUTLS_CIPHER_AES_128_CBC, 16, 0);
+
+ cipher_bench (GNUTLS_CIPHER_ARCFOUR, 16, 0);
+
+ return 0;
+}