ReactOS 0.4.15-dev-7942-gd23573b
svc_auth_des.c
Go to the documentation of this file.
1
2/*
3 * Copyright (c) 1988 by Sun Microsystems, Inc.
4 */
5
6/*
7 * Copyright (c) 2009, Sun Microsystems, Inc.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are met:
12 * - Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 * - Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
17 * - Neither the name of Sun Microsystems, Inc. nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/*
35 * svcauth_des.c, server-side des authentication
36 *
37 * We insure for the service the following:
38 * (1) The timestamp microseconds do not exceed 1 million.
39 * (2) The timestamp plus the window is less than the current time.
40 * (3) The timestamp is not less than the one previously
41 * seen in the current session.
42 *
43 * It is up to the server to determine if the window size is
44 * too small .
45 *
46 */
47#include <wintirpc.h>
48//#include <pthread.h>
49#include <reentrant.h>
50#include <string.h>
51#include <stdlib.h>
52#include <stdio.h>
53//#include <unistd.h>
54#include <rpc/des_crypt.h>
55//#include <sys/param.h>
56//#include <netinet/in.h>
57#include <rpc/types.h>
58#include <rpc/xdr.h>
59#include <rpc/auth.h>
60#include <rpc/auth_des.h>
61#include <rpc/svc.h>
62#include <rpc/rpc_msg.h>
63#include <rpc/svc_auth.h>
64#include <libc_private.h>
65
66extern int key_decryptsession_pk(const char *, netobj *, des_block *);
67
68#define debug(msg) printf("svcauth_des: %s\n", msg)
69
70#define USEC_PER_SEC ((u_long) 1000000L)
71#define BEFORE(t1, t2) timercmp(t1, t2, <)
72
73/*
74 * LRU cache of conversation keys and some other useful items.
75 */
76#define AUTHDES_CACHESZ 64
78 des_block key; /* conversation key */
79 char *rname; /* client's name */
80 u_int window; /* credential lifetime window */
81 struct timeval laststamp; /* detect replays of creds */
82 char *localcred; /* generic local credential */
83};
84static struct cache_entry *authdes_cache/* [AUTHDES_CACHESZ] */;
85static short *authdes_lru/* [AUTHDES_CACHESZ] */;
86
87static void cache_init(); /* initialize the cache */
88static short cache_spot(); /* find an entry in the cache */
89static void cache_ref(/*short sid*/); /* note that sid was ref'd */
90
91static void invalidate(); /* invalidate entry in cache */
92
93/*
94 * cache statistics
95 */
96static struct {
97 u_long ncachehits; /* times cache hit, and is not replay */
98 u_long ncachereplays; /* times cache hit, and is replay */
99 u_long ncachemisses; /* times cache missed */
101
102/*
103 * Service side authenticator for AUTH_DES
104 */
105enum auth_stat
107 struct svc_req *rqst;
108 struct rpc_msg *msg;
109{
110
111 long *ixdr;
112 des_block cryptbuf[2];
113 struct authdes_cred *cred;
114 struct authdes_verf verf;
115 int status;
116 struct cache_entry *entry;
117 short sid = 0;
118 des_block *sessionkey;
119 des_block ivec;
121 struct timeval timestamp;
123 struct area {
124 struct authdes_cred area_cred;
125 char area_netname[MAXNETNAMELEN+1];
126 } *area;
127
128 if (authdes_cache == NULL) {
129 cache_init();
130 }
131
132 area = (struct area *)rqst->rq_clntcred;
133 cred = (struct authdes_cred *)&area->area_cred;
134
135 /*
136 * Get the credential
137 */
138 ixdr = (long *)msg->rm_call.cb_cred.oa_base;
139 cred->adc_namekind = IXDR_GET_ENUM(ixdr, enum authdes_namekind);
140 switch (cred->adc_namekind) {
141 case ADN_FULLNAME:
142 namelen = IXDR_GET_U_LONG(ixdr);
143 if (namelen > MAXNETNAMELEN) {
144 return (AUTH_BADCRED);
145 }
146 cred->adc_fullname.name = area->area_netname;
147 bcopy((char *)ixdr, cred->adc_fullname.name,
148 (u_int)namelen);
149 cred->adc_fullname.name[namelen] = 0;
150 ixdr += (RNDUP(namelen) / BYTES_PER_XDR_UNIT);
151 cred->adc_fullname.key.key.high = (u_long)*ixdr++;
152 cred->adc_fullname.key.key.low = (u_long)*ixdr++;
153 cred->adc_fullname.window = (u_long)*ixdr++;
154 break;
155 case ADN_NICKNAME:
156 cred->adc_nickname = (u_long)*ixdr++;
157 break;
158 default:
159 return (AUTH_BADCRED);
160 }
161
162 /*
163 * Get the verifier
164 */
165 ixdr = (long *)msg->rm_call.cb_verf.oa_base;
166 verf.adv_xtimestamp.key.high = (u_long)*ixdr++;
167 verf.adv_xtimestamp.key.low = (u_long)*ixdr++;
168 verf.adv_int_u = (u_long)*ixdr++;
169
170
171 /*
172 * Get the conversation key
173 */
174 if (cred->adc_namekind == ADN_FULLNAME) {
175 netobj pkey;
176 char pkey_data[1024];
177
178 sessionkey = &cred->adc_fullname.key;
179 if (! getpublickey(cred->adc_fullname.name, pkey_data)) {
180 debug("getpublickey");
181 return(AUTH_BADCRED);
182 }
183 pkey.n_bytes = pkey_data;
184 pkey.n_len = strlen(pkey_data) + 1;
185 if (key_decryptsession_pk(cred->adc_fullname.name, &pkey,
186 sessionkey) < 0) {
187 debug("decryptsessionkey");
188 return (AUTH_BADCRED); /* key not found */
189 }
190 } else { /* ADN_NICKNAME */
191 sid = (short)cred->adc_nickname;
192 if (sid < 0 || sid >= AUTHDES_CACHESZ) {
193 debug("bad nickname");
194 return (AUTH_BADCRED); /* garbled credential */
195 }
196 sessionkey = &authdes_cache[sid].key;
197 }
198
199
200 /*
201 * Decrypt the timestamp
202 */
203 cryptbuf[0] = verf.adv_xtimestamp;
204 if (cred->adc_namekind == ADN_FULLNAME) {
205 cryptbuf[1].key.high = cred->adc_fullname.window;
206 cryptbuf[1].key.low = verf.adv_winverf;
207 ivec.key.high = ivec.key.low = 0;
208 status = cbc_crypt((char *)sessionkey, (char *)cryptbuf,
209 2*sizeof(des_block), DES_DECRYPT | DES_HW,
210 (char *)&ivec);
211 } else {
212 status = ecb_crypt((char *)sessionkey, (char *)cryptbuf,
213 sizeof(des_block), DES_DECRYPT | DES_HW);
214 }
215 if (DES_FAILED(status)) {
216 debug("decryption failure");
217 return (AUTH_FAILED); /* system error */
218 }
219
220 /*
221 * XDR the decrypted timestamp
222 */
223 ixdr = (long *)cryptbuf;
224 timestamp.tv_sec = IXDR_GET_LONG(ixdr);
225 timestamp.tv_usec = IXDR_GET_LONG(ixdr);
226
227 /*
228 * Check for valid credentials and verifiers.
229 * They could be invalid because the key was flushed
230 * out of the cache, and so a new session should begin.
231 * Be sure and send AUTH_REJECTED{CRED, VERF} if this is the case.
232 */
233 {
234 struct timeval current;
235 int nick;
236 int winverf;
237
238 if (cred->adc_namekind == ADN_FULLNAME) {
239 window = IXDR_GET_U_LONG(ixdr);
240 winverf = IXDR_GET_U_LONG(ixdr);
241 if (winverf != window - 1) {
242 debug("window verifier mismatch");
243 return (AUTH_BADCRED); /* garbled credential */
244 }
245 sid = cache_spot(sessionkey, cred->adc_fullname.name,
246 &timestamp);
247 if (sid < 0) {
248 debug("replayed credential");
249 return (AUTH_REJECTEDCRED); /* replay */
250 }
251 nick = 0;
252 } else { /* ADN_NICKNAME */
253 window = authdes_cache[sid].window;
254 nick = 1;
255 }
256
257 if ((u_long)timestamp.tv_usec >= USEC_PER_SEC) {
258 debug("invalid usecs");
259 /* cached out (bad key), or garbled verifier */
260 return (nick ? AUTH_REJECTEDVERF : AUTH_BADVERF);
261 }
262 if (nick && BEFORE(&timestamp,
263 &authdes_cache[sid].laststamp)) {
264 debug("timestamp before last seen");
265 return (AUTH_REJECTEDVERF); /* replay */
266 }
267 (void) gettimeofday(&current, (struct timezone *)NULL);
268 current.tv_sec -= window; /* allow for expiration */
269 if (!BEFORE(&current, &timestamp)) {
270 debug("timestamp expired");
271 /* replay, or garbled credential */
272 return (nick ? AUTH_REJECTEDVERF : AUTH_BADCRED);
273 }
274 }
275
276 /*
277 * Set up the reply verifier
278 */
279 verf.adv_nickname = (u_long)sid;
280
281 /*
282 * xdr the timestamp before encrypting
283 */
284 ixdr = (long *)cryptbuf;
285 IXDR_PUT_LONG(ixdr, timestamp.tv_sec - 1);
286 IXDR_PUT_LONG(ixdr, timestamp.tv_usec);
287
288 /*
289 * encrypt the timestamp
290 */
291 status = ecb_crypt((char *)sessionkey, (char *)cryptbuf,
292 sizeof(des_block), DES_ENCRYPT | DES_HW);
293 if (DES_FAILED(status)) {
294 debug("encryption failure");
295 return (AUTH_FAILED); /* system error */
296 }
297 verf.adv_xtimestamp = cryptbuf[0];
298
299 /*
300 * Serialize the reply verifier, and update rqst
301 */
302 ixdr = (long *)msg->rm_call.cb_verf.oa_base;
303 *ixdr++ = (long)verf.adv_xtimestamp.key.high;
304 *ixdr++ = (long)verf.adv_xtimestamp.key.low;
305 *ixdr++ = (long)verf.adv_int_u;
306
307 rqst->rq_xprt->xp_verf.oa_flavor = AUTH_DES;
308 rqst->rq_xprt->xp_verf.oa_base = msg->rm_call.cb_verf.oa_base;
309 rqst->rq_xprt->xp_verf.oa_length =
310 (char *)ixdr - msg->rm_call.cb_verf.oa_base;
311
312 /*
313 * We succeeded, commit the data to the cache now and
314 * finish cooking the credential.
315 */
317 entry->laststamp = timestamp;
318 cache_ref(sid);
319 if (cred->adc_namekind == ADN_FULLNAME) {
320 cred->adc_fullname.window = window;
321 cred->adc_nickname = (u_long)sid; /* save nickname */
322 if (entry->rname != NULL) {
323 mem_free(entry->rname, strlen(entry->rname) + 1);
324 }
325 entry->rname = (char *)mem_alloc((u_int)strlen(cred->adc_fullname.name)
326 + 1);
327 if (entry->rname != NULL) {
328 (void) strcpy(entry->rname, cred->adc_fullname.name);
329 } else {
330 debug("out of memory");
331 }
332 entry->key = *sessionkey;
333 entry->window = window;
334 invalidate(entry->localcred); /* mark any cached cred invalid */
335 } else { /* ADN_NICKNAME */
336 /*
337 * nicknames are cooked into fullnames
338 */
340 cred->adc_fullname.name = entry->rname;
341 cred->adc_fullname.key = entry->key;
342 cred->adc_fullname.window = entry->window;
343 }
344 return (AUTH_OK); /* we made it!*/
345}
346
347
348/*
349 * Initialize the cache
350 */
351static void
353{
354 int i;
355
356 authdes_cache = (struct cache_entry *)
357 mem_alloc(sizeof(struct cache_entry) * AUTHDES_CACHESZ);
358 bzero((char *)authdes_cache,
359 sizeof(struct cache_entry) * AUTHDES_CACHESZ);
360
361 authdes_lru = (short *)mem_alloc(sizeof(short) * AUTHDES_CACHESZ);
362 /*
363 * Initialize the lru list
364 */
365 for (i = 0; i < AUTHDES_CACHESZ; i++) {
366 authdes_lru[i] = i;
367 }
368}
369
370
371/*
372 * Find the lru victim
373 */
374static short
376{
377 return (authdes_lru[AUTHDES_CACHESZ-1]);
378}
379
380/*
381 * Note that sid was referenced
382 */
383static void
385 short sid;
386{
387 int i;
388 short curr;
389 short prev;
390
391 prev = authdes_lru[0];
392 authdes_lru[0] = sid;
393 for (i = 1; prev != sid; i++) {
394 curr = authdes_lru[i];
395 authdes_lru[i] = prev;
396 prev = curr;
397 }
398}
399
400
401/*
402 * Find a spot in the cache for a credential containing
403 * the items given. Return -1 if a replay is detected, otherwise
404 * return the spot in the cache.
405 */
406static short
408 des_block *key;
409 char *name;
410 struct timeval *timestamp;
411{
412 struct cache_entry *cp;
413 int i;
414 u_long hi;
415
416 hi = key->key.high;
417 for (cp = authdes_cache, i = 0; i < AUTHDES_CACHESZ; i++, cp++) {
418 if (cp->key.key.high == hi &&
419 cp->key.key.low == key->key.low &&
420 cp->rname != NULL &&
421 bcmp(cp->rname, name, strlen(name) + 1) == 0) {
422 if (BEFORE(timestamp, &cp->laststamp)) {
423 svcauthdes_stats.ncachereplays++;
424 return (-1); /* replay */
425 }
426 svcauthdes_stats.ncachehits++;
427 return (i); /* refresh */
428 }
429 }
430 svcauthdes_stats.ncachemisses++;
431 return (cache_victim()); /* new credential */
432}
433
434
435#if (defined(sun) || defined(vax) || defined(__FreeBSD__))
436/*
437 * Local credential handling stuff.
438 * NOTE: bsd unix dependent.
439 * Other operating systems should put something else here.
440 */
441#define UNKNOWN -2 /* grouplen, if cached cred is unknown user */
442#define INVALID -1 /* grouplen, if cache entry is invalid */
443
444struct bsdcred {
445 short uid; /* cached uid */
446 short gid; /* cached gid */
447 short grouplen; /* length of cached groups */
448 short groups[NGROUPS]; /* cached groups */
449};
450
451/*
452 * Map a des credential into a unix cred.
453 * We cache the credential here so the application does
454 * not have to make an rpc call every time to interpret
455 * the credential.
456 */
457int
458authdes_getucred(adc, uid, gid, grouplen, groups)
459 struct authdes_cred *adc;
460 uid_t *uid;
461 gid_t *gid;
462 int *grouplen;
463 gid_t *groups;
464{
465 unsigned sid;
466 int i;
467 uid_t i_uid;
468 gid_t i_gid;
469 int i_grouplen;
470 struct bsdcred *cred;
471
472 sid = adc->adc_nickname;
473 if (sid >= AUTHDES_CACHESZ) {
474 debug("invalid nickname");
475 return (0);
476 }
477 cred = (struct bsdcred *)authdes_cache[sid].localcred;
478 if (cred == NULL) {
479 cred = (struct bsdcred *)mem_alloc(sizeof(struct bsdcred));
480 authdes_cache[sid].localcred = (char *)cred;
481 cred->grouplen = INVALID;
482 }
483 if (cred->grouplen == INVALID) {
484 /*
485 * not in cache: lookup
486 */
487 if (!netname2user(adc->adc_fullname.name, &i_uid, &i_gid,
488 &i_grouplen, groups))
489 {
490 debug("unknown netname");
491 cred->grouplen = UNKNOWN; /* mark as lookup up, but not found */
492 return (0);
493 }
494 debug("missed ucred cache");
495 *uid = cred->uid = i_uid;
496 *gid = cred->gid = i_gid;
497 *grouplen = cred->grouplen = i_grouplen;
498 for (i = i_grouplen - 1; i >= 0; i--) {
499 cred->groups[i] = groups[i]; /* int to short */
500 }
501 return (1);
502 } else if (cred->grouplen == UNKNOWN) {
503 /*
504 * Already lookup up, but no match found
505 */
506 return (0);
507 }
508
509 /*
510 * cached credentials
511 */
512 *uid = cred->uid;
513 *gid = cred->gid;
514 *grouplen = cred->grouplen;
515 for (i = cred->grouplen - 1; i >= 0; i--) {
516 groups[i] = cred->groups[i]; /* short to int */
517 }
518 return (1);
519}
520
521static void
522invalidate(cred)
523 char *cred;
524{
525 if (cred == NULL) {
526 return;
527 }
528 ((struct bsdcred *)cred)->grouplen = INVALID;
529}
530#endif
531
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define gettimeofday(tv, tz)
Definition: adns_win32.h:159
__BEGIN_DECLS int authdes_getucred(struct authdes_cred *, uid_t *, gid_t *, int *, gid_t *)
authdes_namekind
Definition: auth_des.h:50
@ ADN_FULLNAME
Definition: auth_des.h:51
@ ADN_NICKNAME
Definition: auth_des.h:52
#define msg(x)
Definition: auth_time.c:54
#define bcopy(s1, s2, n)
Definition: various.h:25
#define bcmp(s1, s2, n)
Definition: various.h:26
#define bzero(s, n)
Definition: various.h:27
long uid_t
Definition: various.h:8
FT_UInt sid
Definition: cffcmap.c:139
int cbc_crypt(char *key, char *buf, unsigned len, unsigned mode, char *ivec)
Definition: des_crypt.c:75
int ecb_crypt(char *key, char *buf, unsigned len, unsigned mode)
Definition: des_crypt.c:102
#define DES_HW
Definition: des_crypt.h:56
#define DES_FAILED(err)
Definition: des_crypt.h:65
#define DES_DECRYPT
Definition: des_crypt.h:52
#define DES_ENCRYPT
Definition: des_crypt.h:51
#define MAXNETNAMELEN
Definition: auth.h:78
auth_stat
Definition: auth.h:144
@ AUTH_REJECTEDVERF
Definition: auth.h:152
@ AUTH_FAILED
Definition: auth.h:158
@ AUTH_BADCRED
Definition: auth.h:149
@ AUTH_BADVERF
Definition: auth.h:151
@ AUTH_OK
Definition: auth.h:145
@ AUTH_REJECTEDCRED
Definition: auth.h:150
#define AUTH_DES
Definition: auth.h:407
UINT32 u_int
Definition: types.h:82
#define mem_free(ptr, bsize)
Definition: types.h:124
#define NULL
Definition: types.h:112
#define mem_alloc(bsize)
Definition: types.h:123
UINT gid_t
Definition: types.h:89
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
unsigned long u_long
Definition: linux.h:269
int getpublickey(char *netname, char *publickey) const
Definition: getpublickey.c:166
GLsizei GLuint * groups
Definition: glext.h:11113
GLint namelen
Definition: glext.h:7232
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
uint32_t entry
Definition: isohybrid.c:63
void * UNKNOWN
Definition: ks.h:2676
if(dx< 0)
Definition: linetemp.h:194
POINT cp
Definition: magnifier.c:59
struct task_struct * current
Definition: linux.c:32
static IHTMLWindow2 * window
Definition: events.c:77
#define NGROUPS
Definition: netname.c:56
int netname2user(netname, uid_t *uidp, gid_t *gidp, int *gidlenp, gid_t *gidlist)
Definition: netnamer.c:67
static Real area(Real A[2], Real B[2], Real C[2])
Definition: polyDBG.cc:50
#define long
Definition: qsort.c:33
struct opaque_auth xp_verf
Definition: svc.h:121
u_int32_t adc_nickname
Definition: auth_des.h:74
struct authdes_fullname adc_fullname
Definition: auth_des.h:72
enum authdes_namekind adc_namekind
Definition: auth_des.h:71
u_int32_t adv_int_u
Definition: auth_des.h:88
Definition: svc_auth_des.c:77
u_int window
Definition: svc_auth_des.c:80
des_block key
Definition: svc_auth_des.c:78
char * localcred
Definition: svc_auth_des.c:82
struct timeval laststamp
Definition: svc_auth_des.c:81
char * rname
Definition: svc_auth_des.c:79
Definition: copy.c:22
Definition: name.c:39
Definition: xdr.h:332
u_int n_len
Definition: xdr.h:333
char * n_bytes
Definition: xdr.h:334
Definition: ps.c:97
Definition: svc.h:132
void * rq_clntcred
Definition: svc.h:138
SVCXPRT * rq_xprt
Definition: svc.h:139
Definition: fake.h:14
#define debug(msg)
Definition: svc_auth_des.c:68
#define BEFORE(t1, t2)
Definition: svc_auth_des.c:71
static void cache_init()
Definition: svc_auth_des.c:352
u_long ncachehits
Definition: svc_auth_des.c:97
static short * authdes_lru
Definition: svc_auth_des.c:85
#define USEC_PER_SEC
Definition: svc_auth_des.c:70
int key_decryptsession_pk(const char *, netobj *, des_block *)
u_long ncachereplays
Definition: svc_auth_des.c:98
enum auth_stat _svcauth_des(struct svc_req *rqst, struct rpc_msg *msg)
Definition: svc_auth_des.c:106
#define AUTHDES_CACHESZ
Definition: svc_auth_des.c:76
static struct cache_entry * authdes_cache
Definition: svc_auth_des.c:84
static void invalidate()
static void cache_ref()
static short cache_victim()
Definition: svc_auth_des.c:375
u_long ncachemisses
Definition: svc_auth_des.c:99
static short cache_spot()
static struct @191 svcauthdes_stats
struct des_block::@194 key
#define IXDR_GET_ENUM(buf, t)
Definition: xdr.h:276
#define IXDR_GET_U_LONG(buf)
Definition: xdr.h:277
#define BYTES_PER_XDR_UNIT
Definition: xdr.h:93
#define IXDR_GET_LONG(buf)
Definition: xdr.h:272
#define IXDR_PUT_LONG(buf, v)
Definition: xdr.h:273
#define RNDUP(x)
Definition: xdr.h:94