#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <krb5/krb5.h>
#undef BITS32
#undef xfree
#include <X11/X.h>
#include <X11/Xos.h>
#include <X11/Xmd.h>
#include <X11/Xfuncs.h>
int
XauKrb5Encode(princ, outbuf)
krb5_principal princ;
krb5_data *outbuf;
{
CARD16 i, numparts, totlen = 0, plen, rlen;
char *cp, *pdata;
rlen = krb5_princ_realm(princ)->length;
numparts = krb5_princ_size(princ);
totlen = 2 + rlen + 2;
for (i = 0; i < numparts; i++)
totlen += krb5_princ_component(princ, i)->length + 2;
if ((outbuf->data = (char *)malloc(totlen)) == NULL)
return -1;
cp = outbuf->data;
*cp++ = (char)((int)(0xff00 & rlen) >> 8);
*cp++ = (char)(0x00ff & rlen);
memcpy(cp, krb5_princ_realm(princ)->data, rlen);
cp += rlen;
*cp++ = (char)((int)(0xff00 & numparts) >> 8);
*cp++ = (char)(0x00ff & numparts);
for (i = 0; i < numparts; i++)
{
plen = krb5_princ_component(princ, i)->length;
pdata = krb5_princ_component(princ, i)->data;
*cp++ = (char)((int)(0xff00 & plen) >> 8);
*cp++ = (char)(0x00ff & plen);
memcpy(cp, pdata, plen);
cp += plen;
}
outbuf->length = totlen;
return 0;
}
int
XauKrb5Decode(inbuf, princ)
krb5_data inbuf;
krb5_principal *princ;
{
CARD16 i, numparts, plen, rlen;
CARD8 *cp, *pdata;
if (inbuf.length < 4)
{
return -2;
}
*princ = (krb5_principal)malloc(sizeof (krb5_principal_data));
if (*princ == NULL)
return -1;
bzero(*princ, sizeof (krb5_principal_data));
cp = (CARD8 *)inbuf.data;
rlen = *cp++ << 8;
rlen |= *cp++;
if (inbuf.length < 4 + (int)rlen + 2)
{
krb5_free_principal(*princ);
return -2;
}
krb5_princ_realm(*princ)->data = (char *)malloc(rlen);
if (krb5_princ_realm(*princ)->data == NULL)
{
krb5_free_principal(*princ);
return -1;
}
krb5_princ_realm(*princ)->length = rlen;
memcpy(krb5_princ_realm(*princ)->data, cp, rlen);
cp += rlen;
numparts = *cp++ << 8;
numparts |= *cp++;
krb5_princ_name(*princ) =
(krb5_data *)malloc(numparts * sizeof (krb5_data));
if (krb5_princ_name(*princ) == NULL)
{
krb5_free_principal(*princ);
return -1;
}
krb5_princ_size(*princ) = 0;
for (i = 0; i < numparts; i++)
{
if (cp + 2 > (CARD8 *)inbuf.data + inbuf.length)
{
krb5_free_principal(*princ);
return -2;
}
plen = *cp++ << 8;
plen |= *cp++;
if (cp + plen > (CARD8 *)inbuf.data + inbuf.length)
{
krb5_free_principal(*princ);
return -2;
}
pdata = (CARD8 *)malloc(plen);
if (pdata == NULL)
{
krb5_free_principal(*princ);
return -1;
}
krb5_princ_component(*princ, i)->data = (char *)pdata;
krb5_princ_component(*princ, i)->length = plen;
memcpy(pdata, cp, plen);
cp += plen;
krb5_princ_size(*princ)++;
}
return 0;
}