]> arthur.barton.de Git - netatalk.git/blob - etc/uams/uams_krb4/lifetime.c
Initial revision
[netatalk.git] / etc / uams / uams_krb4 / lifetime.c
1 /*
2  * Ticket lifetime.  This defines the table used to lookup lifetime
3  * for the fixed part of rande of the one byte lifetime field.  Values
4  * less than 0x80 are intrpreted as the number of 5 minute intervals.
5  * Values from 0x80 to 0xBF should be looked up in this table.  The
6  * value of 0x80 is the same using both methods: 10 and two-thirds
7  * hours .  The lifetime of 0xBF is 30 days.  The intervening values
8  * of have a fixed ratio of roughly 1.06914.  The value 0xFF is
9  * defined to mean a ticket has no expiration time.  This should be
10  * used advisedly since individual servers may impose defacto
11  * upperbounds on ticket lifetimes.
12  */
13
14 #include <sys/types.h>
15 #include <netatalk/endian.h>
16
17 #define TKTLIFENUMFIXED 64
18 #define TKTLIFEMINFIXED 0x80
19 #define TKTLIFEMAXFIXED 0xBF
20 #define TKTLIFENOEXPIRE 0xFF
21 #define MAXTKTLIFETIME  (30*24*3600)    /* 30 days */
22 #ifndef NEVERDATE
23 #define NEVERDATE ((u_int32_t)-1L)
24 #endif
25
26 static int tkt_lifetimes[TKTLIFENUMFIXED] = {
27     38400,                              /* 10.67 hours, 0.44 days */ 
28     41055,                              /* 11.40 hours, 0.48 days */ 
29     43894,                              /* 12.19 hours, 0.51 days */ 
30     46929,                              /* 13.04 hours, 0.54 days */ 
31     50174,                              /* 13.94 hours, 0.58 days */ 
32     53643,                              /* 14.90 hours, 0.62 days */ 
33     57352,                              /* 15.93 hours, 0.66 days */ 
34     61318,                              /* 17.03 hours, 0.71 days */ 
35     65558,                              /* 18.21 hours, 0.76 days */ 
36     70091,                              /* 19.47 hours, 0.81 days */ 
37     74937,                              /* 20.82 hours, 0.87 days */ 
38     80119,                              /* 22.26 hours, 0.93 days */ 
39     85658,                              /* 23.79 hours, 0.99 days */ 
40     91581,                              /* 25.44 hours, 1.06 days */ 
41     97914,                              /* 27.20 hours, 1.13 days */ 
42     104684,                             /* 29.08 hours, 1.21 days */ 
43     111922,                             /* 31.09 hours, 1.30 days */ 
44     119661,                             /* 33.24 hours, 1.38 days */ 
45     127935,                             /* 35.54 hours, 1.48 days */ 
46     136781,                             /* 37.99 hours, 1.58 days */ 
47     146239,                             /* 40.62 hours, 1.69 days */ 
48     156350,                             /* 43.43 hours, 1.81 days */ 
49     167161,                             /* 46.43 hours, 1.93 days */ 
50     178720,                             /* 49.64 hours, 2.07 days */ 
51     191077,                             /* 53.08 hours, 2.21 days */ 
52     204289,                             /* 56.75 hours, 2.36 days */ 
53     218415,                             /* 60.67 hours, 2.53 days */ 
54     233517,                             /* 64.87 hours, 2.70 days */ 
55     249664,                             /* 69.35 hours, 2.89 days */ 
56     266926,                             /* 74.15 hours, 3.09 days */ 
57     285383,                             /* 79.27 hours, 3.30 days */ 
58     305116,                             /* 84.75 hours, 3.53 days */ 
59     326213,                             /* 90.61 hours, 3.78 days */ 
60     348769,                             /* 96.88 hours, 4.04 days */ 
61     372885,                             /* 103.58 hours, 4.32 days */ 
62     398668,                             /* 110.74 hours, 4.61 days */ 
63     426234,                             /* 118.40 hours, 4.93 days */ 
64     455705,                             /* 126.58 hours, 5.27 days */ 
65     487215,                             /* 135.34 hours, 5.64 days */ 
66     520904,                             /* 144.70 hours, 6.03 days */ 
67     556921,                             /* 154.70 hours, 6.45 days */ 
68     595430,                             /* 165.40 hours, 6.89 days */ 
69     636601,                             /* 176.83 hours, 7.37 days */ 
70     680618,                             /* 189.06 hours, 7.88 days */ 
71     727680,                             /* 202.13 hours, 8.42 days */ 
72     777995,                             /* 216.11 hours, 9.00 days */ 
73     831789,                             /* 231.05 hours, 9.63 days */ 
74     889303,                             /* 247.03 hours, 10.29 days */ 
75     950794,                             /* 264.11 hours, 11.00 days */ 
76     1016537,                            /* 282.37 hours, 11.77 days */ 
77     1086825,                            /* 301.90 hours, 12.58 days */ 
78     1161973,                            /* 322.77 hours, 13.45 days */ 
79     1242318,                            /* 345.09 hours, 14.38 days */ 
80     1328218,                            /* 368.95 hours, 15.37 days */ 
81     1420057,                            /* 394.46 hours, 16.44 days */ 
82     1518247,                            /* 421.74 hours, 17.57 days */ 
83     1623226,                            /* 450.90 hours, 18.79 days */ 
84     1735464,                            /* 482.07 hours, 20.09 days */ 
85     1855462,                            /* 515.41 hours, 21.48 days */ 
86     1983758,                            /* 551.04 hours, 22.96 days */ 
87     2120925,                            /* 589.15 hours, 24.55 days */ 
88     2267576,                            /* 629.88 hours, 26.25 days */ 
89     2424367,                            /* 673.44 hours, 28.06 days */ 
90     2592000};                           /* 720.00 hours, 30.00 days */ 
91
92 /*
93  * krb_life_to_time - takes a start time and a Kerberos standard
94  * lifetime char and returns the corresponding end time.  There are
95  * four simple cases to be handled.  The first is a life of 0xff,
96  * meaning no expiration, and results in an end time of 0xffffffff.
97  * The second is when life is less than the values covered by the
98  * table.  In this case, the end time is the start time plus the
99  * number of 5 minute intervals specified by life.  The third case
100  * returns start plus the MAXTKTLIFETIME if life is greater than
101  * TKTLIFEMAXFIXED.  The last case, uses the life value (minus
102  * TKTLIFEMINFIXED) as an index into the table to extract the lifetime
103  * in seconds, which is added to start to produce the end time.
104  */
105 u_int32_t krb_life_to_time(start, life)
106 u_int32_t start;
107 int life;
108 {
109     life = (unsigned char) life;
110     if (life == TKTLIFENOEXPIRE) return NEVERDATE;
111     if (life < TKTLIFEMINFIXED) return start + life*5*60;
112     if (life > TKTLIFEMAXFIXED) return start + MAXTKTLIFETIME;
113     return start + tkt_lifetimes[life - TKTLIFEMINFIXED];
114 }
115
116 /*
117  * krb_time_to_life - takes start and end times for the ticket and
118  * returns a Kerberos standard lifetime char, possibily using the
119  * tkt_lifetimes table for lifetimes above 127*5 minutes.  First, the
120  * special case of (end == NEVERDATE) is handled to mean no
121  * expiration.  Then negative lifetimes and those greater than the
122  * maximum ticket lifetime are rejected.  Then lifetimes less than the
123  * first table entry are handled by rounding the requested lifetime
124  * *up* to the next 5 minute interval.  The final step is to search
125  * the table for the smallest entry *greater than or equal* to the
126  * requested entry.
127  */
128 int krb_time_to_life(start, end)
129 u_int32_t start;
130 u_int32_t end;
131 {
132     int32_t lifetime;
133     int i;
134
135     if (end == NEVERDATE) return TKTLIFENOEXPIRE;
136     lifetime = end - start;
137     if (lifetime > MAXTKTLIFETIME || lifetime <= 0) return 0;
138     if (lifetime < tkt_lifetimes[0]) return (lifetime + 5*60 - 1)/(5*60);
139     for (i=0; i<TKTLIFENUMFIXED; i++) {
140         if (lifetime <= tkt_lifetimes[i]) {
141             return i+TKTLIFEMINFIXED;
142         }
143     }
144     return 0;
145 }