summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-19 09:48:52 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-19 09:54:42 +0200
commit43bd4904b4a4ea8218127dc14e12141997beef36 (patch)
tree9d1c5cd1b57b1355ae6cc562d2ad268ee7a383ba /examples
parentf4eb4e58648a9746f7a4ca20cea716dd69137fad (diff)
downloadcryptodev-linux-43bd4904b4a4ea8218127dc14e12141997beef36.tar.gz
cryptodev-linux-43bd4904b4a4ea8218127dc14e12141997beef36.tar.xz
cryptodev-linux-43bd4904b4a4ea8218127dc14e12141997beef36.zip
Backported zero copy /dev/crypto operations from master.
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile8
-rw-r--r--examples/speed.c169
2 files changed, 175 insertions, 2 deletions
diff --git a/examples/Makefile b/examples/Makefile
index 9dce9b7..c65297f 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,13 +1,16 @@
CC = gcc
CFLAGS = -Wall -g -O2
-progs := cipher hmac ncr pk
+progs := cipher hmac ncr pk speed
all: $(progs)
cipher: cipher.c
$(CC) $(CFLAGS) $< -o $@
+speed: speed.c
+ $(CC) $(CFLAGS) $< -o $@
+
hmac: hmac.c
$(CC) $(CFLAGS) $< -o $@
@@ -22,6 +25,7 @@ check: $(progs)
./pk
./cipher
./hmac
+ ./speed
clean:
- rm -f *.o *~ hmac cipher ncr pk
+ rm -f *.o *~ hmac cipher ncr pk speed
diff --git a/examples/speed.c b/examples/speed.c
new file mode 100644
index 0000000..bf19863
--- /dev/null
+++ b/examples/speed.c
@@ -0,0 +1,169 @@
+/* cryptodev_test - simple benchmark tool for cryptodev
+ *
+ * Copyright (C) 2010 by Phil Sutter <phil.sutter@viprinet.com>
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <unistd.h>
+#include "../cryptodev.h"
+
+static double udifftimeval(struct timeval start, struct timeval end)
+{
+ return (double)(end.tv_usec - start.tv_usec) +
+ (double)(end.tv_sec - start.tv_sec) * 1000 * 1000;
+}
+
+static int must_finish = 0;
+
+static void alarm_handler(int signo)
+{
+ must_finish = 1;
+}
+
+static void value2human(double bytes, double time, double* data, double* speed,char* metric)
+{
+ if (bytes > 1000 && bytes < 1000*1000) {
+ *data = ((double)bytes)/1000;
+ *speed = *data/time;
+ strcpy(metric, "Kb");
+ return;
+ } else if (bytes >= 1000*1000 && bytes < 1000*1000*1000) {
+ *data = ((double)bytes)/(1000*1000);
+ *speed = *data/time;
+ strcpy(metric, "Mb");
+ return;
+ } else if (bytes >= 1000*1000*1000) {
+ *data = ((double)bytes)/(1000*1000*1000);
+ *speed = *data/time;
+ strcpy(metric, "Gb");
+ return;
+ } else {
+ *data = (double)bytes;
+ *speed = *data/time;
+ strcpy(metric, "bytes");
+ return;
+ }
+}
+
+
+int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags)
+{
+ struct crypt_op cop;
+ char *buffer, iv[32];
+ static int val = 23;
+ struct timeval start, end;
+ double total = 0;
+ double secs, ddata, dspeed;
+ char metric[16];
+
+ buffer = malloc(chunksize);
+ memset(iv, 0x23, 32);
+
+ printf("\tEncrypting in chunks of %d bytes: ", chunksize);
+ fflush(stdout);
+
+ memset(buffer, val++, chunksize);
+
+ must_finish = 0;
+ alarm(5);
+
+ gettimeofday(&start, NULL);
+ do {
+ memset(&cop, 0, sizeof(cop));
+ cop.ses = sess->ses;
+ cop.len = chunksize;
+ cop.iv = (unsigned char *)iv;
+ cop.op = COP_ENCRYPT;
+ cop.flags = flags;
+ cop.src = cop.dst = (unsigned char *)buffer;
+
+ if (ioctl(fdc, CIOCCRYPT, &cop)) {
+ perror("ioctl(CIOCCRYPT)");
+ return 1;
+ }
+ total+=chunksize;
+ } while(must_finish==0);
+ gettimeofday(&end, NULL);
+
+ secs = udifftimeval(start, end)/ 1000000.0;
+
+ value2human(total, secs, &ddata, &dspeed, metric);
+ printf ("done. %.2f %s in %.2f secs: ", ddata, metric, secs);
+ printf ("%.2f %s/sec\n", dspeed, metric);
+
+ return 0;
+}
+
+int main(void)
+{
+ int fd, i, fdc = -1;
+ struct session_op sess;
+ char keybuf[32];
+
+ signal(SIGALRM, alarm_handler);
+
+ if ((fd = open("/dev/crypto", O_RDWR, 0)) < 0) {
+ perror("open()");
+ return 1;
+ }
+ if (ioctl(fd, CRIOGET, &fdc)) {
+ perror("ioctl(CRIOGET)");
+ return 1;
+ }
+
+ fprintf(stderr, "Testing NULL cipher: \n");
+ memset(&sess, 0, sizeof(sess));
+ sess.cipher = CRYPTO_NULL;
+ sess.keylen = 0;
+ sess.key = (unsigned char *)keybuf;
+ if (ioctl(fdc, CIOCGSESSION, &sess)) {
+ perror("ioctl(CIOCGSESSION)");
+ return 1;
+ }
+
+ for (i = 256; i <= (64 * 1024); i *= 2) {
+ if (encrypt_data(&sess, fdc, i, 0))
+ break;
+ }
+
+ fprintf(stderr, "\nTesting AES-128-CBC cipher: \n");
+ memset(&sess, 0, sizeof(sess));
+ sess.cipher = CRYPTO_AES_CBC;
+ sess.keylen = 16;
+ memset(keybuf, 0x42, 16);
+ sess.key = (unsigned char *)keybuf;
+ if (ioctl(fdc, CIOCGSESSION, &sess)) {
+ perror("ioctl(CIOCGSESSION)");
+ return 1;
+ }
+
+ for (i = 256; i <= (64 * 1024); i *= 2) {
+ if (encrypt_data(&sess, fdc, i, 0))
+ break;
+ }
+
+ close(fdc);
+ close(fd);
+ return 0;
+}