Current Path : /compat/linux/proc/self/root/usr/local/include/sasl1/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //compat/linux/proc/self/root/usr/local/include/sasl1/sasl.h |
/* This is a proposed C API for support of SASL * * Basic Type Summary: * sasl_conn_t Context for a SASL connection negotiation * sasl_ssf_t Security layer Strength Factor * sasl_callback_t A typed client/server callback function and context * sasl_interact_t A client interaction descriptor * sasl_secret_t A client authentication secret/credentials/passphrase * sasl_rand_t Random data context structure * sasl_security_properties_t An application's required security level * sasl_external_properties_t Security provided by an external security layer * * Callbacks: * sasl_getopt_t client/server: Get an option value * sasl_log_t client/server: Log message handler * sasl_getpath_t client/server: Get path to search for mechanisms * sasl_getsimple_t client: Get user/language list * sasl_getsecret_t client: Get authentication secret * sasl_chalprompt_t client: Display challenge and prompt for response * sasl_authorize_t server: Authorize policy callback * sasl_server_getsecret_t server: User secret database read * sasl_server_putsecret_t server: User secret database write * * Client/Server Function Summary: * sasl_done Release all SASL global state * sasl_dispose Connection done: Dispose of sasl_conn_t * sasl_getprop Get property (e.g., user name, security layer info) * sasl_setprop Set property (e.g., external ssf) * sasl_usererr Translate server error code to user error code * sasl_errstring Translate sasl error code to a string * sasl_encode Encode data to send using security layer * sasl_decode Decode data received using security layer * * Client Function Summary: * sasl_client_init Load and initialize client plug-ins (call once) * sasl_client_new Initialize client connection context: sasl_conn_t * sasl_client_start Select mechanism for connection * sasl_client_step Perform one authentication step * sasl_client_auth Create client secret (e.g., from a user & passphrase) * sasl_free_secret Erase & Dispose of a sasl_secret_t * * Server Function Summary * sasl_server_init Load and initialize server plug-ins (call once) * sasl_server_new Initialize server connection context: sasl_conn_t * sasl_listmech Create list of available mechanisms * sasl_server_start Begin an authentication exchange * sasl_server_step Perform one authentication exchange step * sasl_checkpass Check a plaintext passphrase * sasl_checkapop Check an APOP challenge/response (optional) * sasl_userexists Check if user exists * sasl_setpass Change a password or add a user entry * * Basic client model: * 1. client calls sasl_client_init() at startup to load plug-ins * 2. when connection formed, call sasl_client_new() * 3. once list of supported mechanisms received from server, client * calls sasl_client_start(). goto 4a * 4. client calls sasl_client_step() * [4a. If SASL_INTERACT, fill in prompts and goto 4 * -- doesn't happen if callbacks provided] * 4b. If SASL error, goto 7 or 3 * 4c. If SASL_OK, continue or goto 6 if last server response was success * 5. send message to server, wait for response * 5a. On data or success with server response, goto 4 * 5b. On failure goto 7 or 3 * 5c. On success with no server response continue * 6. continue with application protocol until connection closes * call sasl_getprop/sasl_encode/sasl_decode() if using security layer * 7. call sasl_dispose(), may return to step 2 * 8. call sasl_done() when program terminates * * Basic Server model: * 1. call sasl_server_init() at startup to load plug-ins * 2. On connection, call sasl_server_new() * [3. call sasl_listmech() and send list to client] * 4. after client AUTH command, call sasl_server_start(), goto 5a * 5. call sasl_server_step() * 5a. If SASL_CONTINUE, output to client, wait response, repeat 5 * 5b. If SASL error, then goto 7 * 5c. If SASL_OK, move on * 6. continue with application protocol until connection closes * call sasl_getprop/sasl_encode/sasl_decode() if using security layer * 7. call sasl_dispose(), may return to step 2 * 8. call sasl_done() when program terminates * */ #ifndef SASL_H #define SASL_H 1 #define SASL_VERSION_MAJOR 1 #define SASL_VERSION_MINOR 5 #define SASL_VERSION_STEP 28 /* The following ifdef block is the standard way of creating macros * which make exporting from a DLL simpler. All files within this DLL * are compiled with the LIBSASL_EXPORTS symbol defined on the command * line. this symbol should not be defined on any project that uses * this DLL. This way any other project whose source files include * this file see LIBSASL_API functions as being imported from a DLL, * wheras this DLL sees symbols defined with this macro as being * exported. */ /* Under Unix, life is simpler: we just need to mark library functions * as extern. (Technically, we don't even have to do that.) */ #ifdef WIN32 # ifdef LIBSASL_EXPORTS # define LIBSASL_API __declspec(dllexport) # else /* LIBSASL_EXPORTS */ # define LIBSASL_API __declspec(dllimport) # endif /* LIBSASL_EXPORTS */ #else /* WIN32 */ # define LIBSASL_API extern #endif /* WIN32 */ /************* * Basic API * *************/ /* SASL result codes: */ #define SASL_CONTINUE (1) /* another step is needed in authentication */ #define SASL_OK (0) /* successful result */ #define SASL_FAIL (-1) /* generic failure */ #define SASL_NOMEM (-2) /* memory shortage failure */ #define SASL_BUFOVER (-3) /* overflowed buffer */ #define SASL_NOMECH (-4) /* mechanism not supported */ #define SASL_BADPROT (-5) /* bad protocol / cancel */ #define SASL_NOTDONE (-6) /* can't request info until later in exchange */ #define SASL_BADPARAM (-7) /* invalid parameter supplied */ #define SASL_TRYAGAIN (-8) /* transient failure (e.g., weak key) */ #define SASL_BADMAC (-9) /* integrity check failed */ /* -- client only codes -- */ #define SASL_INTERACT (2) /* needs user interaction */ #define SASL_BADSERV (-10) /* server failed mutual authentication step */ #define SASL_WRONGMECH (-11) /* mechanism doesn't support requested feature */ #define SASL_NEWSECRET (-12) /* new secret needed */ /* -- server only codes -- */ #define SASL_BADAUTH (-13) /* authentication failure */ #define SASL_NOAUTHZ (-14) /* authorization failure */ #define SASL_TOOWEAK (-15) /* mechanism too weak for this user */ #define SASL_ENCRYPT (-16) /* encryption needed to use mechanism */ #define SASL_TRANS (-17) /* One time use of a plaintext password will enable requested mechanism for user */ #define SASL_EXPIRED (-18) /* passphrase expired, has to be reset */ #define SASL_DISABLED (-19) /* account disabled */ #define SASL_NOUSER (-20) /* user not found */ #define SASL_PWLOCK (-21) /* password locked */ #define SASL_NOCHANGE (-22) /* requested change was not needed */ #define SASL_BADVERS (-23) /* version mismatch with plug-in */ #define SASL_NOPATH (-25) /* path not set */ /* max size of a sasl mechanism name */ #define SASL_MECHNAMEMAX 20 /* per-connection SASL negotiation state for client or server */ typedef struct sasl_conn sasl_conn_t; /* opaque passphrase/secret kept encrypted by API middleware * can be used by caller for single sign-on * client "KEY" option will be used as key for * clients which offer a save-to-disk option. */ typedef struct sasl_secret { unsigned long len; char data[1]; /* variable sized */ } sasl_secret_t; /* random data context structure */ typedef struct sasl_rand_s sasl_rand_t; /**************************** * Configure Basic Services * ****************************/ /* the following functions are used to adjust how allocation and mutexes work * they must be called before all other SASL functions: */ /* memory allocation functions which may optionally be replaced: */ typedef void *sasl_malloc_t(unsigned long); typedef void *sasl_calloc_t(unsigned long, unsigned long); typedef void *sasl_realloc_t(void *, unsigned long); typedef void sasl_free_t(void *); LIBSASL_API void sasl_set_alloc(sasl_malloc_t *, sasl_calloc_t *, sasl_realloc_t *, sasl_free_t *); /* mutex functions which may optionally be replaced: * sasl_mutex_new allocates a mutex structure * sasl_mutex_lock blocks until mutex locked * returns SASL_FAIL on deadlock or parameter error * returns SASL_OK on success * sasl_mutex_unlock unlocks mutex if it's locked * returns SASL_FAIL if not locked or parameter error * returns SASL_OK on success */ typedef void *sasl_mutex_new_t(); typedef int sasl_mutex_lock_t(void *mutex); typedef int sasl_mutex_unlock_t(void *mutex); typedef void sasl_mutex_dispose_t(void *mutex); LIBSASL_API void sasl_set_mutex(sasl_mutex_new_t *, sasl_mutex_lock_t *, sasl_mutex_unlock_t *, sasl_mutex_dispose_t *); /***************************** * Security preference types * *****************************/ /* security layer strength factor -- an unsigned integer usable by the caller * to specify approximate security layer strength desired. Roughly * correlated to effective key length for encryption. * 0 = no protection * 1 = integrity protection only * 40 = 40-bit DES or 40-bit RC2/RC4 * 56 = DES * 112 = triple-DES * 128 = 128-bit RC2/RC4/BLOWFISH */ typedef unsigned sasl_ssf_t; /* secflags provided on sasl_server_new and sasl_client_new: */ #define SASL_SECURITY_LAYER (0x0001) /* caller supports security layer */ /*************************** * Security Property Types * ***************************/ /* Structure specifying the client or server's security policy * and optional additional properties. */ /* These are the various security flags apps can specify. */ /* NOPLAINTEXT -- don't permit mechanisms susceptible to simple * passive attack (e.g., PLAIN, LOGIN) * NOACTIVE -- protection from active (non-dictionary) attacks * during authentication exchange. * Authenticates server. * NODICTIONARY -- don't permit mechanisms susceptible to passive * dictionary attack * FORWARD_SECRECY -- require forward secrecy between sessions * (breaking one won't help break next) * NOANONYMOUS -- don't permit mechanisms that allow anonymous login * PASS_CREDENTIALS -- require mechanisms which pass client * credentials, and allow mechanisms which can pass * credentials to do so */ #define SASL_SEC_NOPLAINTEXT (0x0001) #define SASL_SEC_NOACTIVE (0x0002) #define SASL_SEC_NODICTIONARY (0x0004) #define SASL_SEC_FORWARD_SECRECY (0x0008) #define SASL_SEC_NOANONYMOUS (0x0010) #define SASL_SEC_PASS_CREDENTIALS (0x0200) typedef struct sasl_security_properties { /* security strength factor * min_ssf = minimum acceptable final level * max_ssf = maximum acceptable final level */ sasl_ssf_t min_ssf; sasl_ssf_t max_ssf; /* Maximum security layer receive buffer size. * 0=security layer not supported */ unsigned maxbufsize; /* bitfield for security properties -- see SASL_SEC_* above */ int security_flags; /* NULL terminated array of additional property names, values */ const char **property_names; const char **property_values; } sasl_security_properties_t; /* Structure communicating the characteristics of an external security * mechanism. This is used with sasl_setprop() to inform the library * of an active external security layer. If the auth_id is non-NULL, * this enables the EXTERNAL authentication mechanism; this may also * allow other mechanisms to become active (for instance, if an * application demands encryption, mechanisms which solely provide * authentication might become active if the necessary encryption is * provided external to SASL). Since this potentially changes the * list of supported mechanisms, the mechanism list should be re-sent, * if it has been sent already. */ typedef struct sasl_external_properties { /* security provided by the external mechanism */ sasl_ssf_t ssf; /* authorization identity provided by the external mechanism */ char *auth_id; } sasl_external_properties_t; /****************** * Callback types * ******************/ /* Extensible type for a client/server callbacks * id -- identifies callback type * proc -- procedure call arguments vary based on id * context -- context passed to procedure */ typedef struct sasl_callback { /* Identifies the type of the callback function. * Mechanisms must ignore callbacks with id's they don't recognize. */ unsigned long id; int (*proc)(); /* Callback function. Types of arguments vary by 'id' */ void *context; } sasl_callback_t; /* callback ids & functions: */ #define SASL_CB_LIST_END (0) /* end of list */ /* option reading callback -- this allows a SASL configuration to be * encapsulated in the caller's configuration system. Some implementations * may use default config file(s) if this is omitted. Configuration items * may be plugin-specific and are arbitrary strings. * * inputs: * context -- option context from callback record * plugin_name -- name of plugin (NULL = general SASL option) * option -- name of option * output: * result -- set to result which persists until next getopt in * same thread, unchanged if option not found * len -- length of result (optional) * returns: * SASL_OK -- no error * SASL_FAIL -- error */ typedef int sasl_getopt_t(void *context, const char *plugin_name, const char *option, const char **result, unsigned *len); #define SASL_CB_GETOPT (1) /* Logging levels for use with the logging callback function. */ #define SASL_LOG_ERR (1) /* error message */ #define SASL_LOG_WARNING (2) /* warning message */ #define SASL_LOG_INFO (3) /* normal message */ /* logging callback -- this allows plugins and the middleware to * log operations they perform. * inputs: * context -- logging context from the callback record * priority -- logging priority; see above * message -- message to log * returns: * SASL_OK -- no error * SASL_FAIL -- error */ typedef int sasl_log_t(void *context, int priority, const char *message); #define SASL_CB_LOG (2) /* getpath callback -- this allows applications to specify the * colon-separated path to search for plugins (by default, * taken from the SASL_PATH environment variable). * inputs: * context -- getpath context from the callback record * outputs: * path -- colon seperated path (allocated on the heap; the * library will free it using the sasl_free_t * * passed to sasl_set_alloc(), or the standard free() * library call). * returns: * SASL_OK -- no error * SASL_FAIL -- error */ typedef int sasl_getpath_t(void * context, char ** path); #define SASL_CB_GETPATH (3) /* verify file callback -- this allows applications to check if they * want SASL to use files, file by file. This is intended to allow * applications to sanity check the environment to make sure plugins * or the configuration file can't be written to, etc. * inputs: * context -- verifypath context from the callback record * file -- full path to file to verify * type -- type of file to verify * returns: * SASL_OK -- no error (file can safely be used) * SASL_CONTINUE -- continue WITHOUT using this file * SASL_FAIL -- error */ typedef int sasl_verifyfile_t(void * context, const char * file, const int type); #define SASL_CB_VERIFYFILE (4) /* these are the types of files libsasl will ask about */ #define SASL_VRFY_PLUGIN (1) #define SASL_VRFY_CONF (2) #define SASL_VRFY_PASSWD (3) #define SASL_VRFY_OTHER (4) /* client/user interaction callbacks: */ /* Simple prompt -- result must persist until next call to getsimple or * until connection context is disposed * inputs: * context -- context from callback structure * id -- callback id * outputs: * result -- set to NUL terminated string * NULL = user cancel * len -- length of result, ignored with SASL_CB_SECRET * returns SASL_OK */ typedef int sasl_getsimple_t(void *context, int id, const char **result, unsigned *len); #define SASL_CB_USER (0x4001) /* client user identity to login as */ #define SASL_CB_AUTHNAME (0x4002) /* client authentication name, * defaults to authid in sasl_secret_t */ #define SASL_CB_LANGUAGE (0x4003) /* comma separated list of RFC 1766 * language codes in order of preference * to be used to localize client prompts * or server error codes */ /* get a sasl_secret_t * psecret -- may be left NULL if sasl_client_auth() called * returns SASL_OK */ typedef int sasl_getsecret_t(sasl_conn_t *conn, void *context, int id, sasl_secret_t **psecret); #define SASL_CB_PASS (0x4004) /* client passphrase-based secret */ /* prompt for input in response to a challenge, result is copied & erased * by caller. * input: * context -- context from callback structure * id -- callback id * challenge -- server challenge * output: * result -- NUL terminated result, NULL = user cancel * len -- length of result * returns SASL_OK */ typedef int sasl_chalprompt_t(void *context, int id, const char *challenge, const char *prompt, const char *defresult, const char **result, unsigned *len); #define SASL_CB_ECHOPROMPT (0x4005) /* challenge and client-entered result */ #define SASL_CB_NOECHOPROMPT (0x4006) /* challenge and client-entered result */ /* prompt (or autoselect) the realm to do authentication in. * may get a list of valid realms. * input: * context -- context from callback structure * id -- callback id * availrealms -- available realms; string list; NULL terminated * output: * result -- NUL terminated realm; NULL is equivalent to "" * returns SASL_OK * result must persist until the next callback */ /* If there is an interaction with SASL_CB_GETREALM the challenge of * the sasl_interact_t will be of the format: {realm1, realm2, * ...}. That is a list of possible realms seperated by comma spaces * enclosed by brackets. */ typedef int sasl_getrealm_t(void *context, int id, const char **availrealms, const char **result); #define SASL_CB_GETREALM (0x4007) /* realm to attempt authentication in */ /* server callbacks: */ /* callback to verify authorization * requested_user -- the identity/username to authorize * auth_identity -- the identity associated with the secret * if the identity is not in the realm specified in * sasl_server_new, it will be of the form user@realm * return: * user -- NULL = requested_user, otherwise canonicalized * errstr -- can be set to error string on failure * returns SASL_OK on success, SASL_BADAUTH or other SASL response on failure */ typedef int sasl_authorize_t(void *context, const char *auth_identity, const char *requested_user, const char **user, const char **errstr); #define SASL_CB_PROXY_POLICY (0x8001) /* callback to lookup a user's secret for a mechanism * mechanism -- the mechanism requesting its secret * auth_identity -- the identity being looked up * realm -- the realm the identity is in * return: * secret -- the secret associated with this user * for this mechanism * returns SASL_OK on success or other SASL response on failure */ typedef int sasl_server_getsecret_t(void *context, const char *mechanism, const char *auth_identity, const char *realm, sasl_secret_t ** secret); #define SASL_CB_SERVER_GETSECRET (0x8002) /* callback to store a user's secret for a mechanism * mechanism -- the mechanism storing its secret * auth_identity -- the identity being stored * realm -- the realm the identity is in * secret -- the secret associated with this user * for this mechanism. If NULL, user's secret * for this mechanism will be erased. * returns SASL_OK on success or other SASL response on failure */ typedef int sasl_server_putsecret_t(void *context, const char *mechanism, const char *auth_identity, const char *realm, const sasl_secret_t * secret); #define SASL_CB_SERVER_PUTSECRET (0x8003) /********************************** * Common Client/server functions * **********************************/ /* dispose of all SASL plugins. Connection * states have to be disposed of before calling this. */ LIBSASL_API void sasl_done(void); /* dispose connection state, sets it to NULL * checks for pointer to NULL */ LIBSASL_API void sasl_dispose(sasl_conn_t **pconn); /* translate server error code to user error code * currently only maps SASL_NOUSER to SASL_BADAUTH */ LIBSASL_API int sasl_usererr(int saslerr); /* translate an error number into a string * input: * saslerr -- the error number * langlist -- comma separated list of RFC 1766 languages (may be NULL) * results: * outlang -- the language actually used (may be NULL if don't care) * returns: * the error message */ LIBSASL_API const char *sasl_errstring(int saslerr, const char *langlist, const char **outlang); /* get property from SASL connection state * propnum -- property number * pvalue -- pointer to value * returns: * SASL_OK -- no error * SASL_NOTDONE -- property not available yet * SASL_BADPARAM -- bad property number */ LIBSASL_API int sasl_getprop(sasl_conn_t *conn, int propnum, void **pvalue); #define SASL_USERNAME 0 /* pointer to NUL terminated user name */ #define SASL_SSF 1 /* security layer security strength factor, * if 0, call to sasl_encode, sasl_decode * unnecessary */ #define SASL_MAXOUTBUF 2 /* security layer max output buf unsigned */ #define SASL_REALM 3 /* server authentication realm used */ #define SASL_GETOPTCTX 4 /* context for getopt callback */ #define SASL_IP_LOCAL 5 /* local address (pvalue=sockaddr_in *) */ #define SASL_IP_REMOTE 6 /* remote address (pvalue=sockaddr_in *) */ /* set property in SASL connection state * returns: * SASL_OK -- value set * SASL_BADPARAM -- invalid property or value */ LIBSASL_API int sasl_setprop(sasl_conn_t *conn, int propnum, const void *value); #define SASL_SSF_EXTERNAL 100 /* external SSF active -- * sasl_external_properties_t */ #define SASL_SEC_PROPS 101 /* sasl_security_properties_t */ /* also allows SASL_IP_LOCAL, SASL_IP_REMOTE */ /* do precalculations during an idle period or network round trip * may pass NULL to precompute for some mechanisms prior to connect * returns 1 if action taken, 0 if no action taken */ LIBSASL_API int sasl_idle(sasl_conn_t *conn); /************** * Client API * **************/ /* list of client interactions with user for caller to fill in */ typedef struct sasl_interact { unsigned long id; /* same as client/user callback ID */ const char *challenge; /* may be computer readable */ const char *prompt; /* always human readable */ const char *defresult; /* default result string */ void *result; /* set to point to result -- this will * be freed by the library iff it * would be freed by the library if * returned from normal callback of * the same id */ unsigned len; /* set to length of result */ } sasl_interact_t; /* initialize the SASL client drivers * callbacks -- base callbacks for all client connections * returns: * SASL_OK -- Success * SASL_NOMEM -- Not enough memory * SASL_BADVERS -- Mechanism version mismatch * SASL_BADPARAM -- error in config file * SASL_NOMECH -- No mechanisms available * ... */ LIBSASL_API int sasl_client_init(const sasl_callback_t *callbacks); /* initialize a client exchange based on the specified mechanism * service -- registered name of the service using SASL (e.g. "imap") * serverFQDN -- the fully qualified domain name of the server * prompt_supp -- list of client interactions supported * may also include sasl_getopt_t context & call * NULL prompt_supp = user/pass via SASL_INTERACT only * NULL proc = interaction supported via SASL_INTERACT * secflags -- security flags (see above) * in/out: * pconn -- connection negotiation structure * pointer to NULL => allocate new * * Returns: * SASL_OK -- success * SASL_NOMECH -- no mechanism meets requested properties * SASL_NOMEM -- not enough memory */ LIBSASL_API int sasl_client_new(const char *service, const char *serverFQDN, const sasl_callback_t *prompt_supp, int secflags, sasl_conn_t **pconn); /* select a mechanism for a connection * mechlist -- mechanisms server has available (punctuation ignored) * secret -- optional secret from previous session * output: * prompt_need -- on SASL_INTERACT, list of prompts needed to continue * clientout -- the initial client response to send to the server * mech -- set to mechanism name * * Returns: * SASL_OK -- success * SASL_NOMEM -- not enough memory * SASL_NOMECH -- no mechanism meets requested properties * SASL_INTERACT -- user interaction needed to fill in prompt_need list */ LIBSASL_API int sasl_client_start(sasl_conn_t *conn, const char *mechlist, sasl_secret_t *secret, sasl_interact_t **prompt_need, char **clientout, unsigned *clientoutlen, const char **mech); /* do a single authentication step. * serverin -- the server message received by the client, MUST have a NUL * sentinel, not counted by serverinlen * output: * prompt_need -- on SASL_INTERACT, list of prompts needed to continue * clientout -- the client response to send to the server * * returns: * SASL_OK -- success * SASL_INTERACT -- user interaction needed to fill in prompt_need list * SASL_BADPROT -- server protocol incorrect/cancelled * SASL_BADSERV -- server failed mutual auth */ LIBSASL_API int sasl_client_step(sasl_conn_t *conn, const char *serverin, unsigned serverinlen, sasl_interact_t **prompt_need, char **clientout, unsigned *clientoutlen); /* Set connection secret based on passphrase * may be used in SASL_CB_PASS callback * input: * user -- username * pass -- plaintext passphrase with NUL sentinel * passlen -- 0 = strlen(pass) * out: * prompts -- if non-NULL, SASL_CB_PASS item filled in * keepcopy -- set to copy of secret if non-NULL * returns: * SASL_OK -- success * SASL_NOMEM -- failure */ LIBSASL_API int sasl_client_auth(sasl_conn_t *conn, const char *user, const char *pass, unsigned passlen, sasl_interact_t *prompts, sasl_secret_t **keepcopy); /* erase & dispose of a sasl_secret_t * calls free utility last set by sasl_set_alloc */ LIBSASL_API void sasl_free_secret(sasl_secret_t **); /************** * Server API * **************/ /* initialize server drivers, done once per process * callbacks -- base callbacks for all server connections * appname -- name of calling application (for lower level logging) * results: * state -- server state * returns: * SASL_OK -- success * SASL_BADPARAM -- error in config file * SASL_NOMEM -- memory failure * SASL_BADVERS -- Mechanism version mismatch */ LIBSASL_API int sasl_server_init(const sasl_callback_t *callbacks, const char *appname); /* create context for a single SASL connection * service -- registered name of the service using SASL (e.g. "imap") * serverFQDN -- Fully qualified server domain name. NULL means use * gethostname(). Useful for multi-homed servers. * user_realm -- permits multiple user domains on server, NULL = default * callbacks -- callbacks (e.g., authorization, lang, new getopt context) * secflags -- security flags (see above) * returns: * pconn -- new connection context * * returns: * SASL_OK -- success * SASL_NOMEM -- not enough memory */ LIBSASL_API int sasl_server_new(const char *service, const char *serverFQDN, const char *user_realm, const sasl_callback_t *callbacks, int secflags, sasl_conn_t **pconn); /* This returns a list of mechanisms in a NUL-terminated string * user -- restricts mechanisms to those available to that user * (may be NULL) * prefix -- appended to beginning of result * sep -- appended between mechanisms * suffix -- appended to end of result * results: * result -- NUL terminated allocated result, caller must free * plen -- gets length of result (excluding NUL), may be NULL * pcount -- gets number of mechanisms, may be NULL * * returns: * SASL_OK -- success * SASL_NOMEM -- not enough memory * SASL_NOMECH -- no enabled mechanisms */ LIBSASL_API int sasl_listmech(sasl_conn_t *conn, const char *user, const char *prefix, const char *sep, const char *suffix, char **result, unsigned *plen, unsigned *pcount); /* start a mechanism exchange within a connection context * mech -- the mechanism name client requested * clientin -- client initial response, NULL if empty * clientinlen -- length of initial response * serverout -- initial server challenge, NULL if done * serveroutlen -- length of initial server challenge * output: * pconn -- the connection negotiation state on success * errstr -- set to string to send to user on failure * * Same returns as sasl_server_step() */ LIBSASL_API int sasl_server_start(sasl_conn_t *conn, const char *mech, const char *clientin, unsigned clientinlen, char **serverout, unsigned *serveroutlen, const char **errstr); /* perform one step of the SASL exchange * inputlen & input -- client data * NULL on first step if no optional client step * outputlen & output -- set to the server data to transmit * to the client in the next step * errstr -- set to a more text error message from * a lower level mechanism on failure * * returns: * SASL_OK -- exchange is complete. * SASL_CONTINUE -- indicates another step is necessary. * SASL_TRANS -- entry for user exists, but not for mechanism * and transition is possible * SASL_BADPARAM -- service name needed * SASL_BADPROT -- invalid input from client * ... */ LIBSASL_API int sasl_server_step(sasl_conn_t *conn, const char *clientin, unsigned clientinlen, char **serverout, unsigned *serveroutlen, const char **errstr); /* check if a plaintext password is valid * if user is NULL, check if plaintext is enabled * inputs: * user -- user to query in current user_realm * userlen -- length of username, 0 = strlen(user) * pass -- plaintext password to check * passlen -- length of password, 0 = strlen(pass) * outputs: * errstr -- set to error message for use in protocols * returns * SASL_OK -- success * SASL_NOMECH -- user found, but no verifier * SASL_NOUSER -- user not found */ LIBSASL_API int sasl_checkpass(sasl_conn_t *conn, const char *user, unsigned userlen, const char *pass, unsigned passlen, const char **errstr); /* check if a user exists on server * service -- registered name of the service using SASL (e.g. "imap") * user_realm -- permits multiple user domains on server, NULL = default * user -- NUL terminated user name * * returns: * SASL_OK -- success * SASL_DISABLED -- account disabled * SASL_NOUSER -- user not found * SASL_NOMECH -- user found, but no usable mechanism */ LIBSASL_API int sasl_user_exists(const char *service, const char *user_realm, const char *user); /* check if an APOP exchange is valid * (note this is an optional part of the SASL API) * inputs: * user -- user to query in current user_realm * userlen -- length of username, 0 = strlen(user) * challenge -- challenge which was sent to client * challen -- length of challenge, 0 = strlen(challenge) * response -- client response string: "32HEXDIGIT" * resplen -- length of response, 0 = strlen(response) * outputs: * errstr -- set to error message for use in protocols * returns * SASL_OK -- success * SASL_FAIL -- failure * SASL_BADPARAM -- invalid parameter * SASL_BADAUTH -- authentication failed * SASL_NOUSER -- user not found */ LIBSASL_API int sasl_checkapop(sasl_conn_t *conn, const char *user, unsigned userlen, const char *challenge, unsigned challen, const char *response, unsigned resplen, const char **errstr); /* set the password for a user * conn -- SASL connection * user -- user name * pass -- plaintext password, may be NULL to remove user * passlen -- length of password, 0 = strlen(pass) * flags -- see flags below * errstr -- optional more detailed error * * returns: * SASL_NOCHANGE -- proper entry already exists * SASL_NOMECH -- no authdb supports password setting as configured * SASL_DISABLED -- account disabled * SASL_PWLOCK -- password locked * SASL_FAIL -- OS error * SASL_BADPARAM -- password too long * SASL_OK -- successful */ LIBSASL_API int sasl_setpass(sasl_conn_t *conn, const char *user, const char *pass, unsigned passlen, int flags, const char **errstr); #define SASL_SET_CREATE 0x01 /* create a new entry for user */ #define SASL_SET_DISABLE 0x02 /* disable user account */ /********************** * security layer API * **********************/ /* encode a block of data for transmission using security layer * returns: * SASL_OK -- success (returns input if no layer negotiated) * SASL_NOTDONE -- security layer negotiation not finished */ LIBSASL_API int sasl_encode(sasl_conn_t *conn, const char *input, unsigned inputlen, char **output, unsigned *outputlen); /* decode a block of data received using security layer * returns: * SASL_OK -- success (returns input if no layer negotiated) * SASL_NOTDONE -- security layer negotiation not finished */ LIBSASL_API int sasl_decode(sasl_conn_t *conn, const char *input, unsigned inputlen, char **output, unsigned *outputlen); /************************************ * Credentials API (used by server) * ************************************/ /* install credentials passed by the client * Installing a set of credentials may install them on a per-process * or a per-thread basis; neither behavior may be assumed. * returns: * SASL_OK -- success * SASL_FAIL -- failure * SASL_NOTDONE -- credentials not passed */ LIBSASL_API int sasl_cred_install(sasl_conn_t *conn); /* uninstalls a connection's credentials * returns: * SASL_OK -- success * SASL_FAIL -- failure */ LIBSASL_API int sasl_cred_uninstall(sasl_conn_t *conn); #endif /* SASL_H */