diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-06-04 07:28:19 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-06-17 20:47:39 +0200 |
commit | c8f69207e6d5fb654814833676f5f786084a8576 (patch) | |
tree | 229f8e227af42111adc988015112707330f530d8 /examples/new.c | |
parent | f3146e2631f23c80e9ce43cbff33b294cab9f535 (diff) | |
download | kernel-crypto-c8f69207e6d5fb654814833676f5f786084a8576.tar.gz kernel-crypto-c8f69207e6d5fb654814833676f5f786084a8576.tar.xz kernel-crypto-c8f69207e6d5fb654814833676f5f786084a8576.zip |
Some updates in the server approach (not working yet).
Diffstat (limited to 'examples/new.c')
-rw-r--r-- | examples/new.c | 157 |
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)"); |