diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-27 16:43:11 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-27 16:43:11 +0200 |
commit | 9a2369d426b23f77884b01666370140d10b41c19 (patch) | |
tree | 075830ece81547905f07cf77a68fa4071bab1ef9 /ncr-key.c | |
parent | 3e9e7a872a76e085499b15089e16ad8c3a2d68fd (diff) | |
download | cryptodev-linux-9a2369d426b23f77884b01666370140d10b41c19.tar.gz cryptodev-linux-9a2369d426b23f77884b01666370140d10b41c19.tar.xz cryptodev-linux-9a2369d426b23f77884b01666370140d10b41c19.zip |
Implemented Diffie Hellman Key exchange.
Diffstat (limited to 'ncr-key.c')
-rw-r--r-- | ncr-key.c | 71 |
1 files changed, 64 insertions, 7 deletions
@@ -276,6 +276,7 @@ int ret; goto fail; } } + data.idata_size = item->key.secret.size; break; case NCR_KEY_TYPE_PUBLIC: @@ -346,7 +347,9 @@ size_t tmp_size; err(); return ret; } - + + ncr_key_clear(item); + tmp = kmalloc(data.idata_size, GFP_KERNEL); if (tmp == NULL) { err(); @@ -426,6 +429,9 @@ static void ncr_key_clear(struct key_item_st* item) ncr_pk_clear(item); } memset(&item->key, 0, sizeof(item->key)); + memset(item->key_id, 0, sizeof(item->key_id)); + item->key_id_size = 0; + item->flags = 0; return; } @@ -593,13 +599,64 @@ fail: return ret; } -int ncr_key_derive(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_derive(struct list_sem_st* key_lst, void __user* arg) { - return -EINVAL; -} +struct ncr_key_derivation_params_st data; +int ret; +struct key_item_st* key = NULL; +struct key_item_st* newkey = NULL; -int ncr_key_get_public(struct list_sem_st* lst, void __user* arg) -{ - return -EINVAL; + if (unlikely(copy_from_user(&data, arg, sizeof(data)))) { + err(); + return -EFAULT; + } + + ret = ncr_key_item_get_read( &key, key_lst, data.key); + if (ret < 0) { + err(); + return ret; + } + + ret = ncr_key_item_get_write( &newkey, key_lst, data.newkey); + if (ret < 0) { + err(); + goto fail; + } + + ncr_key_clear(newkey); + + newkey->flags = data.keyflags; + + switch (key->type) { + case NCR_KEY_TYPE_PUBLIC: + case NCR_KEY_TYPE_PRIVATE: + ret = ncr_pk_derive(newkey, key, &data); + if (ret < 0) { + err(); + goto fail; + } + break; + default: + err(); + ret = -EINVAL; + goto fail; + } + + if (unlikely(copy_to_user(arg, &data, sizeof(data)))) { + err(); + ret = -EFAULT; + } else + ret = 0; + +fail: + if (key) + _ncr_key_item_put(key); + if (newkey) + _ncr_key_item_put(newkey); + return ret; + } |