summaryrefslogtreecommitdiffstats
path: root/examples/new.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2010-06-15 10:37:02 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-06-17 20:48:18 +0200
commite6d0b36c4405bb741ed3658f216f1ae514620cec (patch)
tree4d7b6b177265c92a737f13e79fb1917c69bfe573 /examples/new.c
parent8c989f532b49f72275a4f2a1e4ba83a546f1cac5 (diff)
downloadcryptodev-linux-e6d0b36c4405bb741ed3658f216f1ae514620cec.tar.gz
cryptodev-linux-e6d0b36c4405bb741ed3658f216f1ae514620cec.tar.xz
cryptodev-linux-e6d0b36c4405bb741ed3658f216f1ae514620cec.zip
Added self test for key wrapping.
Diffstat (limited to 'examples/new.c')
-rw-r--r--examples/new.c178
1 files changed, 103 insertions, 75 deletions
diff --git a/examples/new.c b/examples/new.c
index cdc3baa..b90554d 100644
--- a/examples/new.c
+++ b/examples/new.c
@@ -378,30 +378,32 @@ static int test_ncr_data(int cfd)
return 0;
}
+/* Key wrapping */
static int
-test_ncr_store_key(int cfd)
+test_ncr_wrap_key(int cfd)
{
+ int i;
struct ncr_data_init_st dinit;
struct ncr_key_generate_st kgen;
ncr_key_t key, key2;
struct ncr_key_data_st keydata;
struct ncr_data_st kdata;
+ struct ncr_key_wrap_st kwrap;
uint8_t data[KEY_DATA_SIZE];
- uint8_t data_bak[KEY_DATA_SIZE];
- struct ncr_storage_st kstore;
- fprintf(stdout, "Tests on Key Storage:\n");
- /* test 1: generate a key in kernel and store it.
- * The try to load it.
+ fprintf(stdout, "Tests on Keys:\n");
+
+ /* test 1: generate a key in userspace import it
+ * to kernel via data and export it.
*/
- fprintf(stdout, "\tKey storage/retrieval...\n");
- /* initialize data */
+ fprintf(stdout, "\tKey Wrap test...\n");
+
dinit.max_object_size = KEY_DATA_SIZE;
dinit.flags = NCR_DATA_FLAG_EXPORTABLE;
- dinit.initial_data = NULL;
- dinit.initial_data_size = 0;
+ dinit.initial_data = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F";
+ dinit.initial_data_size = 16;
if (ioctl(cfd, NCRIO_DATA_INIT, &dinit)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
@@ -409,89 +411,76 @@ test_ncr_store_key(int cfd)
return 1;
}
+ /* convert it to key */
if (ioctl(cfd, NCRIO_KEY_INIT, &key)) {
- fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
perror("ioctl(NCRIO_KEY_INIT)");
return 1;
}
- if (ioctl(cfd, NCRIO_KEY_INIT, &key2)) {
- 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 */
+ keydata.key_id[0] = 'a';
+ keydata.key_id[2] = 'b';
+ keydata.key_id_size = 2;
+ keydata.type = NCR_KEY_TYPE_SECRET;
+ keydata.algorithm = NCR_ALG_AES_CBC;
+ keydata.flags = NCR_KEY_FLAG_EXPORTABLE;
- if (ioctl(cfd, NCRIO_KEY_GENERATE, &kgen)) {
- fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_KEY_IMPORT)");
- return 1;
- }
-
-
- memset(&keydata, 0, sizeof(keydata));
keydata.key = key;
keydata.data = dinit.desc;
- if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ if (ioctl(cfd, NCRIO_KEY_IMPORT, &keydata)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
perror("ioctl(NCRIO_KEY_IMPORT)");
return 1;
}
- /* now read data */
- memset(data, 0, sizeof(data));
-
+#define DKEY "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC\xDD\xEE\xFF"
+ /* now key data */
+ kdata.data = DKEY;
+ kdata.data_size = 16;
kdata.desc = dinit.desc;
- kdata.data = data_bak;
- kdata.data_size = sizeof(data_bak);
kdata.append_flag = 0;
- if (ioctl(cfd, NCRIO_DATA_GET, &kdata)) {
+ if (ioctl(cfd, NCRIO_DATA_SET, &kdata)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_DATA_GET)");
+ perror("ioctl(NCRIO_DATA_INIT)");
return 1;
}
-
- /* ok now key stands in data[]. Store it. */
-
- kstore.key = key;
- strcpy(kstore.label, "testkey");
- kstore.mode = S_IRWXU;
- if (ioctl(cfd, NCRIO_STORAGE_STORE, &kstore)) {
- fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_STORAGE_STORE)");
+ /* convert it to key */
+ if (ioctl(cfd, NCRIO_KEY_INIT, &key2)) {
+ perror("ioctl(NCRIO_KEY_INIT)");
return 1;
}
- kstore.key = key2;
+ keydata.key_id[0] = 'b';
+ keydata.key_id[2] = 'a';
+ keydata.key_id_size = 2;
+ keydata.type = NCR_KEY_TYPE_SECRET;
+ keydata.algorithm = NCR_ALG_AES_CBC;
+ keydata.flags = NCR_KEY_FLAG_EXPORTABLE|NCR_KEY_FLAG_WRAPPABLE;
+
+ keydata.key = key;
+ keydata.data = kdata.desc;
- if (ioctl(cfd, NCRIO_STORAGE_LOAD, &kstore)) {
+ if (ioctl(cfd, NCRIO_KEY_IMPORT, &keydata)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_STORAGE_LOAD)");
+ perror("ioctl(NCRIO_KEY_IMPORT)");
return 1;
}
-
- /* export it */
- memset(&keydata, 0, sizeof(keydata));
- keydata.key = key2;
- keydata.data = dinit.desc;
- if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ /* now try wrapping key2 using key */
+ memset(&kwrap, 0, sizeof(kwrap));
+ kwrap.algorithm = NCR_WALG_AES_RFC3394;
+ kwrap.keytowrap = key2;
+ kwrap.key.key = key;
+ kwrap.data = kdata.desc;
+
+ if (ioctl(cfd, NCRIO_KEY_WRAP, &kwrap)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_KEY_IMPORT)");
+ perror("ioctl(NCRIO_KEY_WRAP)");
return 1;
}
- /* now read data */
- memset(data, 0, sizeof(data));
-
- kdata.desc = dinit.desc;
kdata.data = data;
kdata.data_size = sizeof(data);
kdata.append_flag = 0;
@@ -501,33 +490,72 @@ test_ncr_store_key(int cfd)
perror("ioctl(NCRIO_DATA_GET)");
return 1;
}
-
- if (memcmp(data, data_bak, kdata.data_size)!=0) {
- fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- fprintf(stderr, "Loaded data do not match stored\n");
- return 1;
+
+ if (kdata.data_size != 24 || memcmp(kdata.data,
+ "\x1F\xA6\x8B\x0A\x81\x12\xB4\x47\xAE\xF3\x4B\xD8\xFB\x5A\x7B\x82\x9D\x3E\x86\x23\x71\xD2\xCF\xE5", 24) != 0) {
+ fprintf(stderr, "Wrapped data do not match.\n");
}
-
- if (ioctl(cfd, NCRIO_KEY_DEINIT, &key)) {
- fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+
+
+fprintf(stderr, "Data[%d]: ", kdata.data_size);
+for(i=0;i<kdata.data_size;i++)
+ fprintf(stderr, "%.2x:", data[i]);
+fprintf(stderr, "\n");
+
+
+ /* test unwrapping */
+ fprintf(stdout, "\tKey Unwrap test...\n");
+
+ /* reset key2 */
+ if (ioctl(cfd, NCRIO_KEY_DEINIT, &key2)) {
perror("ioctl(NCRIO_KEY_DEINIT)");
return 1;
}
- if (ioctl(cfd, NCRIO_KEY_DEINIT, &key2)) {
+ if (ioctl(cfd, NCRIO_KEY_INIT, &key2)) {
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ memset(&kwrap, 0, sizeof(kwrap));
+ kwrap.algorithm = NCR_WALG_AES_RFC3394;
+ kwrap.keytowrap = key2;
+ kwrap.key.key = key;
+ kwrap.data = kdata.desc;
+
+ if (ioctl(cfd, NCRIO_KEY_UNWRAP, &kwrap)) {
+ perror("ioctl(NCRIO_KEY_UNWRAP)");
+ return 1;
+ }
+
+ /* now export the unwrapped */
+ memset(&keydata, 0, sizeof(keydata));
+ keydata.key = key2;
+ keydata.data = kdata.desc;
+
+ if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_KEY_DEINIT)");
+ perror("ioctl(NCRIO_KEY_IMPORT)");
return 1;
}
- if (ioctl(cfd, NCRIO_DATA_DEINIT, &dinit.desc)) {
+ if (ioctl(cfd, NCRIO_DATA_GET, &kdata)) {
fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
- perror("ioctl(NCRIO_DATA_DEINIT)");
+ perror("ioctl(NCRIO_DATA_GET)");
return 1;
}
-
- return 0;
+ if (kdata.data_size != 16 || memcmp(kdata.data, DKEY, 16) != 0) {
+ fprintf(stderr, "Unwrapped data do not match.\n");
+ }
+
+
+fprintf(stderr, "Data[%d]: ", kdata.data_size);
+for(i=0;i<kdata.data_size;i++)
+ fprintf(stderr, "%.2x:", data[i]);
+fprintf(stderr, "\n");
+
+
}
int
@@ -564,7 +592,7 @@ main()
if (test_ncr_key(fd))
return 1;
- if (test_ncr_store_key(fd))
+ if (test_ncr_wrap_key(fd))
return 1;
/* Close the original descriptor */