diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-12 10:00:41 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-12 10:00:41 +0200 |
commit | f17e200018dcf305f48a975082f10ac840dd77f3 (patch) | |
tree | 2bb116e44fc78d90fec9a8445d507bc9840913fa | |
parent | 4b881d3153d178f83bd8cf7d5d7739a319be80c2 (diff) | |
download | cryptodev-linux-f17e200018dcf305f48a975082f10ac840dd77f3.tar.gz cryptodev-linux-f17e200018dcf305f48a975082f10ac840dd77f3.tar.xz cryptodev-linux-f17e200018dcf305f48a975082f10ac840dd77f3.zip |
Allow import and export of keys.
-rw-r--r-- | ncr-key-storage.c | 8 | ||||
-rw-r--r-- | ncr-key.c | 31 | ||||
-rw-r--r-- | ncr-pk.c | 32 | ||||
-rw-r--r-- | ncr_int.h | 1 |
4 files changed, 60 insertions, 12 deletions
diff --git a/ncr-key-storage.c b/ncr-key-storage.c index bd39a33..2a6055e 100644 --- a/ncr-key-storage.c +++ b/ncr-key-storage.c @@ -85,6 +85,7 @@ fail: int key_from_storage_data(struct key_item_st* key, const void* data, size_t data_size) { const struct packed_key * pkey = data; + int ret; if (data_size != sizeof(*pkey)) { err(); @@ -101,6 +102,13 @@ int key_from_storage_data(struct key_item_st* key, const void* data, size_t data if (key->type == NCR_KEY_TYPE_SECRET) { key->key.secret.size = pkey->raw_size; memcpy(key->key.secret.data, pkey->raw, pkey->raw_size); + } else if (key->type == NCR_KEY_TYPE_PUBLIC + || key->type == NCR_KEY_TYPE_PRIVATE) { + ret = ncr_pk_unpack( key, pkey->raw, pkey->raw_size); + if (ret < 0) { + err(); + return ret; + } } else { err(); return -EINVAL; @@ -272,18 +272,18 @@ int ret; item->flags &= ~NCR_KEY_FLAG_EXPORTABLE; } - switch(item->type) { - case NCR_KEY_TYPE_SECRET: + if (data.key_id_size > MAX_KEY_ID_SIZE) { + err(); + ret = -EINVAL; + goto fail; + } - if (data.key_id_size > MAX_KEY_ID_SIZE) { - err(); - ret = -EINVAL; - goto fail; - } - item->key_id_size = data.key_id_size; - if (data.key_id_size > 0) - memcpy(item->key_id, data.key_id, data.key_id_size); + item->key_id_size = data.key_id_size; + if (data.key_id_size > 0) + memcpy(item->key_id, data.key_id, data.key_id_size); + switch(item->type) { + case NCR_KEY_TYPE_SECRET: if (ditem->data_size > NCR_CIPHER_MAX_KEY_LEN) { err(); @@ -294,8 +294,15 @@ int ret; memcpy(item->key.secret.data, ditem->data, ditem->data_size); item->key.secret.size = ditem->data_size; break; - case NCR_KEY_TYPE_PRIVATE: /* FIXME */ - case NCR_KEY_TYPE_PUBLIC: /* FIXME */ + case NCR_KEY_TYPE_PRIVATE: + case NCR_KEY_TYPE_PUBLIC: + ret = ncr_pk_unpack( item, ditem->data, ditem->data_size); + if (ret < 0) { + err(); + goto fail; + } + break; + default: err(); ret = -EINVAL; @@ -161,6 +161,38 @@ int ncr_pk_pack( const struct key_item_st * key, uint8_t * packed, uint32_t * pa return 0; } +int ncr_pk_unpack( struct key_item_st * key, const void * packed, size_t packed_size) +{ + int cret; + + if (key == NULL || packed == NULL || packed_size == NULL) { + err(); + return -EINVAL; + } + + switch(key->algorithm) { + case NCR_ALG_RSA: + cret = rsa_import(packed, packed_size, (void*)&key->key.pk.rsa); + if (cret != CRYPT_OK) { + err(); + return tomerr(cret); + } + break; + case NCR_ALG_DSA: + cret = dsa_import(packed, packed_size, (void*)&key->key.pk.dsa); + if (cret != CRYPT_OK) { + err(); + return tomerr(cret); + } + break; + default: + err(); + return -EINVAL; + } + + return 0; +} + struct keygen_st { struct work_struct pk_gen; struct completion completed; @@ -187,6 +187,7 @@ int ncr_pk_generate(ncr_algorithm_t algo, struct ncr_key_generate_params_st * params, struct key_item_st* private, struct key_item_st* public); int ncr_pk_pack( const struct key_item_st * key, uint8_t * packed, uint32_t * packed_size); +int ncr_pk_unpack( struct key_item_st * key, const void * packed, size_t packed_size); int ncr_pk_queue_init(void); |