summaryrefslogtreecommitdiffstats
path: root/examples/new.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/new.c')
-rw-r--r--examples/new.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/examples/new.c b/examples/new.c
index 32e17dcfc51..cdc3baa5d70 100644
--- a/examples/new.c
+++ b/examples/new.c
@@ -10,6 +10,8 @@
#include <fcntl.h>
#include <time.h>
#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include "../ncr.h"
#include <stdlib.h>
@@ -376,6 +378,158 @@ static int test_ncr_data(int cfd)
return 0;
}
+static int
+test_ncr_store_key(int cfd)
+{
+ 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;
+ 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, "\tKey storage/retrieval...\n");
+
+ /* initialize data */
+ dinit.max_object_size = KEY_DATA_SIZE;
+ dinit.flags = NCR_DATA_FLAG_EXPORTABLE;
+ dinit.initial_data = NULL;
+ dinit.initial_data_size = 0;
+
+ if (ioctl(cfd, NCRIO_DATA_INIT, &dinit)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_DATA_INIT)");
+ return 1;
+ }
+
+ 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 */
+
+ 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)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_IMPORT)");
+ return 1;
+ }
+
+ /* now read data */
+ memset(data, 0, sizeof(data));
+
+ 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)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_DATA_GET)");
+ 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)");
+ return 1;
+ }
+
+ kstore.key = key2;
+
+ if (ioctl(cfd, NCRIO_STORAGE_LOAD, &kstore)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_STORAGE_LOAD)");
+ return 1;
+ }
+
+ /* export it */
+ memset(&keydata, 0, sizeof(keydata));
+ keydata.key = key2;
+ keydata.data = dinit.desc;
+
+ if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_IMPORT)");
+ 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;
+
+ if (ioctl(cfd, NCRIO_DATA_GET, &kdata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ 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 (ioctl(cfd, NCRIO_KEY_DEINIT, &key)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_DEINIT)");
+ return 1;
+ }
+
+ if (ioctl(cfd, NCRIO_KEY_DEINIT, &key2)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_DEINIT)");
+ return 1;
+ }
+
+ if (ioctl(cfd, NCRIO_DATA_DEINIT, &dinit.desc)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_DATA_DEINIT)");
+ return 1;
+ }
+
+
+ return 0;
+}
+
int
main()
{
@@ -410,6 +564,9 @@ main()
if (test_ncr_key(fd))
return 1;
+ if (test_ncr_store_key(fd))
+ return 1;
+
/* Close the original descriptor */
if (close(fd)) {
perror("close(fd)");