diff options
Diffstat (limited to 'crypto/userspace/ncr-key.c')
-rw-r--r-- | crypto/userspace/ncr-key.c | 83 |
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) |