summaryrefslogtreecommitdiffstats
path: root/crypto/userspace/ncr-key.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/userspace/ncr-key.c')
-rw-r--r--crypto/userspace/ncr-key.c83
1 files changed, 14 insertions, 69 deletions
diff --git a/crypto/userspace/ncr-key.c b/crypto/userspace/ncr-key.c
index 18cb38718a3..134831e55b6 100644
--- a/crypto/userspace/ncr-key.c
+++ b/crypto/userspace/ncr-key.c
@@ -238,10 +238,7 @@ struct ncr_key_data_st data;
struct key_item_st* item = NULL;
struct data_item_st* ditem = NULL;
uint32_t size;
-uint32_t data_flags;
int ret;
-uint8_t* tmp = NULL;
-size_t max_data_size;
if (unlikely(copy_from_user(&data, arg, sizeof(data)))) {
err();
@@ -261,18 +258,11 @@ size_t max_data_size;
goto fail;
}
- data_flags = key_flags_to_data(item->flags);
-
- ret = ncr_data_item_size(ditem, 1);
- if (ret < 0) {
- err();
- goto fail;
- }
- max_data_size = ret;
+ ditem->flags = key_flags_to_data(item->flags);
switch (item->type) {
case NCR_KEY_TYPE_SECRET:
- if (item->key.secret.size > max_data_size) {
+ if (item->key.secret.size > ditem->max_data_size) {
err();
ret = -EINVAL;
goto fail;
@@ -280,39 +270,21 @@ size_t max_data_size;
/* found */
if (item->key.secret.size > 0) {
- ret = ncr_data_item_setd( ditem,
- item->key.secret.data, item->key.secret.size,
- data_flags);
- if (ret < 0) {
- err();
- goto fail;
- }
+ memcpy(ditem->data, item->key.secret.data, item->key.secret.size);
}
+ ditem->data_size = item->key.secret.size;
break;
case NCR_KEY_TYPE_PUBLIC:
case NCR_KEY_TYPE_PRIVATE:
- size = max_data_size;
-
- tmp = kmalloc(size, GFP_KERNEL);
- if (tmp == NULL) {
- err();
- ret = -ENOMEM;
- goto fail;
- }
-
- ret = ncr_pk_pack(item, tmp, &size);
- if (ret < 0) {
- err();
- goto fail;
- }
+ size = ditem->max_data_size;
+ ret = ncr_pk_pack(item, ditem->data, &size);
+
+ ditem->data_size = size;
- ret = ncr_data_item_setd( ditem, tmp, size, data_flags);
if (ret < 0) {
- err();
+ err();
goto fail;
}
-
- kfree(tmp);
break;
default:
@@ -327,7 +299,6 @@ size_t max_data_size;
return 0;
fail:
- kfree(tmp);
if (item)
_ncr_key_item_put(item);
if (ditem)
@@ -345,9 +316,7 @@ int ncr_key_import(struct list_sem_st* data_lst,
struct ncr_key_data_st data;
struct key_item_st* item = NULL;
struct data_item_st* ditem = NULL;
-uint8_t *tmp = NULL;
int ret;
-size_t data_size;
if (unlikely(copy_from_user(&data, arg, sizeof(data)))) {
err();
@@ -386,48 +355,25 @@ size_t data_size;
if (data.key_id_size > 0)
memcpy(item->key_id, data.key_id, data.key_id_size);
- ret = ncr_data_item_size(ditem, 0);
- if (ret < 0) {
- err();
- goto fail;
- }
- data_size = ret;
-
switch(item->type) {
case NCR_KEY_TYPE_SECRET:
- if (data_size > NCR_CIPHER_MAX_KEY_LEN) {
+
+ if (ditem->data_size > NCR_CIPHER_MAX_KEY_LEN) {
err();
ret = -EINVAL;
goto fail;
}
- ret = ncr_data_item_getd(ditem, item->key.secret.data, data_size, item->flags);
- if (ret < 0) {
- err();
- goto fail;
- }
- item->key.secret.size = data_size;
+ memcpy(item->key.secret.data, ditem->data, ditem->data_size);
+ item->key.secret.size = ditem->data_size;
break;
case NCR_KEY_TYPE_PRIVATE:
case NCR_KEY_TYPE_PUBLIC:
- tmp = kmalloc(data_size, GFP_KERNEL);
- if (tmp == NULL) {
- err();
- return -ENOMEM;
- }
-
- ret = ncr_data_item_getd(ditem, tmp, data_size, item->flags);
- if (ret < 0) {
- err();
- goto fail;
- }
-
- ret = ncr_pk_unpack( item, tmp, data_size);
+ ret = ncr_pk_unpack( item, ditem->data, ditem->data_size);
if (ret < 0) {
err();
goto fail;
}
- kfree(tmp);
break;
default:
@@ -442,7 +388,6 @@ size_t data_size;
return 0;
fail:
- kfree(tmp);
if (item)
_ncr_key_item_put(item);
if (ditem)