summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ncr-key-storage.c8
-rw-r--r--ncr-key.c31
-rw-r--r--ncr-pk.c32
-rw-r--r--ncr_int.h1
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;
diff --git a/ncr-key.c b/ncr-key.c
index 31026ab..20dd6a5 100644
--- a/ncr-key.c
+++ b/ncr-key.c
@@ -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;
diff --git a/ncr-pk.c b/ncr-pk.c
index 6b90571..7d90a2e 100644
--- a/ncr-pk.c
+++ b/ncr-pk.c
@@ -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;
diff --git a/ncr_int.h b/ncr_int.h
index 6d72437..b21f667 100644
--- a/ncr_int.h
+++ b/ncr_int.h
@@ -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);