fix up lots of stuff related to the forwarding of v4 tickets.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4223 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -102,6 +102,7 @@ static KTEXT_ST auth;
|
|||||||
static char name[ANAME_SZ];
|
static char name[ANAME_SZ];
|
||||||
static AUTH_DAT adat;
|
static AUTH_DAT adat;
|
||||||
static des_cblock session_key;
|
static des_cblock session_key;
|
||||||
|
static des_cblock cred_session;
|
||||||
static des_key_schedule sched;
|
static des_key_schedule sched;
|
||||||
static des_cblock challenge;
|
static des_cblock challenge;
|
||||||
static int auth_done; /* XXX */
|
static int auth_done; /* XXX */
|
||||||
@@ -218,6 +219,7 @@ kerberos4_send(char *name, Authenticator *ap)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
des_key_sched(&cred.session, sched);
|
des_key_sched(&cred.session, sched);
|
||||||
|
memcpy (&cred_session, &cred.session, sizeof(cred_session));
|
||||||
des_init_random_number_generator(&cred.session);
|
des_init_random_number_generator(&cred.session);
|
||||||
des_new_random_key(&session_key);
|
des_new_random_key(&session_key);
|
||||||
des_ecb_encrypt(&session_key, &session_key, sched, 0);
|
des_ecb_encrypt(&session_key, &session_key, sched, 0);
|
||||||
@@ -387,6 +389,7 @@ kerberos4_is(Authenticator *ap, unsigned char *data, int cnt)
|
|||||||
if(cnt > sizeof(cred))
|
if(cnt > sizeof(cred))
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
|
memcpy (session_key, adat.session, sizeof(session_key));
|
||||||
des_set_key(&session_key, ks);
|
des_set_key(&session_key, ks);
|
||||||
des_pcbc_encrypt((void*)data, (void*)netcred, cnt,
|
des_pcbc_encrypt((void*)data, (void*)netcred, cnt,
|
||||||
ks, &session_key, DES_DECRYPT);
|
ks, &session_key, DES_DECRYPT);
|
||||||
@@ -465,7 +468,7 @@ kerberos4_reply(Authenticator *ap, unsigned char *data, int cnt)
|
|||||||
skey.data = session_key;
|
skey.data = session_key;
|
||||||
encrypt_session_key(&skey, 0);
|
encrypt_session_key(&skey, 0);
|
||||||
#if 0
|
#if 0
|
||||||
kerberos4_forward(ap);
|
kerberos4_forward(ap, &cred_session);
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -605,16 +608,25 @@ pack_cred(CREDENTIALS *cred, unsigned char *buf)
|
|||||||
{
|
{
|
||||||
unsigned char *p = buf;
|
unsigned char *p = buf;
|
||||||
|
|
||||||
p += krb_put_nir(cred->service, cred->instance, cred->realm, p);
|
memcpy (p, cred->service, ANAME_SZ);
|
||||||
|
p += ANAME_SZ;
|
||||||
|
memcpy (p, cred->instance, INST_SZ);
|
||||||
|
p += INST_SZ;
|
||||||
|
memcpy (p, cred->realm, REALM_SZ);
|
||||||
|
p += REALM_SZ;
|
||||||
memcpy(p, cred->session, 8);
|
memcpy(p, cred->session, 8);
|
||||||
p += 8;
|
p += 8;
|
||||||
*p++ = cred->lifetime;
|
p += krb_put_int(cred->lifetime, p, 4);
|
||||||
*p++ = cred->kvno;
|
p += krb_put_int(cred->kvno, p, 4);
|
||||||
p += krb_put_int(cred->ticket_st.length, p, 4);
|
p += krb_put_int(cred->ticket_st.length, p, 4);
|
||||||
memcpy(p, cred->ticket_st.dat, cred->ticket_st.length);
|
memcpy(p, cred->ticket_st.dat, cred->ticket_st.length);
|
||||||
p += cred->ticket_st.length;
|
p += cred->ticket_st.length;
|
||||||
|
p += krb_put_int(0, p, 4);
|
||||||
p += krb_put_int(cred->issue_date, p, 4);
|
p += krb_put_int(cred->issue_date, p, 4);
|
||||||
p += krb_put_nir(cred->pname, cred->pinst, NULL, p);
|
memcpy (p, cred->pname, ANAME_SZ);
|
||||||
|
p += ANAME_SZ;
|
||||||
|
memcpy (p, cred->pinst, INST_SZ);
|
||||||
|
p += INST_SZ;
|
||||||
return p - buf;
|
return p - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -622,23 +634,44 @@ static int
|
|||||||
unpack_cred(unsigned char *buf, int len, CREDENTIALS *cred)
|
unpack_cred(unsigned char *buf, int len, CREDENTIALS *cred)
|
||||||
{
|
{
|
||||||
unsigned char *p = buf;
|
unsigned char *p = buf;
|
||||||
|
u_int32_t tmp;
|
||||||
|
|
||||||
|
strncpy (cred->service, p, ANAME_SZ);
|
||||||
|
cred->service[ANAME_SZ] = '\0';
|
||||||
|
p += ANAME_SZ;
|
||||||
|
strncpy (cred->instance, p, INST_SZ);
|
||||||
|
cred->instance[INST_SZ] = '\0';
|
||||||
|
p += INST_SZ;
|
||||||
|
strncpy (cred->realm, p, REALM_SZ);
|
||||||
|
cred->realm[REALM_SZ] = '\0';
|
||||||
|
p += REALM_SZ;
|
||||||
|
|
||||||
p += krb_get_nir(p, cred->service, cred->instance, cred->realm);
|
|
||||||
memcpy(cred->session, p, 8);
|
memcpy(cred->session, p, 8);
|
||||||
p += 8;
|
p += 8;
|
||||||
cred->lifetime = *p++;
|
p += krb_get_int(p, &tmp, 4, 0);
|
||||||
cred->kvno = *p++;
|
cred->lifetime = tmp;
|
||||||
|
p += krb_get_int(p, &tmp, 4, 0);
|
||||||
|
cred->kvno = tmp;
|
||||||
|
|
||||||
p += krb_get_int(p, &cred->ticket_st.length, 4, 0);
|
p += krb_get_int(p, &cred->ticket_st.length, 4, 0);
|
||||||
memcpy(cred->ticket_st.dat, p, cred->ticket_st.length);
|
memcpy(cred->ticket_st.dat, p, cred->ticket_st.length);
|
||||||
|
p += cred->ticket_st.length;
|
||||||
|
p += krb_get_int(p, &tmp, 4, 0);
|
||||||
cred->ticket_st.mbz = 0;
|
cred->ticket_st.mbz = 0;
|
||||||
p += krb_get_int(p, (u_int32_t *)&cred->issue_date, 4, 0);
|
p += krb_get_int(p, (u_int32_t *)&cred->issue_date, 4, 0);
|
||||||
p += krb_get_nir(p, cred->pname, cred->pinst, NULL);
|
|
||||||
|
strncpy (cred->pname, p, ANAME_SZ);
|
||||||
|
cred->pname[ANAME_SZ] = '\0';
|
||||||
|
p += ANAME_SZ;
|
||||||
|
strncpy (cred->pinst, p, ANAME_SZ);
|
||||||
|
cred->pinst[ANAME_SZ] = '\0';
|
||||||
|
p += ANAME_SZ;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
kerberos4_forward(Authenticator *ap)
|
kerberos4_forward(Authenticator *ap, des_cblock *key)
|
||||||
{
|
{
|
||||||
CREDENTIALS cred;
|
CREDENTIALS cred;
|
||||||
char *realm;
|
char *realm;
|
||||||
@@ -657,10 +690,10 @@ kerberos4_forward(Authenticator *ap)
|
|||||||
&cred);
|
&cred);
|
||||||
if(ret)
|
if(ret)
|
||||||
return ret;
|
return ret;
|
||||||
des_set_key(&session_key, ks);
|
des_set_key(key, ks);
|
||||||
len = pack_cred(&cred, netcred);
|
len = pack_cred(&cred, netcred);
|
||||||
des_pcbc_encrypt((void*)netcred, (void*)netcred, len,
|
des_pcbc_encrypt((void*)netcred, (void*)netcred, len,
|
||||||
ks, &session_key, DES_ENCRYPT);
|
ks, key, DES_ENCRYPT);
|
||||||
memset(ks, 0, sizeof(ks));
|
memset(ks, 0, sizeof(ks));
|
||||||
Data(ap, KRB_FORWARD, netcred, len);
|
Data(ap, KRB_FORWARD, netcred, len);
|
||||||
memset(netcred, 0, sizeof(netcred));
|
memset(netcred, 0, sizeof(netcred));
|
||||||
|
Reference in New Issue
Block a user