File: lifetime.c

package info (click to toggle)
sident 3.4-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 1,864 kB
  • ctags: 706
  • sloc: sh: 7,748; ansic: 6,877; makefile: 233; perl: 147
file content (170 lines) | stat: -rw-r--r-- 7,842 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*  lifetime.c,v 1.4 2004/07/23 22:29:37 eagle Exp
**
**  Lifetime conversion routine for Kerberos libraries that don't have it.
**
**  This file contains an implementation of krb_life_to_time for Kerberos
**  libraries that don't have it.  This implements the Kerberos v4 long
**  lifetime semantics unless SHORT_LIFETIME is defined.  If SHORT_LIFETIME is
**  defined, the normal Kerberos v4 lifetime semantics are used.
*/

#include "config.h"
#include <time.h>

#ifdef HAVE_KERBEROSIV_KRB_H
# include <kerberosIV/krb.h>
#else
# include <krb.h>
#endif

/* The lifetime value indicating a ticket that never expires. */
#define TKTLIFENOEXPIRE 0xFF

/* The seconds value for a ticket that never expires. */
#ifndef NEVERDATE
# define NEVERDATE ((time_t) -1L)
#endif

#ifdef SHORT_LIFETIME

/*
**  Convert a Kerberos v4 lifetime to the expiration time in seconds.  The
**  conversion without long lifetime support is trivial.  Just multiply the
**  lifetime by five to get minutes.  Takes the starting point for the
**  calculation and the lifetime and returns the expiration time in seconds
**  since epoch.
*/
time_t
krb_life_to_time(time_t start, int life)
{
    /* Lifetime semantics require wrapping at 255, which can be implemented by
       forcing the lifetime into an unsigned char. */
    life = (unsigned char) life;
    if (life == TKTLIFENOEXPIRE)
        return NEVERDATE;
    else
        return start + life * 5 * 60;
}

#else /* SHORT LIFETIME */

#define TKTLIFENUMFIXED 64      /**< Size of the lifetime table. */
#define TKTLIFEMINFIXED 0x80    /**< The first special lifetime. */
#define TKTLIFEMAXFIXED 0xBF    /**< The last special lifetime. */

/** The maximum ticket lifetime. */
#define MAXTKTLIFETIME (30*24*3600)

/* Lookup table for long ticket lifetimes.

   This defines the table used to lookup lifetime for the fixed part of rande
   of the one byte lifetime field.  Values less than 0x80 are intrpreted as
   the number of 5 minute intervals.  Values from 0x80 to 0xBF should be
   looked up in this table.  The value of 0x80 is the same using both methods:
   10 and two-thirds hours.  The lifetime of 0xBF is 30 days.  The intervening
   values of have a fixed ratio of roughly 1.06914.

   The value 0xFF is defined to mean a ticket has no expiration time.  This
   should be used advisedly since individual servers may impose defacto
   upper bounds on ticket lifetimes. */
