xref: /freebsd/crypto/krb5/src/lib/kadm5/clnt/client_principal.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
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