krb5_error_code KRB5_CALLCONV krb5_auth_con_getrecvsubkey_k(krb5_context ctx, krb5_auth_context ac, krb5_key *key) { krb5_k_reference_key(ctx, ac->recv_subkey); *key = ac->recv_subkey; return 0; }
krb5_error_code KRB5_CALLCONV krb5_auth_con_getkey_k(krb5_context context, krb5_auth_context auth_context, krb5_key *key) { krb5_k_reference_key(context, auth_context->key); *key = auth_context->key; return 0; }
krb5_error_code KRB5_CALLCONV krb5_auth_con_setrecvsubkey_k(krb5_context ctx, krb5_auth_context ac, krb5_key key) { krb5_k_free_key(ctx, ac->recv_subkey); ac->recv_subkey = key; krb5_k_reference_key(ctx, key); return 0; }
static krb5_key find_cached_dkey(struct derived_key *list, const krb5_data *constant) { for (; list; list = list->next) { if (data_eq(list->constant, *constant)) { krb5_k_reference_key(NULL, list->dkey); return list->dkey; } } return NULL; }
static krb5_error_code add_cached_dkey(krb5_key key, const krb5_data *constant, const krb5_keyblock *dkeyblock, krb5_key *cached_dkey) { krb5_key dkey; krb5_error_code ret; struct derived_key *dkent = NULL; char *data = NULL; /* Allocate fields for the new entry. */ dkent = malloc(sizeof(*dkent)); if (dkent == NULL) goto cleanup; data = malloc(constant->length); if (data == NULL) goto cleanup; ret = krb5_k_create_key(NULL, dkeyblock, &dkey); if (ret != 0) goto cleanup; /* Add the new entry to the list. */ memcpy(data, constant->data, constant->length); dkent->dkey = dkey; dkent->constant.data = data; dkent->constant.length = constant->length; dkent->next = key->derived; key->derived = dkent; /* Return a "copy" of the cached key. */ krb5_k_reference_key(NULL, dkey); *cached_dkey = dkey; return 0; cleanup: free(dkent); free(data); return ENOMEM; }