diff options
-rw-r--r-- | ncr-int.h | 44 | ||||
-rw-r--r-- | ncr-key-wrap.c | 20 | ||||
-rw-r--r-- | ncr-key.c | 52 | ||||
-rw-r--r-- | ncr-sessions.c | 53 | ||||
-rw-r--r-- | ncr.c | 28 |
5 files changed, 105 insertions, 92 deletions
@@ -112,25 +112,25 @@ int ncr_ioctl(struct ncr_lists*, struct file *filp, unsigned int cmd, unsigned long arg); /* key derivation */ -int ncr_key_derive(struct list_sem_st* key_lst, void __user* arg); +int ncr_key_derive(struct ncr_lists *lst, void __user* arg); /* key handling */ -int ncr_key_init(struct list_sem_st*, void __user* arg); -int ncr_key_deinit(struct list_sem_st*, void __user* arg); -int ncr_key_export(struct list_sem_st* key_lst,void __user* arg); -int ncr_key_import(struct list_sem_st* key_lst,void __user* arg); -void ncr_key_list_deinit(struct list_sem_st* lst); -int ncr_key_generate(struct list_sem_st* data_lst, void __user* arg); -int ncr_key_info(struct list_sem_st*, void __user* arg); - -int ncr_key_generate_pair(struct list_sem_st* lst, void __user* arg); -int ncr_key_get_public(struct list_sem_st* lst, void __user* arg); - -int ncr_key_item_get_read(struct key_item_st**st, struct list_sem_st* lst, +int ncr_key_init(struct ncr_lists *lst, void __user* arg); +int ncr_key_deinit(struct ncr_lists *lst, void __user* arg); +int ncr_key_export(struct ncr_lists *lst, void __user* arg); +int ncr_key_import(struct ncr_lists *lst, void __user* arg); +void ncr_key_list_deinit(struct ncr_lists *lst); +int ncr_key_generate(struct ncr_lists *lst, void __user* arg); +int ncr_key_info(struct ncr_lists *lst, void __user* arg); + +int ncr_key_generate_pair(struct ncr_lists *lst, void __user* arg); +int ncr_key_get_public(struct ncr_lists *lst, void __user* arg); + +int ncr_key_item_get_read(struct key_item_st**st, struct ncr_lists *lst, ncr_key_t desc); /* get key item for writing */ -int ncr_key_item_get_write( struct key_item_st** st, - struct list_sem_st* lst, ncr_key_t desc); +int ncr_key_item_get_write( struct key_item_st** st, + struct ncr_lists *lst, ncr_key_t desc); void _ncr_key_item_put( struct key_item_st* item); typedef enum { @@ -142,16 +142,16 @@ int ncr_limits_add_and_check(uid_t uid, pid_t pid, limits_type_t type); void ncr_limits_init(void); void ncr_limits_deinit(void); -int ncr_key_wrap(struct list_sem_st* keys, void __user* arg); -int ncr_key_unwrap(struct list_sem_st*, void __user* arg); -int ncr_key_storage_wrap(struct list_sem_st* key_lst, void __user* arg); -int ncr_key_storage_unwrap(struct list_sem_st*, void __user* arg); +int ncr_key_wrap(struct ncr_lists *lst, void __user* arg); +int ncr_key_unwrap(struct ncr_lists *lst, void __user* arg); +int ncr_key_storage_wrap(struct ncr_lists *lst, void __user* arg); +int ncr_key_storage_unwrap(struct ncr_lists *lst, void __user* arg); /* sessions */ -struct session_item_st* ncr_session_new(struct list_sem_st* lst); +struct session_item_st* ncr_session_new(struct ncr_lists *lst); void _ncr_sessions_item_put( struct session_item_st* item); -struct session_item_st* ncr_sessions_item_get( struct list_sem_st* lst, ncr_session_t desc); -void ncr_sessions_list_deinit(struct list_sem_st* lst); +struct session_item_st* ncr_sessions_item_get(struct ncr_lists *lst, ncr_session_t desc); +void ncr_sessions_list_deinit(struct ncr_lists *lst); int ncr_session_init(struct ncr_lists* lists, void __user* arg); int ncr_session_update(struct ncr_lists* lists, void __user* arg); diff --git a/ncr-key-wrap.c b/ncr-key-wrap.c index cb431c9..1a32c5c 100644 --- a/ncr-key-wrap.c +++ b/ncr-key-wrap.c @@ -429,7 +429,7 @@ cleanup: return ret; } -int ncr_key_wrap(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_wrap(struct ncr_lists *lst, void __user* arg) { struct ncr_key_wrap_st wrap; struct key_item_st* wkey = NULL; @@ -443,7 +443,7 @@ int ret; return -EFAULT; } - ret = ncr_key_item_get_read( &wkey, key_lst, wrap.keytowrap); + ret = ncr_key_item_get_read( &wkey, lst, wrap.keytowrap); if (ret < 0) { err(); return ret; @@ -455,7 +455,7 @@ int ret; goto fail; } - ret = ncr_key_item_get_read( &key, key_lst, wrap.key); + ret = ncr_key_item_get_read( &key, lst, wrap.key); if (ret < 0) { err(); goto fail; @@ -512,7 +512,7 @@ fail: /* Unwraps keys. All keys unwrapped are not accessible by * userspace. */ -int ncr_key_unwrap(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_unwrap(struct ncr_lists *lst, void __user* arg) { struct ncr_key_wrap_st wrap; struct key_item_st* wkey = NULL; @@ -526,13 +526,13 @@ int ret; return -EFAULT; } - ret = ncr_key_item_get_write( &wkey, key_lst, wrap.keytowrap); + ret = ncr_key_item_get_write( &wkey, lst, wrap.keytowrap); if (ret < 0) { err(); return ret; } - ret = ncr_key_item_get_read( &key, key_lst, wrap.key); + ret = ncr_key_item_get_read( &key, lst, wrap.key); if (ret < 0) { err(); goto fail; @@ -574,7 +574,7 @@ fail: return ret; } -int ncr_key_storage_wrap(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_storage_wrap(struct ncr_lists *lst, void __user* arg) { struct ncr_key_storage_wrap_st wrap; struct key_item_st* wkey = NULL; @@ -594,7 +594,7 @@ int ret; return -EFAULT; } - ret = ncr_key_item_get_read( &wkey, key_lst, wrap.keytowrap); + ret = ncr_key_item_get_read( &wkey, lst, wrap.keytowrap); if (ret < 0) { err(); return ret; @@ -650,7 +650,7 @@ fail: /* Unwraps keys. All keys unwrapped are not accessible by * userspace. */ -int ncr_key_storage_unwrap(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_storage_unwrap(struct ncr_lists *lst, void __user* arg) { struct ncr_key_storage_wrap_st wrap; struct key_item_st* wkey = NULL; @@ -669,7 +669,7 @@ int ret; return -EFAULT; } - ret = ncr_key_item_get_write( &wkey, key_lst, wrap.keytowrap); + ret = ncr_key_item_get_write( &wkey, lst, wrap.keytowrap); if (ret < 0) { err(); return ret; @@ -40,18 +40,18 @@ static void _ncr_key_unlink_item(struct key_item_st *item) _ncr_key_item_put( item); /* decrement ref count */ } -void ncr_key_list_deinit(struct list_sem_st* lst) +void ncr_key_list_deinit(struct ncr_lists *lst_) { - if(lst) { - struct key_item_st * item, *tmp; + struct list_sem_st *lst; + struct key_item_st * item, *tmp; - down(&lst->sem); + lst = &lst_->key; + down(&lst->sem); - list_for_each_entry_safe(item, tmp, &lst->list, list) { - _ncr_key_unlink_item(item); - } - up(&lst->sem); + list_for_each_entry_safe(item, tmp, &lst->list, list) { + _ncr_key_unlink_item(item); } + up(&lst->sem); } /* must be called with data semaphore down @@ -70,12 +70,14 @@ int mx = 1; } /* returns the data item corresponding to desc */ -int ncr_key_item_get_read(struct key_item_st**st, struct list_sem_st* lst, +int ncr_key_item_get_read(struct key_item_st**st, struct ncr_lists *lst_, ncr_key_t desc) { +struct list_sem_st *lst; struct key_item_st* item; int ret; + lst = &lst_->key; *st = NULL; down(&lst->sem); @@ -107,11 +109,13 @@ exit: * is in use. */ int ncr_key_item_get_write( struct key_item_st** st, - struct list_sem_st* lst, ncr_key_t desc) + struct ncr_lists *lst_, ncr_key_t desc) { +struct list_sem_st *lst; struct key_item_st* item; int ret; + lst = &lst_->key; *st = NULL; down(&lst->sem); @@ -157,12 +161,14 @@ void _ncr_key_item_put( struct key_item_st* item) } } -int ncr_key_init(struct list_sem_st* lst, void __user* arg) +int ncr_key_init(struct ncr_lists *lst_, void __user* arg) { + struct list_sem_st *lst; ncr_key_t desc; struct key_item_st* key; int ret; + lst = &lst_->key; ret = ncr_limits_add_and_check(current_euid(), task_pid_nr(current), LIMIT_TYPE_KEY); if (ret < 0) { err(); @@ -207,11 +213,13 @@ err_limits: } -int ncr_key_deinit(struct list_sem_st* lst, void __user* arg) +int ncr_key_deinit(struct ncr_lists *lst_, void __user* arg) { + struct list_sem_st *lst; ncr_key_t desc; struct key_item_st * item, *tmp; + lst = &lst_->key; if (unlikely(copy_from_user(&desc, arg, sizeof(desc)))) { err(); return -EFAULT; @@ -234,7 +242,7 @@ int ncr_key_deinit(struct list_sem_st* lst, void __user* arg) /* "exports" a key to a data item. If the key is not exportable * to userspace then the data item will also not be. */ -int ncr_key_export(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_export(struct ncr_lists *lst, void __user* arg) { struct ncr_key_data_st data; struct key_item_st* item = NULL; @@ -247,7 +255,7 @@ int ret; return -EFAULT; } - ret = ncr_key_item_get_read( &item, key_lst, data.key); + ret = ncr_key_item_get_read( &item, lst, data.key); if (ret < 0) { err(); return ret; @@ -329,7 +337,7 @@ fail: /* "imports" a key from a data item. If the key is not exportable * to userspace then the key item will also not be. */ -int ncr_key_import(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_import(struct ncr_lists *lst, void __user* arg) { struct ncr_key_data_st data; struct key_item_st* item = NULL; @@ -342,7 +350,7 @@ size_t tmp_size; return -EFAULT; } - ret = ncr_key_item_get_write( &item, key_lst, data.key); + ret = ncr_key_item_get_write( &item, lst, data.key); if (ret < 0) { err(); return ret; @@ -438,7 +446,7 @@ static void ncr_key_clear(struct key_item_st* item) /* Generate a secret key */ -int ncr_key_generate(struct list_sem_st* lst, void __user* arg) +int ncr_key_generate(struct ncr_lists *lst, void __user* arg) { struct ncr_key_generate_st gen; struct key_item_st* item = NULL; @@ -500,7 +508,7 @@ fail: return ret; } -int ncr_key_info(struct list_sem_st* lst, void __user* arg) +int ncr_key_info(struct ncr_lists *lst, void __user* arg) { struct ncr_key_info_st info; struct key_item_st* item = NULL; @@ -535,7 +543,7 @@ fail: return ret; } -int ncr_key_generate_pair(struct list_sem_st* lst, void __user* arg) +int ncr_key_generate_pair(struct ncr_lists *lst, void __user* arg) { struct ncr_key_generate_st gen; struct key_item_st* private = NULL; @@ -602,7 +610,7 @@ fail: /* "exports" a key to a data item. If the key is not exportable * to userspace then the data item will also not be. */ -int ncr_key_derive(struct list_sem_st* key_lst, void __user* arg) +int ncr_key_derive(struct ncr_lists *lst, void __user* arg) { struct ncr_key_derivation_params_st data; int ret; @@ -614,13 +622,13 @@ struct key_item_st* newkey = NULL; return -EFAULT; } - ret = ncr_key_item_get_read( &key, key_lst, data.key); + ret = ncr_key_item_get_read( &key, lst, data.key); if (ret < 0) { err(); return ret; } - ret = ncr_key_item_get_write( &newkey, key_lst, data.newkey); + ret = ncr_key_item_get_write( &newkey, lst, data.newkey); if (ret < 0) { err(); goto fail; diff --git a/ncr-sessions.c b/ncr-sessions.c index 365935f..b99f1fe 100644 --- a/ncr-sessions.c +++ b/ncr-sessions.c @@ -31,22 +31,21 @@ #include <linux/scatterlist.h> static int _ncr_session_update_key(struct ncr_lists* lists, struct ncr_session_op_st* op); -static void _ncr_session_remove(struct list_sem_st* lst, ncr_session_t desc); +static void _ncr_session_remove(struct ncr_lists *lst, ncr_session_t desc); -void ncr_sessions_list_deinit(struct list_sem_st* lst) +void ncr_sessions_list_deinit(struct ncr_lists *lst_) { - if(lst) { - struct session_item_st * item, *tmp; + struct list_sem_st *lst; + struct session_item_st * item, *tmp; - down(&lst->sem); - - list_for_each_entry_safe(item, tmp, &lst->list, list) { - list_del(&item->list); - _ncr_sessions_item_put( item); /* decrement ref count */ - } - up(&lst->sem); + lst = &lst_->sessions; + down(&lst->sem); + list_for_each_entry_safe(item, tmp, &lst->list, list) { + list_del(&item->list); + _ncr_sessions_item_put( item); /* decrement ref count */ } + up(&lst->sem); } /* must be called with data semaphore down @@ -65,10 +64,12 @@ int mx = 1; } /* returns the data item corresponding to desc */ -struct session_item_st* ncr_sessions_item_get( struct list_sem_st* lst, ncr_session_t desc) +struct session_item_st* ncr_sessions_item_get(struct ncr_lists *lst_, ncr_session_t desc) { +struct list_sem_st *lst; struct session_item_st* item; + lst = &lst_->sessions; down(&lst->sem); list_for_each_entry(item, &lst->list, list) { if (item->desc == desc) { @@ -97,10 +98,12 @@ void _ncr_sessions_item_put( struct session_item_st* item) } } -struct session_item_st* ncr_session_new(struct list_sem_st* lst) +struct session_item_st* ncr_session_new(struct ncr_lists *lst_) { + struct list_sem_st *lst; struct session_item_st* sess; + lst = &lst_->sessions; sess = kzalloc(sizeof(*sess), GFP_KERNEL); if (sess == NULL) { err(); @@ -226,7 +229,7 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses int ret; const struct algo_properties_st *sign_hash; - ns = ncr_session_new(&lists->sessions); + ns = ncr_session_new(lists); if (ns == NULL) { err(); return -ENOMEM; @@ -250,7 +253,7 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses } /* read key */ - ret = ncr_key_item_get_read( &ns->key, &lists->key, session->key); + ret = ncr_key_item_get_read( &ns->key, lists, session->key); if (ret < 0) { err(); goto fail; @@ -319,7 +322,7 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses } else { /* read key */ - ret = ncr_key_item_get_read( &ns->key, &lists->key, session->key); + ret = ncr_key_item_get_read( &ns->key, lists, session->key); if (ret < 0) { err(); goto fail; @@ -390,7 +393,7 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses fail: if (ret < 0) { - _ncr_session_remove(&lists->sessions, ns->desc); + _ncr_session_remove(lists, ns->desc); } _ncr_sessions_item_put(ns); @@ -416,7 +419,7 @@ int ncr_session_init(struct ncr_lists* lists, void __user* arg) ret = copy_to_user( arg, &session, sizeof(session)); if (unlikely(ret)) { err(); - _ncr_session_remove(&lists->sessions, session.ses); + _ncr_session_remove(lists, session.ses); return -EFAULT; } return ret; @@ -479,10 +482,12 @@ int ret; return 0; } -static void _ncr_session_remove(struct list_sem_st* lst, ncr_session_t desc) +static void _ncr_session_remove(struct ncr_lists *lst_, ncr_session_t desc) { + struct list_sem_st* lst; struct session_item_st * item, *tmp; + lst = &lst_->sessions; down(&lst->sem); list_for_each_entry_safe(item, tmp, &lst->list, list) { @@ -630,7 +635,7 @@ static int _ncr_session_update(struct ncr_lists* lists, struct ncr_session_op_st unsigned osg_cnt=0, isg_cnt=0; size_t isg_size, osg_size; - sess = ncr_sessions_item_get( &lists->sessions, op->ses); + sess = ncr_sessions_item_get(lists, op->ses); if (sess == NULL) { err(); return -EINVAL; @@ -750,7 +755,7 @@ static int _ncr_session_final(struct ncr_lists* lists, struct ncr_session_op_st* void __user * udata = NULL; size_t *udata_size; - sess = ncr_sessions_item_get( &lists->sessions, op->ses); + sess = ncr_sessions_item_get(lists, op->ses); if (sess == NULL) { err(); return -EINVAL; @@ -900,7 +905,7 @@ fail: } _ncr_sessions_item_put(sess); - _ncr_session_remove(&lists->sessions, op->ses); + _ncr_session_remove(lists, op->ses); return ret; } @@ -913,14 +918,14 @@ static int _ncr_session_update_key(struct ncr_lists* lists, struct ncr_session_o struct session_item_st* sess; struct key_item_st* key = NULL; - sess = ncr_sessions_item_get( &lists->sessions, op->ses); + sess = ncr_sessions_item_get(lists, op->ses); if (sess == NULL) { err(); return -EINVAL; } /* read key */ - ret = ncr_key_item_get_read( &key, &lists->key, op->data.kdata.input); + ret = ncr_key_item_get_read( &key, lists, op->data.kdata.input); if (ret < 0) { err(); goto fail; @@ -64,8 +64,8 @@ void* ncr_init_lists(void) void ncr_deinit_lists(struct ncr_lists *lst) { if(lst) { - ncr_key_list_deinit(&lst->key); - ncr_sessions_list_deinit(&lst->sessions); + ncr_key_list_deinit(lst); + ncr_sessions_list_deinit(lst); kfree(lst); } } @@ -127,25 +127,25 @@ ncr_ioctl(struct ncr_lists* lst, struct file *filp, switch (cmd) { case NCRIO_KEY_INIT: - return ncr_key_init(&lst->key, arg); + return ncr_key_init(lst, arg); case NCRIO_KEY_DEINIT: - return ncr_key_deinit(&lst->key, arg); + return ncr_key_deinit(lst, arg); case NCRIO_KEY_GENERATE: - return ncr_key_generate(&lst->key, arg); + return ncr_key_generate(lst, arg); case NCRIO_KEY_EXPORT: - return ncr_key_export(&lst->key, arg); + return ncr_key_export(lst, arg); case NCRIO_KEY_IMPORT: - return ncr_key_import(&lst->key, arg); + return ncr_key_import(lst, arg); case NCRIO_KEY_GET_INFO: - return ncr_key_info(&lst->key, arg); + return ncr_key_info(lst, arg); case NCRIO_KEY_WRAP: - return ncr_key_wrap(&lst->key, arg); + return ncr_key_wrap(lst, arg); case NCRIO_KEY_UNWRAP: - return ncr_key_unwrap(&lst->key, arg); + return ncr_key_unwrap(lst, arg); case NCRIO_KEY_STORAGE_WRAP: - return ncr_key_storage_wrap(&lst->key, arg); + return ncr_key_storage_wrap(lst, arg); case NCRIO_KEY_STORAGE_UNWRAP: - return ncr_key_storage_unwrap(&lst->key, arg); + return ncr_key_storage_unwrap(lst, arg); case NCRIO_SESSION_INIT: return ncr_session_init(lst, arg); case NCRIO_SESSION_UPDATE: @@ -158,9 +158,9 @@ ncr_ioctl(struct ncr_lists* lst, struct file *filp, case NCRIO_MASTER_KEY_SET: return ncr_master_key_set(arg); case NCRIO_KEY_GENERATE_PAIR: - return ncr_key_generate_pair(&lst->key, arg); + return ncr_key_generate_pair(lst, arg); case NCRIO_KEY_DERIVE: - return ncr_key_derive(&lst->key, arg); + return ncr_key_derive(lst, arg); default: return -EINVAL; } |