Skip to content

Commit

Permalink
* kdc_util.c (kdc_get_server_key): Fix to not use cached tgs key
Browse files Browse the repository at this point in the history
	to prevent lossage when it might be out of date by always fetching
	the correct kvno for the ticket out of the database.


git-svn-id: svn://anonsvn.mit.edu/krb5/branches/tlyu-3des-k4@10920 dc483132-0cff-0310-8789-dd5450dbe970
  • Loading branch information
tlyu committed Sep 17, 1998
1 parent 949eb46 commit cc93561
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 56 deletions.
6 changes: 6 additions & 0 deletions src/kdc/ChangeLog
@@ -1,3 +1,9 @@
Thu Sep 17 18:21:51 1998 Tom Yu <tlyu@mit.edu>

* kdc_util.c (kdc_get_server_key): Fix to not use cached tgs key
to prevent lossage when it might be out of date by always fetching
the correct kvno for the ticket out of the database.

Tue Sep 1 19:34:30 1998 Tom Yu <tlyu@mit.edu>

* kerberos_v4.c (compat_decrypt_key): Add
Expand Down
97 changes: 41 additions & 56 deletions src/kdc/kdc_util.c
Expand Up @@ -335,12 +335,15 @@ kdc_process_tgs_req(request, from, pkt, ticket, subkey)
/* XXX This function should no longer be necessary.
* The KDC should take the keytab associated with the realm and pass that to
* the krb5_rd_req_decode(). --proven
*
* It's actually still used by do_tgs_req() for u2u auth, and not too
* much else. -- tlyu
*/
krb5_error_code
kdc_get_server_key(ticket, key, kvno)
krb5_ticket * ticket;
krb5_keyblock ** key;
krb5_kvno * kvno;
krb5_kvno * kvno; /* XXX nothing uses this */
{
krb5_error_code retval;
krb5_db_entry server;
Expand All @@ -349,64 +352,46 @@ kdc_get_server_key(ticket, key, kvno)
krb5_key_data * server_key;
int i;

if (krb5_principal_compare(kdc_context, tgs_server, ticket->server)) {
retval = krb5_copy_keyblock(kdc_context, &tgs_key, key);
*kvno = tgs_kvno;
return retval;
} else {
nprincs = 1;
nprincs = 1;

if ((retval = krb5_db_get_principal(kdc_context, ticket->server,
&server, &nprincs,
&more))) {
return(retval);
}
if (more) {
krb5_db_free_principal(kdc_context, &server, nprincs);
return(KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE);
} else if (nprincs != 1) {
char *sname;

krb5_db_free_principal(kdc_context, &server, nprincs);
if (!krb5_unparse_name(kdc_context, ticket->server, &sname)) {
krb5_klog_syslog(LOG_ERR,"TGS_REQ: UNKNOWN SERVER: server='%s'",
sname);
free(sname);
}
return(KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN);
}
/*
* Get the latest version of the server key_data and
* convert the key into a real key (it may be encrypted in the database)
*
* Search the key list in the order specified by the key/salt list.
*/
server_key = (krb5_key_data *) NULL;
for (i=0; i<kdc_active_realm->realm_nkstypes; i++) {
krb5_key_salt_tuple *kslist;

kslist = (krb5_key_salt_tuple *) kdc_active_realm->realm_kstypes;
if (!krb5_dbe_find_enctype(kdc_context,
&server,
kslist[i].ks_enctype,
-1,
-1,
&server_key))
break;
}
if (!server_key)
return(KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN);

*kvno = server_key->key_data_kvno;
if ((*key = (krb5_keyblock *)malloc(sizeof **key))) {
retval = krb5_dbekd_decrypt_key_data(kdc_context, &master_keyblock,
server_key,
*key, NULL);
} else
retval = ENOMEM;
if ((retval = krb5_db_get_principal(kdc_context, ticket->server,
&server, &nprincs,
&more))) {
return(retval);
}
if (more) {
krb5_db_free_principal(kdc_context, &server, nprincs);
return retval;
return(KRB5KDC_ERR_PRINCIPAL_NOT_UNIQUE);
} else if (nprincs != 1) {
char *sname;

krb5_db_free_principal(kdc_context, &server, nprincs);
if (!krb5_unparse_name(kdc_context, ticket->server, &sname)) {
krb5_klog_syslog(LOG_ERR,"TGS_REQ: UNKNOWN SERVER: server='%s'",
sname);
free(sname);
}
return(KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN);
}
retval = krb5_dbe_find_enctype(kdc_context, &server,
ticket->enc_part.enctype, -1,
ticket->enc_part.kvno, &server_key);
if (retval)
goto errout;
if (!server_key) {
retval = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN;
goto errout;
}
*kvno = server_key->key_data_kvno;
if ((*key = (krb5_keyblock *)malloc(sizeof **key))) {
retval = krb5_dbekd_decrypt_key_data(kdc_context, &master_keyblock,
server_key,
*key, NULL);
} else
retval = ENOMEM;
errout:
krb5_db_free_principal(kdc_context, &server, nprincs);
return retval;
}

/* This probably wants to be updated if you support last_req stuff */
Expand Down

0 comments on commit cc93561

Please sign in to comment.