diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-21 20:02:50 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-21 20:02:50 +0200 |
commit | 5689c9734223fb349bba526d620823a803c3b67e (patch) | |
tree | 07d02fcc9b0f10f41344312474c91fd4cf3da615 /ncr-key.c | |
parent | 514a0e99c176081e1cb610a3e8dabf4d2da38dab (diff) | |
download | cryptodev-linux-5689c9734223fb349bba526d620823a803c3b67e.tar.gz cryptodev-linux-5689c9734223fb349bba526d620823a803c3b67e.tar.xz cryptodev-linux-5689c9734223fb349bba526d620823a803c3b67e.zip |
Modified NCR-USER API to "simplify" and allow setting of size of data structure without special system call.
Diffstat (limited to 'ncr-key.c')
-rw-r--r-- | ncr-key.c | 36 |
1 files changed, 25 insertions, 11 deletions
@@ -241,6 +241,7 @@ 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(); @@ -262,9 +263,16 @@ uint8_t* tmp = NULL; 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; + switch (item->type) { case NCR_KEY_TYPE_SECRET: - if (item->key.secret.size > ditem->max_data_size) { + if (item->key.secret.size > max_data_size) { err(); ret = -EINVAL; goto fail; @@ -283,8 +291,8 @@ uint8_t* tmp = NULL; break; case NCR_KEY_TYPE_PUBLIC: case NCR_KEY_TYPE_PRIVATE: - size = ditem->max_data_size; - + size = max_data_size; + tmp = kmalloc(size, GFP_KERNEL); if (tmp == NULL) { err(); @@ -293,8 +301,6 @@ uint8_t* tmp = NULL; } ret = ncr_pk_pack(item, tmp, &size); - ditem->data_size = size; - if (ret < 0) { err(); goto fail; @@ -341,6 +347,7 @@ 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(); @@ -379,36 +386,43 @@ int ret; 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 (ditem->data_size > NCR_CIPHER_MAX_KEY_LEN) { + if (data_size > NCR_CIPHER_MAX_KEY_LEN) { err(); ret = -EINVAL; goto fail; } - ret = ncr_data_item_getd(ditem, item->key.secret.data, ditem->data_size, item->flags); + ret = ncr_data_item_getd(ditem, item->key.secret.data, data_size, item->flags); if (ret < 0) { err(); goto fail; } - item->key.secret.size = ditem->data_size; + item->key.secret.size = data_size; break; case NCR_KEY_TYPE_PRIVATE: case NCR_KEY_TYPE_PUBLIC: - tmp = kmalloc(ditem->data_size, GFP_KERNEL); + tmp = kmalloc(data_size, GFP_KERNEL); if (tmp == NULL) { err(); return -ENOMEM; } - ret = ncr_data_item_getd(ditem, tmp, ditem->data_size, item->flags); + ret = ncr_data_item_getd(ditem, tmp, data_size, item->flags); if (ret < 0) { err(); goto fail; } - ret = ncr_pk_unpack( item, tmp, ditem->data_size); + ret = ncr_pk_unpack( item, tmp, data_size); if (ret < 0) { err(); goto fail; |