summaryrefslogtreecommitdiffstats
path: root/userspace/ncrypto_key.c
diff options
context:
space:
mode:
authorJan Chadima <jchadima@redhat.com>2010-08-02 10:56:34 +0200
committerMiloslav Trmač <mitr@redhat.com>2010-08-24 20:58:30 +0200
commit71be5465628262f1a475b52eaf90c5caba5876ea (patch)
treefff8c000bb3480741e5dc34d66196ddbc11ad6f2 /userspace/ncrypto_key.c
parentaf2c2e1da1a898c8968281824ba8a4d9616670dc (diff)
Initial userspace library version
Diffstat (limited to 'userspace/ncrypto_key.c')
-rw-r--r--userspace/ncrypto_key.c370
1 files changed, 370 insertions, 0 deletions
diff --git a/userspace/ncrypto_key.c b/userspace/ncrypto_key.c
new file mode 100644
index 0000000..ca4cfeb
--- /dev/null
+++ b/userspace/ncrypto_key.c
@@ -0,0 +1,370 @@
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <errno.h>
+#include "../ncr.h"
+#include "ncrypto.h"
+
+extern int __ncr_file_descriptor;
+
+int
+ncr_key_init(ncr_key_t *key)
+{
+ if ((__ncr_file_descriptor < 0) && (ncr_global_init(0) < 0))
+ return -1;
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_INIT, key) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_generate(ncr_key_t key, ncr_key_generate_params_t params)
+{
+ struct ncr_key_generate_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.desc = key;
+ if (params)
+ memmove(&io.params, params, sizeof(io.params));
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_GENERATE, &io) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_generate_pair(ncr_key_t key1, ncr_key_t key2, ncr_key_generate_params_t params)
+{
+ struct ncr_key_generate_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key1 || !key2) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.desc = key1;
+ io.desc2 = key2;
+ if (params)
+ memmove(&io.params, params, sizeof(io.params));
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_GENERATE_PAIR, &io) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_derive(ncr_key_t newkey, unsigned int keyflags, ncr_key_t key, ncr_key_params_t params)
+{
+ struct ncr_key_derivation_params_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!newkey) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.newkey = newkey;
+ io.key = key;
+ io.keyflags = keyflags;
+ if (params)
+ memmove(&io.params, params, sizeof(io.params));
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_DERIVE, &io) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_get_flags(ncr_key_t key)
+{
+ struct ncr_key_info_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_GET_INFO, &io) < 0)
+ return -1;
+
+ return io.flags;
+}
+
+ncr_key_type_t
+ncr_key_get_type(ncr_key_t key)
+{
+ struct ncr_key_info_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_GET_INFO, &io) < 0)
+ return -1;
+
+ return io.type;
+}
+
+int
+ncr_key_get_id(ncr_key_t key, void *id, size_t *id_size)
+{
+ struct ncr_key_info_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_GET_INFO, &io) < 0)
+ return -1;
+
+ if (io.key_id_size < *id_size)
+ *id_size = io.key_id_size;
+
+ memmove(id, &io.key_id, *id_size);
+
+ return 0;
+}
+
+int
+ncr_key_export(ncr_key_t key, void *idata, size_t idata_size)
+{
+ struct ncr_key_data_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key || !idata || !idata_size) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+ io.idata = idata;
+ io.idata_size = idata_size;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_EXPORT, &io) < 0)
+ return -1;
+
+ return io.idata_size;
+}
+
+int
+ncr_key_import(ncr_key_t key, void *idata, size_t idata_size, void *id, size_t id_size, ncr_algorithm_t algorithm, unsigned int type, unsigned int flags)
+{
+ struct ncr_key_data_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key || !idata || !idata_size || !id || !id_size || (algorithm == NCR_ALG_NONE)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+ io.idata = idata;
+ io.idata_size = idata_size;
+ if (id_size > MAX_KEY_ID_SIZE)
+ id_size = MAX_KEY_ID_SIZE;
+ memmove(&io.key_id, id, id_size);
+ io.key_id_size = id_size;
+ io.algorithm = algorithm;
+ io.type = type;
+ io.flags = flags;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_IMPORT, &io) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_wrap(ncr_key_t key, ncr_wrap_algorithm_t algorithm, ncr_key_params_t params, ncr_key_t keytowrap, void *idata, size_t idata_size)
+{
+ struct ncr_key_wrap_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key || !keytowrap || !idata || !idata_size || (algorithm == NCR_ALG_NONE)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+ io.algorithm = algorithm;
+ if (params)
+ memmove(&io.params, params, sizeof(io.params));
+ io.keytowrap = keytowrap;
+ io.io = idata;
+ io.io_size = idata_size;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_WRAP, &io) < 0)
+ return -1;
+
+ return io.io_size;
+}
+
+int
+ncr_key_unwrap(ncr_key_t key, ncr_wrap_algorithm_t algorithm, ncr_key_params_t params, ncr_key_t keytowrap, void *idata, size_t idata_size)
+{
+ struct ncr_key_wrap_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!key || !keytowrap || !idata || !idata_size || (algorithm == NCR_ALG_NONE)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.key = key;
+ io.algorithm = algorithm;
+ if (params)
+ memmove(&io.params, params, sizeof(io.params));
+ io.keytowrap = keytowrap;
+ io.io = idata;
+ io.io_size = idata_size;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_UNWRAP, &io) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_storage_wrap(ncr_key_t keytowrap, void *idata, size_t idata_size)
+{
+ struct ncr_key_storage_wrap_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!keytowrap || !idata || !idata_size) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.keytowrap = keytowrap;
+ io.io = idata;
+ io.io_size = idata_size;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_STORAGE_WRAP, &io) < 0)
+ return -1;
+
+ return io.io_size;
+}
+
+int
+ncr_key_storage_unwrap(ncr_key_t keytowrap, void *idata, size_t idata_size)
+{
+ struct ncr_key_storage_wrap_st io;
+ memset(&io, 0, sizeof(io));
+
+ if (!keytowrap || !idata || !idata_size) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ io.keytowrap = keytowrap;
+ io.io = idata;
+ io.io_size = idata_size;
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_STORAGE_UNWRAP, &io) < 0)
+ return -1;
+
+ return 0;
+}
+
+int
+ncr_key_deinit(ncr_key_t key)
+{
+ if (!key) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (__ncr_file_descriptor < 0) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ioctl(__ncr_file_descriptor, NCRIO_KEY_DEINIT, &key) < 0)
+ return -1;
+
+ return 0;
+}
+