diff options
Diffstat (limited to 'ncr.c')
-rw-r--r-- | ncr.c | 35 |
1 files changed, 34 insertions, 1 deletions
@@ -30,6 +30,10 @@ #include "ncr.h" #include "ncr_int.h" +/* This is the master wrapping key for storage of keys + */ +struct key_item_st master_key; + void* ncr_init_lists(void) { struct ncr_lists *lst; @@ -64,6 +68,29 @@ void ncr_deinit_lists(struct ncr_lists *lst) } } +void ncr_master_key_reset(void) +{ + memset(&master_key, 0, sizeof(master_key)); +} + +static int ncr_master_key_set(void* __user arg) +{ +struct ncr_master_key_st st; + copy_from_user(&st, arg, sizeof(st)); + + if (st.key_size > sizeof(master_key.key.secret.data)) { + err(); + return -EINVAL; + } + + master_key.type = NCR_KEY_TYPE_SECRET; + + memcpy(master_key.key.secret.data, st.key, st.key_size); + master_key.key.secret.size = st.key_size; + + return 0; +} + int ncr_ioctl(struct ncr_lists* lst, struct file *filp, unsigned int cmd, unsigned long arg) @@ -98,6 +125,10 @@ ncr_ioctl(struct ncr_lists* lst, struct file *filp, return ncr_key_wrap(&lst->key, &lst->data, (void*)arg); case NCRIO_KEY_UNWRAP: return ncr_key_unwrap(&lst->key, &lst->data, (void*)arg); + case NCRIO_KEY_STORAGE_WRAP: + return ncr_key_storage_wrap(&lst->key, &lst->data, (void*)arg); + case NCRIO_KEY_STORAGE_UNWRAP: + return ncr_key_storage_unwrap(&lst->key, &lst->data, (void*)arg); case NCRIO_SESSION_INIT: return ncr_session_init(lst, (void*)arg); case NCRIO_SESSION_UPDATE: @@ -105,7 +136,9 @@ ncr_ioctl(struct ncr_lists* lst, struct file *filp, case NCRIO_SESSION_FINAL: return ncr_session_final(lst, (void*)arg); case NCRIO_SESSION_ONCE: - return ncr_session_once(lst, (void*)arg); + return ncr_session_once(lst, (void*)arg); + case NCRIO_MASTER_KEY_SET: + return ncr_master_key_set((void*)arg); #if 0 case NCRIO_KEY_GENERATE_PAIR: return ncr_key_generate_pair(&lst->key, (void*)arg); |