static int tkt_lifetimes[TKTLIFENUMFIXED] = {
    38400,                      /* 10.67 hours, 0.44 days */
    41055,                      /* 11.40 hours, 0.48 days */
    43894,                      /* 12.19 hours, 0.51 days */
    46929,                      /* 13.04 hours, 0.54 days */
    50174,                      /* 13.94 hours, 0.58 days */
    53643,                      /* 14.90 hours, 0.62 days */
    57352,                      /* 15.93 hours, 0.66 days */
    61318,                      /* 17.03 hours, 0.71 days */
    65558,                      /* 18.21 hours, 0.76 days */
    70091,                      /* 19.47 hours, 0.81 days */
    74937,                      /* 20.82 hours, 0.87 days */
    80119,                      /* 22.26 hours, 0.93 days */
    85658,                      /* 23.79 hours, 0.99 days */
    91581,                      /* 25.44 hours, 1.06 days */
    97914,                      /* 27.20 hours, 1.13 days */
    104684,                     /* 29.08 hours, 1.21 days */
    111922,                     /* 31.09 hours, 1.30 days */
    119661,                     /* 33.24 hours, 1.38 days */
    127935,                     /* 35.54 hours, 1.48 days */
    136781,                     /* 37.99 hours, 1.58 days */
    146239,                     /* 40.62 hours, 1.69 days */
    156350,                     /* 43.43 hours, 1.81 days */
    167161,                     /* 46.43 hours, 1.93 days */
    178720,                     /* 49.64 hours, 2.07 days */
    191077,                     /* 53.08 hours, 2.21 days */
    204289,                     /* 56.75 hours, 2.36 days */
    218415,                     /* 60.67 hours, 2.53 days */
    233517,                     /* 64.87 hours, 2.70 days */
    249664,                     /* 69.35 hours, 2.89 days */
    266926,                     /* 74.15 hours, 3.09 days */
    285383,                     /* 79.27 hours, 3.30 days */
    305116,                     /* 84.75 hours, 3.53 days */
    326213,                     /* 90.61 hours, 3.78 days */
    348769,                     /* 96.88 hours, 4.04 days */
    372885,                     /* 103.58 hours, 4.32 days */
    398668,                     /* 110.74 hours, 4.61 days */
    426234,                     /* 118.40 hours, 4.93 days */
    455705,                     /* 126.58 hours, 5.27 days */
    487215,                     /* 135.34 hours, 5.64 days */
    520904,                     /* 144.70 hours, 6.03 days */
    556921,                     /* 154.70 hours, 6.45 days */
    595430,                     /* 165.40 hours, 6.89 days */
    636601,                     /* 176.83 hours, 7.37 days */
    680618,                     /* 189.06 hours, 7.88 days */
    727680,                     /* 202.13 hours, 8.42 days */
    777995,                     /* 216.11 hours, 9.00 days */
    831789,                     /* 231.05 hours, 9.63 days */
    889303,                     /* 247.03 hours, 10.29 days */
    950794,                     /* 264.11 hours, 11.00 days */
    1016537,                    /* 282.37 hours, 11.77 days */
    1086825,                    /* 301.90 hours, 12.58 days */
    1161973,                    /* 322.77 hours, 13.45 days */
    1242318,                    /* 345.09 hours, 14.38 days */
    1328218,                    /* 368.95 hours, 15.37 days */
    1420057,                    /* 394.46 hours, 16.44 days */
    1518247,                    /* 421.74 hours, 17.57 days */
    1623226,                    /* 450.90 hours, 18.79 days */
    1735464,                    /* 482.07 hours, 20.09 days */
    1855462,                    /* 515.41 hours, 21.48 days */
    1983758,                    /* 551.04 hours, 22.96 days */
    2120925,                    /* 589.15 hours, 24.55 days */
    2267576,                    /* 629.88 hours, 26.25 days */
    2424367,                    /* 673.44 hours, 28.06 days */
    2592000                     /* 720.00 hours, 30.00 days */
};


/*
**  Convert a Kerberos v4 lifetime to the expiration time in seconds.  Takes a
**  start time and a Kerberos standard lifetime char and returns the
**  corresponding end time.
**
**  There are four simple cases to be handled.  The first is a life of 0xff,
**  meaning no expiration, and results in an end time of 0xffffffff.  The
**  second is when life is less than the values covered by the table; in this
**  case, the end time is the start time plus the number of 5 minute intervals
**  specified by life.  The third case returns start plus the MAXTKTLIFETIME
**  if life is greater than TKTLIFEMAXFIXED.  The last case uses the life
**  value (minus TKTLIFEMINFIXED) as an index into the table to extract the
**  lifetime in seconds, which is added to start to produce the end time.
**
**  Takes the starting point for the calculation and the lifetime and returns
**  the expiration time in seconds since epoch.
*/
time_t
krb_life_to_time(time_t start, int life)
{
    /* Lifetime semantics require wrapping at 255, which can be implemented by
       forcing the lifetime into an unsigned char. */
    life = (unsigned char) life;
    if (life == TKTLIFENOEXPIRE)
        return NEVERDATE;
    if (life < TKTLIFEMINFIXED)
        return start + life * 5 * 60;
    if (life > TKTLIFEMAXFIXED)
        return start + MAXTKTLIFETIME;
    return start + tkt_lifetimes[life - TKTLIFEMINFIXED];
}

#endif /* !SHORT_LIFETIME */