diff options
Diffstat (limited to 'lib/ncrypto_local.c')
-rw-r--r-- | lib/ncrypto_local.c | 41 |
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); |