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