summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2001-10-12 08:59:34 +0200
committerNiels Möller <nisse@lysator.liu.se>2001-10-12 08:59:34 +0200
commit640cf2b78f279191bfa098f1cc57cdfdc0fa34b3 (patch)
treec3a8386fce83706733d6b00ae902f89864d1ca52 /examples
parent807f2f0e04251f9f2788dd7d635e3b0b98d559b2 (diff)
downloadnettle-640cf2b78f279191bfa098f1cc57cdfdc0fa34b3.tar.gz
* examples/nettle-benchmark.c: New benchmarking program.
Rev: src/nettle/examples/.c-style:1.1 Rev: src/nettle/examples/Makefile.am:1.1 Rev: src/nettle/examples/nettle-benchmark.c:1.1
Diffstat (limited to 'examples')
-rw-r--r--examples/.c-style1
-rw-r--r--examples/Makefile.am7
-rw-r--r--examples/nettle-benchmark.c193
3 files changed, 201 insertions, 0 deletions
diff --git a/examples/.c-style b/examples/.c-style
new file mode 100644
index 00000000..1112b4b1
--- /dev/null
+++ b/examples/.c-style
@@ -0,0 +1 @@
+"gnu"
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 00000000..0630288e
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,7 @@
+CFLAGS = -I$(top_srcdir) @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+LDADD = ../libnettle.a
+
+noinst_PROGRAMS = nettle-benchmark
+
diff --git a/examples/nettle-benchmark.c b/examples/nettle-benchmark.c
new file mode 100644
index 00000000..846d1275
--- /dev/null
+++ b/examples/nettle-benchmark.c
@@ -0,0 +1,193 @@
+/* nettle-benchmark.c
+ *
+ * Tries the performance of the various algorithms.
+ *
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2001 Niels Möller
+ *
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * The nettle library 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 Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#include "aes.h"
+#include "cbc.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <time.h>
+
+/* Encrypt 1MB, 1K at a time. */
+#define BENCH_SIZE 1024
+
+typedef void (*crypt_func)(void *ctx,
+ unsigned length, uint8_t *dst,
+ const uint8_t *src);
+static double
+time_function(void (*f)(void *arg), void *arg)
+{
+ clock_t before;
+ clock_t after;
+
+ before = clock();
+
+ f(arg);
+
+ after = clock();
+
+ return ((double)(after - before)) / CLOCKS_PER_SEC;
+}
+
+struct bench_cipher_info
+{
+ void *ctx;
+ crypt_func crypt;
+ uint8_t *data;
+};
+
+static void
+bench_cipher(void *arg)
+{
+ struct bench_cipher_info *info = arg;
+ unsigned i;
+
+ for (i = 0; i<BENCH_SIZE; i++)
+ info->crypt(info->ctx, BENCH_SIZE, info->data, info->data);
+}
+
+struct bench_cbc_info
+{
+ void *ctx;
+ crypt_func crypt;
+
+ uint8_t *data;
+
+ unsigned block_size;
+ uint8_t *iv;
+};
+
+static void
+bench_cbc_encrypt(void *arg)
+{
+ struct bench_cbc_info *info = arg;
+ unsigned i;
+
+ for (i = 0; i<BENCH_SIZE; i++)
+ cbc_encrypt(info->ctx, info->crypt,
+ info->block_size, info->iv,
+ BENCH_SIZE, info->data, info->data);
+}
+
+static void
+bench_cbc_decrypt(void *arg)
+{
+ struct bench_cbc_info *info = arg;
+ unsigned i;
+
+ for (i = 0; i<BENCH_SIZE; i++)
+ cbc_decrypt(info->ctx, info->crypt,
+ info->block_size, info->iv,
+ BENCH_SIZE, info->data, info->data);
+}
+
+/* Set data[i] = floor(sqrt(i)) */
+static void
+init_data(uint8_t *data)
+{
+ unsigned i,j;
+ for (i = j = 0; i<BENCH_SIZE; i++)
+ {
+ if (j*j < i)
+ j++;
+ data[i] = j;
+ }
+}
+
+static void
+bench(const char *name, void (*f)(void *), void *arg)
+{
+ printf("%15s: %f\n", name, time_function(f, arg));
+}
+
+int
+main(int argc, char **argv)
+{
+ /* Time block ciphers */
+ uint8_t iv[AES_BLOCK_SIZE];
+ uint8_t key[AES_MAX_KEY_SIZE];
+
+ uint8_t data[BENCH_SIZE];
+
+ {
+ struct aes_ctx ctx;
+ struct bench_cipher_info info
+ = { &ctx, (crypt_func) aes_encrypt, data };
+
+ memset(key, 0, sizeof(key));
+
+ aes_set_key(&ctx, sizeof(key), key);
+ init_data(data);
+
+ bench("AES (ECB encrypt)", bench_cipher, &info);
+ }
+
+ {
+ struct aes_ctx ctx;
+ struct bench_cipher_info info
+ = { &ctx, (crypt_func) aes_decrypt, data };
+
+ memset(key, 0, sizeof(key));
+
+ aes_set_key(&ctx, sizeof(key), key);
+ init_data(data);
+
+ bench("AES (ECB decrypt)", bench_cipher, &info);
+ }
+
+ {
+ struct aes_ctx ctx;
+ struct bench_cbc_info info
+ = { &ctx, (crypt_func) aes_encrypt, data, AES_BLOCK_SIZE, iv };
+
+ memset(key, 0, sizeof(key));
+ memset(iv, 0, sizeof(iv));
+
+ aes_set_key(&ctx, sizeof(key), key);
+ init_data(data);
+
+ bench("AES (CBC encrypt)", bench_cbc_encrypt, &info);
+ }
+
+ {
+ struct aes_ctx ctx;
+ struct bench_cbc_info info
+ = { &ctx, (crypt_func) aes_decrypt, data, AES_BLOCK_SIZE, iv };
+
+ memset(key, 0, sizeof(key));
+ memset(iv, 0, sizeof(iv));
+
+ aes_set_key(&ctx, sizeof(key), key);
+ init_data(data);
+
+ bench("AES (CBC decrypt)", bench_cbc_decrypt, &info);
+ }
+
+ return 0;
+}