#include "k5-int.h"
static krb5_error_code krb5_principal2salt_internal
(krb5_context, krb5_const_principal, krb5_data *ret, int);
static krb5_error_code
krb5_principal2salt_internal(krb5_context context, register krb5_const_principal pr, krb5_data *ret, int use_realm)
{
unsigned int size = 0, offset=0;
krb5_int32 nelem;
register int i;
if (pr == 0) {
ret->length = 0;
ret->data = 0;
return 0;
}
nelem = krb5_princ_size(context, pr);
if (use_realm)
size += krb5_princ_realm(context, pr)->length;
for (i = 0; i < (int) nelem; i++)
size += krb5_princ_component(context, pr, i)->length;
ret->length = size;
if (!(ret->data = malloc (size)))
return ENOMEM;
if (use_realm) {
offset = krb5_princ_realm(context, pr)->length;
memcpy(ret->data, krb5_princ_realm(context, pr)->data, offset);
}
for (i = 0; i < (int) nelem; i++) {
memcpy(&ret->data[offset], krb5_princ_component(context, pr, i)->data,
krb5_princ_component(context, pr, i)->length);
offset += krb5_princ_component(context, pr, i)->length;
}
return 0;
}
krb5_error_code
krb5_principal2salt(krb5_context context, register krb5_const_principal pr, krb5_data *ret)
{
return krb5_principal2salt_internal(context, pr, ret, 1);
}
krb5_error_code
krb5_principal2salt_norealm(krb5_context context, register krb5_const_principal pr, krb5_data *ret)
{
return krb5_principal2salt_internal(context, pr, ret, 0);
}