summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlexandra Ellwood <lxs@mit.edu>2004-08-12 19:10:54 +0000
committerAlexandra Ellwood <lxs@mit.edu>2004-08-12 19:10:54 +0000
commite23708c161041e7b94be2b5b8afcdfc8f35c0258 (patch)
tree401e7649c22df01c620b8b5cc4fce22a41c079e6 /src
parenta40669345d29f3cc6306c4f3393ca7dfd07e881f (diff)
downloadkrb5-e23708c161041e7b94be2b5b8afcdfc8f35c0258.tar.gz
krb5-e23708c161041e7b94be2b5b8afcdfc8f35c0258.tar.xz
krb5-e23708c161041e7b94be2b5b8afcdfc8f35c0258.zip
get_in_tkt.c (get_init_creds): Support ticket_lifetime libdefault. Made aware of 32 bit min and max for times. Allow renew_until time < expiration time
ticket: 2654 ticket: 2655 ticket: 2656 git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@16656 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/lib/krb5/krb/ChangeLog7
-rw-r--r--src/lib/krb5/krb/get_in_tkt.c89
2 files changed, 69 insertions, 27 deletions
diff --git a/src/lib/krb5/krb/ChangeLog b/src/lib/krb5/krb/ChangeLog
index 9d508e895..1e284cce0 100644
--- a/src/lib/krb5/krb/ChangeLog
+++ b/src/lib/krb5/krb/ChangeLog
@@ -1,3 +1,10 @@
+2004-08-12 Alexandra Ellwood <lxs@mit.edu>
+
+ * get_in_tkt.c (get_init_creds):
+ Support ticket_lifetime libdefault.
+ Made aware of 32 bit min and max for times.
+ Allow renew_until time < expiration time.
+
2004-08-03 Ken Raeburn <raeburn@mit.edu>
* srv_rcache.c (krb5_get_server_rcache): Call
diff --git a/src/lib/krb5/krb/get_in_tkt.c b/src/lib/krb5/krb/get_in_tkt.c
index 7d70782e9..0ab3515ce 100644
--- a/src/lib/krb5/krb/get_in_tkt.c
+++ b/src/lib/krb5/krb/get_in_tkt.c
@@ -78,6 +78,24 @@ typedef krb5_error_code (*git_decrypt_proc) (krb5_context,
static krb5_error_code make_preauth_list (krb5_context,
krb5_preauthtype *,
int, krb5_pa_data ***);
+
+/*
+ * This function performs 32 bit bounded addition so we can generate
+ * lifetimes without overflowing krb5_int32
+ */
+static krb5_int32 krb5int_addint32 (krb5_int32 x, krb5_int32 y)
+{
+ if ((x > 0) && (y > (KRB5_INT32_MAX - x))) {
+ /* sum will be be greater than KRB5_INT32_MAX */
+ return KRB5_INT32_MAX;
+ } else if ((x < 0) && (y < (KRB5_INT32_MIN - x))) {
+ /* sum will be less than KRB5_INT32_MIN */
+ return KRB5_INT32_MIN;
+ }
+
+ return x + y;
+}
+
/*
* This function sends a request to the KDC, and gets back a response;
* the response is parsed into ret_err_reply or ret_as_reply if the
@@ -747,6 +765,7 @@ krb5_get_init_creds(krb5_context context,
krb5_pa_data **padata;
int tempint;
char *tempstr;
+ krb5_deltat tkt_life;
krb5_deltat renew_life;
int loopcount;
krb5_data salt;
@@ -806,8 +825,34 @@ krb5_get_init_creds(krb5_context context,
if (tempint)
request.kdc_options |= KDC_OPT_PROXIABLE;
- /* renewable */
-
+ /* allow_postdate */
+
+ if (start_time > 0)
+ request.kdc_options |= (KDC_OPT_ALLOW_POSTDATE|KDC_OPT_POSTDATED);
+
+ /* ticket lifetime */
+
+ if ((ret = krb5_timeofday(context, &request.from)))
+ goto cleanup;
+ request.from = krb5int_addint32(request.from, start_time);
+
+ if (options && (options->flags & KRB5_GET_INIT_CREDS_OPT_TKT_LIFE)) {
+ tkt_life = options->tkt_life;
+ } else if ((ret = krb5_libdefault_string(context, &client->realm,
+ "ticket_lifetime", &tempstr))
+ == 0) {
+ if ((ret = krb5_string_to_deltat(tempstr, &tkt_life))) {
+ free(tempstr);
+ goto cleanup;
+ }
+ } else {
+ /* this used to be hardcoded in kinit.c */
+ tkt_life = 24*60*60;
+ }
+ request.till = krb5int_addint32(request.from, tkt_life);
+
+ /* renewable lifetime */
+
if (options && (options->flags & KRB5_GET_INIT_CREDS_OPT_RENEW_LIFE)) {
renew_life = options->renew_life;
} else if ((ret = krb5_libdefault_string(context, &client->realm,
@@ -822,16 +867,25 @@ krb5_get_init_creds(krb5_context context,
}
if (renew_life > 0)
request.kdc_options |= KDC_OPT_RENEWABLE;
-
- /* allow_postdate */
-
- if (start_time > 0)
- request.kdc_options |= (KDC_OPT_ALLOW_POSTDATE|KDC_OPT_POSTDATED);
-
+
+ if (renew_life > 0) {
+ request.rtime = krb5int_addint32(request.from, renew_life);
+ if (request.rtime < request.till) {
+ /* don't ask for a smaller renewable time than the lifetime */
+ request.rtime = request.till;
+ }
+ /* we are already asking for renewable tickets so strip this option */
+ request.kdc_options &= ~(KDC_OPT_RENEWABLE_OK);
+ } else {
+ request.rtime = 0;
+ }
+
/* client */
request.client = client;
+ /* service */
+
if (in_tkt_service) {
/* this is ugly, because so are the data structures involved. I'm
in the library, so I'm going to manipulate the data structures
@@ -865,25 +919,6 @@ krb5_get_init_creds(krb5_context context,
goto cleanup;
}
- if ((ret = krb5_timeofday(context, &request.from)))
- goto cleanup;
- request.from += start_time;
-
- request.till = request.from;
- if (options && (options->flags & KRB5_GET_INIT_CREDS_OPT_TKT_LIFE))
- request.till += options->tkt_life;
- else
- request.till += 24*60*60; /* this used to be hardcoded in kinit.c */
-
- if (renew_life > 0) {
- request.rtime = request.from;
- request.rtime += renew_life;
- if (request.rtime >= request.till)
- request.kdc_options &= ~(KDC_OPT_RENEWABLE_OK);
- } else {
- request.rtime = 0;
- }
-
/* nonce is filled in by send_as_request */
if (options && (options->flags & KRB5_GET_INIT_CREDS_OPT_ETYPE_LIST)) {