1*7f2fe78bSCy Schubert /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2*7f2fe78bSCy Schubert /*
3*7f2fe78bSCy Schubert * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
4*7f2fe78bSCy Schubert *
5*7f2fe78bSCy Schubert * $Header$
6*7f2fe78bSCy Schubert */
7*7f2fe78bSCy Schubert
8*7f2fe78bSCy Schubert #include <gssrpc/rpc.h>
9*7f2fe78bSCy Schubert #include <kadm5/admin.h>
10*7f2fe78bSCy Schubert #include <kadm5/kadm_rpc.h>
11*7f2fe78bSCy Schubert #ifdef HAVE_MEMORY_H
12*7f2fe78bSCy Schubert #include <memory.h>
13*7f2fe78bSCy Schubert #endif
14*7f2fe78bSCy Schubert #include <string.h>
15*7f2fe78bSCy Schubert #include <errno.h>
16*7f2fe78bSCy Schubert #include "client_internal.h"
17*7f2fe78bSCy Schubert
18*7f2fe78bSCy Schubert #ifdef DEBUG
19*7f2fe78bSCy Schubert #define eret() do { clnt_perror(handle->clnt, "null ret"); return KADM5_RPC_ERROR; } while (0)
20*7f2fe78bSCy Schubert #else
21*7f2fe78bSCy Schubert #define eret() do { return KADM5_RPC_ERROR; } while (0)
22*7f2fe78bSCy Schubert #endif
23*7f2fe78bSCy Schubert
24*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_create_principal(void * server_handle,kadm5_principal_ent_t princ,long mask,char * pw)25*7f2fe78bSCy Schubert kadm5_create_principal(void *server_handle,
26*7f2fe78bSCy Schubert kadm5_principal_ent_t princ, long mask,
27*7f2fe78bSCy Schubert char *pw)
28*7f2fe78bSCy Schubert {
29*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
30*7f2fe78bSCy Schubert cprinc_arg arg;
31*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
32*7f2fe78bSCy Schubert
33*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
34*7f2fe78bSCy Schubert
35*7f2fe78bSCy Schubert memset(&arg, 0, sizeof(arg));
36*7f2fe78bSCy Schubert arg.mask = mask;
37*7f2fe78bSCy Schubert arg.passwd = pw;
38*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
39*7f2fe78bSCy Schubert
40*7f2fe78bSCy Schubert if(princ == NULL)
41*7f2fe78bSCy Schubert return EINVAL;
42*7f2fe78bSCy Schubert
43*7f2fe78bSCy Schubert memcpy(&arg.rec, princ, sizeof(kadm5_principal_ent_rec));
44*7f2fe78bSCy Schubert arg.rec.mod_name = NULL;
45*7f2fe78bSCy Schubert
46*7f2fe78bSCy Schubert if(!(mask & KADM5_POLICY))
47*7f2fe78bSCy Schubert arg.rec.policy = NULL;
48*7f2fe78bSCy Schubert if (! (mask & KADM5_KEY_DATA)) {
49*7f2fe78bSCy Schubert arg.rec.n_key_data = 0;
50*7f2fe78bSCy Schubert arg.rec.key_data = NULL;
51*7f2fe78bSCy Schubert }
52*7f2fe78bSCy Schubert if (! (mask & KADM5_TL_DATA)) {
53*7f2fe78bSCy Schubert arg.rec.n_tl_data = 0;
54*7f2fe78bSCy Schubert arg.rec.tl_data = NULL;
55*7f2fe78bSCy Schubert }
56*7f2fe78bSCy Schubert
57*7f2fe78bSCy Schubert if (create_principal_2(&arg, &r, handle->clnt))
58*7f2fe78bSCy Schubert eret();
59*7f2fe78bSCy Schubert return r.code;
60*7f2fe78bSCy Schubert }
61*7f2fe78bSCy Schubert
62*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_create_principal_3(void * server_handle,kadm5_principal_ent_t princ,long mask,int n_ks_tuple,krb5_key_salt_tuple * ks_tuple,char * pw)63*7f2fe78bSCy Schubert kadm5_create_principal_3(void *server_handle,
64*7f2fe78bSCy Schubert kadm5_principal_ent_t princ, long mask,
65*7f2fe78bSCy Schubert int n_ks_tuple,
66*7f2fe78bSCy Schubert krb5_key_salt_tuple *ks_tuple,
67*7f2fe78bSCy Schubert char *pw)
68*7f2fe78bSCy Schubert {
69*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
70*7f2fe78bSCy Schubert cprinc3_arg arg;
71*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
72*7f2fe78bSCy Schubert
73*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
74*7f2fe78bSCy Schubert
75*7f2fe78bSCy Schubert memset(&arg, 0, sizeof(arg));
76*7f2fe78bSCy Schubert arg.mask = mask;
77*7f2fe78bSCy Schubert arg.passwd = pw;
78*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
79*7f2fe78bSCy Schubert arg.n_ks_tuple = n_ks_tuple;
80*7f2fe78bSCy Schubert arg.ks_tuple = ks_tuple;
81*7f2fe78bSCy Schubert
82*7f2fe78bSCy Schubert if(princ == NULL)
83*7f2fe78bSCy Schubert return EINVAL;
84*7f2fe78bSCy Schubert
85*7f2fe78bSCy Schubert memcpy(&arg.rec, princ, sizeof(kadm5_principal_ent_rec));
86*7f2fe78bSCy Schubert arg.rec.mod_name = NULL;
87*7f2fe78bSCy Schubert
88*7f2fe78bSCy Schubert if(!(mask & KADM5_POLICY))
89*7f2fe78bSCy Schubert arg.rec.policy = NULL;
90*7f2fe78bSCy Schubert if (! (mask & KADM5_KEY_DATA)) {
91*7f2fe78bSCy Schubert arg.rec.n_key_data = 0;
92*7f2fe78bSCy Schubert arg.rec.key_data = NULL;
93*7f2fe78bSCy Schubert }
94*7f2fe78bSCy Schubert if (! (mask & KADM5_TL_DATA)) {
95*7f2fe78bSCy Schubert arg.rec.n_tl_data = 0;
96*7f2fe78bSCy Schubert arg.rec.tl_data = NULL;
97*7f2fe78bSCy Schubert }
98*7f2fe78bSCy Schubert
99*7f2fe78bSCy Schubert if (create_principal3_2(&arg, &r, handle->clnt))
100*7f2fe78bSCy Schubert eret();
101*7f2fe78bSCy Schubert return r.code;
102*7f2fe78bSCy Schubert }
103*7f2fe78bSCy Schubert
104*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_delete_principal(void * server_handle,krb5_principal principal)105*7f2fe78bSCy Schubert kadm5_delete_principal(void *server_handle, krb5_principal principal)
106*7f2fe78bSCy Schubert {
107*7f2fe78bSCy Schubert dprinc_arg arg;
108*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
109*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
110*7f2fe78bSCy Schubert
111*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
112*7f2fe78bSCy Schubert
113*7f2fe78bSCy Schubert if(principal == NULL)
114*7f2fe78bSCy Schubert return EINVAL;
115*7f2fe78bSCy Schubert arg.princ = principal;
116*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
117*7f2fe78bSCy Schubert if (delete_principal_2(&arg, &r, handle->clnt))
118*7f2fe78bSCy Schubert eret();
119*7f2fe78bSCy Schubert return r.code;
120*7f2fe78bSCy Schubert }
121*7f2fe78bSCy Schubert
122*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_modify_principal(void * server_handle,kadm5_principal_ent_t princ,long mask)123*7f2fe78bSCy Schubert kadm5_modify_principal(void *server_handle,
124*7f2fe78bSCy Schubert kadm5_principal_ent_t princ, long mask)
125*7f2fe78bSCy Schubert {
126*7f2fe78bSCy Schubert mprinc_arg arg;
127*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
128*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
129*7f2fe78bSCy Schubert
130*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
131*7f2fe78bSCy Schubert
132*7f2fe78bSCy Schubert memset(&arg, 0, sizeof(arg));
133*7f2fe78bSCy Schubert arg.mask = mask;
134*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
135*7f2fe78bSCy Schubert if(princ == NULL)
136*7f2fe78bSCy Schubert return EINVAL;
137*7f2fe78bSCy Schubert memcpy(&arg.rec, princ, sizeof(kadm5_principal_ent_rec));
138*7f2fe78bSCy Schubert if(!(mask & KADM5_POLICY))
139*7f2fe78bSCy Schubert arg.rec.policy = NULL;
140*7f2fe78bSCy Schubert if (! (mask & KADM5_KEY_DATA)) {
141*7f2fe78bSCy Schubert arg.rec.n_key_data = 0;
142*7f2fe78bSCy Schubert arg.rec.key_data = NULL;
143*7f2fe78bSCy Schubert }
144*7f2fe78bSCy Schubert if (! (mask & KADM5_TL_DATA)) {
145*7f2fe78bSCy Schubert arg.rec.n_tl_data = 0;
146*7f2fe78bSCy Schubert arg.rec.tl_data = NULL;
147*7f2fe78bSCy Schubert }
148*7f2fe78bSCy Schubert
149*7f2fe78bSCy Schubert arg.rec.mod_name = NULL;
150*7f2fe78bSCy Schubert
151*7f2fe78bSCy Schubert if (modify_principal_2(&arg, &r, handle->clnt))
152*7f2fe78bSCy Schubert eret();
153*7f2fe78bSCy Schubert return r.code;
154*7f2fe78bSCy Schubert }
155*7f2fe78bSCy Schubert
156*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_get_principal(void * server_handle,krb5_principal princ,kadm5_principal_ent_t ent,long mask)157*7f2fe78bSCy Schubert kadm5_get_principal(void *server_handle,
158*7f2fe78bSCy Schubert krb5_principal princ, kadm5_principal_ent_t ent,
159*7f2fe78bSCy Schubert long mask)
160*7f2fe78bSCy Schubert {
161*7f2fe78bSCy Schubert gprinc_arg arg;
162*7f2fe78bSCy Schubert gprinc_ret r;
163*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
164*7f2fe78bSCy Schubert
165*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
166*7f2fe78bSCy Schubert
167*7f2fe78bSCy Schubert if(princ == NULL)
168*7f2fe78bSCy Schubert return EINVAL;
169*7f2fe78bSCy Schubert arg.princ = princ;
170*7f2fe78bSCy Schubert arg.mask = mask;
171*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
172*7f2fe78bSCy Schubert memset(&r, 0, sizeof(gprinc_ret));
173*7f2fe78bSCy Schubert if (get_principal_2(&arg, &r, handle->clnt))
174*7f2fe78bSCy Schubert eret();
175*7f2fe78bSCy Schubert if (r.code == 0)
176*7f2fe78bSCy Schubert memcpy(ent, &r.rec, sizeof(r.rec));
177*7f2fe78bSCy Schubert
178*7f2fe78bSCy Schubert return r.code;
179*7f2fe78bSCy Schubert }
180*7f2fe78bSCy Schubert
181*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_get_principals(void * server_handle,char * exp,char *** princs,int * count)182*7f2fe78bSCy Schubert kadm5_get_principals(void *server_handle,
183*7f2fe78bSCy Schubert char *exp, char ***princs, int *count)
184*7f2fe78bSCy Schubert {
185*7f2fe78bSCy Schubert gprincs_arg arg;
186*7f2fe78bSCy Schubert gprincs_ret r;
187*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
188*7f2fe78bSCy Schubert
189*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
190*7f2fe78bSCy Schubert
191*7f2fe78bSCy Schubert if(princs == NULL || count == NULL)
192*7f2fe78bSCy Schubert return EINVAL;
193*7f2fe78bSCy Schubert arg.exp = exp;
194*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
195*7f2fe78bSCy Schubert memset(&r, 0, sizeof(gprincs_ret));
196*7f2fe78bSCy Schubert if (get_princs_2(&arg, &r, handle->clnt))
197*7f2fe78bSCy Schubert eret();
198*7f2fe78bSCy Schubert if (r.code == 0) {
199*7f2fe78bSCy Schubert *count = r.count;
200*7f2fe78bSCy Schubert *princs = r.princs;
201*7f2fe78bSCy Schubert } else {
202*7f2fe78bSCy Schubert *count = 0;
203*7f2fe78bSCy Schubert *princs = NULL;
204*7f2fe78bSCy Schubert }
205*7f2fe78bSCy Schubert
206*7f2fe78bSCy Schubert return r.code;
207*7f2fe78bSCy Schubert }
208*7f2fe78bSCy Schubert
209*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_rename_principal(void * server_handle,krb5_principal source,krb5_principal dest)210*7f2fe78bSCy Schubert kadm5_rename_principal(void *server_handle,
211*7f2fe78bSCy Schubert krb5_principal source, krb5_principal dest)
212*7f2fe78bSCy Schubert {
213*7f2fe78bSCy Schubert rprinc_arg arg;
214*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
215*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
216*7f2fe78bSCy Schubert
217*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
218*7f2fe78bSCy Schubert
219*7f2fe78bSCy Schubert arg.src = source;
220*7f2fe78bSCy Schubert arg.dest = dest;
221*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
222*7f2fe78bSCy Schubert if (source == NULL || dest == NULL)
223*7f2fe78bSCy Schubert return EINVAL;
224*7f2fe78bSCy Schubert if (rename_principal_2(&arg, &r, handle->clnt))
225*7f2fe78bSCy Schubert eret();
226*7f2fe78bSCy Schubert return r.code;
227*7f2fe78bSCy Schubert }
228*7f2fe78bSCy Schubert
229*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_chpass_principal(void * server_handle,krb5_principal princ,char * password)230*7f2fe78bSCy Schubert kadm5_chpass_principal(void *server_handle,
231*7f2fe78bSCy Schubert krb5_principal princ, char *password)
232*7f2fe78bSCy Schubert {
233*7f2fe78bSCy Schubert chpass_arg arg;
234*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
235*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
236*7f2fe78bSCy Schubert
237*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
238*7f2fe78bSCy Schubert
239*7f2fe78bSCy Schubert arg.princ = princ;
240*7f2fe78bSCy Schubert arg.pass = password;
241*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
242*7f2fe78bSCy Schubert
243*7f2fe78bSCy Schubert if(princ == NULL)
244*7f2fe78bSCy Schubert return EINVAL;
245*7f2fe78bSCy Schubert if (chpass_principal_2(&arg, &r, handle->clnt))
246*7f2fe78bSCy Schubert eret();
247*7f2fe78bSCy Schubert return r.code;
248*7f2fe78bSCy Schubert }
249*7f2fe78bSCy Schubert
250*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_chpass_principal_3(void * server_handle,krb5_principal princ,krb5_boolean keepold,int n_ks_tuple,krb5_key_salt_tuple * ks_tuple,char * password)251*7f2fe78bSCy Schubert kadm5_chpass_principal_3(void *server_handle,
252*7f2fe78bSCy Schubert krb5_principal princ, krb5_boolean keepold,
253*7f2fe78bSCy Schubert int n_ks_tuple, krb5_key_salt_tuple *ks_tuple,
254*7f2fe78bSCy Schubert char *password)
255*7f2fe78bSCy Schubert {
256*7f2fe78bSCy Schubert chpass3_arg arg;
257*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
258*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
259*7f2fe78bSCy Schubert
260*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
261*7f2fe78bSCy Schubert
262*7f2fe78bSCy Schubert arg.princ = princ;
263*7f2fe78bSCy Schubert arg.pass = password;
264*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
265*7f2fe78bSCy Schubert arg.keepold = keepold;
266*7f2fe78bSCy Schubert arg.n_ks_tuple = n_ks_tuple;
267*7f2fe78bSCy Schubert arg.ks_tuple = ks_tuple;
268*7f2fe78bSCy Schubert
269*7f2fe78bSCy Schubert if(princ == NULL)
270*7f2fe78bSCy Schubert return EINVAL;
271*7f2fe78bSCy Schubert if (chpass_principal3_2(&arg, &r, handle->clnt))
272*7f2fe78bSCy Schubert eret();
273*7f2fe78bSCy Schubert return r.code;
274*7f2fe78bSCy Schubert }
275*7f2fe78bSCy Schubert
276*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_setkey_principal(void * server_handle,krb5_principal princ,krb5_keyblock * keyblocks,int n_keys)277*7f2fe78bSCy Schubert kadm5_setkey_principal(void *server_handle,
278*7f2fe78bSCy Schubert krb5_principal princ,
279*7f2fe78bSCy Schubert krb5_keyblock *keyblocks,
280*7f2fe78bSCy Schubert int n_keys)
281*7f2fe78bSCy Schubert {
282*7f2fe78bSCy Schubert setkey_arg arg;
283*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
284*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
285*7f2fe78bSCy Schubert
286*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
287*7f2fe78bSCy Schubert
288*7f2fe78bSCy Schubert arg.princ = princ;
289*7f2fe78bSCy Schubert arg.keyblocks = keyblocks;
290*7f2fe78bSCy Schubert arg.n_keys = n_keys;
291*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
292*7f2fe78bSCy Schubert
293*7f2fe78bSCy Schubert if(princ == NULL || keyblocks == NULL)
294*7f2fe78bSCy Schubert return EINVAL;
295*7f2fe78bSCy Schubert if (setkey_principal_2(&arg, &r, handle->clnt))
296*7f2fe78bSCy Schubert eret();
297*7f2fe78bSCy Schubert return r.code;
298*7f2fe78bSCy Schubert }
299*7f2fe78bSCy Schubert
300*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_setkey_principal_3(void * server_handle,krb5_principal princ,krb5_boolean keepold,int n_ks_tuple,krb5_key_salt_tuple * ks_tuple,krb5_keyblock * keyblocks,int n_keys)301*7f2fe78bSCy Schubert kadm5_setkey_principal_3(void *server_handle,
302*7f2fe78bSCy Schubert krb5_principal princ,
303*7f2fe78bSCy Schubert krb5_boolean keepold, int n_ks_tuple,
304*7f2fe78bSCy Schubert krb5_key_salt_tuple *ks_tuple,
305*7f2fe78bSCy Schubert krb5_keyblock *keyblocks,
306*7f2fe78bSCy Schubert int n_keys)
307*7f2fe78bSCy Schubert {
308*7f2fe78bSCy Schubert setkey3_arg arg;
309*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
310*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
311*7f2fe78bSCy Schubert
312*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
313*7f2fe78bSCy Schubert
314*7f2fe78bSCy Schubert arg.princ = princ;
315*7f2fe78bSCy Schubert arg.keyblocks = keyblocks;
316*7f2fe78bSCy Schubert arg.n_keys = n_keys;
317*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
318*7f2fe78bSCy Schubert arg.keepold = keepold;
319*7f2fe78bSCy Schubert arg.n_ks_tuple = n_ks_tuple;
320*7f2fe78bSCy Schubert arg.ks_tuple = ks_tuple;
321*7f2fe78bSCy Schubert
322*7f2fe78bSCy Schubert if(princ == NULL || keyblocks == NULL)
323*7f2fe78bSCy Schubert return EINVAL;
324*7f2fe78bSCy Schubert if (setkey_principal3_2(&arg, &r, handle->clnt))
325*7f2fe78bSCy Schubert eret();
326*7f2fe78bSCy Schubert return r.code;
327*7f2fe78bSCy Schubert }
328*7f2fe78bSCy Schubert
329*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_setkey_principal_4(void * server_handle,krb5_principal princ,krb5_boolean keepold,kadm5_key_data * key_data,int n_key_data)330*7f2fe78bSCy Schubert kadm5_setkey_principal_4(void *server_handle,
331*7f2fe78bSCy Schubert krb5_principal princ,
332*7f2fe78bSCy Schubert krb5_boolean keepold,
333*7f2fe78bSCy Schubert kadm5_key_data *key_data,
334*7f2fe78bSCy Schubert int n_key_data)
335*7f2fe78bSCy Schubert {
336*7f2fe78bSCy Schubert setkey4_arg arg;
337*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
338*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
339*7f2fe78bSCy Schubert
340*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
341*7f2fe78bSCy Schubert
342*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
343*7f2fe78bSCy Schubert arg.princ = princ;
344*7f2fe78bSCy Schubert arg.keepold = keepold;
345*7f2fe78bSCy Schubert arg.key_data = key_data;
346*7f2fe78bSCy Schubert arg.n_key_data = n_key_data;
347*7f2fe78bSCy Schubert
348*7f2fe78bSCy Schubert if (princ == NULL || key_data == NULL || n_key_data == 0)
349*7f2fe78bSCy Schubert return EINVAL;
350*7f2fe78bSCy Schubert if (setkey_principal4_2(&arg, &r, handle->clnt))
351*7f2fe78bSCy Schubert eret();
352*7f2fe78bSCy Schubert return r.code;
353*7f2fe78bSCy Schubert }
354*7f2fe78bSCy Schubert
355*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_randkey_principal_3(void * server_handle,krb5_principal princ,krb5_boolean keepold,int n_ks_tuple,krb5_key_salt_tuple * ks_tuple,krb5_keyblock ** key,int * n_keys)356*7f2fe78bSCy Schubert kadm5_randkey_principal_3(void *server_handle,
357*7f2fe78bSCy Schubert krb5_principal princ,
358*7f2fe78bSCy Schubert krb5_boolean keepold, int n_ks_tuple,
359*7f2fe78bSCy Schubert krb5_key_salt_tuple *ks_tuple,
360*7f2fe78bSCy Schubert krb5_keyblock **key, int *n_keys)
361*7f2fe78bSCy Schubert {
362*7f2fe78bSCy Schubert chrand3_arg arg;
363*7f2fe78bSCy Schubert chrand_ret r;
364*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
365*7f2fe78bSCy Schubert int i;
366*7f2fe78bSCy Schubert
367*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
368*7f2fe78bSCy Schubert
369*7f2fe78bSCy Schubert arg.princ = princ;
370*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
371*7f2fe78bSCy Schubert arg.keepold = keepold;
372*7f2fe78bSCy Schubert arg.n_ks_tuple = n_ks_tuple;
373*7f2fe78bSCy Schubert arg.ks_tuple = ks_tuple;
374*7f2fe78bSCy Schubert
375*7f2fe78bSCy Schubert if(princ == NULL)
376*7f2fe78bSCy Schubert return EINVAL;
377*7f2fe78bSCy Schubert memset(&r, 0, sizeof(chrand_ret));
378*7f2fe78bSCy Schubert if (chrand_principal3_2(&arg, &r, handle->clnt))
379*7f2fe78bSCy Schubert eret();
380*7f2fe78bSCy Schubert if (n_keys)
381*7f2fe78bSCy Schubert *n_keys = r.n_keys;
382*7f2fe78bSCy Schubert if (key) {
383*7f2fe78bSCy Schubert *key = r.keys;
384*7f2fe78bSCy Schubert } else {
385*7f2fe78bSCy Schubert for (i = 0; i < r.n_keys; i++)
386*7f2fe78bSCy Schubert krb5_free_keyblock_contents(handle->context, &r.keys[i]);
387*7f2fe78bSCy Schubert free(r.keys);
388*7f2fe78bSCy Schubert }
389*7f2fe78bSCy Schubert return r.code;
390*7f2fe78bSCy Schubert }
391*7f2fe78bSCy Schubert
392*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_randkey_principal(void * server_handle,krb5_principal princ,krb5_keyblock ** key,int * n_keys)393*7f2fe78bSCy Schubert kadm5_randkey_principal(void *server_handle,
394*7f2fe78bSCy Schubert krb5_principal princ,
395*7f2fe78bSCy Schubert krb5_keyblock **key, int *n_keys)
396*7f2fe78bSCy Schubert {
397*7f2fe78bSCy Schubert chrand_arg arg;
398*7f2fe78bSCy Schubert chrand_ret r;
399*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
400*7f2fe78bSCy Schubert int i;
401*7f2fe78bSCy Schubert
402*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
403*7f2fe78bSCy Schubert
404*7f2fe78bSCy Schubert arg.princ = princ;
405*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
406*7f2fe78bSCy Schubert
407*7f2fe78bSCy Schubert if(princ == NULL)
408*7f2fe78bSCy Schubert return EINVAL;
409*7f2fe78bSCy Schubert memset(&r, 0, sizeof(chrand_ret));
410*7f2fe78bSCy Schubert if (chrand_principal_2(&arg, &r, handle->clnt))
411*7f2fe78bSCy Schubert eret();
412*7f2fe78bSCy Schubert if (n_keys)
413*7f2fe78bSCy Schubert *n_keys = r.n_keys;
414*7f2fe78bSCy Schubert if (key) {
415*7f2fe78bSCy Schubert *key = r.keys;
416*7f2fe78bSCy Schubert } else {
417*7f2fe78bSCy Schubert for (i = 0; i < r.n_keys; i++)
418*7f2fe78bSCy Schubert krb5_free_keyblock_contents(handle->context, &r.keys[i]);
419*7f2fe78bSCy Schubert free(r.keys);
420*7f2fe78bSCy Schubert }
421*7f2fe78bSCy Schubert return r.code;
422*7f2fe78bSCy Schubert }
423*7f2fe78bSCy Schubert
424*7f2fe78bSCy Schubert /* not supported on client side */
kadm5_decrypt_key(void * server_handle,kadm5_principal_ent_t entry,krb5_int32 ktype,krb5_int32 stype,krb5_int32 kvno,krb5_keyblock * keyblock,krb5_keysalt * keysalt,int * kvnop)425*7f2fe78bSCy Schubert kadm5_ret_t kadm5_decrypt_key(void *server_handle,
426*7f2fe78bSCy Schubert kadm5_principal_ent_t entry, krb5_int32
427*7f2fe78bSCy Schubert ktype, krb5_int32 stype, krb5_int32
428*7f2fe78bSCy Schubert kvno, krb5_keyblock *keyblock,
429*7f2fe78bSCy Schubert krb5_keysalt *keysalt, int *kvnop)
430*7f2fe78bSCy Schubert {
431*7f2fe78bSCy Schubert return EINVAL;
432*7f2fe78bSCy Schubert }
433*7f2fe78bSCy Schubert
434*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_purgekeys(void * server_handle,krb5_principal princ,int keepkvno)435*7f2fe78bSCy Schubert kadm5_purgekeys(void *server_handle,
436*7f2fe78bSCy Schubert krb5_principal princ,
437*7f2fe78bSCy Schubert int keepkvno)
438*7f2fe78bSCy Schubert {
439*7f2fe78bSCy Schubert purgekeys_arg arg;
440*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
441*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
442*7f2fe78bSCy Schubert
443*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
444*7f2fe78bSCy Schubert
445*7f2fe78bSCy Schubert arg.princ = princ;
446*7f2fe78bSCy Schubert arg.keepkvno = keepkvno;
447*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
448*7f2fe78bSCy Schubert
449*7f2fe78bSCy Schubert if (princ == NULL)
450*7f2fe78bSCy Schubert return EINVAL;
451*7f2fe78bSCy Schubert if (purgekeys_2(&arg, &r, handle->clnt))
452*7f2fe78bSCy Schubert eret();
453*7f2fe78bSCy Schubert return r.code;
454*7f2fe78bSCy Schubert }
455*7f2fe78bSCy Schubert
456*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_get_strings(void * server_handle,krb5_principal principal,krb5_string_attr ** strings_out,int * count_out)457*7f2fe78bSCy Schubert kadm5_get_strings(void *server_handle, krb5_principal principal,
458*7f2fe78bSCy Schubert krb5_string_attr **strings_out, int *count_out)
459*7f2fe78bSCy Schubert {
460*7f2fe78bSCy Schubert gstrings_arg arg;
461*7f2fe78bSCy Schubert gstrings_ret r;
462*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
463*7f2fe78bSCy Schubert
464*7f2fe78bSCy Schubert *strings_out = NULL;
465*7f2fe78bSCy Schubert *count_out = 0;
466*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
467*7f2fe78bSCy Schubert if (principal == NULL)
468*7f2fe78bSCy Schubert return EINVAL;
469*7f2fe78bSCy Schubert
470*7f2fe78bSCy Schubert arg.princ = principal;
471*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
472*7f2fe78bSCy Schubert memset(&r, 0, sizeof(gstrings_ret));
473*7f2fe78bSCy Schubert if (get_strings_2(&arg, &r, handle->clnt))
474*7f2fe78bSCy Schubert eret();
475*7f2fe78bSCy Schubert if (r.code == 0) {
476*7f2fe78bSCy Schubert *strings_out = r.strings;
477*7f2fe78bSCy Schubert *count_out = r.count;
478*7f2fe78bSCy Schubert }
479*7f2fe78bSCy Schubert return r.code;
480*7f2fe78bSCy Schubert }
481*7f2fe78bSCy Schubert
482*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_set_string(void * server_handle,krb5_principal principal,const char * key,const char * value)483*7f2fe78bSCy Schubert kadm5_set_string(void *server_handle, krb5_principal principal,
484*7f2fe78bSCy Schubert const char *key, const char *value)
485*7f2fe78bSCy Schubert {
486*7f2fe78bSCy Schubert sstring_arg arg;
487*7f2fe78bSCy Schubert generic_ret r = { 0, 0 };
488*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
489*7f2fe78bSCy Schubert
490*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
491*7f2fe78bSCy Schubert if (principal == NULL || key == NULL)
492*7f2fe78bSCy Schubert return EINVAL;
493*7f2fe78bSCy Schubert
494*7f2fe78bSCy Schubert arg.princ = principal;
495*7f2fe78bSCy Schubert arg.key = (char *)key;
496*7f2fe78bSCy Schubert arg.value = (char *)value;
497*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
498*7f2fe78bSCy Schubert if (set_string_2(&arg, &r, handle->clnt))
499*7f2fe78bSCy Schubert eret();
500*7f2fe78bSCy Schubert return r.code;
501*7f2fe78bSCy Schubert }
502*7f2fe78bSCy Schubert
503*7f2fe78bSCy Schubert kadm5_ret_t
kadm5_get_principal_keys(void * server_handle,krb5_principal princ,krb5_kvno kvno,kadm5_key_data ** key_data,int * n_key_data)504*7f2fe78bSCy Schubert kadm5_get_principal_keys(void *server_handle, krb5_principal princ,
505*7f2fe78bSCy Schubert krb5_kvno kvno, kadm5_key_data **key_data,
506*7f2fe78bSCy Schubert int *n_key_data)
507*7f2fe78bSCy Schubert {
508*7f2fe78bSCy Schubert getpkeys_arg arg;
509*7f2fe78bSCy Schubert getpkeys_ret r;
510*7f2fe78bSCy Schubert kadm5_server_handle_t handle = server_handle;
511*7f2fe78bSCy Schubert
512*7f2fe78bSCy Schubert CHECK_HANDLE(server_handle);
513*7f2fe78bSCy Schubert
514*7f2fe78bSCy Schubert arg.api_version = handle->api_version;
515*7f2fe78bSCy Schubert arg.princ = princ;
516*7f2fe78bSCy Schubert arg.kvno = kvno;
517*7f2fe78bSCy Schubert
518*7f2fe78bSCy Schubert if (princ == NULL || key_data == NULL || n_key_data == 0)
519*7f2fe78bSCy Schubert return EINVAL;
520*7f2fe78bSCy Schubert memset(&r, 0, sizeof(getpkeys_ret));
521*7f2fe78bSCy Schubert if (get_principal_keys_2(&arg, &r, handle->clnt))
522*7f2fe78bSCy Schubert eret();
523*7f2fe78bSCy Schubert if (r.code == 0) {
524*7f2fe78bSCy Schubert *key_data = r.key_data;
525*7f2fe78bSCy Schubert *n_key_data = r.n_key_data;
526*7f2fe78bSCy Schubert }
527*7f2fe78bSCy Schubert return r.code;
528*7f2fe78bSCy Schubert }
529