xref: /freebsd-src/crypto/heimdal/kcm/glue.c (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1c19800e8SDoug Rabson /*
2c19800e8SDoug Rabson  * Copyright (c) 2005, PADL Software Pty Ltd.
3c19800e8SDoug Rabson  * All rights reserved.
4c19800e8SDoug Rabson  *
5c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
6c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
7c19800e8SDoug Rabson  * are met:
8c19800e8SDoug Rabson  *
9c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
10c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
11c19800e8SDoug Rabson  *
12c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
13c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
14c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
15c19800e8SDoug Rabson  *
16c19800e8SDoug Rabson  * 3. Neither the name of PADL Software nor the names of its contributors
17c19800e8SDoug Rabson  *    may be used to endorse or promote products derived from this software
18c19800e8SDoug Rabson  *    without specific prior written permission.
19c19800e8SDoug Rabson  *
20c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
21c19800e8SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c19800e8SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
24c19800e8SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c19800e8SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c19800e8SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c19800e8SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c19800e8SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c19800e8SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c19800e8SDoug Rabson  * SUCH DAMAGE.
31c19800e8SDoug Rabson  */
32c19800e8SDoug Rabson 
33c19800e8SDoug Rabson #include "kcm_locl.h"
34c19800e8SDoug Rabson 
35*ae771770SStanislav Sedov RCSID("$Id$");
36c19800e8SDoug Rabson 
37c19800e8SDoug Rabson /*
38c19800e8SDoug Rabson  * Server-side loopback glue for credentials cache operations; this
39c19800e8SDoug Rabson  * must be initialized with kcm_internal_ccache(), it is not for real
40c19800e8SDoug Rabson  * use. This entire file assumes the cache is locked, it does not do
41c19800e8SDoug Rabson  * any concurrency checking for multithread applications.
42c19800e8SDoug Rabson  */
43c19800e8SDoug Rabson 
44c19800e8SDoug Rabson #define KCMCACHE(X)	((kcm_ccache)(X)->data.data)
45c19800e8SDoug Rabson #define CACHENAME(X)	(KCMCACHE(X)->name)
46c19800e8SDoug Rabson 
47c19800e8SDoug Rabson static const char *
kcmss_get_name(krb5_context context,krb5_ccache id)48c19800e8SDoug Rabson kcmss_get_name(krb5_context context,
49c19800e8SDoug Rabson 	       krb5_ccache id)
50c19800e8SDoug Rabson {
51c19800e8SDoug Rabson     return CACHENAME(id);
52c19800e8SDoug Rabson }
53c19800e8SDoug Rabson 
54c19800e8SDoug Rabson static krb5_error_code
kcmss_resolve(krb5_context context,krb5_ccache * id,const char * res)55c19800e8SDoug Rabson kcmss_resolve(krb5_context context, krb5_ccache *id, const char *res)
56c19800e8SDoug Rabson {
57c19800e8SDoug Rabson     return KRB5_FCC_INTERNAL;
58c19800e8SDoug Rabson }
59c19800e8SDoug Rabson 
60c19800e8SDoug Rabson static krb5_error_code
kcmss_gen_new(krb5_context context,krb5_ccache * id)61c19800e8SDoug Rabson kcmss_gen_new(krb5_context context, krb5_ccache *id)
62c19800e8SDoug Rabson {
63c19800e8SDoug Rabson     return KRB5_FCC_INTERNAL;
64c19800e8SDoug Rabson }
65c19800e8SDoug Rabson 
66c19800e8SDoug Rabson static krb5_error_code
kcmss_initialize(krb5_context context,krb5_ccache id,krb5_principal primary_principal)67c19800e8SDoug Rabson kcmss_initialize(krb5_context context,
68c19800e8SDoug Rabson 		 krb5_ccache id,
69c19800e8SDoug Rabson 		 krb5_principal primary_principal)
70c19800e8SDoug Rabson {
71c19800e8SDoug Rabson     krb5_error_code ret;
72c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
73c19800e8SDoug Rabson 
74c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
75c19800e8SDoug Rabson 
76c19800e8SDoug Rabson     ret = kcm_zero_ccache_data_internal(context, c);
77c19800e8SDoug Rabson     if (ret)
78c19800e8SDoug Rabson 	return ret;
79c19800e8SDoug Rabson 
80c19800e8SDoug Rabson     ret = krb5_copy_principal(context, primary_principal,
81c19800e8SDoug Rabson 			      &c->client);
82c19800e8SDoug Rabson 
83c19800e8SDoug Rabson     return ret;
84c19800e8SDoug Rabson }
85c19800e8SDoug Rabson 
86c19800e8SDoug Rabson static krb5_error_code
kcmss_close(krb5_context context,krb5_ccache id)87c19800e8SDoug Rabson kcmss_close(krb5_context context,
88c19800e8SDoug Rabson 	    krb5_ccache id)
89c19800e8SDoug Rabson {
90c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
91c19800e8SDoug Rabson 
92c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
93c19800e8SDoug Rabson 
94c19800e8SDoug Rabson     id->data.data = NULL;
95c19800e8SDoug Rabson     id->data.length = 0;
96c19800e8SDoug Rabson 
97c19800e8SDoug Rabson     return 0;
98c19800e8SDoug Rabson }
99c19800e8SDoug Rabson 
100c19800e8SDoug Rabson static krb5_error_code
kcmss_destroy(krb5_context context,krb5_ccache id)101c19800e8SDoug Rabson kcmss_destroy(krb5_context context,
102c19800e8SDoug Rabson 	      krb5_ccache id)
103c19800e8SDoug Rabson {
104c19800e8SDoug Rabson     krb5_error_code ret;
105c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
106c19800e8SDoug Rabson 
107c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
108c19800e8SDoug Rabson 
109c19800e8SDoug Rabson     ret = kcm_ccache_destroy(context, CACHENAME(id));
110c19800e8SDoug Rabson 
111c19800e8SDoug Rabson     return ret;
112c19800e8SDoug Rabson }
113c19800e8SDoug Rabson 
114c19800e8SDoug Rabson static krb5_error_code
kcmss_store_cred(krb5_context context,krb5_ccache id,krb5_creds * creds)115c19800e8SDoug Rabson kcmss_store_cred(krb5_context context,
116c19800e8SDoug Rabson 		 krb5_ccache id,
117c19800e8SDoug Rabson 		 krb5_creds *creds)
118c19800e8SDoug Rabson {
119c19800e8SDoug Rabson     krb5_error_code ret;
120c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
121c19800e8SDoug Rabson     krb5_creds *tmp;
122c19800e8SDoug Rabson 
123c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
124c19800e8SDoug Rabson 
125c19800e8SDoug Rabson     ret = kcm_ccache_store_cred_internal(context, c, creds, 1, &tmp);
126c19800e8SDoug Rabson 
127c19800e8SDoug Rabson     return ret;
128c19800e8SDoug Rabson }
129c19800e8SDoug Rabson 
130c19800e8SDoug Rabson static krb5_error_code
kcmss_retrieve(krb5_context context,krb5_ccache id,krb5_flags which,const krb5_creds * mcred,krb5_creds * creds)131c19800e8SDoug Rabson kcmss_retrieve(krb5_context context,
132c19800e8SDoug Rabson 	       krb5_ccache id,
133c19800e8SDoug Rabson 	       krb5_flags which,
134c19800e8SDoug Rabson 	       const krb5_creds *mcred,
135c19800e8SDoug Rabson 	       krb5_creds *creds)
136c19800e8SDoug Rabson {
137c19800e8SDoug Rabson     krb5_error_code ret;
138c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
139c19800e8SDoug Rabson     krb5_creds *credp;
140c19800e8SDoug Rabson 
141c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
142c19800e8SDoug Rabson 
143c19800e8SDoug Rabson     ret = kcm_ccache_retrieve_cred_internal(context, c, which,
144c19800e8SDoug Rabson 					    mcred, &credp);
145c19800e8SDoug Rabson     if (ret)
146c19800e8SDoug Rabson 	return ret;
147c19800e8SDoug Rabson 
148c19800e8SDoug Rabson     ret = krb5_copy_creds_contents(context, credp, creds);
149c19800e8SDoug Rabson     if (ret)
150c19800e8SDoug Rabson 	return ret;
151c19800e8SDoug Rabson 
152c19800e8SDoug Rabson     return 0;
153c19800e8SDoug Rabson }
154c19800e8SDoug Rabson 
155c19800e8SDoug Rabson static krb5_error_code
kcmss_get_principal(krb5_context context,krb5_ccache id,krb5_principal * principal)156c19800e8SDoug Rabson kcmss_get_principal(krb5_context context,
157c19800e8SDoug Rabson 		    krb5_ccache id,
158c19800e8SDoug Rabson 		    krb5_principal *principal)
159c19800e8SDoug Rabson {
160c19800e8SDoug Rabson     krb5_error_code ret;
161c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
162c19800e8SDoug Rabson 
163c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
164c19800e8SDoug Rabson 
165c19800e8SDoug Rabson     ret = krb5_copy_principal(context, c->client,
166c19800e8SDoug Rabson 			      principal);
167c19800e8SDoug Rabson 
168c19800e8SDoug Rabson     return ret;
169c19800e8SDoug Rabson }
170c19800e8SDoug Rabson 
171c19800e8SDoug Rabson static krb5_error_code
kcmss_get_first(krb5_context context,krb5_ccache id,krb5_cc_cursor * cursor)172c19800e8SDoug Rabson kcmss_get_first (krb5_context context,
173c19800e8SDoug Rabson 		 krb5_ccache id,
174c19800e8SDoug Rabson 		 krb5_cc_cursor *cursor)
175c19800e8SDoug Rabson {
176c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
177c19800e8SDoug Rabson 
178c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
179c19800e8SDoug Rabson 
180c19800e8SDoug Rabson     *cursor = c->creds;
181c19800e8SDoug Rabson 
182c19800e8SDoug Rabson     return (*cursor == NULL) ? KRB5_CC_END : 0;
183c19800e8SDoug Rabson }
184c19800e8SDoug Rabson 
185c19800e8SDoug Rabson static krb5_error_code
kcmss_get_next(krb5_context context,krb5_ccache id,krb5_cc_cursor * cursor,krb5_creds * creds)186c19800e8SDoug Rabson kcmss_get_next (krb5_context context,
187c19800e8SDoug Rabson 		krb5_ccache id,
188c19800e8SDoug Rabson 		krb5_cc_cursor *cursor,
189c19800e8SDoug Rabson 		krb5_creds *creds)
190c19800e8SDoug Rabson {
191c19800e8SDoug Rabson     krb5_error_code ret;
192c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
193c19800e8SDoug Rabson 
194c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
195c19800e8SDoug Rabson 
196c19800e8SDoug Rabson     ret = krb5_copy_creds_contents(context,
197c19800e8SDoug Rabson 				   &((struct kcm_creds *)cursor)->cred,
198c19800e8SDoug Rabson 				   creds);
199c19800e8SDoug Rabson     if (ret)
200c19800e8SDoug Rabson 	return ret;
201c19800e8SDoug Rabson 
202c19800e8SDoug Rabson     *cursor = ((struct kcm_creds *)cursor)->next;
203c19800e8SDoug Rabson     if (*cursor == 0)
204c19800e8SDoug Rabson 	ret = KRB5_CC_END;
205c19800e8SDoug Rabson 
206c19800e8SDoug Rabson     return ret;
207c19800e8SDoug Rabson }
208c19800e8SDoug Rabson 
209c19800e8SDoug Rabson static krb5_error_code
kcmss_end_get(krb5_context context,krb5_ccache id,krb5_cc_cursor * cursor)210c19800e8SDoug Rabson kcmss_end_get (krb5_context context,
211c19800e8SDoug Rabson 	       krb5_ccache id,
212c19800e8SDoug Rabson 	       krb5_cc_cursor *cursor)
213c19800e8SDoug Rabson {
214c19800e8SDoug Rabson     *cursor = NULL;
215c19800e8SDoug Rabson     return 0;
216c19800e8SDoug Rabson }
217c19800e8SDoug Rabson 
218c19800e8SDoug Rabson static krb5_error_code
kcmss_remove_cred(krb5_context context,krb5_ccache id,krb5_flags which,krb5_creds * cred)219c19800e8SDoug Rabson kcmss_remove_cred(krb5_context context,
220c19800e8SDoug Rabson 		  krb5_ccache id,
221c19800e8SDoug Rabson 		  krb5_flags which,
222c19800e8SDoug Rabson 		  krb5_creds *cred)
223c19800e8SDoug Rabson {
224c19800e8SDoug Rabson     krb5_error_code ret;
225c19800e8SDoug Rabson     kcm_ccache c = KCMCACHE(id);
226c19800e8SDoug Rabson 
227c19800e8SDoug Rabson     KCM_ASSERT_VALID(c);
228c19800e8SDoug Rabson 
229c19800e8SDoug Rabson     ret = kcm_ccache_remove_cred_internal(context, c, which, cred);
230c19800e8SDoug Rabson 
231c19800e8SDoug Rabson     return ret;
232c19800e8SDoug Rabson }
233c19800e8SDoug Rabson 
234c19800e8SDoug Rabson static krb5_error_code
kcmss_set_flags(krb5_context context,krb5_ccache id,krb5_flags flags)235c19800e8SDoug Rabson kcmss_set_flags(krb5_context context,
236c19800e8SDoug Rabson 		krb5_ccache id,
237c19800e8SDoug Rabson 		krb5_flags flags)
238c19800e8SDoug Rabson {
239c19800e8SDoug Rabson     return 0;
240c19800e8SDoug Rabson }
241c19800e8SDoug Rabson 
242c19800e8SDoug Rabson static krb5_error_code
kcmss_get_version(krb5_context context,krb5_ccache id)243c19800e8SDoug Rabson kcmss_get_version(krb5_context context,
244c19800e8SDoug Rabson 		  krb5_ccache id)
245c19800e8SDoug Rabson {
246c19800e8SDoug Rabson     return 0;
247c19800e8SDoug Rabson }
248c19800e8SDoug Rabson 
249c19800e8SDoug Rabson static const krb5_cc_ops krb5_kcmss_ops = {
250*ae771770SStanislav Sedov     KRB5_CC_OPS_VERSION,
251c19800e8SDoug Rabson     "KCM",
252c19800e8SDoug Rabson     kcmss_get_name,
253c19800e8SDoug Rabson     kcmss_resolve,
254c19800e8SDoug Rabson     kcmss_gen_new,
255c19800e8SDoug Rabson     kcmss_initialize,
256c19800e8SDoug Rabson     kcmss_destroy,
257c19800e8SDoug Rabson     kcmss_close,
258c19800e8SDoug Rabson     kcmss_store_cred,
259c19800e8SDoug Rabson     kcmss_retrieve,
260c19800e8SDoug Rabson     kcmss_get_principal,
261c19800e8SDoug Rabson     kcmss_get_first,
262c19800e8SDoug Rabson     kcmss_get_next,
263c19800e8SDoug Rabson     kcmss_end_get,
264c19800e8SDoug Rabson     kcmss_remove_cred,
265c19800e8SDoug Rabson     kcmss_set_flags,
266c19800e8SDoug Rabson     kcmss_get_version
267c19800e8SDoug Rabson };
268c19800e8SDoug Rabson 
269c19800e8SDoug Rabson krb5_error_code
kcm_internal_ccache(krb5_context context,kcm_ccache c,krb5_ccache id)270c19800e8SDoug Rabson kcm_internal_ccache(krb5_context context,
271c19800e8SDoug Rabson 		    kcm_ccache c,
272c19800e8SDoug Rabson 		    krb5_ccache id)
273c19800e8SDoug Rabson {
274c19800e8SDoug Rabson     id->ops = &krb5_kcmss_ops;
275c19800e8SDoug Rabson     id->data.length = sizeof(*c);
276c19800e8SDoug Rabson     id->data.data = c;
277c19800e8SDoug Rabson 
278c19800e8SDoug Rabson     return 0;
279c19800e8SDoug Rabson }
280c19800e8SDoug Rabson 
281