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