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
|
The replay cache functions deal with verifying that AP_REQ's do not
contain duplicate authenticators; the storage must be non-volatile for
the site-determined validity period of authenticators.
Each replay cache has a string {\bf name} associated with it. The use of
this name is dependent on the underlying caching strategy (for
file-based things, it would be a cache file name). The
caching strategy should use non-volatile storage so that replay
integrity can be maintained across system failures.
\subsubsection{The krb5_rc_ops structure}
In order to implement a new replay cache type, the programmer should
declare a {\bf krb5_rc_ops} structure, and fill in the elements of the
structure appropriately, by implementing each of the replay cache
functions for the new replay cache type.
The prefix element specifies the prefix {bf name} of the the new replay
cache type. For example, if the prefix {\bf name} is ``dfl'', then if the
program calls \funcname{krb5_rc_resolve} with a credential cache name
such as ``dfl:host'', then \funcname{krb5_rc_resolve}
will call the resolve function (as defined by the {\bf krb5_rc_ops}
structure where the prefix element is ``dfl'') and pass it the
argument ``host''.
Before a new replay cache type can be recognized by
\funcname{krb5_rc_resolve}, it must be registered with the Kerberos
library by calling \funcname{krb5_rc_register}.
\begin{verbatim}
typedef struct _krb5_rc_ops {
char *type;
krb5_error_code (*init)((krb5_rcache,krb5_deltat));
krb5_error_code (*recover)((krb5_rcache));
krb5_error_code (*destroy)((krb5_rcache));
krb5_error_code (*close)((krb5_rcache));
krb5_error_code (*store)((krb5_rcache,krb5_donot_replay *));
krb5_error_code (*expunge)((krb5_rcache));
krb5_error_code (*get_span)((krb5_rcache,krb5_deltat *));
char *(*get_name)((krb5_rcache));
krb5_error_code (*resolve)((krb5_rcache, char *));
} krb5_rc_ops;
\end{verbatim}
\subsubsection{Per-type functions}
The following entry points must be implemented for each type of
replay cache.
\begin{funcdecl}{init}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\funcarg{krb5_deltat}{auth_lifespan}
\end{funcdecl}
Creates/refreshes the replay cache identified by \funcparam{id} and sets its
authenticator lifespan to \funcparam{auth_lifespan}. If the
replay cache already exists, its contents are destroyed.
%Errors: permission errors, system errors
\begin{funcdecl}{recover}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\end{funcdecl}
Attempts to recover the replay cache \funcparam{id}, (presumably after a
system crash or server restart).
%Errors: error indicating that no cache was found to recover
\begin{funcdecl}{destroy}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\end{funcdecl}
Destroys the replay cache \funcparam{id}.
Requires that \funcparam{id} identifies a valid replay cache.
%Errors: permission errors.
\begin{funcdecl}{close}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\end{funcdecl}
Closes the replay cache \funcparam{id}, invalidates \funcparam{id},
and releases any other resources acquired during use of the replay cache.
Requires that \funcparam{id} identifies a valid replay cache.
%Errors: permission errors
\begin{funcdecl}{store}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\funcarg{krb5_donot_replay *}{rep}
\end{funcdecl}
Stores \funcparam{rep} in the replay cache \funcparam{id}.
Requires that \funcparam{id} identifies a valid replay cache.
Returns KRB5KRB_AP_ERR_REPEAT if \funcparam{rep} is already in the
cache. May also return permission errors, storage failure errors.
\begin{funcdecl}{expunge}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\end{funcdecl}
Removes all expired replay information (i.e. those entries which are
older than then authenticator lifespan of the cache) from the cache
\funcparam{id}. Requires that \funcparam{id} identifies a valid replay
cache.
%Errors: permission errors.
\begin{funcdecl}{get_span}{krb5_error_code}{\funcin}
\funcarg{krb5_rcache}{id}
\funcout
\funcarg{krb5_deltat *}{auth_lifespan}
\end{funcdecl}
Fills in \funcparam{auth_lifespan} with the lifespan of
the cache \funcparam{id}.
Requires that \funcparam{id} identifies a valid replay cache.
\begin{funcdecl}{resolve}{krb5_error_code}{\funcinout}
\funcarg{krb5_rcache}{id}
\funcin
\funcarg{char *}{name}
\end{funcdecl}
Initializes private data attached to \funcparam{id}. This function MUST
be called before the other per-replay cache functions.
Requires that \funcparam{id} points to allocated space, with an
initialized \funcparam{id{\ptsto}ops} field.
Since \funcname{resolve} allocates memory,
\funcname{close} must be called to free the allocated memory,
even if neither \funcname{init} or
\funcname{recover} were successfully called by the application.
%Returns: allocation errors.
\begin{funcdecl}{krb5_rc_get_name}{char *}{\funcin}
\funcarg{krb5_rcache}{id}
\end{funcdecl}
Returns the name (excluding the type) of the rcache \funcparam{id}.
Requires that \funcparam{id} identifies a valid replay cache.
|