#include "k5-int.h"
krb5_pa_data *
krb5int_find_pa_data(krb5_context context, krb5_pa_data *const *pa_list,
krb5_preauthtype pa_type)
{
krb5_pa_data *const *pa;
for (pa = pa_list; pa != NULL && *pa != NULL; pa++) {
if ((*pa)->pa_type == pa_type)
return *pa;
}
return NULL;
}
krb5_error_code
k5_alloc_pa_data(krb5_preauthtype pa_type, size_t len, krb5_pa_data **out)
{
krb5_pa_data *pa;
uint8_t *buf = NULL;
*out = NULL;
if (len > 0) {
buf = malloc(len);
if (buf == NULL)
return ENOMEM;
}
pa = malloc(sizeof(*pa));
if (pa == NULL) {
free(buf);
return ENOMEM;
}
pa->magic = KV5M_PA_DATA;
pa->pa_type = pa_type;
pa->length = len;
pa->contents = buf;
*out = pa;
return 0;
}
void
k5_free_pa_data_element(krb5_pa_data *pa)
{
if (pa != NULL) {
free(pa->contents);
free(pa);
}
}
krb5_error_code
k5_add_pa_data_element(krb5_pa_data ***list, krb5_pa_data **pa)
{
size_t count;
krb5_pa_data **newlist;
for (count = 0; *list != NULL && (*list)[count] != NULL; count++);
newlist = realloc(*list, (count + 2) * sizeof(*newlist));
if (newlist == NULL)
return ENOMEM;
newlist[count] = *pa;
newlist[count + 1] = NULL;
*pa = NULL;
*list = newlist;
return 0;
}
krb5_error_code
k5_add_pa_data_from_data(krb5_pa_data ***list, krb5_preauthtype pa_type,
krb5_data *data)
{
krb5_error_code ret;
krb5_pa_data *pa;
ret = k5_alloc_pa_data(pa_type, 0, &pa);
if (ret)
return ret;
pa->contents = (uint8_t *)data->data;
pa->length = data->length;
ret = k5_add_pa_data_element(list, &pa);
if (ret) {
free(pa);
return ret;
}
*data = empty_data();
return 0;
}
krb5_error_code
k5_add_empty_pa_data(krb5_pa_data ***list, krb5_preauthtype pa_type)
{
krb5_data empty = empty_data();
return k5_add_pa_data_from_data(list, pa_type, &empty);
}