kill trailing whitespace
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@22733 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
302
kdc/krb5tgs.c
302
kdc/krb5tgs.c
@@ -1,34 +1,34 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997-2008 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997-2008 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
* are met:
|
* are met:
|
||||||
*
|
*
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer.
|
* notice, this list of conditions and the following disclaimer.
|
||||||
*
|
*
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
*
|
*
|
||||||
* 3. Neither the name of the Institute nor the names of its contributors
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
* may be used to endorse or promote products derived from this software
|
* may be used to endorse or promote products derived from this software
|
||||||
* without specific prior written permission.
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kdc_locl.h"
|
#include "kdc_locl.h"
|
||||||
@@ -39,7 +39,7 @@ RCSID("$Id$");
|
|||||||
* return the realm of a krbtgt-ticket or NULL
|
* return the realm of a krbtgt-ticket or NULL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Realm
|
static Realm
|
||||||
get_krbtgt_realm(const PrincipalName *p)
|
get_krbtgt_realm(const PrincipalName *p)
|
||||||
{
|
{
|
||||||
if(p->name_string.len == 2
|
if(p->name_string.len == 2
|
||||||
@@ -168,7 +168,7 @@ _kdc_add_KRB5SignedPath(krb5_context context,
|
|||||||
if (data.length != size)
|
if (data.length != size)
|
||||||
krb5_abortx(context, "internal asn.1 encoder error");
|
krb5_abortx(context, "internal asn.1 encoder error");
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add IF-RELEVANT(KRB5SignedPath) to the last slot in
|
* Add IF-RELEVANT(KRB5SignedPath) to the last slot in
|
||||||
* authorization data field.
|
* authorization data field.
|
||||||
@@ -237,8 +237,8 @@ check_KRB5SignedPath(krb5_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = krb5_verify_checksum(context, crypto, KRB5_KU_KRB5SIGNEDPATH,
|
ret = krb5_verify_checksum(context, crypto, KRB5_KU_KRB5SIGNEDPATH,
|
||||||
data.data, data.length,
|
data.data, data.length,
|
||||||
&sp.cksum);
|
&sp.cksum);
|
||||||
krb5_crypto_destroy(context, crypto);
|
krb5_crypto_destroy(context, crypto);
|
||||||
free(data.data);
|
free(data.data);
|
||||||
@@ -323,7 +323,7 @@ check_PAC(krb5_context context,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = krb5_pac_verify(context, pac, tkt->authtime,
|
ret = krb5_pac_verify(context, pac, tkt->authtime,
|
||||||
client_principal,
|
client_principal,
|
||||||
krbtgt_key, NULL);
|
krbtgt_key, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -331,7 +331,7 @@ check_PAC(krb5_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = _kdc_pac_verify(context, client_principal,
|
ret = _kdc_pac_verify(context, client_principal,
|
||||||
client, server, &pac);
|
client, server, &pac);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
krb5_pac_free(context, pac);
|
krb5_pac_free(context, pac);
|
||||||
@@ -358,7 +358,7 @@ check_PAC(krb5_context context,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
check_tgs_flags(krb5_context context,
|
check_tgs_flags(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
KDC_REQ_BODY *b, const EncTicketPart *tgt, EncTicketPart *et)
|
KDC_REQ_BODY *b, const EncTicketPart *tgt, EncTicketPart *et)
|
||||||
{
|
{
|
||||||
@@ -378,7 +378,7 @@ check_tgs_flags(krb5_context context,
|
|||||||
/* XXX tkt = tgt */
|
/* XXX tkt = tgt */
|
||||||
et->flags.invalid = 0;
|
et->flags.invalid = 0;
|
||||||
}else if(tgt->flags.invalid){
|
}else if(tgt->flags.invalid){
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Ticket-granting ticket has INVALID flag set");
|
"Ticket-granting ticket has INVALID flag set");
|
||||||
return KRB5KRB_AP_ERR_TKT_INVALID;
|
return KRB5KRB_AP_ERR_TKT_INVALID;
|
||||||
}
|
}
|
||||||
@@ -472,8 +472,8 @@ check_tgs_flags(krb5_context context,
|
|||||||
et->endtime = *et->starttime + old_life;
|
et->endtime = *et->starttime + old_life;
|
||||||
if (et->renew_till != NULL)
|
if (et->renew_till != NULL)
|
||||||
et->endtime = min(*et->renew_till, et->endtime);
|
et->endtime = min(*et->renew_till, et->endtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* checks for excess flags */
|
/* checks for excess flags */
|
||||||
if(f.request_anonymous && !config->allow_anonymous){
|
if(f.request_anonymous && !config->allow_anonymous){
|
||||||
@@ -490,7 +490,7 @@ check_tgs_flags(krb5_context context,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
check_constrained_delegation(krb5_context context,
|
check_constrained_delegation(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
hdb_entry_ex *client,
|
hdb_entry_ex *client,
|
||||||
krb5_const_principal server)
|
krb5_const_principal server)
|
||||||
@@ -521,7 +521,7 @@ check_constrained_delegation(krb5_context context,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
verify_flags (krb5_context context,
|
verify_flags (krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
const EncTicketPart *et,
|
const EncTicketPart *et,
|
||||||
const char *pstr)
|
const char *pstr)
|
||||||
@@ -542,13 +542,13 @@ verify_flags (krb5_context context,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
fix_transited_encoding(krb5_context context,
|
fix_transited_encoding(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
krb5_boolean check_policy,
|
krb5_boolean check_policy,
|
||||||
const TransitedEncoding *tr,
|
const TransitedEncoding *tr,
|
||||||
EncTicketPart *et,
|
EncTicketPart *et,
|
||||||
const char *client_realm,
|
const char *client_realm,
|
||||||
const char *server_realm,
|
const char *server_realm,
|
||||||
const char *tgt_realm)
|
const char *tgt_realm)
|
||||||
{
|
{
|
||||||
krb5_error_code ret = 0;
|
krb5_error_code ret = 0;
|
||||||
@@ -575,9 +575,9 @@ fix_transited_encoding(krb5_context context,
|
|||||||
return KRB5KDC_ERR_TRTYPE_NOSUPP;
|
return KRB5KDC_ERR_TRTYPE_NOSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_domain_x500_decode(context,
|
ret = krb5_domain_x500_decode(context,
|
||||||
tr->contents,
|
tr->contents,
|
||||||
&realms,
|
&realms,
|
||||||
&num_realms,
|
&num_realms,
|
||||||
client_realm,
|
client_realm,
|
||||||
server_realm);
|
server_realm);
|
||||||
@@ -606,7 +606,7 @@ fix_transited_encoding(krb5_context context,
|
|||||||
num_realms++;
|
num_realms++;
|
||||||
}
|
}
|
||||||
if(num_realms == 0) {
|
if(num_realms == 0) {
|
||||||
if(strcmp(client_realm, server_realm))
|
if(strcmp(client_realm, server_realm))
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"cross-realm %s -> %s", client_realm, server_realm);
|
"cross-realm %s -> %s", client_realm, server_realm);
|
||||||
} else {
|
} else {
|
||||||
@@ -629,11 +629,11 @@ fix_transited_encoding(krb5_context context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(check_policy) {
|
if(check_policy) {
|
||||||
ret = krb5_check_transited(context, client_realm,
|
ret = krb5_check_transited(context, client_realm,
|
||||||
server_realm,
|
server_realm,
|
||||||
realms, num_realms, NULL);
|
realms, num_realms, NULL);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
krb5_warn(context, ret, "cross-realm %s -> %s",
|
krb5_warn(context, ret, "cross-realm %s -> %s",
|
||||||
client_realm, server_realm);
|
client_realm, server_realm);
|
||||||
goto free_realms;
|
goto free_realms;
|
||||||
}
|
}
|
||||||
@@ -652,19 +652,19 @@ fix_transited_encoding(krb5_context context,
|
|||||||
|
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
tgs_make_reply(krb5_context context,
|
tgs_make_reply(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
KDC_REQ_BODY *b,
|
KDC_REQ_BODY *b,
|
||||||
krb5_const_principal tgt_name,
|
krb5_const_principal tgt_name,
|
||||||
const EncTicketPart *tgt,
|
const EncTicketPart *tgt,
|
||||||
const EncryptionKey *serverkey,
|
const EncryptionKey *serverkey,
|
||||||
const krb5_keyblock *sessionkey,
|
const krb5_keyblock *sessionkey,
|
||||||
krb5_kvno kvno,
|
krb5_kvno kvno,
|
||||||
AuthorizationData *auth_data,
|
AuthorizationData *auth_data,
|
||||||
hdb_entry_ex *server,
|
hdb_entry_ex *server,
|
||||||
const char *server_name,
|
const char *server_name,
|
||||||
hdb_entry_ex *client,
|
hdb_entry_ex *client,
|
||||||
krb5_principal client_principal,
|
krb5_principal client_principal,
|
||||||
hdb_entry_ex *krbtgt,
|
hdb_entry_ex *krbtgt,
|
||||||
krb5_enctype krbtgt_etype,
|
krb5_enctype krbtgt_etype,
|
||||||
KRB5SignedPathPrincipals *spp,
|
KRB5SignedPathPrincipals *spp,
|
||||||
@@ -677,11 +677,11 @@ tgs_make_reply(krb5_context context,
|
|||||||
EncTicketPart et;
|
EncTicketPart et;
|
||||||
KDCOptions f = b->kdc_options;
|
KDCOptions f = b->kdc_options;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
|
|
||||||
memset(&rep, 0, sizeof(rep));
|
memset(&rep, 0, sizeof(rep));
|
||||||
memset(&et, 0, sizeof(et));
|
memset(&et, 0, sizeof(et));
|
||||||
memset(&ek, 0, sizeof(ek));
|
memset(&ek, 0, sizeof(ek));
|
||||||
|
|
||||||
rep.pvno = 5;
|
rep.pvno = 5;
|
||||||
rep.msg_type = krb_tgs_rep;
|
rep.msg_type = krb_tgs_rep;
|
||||||
|
|
||||||
@@ -690,7 +690,7 @@ tgs_make_reply(krb5_context context,
|
|||||||
et.endtime = min(tgt->endtime, *b->till);
|
et.endtime = min(tgt->endtime, *b->till);
|
||||||
ALLOC(et.starttime);
|
ALLOC(et.starttime);
|
||||||
*et.starttime = kdc_time;
|
*et.starttime = kdc_time;
|
||||||
|
|
||||||
ret = check_tgs_flags(context, config, b, tgt, &et);
|
ret = check_tgs_flags(context, config, b, tgt, &et);
|
||||||
if(ret)
|
if(ret)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -714,11 +714,11 @@ tgs_make_reply(krb5_context context,
|
|||||||
#define PRINCIPAL_FORCE_TRANSITED_CHECK(P) 0
|
#define PRINCIPAL_FORCE_TRANSITED_CHECK(P) 0
|
||||||
#define PRINCIPAL_ALLOW_DISABLE_TRANSITED_CHECK(P) 0
|
#define PRINCIPAL_ALLOW_DISABLE_TRANSITED_CHECK(P) 0
|
||||||
|
|
||||||
ret = fix_transited_encoding(context, config,
|
ret = fix_transited_encoding(context, config,
|
||||||
!f.disable_transited_check ||
|
!f.disable_transited_check ||
|
||||||
GLOBAL_FORCE_TRANSITED_CHECK ||
|
GLOBAL_FORCE_TRANSITED_CHECK ||
|
||||||
PRINCIPAL_FORCE_TRANSITED_CHECK(server) ||
|
PRINCIPAL_FORCE_TRANSITED_CHECK(server) ||
|
||||||
!((GLOBAL_ALLOW_PER_PRINCIPAL &&
|
!((GLOBAL_ALLOW_PER_PRINCIPAL &&
|
||||||
PRINCIPAL_ALLOW_DISABLE_TRANSITED_CHECK(server)) ||
|
PRINCIPAL_ALLOW_DISABLE_TRANSITED_CHECK(server)) ||
|
||||||
GLOBAL_ALLOW_DISABLE_TRANSITED_CHECK),
|
GLOBAL_ALLOW_DISABLE_TRANSITED_CHECK),
|
||||||
&tgt->transited, &et,
|
&tgt->transited, &et,
|
||||||
@@ -728,7 +728,7 @@ tgs_make_reply(krb5_context context,
|
|||||||
if(ret)
|
if(ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
copy_Realm(krb5_princ_realm(context, server->entry.principal),
|
copy_Realm(krb5_princ_realm(context, server->entry.principal),
|
||||||
&rep.ticket.realm);
|
&rep.ticket.realm);
|
||||||
_krb5_principal2principalname(&rep.ticket.sname, server->entry.principal);
|
_krb5_principal2principalname(&rep.ticket.sname, server->entry.principal);
|
||||||
copy_Realm(&tgt_name->realm, &rep.crealm);
|
copy_Realm(&tgt_name->realm, &rep.crealm);
|
||||||
@@ -753,7 +753,7 @@ tgs_make_reply(krb5_context context,
|
|||||||
life = min(life, *server->entry.max_life);
|
life = min(life, *server->entry.max_life);
|
||||||
et.endtime = *et.starttime + life;
|
et.endtime = *et.starttime + life;
|
||||||
}
|
}
|
||||||
if(f.renewable_ok && tgt->flags.renewable &&
|
if(f.renewable_ok && tgt->flags.renewable &&
|
||||||
et.renew_till == NULL && et.endtime < *b->till){
|
et.renew_till == NULL && et.endtime < *b->till){
|
||||||
et.flags.renewable = 1;
|
et.flags.renewable = 1;
|
||||||
ALLOC(et.renew_till);
|
ALLOC(et.renew_till);
|
||||||
@@ -768,13 +768,13 @@ tgs_make_reply(krb5_context context,
|
|||||||
renew = min(renew, *server->entry.max_renew);
|
renew = min(renew, *server->entry.max_renew);
|
||||||
*et.renew_till = et.authtime + renew;
|
*et.renew_till = et.authtime + renew;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(et.renew_till){
|
if(et.renew_till){
|
||||||
*et.renew_till = min(*et.renew_till, *tgt->renew_till);
|
*et.renew_till = min(*et.renew_till, *tgt->renew_till);
|
||||||
*et.starttime = min(*et.starttime, *et.renew_till);
|
*et.starttime = min(*et.starttime, *et.renew_till);
|
||||||
et.endtime = min(et.endtime, *et.renew_till);
|
et.endtime = min(et.endtime, *et.renew_till);
|
||||||
}
|
}
|
||||||
|
|
||||||
*et.starttime = min(*et.starttime, et.endtime);
|
*et.starttime = min(*et.starttime, et.endtime);
|
||||||
|
|
||||||
if(*et.starttime == et.endtime){
|
if(*et.starttime == et.endtime){
|
||||||
@@ -786,12 +786,12 @@ tgs_make_reply(krb5_context context,
|
|||||||
et.renew_till = NULL;
|
et.renew_till = NULL;
|
||||||
et.flags.renewable = 0;
|
et.flags.renewable = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
et.flags.pre_authent = tgt->flags.pre_authent;
|
et.flags.pre_authent = tgt->flags.pre_authent;
|
||||||
et.flags.hw_authent = tgt->flags.hw_authent;
|
et.flags.hw_authent = tgt->flags.hw_authent;
|
||||||
et.flags.anonymous = tgt->flags.anonymous;
|
et.flags.anonymous = tgt->flags.anonymous;
|
||||||
et.flags.ok_as_delegate = server->entry.flags.ok_as_delegate;
|
et.flags.ok_as_delegate = server->entry.flags.ok_as_delegate;
|
||||||
|
|
||||||
if (auth_data) {
|
if (auth_data) {
|
||||||
/* XXX Check enc-authorization-data */
|
/* XXX Check enc-authorization-data */
|
||||||
et.authorization_data = calloc(1, sizeof(*et.authorization_data));
|
et.authorization_data = calloc(1, sizeof(*et.authorization_data));
|
||||||
@@ -835,7 +835,7 @@ tgs_make_reply(krb5_context context,
|
|||||||
goto out;
|
goto out;
|
||||||
et.crealm = tgt->crealm;
|
et.crealm = tgt->crealm;
|
||||||
et.cname = tgt_name->name;
|
et.cname = tgt_name->name;
|
||||||
|
|
||||||
ek.key = et.key;
|
ek.key = et.key;
|
||||||
/* MIT must have at least one last_req */
|
/* MIT must have at least one last_req */
|
||||||
ek.last_req.len = 1;
|
ek.last_req.len = 1;
|
||||||
@@ -852,8 +852,8 @@ tgs_make_reply(krb5_context context,
|
|||||||
ek.renew_till = et.renew_till;
|
ek.renew_till = et.renew_till;
|
||||||
ek.srealm = rep.ticket.realm;
|
ek.srealm = rep.ticket.realm;
|
||||||
ek.sname = rep.ticket.sname;
|
ek.sname = rep.ticket.sname;
|
||||||
|
|
||||||
_kdc_log_timestamp(context, config, "TGS-REQ", et.authtime, et.starttime,
|
_kdc_log_timestamp(context, config, "TGS-REQ", et.authtime, et.starttime,
|
||||||
et.endtime, et.renew_till);
|
et.endtime, et.renew_till);
|
||||||
|
|
||||||
/* Don't sign cross realm tickets, they can't be checked anyway */
|
/* Don't sign cross realm tickets, they can't be checked anyway */
|
||||||
@@ -883,9 +883,9 @@ tgs_make_reply(krb5_context context,
|
|||||||
CAST session key. Should the DES3 etype be added to the
|
CAST session key. Should the DES3 etype be added to the
|
||||||
etype list, even if we don't want a session key with
|
etype list, even if we don't want a session key with
|
||||||
DES3? */
|
DES3? */
|
||||||
ret = _kdc_encode_reply(context, config,
|
ret = _kdc_encode_reply(context, config,
|
||||||
&rep, &et, &ek, et.key.keytype,
|
&rep, &et, &ek, et.key.keytype,
|
||||||
kvno,
|
kvno,
|
||||||
serverkey, 0, &tgt->key, e_text, reply);
|
serverkey, 0, &tgt->key, e_text, reply);
|
||||||
out:
|
out:
|
||||||
free_TGS_REP(&rep);
|
free_TGS_REP(&rep);
|
||||||
@@ -905,10 +905,10 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
tgs_check_authenticator(krb5_context context,
|
tgs_check_authenticator(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
krb5_auth_context ac,
|
krb5_auth_context ac,
|
||||||
KDC_REQ_BODY *b,
|
KDC_REQ_BODY *b,
|
||||||
const char **e_text,
|
const char **e_text,
|
||||||
krb5_keyblock *key)
|
krb5_keyblock *key)
|
||||||
{
|
{
|
||||||
@@ -918,7 +918,7 @@ tgs_check_authenticator(krb5_context context,
|
|||||||
size_t buf_size;
|
size_t buf_size;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_crypto crypto;
|
krb5_crypto crypto;
|
||||||
|
|
||||||
krb5_auth_con_getauthenticator(context, ac, &auth);
|
krb5_auth_con_getauthenticator(context, ac, &auth);
|
||||||
if(auth->cksum == NULL){
|
if(auth->cksum == NULL){
|
||||||
kdc_log(context, config, 0, "No authenticator in request");
|
kdc_log(context, config, 0, "No authenticator in request");
|
||||||
@@ -935,7 +935,7 @@ tgs_check_authenticator(krb5_context context,
|
|||||||
||
|
||
|
||||||
#endif
|
#endif
|
||||||
!krb5_checksum_is_collision_proof(context, auth->cksum->cksumtype)) {
|
!krb5_checksum_is_collision_proof(context, auth->cksum->cksumtype)) {
|
||||||
kdc_log(context, config, 0, "Bad checksum type in authenticator: %d",
|
kdc_log(context, config, 0, "Bad checksum type in authenticator: %d",
|
||||||
auth->cksum->cksumtype);
|
auth->cksum->cksumtype);
|
||||||
ret = KRB5KRB_AP_ERR_INAPP_CKSUM;
|
ret = KRB5KRB_AP_ERR_INAPP_CKSUM;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -944,7 +944,7 @@ tgs_check_authenticator(krb5_context context,
|
|||||||
/* XXX should not re-encode this */
|
/* XXX should not re-encode this */
|
||||||
ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, buf_size, b, &len, ret);
|
ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, buf_size, b, &len, ret);
|
||||||
if(ret){
|
if(ret){
|
||||||
kdc_log(context, config, 0, "Failed to encode KDC-REQ-BODY: %s",
|
kdc_log(context, config, 0, "Failed to encode KDC-REQ-BODY: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -965,14 +965,14 @@ tgs_check_authenticator(krb5_context context,
|
|||||||
ret = krb5_verify_checksum(context,
|
ret = krb5_verify_checksum(context,
|
||||||
crypto,
|
crypto,
|
||||||
KRB5_KU_TGS_REQ_AUTH_CKSUM,
|
KRB5_KU_TGS_REQ_AUTH_CKSUM,
|
||||||
buf,
|
buf,
|
||||||
len,
|
len,
|
||||||
auth->cksum);
|
auth->cksum);
|
||||||
free(buf);
|
free(buf);
|
||||||
krb5_crypto_destroy(context, crypto);
|
krb5_crypto_destroy(context, crypto);
|
||||||
if(ret){
|
if(ret){
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Failed to verify authenticator checksum: %s",
|
"Failed to verify authenticator checksum: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
@@ -990,13 +990,13 @@ find_rpath(krb5_context context, Realm crealm, Realm srealm)
|
|||||||
{
|
{
|
||||||
const char *new_realm = krb5_config_get_string(context,
|
const char *new_realm = krb5_config_get_string(context,
|
||||||
NULL,
|
NULL,
|
||||||
"capaths",
|
"capaths",
|
||||||
crealm,
|
crealm,
|
||||||
srealm,
|
srealm,
|
||||||
NULL);
|
NULL);
|
||||||
return new_realm;
|
return new_realm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static krb5_boolean
|
static krb5_boolean
|
||||||
need_referral(krb5_context context, krb5_kdc_configuration *config,
|
need_referral(krb5_context context, krb5_kdc_configuration *config,
|
||||||
@@ -1007,21 +1007,21 @@ need_referral(krb5_context context, krb5_kdc_configuration *config,
|
|||||||
|
|
||||||
if(!options->canonicalize && server->name.name_type != KRB5_NT_SRV_INST)
|
if(!options->canonicalize && server->name.name_type != KRB5_NT_SRV_INST)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (server->name.name_string.len == 1)
|
if (server->name.name_string.len == 1)
|
||||||
name = server->name.name_string.val[0];
|
name = server->name.name_string.val[0];
|
||||||
if (server->name.name_string.len > 1)
|
if (server->name.name_string.len > 1)
|
||||||
name = server->name.name_string.val[1];
|
name = server->name.name_string.val[1];
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
kdc_log(context, config, 0, "Searching referral for %s", name);
|
kdc_log(context, config, 0, "Searching referral for %s", name);
|
||||||
|
|
||||||
return _krb5_get_host_realm_int(context, name, FALSE, realms) == 0;
|
return _krb5_get_host_realm_int(context, name, FALSE, realms) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
tgs_parse_request(krb5_context context,
|
tgs_parse_request(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
KDC_REQ_BODY *b,
|
KDC_REQ_BODY *b,
|
||||||
const PA_DATA *tgs_req,
|
const PA_DATA *tgs_req,
|
||||||
@@ -1051,7 +1051,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
memset(&ap_req, 0, sizeof(ap_req));
|
memset(&ap_req, 0, sizeof(ap_req));
|
||||||
ret = krb5_decode_ap_req(context, &tgs_req->padata_value, &ap_req);
|
ret = krb5_decode_ap_req(context, &tgs_req->padata_value, &ap_req);
|
||||||
if(ret){
|
if(ret){
|
||||||
kdc_log(context, config, 0, "Failed to decode AP-REQ: %s",
|
kdc_log(context, config, 0, "Failed to decode AP-REQ: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -1062,12 +1062,12 @@ tgs_parse_request(krb5_context context,
|
|||||||
ret = KRB5KDC_ERR_POLICY; /* ? */
|
ret = KRB5KDC_ERR_POLICY; /* ? */
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
_krb5_principalname2krb5_principal(context,
|
_krb5_principalname2krb5_principal(context,
|
||||||
&princ,
|
&princ,
|
||||||
ap_req.ticket.sname,
|
ap_req.ticket.sname,
|
||||||
ap_req.ticket.realm);
|
ap_req.ticket.realm);
|
||||||
|
|
||||||
ret = _kdc_db_fetch(context, config, princ, HDB_F_GET_KRBTGT, NULL, krbtgt);
|
ret = _kdc_db_fetch(context, config, princ, HDB_F_GET_KRBTGT, NULL, krbtgt);
|
||||||
|
|
||||||
if(ret) {
|
if(ret) {
|
||||||
@@ -1084,8 +1084,8 @@ tgs_parse_request(krb5_context context,
|
|||||||
ret = KRB5KRB_AP_ERR_NOT_US;
|
ret = KRB5KRB_AP_ERR_NOT_US;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ap_req.ticket.enc_part.kvno &&
|
if(ap_req.ticket.enc_part.kvno &&
|
||||||
*ap_req.ticket.enc_part.kvno != (*krbtgt)->entry.kvno){
|
*ap_req.ticket.enc_part.kvno != (*krbtgt)->entry.kvno){
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
@@ -1094,7 +1094,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
p = "<unparse_name failed>";
|
p = "<unparse_name failed>";
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Ticket kvno = %d, DB kvno = %d (%s)",
|
"Ticket kvno = %d, DB kvno = %d (%s)",
|
||||||
*ap_req.ticket.enc_part.kvno,
|
*ap_req.ticket.enc_part.kvno,
|
||||||
(*krbtgt)->entry.kvno,
|
(*krbtgt)->entry.kvno,
|
||||||
p);
|
p);
|
||||||
@@ -1106,7 +1106,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
|
|
||||||
*krbtgt_etype = ap_req.ticket.enc_part.etype;
|
*krbtgt_etype = ap_req.ticket.enc_part.etype;
|
||||||
|
|
||||||
ret = hdb_enctype2key(context, &(*krbtgt)->entry,
|
ret = hdb_enctype2key(context, &(*krbtgt)->entry,
|
||||||
ap_req.ticket.enc_part.etype, &tkey);
|
ap_req.ticket.enc_part.etype, &tkey);
|
||||||
if(ret){
|
if(ret){
|
||||||
char *str = NULL, *p = NULL;
|
char *str = NULL, *p = NULL;
|
||||||
@@ -1122,7 +1122,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
ret = KRB5KRB_AP_ERR_BADKEYVER;
|
ret = KRB5KRB_AP_ERR_BADKEYVER;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b->kdc_options.validate)
|
if (b->kdc_options.validate)
|
||||||
verify_ap_req_flags = KRB5_VERIFY_AP_REQ_IGNORE_INVALID;
|
verify_ap_req_flags = KRB5_VERIFY_AP_REQ_IGNORE_INVALID;
|
||||||
else
|
else
|
||||||
@@ -1137,10 +1137,10 @@ tgs_parse_request(krb5_context context,
|
|||||||
&ap_req_options,
|
&ap_req_options,
|
||||||
ticket,
|
ticket,
|
||||||
KRB5_KU_TGS_REQ_AUTH);
|
KRB5_KU_TGS_REQ_AUTH);
|
||||||
|
|
||||||
krb5_free_principal(context, princ);
|
krb5_free_principal(context, princ);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
kdc_log(context, config, 0, "Failed to verify AP-REQ: %s",
|
kdc_log(context, config, 0, "Failed to verify AP-REQ: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -1168,7 +1168,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = tgs_check_authenticator(context, config,
|
ret = tgs_check_authenticator(context, config,
|
||||||
ac, b, e_text, &(*ticket)->ticket.key);
|
ac, b, e_text, &(*ticket)->ticket.key);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
krb5_auth_con_free(context, ac);
|
krb5_auth_con_free(context, ac);
|
||||||
@@ -1185,7 +1185,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
&subkey);
|
&subkey);
|
||||||
if(ret){
|
if(ret){
|
||||||
krb5_auth_con_free(context, ac);
|
krb5_auth_con_free(context, ac);
|
||||||
kdc_log(context, config, 0, "Failed to get remote subkey: %s",
|
kdc_log(context, config, 0, "Failed to get remote subkey: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -1194,7 +1194,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
ret = krb5_auth_con_getkey(context, ac, &subkey);
|
ret = krb5_auth_con_getkey(context, ac, &subkey);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
krb5_auth_con_free(context, ac);
|
krb5_auth_con_free(context, ac);
|
||||||
kdc_log(context, config, 0, "Failed to get session key: %s",
|
kdc_log(context, config, 0, "Failed to get session key: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -1221,7 +1221,7 @@ tgs_parse_request(krb5_context context,
|
|||||||
krb5_crypto_destroy(context, crypto);
|
krb5_crypto_destroy(context, crypto);
|
||||||
if(ret){
|
if(ret){
|
||||||
krb5_auth_con_free(context, ac);
|
krb5_auth_con_free(context, ac);
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Failed to decrypt enc-authorization-data");
|
"Failed to decrypt enc-authorization-data");
|
||||||
ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; /* ? */
|
ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; /* ? */
|
||||||
goto out;
|
goto out;
|
||||||
@@ -1245,10 +1245,10 @@ tgs_parse_request(krb5_context context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
krb5_auth_con_free(context, ac);
|
krb5_auth_con_free(context, ac);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
free_AP_REQ(&ap_req);
|
free_AP_REQ(&ap_req);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1260,7 +1260,7 @@ tgs_build_referral(krb5_context context,
|
|||||||
const PrincipalName *true_principal_name,
|
const PrincipalName *true_principal_name,
|
||||||
const PrincipalName *requested_principal,
|
const PrincipalName *requested_principal,
|
||||||
krb5_data *outdata)
|
krb5_data *outdata)
|
||||||
{
|
{
|
||||||
PA_ServerReferralData ref;
|
PA_ServerReferralData ref;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
EncryptedData ed;
|
EncryptedData ed;
|
||||||
@@ -1278,7 +1278,7 @@ tgs_build_referral(krb5_context context,
|
|||||||
goto eout;
|
goto eout;
|
||||||
}
|
}
|
||||||
if (true_principal_name) {
|
if (true_principal_name) {
|
||||||
ref.true_principal_name =
|
ref.true_principal_name =
|
||||||
malloc(sizeof(ref.true_principal_name));
|
malloc(sizeof(ref.true_principal_name));
|
||||||
if (ref.true_principal_name == NULL)
|
if (ref.true_principal_name == NULL)
|
||||||
goto eout;
|
goto eout;
|
||||||
@@ -1287,17 +1287,17 @@ tgs_build_referral(krb5_context context,
|
|||||||
goto eout;
|
goto eout;
|
||||||
}
|
}
|
||||||
if (requested_principal) {
|
if (requested_principal) {
|
||||||
ref.requested_principal_name =
|
ref.requested_principal_name =
|
||||||
malloc(sizeof(ref.requested_principal_name));
|
malloc(sizeof(ref.requested_principal_name));
|
||||||
if (ref.requested_principal_name == NULL)
|
if (ref.requested_principal_name == NULL)
|
||||||
goto eout;
|
goto eout;
|
||||||
ret = copy_PrincipalName(requested_principal,
|
ret = copy_PrincipalName(requested_principal,
|
||||||
ref.requested_principal_name);
|
ref.requested_principal_name);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto eout;
|
goto eout;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASN1_MALLOC_ENCODE(PA_ServerReferralData,
|
ASN1_MALLOC_ENCODE(PA_ServerReferralData,
|
||||||
data.data, data.length,
|
data.data, data.length,
|
||||||
&ref, &size, ret);
|
&ref, &size, ret);
|
||||||
free_PA_ServerReferralData(&ref);
|
free_PA_ServerReferralData(&ref);
|
||||||
@@ -1314,7 +1314,7 @@ tgs_build_referral(krb5_context context,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ASN1_MALLOC_ENCODE(EncryptedData,
|
ASN1_MALLOC_ENCODE(EncryptedData,
|
||||||
outdata->data, outdata->length,
|
outdata->data, outdata->length,
|
||||||
&ed, &size, ret);
|
&ed, &size, ret);
|
||||||
free_EncryptedData(&ed);
|
free_EncryptedData(&ed);
|
||||||
@@ -1331,9 +1331,9 @@ eout:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
tgs_build_reply(krb5_context context,
|
tgs_build_reply(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
KDC_REQ *req,
|
KDC_REQ *req,
|
||||||
KDC_REQ_BODY *b,
|
KDC_REQ_BODY *b,
|
||||||
hdb_entry_ex *krbtgt,
|
hdb_entry_ex *krbtgt,
|
||||||
krb5_enctype krbtgt_etype,
|
krb5_enctype krbtgt_etype,
|
||||||
@@ -1378,8 +1378,8 @@ tgs_build_reply(krb5_context context,
|
|||||||
hdb_entry_ex *uu;
|
hdb_entry_ex *uu;
|
||||||
krb5_principal p;
|
krb5_principal p;
|
||||||
Key *uukey;
|
Key *uukey;
|
||||||
|
|
||||||
if(b->additional_tickets == NULL ||
|
if(b->additional_tickets == NULL ||
|
||||||
b->additional_tickets->len == 0){
|
b->additional_tickets->len == 0){
|
||||||
ret = KRB5KDC_ERR_BADOPTION; /* ? */
|
ret = KRB5KDC_ERR_BADOPTION; /* ? */
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
@@ -1394,8 +1394,8 @@ tgs_build_reply(krb5_context context,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
_krb5_principalname2krb5_principal(context, &p, t->sname, t->realm);
|
_krb5_principalname2krb5_principal(context, &p, t->sname, t->realm);
|
||||||
ret = _kdc_db_fetch(context, config, p,
|
ret = _kdc_db_fetch(context, config, p,
|
||||||
HDB_F_GET_CLIENT|HDB_F_GET_SERVER,
|
HDB_F_GET_CLIENT|HDB_F_GET_SERVER,
|
||||||
NULL, &uu);
|
NULL, &uu);
|
||||||
krb5_free_principal(context, p);
|
krb5_free_principal(context, p);
|
||||||
if(ret){
|
if(ret){
|
||||||
@@ -1403,7 +1403,7 @@ tgs_build_reply(krb5_context context,
|
|||||||
ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN;
|
ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = hdb_enctype2key(context, &uu->entry,
|
ret = hdb_enctype2key(context, &uu->entry,
|
||||||
t->enc_part.etype, &uukey);
|
t->enc_part.etype, &uukey);
|
||||||
if(ret){
|
if(ret){
|
||||||
_kdc_free_ent(context, uu);
|
_kdc_free_ent(context, uu);
|
||||||
@@ -1436,7 +1436,7 @@ tgs_build_reply(krb5_context context,
|
|||||||
opt_str, sizeof(opt_str));
|
opt_str, sizeof(opt_str));
|
||||||
if(*opt_str)
|
if(*opt_str)
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"TGS-REQ %s from %s for %s [%s]",
|
"TGS-REQ %s from %s for %s [%s]",
|
||||||
cpn, from, spn, opt_str);
|
cpn, from, spn, opt_str);
|
||||||
else
|
else
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
@@ -1459,11 +1459,11 @@ server_lookup:
|
|||||||
new_rlm = find_rpath(context, tgt->crealm, req_rlm);
|
new_rlm = find_rpath(context, tgt->crealm, req_rlm);
|
||||||
if(new_rlm) {
|
if(new_rlm) {
|
||||||
kdc_log(context, config, 5, "krbtgt for realm %s "
|
kdc_log(context, config, 5, "krbtgt for realm %s "
|
||||||
"not found, trying %s",
|
"not found, trying %s",
|
||||||
req_rlm, new_rlm);
|
req_rlm, new_rlm);
|
||||||
krb5_free_principal(context, sp);
|
krb5_free_principal(context, sp);
|
||||||
free(spn);
|
free(spn);
|
||||||
krb5_make_principal(context, &sp, r,
|
krb5_make_principal(context, &sp, r,
|
||||||
KRB5_TGS_NAME, new_rlm, NULL);
|
KRB5_TGS_NAME, new_rlm, NULL);
|
||||||
ret = krb5_unparse_name(context, sp, &spn);
|
ret = krb5_unparse_name(context, sp, &spn);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -1508,7 +1508,7 @@ server_lookup:
|
|||||||
|
|
||||||
ret = _kdc_db_fetch(context, config, cp, HDB_F_GET_CLIENT, NULL, &client);
|
ret = _kdc_db_fetch(context, config, cp, HDB_F_GET_CLIENT, NULL, &client);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
const char *krbtgt_realm;
|
const char *krbtgt_realm;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the client belongs to the same realm as our krbtgt, it
|
* If the client belongs to the same realm as our krbtgt, it
|
||||||
@@ -1516,8 +1516,8 @@ server_lookup:
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
krbtgt_realm =
|
krbtgt_realm =
|
||||||
krb5_principal_get_comp_string(context,
|
krb5_principal_get_comp_string(context,
|
||||||
krbtgt->entry.principal, 1);
|
krbtgt->entry.principal, 1);
|
||||||
|
|
||||||
if(strcmp(krb5_principal_get_realm(context, cp), krbtgt_realm) == 0) {
|
if(strcmp(krb5_principal_get_realm(context, cp), krbtgt_realm) == 0) {
|
||||||
@@ -1533,7 +1533,7 @@ server_lookup:
|
|||||||
|
|
||||||
cross_realm = 1;
|
cross_realm = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Select enctype, return key and kvno.
|
* Select enctype, return key and kvno.
|
||||||
*/
|
*/
|
||||||
@@ -1548,7 +1548,7 @@ server_lookup:
|
|||||||
if (b->etype.val[i] == adtkt.key.keytype)
|
if (b->etype.val[i] == adtkt.key.keytype)
|
||||||
break;
|
break;
|
||||||
if(i == b->etype.len) {
|
if(i == b->etype.len) {
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Addition ticket have not matching etypes", spp);
|
"Addition ticket have not matching etypes", spp);
|
||||||
krb5_clear_error_string(context);
|
krb5_clear_error_string(context);
|
||||||
return KRB5KDC_ERR_ETYPE_NOSUPP;
|
return KRB5KDC_ERR_ETYPE_NOSUPP;
|
||||||
@@ -1557,11 +1557,11 @@ server_lookup:
|
|||||||
kvno = 0;
|
kvno = 0;
|
||||||
} else {
|
} else {
|
||||||
Key *skey;
|
Key *skey;
|
||||||
|
|
||||||
ret = _kdc_find_etype(context, server, b->etype.val, b->etype.len,
|
ret = _kdc_find_etype(context, server, b->etype.val, b->etype.len,
|
||||||
&skey, &etype);
|
&skey, &etype);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Server (%s) has no support for etypes", spp);
|
"Server (%s) has no support for etypes", spp);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1583,10 +1583,10 @@ server_lookup:
|
|||||||
* not the same, it's someone that is using a uni-directional trust
|
* not the same, it's someone that is using a uni-directional trust
|
||||||
* backward.
|
* backward.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (strcmp(krb5_principal_get_realm(context, sp),
|
if (strcmp(krb5_principal_get_realm(context, sp),
|
||||||
krb5_principal_get_comp_string(context,
|
krb5_principal_get_comp_string(context,
|
||||||
krbtgt->entry.principal,
|
krbtgt->entry.principal,
|
||||||
1)) != 0) {
|
1)) != 0) {
|
||||||
char *tpn;
|
char *tpn;
|
||||||
ret = krb5_unparse_name(context, krbtgt->entry.principal, &tpn);
|
ret = krb5_unparse_name(context, krbtgt->entry.principal, &tpn);
|
||||||
@@ -1603,7 +1603,7 @@ server_lookup:
|
|||||||
if (!cross_realm) {
|
if (!cross_realm) {
|
||||||
Key *tkey;
|
Key *tkey;
|
||||||
|
|
||||||
ret = hdb_enctype2key(context, &krbtgt->entry,
|
ret = hdb_enctype2key(context, &krbtgt->entry,
|
||||||
krbtgt_etype, &tkey);
|
krbtgt_etype, &tkey);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
@@ -1611,7 +1611,7 @@ server_lookup:
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = check_PAC(context, config, cp,
|
ret = check_PAC(context, config, cp,
|
||||||
client, server, ekey, &tkey->key,
|
client, server, ekey, &tkey->key,
|
||||||
tgt, &rspac, &signedpath);
|
tgt, &rspac, &signedpath);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -1654,7 +1654,7 @@ server_lookup:
|
|||||||
char *selfcpn = NULL;
|
char *selfcpn = NULL;
|
||||||
const char *str;
|
const char *str;
|
||||||
|
|
||||||
ret = decode_PA_S4U2Self(sdata->padata_value.data,
|
ret = decode_PA_S4U2Self(sdata->padata_value.data,
|
||||||
sdata->padata_value.length,
|
sdata->padata_value.length,
|
||||||
&self, NULL);
|
&self, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -1678,14 +1678,14 @@ server_lookup:
|
|||||||
ret = krb5_verify_checksum(context,
|
ret = krb5_verify_checksum(context,
|
||||||
crypto,
|
crypto,
|
||||||
KRB5_KU_OTHER_CKSUM,
|
KRB5_KU_OTHER_CKSUM,
|
||||||
datack.data,
|
datack.data,
|
||||||
datack.length,
|
datack.length,
|
||||||
&self.cksum);
|
&self.cksum);
|
||||||
krb5_data_free(&datack);
|
krb5_data_free(&datack);
|
||||||
krb5_crypto_destroy(context, crypto);
|
krb5_crypto_destroy(context, crypto);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free_PA_S4U2Self(&self);
|
free_PA_S4U2Self(&self);
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"krb5_verify_checksum failed for S4U2Self: %s",
|
"krb5_verify_checksum failed for S4U2Self: %s",
|
||||||
krb5_get_err_text(context, ret));
|
krb5_get_err_text(context, ret));
|
||||||
goto out;
|
goto out;
|
||||||
@@ -1748,7 +1748,7 @@ server_lookup:
|
|||||||
Ticket *t;
|
Ticket *t;
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Require that the KDC have issued the service's krbtgt (not
|
* Require that the KDC have issued the service's krbtgt (not
|
||||||
* self-issued ticket with kimpersonate(1).
|
* self-issued ticket with kimpersonate(1).
|
||||||
*/
|
*/
|
||||||
@@ -1762,7 +1762,7 @@ server_lookup:
|
|||||||
|
|
||||||
t = &b->additional_tickets->val[0];
|
t = &b->additional_tickets->val[0];
|
||||||
|
|
||||||
ret = hdb_enctype2key(context, &client->entry,
|
ret = hdb_enctype2key(context, &client->entry,
|
||||||
t->enc_part.etype, &clientkey);
|
t->enc_part.etype, &clientkey);
|
||||||
if(ret){
|
if(ret){
|
||||||
ret = KRB5KDC_ERR_ETYPE_NOSUPP; /* XXX */
|
ret = KRB5KDC_ERR_ETYPE_NOSUPP; /* XXX */
|
||||||
@@ -1789,7 +1789,7 @@ server_lookup:
|
|||||||
ret = check_constrained_delegation(context, config, client, sp);
|
ret = check_constrained_delegation(context, config, client, sp);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"constrained delegation from %s to %s not allowed",
|
"constrained delegation from %s to %s not allowed",
|
||||||
spn, cpn);
|
spn, cpn);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -1841,15 +1841,15 @@ server_lookup:
|
|||||||
* Check flags
|
* Check flags
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = _kdc_check_flags(context, config,
|
ret = _kdc_check_flags(context, config,
|
||||||
client, cpn,
|
client, cpn,
|
||||||
server, spn,
|
server, spn,
|
||||||
FALSE);
|
FALSE);
|
||||||
if(ret)
|
if(ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if((b->kdc_options.validate || b->kdc_options.renew) &&
|
if((b->kdc_options.validate || b->kdc_options.renew) &&
|
||||||
!krb5_principal_compare(context,
|
!krb5_principal_compare(context,
|
||||||
krbtgt->entry.principal,
|
krbtgt->entry.principal,
|
||||||
server->entry.principal)){
|
server->entry.principal)){
|
||||||
kdc_log(context, config, 0, "Inconsistent request.");
|
kdc_log(context, config, 0, "Inconsistent request.");
|
||||||
@@ -1909,19 +1909,19 @@ server_lookup:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tgs_make_reply(context,
|
ret = tgs_make_reply(context,
|
||||||
config,
|
config,
|
||||||
b,
|
b,
|
||||||
client_principal,
|
client_principal,
|
||||||
tgt,
|
tgt,
|
||||||
ekey,
|
ekey,
|
||||||
&sessionkey,
|
&sessionkey,
|
||||||
kvno,
|
kvno,
|
||||||
*auth_data,
|
*auth_data,
|
||||||
server,
|
server,
|
||||||
spn,
|
spn,
|
||||||
client,
|
client,
|
||||||
cp,
|
cp,
|
||||||
krbtgt,
|
krbtgt,
|
||||||
krbtgt_etype,
|
krbtgt_etype,
|
||||||
spp,
|
spp,
|
||||||
&rspac,
|
&rspac,
|
||||||
@@ -1931,7 +1931,7 @@ server_lookup:
|
|||||||
out:
|
out:
|
||||||
free(spn);
|
free(spn);
|
||||||
free(cpn);
|
free(cpn);
|
||||||
|
|
||||||
krb5_data_free(&rspac);
|
krb5_data_free(&rspac);
|
||||||
krb5_free_keyblock_contents(context, &sessionkey);
|
krb5_free_keyblock_contents(context, &sessionkey);
|
||||||
if(server)
|
if(server)
|
||||||
@@ -1958,9 +1958,9 @@ out:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
krb5_error_code
|
krb5_error_code
|
||||||
_kdc_tgs_rep(krb5_context context,
|
_kdc_tgs_rep(krb5_context context,
|
||||||
krb5_kdc_configuration *config,
|
krb5_kdc_configuration *config,
|
||||||
KDC_REQ *req,
|
KDC_REQ *req,
|
||||||
krb5_data *data,
|
krb5_data *data,
|
||||||
const char *from,
|
const char *from,
|
||||||
struct sockaddr *from_addr,
|
struct sockaddr *from_addr,
|
||||||
@@ -1985,17 +1985,17 @@ _kdc_tgs_rep(krb5_context context,
|
|||||||
"TGS-REQ from %s without PA-DATA", from);
|
"TGS-REQ from %s without PA-DATA", from);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
tgs_req = _kdc_find_padata(req, &i, KRB5_PADATA_TGS_REQ);
|
tgs_req = _kdc_find_padata(req, &i, KRB5_PADATA_TGS_REQ);
|
||||||
|
|
||||||
if(tgs_req == NULL){
|
if(tgs_req == NULL){
|
||||||
ret = KRB5KDC_ERR_PADATA_TYPE_NOSUPP;
|
ret = KRB5KDC_ERR_PADATA_TYPE_NOSUPP;
|
||||||
|
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"TGS-REQ from %s without PA-TGS-REQ", from);
|
"TGS-REQ from %s without PA-TGS-REQ", from);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = tgs_parse_request(context, config,
|
ret = tgs_parse_request(context, config,
|
||||||
&req->req_body, tgs_req,
|
&req->req_body, tgs_req,
|
||||||
&krbtgt,
|
&krbtgt,
|
||||||
&krbtgt_etype,
|
&krbtgt_etype,
|
||||||
@@ -2005,7 +2005,7 @@ _kdc_tgs_rep(krb5_context context,
|
|||||||
&csec, &cusec,
|
&csec, &cusec,
|
||||||
&auth_data);
|
&auth_data);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Failed parsing TGS-REQ from %s", from);
|
"Failed parsing TGS-REQ from %s", from);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -2024,7 +2024,7 @@ _kdc_tgs_rep(krb5_context context,
|
|||||||
from_addr,
|
from_addr,
|
||||||
datagram_reply);
|
datagram_reply);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kdc_log(context, config, 0,
|
kdc_log(context, config, 0,
|
||||||
"Failed building TGS-REP to %s", from);
|
"Failed building TGS-REP to %s", from);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user