1b528cefcSMark Murray /*
2ae771770SStanislav Sedov * Copyright (c) 1997 - 1999 Kungliga Tekniska Högskolan
3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden).
4b528cefcSMark Murray * All rights reserved.
5b528cefcSMark Murray *
6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without
7b528cefcSMark Murray * modification, are permitted provided that the following conditions
8b528cefcSMark Murray * are met:
9b528cefcSMark Murray *
10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright
11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer.
12b528cefcSMark Murray *
13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright
14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the
15b528cefcSMark Murray * documentation and/or other materials provided with the distribution.
16b528cefcSMark Murray *
17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors
18b528cefcSMark Murray * may be used to endorse or promote products derived from this software
19b528cefcSMark Murray * without specific prior written permission.
20b528cefcSMark Murray *
21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31b528cefcSMark Murray * SUCH DAMAGE.
32b528cefcSMark Murray */
33b528cefcSMark Murray
34b528cefcSMark Murray #include "kadm5_locl.h"
35b528cefcSMark Murray
36ae771770SStanislav Sedov RCSID("$Id$");
37*780f663dSCy Schubert #define CHECK(e) do { if (e) return EINVAL; } while (0)
38b528cefcSMark Murray
39b528cefcSMark Murray kadm5_ret_t
kadm5_store_key_data(krb5_storage * sp,krb5_key_data * key)40b528cefcSMark Murray kadm5_store_key_data(krb5_storage *sp,
41b528cefcSMark Murray krb5_key_data *key)
42b528cefcSMark Murray {
43b528cefcSMark Murray krb5_data c;
44*780f663dSCy Schubert CHECK(krb5_store_int32(sp, key->key_data_ver));
45*780f663dSCy Schubert CHECK(krb5_store_int32(sp, key->key_data_kvno));
46*780f663dSCy Schubert CHECK(krb5_store_int32(sp, key->key_data_type[0]));
47b528cefcSMark Murray c.length = key->key_data_length[0];
48b528cefcSMark Murray c.data = key->key_data_contents[0];
49*780f663dSCy Schubert CHECK(krb5_store_data(sp, c));
50*780f663dSCy Schubert CHECK(krb5_store_int32(sp, key->key_data_type[1]));
51b528cefcSMark Murray c.length = key->key_data_length[1];
52b528cefcSMark Murray c.data = key->key_data_contents[1];
53*780f663dSCy Schubert CHECK(krb5_store_data(sp, c));
54b528cefcSMark Murray return 0;
55b528cefcSMark Murray }
56b528cefcSMark Murray
57b528cefcSMark Murray kadm5_ret_t
kadm5_ret_key_data(krb5_storage * sp,krb5_key_data * key)58b528cefcSMark Murray kadm5_ret_key_data(krb5_storage *sp,
59b528cefcSMark Murray krb5_key_data *key)
60b528cefcSMark Murray {
61*780f663dSCy Schubert kadm5_ret_t ret;
62b528cefcSMark Murray krb5_data c;
63b528cefcSMark Murray int32_t tmp;
64*780f663dSCy Schubert ret = krb5_ret_int32(sp, &tmp);
65*780f663dSCy Schubert if (ret == 0) {
66b528cefcSMark Murray key->key_data_ver = tmp;
67*780f663dSCy Schubert ret = krb5_ret_int32(sp, &tmp);
68*780f663dSCy Schubert }
69*780f663dSCy Schubert if (ret == 0) {
70b528cefcSMark Murray key->key_data_kvno = tmp;
71*780f663dSCy Schubert ret = krb5_ret_int32(sp, &tmp);
72*780f663dSCy Schubert }
73*780f663dSCy Schubert if (ret == 0) {
74b528cefcSMark Murray key->key_data_type[0] = tmp;
75*780f663dSCy Schubert ret = krb5_ret_data(sp, &c);
76*780f663dSCy Schubert }
77*780f663dSCy Schubert if (ret == 0) {
78b528cefcSMark Murray key->key_data_length[0] = c.length;
79b528cefcSMark Murray key->key_data_contents[0] = c.data;
80*780f663dSCy Schubert ret = krb5_ret_int32(sp, &tmp);
81*780f663dSCy Schubert }
82*780f663dSCy Schubert if (ret == 0) {
83b528cefcSMark Murray key->key_data_type[1] = tmp;
84*780f663dSCy Schubert ret = krb5_ret_data(sp, &c);
85*780f663dSCy Schubert }
86*780f663dSCy Schubert if (ret == 0) {
87b528cefcSMark Murray key->key_data_length[1] = c.length;
88b528cefcSMark Murray key->key_data_contents[1] = c.data;
89b528cefcSMark Murray return 0;
90b528cefcSMark Murray }
91*780f663dSCy Schubert return KADM5_FAILURE;
92*780f663dSCy Schubert }
93b528cefcSMark Murray
94b528cefcSMark Murray kadm5_ret_t
kadm5_store_tl_data(krb5_storage * sp,krb5_tl_data * tl)95b528cefcSMark Murray kadm5_store_tl_data(krb5_storage *sp,
96b528cefcSMark Murray krb5_tl_data *tl)
97b528cefcSMark Murray {
98b528cefcSMark Murray krb5_data c;
99*780f663dSCy Schubert CHECK(krb5_store_int32(sp, tl->tl_data_type));
100b528cefcSMark Murray c.length = tl->tl_data_length;
101b528cefcSMark Murray c.data = tl->tl_data_contents;
102*780f663dSCy Schubert CHECK(krb5_store_data(sp, c));
103b528cefcSMark Murray return 0;
104b528cefcSMark Murray }
105b528cefcSMark Murray
106b528cefcSMark Murray kadm5_ret_t
kadm5_ret_tl_data(krb5_storage * sp,krb5_tl_data * tl)107b528cefcSMark Murray kadm5_ret_tl_data(krb5_storage *sp,
108b528cefcSMark Murray krb5_tl_data *tl)
109b528cefcSMark Murray {
110b528cefcSMark Murray krb5_data c;
111b528cefcSMark Murray int32_t tmp;
112b528cefcSMark Murray krb5_ret_int32(sp, &tmp);
113b528cefcSMark Murray tl->tl_data_type = tmp;
114*780f663dSCy Schubert CHECK(krb5_ret_data(sp, &c));
115b528cefcSMark Murray tl->tl_data_length = c.length;
116b528cefcSMark Murray tl->tl_data_contents = c.data;
117b528cefcSMark Murray return 0;
118b528cefcSMark Murray }
119b528cefcSMark Murray
120b528cefcSMark Murray static kadm5_ret_t
store_principal_ent(krb5_storage * sp,kadm5_principal_ent_t princ,uint32_t mask)121b528cefcSMark Murray store_principal_ent(krb5_storage *sp,
122b528cefcSMark Murray kadm5_principal_ent_t princ,
123c19800e8SDoug Rabson uint32_t mask)
124b528cefcSMark Murray {
125b528cefcSMark Murray int i;
126b528cefcSMark Murray
127b528cefcSMark Murray if (mask & KADM5_PRINCIPAL)
128*780f663dSCy Schubert CHECK(krb5_store_principal(sp, princ->principal));
129b528cefcSMark Murray if (mask & KADM5_PRINC_EXPIRE_TIME)
130*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->princ_expire_time));
131b528cefcSMark Murray if (mask & KADM5_PW_EXPIRATION)
132*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->pw_expiration));
133b528cefcSMark Murray if (mask & KADM5_LAST_PWD_CHANGE)
134*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->last_pwd_change));
135b528cefcSMark Murray if (mask & KADM5_MAX_LIFE)
136*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->max_life));
137b528cefcSMark Murray if (mask & KADM5_MOD_NAME) {
138*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->mod_name != NULL));
139b528cefcSMark Murray if(princ->mod_name)
140*780f663dSCy Schubert CHECK(krb5_store_principal(sp, princ->mod_name));
141b528cefcSMark Murray }
142b528cefcSMark Murray if (mask & KADM5_MOD_TIME)
143*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->mod_date));
144b528cefcSMark Murray if (mask & KADM5_ATTRIBUTES)
145*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->attributes));
146b528cefcSMark Murray if (mask & KADM5_KVNO)
147*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->kvno));
148b528cefcSMark Murray if (mask & KADM5_MKVNO)
149*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->mkvno));
150b528cefcSMark Murray if (mask & KADM5_POLICY) {
151*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->policy != NULL));
152b528cefcSMark Murray if(princ->policy)
153*780f663dSCy Schubert CHECK(krb5_store_string(sp, princ->policy));
154b528cefcSMark Murray }
155b528cefcSMark Murray if (mask & KADM5_AUX_ATTRIBUTES)
156*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->aux_attributes));
157b528cefcSMark Murray if (mask & KADM5_MAX_RLIFE)
158*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->max_renewable_life));
159b528cefcSMark Murray if (mask & KADM5_LAST_SUCCESS)
160*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->last_success));
161b528cefcSMark Murray if (mask & KADM5_LAST_FAILED)
162*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->last_failed));
163b528cefcSMark Murray if (mask & KADM5_FAIL_AUTH_COUNT)
164*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->fail_auth_count));
165b528cefcSMark Murray if (mask & KADM5_KEY_DATA) {
166*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->n_key_data));
167b528cefcSMark Murray for(i = 0; i < princ->n_key_data; i++)
168*780f663dSCy Schubert CHECK(kadm5_store_key_data(sp, &princ->key_data[i]));
169b528cefcSMark Murray }
170b528cefcSMark Murray if (mask & KADM5_TL_DATA) {
171b528cefcSMark Murray krb5_tl_data *tp;
172b528cefcSMark Murray
173*780f663dSCy Schubert CHECK(krb5_store_int32(sp, princ->n_tl_data));
174b528cefcSMark Murray for(tp = princ->tl_data; tp; tp = tp->tl_data_next)
175*780f663dSCy Schubert CHECK(kadm5_store_tl_data(sp, tp));
176b528cefcSMark Murray }
177b528cefcSMark Murray return 0;
178b528cefcSMark Murray }
179b528cefcSMark Murray
180b528cefcSMark Murray
181b528cefcSMark Murray kadm5_ret_t
kadm5_store_principal_ent(krb5_storage * sp,kadm5_principal_ent_t princ)182b528cefcSMark Murray kadm5_store_principal_ent(krb5_storage *sp,
183b528cefcSMark Murray kadm5_principal_ent_t princ)
184b528cefcSMark Murray {
185b528cefcSMark Murray return store_principal_ent (sp, princ, ~0);
186b528cefcSMark Murray }
187b528cefcSMark Murray
188b528cefcSMark Murray kadm5_ret_t
kadm5_store_principal_ent_mask(krb5_storage * sp,kadm5_principal_ent_t princ,uint32_t mask)189b528cefcSMark Murray kadm5_store_principal_ent_mask(krb5_storage *sp,
190b528cefcSMark Murray kadm5_principal_ent_t princ,
191c19800e8SDoug Rabson uint32_t mask)
192b528cefcSMark Murray {
193*780f663dSCy Schubert kadm5_ret_t ret;
194*780f663dSCy Schubert
195*780f663dSCy Schubert ret = krb5_store_int32(sp, mask);
196*780f663dSCy Schubert if (ret == 0)
197*780f663dSCy Schubert ret = store_principal_ent (sp, princ, mask);
198*780f663dSCy Schubert return (ret);
199b528cefcSMark Murray }
200b528cefcSMark Murray
201b528cefcSMark Murray static kadm5_ret_t
ret_principal_ent(krb5_storage * sp,kadm5_principal_ent_t princ,uint32_t mask)202b528cefcSMark Murray ret_principal_ent(krb5_storage *sp,
203b528cefcSMark Murray kadm5_principal_ent_t princ,
204c19800e8SDoug Rabson uint32_t mask)
205b528cefcSMark Murray {
206b528cefcSMark Murray int i;
207b528cefcSMark Murray int32_t tmp;
208b528cefcSMark Murray
209b528cefcSMark Murray if (mask & KADM5_PRINCIPAL)
210*780f663dSCy Schubert CHECK(krb5_ret_principal(sp, &princ->principal));
211b528cefcSMark Murray if (mask & KADM5_PRINC_EXPIRE_TIME) {
212*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
213b528cefcSMark Murray princ->princ_expire_time = tmp;
214b528cefcSMark Murray }
215b528cefcSMark Murray if (mask & KADM5_PW_EXPIRATION) {
216*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
217b528cefcSMark Murray princ->pw_expiration = tmp;
218b528cefcSMark Murray }
219b528cefcSMark Murray if (mask & KADM5_LAST_PWD_CHANGE) {
220*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
221b528cefcSMark Murray princ->last_pwd_change = tmp;
222b528cefcSMark Murray }
223b528cefcSMark Murray if (mask & KADM5_MAX_LIFE) {
224*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
225b528cefcSMark Murray princ->max_life = tmp;
226b528cefcSMark Murray }
227b528cefcSMark Murray if (mask & KADM5_MOD_NAME) {
228*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
229*780f663dSCy Schubert if(tmp)
230*780f663dSCy Schubert CHECK(krb5_ret_principal(sp, &princ->mod_name));
231*780f663dSCy Schubert else
232b528cefcSMark Murray princ->mod_name = NULL;
233b528cefcSMark Murray }
234b528cefcSMark Murray if (mask & KADM5_MOD_TIME) {
235*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
236b528cefcSMark Murray princ->mod_date = tmp;
237b528cefcSMark Murray }
238b528cefcSMark Murray if (mask & KADM5_ATTRIBUTES) {
239*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
240b528cefcSMark Murray princ->attributes = tmp;
241b528cefcSMark Murray }
242b528cefcSMark Murray if (mask & KADM5_KVNO) {
243*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
244b528cefcSMark Murray princ->kvno = tmp;
245b528cefcSMark Murray }
246b528cefcSMark Murray if (mask & KADM5_MKVNO) {
247*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
248b528cefcSMark Murray princ->mkvno = tmp;
249b528cefcSMark Murray }
250b528cefcSMark Murray if (mask & KADM5_POLICY) {
251*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
252b528cefcSMark Murray if(tmp)
253*780f663dSCy Schubert CHECK(krb5_ret_string(sp, &princ->policy));
254b528cefcSMark Murray else
255b528cefcSMark Murray princ->policy = NULL;
256b528cefcSMark Murray }
257b528cefcSMark Murray if (mask & KADM5_AUX_ATTRIBUTES) {
258*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
259b528cefcSMark Murray princ->aux_attributes = tmp;
260b528cefcSMark Murray }
261b528cefcSMark Murray if (mask & KADM5_MAX_RLIFE) {
262*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
263b528cefcSMark Murray princ->max_renewable_life = tmp;
264b528cefcSMark Murray }
265b528cefcSMark Murray if (mask & KADM5_LAST_SUCCESS) {
266*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
267b528cefcSMark Murray princ->last_success = tmp;
268b528cefcSMark Murray }
269b528cefcSMark Murray if (mask & KADM5_LAST_FAILED) {
270*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
271b528cefcSMark Murray princ->last_failed = tmp;
272b528cefcSMark Murray }
273b528cefcSMark Murray if (mask & KADM5_FAIL_AUTH_COUNT) {
274*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
275b528cefcSMark Murray princ->fail_auth_count = tmp;
276b528cefcSMark Murray }
277b528cefcSMark Murray if (mask & KADM5_KEY_DATA) {
278*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
279b528cefcSMark Murray princ->n_key_data = tmp;
280b528cefcSMark Murray princ->key_data = malloc(princ->n_key_data * sizeof(*princ->key_data));
281ae771770SStanislav Sedov if (princ->key_data == NULL && princ->n_key_data != 0)
282c19800e8SDoug Rabson return ENOMEM;
283b528cefcSMark Murray for(i = 0; i < princ->n_key_data; i++)
284*780f663dSCy Schubert CHECK(kadm5_ret_key_data(sp, &princ->key_data[i]));
285b528cefcSMark Murray }
286b528cefcSMark Murray if (mask & KADM5_TL_DATA) {
287*780f663dSCy Schubert CHECK(krb5_ret_int32(sp, &tmp));
288b528cefcSMark Murray princ->n_tl_data = tmp;
289b528cefcSMark Murray princ->tl_data = NULL;
290b528cefcSMark Murray for(i = 0; i < princ->n_tl_data; i++){
291b528cefcSMark Murray krb5_tl_data *tp = malloc(sizeof(*tp));
292c19800e8SDoug Rabson if (tp == NULL)
293c19800e8SDoug Rabson return ENOMEM;
294*780f663dSCy Schubert CHECK(kadm5_ret_tl_data(sp, tp));
295b528cefcSMark Murray tp->tl_data_next = princ->tl_data;
296b528cefcSMark Murray princ->tl_data = tp;
297b528cefcSMark Murray }
298b528cefcSMark Murray }
299b528cefcSMark Murray return 0;
300b528cefcSMark Murray }
301b528cefcSMark Murray
302b528cefcSMark Murray kadm5_ret_t
kadm5_ret_principal_ent(krb5_storage * sp,kadm5_principal_ent_t princ)303b528cefcSMark Murray kadm5_ret_principal_ent(krb5_storage *sp,
304b528cefcSMark Murray kadm5_principal_ent_t princ)
305b528cefcSMark Murray {
306b528cefcSMark Murray return ret_principal_ent (sp, princ, ~0);
307b528cefcSMark Murray }
308b528cefcSMark Murray
309b528cefcSMark Murray kadm5_ret_t
kadm5_ret_principal_ent_mask(krb5_storage * sp,kadm5_principal_ent_t princ,uint32_t * mask)310b528cefcSMark Murray kadm5_ret_principal_ent_mask(krb5_storage *sp,
311b528cefcSMark Murray kadm5_principal_ent_t princ,
312c19800e8SDoug Rabson uint32_t *mask)
313b528cefcSMark Murray {
314*780f663dSCy Schubert kadm5_ret_t ret;
315b528cefcSMark Murray int32_t tmp;
316b528cefcSMark Murray
317*780f663dSCy Schubert ret = krb5_ret_int32 (sp, &tmp);
318*780f663dSCy Schubert if (ret) {
319*780f663dSCy Schubert *mask = 0;
320*780f663dSCy Schubert return (ret);
321*780f663dSCy Schubert }
322b528cefcSMark Murray *mask = tmp;
323b528cefcSMark Murray return ret_principal_ent (sp, princ, *mask);
324b528cefcSMark Murray }
325b528cefcSMark Murray
326b528cefcSMark Murray kadm5_ret_t
_kadm5_marshal_params(krb5_context context,kadm5_config_params * params,krb5_data * out)327b528cefcSMark Murray _kadm5_marshal_params(krb5_context context,
328b528cefcSMark Murray kadm5_config_params *params,
329b528cefcSMark Murray krb5_data *out)
330b528cefcSMark Murray {
331*780f663dSCy Schubert kadm5_ret_t ret;
332*780f663dSCy Schubert
333b528cefcSMark Murray krb5_storage *sp = krb5_storage_emem();
334b528cefcSMark Murray
335*780f663dSCy Schubert ret = krb5_store_int32(sp, params->mask & (KADM5_CONFIG_REALM));
336b528cefcSMark Murray
337*780f663dSCy Schubert if (ret == 0 && params->mask & KADM5_CONFIG_REALM)
338*780f663dSCy Schubert ret = krb5_store_string(sp, params->realm);
339*780f663dSCy Schubert if (ret == 0)
340b528cefcSMark Murray krb5_storage_to_data(sp, out);
341b528cefcSMark Murray krb5_storage_free(sp);
342b528cefcSMark Murray
343*780f663dSCy Schubert return (ret);
344b528cefcSMark Murray }
345b528cefcSMark Murray
346b528cefcSMark Murray kadm5_ret_t
_kadm5_unmarshal_params(krb5_context context,krb5_data * in,kadm5_config_params * params)347b528cefcSMark Murray _kadm5_unmarshal_params(krb5_context context,
348b528cefcSMark Murray krb5_data *in,
349b528cefcSMark Murray kadm5_config_params *params)
350b528cefcSMark Murray {
351ae771770SStanislav Sedov krb5_error_code ret;
352ae771770SStanislav Sedov krb5_storage *sp;
353c19800e8SDoug Rabson int32_t mask;
354b528cefcSMark Murray
355ae771770SStanislav Sedov sp = krb5_storage_from_data(in);
356ae771770SStanislav Sedov if (sp == NULL)
357ae771770SStanislav Sedov return ENOMEM;
358ae771770SStanislav Sedov
359ae771770SStanislav Sedov ret = krb5_ret_int32(sp, &mask);
360ae771770SStanislav Sedov if (ret)
361ae771770SStanislav Sedov goto out;
36291db8482SCy Schubert if (mask & KADM5_CONFIG_REALM & KADM5_CONFIG_DBNAME
36391db8482SCy Schubert & KADM5_CONFIG_ACL_FILE & KADM5_CONFIG_STASH_FILE) {
36491db8482SCy Schubert ret = EINVAL;
36591db8482SCy Schubert goto out;
36691db8482SCy Schubert }
367c19800e8SDoug Rabson params->mask = mask;
368b528cefcSMark Murray
36905bc50bdSCy Schubert if (params->mask & KADM5_CONFIG_REALM) {
370ae771770SStanislav Sedov ret = krb5_ret_string(sp, ¶ms->realm);
37105bc50bdSCy Schubert if (params->realm == NULL) {
37205bc50bdSCy Schubert ret = EINVAL;
37391db8482SCy Schubert goto out;
37491db8482SCy Schubert }
37591db8482SCy Schubert }
37691db8482SCy Schubert if (params->mask & KADM5_CONFIG_DBNAME) {
37791db8482SCy Schubert ret = krb5_ret_string(sp, ¶ms->dbname);
37891db8482SCy Schubert if (params->dbname == NULL) {
37991db8482SCy Schubert ret = EINVAL;
38091db8482SCy Schubert goto out;
38191db8482SCy Schubert }
38291db8482SCy Schubert }
38391db8482SCy Schubert if (params->mask & KADM5_CONFIG_ACL_FILE) {
38491db8482SCy Schubert ret = krb5_ret_string(sp, ¶ms->acl_file);
38591db8482SCy Schubert if (params->acl_file == NULL) {
38691db8482SCy Schubert ret = EINVAL;
38791db8482SCy Schubert goto out;
38891db8482SCy Schubert }
38991db8482SCy Schubert }
39091db8482SCy Schubert if (params->mask & KADM5_CONFIG_STASH_FILE) {
39191db8482SCy Schubert ret = krb5_ret_string(sp, ¶ms->stash_file);
39291db8482SCy Schubert if (params->stash_file == NULL) {
39391db8482SCy Schubert ret = EINVAL;
39405bc50bdSCy Schubert }
39505bc50bdSCy Schubert }
396ae771770SStanislav Sedov out:
397b528cefcSMark Murray krb5_storage_free(sp);
398b528cefcSMark Murray
399ae771770SStanislav Sedov return ret;
400b528cefcSMark Murray }
401