summaryrefslogtreecommitdiffstats
path: root/lib/ncrypto_local.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ncrypto_local.c')
-rw-r--r--lib/ncrypto_local.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/lib/ncrypto_local.c b/lib/ncrypto_local.c
index 5e0077d..1e88d2a 100644
--- a/lib/ncrypto_local.c
+++ b/lib/ncrypto_local.c
@@ -62,7 +62,7 @@ ncr_get_random_bytes (void *dest, size_t size)
CK_RV
ncr_symm_key_create (struct ncr_symm_key **key, CK_KEY_TYPE type,
- const void *value, size_t value_size)
+ _Bool sensitive, const void *value, size_t value_size)
{
struct ncr_symm_key *k;
@@ -76,6 +76,7 @@ ncr_symm_key_create (struct ncr_symm_key **key, CK_KEY_TYPE type,
return CKR_HOST_MEMORY;
k->type = type;
+ k->sensitive = sensitive;
k->size = value_size;
memcpy (k->value, value, value_size);
*key = k;
@@ -137,7 +138,7 @@ des3_fixup_key (uint8_t value[static 3 * DES_KEY_SIZE])
CK_RV
ncr_symm_key_generate (struct ncr_symm_key **key, CK_MECHANISM_TYPE mech,
- size_t value_size)
+ _Bool sensitive, size_t value_size)
{
struct ncr_symm_key *k;
CK_KEY_TYPE type;
@@ -174,6 +175,7 @@ ncr_symm_key_generate (struct ncr_symm_key **key, CK_MECHANISM_TYPE mech,
return CKR_HOST_MEMORY;
k->type = type;
+ k->sensitive = sensitive;
k->size = value_size;
regenerate:
res = ncr_get_random_bytes (k->value, value_size);
@@ -194,6 +196,41 @@ ncr_symm_key_generate (struct ncr_symm_key **key, CK_MECHANISM_TYPE mech,
}
CK_RV
+ncr_symm_key_set_sensitive (struct ncr_symm_key *key)
+{
+ g_return_val_if_fail (key != NULL, CKR_KEY_HANDLE_INVALID);
+ key->sensitive = true;
+ return CKR_OK;
+}
+
+CK_RV
+ncr_symm_key_export (struct ncr_symm_key *key, void *dest,
+ size_t *dest_size_ptr)
+{
+ g_return_val_if_fail (key != NULL, CKR_KEY_HANDLE_INVALID);
+ g_return_val_if_fail (dest_size_ptr != NULL, CKR_ARGUMENTS_BAD);
+
+ g_return_val_if_fail (!key->sensitive, CKR_ATTRIBUTE_SENSITIVE);
+
+ if (dest == NULL)
+ {
+ *dest_size_ptr = key->size;
+ return CKR_OK;
+ }
+ if (*dest_size_ptr < key->size)
+ {
+ *dest_size_ptr = key->size;
+ return CKR_BUFFER_TOO_SMALL;
+ }
+
+ g_return_val_if_fail (dest != NULL, CKR_ARGUMENTS_BAD);
+
+ memcpy (dest, key->value, key->size);
+ *dest_size_ptr = key->size;
+ return CKR_OK;
+}
+
+CK_RV
ncr_symm_key_destroy (struct ncr_symm_key *key)
{
g_return_val_if_fail (key != NULL, CKR_KEY_HANDLE_INVALID);