summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/speed.c125
-rw-r--r--ncr-sessions.c9
-rw-r--r--ncr.h3
3 files changed, 130 insertions, 7 deletions
diff --git a/examples/speed.c b/examples/speed.c
index bf19863..99dc09e 100644
--- a/examples/speed.c
+++ b/examples/speed.c
@@ -27,6 +27,7 @@
#include <signal.h>
#include <unistd.h>
#include "../cryptodev.h"
+#include "../ncr.h"
static double udifftimeval(struct timeval start, struct timeval end)
{
@@ -67,7 +68,7 @@ static void value2human(double bytes, double time, double* data, double* speed,c
}
-int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags)
+int encrypt_data(struct session_op *sess, int fdc, int chunksize)
{
struct crypt_op cop;
char *buffer, iv[32];
@@ -95,7 +96,7 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags)
cop.len = chunksize;
cop.iv = (unsigned char *)iv;
cop.op = COP_ENCRYPT;
- cop.flags = flags;
+ cop.flags = 0;
cop.src = cop.dst = (unsigned char *)buffer;
if (ioctl(fdc, CIOCCRYPT, &cop)) {
@@ -115,6 +116,107 @@ int encrypt_data(struct session_op *sess, int fdc, int chunksize, int flags)
return 0;
}
+int encrypt_data_ncr(int cfd, int algo, int chunksize)
+{
+ char *buffer, iv[32];
+ static int val = 23;
+ struct timeval start, end;
+ double total = 0;
+ double secs, ddata, dspeed;
+ char metric[16];
+ ncr_key_t key;
+ struct ncr_key_generate_st kgen;
+ struct ncr_data_init_st dinit;
+ struct ncr_data_st kdata;
+ struct ncr_session_once_op_st nop;
+ ncr_data_t dd;
+
+ if (ioctl(cfd, NCRIO_KEY_INIT, &key)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ kgen.desc = key;
+ kgen.params.algorithm = NCR_ALG_AES_CBC;
+ kgen.params.keyflags = NCR_KEY_FLAG_EXPORTABLE;
+ kgen.params.params.secret.bits = 128; /* 16 bytes */
+
+ if (ioctl(cfd, NCRIO_KEY_GENERATE, &kgen)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_IMPORT)");
+ return 1;
+ }
+
+
+ buffer = malloc(chunksize);
+ memset(iv, 0x23, 32);
+
+ dinit.max_object_size = chunksize;
+ dinit.flags = NCR_DATA_FLAG_EXPORTABLE;
+ dinit.initial_data = buffer;
+ dinit.initial_data_size = chunksize;
+
+ if (ioctl(cfd, NCRIO_DATA_INIT, &dinit)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_DATA_INIT)");
+ return 1;
+ }
+ dd = dinit.desc;
+
+ printf("\tEncrypting in chunks of %d bytes: ", chunksize);
+ fflush(stdout);
+
+ memset(buffer, val++, chunksize);
+
+ must_finish = 0;
+ alarm(5);
+
+ gettimeofday(&start, NULL);
+ do {
+ kdata.data = buffer;
+ kdata.data_size = chunksize;
+ kdata.desc = dd;
+ kdata.append_flag = 0;
+
+ if (ioctl(cfd, NCRIO_DATA_SET, &kdata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_DATA_INIT)");
+ return 1;
+ }
+
+ memset(&nop, 0, sizeof(nop));
+ nop.init.algorithm = algo;
+ nop.init.params.key = key;
+ nop.init.op = NCR_OP_ENCRYPT;
+ nop.op.data.cipher.plaintext = dd;
+ nop.op.data.cipher.ciphertext = dd;
+
+ if (ioctl(cfd, NCRIO_SESSION_ONCE, &nop)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_SESSION_ONCE)");
+ return 1;
+ }
+
+ total+=chunksize;
+ } while(must_finish==0);
+ gettimeofday(&end, NULL);
+
+ if (ioctl(cfd, NCRIO_DATA_DEINIT, &dd)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_DATA_INIT)");
+ return 1;
+ }
+
+ 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;
@@ -131,7 +233,7 @@ int main(void)
perror("ioctl(CRIOGET)");
return 1;
}
-
+
fprintf(stderr, "Testing NULL cipher: \n");
memset(&sess, 0, sizeof(sess));
sess.cipher = CRYPTO_NULL;
@@ -143,7 +245,7 @@ int main(void)
}
for (i = 256; i <= (64 * 1024); i *= 2) {
- if (encrypt_data(&sess, fdc, i, 0))
+ if (encrypt_data(&sess, fdc, i))
break;
}
@@ -159,10 +261,23 @@ int main(void)
}
for (i = 256; i <= (64 * 1024); i *= 2) {
- if (encrypt_data(&sess, fdc, i, 0))
+ if (encrypt_data(&sess, fdc, i))
+ break;
+ }
+
+ fprintf(stderr, "\nTesting NCR with NULL cipher: \n");
+ for (i = 256; i <= (64 * 1024); i *= 2) {
+ if (encrypt_data_ncr(fdc, NCR_ALG_NULL, i))
+ break;
+ }
+
+ fprintf(stderr, "\nTesting NCR with AES-128-CBC cipher: \n");
+ for (i = 256; i <= (64 * 1024); i *= 2) {
+ if (encrypt_data_ncr(fdc, NCR_ALG_AES_CBC, i))
break;
}
+
close(fdc);
close(fd);
return 0;
diff --git a/ncr-sessions.c b/ncr-sessions.c
index e86b162..53073af 100644
--- a/ncr-sessions.c
+++ b/ncr-sessions.c
@@ -123,6 +123,8 @@ static const struct algo_properties_st {
unsigned symmetric:1;
int digest_size;
} algo_properties[] = {
+ { .algo = NCR_ALG_NULL, .kstr = "ecb(cipher_null)",
+ .needs_iv = 0, .symmetric=1, .can_encrypt=1 },
{ .algo = NCR_ALG_3DES_CBC, .kstr = "cbc(des3_ede)",
.needs_iv = 1, .symmetric=1, .can_encrypt=1 },
{ .algo = NCR_ALG_AES_CBC, .kstr = "cbc(aes)",
@@ -315,6 +317,11 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses
}
if (ns->key->type == NCR_KEY_TYPE_SECRET) {
+ int keysize = ns->key->key.secret.size;
+
+ if (session->algorithm == NCR_ALG_NULL)
+ keysize = 0;
+
str = _ncr_algo_to_str(session->algorithm);
if (str == NULL) {
err();
@@ -322,7 +329,7 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses
}
ret = cryptodev_cipher_init(&ns->cipher, str,
- ns->key->key.secret.data, ns->key->key.secret.size);
+ ns->key->key.secret.data, keysize);
if (ret < 0) {
err();
goto fail;
diff --git a/ncr.h b/ncr.h
index 45f4432..184ef56 100644
--- a/ncr.h
+++ b/ncr.h
@@ -13,7 +13,8 @@
typedef enum {
NCR_ALG_NONE,
- NCR_ALG_3DES_CBC=2,
+ NCR_ALG_NULL,
+ NCR_ALG_3DES_CBC,
NCR_ALG_AES_CBC,
NCR_ALG_CAMELLIA_CBC,
NCR_ALG_ARCFOUR,