xref: /titanic_44/usr/src/lib/krb5/kadm5/admin.h (revision 75ce41a57ff334bd8fe2cb9ed51eea835892f944)
1 /*
2  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 #ifndef	__KADM5_ADMIN_H__
7 #define	__KADM5_ADMIN_H__
8 
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 /*
15  * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
16  *
17  *	Openvision retains the copyright to derivative works of
18  *	this source code.  Do *NOT* create a derivative of this
19  *	source code before consulting with your legal department.
20  *	Do *NOT* integrate *ANY* of this source code into another
21  *	product before consulting with your legal department.
22  *
23  *	For further information, read the top-level Openvision
24  *	copyright which is contained in the top-level MIT Kerberos
25  *	copyright.
26  *
27  * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
28  *
29  */
30 /*
31  * lib/kadm5/admin.h
32  *
33  * Copyright 2001 by the Massachusetts Institute of Technology.
34  * All Rights Reserved.
35  *
36  * Export of this software from the United States of America may
37  *   require a specific license from the United States Government.
38  *   It is the responsibility of any person or organization contemplating
39  *   export to obtain such a license before exporting.
40  *
41  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
42  * distribute this software and its documentation for any purpose and
43  * without fee is hereby granted, provided that the above copyright
44  * notice appear in all copies and that both that copyright notice and
45  * this permission notice appear in supporting documentation, and that
46  * the name of M.I.T. not be used in advertising or publicity pertaining
47  * to distribution of the software without specific, written prior
48  * permission.  Furthermore if you modify this software you must label
49  * your software as modified software and not distribute it in such a
50  * fashion that it might be confused with the original M.I.T. software.
51  * M.I.T. makes no representations about the suitability of
52  * this software for any purpose.  It is provided "as is" without express
53  * or implied warranty.
54  *
55  */
56 /*
57  * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
58  *
59  * $Header$
60  */
61 
62 #include	<sys/types.h>
63 #include	<rpc/types.h>
64 #include	<rpc/rpc.h>
65 #include	<k5-int.h>
66 #include	<krb5.h>
67 #include	<krb5/kdb.h>
68 #include	<com_err.h>
69 #include	<kadm5/kadm_err.h>
70 #include	<kadm5/chpass_util_strings.h>
71 
72 #define KADM5_ADMIN_SERVICE_P	"kadmin@admin"
73 /*
74  * Solaris Kerberos:
75  * The kadmin/admin principal is unused on Solaris. This principal is used
76  * in AUTH_GSSAPI but Solaris doesn't support AUTH_GSSAPI. RPCSEC_GSS can only
77  * be used with host-based principals.
78  *
79  */
80 /* #define KADM5_ADMIN_SERVICE	"kadmin/admin" */
81 #define KADM5_CHANGEPW_SERVICE_P	"kadmin@changepw"
82 #define KADM5_CHANGEPW_SERVICE	"kadmin/changepw"
83 #define KADM5_HIST_PRINCIPAL	"kadmin/history"
84 #define KADM5_ADMIN_HOST_SERVICE "kadmin"
85 #define KADM5_CHANGEPW_HOST_SERVICE "changepw"
86 #define KADM5_KIPROP_HOST_SERVICE "kiprop"
87 
88 typedef krb5_principal	kadm5_princ_t;
89 typedef	char		*kadm5_policy_t;
90 typedef long		kadm5_ret_t;
91 typedef int rpc_int32;
92 typedef unsigned int rpc_u_int32;
93 
94 #define KADM5_PW_FIRST_PROMPT \
95 	(error_message(CHPASS_UTIL_NEW_PASSWORD_PROMPT))
96 #define KADM5_PW_SECOND_PROMPT \
97 	(error_message(CHPASS_UTIL_NEW_PASSWORD_AGAIN_PROMPT))
98 
99 /*
100  * Successful return code
101  */
102 #define KADM5_OK	0
103 
104 /*
105  * Field masks
106  */
107 
108 /* kadm5_principal_ent_t */
109 #define KADM5_PRINCIPAL		0x000001
110 #define KADM5_PRINC_EXPIRE_TIME	0x000002
111 #define KADM5_PW_EXPIRATION	0x000004
112 #define KADM5_LAST_PWD_CHANGE	0x000008
113 #define KADM5_ATTRIBUTES	0x000010
114 #define KADM5_MAX_LIFE		0x000020
115 #define KADM5_MOD_TIME		0x000040
116 #define KADM5_MOD_NAME		0x000080
117 #define KADM5_KVNO		0x000100
118 #define KADM5_MKVNO		0x000200
119 #define KADM5_AUX_ATTRIBUTES	0x000400
120 #define KADM5_POLICY		0x000800
121 #define KADM5_POLICY_CLR	0x001000
122 /* version 2 masks */
123 #define KADM5_MAX_RLIFE		0x002000
124 #define KADM5_LAST_SUCCESS	0x004000
125 #define KADM5_LAST_FAILED	0x008000
126 #define KADM5_FAIL_AUTH_COUNT	0x010000
127 #define KADM5_KEY_DATA		0x020000
128 #define KADM5_TL_DATA		0x040000
129 #ifdef notyet /* Novell */
130 #define KADM5_CPW_FUNCTION      0x080000
131 #define KADM5_RANDKEY_USED      0x100000
132 #endif
133 #define KADM5_LOAD		0x200000
134 /* Solaris Kerberos: adding support for key history in LDAP KDB */
135 #define KADM5_KEY_HIST		0x400000
136 
137 /* all but KEY_DATA and TL_DATA */
138 #define KADM5_PRINCIPAL_NORMAL_MASK 0x01ffff
139 
140 
141 /* kadm5_policy_ent_t */
142 #define KADM5_PW_MAX_LIFE	0x004000
143 #define KADM5_PW_MIN_LIFE	0x008000
144 #define KADM5_PW_MIN_LENGTH	0x010000
145 #define KADM5_PW_MIN_CLASSES	0x020000
146 #define KADM5_PW_HISTORY_NUM	0x040000
147 #define KADM5_REF_COUNT		0x080000
148 
149 /* kadm5_config_params */
150 #define KADM5_CONFIG_REALM		0x0000001
151 #define KADM5_CONFIG_DBNAME		0x0000002
152 #define KADM5_CONFIG_MKEY_NAME		0x0000004
153 #define KADM5_CONFIG_MAX_LIFE		0x0000008
154 #define KADM5_CONFIG_MAX_RLIFE		0x0000010
155 #define KADM5_CONFIG_EXPIRATION		0x0000020
156 #define KADM5_CONFIG_FLAGS		0x0000040
157 #define KADM5_CONFIG_ADMIN_KEYTAB	0x0000080
158 #define KADM5_CONFIG_STASH_FILE		0x0000100
159 #define KADM5_CONFIG_ENCTYPE		0x0000200
160 #define KADM5_CONFIG_ADBNAME		0x0000400
161 #define KADM5_CONFIG_ADB_LOCKFILE	0x0000800
162 #define KADM5_CONFIG_PROFILE		0x0001000
163 #define KADM5_CONFIG_ACL_FILE		0x0002000
164 #define KADM5_CONFIG_KADMIND_PORT	0x0004000
165 #define KADM5_CONFIG_ENCTYPES		0x0008000
166 #define KADM5_CONFIG_ADMIN_SERVER	0x0010000
167 #define KADM5_CONFIG_DICT_FILE		0x0020000
168 #define KADM5_CONFIG_MKEY_FROM_KBD	0x0040000
169 #define KADM5_CONFIG_KPASSWD_PORT	0x0080000
170 #define KADM5_CONFIG_KPASSWD_SERVER	0x0100000
171 #define	KADM5_CONFIG_KPASSWD_PROTOCOL	0x0200000
172 #define	KADM5_CONFIG_IPROP_ENABLED	0x0400000
173 #define	KADM5_CONFIG_ULOG_SIZE		0x0800000
174 #define	KADM5_CONFIG_POLL_TIME		0x1000000
175 
176 /* password change constants */
177 #define	KRB5_KPASSWD_SUCCESS		0
178 #define	KRB5_KPASSWD_MALFORMED		1
179 #define	KRB5_KPASSWD_HARDERROR		2
180 #define	KRB5_KPASSWD_AUTHERROR		3
181 #define	KRB5_KPASSWD_SOFTERROR		4
182 #define	KRB5_KPASSWD_ACCESSDENIED	5
183 #define	KRB5_KPASSWD_BAD_VERSION	6
184 #define	KRB5_KPASSWD_INITIAL_FLAG_NEEDED	7
185 #define	KRB5_KPASSWD_POLICY_REJECT	8
186 #define	KRB5_KPASSWD_BAD_PRINCIPAL	9
187 #define	KRB5_KPASSWD_ETYPE_NOSUPP	10
188 
189 /*
190  * permission bits
191  */
192 #define KADM5_PRIV_GET		0x01
193 #define KADM5_PRIV_ADD		0x02
194 #define KADM5_PRIV_MODIFY	0x04
195 #define KADM5_PRIV_DELETE	0x08
196 
197 /*
198  * API versioning constants
199  */
200 #define KADM5_MASK_BITS		0xffffff00
201 
202 #define KADM5_STRUCT_VERSION_MASK	0x12345600
203 #define KADM5_STRUCT_VERSION_1	(KADM5_STRUCT_VERSION_MASK|0x01)
204 #define KADM5_STRUCT_VERSION	KADM5_STRUCT_VERSION_1
205 
206 #define KADM5_API_VERSION_MASK	0x12345700
207 #define KADM5_API_VERSION_1	(KADM5_API_VERSION_MASK|0x01)
208 #define KADM5_API_VERSION_2	(KADM5_API_VERSION_MASK|0x02)
209 
210 #ifdef KRB5_DNS_LOOKUP
211 /*
212  * Name length constants for DNS lookups
213  */
214 #define	MAX_HOST_NAMELEN 256
215 #define	MAX_DNS_NAMELEN (15*(MAX_HOST_NAMELEN + 1)+1)
216 #endif /* KRB5_DNS_LOOKUP */
217 
218 typedef struct _kadm5_principal_ent_t_v2 {
219 	krb5_principal	principal;
220 	krb5_timestamp	princ_expire_time;
221 	krb5_timestamp	last_pwd_change;
222 	krb5_timestamp	pw_expiration;
223 	krb5_deltat	max_life;
224 	krb5_principal	mod_name;
225 	krb5_timestamp	mod_date;
226 	krb5_flags	attributes;
227 	krb5_kvno	kvno;
228 	krb5_kvno	mkvno;
229 	char		*policy;
230 	long		aux_attributes;
231 
232 	/* version 2 fields */
233 	krb5_deltat max_renewable_life;
234         krb5_timestamp last_success;
235         krb5_timestamp last_failed;
236         krb5_kvno fail_auth_count;
237 	krb5_int16 n_key_data;
238 	krb5_int16 n_tl_data;
239         krb5_tl_data *tl_data;
240 	krb5_key_data *key_data;
241 } kadm5_principal_ent_rec_v2, *kadm5_principal_ent_t_v2;
242 
243 typedef struct _kadm5_principal_ent_t_v1 {
244 	krb5_principal	principal;
245 	krb5_timestamp	princ_expire_time;
246 	krb5_timestamp	last_pwd_change;
247 	krb5_timestamp	pw_expiration;
248 	krb5_deltat	max_life;
249 	krb5_principal	mod_name;
250 	krb5_timestamp	mod_date;
251 	krb5_flags	attributes;
252 	krb5_kvno	kvno;
253 	krb5_kvno	mkvno;
254 	char		*policy;
255 	long		aux_attributes;
256 } kadm5_principal_ent_rec_v1, *kadm5_principal_ent_t_v1;
257 
258 #if USE_KADM5_API_VERSION == 1
259 typedef struct _kadm5_principal_ent_t_v1
260      kadm5_principal_ent_rec, *kadm5_principal_ent_t;
261 #else
262 typedef struct _kadm5_principal_ent_t_v2
263      kadm5_principal_ent_rec, *kadm5_principal_ent_t;
264 #endif
265 
266 typedef struct _kadm5_policy_ent_t {
267 	char		*policy;
268 	long		pw_min_life;
269 	long		pw_max_life;
270 	long		pw_min_length;
271 	long		pw_min_classes;
272 	long		pw_history_num;
273 	long		policy_refcnt;
274 } kadm5_policy_ent_rec, *kadm5_policy_ent_t;
275 
276 /*
277  * New types to indicate which protocol to use when sending
278  * password change requests
279  */
280 typedef enum {
281 	KRB5_CHGPWD_RPCSEC,
282 	KRB5_CHGPWD_CHANGEPW_V2
283 } krb5_chgpwd_prot;
284 
285 /*
286  * Data structure returned by kadm5_get_config_params()
287  */
288 typedef struct _kadm5_config_params {
289      long		mask;
290      char *		realm;
291      int		kadmind_port;
292      int		kpasswd_port;
293 
294      char *		admin_server;
295 #ifdef notyet /* Novell */ /* ABI change? */
296      char *		kpasswd_server;
297 #endif
298 
299      char *		dbname;
300      char *		admin_dbname;
301      char *		admin_lockfile;
302      char *		admin_keytab;
303      char *		acl_file;
304      char *		dict_file;
305 
306      int		mkey_from_kbd;
307      char *		stash_file;
308      char *		mkey_name;
309      krb5_enctype	enctype;
310      krb5_deltat	max_life;
311      krb5_deltat	max_rlife;
312      krb5_timestamp	expiration;
313      krb5_flags		flags;
314      krb5_key_salt_tuple *keysalts;
315      krb5_int32		num_keysalts;
316      char 			*kpasswd_server;
317 
318      krb5_chgpwd_prot	kpasswd_protocol;
319      bool_t			iprop_enabled;
320      int			iprop_ulogsize;
321      char			*iprop_polltime;
322 } kadm5_config_params;
323 
324 /***********************************************************************
325  * This is the old krb5_realm_read_params, which I mutated into
326  * kadm5_get_config_params but which old code (kdb5_* and krb5kdc)
327  * still uses.
328  ***********************************************************************/
329 
330 /*
331  * Data structure returned by krb5_read_realm_params()
332  */
333 typedef struct __krb5_realm_params {
334     char *		realm_profile;
335     char *		realm_dbname;
336     char *		realm_mkey_name;
337     char *		realm_stash_file;
338     char *		realm_kdc_ports;
339     char *		realm_kdc_tcp_ports;
340     char *		realm_acl_file;
341     krb5_int32		realm_kadmind_port;
342     krb5_enctype	realm_enctype;
343     krb5_deltat		realm_max_life;
344     krb5_deltat		realm_max_rlife;
345     krb5_timestamp	realm_expiration;
346     krb5_flags		realm_flags;
347     krb5_key_salt_tuple	*realm_keysalts;
348     unsigned int	realm_reject_bad_transit:1;
349     unsigned int	realm_kadmind_port_valid:1;
350     unsigned int	realm_enctype_valid:1;
351     unsigned int	realm_max_life_valid:1;
352     unsigned int	realm_max_rlife_valid:1;
353     unsigned int	realm_expiration_valid:1;
354     unsigned int	realm_flags_valid:1;
355     unsigned int	realm_reject_bad_transit_valid:1;
356     krb5_int32		realm_num_keysalts;
357 } krb5_realm_params;
358 
359 /*
360  * functions
361  */
362 
363 kadm5_ret_t
364 kadm5_get_adm_host_srv_name(krb5_context context,
365                            const char *realm, char **host_service_name);
366 
367 kadm5_ret_t
368 kadm5_get_cpw_host_srv_name(krb5_context context,
369                            const char *realm, char **host_service_name);
370 
371 #if USE_KADM5_API_VERSION > 1
372 krb5_error_code kadm5_get_config_params(krb5_context context,
373 					int use_kdc_config,
374 					kadm5_config_params *params_in,
375 					kadm5_config_params *params_out);
376 
377 krb5_error_code kadm5_free_config_params(krb5_context context,
378 					 kadm5_config_params *params);
379 
380 krb5_error_code kadm5_free_realm_params(krb5_context kcontext,
381 					kadm5_config_params *params);
382 
383 krb5_error_code kadm5_get_admin_service_name(krb5_context, char *,
384 					     char *, size_t);
385 #endif
386 
387 kadm5_ret_t    kadm5_init(char *client_name, char *pass,
388 			  char *service_name,
389 #if USE_KADM5_API_VERSION == 1
390 			  char *realm,
391 #else
392 			  kadm5_config_params *params,
393 #endif
394 			  krb5_ui_4 struct_version,
395 			  krb5_ui_4 api_version,
396 			  char **db_args,
397 			  void **server_handle);
398 kadm5_ret_t    kadm5_init_with_password(char *client_name,
399 					char *pass,
400 					char *service_name,
401 #if USE_KADM5_API_VERSION == 1
402 					char *realm,
403 #else
404 					kadm5_config_params *params,
405 #endif
406 					krb5_ui_4 struct_version,
407 					krb5_ui_4 api_version,
408 					char **db_args,
409 					void **server_handle);
410 kadm5_ret_t    kadm5_init_with_skey(char *client_name,
411 				    char *keytab,
412 				    char *service_name,
413 #if USE_KADM5_API_VERSION == 1
414 				    char *realm,
415 #else
416 				    kadm5_config_params *params,
417 #endif
418 				    krb5_ui_4 struct_version,
419 				    krb5_ui_4 api_version,
420 				    char **db_args,
421 				    void **server_handle);
422 #if USE_KADM5_API_VERSION > 1
423 kadm5_ret_t    kadm5_init_with_creds(char *client_name,
424 				     krb5_ccache cc,
425 				     char *service_name,
426 				     kadm5_config_params *params,
427 				     krb5_ui_4 struct_version,
428 				     krb5_ui_4 api_version,
429 				     char **db_args,
430 				     void **server_handle);
431 #endif
432 kadm5_ret_t    kadm5_lock(void *server_handle);
433 kadm5_ret_t    kadm5_unlock(void *server_handle);
434 kadm5_ret_t    kadm5_flush(void *server_handle);
435 kadm5_ret_t    kadm5_destroy(void *server_handle);
436 kadm5_ret_t    kadm5_create_principal(void *server_handle,
437 				      kadm5_principal_ent_t ent,
438 				      long mask, char *pass);
439 kadm5_ret_t    kadm5_create_principal_3(void *server_handle,
440 					kadm5_principal_ent_t ent,
441 					long mask,
442 					int n_ks_tuple,
443 					krb5_key_salt_tuple *ks_tuple,
444 					char *pass);
445 kadm5_ret_t    kadm5_delete_principal(void *server_handle,
446 				      krb5_principal principal);
447 kadm5_ret_t    kadm5_modify_principal(void *server_handle,
448 				      kadm5_principal_ent_t ent,
449 				      long mask);
450 kadm5_ret_t    kadm5_rename_principal(void *server_handle,
451 				      krb5_principal,krb5_principal);
452 #if USE_KADM5_API_VERSION == 1
453 kadm5_ret_t    kadm5_get_principal(void *server_handle,
454 				   krb5_principal principal,
455 				   kadm5_principal_ent_t *ent);
456 #else
457 kadm5_ret_t    kadm5_get_principal(void *server_handle,
458 				   krb5_principal principal,
459 				   kadm5_principal_ent_t ent,
460 				   long mask);
461 #endif
462 kadm5_ret_t    kadm5_chpass_principal(void *server_handle,
463 				      krb5_principal principal,
464 				      char *pass);
465 kadm5_ret_t    kadm5_chpass_principal_3(void *server_handle,
466 					krb5_principal principal,
467 					krb5_boolean keepold,
468 					int n_ks_tuple,
469 					krb5_key_salt_tuple *ks_tuple,
470 					char *pass);
471 #if USE_KADM5_API_VERSION == 1
472 kadm5_ret_t    kadm5_randkey_principal(void *server_handle,
473 				       krb5_principal principal,
474 				       krb5_keyblock **keyblock);
475 #else
476 
477 /*
478  * Solaris Kerberos:
479  * this routine is only implemented in the client library.
480  */
481 kadm5_ret_t    kadm5_randkey_principal_old(void *server_handle,
482 				    krb5_principal principal,
483 				    krb5_keyblock **keyblocks,
484 				    int *n_keys);
485 
486 kadm5_ret_t    kadm5_randkey_principal(void *server_handle,
487 				       krb5_principal principal,
488 				       krb5_keyblock **keyblocks,
489 				       int *n_keys);
490 kadm5_ret_t    kadm5_randkey_principal_3(void *server_handle,
491 					 krb5_principal principal,
492 					 krb5_boolean keepold,
493 					 int n_ks_tuple,
494 					 krb5_key_salt_tuple *ks_tuple,
495 					 krb5_keyblock **keyblocks,
496 					 int *n_keys);
497 #endif
498 kadm5_ret_t    kadm5_setv4key_principal(void *server_handle,
499 					krb5_principal principal,
500 					krb5_keyblock *keyblock);
501 
502 kadm5_ret_t    kadm5_setkey_principal(void *server_handle,
503 				      krb5_principal principal,
504 				      krb5_keyblock *keyblocks,
505 				      int n_keys);
506 
507 kadm5_ret_t    kadm5_setkey_principal_3(void *server_handle,
508 					krb5_principal principal,
509 					krb5_boolean keepold,
510 					int n_ks_tuple,
511 					krb5_key_salt_tuple *ks_tuple,
512 					krb5_keyblock *keyblocks,
513 					int n_keys);
514 
515 kadm5_ret_t    kadm5_decrypt_key(void *server_handle,
516 				 kadm5_principal_ent_t entry, krb5_int32
517 				 ktype, krb5_int32 stype, krb5_int32
518 				 kvno, krb5_keyblock *keyblock,
519 				 krb5_keysalt *keysalt, int *kvnop);
520 
521 kadm5_ret_t    kadm5_create_policy(void *server_handle,
522 				   kadm5_policy_ent_t ent,
523 				   long mask);
524 /*
525  * kadm5_create_policy_internal is not part of the supported,
526  * exposed API.  It is available only in the server library, and you
527  * shouldn't use it unless you know why it's there and how it's
528  * different from kadm5_create_policy.
529  */
530 kadm5_ret_t    kadm5_create_policy_internal(void *server_handle,
531 					    kadm5_policy_ent_t
532 					    entry, long mask);
533 kadm5_ret_t    kadm5_delete_policy(void *server_handle,
534 				   kadm5_policy_t policy);
535 kadm5_ret_t    kadm5_modify_policy(void *server_handle,
536 				   kadm5_policy_ent_t ent,
537 				   long mask);
538 /*
539  * kadm5_modify_policy_internal is not part of the supported,
540  * exposed API.  It is available only in the server library, and you
541  * shouldn't use it unless you know why it's there and how it's
542  * different from kadm5_modify_policy.
543  */
544 kadm5_ret_t    kadm5_modify_policy_internal(void *server_handle,
545 					    kadm5_policy_ent_t
546 					    entry, long mask);
547 #if USE_KADM5_API_VERSION == 1
548 kadm5_ret_t    kadm5_get_policy(void *server_handle,
549 				kadm5_policy_t policy,
550 				kadm5_policy_ent_t *ent);
551 #else
552 kadm5_ret_t    kadm5_get_policy(void *server_handle,
553 				kadm5_policy_t policy,
554 				kadm5_policy_ent_t ent);
555 #endif
556 kadm5_ret_t    kadm5_get_privs(void *server_handle,
557 			       long *privs);
558 
559 kadm5_ret_t    kadm5_chpass_principal_util(void *server_handle,
560 					   krb5_principal princ,
561 					   char *new_pw,
562 					   char **ret_pw,
563 					   char *msg_ret,
564 					   unsigned int msg_len);
565 
566 kadm5_ret_t    kadm5_free_principal_ent(void *server_handle,
567 					kadm5_principal_ent_t
568 					ent);
569 kadm5_ret_t    kadm5_free_policy_ent(void *server_handle,
570 				     kadm5_policy_ent_t ent);
571 
572 kadm5_ret_t    kadm5_get_principals(void *server_handle,
573 				    char *exp, char ***princs,
574 				    int *count);
575 
576 kadm5_ret_t    kadm5_get_policies(void *server_handle,
577 				  char *exp, char ***pols,
578 				  int *count);
579 
580 #if USE_KADM5_API_VERSION > 1
581 kadm5_ret_t    kadm5_free_key_data(void *server_handle,
582 				   krb5_int16 *n_key_data,
583 				   krb5_key_data *key_data);
584 #endif
585 
586 kadm5_ret_t    kadm5_free_name_list(void *server_handle, char **names,
587 				    int count);
588 
589 krb5_error_code kadm5_init_krb5_context (krb5_context *);
590 
591 #if USE_KADM5_API_VERSION == 1
592 /*
593  * OVSEC_KADM_API_VERSION_1 should be, if possible, compile-time
594  * compatible with KADM5_API_VERSION_2.  Basically, this means we have
595  * to continue to provide all the old ovsec_kadm function and symbol
596  * names.
597  */
598 
599 #define OVSEC_KADM_ACLFILE		"/krb5/ovsec_adm.acl"
600 #define	OVSEC_KADM_WORDFILE		"/krb5/ovsec_adm.dict"
601 
602 #define OVSEC_KADM_ADMIN_SERVICE	"ovsec_adm/admin"
603 #define OVSEC_KADM_CHANGEPW_SERVICE	"ovsec_adm/changepw"
604 #define OVSEC_KADM_HIST_PRINCIPAL	"ovsec_adm/history"
605 
606 typedef krb5_principal	ovsec_kadm_princ_t;
607 typedef krb5_keyblock	ovsec_kadm_keyblock;
608 typedef	char		*ovsec_kadm_policy_t;
609 typedef long		ovsec_kadm_ret_t;
610 
611 enum	ovsec_kadm_salttype { OVSEC_KADM_SALT_V4, OVSEC_KADM_SALT_NORMAL };
612 enum	ovsec_kadm_saltmod  { OVSEC_KADM_MOD_KEEP, OVSEC_KADM_MOD_V4, OVSEC_KADM_MOD_NORMAL };
613 
614 #define OVSEC_KADM_PW_FIRST_PROMPT \
615 	((char *) error_message(CHPASS_UTIL_NEW_PASSWORD_PROMPT))
616 #define OVSEC_KADM_PW_SECOND_PROMPT \
617 	((char *) error_message(CHPASS_UTIL_NEW_PASSWORD_AGAIN_PROMPT))
618 
619 /*
620  * Successful return code
621  */
622 #define OVSEC_KADM_OK	0
623 
624 /*
625  * Create/Modify masks
626  */
627 /* principal */
628 #define OVSEC_KADM_PRINCIPAL		0x000001
629 #define OVSEC_KADM_PRINC_EXPIRE_TIME	0x000002
630 #define OVSEC_KADM_PW_EXPIRATION	0x000004
631 #define OVSEC_KADM_LAST_PWD_CHANGE	0x000008
632 #define OVSEC_KADM_ATTRIBUTES		0x000010
633 #define OVSEC_KADM_MAX_LIFE		0x000020
634 #define OVSEC_KADM_MOD_TIME		0x000040
635 #define OVSEC_KADM_MOD_NAME		0x000080
636 #define OVSEC_KADM_KVNO			0x000100
637 #define OVSEC_KADM_MKVNO		0x000200
638 #define OVSEC_KADM_AUX_ATTRIBUTES	0x000400
639 #define OVSEC_KADM_POLICY		0x000800
640 #define OVSEC_KADM_POLICY_CLR		0x001000
641 /* policy */
642 #define OVSEC_KADM_PW_MAX_LIFE		0x004000
643 #define OVSEC_KADM_PW_MIN_LIFE		0x008000
644 #define OVSEC_KADM_PW_MIN_LENGTH	0x010000
645 #define OVSEC_KADM_PW_MIN_CLASSES	0x020000
646 #define OVSEC_KADM_PW_HISTORY_NUM	0x040000
647 #define OVSEC_KADM_REF_COUNT		0x080000
648 
649 /*
650  * permission bits
651  */
652 #define OVSEC_KADM_PRIV_GET	0x01
653 #define OVSEC_KADM_PRIV_ADD	0x02
654 #define OVSEC_KADM_PRIV_MODIFY	0x04
655 #define OVSEC_KADM_PRIV_DELETE	0x08
656 
657 /*
658  * API versioning constants
659  */
660 #define OVSEC_KADM_MASK_BITS		0xffffff00
661 
662 #define OVSEC_KADM_STRUCT_VERSION_MASK	0x12345600
663 #define OVSEC_KADM_STRUCT_VERSION_1	(OVSEC_KADM_STRUCT_VERSION_MASK|0x01)
664 #define OVSEC_KADM_STRUCT_VERSION	OVSEC_KADM_STRUCT_VERSION_1
665 
666 #define OVSEC_KADM_API_VERSION_MASK	0x12345700
667 #define OVSEC_KADM_API_VERSION_1	(OVSEC_KADM_API_VERSION_MASK|0x01)
668 
669 
670 typedef struct _ovsec_kadm_principal_ent_t {
671 	krb5_principal	principal;
672 	krb5_timestamp	princ_expire_time;
673 	krb5_timestamp	last_pwd_change;
674 	krb5_timestamp	pw_expiration;
675 	krb5_deltat	max_life;
676 	krb5_principal	mod_name;
677 	krb5_timestamp	mod_date;
678 	krb5_flags	attributes;
679 	krb5_kvno	kvno;
680 	krb5_kvno	mkvno;
681 	char		*policy;
682 	long		aux_attributes;
683 } ovsec_kadm_principal_ent_rec, *ovsec_kadm_principal_ent_t;
684 
685 typedef struct _ovsec_kadm_policy_ent_t {
686 	char		*policy;
687 	long		pw_min_life;
688 	long		pw_max_life;
689 	long		pw_min_length;
690 	long		pw_min_classes;
691 	long		pw_history_num;
692 	long		policy_refcnt;
693 } ovsec_kadm_policy_ent_rec, *ovsec_kadm_policy_ent_t;
694 
695 /*
696  * functions
697  */
698 ovsec_kadm_ret_t    ovsec_kadm_init(char *client_name, char *pass,
699 				    char *service_name, char *realm,
700 				    krb5_ui_4 struct_version,
701 				    krb5_ui_4 api_version,
702 				    char **db_args,
703 				    void **server_handle);
704 ovsec_kadm_ret_t    ovsec_kadm_init_with_password(char *client_name,
705 						  char *pass,
706 						  char *service_name,
707 						  char *realm,
708 						  krb5_ui_4 struct_version,
709 						  krb5_ui_4 api_version,
710 						  char ** db_args,
711 						  void **server_handle);
712 ovsec_kadm_ret_t    ovsec_kadm_init_with_skey(char *client_name,
713 					      char *keytab,
714 					      char *service_name,
715 					      char *realm,
716 					      krb5_ui_4 struct_version,
717 					      krb5_ui_4 api_version,
718 					      char **db_args,
719 					      void **server_handle);
720 ovsec_kadm_ret_t    ovsec_kadm_flush(void *server_handle);
721 ovsec_kadm_ret_t    ovsec_kadm_destroy(void *server_handle);
722 ovsec_kadm_ret_t    ovsec_kadm_create_principal(void *server_handle,
723 						ovsec_kadm_principal_ent_t ent,
724 						long mask, char *pass);
725 ovsec_kadm_ret_t    ovsec_kadm_delete_principal(void *server_handle,
726 						krb5_principal principal);
727 ovsec_kadm_ret_t    ovsec_kadm_modify_principal(void *server_handle,
728 						ovsec_kadm_principal_ent_t ent,
729 						long mask);
730 ovsec_kadm_ret_t    ovsec_kadm_rename_principal(void *server_handle,
731 						krb5_principal,krb5_principal);
732 ovsec_kadm_ret_t    ovsec_kadm_get_principal(void *server_handle,
733 					     krb5_principal principal,
734 					     ovsec_kadm_principal_ent_t *ent);
735 ovsec_kadm_ret_t    ovsec_kadm_chpass_principal(void *server_handle,
736 						krb5_principal principal,
737 						char *pass);
738 ovsec_kadm_ret_t    ovsec_kadm_randkey_principal(void *server_handle,
739 						 krb5_principal principal,
740 						 krb5_keyblock **keyblock);
741 ovsec_kadm_ret_t    ovsec_kadm_create_policy(void *server_handle,
742 					     ovsec_kadm_policy_ent_t ent,
743 					     long mask);
744 /*
745  * ovsec_kadm_create_policy_internal is not part of the supported,
746  * exposed API.  It is available only in the server library, and you
747  * shouldn't use it unless you know why it's there and how it's
748  * different from ovsec_kadm_create_policy.
749  */
750 ovsec_kadm_ret_t    ovsec_kadm_create_policy_internal(void *server_handle,
751 						      ovsec_kadm_policy_ent_t
752 						      entry, long mask);
753 ovsec_kadm_ret_t    ovsec_kadm_delete_policy(void *server_handle,
754 					     ovsec_kadm_policy_t policy);
755 ovsec_kadm_ret_t    ovsec_kadm_modify_policy(void *server_handle,
756 					     ovsec_kadm_policy_ent_t ent,
757 					     long mask);
758 /*
759  * ovsec_kadm_modify_policy_internal is not part of the supported,
760  * exposed API.  It is available only in the server library, and you
761  * shouldn't use it unless you know why it's there and how it's
762  * different from ovsec_kadm_modify_policy.
763  */
764 ovsec_kadm_ret_t    ovsec_kadm_modify_policy_internal(void *server_handle,
765 						      ovsec_kadm_policy_ent_t
766 						      entry, long mask);
767 ovsec_kadm_ret_t    ovsec_kadm_get_policy(void *server_handle,
768 					  ovsec_kadm_policy_t policy,
769 					  ovsec_kadm_policy_ent_t *ent);
770 ovsec_kadm_ret_t    ovsec_kadm_get_privs(void *server_handle,
771 					 long *privs);
772 
773 ovsec_kadm_ret_t    ovsec_kadm_chpass_principal_util(void *server_handle,
774 						     krb5_principal princ,
775 						     char *new_pw,
776 						     char **ret_pw,
777 						     char *msg_ret);
778 
779 ovsec_kadm_ret_t    ovsec_kadm_free_principal_ent(void *server_handle,
780 						  ovsec_kadm_principal_ent_t
781 						  ent);
782 ovsec_kadm_ret_t    ovsec_kadm_free_policy_ent(void *server_handle,
783 					       ovsec_kadm_policy_ent_t ent);
784 
785 ovsec_kadm_ret_t ovsec_kadm_free_name_list(void *server_handle,
786 					   char **names, int count);
787 
788 ovsec_kadm_ret_t    ovsec_kadm_get_principals(void *server_handle,
789 					      char *exp, char ***princs,
790 					      int *count);
791 
792 ovsec_kadm_ret_t    ovsec_kadm_get_policies(void *server_handle,
793 					    char *exp, char ***pols,
794 					    int *count);
795 
796 #define OVSEC_KADM_FAILURE KADM5_FAILURE
797 #define OVSEC_KADM_AUTH_GET KADM5_AUTH_GET
798 #define OVSEC_KADM_AUTH_ADD KADM5_AUTH_ADD
799 #define OVSEC_KADM_AUTH_MODIFY KADM5_AUTH_MODIFY
800 #define OVSEC_KADM_AUTH_DELETE KADM5_AUTH_DELETE
801 #define OVSEC_KADM_AUTH_INSUFFICIENT KADM5_AUTH_INSUFFICIENT
802 #define OVSEC_KADM_BAD_DB KADM5_BAD_DB
803 #define OVSEC_KADM_DUP KADM5_DUP
804 #define OVSEC_KADM_RPC_ERROR KADM5_RPC_ERROR
805 #define OVSEC_KADM_NO_SRV KADM5_NO_SRV
806 #define OVSEC_KADM_BAD_HIST_KEY KADM5_BAD_HIST_KEY
807 #define OVSEC_KADM_NOT_INIT KADM5_NOT_INIT
808 #define OVSEC_KADM_UNK_PRINC KADM5_UNK_PRINC
809 #define OVSEC_KADM_UNK_POLICY KADM5_UNK_POLICY
810 #define OVSEC_KADM_BAD_MASK KADM5_BAD_MASK
811 #define OVSEC_KADM_BAD_CLASS KADM5_BAD_CLASS
812 #define OVSEC_KADM_BAD_LENGTH KADM5_BAD_LENGTH
813 #define OVSEC_KADM_BAD_POLICY KADM5_BAD_POLICY
814 #define OVSEC_KADM_BAD_PRINCIPAL KADM5_BAD_PRINCIPAL
815 #define OVSEC_KADM_BAD_AUX_ATTR KADM5_BAD_AUX_ATTR
816 #define OVSEC_KADM_BAD_HISTORY KADM5_BAD_HISTORY
817 #define OVSEC_KADM_BAD_MIN_PASS_LIFE KADM5_BAD_MIN_PASS_LIFE
818 #define OVSEC_KADM_PASS_Q_TOOSHORT KADM5_PASS_Q_TOOSHORT
819 #define OVSEC_KADM_PASS_Q_CLASS KADM5_PASS_Q_CLASS
820 #define OVSEC_KADM_PASS_Q_DICT KADM5_PASS_Q_DICT
821 #define OVSEC_KADM_PASS_REUSE KADM5_PASS_REUSE
822 #define OVSEC_KADM_PASS_TOOSOON KADM5_PASS_TOOSOON
823 #define OVSEC_KADM_POLICY_REF KADM5_POLICY_REF
824 #define OVSEC_KADM_INIT KADM5_INIT
825 #define OVSEC_KADM_BAD_PASSWORD KADM5_BAD_PASSWORD
826 #define OVSEC_KADM_PROTECT_PRINCIPAL KADM5_PROTECT_PRINCIPAL
827 #define OVSEC_KADM_BAD_SERVER_HANDLE KADM5_BAD_SERVER_HANDLE
828 #define OVSEC_KADM_BAD_STRUCT_VERSION KADM5_BAD_STRUCT_VERSION
829 #define OVSEC_KADM_OLD_STRUCT_VERSION KADM5_OLD_STRUCT_VERSION
830 #define OVSEC_KADM_NEW_STRUCT_VERSION KADM5_NEW_STRUCT_VERSION
831 #define OVSEC_KADM_BAD_API_VERSION KADM5_BAD_API_VERSION
832 #define OVSEC_KADM_OLD_LIB_API_VERSION KADM5_OLD_LIB_API_VERSION
833 #define OVSEC_KADM_OLD_SERVER_API_VERSION KADM5_OLD_SERVER_API_VERSION
834 #define OVSEC_KADM_NEW_LIB_API_VERSION KADM5_NEW_LIB_API_VERSION
835 #define OVSEC_KADM_NEW_SERVER_API_VERSION KADM5_NEW_SERVER_API_VERSION
836 #define OVSEC_KADM_SECURE_PRINC_MISSING KADM5_SECURE_PRINC_MISSING
837 #define OVSEC_KADM_NO_RENAME_SALT KADM5_NO_RENAME_SALT
838 
839 #endif /* USE_KADM5_API_VERSION == 1 */
840 
841 #define MAXPRINCLEN 125
842 
843 void trunc_name(size_t *len, char **dots);
844 
845 krb5_chgpwd_prot _kadm5_get_kpasswd_protocol(void *server_handle);
846 kadm5_ret_t	kadm5_chpass_principal_v2(void *server_handle,
847 					krb5_principal princ,
848 					char *new_password,
849 					kadm5_ret_t *srvr_rsp_code,
850 					krb5_data *srvr_msg);
851 
852 void handle_chpw(krb5_context context, int s, void *serverhandle,
853 			kadm5_config_params *params);
854 
855 #ifdef __cplusplus
856 }
857 #endif
858 
859 #endif	/* __KADM5_ADMIN_H__ */
860