summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ncr-int.h44
-rw-r--r--ncr-key-wrap.c20
-rw-r--r--ncr-key.c52
-rw-r--r--ncr-sessions.c53
-rw-r--r--ncr.c28
5 files changed, 105 insertions, 92 deletions
diff --git a/ncr-int.h b/ncr-int.h
index e79747c..3fe58b8 100644
--- a/ncr-int.h
+++ b/ncr-int.h
@@ -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;
diff --git a/ncr-key.c b/ncr-key.c
index 4ea933c..a4a5f60 100644
--- a/ncr-key.c
+++ b/ncr-key.c
@@ -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;
diff --git a/ncr.c b/ncr.c
index 7608312..41c3a3d 100644
--- a/ncr.c
+++ b/ncr.c
@@ -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;
}