/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72V src/bos/usr/include/userpw.h 1.11.3.4                           */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1988,2019              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)92	1.11.3.4  src/bos/usr/include/userpw.h, cmdsauth, bos72V, v2020_04B1 11/19/19 13:59:42 */
/*
 * COMPONENT_NAME: (CMDSAUTH)
 *
 * FUNCTIONS: 
 *
 * ORIGINS: 27
 *
 * (C) COPYRIGHT International Business Machines Corp. 1988, 1994
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */

#ifndef _H_USERPW    
#define _H_USERPW

#include <standards.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/limits.h>
#include <sys/kernex_extension.h>

#ifdef __cplusplus
extern "C" {
#endif

/* function declarations	*/
#ifdef _NO_PROTO
	extern	struct userpw  	*getuserpw ();
	extern	struct userpwx  *getuserpwx ();
	extern	int		putuserpw ();
	extern	int		putuserpwx ();
	extern	int		putuserpwhist();
	extern	int		setpwdb ();
	extern	int		endpwdb ();
	extern	int		__login_name_max;
	extern	int		__get_login_name_max ();
	extern	int		max_pw_passlen();
	extern	int		__get_hash_pwd_len();
	extern	int		__get_hashed_pwd_len();
	extern	int		__get_salt_len();
	extern	int		__get_pwd_len_max();
	extern	int		__get_pwd_len_max_from_lpa();
	extern	int		__get_salt_len_max_from_lpa();

#else	
	extern	struct userpw  	*getuserpw (char *);
	extern	struct userpwx  *getuserpwx (char *);
	extern	int		putuserpw (struct userpw *);
	extern	int		putuserpwx (struct userpwx *);
	extern	int		putuserpwhist(struct userpw *, char **);
	extern	int		setpwdb (int);
	extern	int		endpwdb (void);
	extern	int		__login_name_max;
	extern	int		__get_login_name_max (void);
	extern	int		max_pw_passlen(void);
	extern	int		__get_hash_pwd_len(char *);
	extern	int		__get_hashed_pwd_len(char *);
	extern	int		__get_salt_len(void);
	extern	int		__get_pwd_len_max(void);
	extern	int		__get_pwd_len_max_from_lpa(char *);
	extern	int		__get_salt_len_max_from_lpa(char *);

#endif	/* _NO_PROTO */

/* manifest constants and limits	*/
#define	MAX_PASS	PASS_MAX

/*
 * The following symbols are for determining maximum possible sizes
 * when declaring arrays, memory etc.
 * MAXIMPL_PW_PASSLEN - password length in chars
 * MAXIMPL_PW_CRYPTLEN - encrypted pw length in chars
 * MAXIMPL_MAX_HISTSIZE - shell history entries
 * MAXIMPL_SALT - encryption salt
 * The following are for use at runtime to determine the maximum size
 * in the current configuration of the system. These are not suitable
 * for use in array declarations, etc.
 * PW_PASSLEN
 * PW_CRYPTLEN
 * MAX_HISTSIZE
 * MAX_SALT
 */
#define MAXIMPL_PW_PASSLEN      256
#define PW_PASSLEN   ((__extension_status & _EXTENSION_C2)? \
                       max_pw_passlen():__get_pwd_len_max())
#define MAXIMPL_PW_CRYPTLEN     255
#define PW_CRYPTLEN  ((__extension_status & _EXTENSION_C2)? \
                       encrypted_pw_passlen():13)
#define MAXIMPL_MAX_HISTSIZE    50
#define MAX_HISTSIZE ((__extension_status & _EXTENSION_C2)? \
                       max_history_size():50)
#define MAXIMPL_SALT            32
#define MAX_SALT     ((__extension_status & _EXTENSION_C2)? \
                       salt_len():__get_salt_len())

/*
 * Maximum password length supported by a LPA
 */
#define PW_PASSLEN_BY_LPA(lpa)	__get_pwd_len_max_from_lpa(lpa)

/*
 * Maximum length of hashed password generated by a LPA
 */
