1 /* windows/lib/cacheapi.h */
2 /*
3  * Copyright 1997 by the Regents of the University of Michigan
4  *
5  * This software is being provided to you, the LICENSEE, by the
6  * Regents of the University of Michigan (UM) under the following
7  * license.  By obtaining, using and/or copying this software, you agree
8  * that you have read, understood, and will comply with these terms and
9  * conditions:
10  *
11  * Permission to use, copy, modify and distribute this software and its
12  * documentation for any purpose and without fee or royalty is hereby
13  * granted, provided that you agree to comply with the following copyright
14  * notice and statements, including the disclaimer, and that the same
15  * appear on ALL copies of the software and documentation, including
16  * modifications that you make for internal use or for distribution:
17  *
18  * Copyright 1997 by the Regents of the University of Michigan.
19  * All rights reserved.
20  *
21  * THIS SOFTWARE IS PROVIDED "AS IS", AND UM MAKES NO REPRESENTATIONS
22  * OR WARRANTIES, EXPRESS OR IMPLIED.  By way of example, but not
23  * limitation, UM MAKES NO REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY
24  * OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED
25  * SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,
26  * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
27  *
28  * The name of the University of Michigan or UM may NOT be used in
29  * advertising or publicity pertaining to distribution of the software.
30  * Title to copyright in this software and any associated documentation
31  * shall at all times remain with UM, and USER agrees to preserve same.
32  *
33  * The University of Michigan
34  * c/o Steve Rothwell <sgr@umich.edu>
35  * 535 W. William Street
36  * Ann Arbor, Michigan 48013-4943
37  * U.S.A.
38  */
39 
40 /*
41 **  CacheAPI.h
42 **
43 **      The externally visible functions and data structures
44 **      for the Kerberos Common Cache DLL
45 **      This should be the ONLY externally visible file.
46 **      This is ALL anyone should need to call the API.
47 **
48 **
49 */
50 
51 #ifndef Krb_CCacheAPI_h_
52 #define Krb_CCacheAPI_h_
53 
54 #include <windows.h>
55 
56 //typedef int cc_int32;
57 #define cc_int32  long
58 #define cc_uint32 unsigned long
59 
60 typedef cc_int32  cc_time_t;
61 
62 #define CC_API_VER_1	1
63 #define CC_API_VER_2	2
64 
65 //enum {
66 //	CC_API_VER_1 = 1,
67 //	CC_API_VER_2 = 2
68 //};
69 
70 #define CCACHE_API __declspec(dllexport) cc_int32
71 
72 /*
73 ** The Official Error Codes
74 */
75 #define CC_NOERROR           0
76 #define CC_BADNAME           1
77 #define CC_NOTFOUND          2
78 #define CC_END               3
79 #define CC_IO                4
80 #define CC_WRITE             5
81 #define CC_NOMEM             6
82 #define CC_FORMAT            7
83 #define CC_LOCKED            8
84 #define CC_BAD_API_VERSION   9
85 #define CC_NO_EXIST          10
86 #define CC_NOT_SUPP          11
87 #define CC_BAD_PARM          12
88 #define CC_ERR_CACHE_ATTACH  13
89 #define CC_ERR_CACHE_RELEASE 14
90 #define CC_ERR_CACHE_FULL    15
91 #define CC_ERR_CRED_VERSION  16
92 
93 /*
94 ** types, structs, & constants
95 */
96 // Flag bits promised by Ted "RSN"
97 #define CC_FLAGS_RESERVED 0xFFFFFFFF
98 
99 typedef cc_uint32 cc_nc_flags;       // set via constants above
100 
101 typedef struct opaque_dll_control_block_type* apiCB;
102 typedef struct opaque_ccache_pointer_type* ccache_p;
103 typedef struct opaque_credential_iterator_type* ccache_cit;
104 
105 typedef struct _cc_data
106 {
107     cc_uint32       type;		// should be one of _cc_data_type
108     cc_uint32       length;
109     unsigned char*  data;		// the proverbial bag-o-bits
110 } cc_data;
111 
112 // V5 Credentials
113 typedef struct _cc_creds {
114     char*           client;
115     char*           server;
116     cc_data         keyblock;
117     cc_time_t       authtime;
118     cc_time_t       starttime;
119     cc_time_t       endtime;
120     cc_time_t       renew_till;
121     cc_uint32       is_skey;
122     cc_uint32       ticket_flags;
123     cc_data **  addresses;
124     cc_data         ticket;
125     cc_data         second_ticket;
126     cc_data **  authdata;
127 } cc_creds;
128 
129 
130 typedef union cred_ptr_union_type {
131     cc_creds*    pV5Cred;
132 } cred_ptr_union;
133 
134 typedef struct cred_union_type {
135     cc_int32        cred_type;
136     cred_ptr_union  cred;
137 } cred_union;
138 
139 typedef struct _infoNC {
140     char*     name;
141     char*     principal;
142     cc_int32  vers;
143 } infoNC;
144 
145 /*
146 ** The official (externally visible) API
147 */
148 
149 #ifdef __cplusplus
150 extern "C" /* this entire list of functions */
151 {
152 #endif /* __cplusplus */
153 
154 /*
155 ** Main cache routines : initialize, shutdown, get_cache_names, & get_change_time
156 */
157 CCACHE_API
158 cc_initialize(
159     apiCB** cc_ctx,           // <  DLL's primary control structure.
160                               //    returned here, passed everywhere else
161     cc_int32 api_version,     // >  ver supported by caller (use CC_API_VER_1)
162     cc_int32*  api_supported, // <  if ~NULL, max ver supported by DLL
163     const char** vendor       // <  if ~NULL, vendor name in read only C string
164     );
165 
166 CCACHE_API
167 cc_shutdown(
168     apiCB** cc_ctx            // <> DLL's primary control structure. NULL after call.
169     );
170 
171 CCACHE_API
172 cc_get_change_time(
173     apiCB* cc_ctx,       // >  DLL's primary control structure
174     cc_time_t* time      // <  time of last change to main cache
175     );
176 
177 /*
178 ** Named Cache (NC) routines
179 **   create, open, close, destroy, get_principal, get_cred_version, &
180 **   lock_request
181 **
182 ** Multiple NCs are allowed within the main cache.  Each has a Name and
183 ** kerberos version # (V5).  Caller gets "ccache_ptr"s for NCs.
184 */
185 CCACHE_API
186 cc_create(
187     apiCB* cc_ctx,          // >  DLL's primary control structure
188     const char* name,       // >  name of cache to be [destroyed if exists, then] created
189     const char* principal,
190     cc_int32 vers,          // >  ticket version (CC_CRED_V5)
191     cc_uint32 cc_flags,     // >  options
192     ccache_p** ccache_ptr   // <  NC control structure
193     );
194 
195 CCACHE_API
196 cc_open(
197     apiCB* cc_ctx,          // >  DLL's primary control structure
198     const char* name,       // >  name of pre-created cache
199     cc_int32 vers,          // >  ticket version (CC_CRED_V5)
200     cc_uint32 cc_flags,     // >  options
201     ccache_p** ccache_ptr   // <  NC control structure
202     );
203 
204 CCACHE_API
205 cc_close(
206     apiCB* cc_ctx,         // >  DLL's primary control structure
207     ccache_p** ccache_ptr  // <> NC control structure. NULL after call.
208     );
209 
210 CCACHE_API
211 cc_destroy(
212     apiCB* cc_ctx,         // >  DLL's primary control structure
213     ccache_p** ccache_ptr  // <> NC control structure. NULL after call.
214     );
215 
216 /*
217 ** Ways to get information about the NCs
218 */
219 
220 CCACHE_API
221 cc_seq_fetch_NCs_begin(
222     apiCB* cc_ctx,
223     ccache_cit** itNCs
224     );
225 
226 CCACHE_API
227 cc_seq_fetch_NCs_end(
228     apiCB* cc_ctx,
229     ccache_cit** itNCs
230     );
231 
232 CCACHE_API
233 cc_seq_fetch_NCs_next(
234     apiCB* cc_ctx,
235     ccache_p** ccache_ptr,
236     ccache_cit* itNCs
237     );
238 
239 CCACHE_API
240 cc_seq_fetch_NCs(
241     apiCB* cc_ctx,         // >  DLL's primary control structure
242     ccache_p** ccache_ptr, // <  NC control structure (free via cc_close())
243     ccache_cit** itNCs     // <> iterator used by DLL,
244                            //    set to NULL before first call
245                            //    returned NULL at CC_END
246     );
247 
248 CCACHE_API
249 cc_get_NC_info(
250     apiCB* cc_ctx,          // >  DLL's primary control structure
251     struct _infoNC*** ppNCi // <  (NULL before call) null terminated,
252                             //    list of a structs (free via cc_free_infoNC())
253     );
254 
255 CCACHE_API
256 cc_free_NC_info(
257     apiCB* cc_ctx,
258     struct _infoNC*** ppNCi // <  free list of structs returned by
259                             //    cc_get_cache_names().  set to NULL on return
260     );
261 
262 /*
263 ** Functions that provide distinguishing characteristics of NCs.
264 */
265 
266 CCACHE_API
267 cc_get_name(
268     apiCB* cc_ctx,              // > DLL's primary control structure
269     const ccache_p* ccache_ptr, // > NC control structure
270     char** name                 // < name of NC associated with ccache_ptr
271                                 //   (free via cc_free_name())
272     );
273 
274 CCACHE_API
275 cc_set_principal(
276     apiCB* cc_ctx,                  // > DLL's primary control structure
277     const ccache_p* ccache_pointer, // > NC control structure
278     const cc_int32 vers,
279     const char* principal           // > name of principal associated with NC
280                                     //   Free via cc_free_principal()
281     );
282 
283 CCACHE_API
284 cc_get_principal(
285     apiCB* cc_ctx,                  // > DLL's primary control structure
286     const ccache_p* ccache_pointer, // > NC control structure
287     char** principal                // < name of principal associated with NC
288                                     //   Free via cc_free_principal()
289     );
290 
291 CCACHE_API
292 cc_get_cred_version(
293     apiCB* cc_ctx,              // > DLL's primary control structure
294     const ccache_p* ccache_ptr, // > NC control structure
295     cc_int32* vers              // < ticket version associated with NC
296     );
297 
298 #define CC_LOCK_UNLOCK   1
299 #define CC_LOCK_READER   2
300 #define CC_LOCK_WRITER   3
301 #define CC_LOCK_NOBLOCK 16
302 
303 CCACHE_API
304 cc_lock_request(
305     apiCB* cc_ctx,     	        // > DLL's primary control structure
306     const ccache_p* ccache_ptr, // > NC control structure
307     const cc_int32 lock_type    // > one (or combination) of above defined
308                                 //   lock types
309     );
310 
311 /*
312 ** Credentials routines (work within an NC)
313 ** store, remove_cred, seq_fetch_creds
314 */
315 CCACHE_API
316 cc_store(
317     apiCB* cc_ctx,               // > DLL's primary control structure
318     ccache_p* ccache_ptr,        // > NC control structure
319     const cred_union creds       // > credentials to be copied into NC
320     );
321 
322 CCACHE_API
323 cc_remove_cred(
324     apiCB* cc_ctx,            // > DLL's primary control structure
325     ccache_p* ccache_ptr,     // > NC control structure
326     const cred_union cred     // > credentials to remove from NC
327     );
328 
329 CCACHE_API
330 cc_seq_fetch_creds(
331     apiCB* cc_ctx,              // > DLL's primary control structure
332     const ccache_p* ccache_ptr, // > NC control structure
333     cred_union** creds,         // < filled in by DLL, free via cc_free_creds()
334     ccache_cit** itCreds        // <> iterator used by DLL, set to NULL
335                                 //    before first call -- Also NULL for final
336                                 //    call if loop ends before CC_END
337     );
338 
339 CCACHE_API
340 cc_seq_fetch_creds_begin(
341     apiCB* cc_ctx,
342     const ccache_p* ccache_ptr,
343     ccache_cit** itCreds
344     );
345 
346 CCACHE_API
347 cc_seq_fetch_creds_end(
348     apiCB* cc_ctx,
349     ccache_cit** itCreds
350     );
351 
352 CCACHE_API
353 cc_seq_fetch_creds_next(
354     apiCB* cc_ctx,
355     cred_union** cred,
356     ccache_cit* itCreds
357     );
358 
359 /*
360 ** methods of liberation,
361 ** or freeing space via the free that goes with the malloc used to get it
362 ** It's important to use the free carried in the DLL, not the one supplied
363 ** by your compiler vendor.
364 **
365 ** freeing a NULL pointer is not treated as an error
366 */
367 CCACHE_API
368 cc_free_principal(
369     apiCB* cc_ctx,   // >  DLL's primary control structure
370     char** principal // <> ptr to principal to be freed, returned as NULL
371                      //    (from cc_get_principal())
372     );
373 
374 CCACHE_API
375 cc_free_name(
376     apiCB* cc_ctx,   // >  DLL's primary control structure
377     char** name      // <> ptr to name to be freed, returned as NULL
378                      //    (from cc_get_name())
379     );
380 
381 CCACHE_API
382 cc_free_creds(
383     apiCB* cc_ctx,     // > DLL's primary control structure
384     cred_union** pCred // <> cred (from cc_seq_fetch_creds()) to be freed
385                        //    Returned as NULL.
386     );
387 
388 #ifdef __cplusplus
389 } /* end extern "C" */
390 #endif /* __cplusplus */
391 
392 #endif /* Krb_CCacheAPI_h_ */
393