/*
* krb5_k_* functions use opaque key identifiers and should perform
- * better for repeated operations with the same key usage.
+ * better for repeated operations with the same key usage. krb5_keys
+ * are immutable once created.
*/
krb5_error_code KRB5_CALLCONV
krb5_k_create_key(krb5_context context, const krb5_keyblock *key_data,
krb5_key *out);
+/* Since keys are immutable, they can be "copied" by reference count. */
+void KRB5_CALLCONV krb5_k_reference_key(krb5_context context, krb5_key key);
+
+/* Decrement the reference count on a key and free it if it hits zero. */
void KRB5_CALLCONV krb5_k_free_key(krb5_context context, krb5_key key);
krb5_error_code KRB5_CALLCONV
if (code)
goto cleanup;
+ key->refcount = 1;
*out = key;
return 0;
return code;
}
+void KRB5_CALLCONV
+krb5_k_reference_key(krb5_context context, krb5_key key)
+{
+ key->refcount++;
+}
+
/* Free the memory used by a krb5_key. */
void KRB5_CALLCONV
krb5_k_free_key(krb5_context context, krb5_key key)
{
- if (key == NULL)
+ if (key == NULL || --key->refcount > 0)
return;
krb5int_c_free_keyblock_contents(context, &key->keyblock);
}