#include <string.h>
#include "krb.h"
#include "port-sockets.h"
#define KRB_SENDAUTH_VERS "AUTHV0.1"
static int
ParseFullName(name, instance, realm, fname)
char *name;
char *instance;
char *realm;
char *fname;
{
int err;
if (!*fname) return KNAME_FMT;
*instance = '\0';
err = kname_parse(name,instance,realm,fname);
if (err) return err;
if (!*name) return KNAME_FMT;
if (!*realm) {
if ((err = krb_get_lrealm (realm, 1)))
return err;
if (!*realm) return KNAME_FMT;
}
return KSUCCESS;
}
static void
CopyTicket(dest, src, numBytes, version, includeVersion)
char *dest;
KTEXT src;
unsigned long *numBytes;
char *version;
int includeVersion;
{
unsigned long tkt_len;
unsigned long nbytes = 0;
if (includeVersion) {
(void) strncpy(dest, KRB_SENDAUTH_VERS, KRB_SENDAUTH_VLEN);
(void) strncpy(dest+KRB_SENDAUTH_VLEN, version, KRB_SENDAUTH_VLEN);
nbytes = 2*KRB_SENDAUTH_VLEN;
}
tkt_len = htonl((unsigned long) src->length);
(void) memcpy((char *)(dest+nbytes), (char *) &tkt_len, sizeof(tkt_len));
nbytes += sizeof(tkt_len);
(void) memcpy ((char *)(dest+nbytes), (char *) src->dat, src->length);
nbytes += src->length;
*numBytes = nbytes;
}
static int
CredIsExpired( cr )
CREDENTIALS *cr;
{
KRB4_32 now;
now = TIME_GMT_UNIXSEC;
return now + 2 * CLOCK_SKEW > krb_life_to_time(cr->issue_date,
cr->lifetime);
}
int KRB5_CALLCONV
krb_get_ticket_for_service (serviceName, buf, buflen, checksum, sessionKey,
schedule, version, includeVersion)
char *serviceName;
char *buf;
unsigned KRB4_32 *buflen;
int checksum;
des_cblock sessionKey;
Key_schedule schedule;
char *version;
int includeVersion;
{
char service[SNAME_SZ];
char instance[INST_SZ];
char realm[REALM_SZ];
int err;
char lrealm[REALM_SZ];
CREDENTIALS cr;
service[0] = '\0';
instance[0] = '\0';
realm[0] = '\0';
err = ParseFullName(service, instance, realm, serviceName);
if (err)
return err;
if ((err = krb_get_tf_realm(TKT_FILE, lrealm)) != KSUCCESS)
return(err);
err = krb_get_cred (KRB_TICKET_GRANTING_TICKET, realm, lrealm, &cr);
if (err)
return err;
err = CredIsExpired(&cr);
if (err)
return RD_AP_EXP;
err = krb_mk_req(&(cr.ticket_st),service,instance,realm,checksum);
if (err)
return err;
CopyTicket(buf, &(cr.ticket_st), buflen, version, includeVersion);
err = krb_get_cred(service,instance,realm,&cr);
if (err)
return err;
memcpy((char *)sessionKey, (char *)cr.session, sizeof(C_Block));
err = key_sched(sessionKey, schedule);
if (err)
return KFAILURE;
else
return KSUCCESS;
}