1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 * 25 * Copyright 2012 Joshua M. Clulow <josh@sysmgr.org> 26 */ 27 28 #ifndef _PAM_IMPL_H 29 #define _PAM_IMPL_H 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #include <limits.h> 36 #include <shadow.h> 37 #include <sys/types.h> 38 39 #define PAMTXD "SUNW_OST_SYSOSPAM" 40 41 #define PAM_CONFIG "/etc/pam.conf" 42 #define PAM_CONFIG_DIR "/etc/pam.d/" 43 #define PAM_ISA "/$ISA/" 44 #define PAM_LIB_DIR "/usr/lib/security/" 45 #ifdef _LP64 46 #define PAM_ISA_DIR "/64/" 47 #else /* !_LP64 */ 48 #define PAM_ISA_DIR "/" 49 #endif /* _LP64 */ 50 51 /* Service Module Types */ 52 53 /* 54 * If new service types are added, they should be named in 55 * pam_framework.c::pam_snames[] as well. 56 */ 57 58 #define PAM_ACCOUNT_NAME "account" 59 #define PAM_AUTH_NAME "auth" 60 #define PAM_PASSWORD_NAME "password" 61 #define PAM_SESSION_NAME "session" 62 63 #define PAM_ACCOUNT_MODULE 0 64 #define PAM_AUTH_MODULE 1 65 #define PAM_PASSWORD_MODULE 2 66 #define PAM_SESSION_MODULE 3 67 68 #define PAM_NUM_MODULE_TYPES 4 69 70 /* Control Flags */ 71 72 #define PAM_BINDING_NAME "binding" 73 #define PAM_INCLUDE_NAME "include" 74 #define PAM_OPTIONAL_NAME "optional" 75 #define PAM_REQUIRED_NAME "required" 76 #define PAM_REQUISITE_NAME "requisite" 77 #define PAM_SUFFICIENT_NAME "sufficient" 78 79 #define PAM_BINDING 0x01 80 #define PAM_INCLUDE 0x02 81 #define PAM_OPTIONAL 0x04 82 #define PAM_REQUIRED 0x08 83 #define PAM_REQUISITE 0x10 84 #define PAM_SUFFICIENT 0x20 85 86 #define PAM_REQRD_BIND (PAM_REQUIRED | PAM_BINDING) 87 #define PAM_SUFFI_BIND (PAM_SUFFICIENT | PAM_BINDING) 88 89 /* Function Indicators */ 90 91 #define PAM_AUTHENTICATE 1 92 #define PAM_SETCRED 2 93 #define PAM_ACCT_MGMT 3 94 #define PAM_OPEN_SESSION 4 95 #define PAM_CLOSE_SESSION 5 96 #define PAM_CHAUTHTOK 6 97 98 /* PAM tracing */ 99 100 #define PAM_DEBUG "/etc/pam_debug" 101 #define LOG_PRIORITY "log_priority=" 102 #define LOG_FACILITY "log_facility=" 103 #define DEBUG_FLAGS "debug_flags=" 104 #define PAM_DEBUG_NONE 0x0000 105 #define PAM_DEBUG_DEFAULT 0x0001 106 #define PAM_DEBUG_ITEM 0x0002 107 #define PAM_DEBUG_MODULE 0x0004 108 #define PAM_DEBUG_CONF 0x0008 109 #define PAM_DEBUG_DATA 0x0010 110 #define PAM_DEBUG_CONV 0x0020 111 #define PAM_DEBUG_AUTHTOK 0x8000 112 113 #define PAM_MAX_ITEMS 64 /* Max number of items */ 114 #define PAM_MAX_INCLUDE 32 /* Max include flag recursions */ 115 116 /* authentication module functions */ 117 #define PAM_SM_AUTHENTICATE "pam_sm_authenticate" 118 #define PAM_SM_SETCRED "pam_sm_setcred" 119 120 /* session module functions */ 121 #define PAM_SM_OPEN_SESSION "pam_sm_open_session" 122 #define PAM_SM_CLOSE_SESSION "pam_sm_close_session" 123 124 /* password module functions */ 125 #define PAM_SM_CHAUTHTOK "pam_sm_chauthtok" 126 127 /* account module functions */ 128 #define PAM_SM_ACCT_MGMT "pam_sm_acct_mgmt" 129 130 /* max # of authentication token attributes */ 131 #define PAM_MAX_NUM_ATTR 10 132 133 /* max size (in chars) of an authentication token attribute */ 134 #define PAM_MAX_ATTR_SIZE 80 135 136 /* utility function prototypes */ 137 138 /* source values when calling __pam_get_authtok() */ 139 #define PAM_PROMPT 1 /* prompt user for new password */ 140 #define PAM_HANDLE 2 /* get password from pam handle (item) */ 141 142 #if PASS_MAX >= PAM_MAX_RESP_SIZE 143 #error PASS_MAX > PAM_MAX_RESP_SIZE 144 #endif /* PASS_MAX >= PAM_MAX_RESP_SIZE */ 145 146 extern int 147 __pam_get_authtok(pam_handle_t *pamh, int source, int type, char *prompt, 148 char **authtok); 149 150 extern int 151 __pam_display_msg(pam_handle_t *pamh, int msg_style, int num_msg, 152 char messages[PAM_MAX_NUM_MSG][PAM_MAX_MSG_SIZE], void *conv_apdp); 153 154 extern void 155 __pam_log(int priority, const char *format, ...); 156 157 /* file handle for pam.conf */ 158 struct pam_fh { 159 int fconfig; /* file descriptor returned by open() */ 160 char line[256]; 161 size_t bufsize; /* size of the buffer which holds */ 162 /* the content of pam.conf */ 163 char *bufferp; /* used to process data */ 164 char *data; /* contents of pam.conf */ 165 }; 166 167 /* items that can be set/retrieved thru pam_[sg]et_item() */ 168 struct pam_item { 169 void *pi_addr; /* pointer to item */ 170 int pi_size; /* size of item */ 171 }; 172 173 /* module specific data stored in the pam handle */ 174 struct pam_module_data { 175 char *module_data_name; /* unique module data name */ 176 void *data; /* the module specific data */ 177 void (*cleanup)(pam_handle_t *pamh, void *data, int pam_status); 178 struct pam_module_data *next; /* pointer to next module data */ 179 }; 180 181 /* each entry from pam.conf is stored here (in the pam handle) */ 182 typedef struct pamtab { 183 char *pam_service; /* PAM service, e.g. login, rlogin */ 184 int pam_type; /* AUTH, ACCOUNT, PASSWORD, SESSION */ 185 int pam_flag; /* required, optional, sufficient */ 186 int pam_err; /* error if line overflow */ 187 char *module_path; /* module library */ 188 int module_argc; /* module specific options */ 189 char **module_argv; 190 void *function_ptr; /* pointer to struct holding function ptrs */ 191 struct pamtab *next; 192 } pamtab_t; 193 194 /* list of open fd's (modules that were dlopen'd) */ 195 typedef struct fd_list { 196 void *mh; /* module handle */ 197 struct fd_list *next; 198 } fd_list; 199 200 /* list of PAM environment varialbes */ 201 typedef struct env_list { 202 char *name; 203 char *value; 204 struct env_list *next; 205 } env_list; 206 207 /* pam_inmodule values for pam item checking */ 208 #define RW_OK 0 /* Read Write items OK */ 209 #define RO_OK 1 /* Read Only items OK */ 210 #define WO_OK 2 /* Write Only items/data OK */ 211 212 /* the pam handle */ 213 struct pam_handle { 214 struct pam_item ps_item[PAM_MAX_ITEMS]; /* array of PAM items */ 215 int include_depth; 216 int pam_inmodule; /* Protect restricted pam_get_item calls */ 217 char *pam_conf_name[PAM_MAX_INCLUDE+1]; 218 pamtab_t *pam_conf_info[PAM_MAX_INCLUDE+1][PAM_NUM_MODULE_TYPES]; 219 pamtab_t *pam_conf_modulep[PAM_MAX_INCLUDE+1]; 220 struct pam_module_data *ssd; /* module specific data */ 221 fd_list *fd; /* module fd's */ 222 env_list *pam_env; /* environment variables */ 223 }; 224 225 /* 226 * the function_ptr field in pamtab_t 227 * will point to one of these modules 228 */ 229 struct auth_module { 230 int (*pam_sm_authenticate)(pam_handle_t *pamh, int flags, int argc, 231 const char **argv); 232 int (*pam_sm_setcred)(pam_handle_t *pamh, int flags, int argc, 233 const char **argv); 234 }; 235 236 struct password_module { 237 int (*pam_sm_chauthtok)(pam_handle_t *pamh, int flags, int argc, 238 const char **argv); 239 }; 240 241 struct session_module { 242 int (*pam_sm_open_session)(pam_handle_t *pamh, int flags, int argc, 243 const char **argv); 244 int (*pam_sm_close_session)(pam_handle_t *pamh, int flags, int argc, 245 const char **argv); 246 }; 247 248 struct account_module { 249 int (*pam_sm_acct_mgmt)(pam_handle_t *pamh, int flags, int argc, 250 const char **argv); 251 }; 252 253 #ifdef __cplusplus 254 } 255 #endif 256 257 #endif /* _PAM_IMPL_H */