#define PW_CRYPTLEN_MAX(lpa)	__get_hash_pwd_len(lpa)

/*
 * The length of a hashed password
 */
#define PW_CRYPTLEN_HASHED(pwd)	__get_hashed_pwd_len(pwd)

/*
 * Maximum salt length supported by a LPA
 */
#define MAX_SALT_BY_LPA(lpa)	__get_salt_len_max_from_lpa(lpa)

#define PW_NAMELEN	L_cuserid	/* max length of a user's name */
					/* obsolete, use PW_USERNAME_LEN */

#define	PW_USERNAME_LEN	(__login_name_max ? __login_name_max : \
			(__login_name_max = __get_login_name_max ()))
#define	PW_GROUPNAME_LEN (__login_name_max ? __login_name_max : \
			 (__login_name_max = __get_login_name_max ()))
#define	MAXIMPL_LOGIN_NAME_MAX	256

#define	MIN_MINAGE	 0		/* minimum minage     value */
#define	MAX_MINAGE	52		/* maximum minage     value */
#define	MIN_MAXAGE	 0		/* minimum maxage     value */
#define	MAX_MAXAGE	52		/* maximum maxage     value */
#define	MIN_MAXEXP     (-1)		/* minimum maxexpired value */
#define	MAX_MAXEXP	52		/* maximum maxexpired value */
#define	MIN_MINALPHA	 0		/* minimum minalpha   value */
#define MAXIMPL_MAX_MINALPHA    MAXIMPL_PW_PASSLEN
#define	MAX_MINALPHA	PW_PASSLEN	/* maximum minalpha   value */
#define	MIN_MINOTHER	 0		/* minimum minother   value */
#define MAXIMPL_MAX_MINOTHER    MAXIMPL_PW_PASSLEN
#define	MAX_MINOTHER	PW_PASSLEN	/* maximum minother   value */
#define	MIN_MINDIFF	 0		/* minimum mindiff    value */
#define MAXIMPL_MAX_MINDIFF     MAXIMPL_PW_PASSLEN
#define	MAX_MINDIFF	PW_PASSLEN	/* maximum mindiff    value */
#define	MIN_MAXREP	 0		/* minimum maxrepeats value */
#define MAXIMPL_MAX_MAXREP      MAXIMPL_PW_PASSLEN
#define	MAX_MAXREP	PW_PASSLEN	/* maximum maxrepeats value */
#define	MIN_MINLEN	 0		/* minimum minlen     value */
#define MAXIMPL_MAX_MINLEN      MAXIMPL_PW_PASSLEN
#define	MAX_MINLEN	PW_PASSLEN	/* maximum minlen     value */

#define	MIN_HISTSIZE	 0		/* min value for histsize attribute */
#define MAXIMPL_MAX_HISTSIZE    50      /* maximum number of passwords kept */
#define	MIN_HISTEXPIRE	 0		/* min value for histexpire attribute */
#define	MAX_HISTEXPIRE	260		/* maximum interval is 5 years */

#define	PWDCHECKS_LIBPATH	"/usr/lib"


/* flags for user password */
#define	PW_NOCHECK	0x1
#define	PW_ADMCHG	0x2
#define	PW_ADMIN	0x4
#define	PW_NOMINAGE	0x8		/* Obsolete */

struct	userpw
{
	char	upw_name[PW_NAMELEN];	/* user's name */
	char	*upw_passwd;		/* user's passwd */
	unsigned int	upw_flags;		/* flags of restrictions */
	time_t	upw_lastupdate;		/* date of last passwd update */
};

struct userpwx
{
	char	*upw_name;  		/* user's name */
	char	*upw_passwd;  		/* user's passwd */
	unsigned int 	upw_flags; 	/* flags of restrictions */
	unsigned int	upw_padding;	/* padding for 64-bit alignment */
	time64_t upw_lastupdate;	/* date of last passwd update */
	char	upw_authdb[16];		/* method for this password */
	uint64_t upw_rsvd[4];		/* set to 0, reserved for future use */
};

#ifdef __cplusplus
}
#endif

#endif /* _H_USERPW */