From 024e998f8b73047eb2ae56ea92cb2cbc0bbedc17 Mon Sep 17 00:00:00 2001 From: defanor Date: Sat, 2 Oct 2021 20:23:38 +0300 Subject: Make libgsasl optional Only EXTERNAL and PLAIN mechanisms are supported without it for now. --- src/rexmpp_sasl.h | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/rexmpp_sasl.h (limited to 'src/rexmpp_sasl.h') diff --git a/src/rexmpp_sasl.h b/src/rexmpp_sasl.h new file mode 100644 index 0000000..a8460d4 --- /dev/null +++ b/src/rexmpp_sasl.h @@ -0,0 +1,110 @@ +/** + @file rexmpp_sasl.h + @brief SASL + @author defanor + @date 2021 + @copyright MIT license. + +*/ + + +#ifndef REXMPP_SASL_H +#define REXMPP_SASL_H + +#include "config.h" + +#include "rexmpp.h" + +/** @brief These correspond to Gsasl_property values. */ +typedef enum { + /* Information properties, e.g., username. */ + REXMPP_SASL_PROP_AUTHID = 1, + REXMPP_SASL_PROP_AUTHZID = 2, + REXMPP_SASL_PROP_PASSWORD = 3, + REXMPP_SASL_PROP_ANONYMOUS_TOKEN = 4, + REXMPP_SASL_PROP_SERVICE = 5, + REXMPP_SASL_PROP_HOSTNAME = 6, + REXMPP_SASL_PROP_GSSAPI_DISPLAY_NAME = 7, + REXMPP_SASL_PROP_PASSCODE = 8, + REXMPP_SASL_PROP_SUGGESTED_PIN = 9, + REXMPP_SASL_PROP_PIN = 10, + REXMPP_SASL_PROP_REALM = 11, + REXMPP_SASL_PROP_DIGEST_MD5_HASHED_PASSWORD = 12, + REXMPP_SASL_PROP_QOPS = 13, + REXMPP_SASL_PROP_QOP = 14, + REXMPP_SASL_PROP_SCRAM_ITER = 15, + REXMPP_SASL_PROP_SCRAM_SALT = 16, + REXMPP_SASL_PROP_SCRAM_SALTED_PASSWORD = 17, + REXMPP_SASL_PROP_SCRAM_SERVERKEY = 23, + REXMPP_SASL_PROP_SCRAM_STOREDKEY = 24, + REXMPP_SASL_PROP_CB_TLS_UNIQUE = 18, + REXMPP_SASL_PROP_SAML20_IDP_IDENTIFIER = 19, + REXMPP_SASL_PROP_SAML20_REDIRECT_URL = 20, + REXMPP_SASL_PROP_OPENID20_REDIRECT_URL = 21, + REXMPP_SASL_PROP_OPENID20_OUTCOME_DATA = 22, + /* Client callbacks. */ + REXMPP_SASL_PROP_SAML20_AUTHENTICATE_IN_BROWSER = 250, + REXMPP_SASL_PROP_OPENID20_AUTHENTICATE_IN_BROWSER = 251, + /* Server validation callback properties. */ + REXMPP_SASL_PROP_VALIDATE_SIMPLE = 500, + REXMPP_SASL_PROP_VALIDATE_EXTERNAL = 501, + REXMPP_SASL_PROP_VALIDATE_ANONYMOUS = 502, + REXMPP_SASL_PROP_VALIDATE_GSSAPI = 503, + REXMPP_SASL_PROP_VALIDATE_SECURID = 504, + REXMPP_SASL_PROP_VALIDATE_SAML20 = 505, + REXMPP_SASL_PROP_VALIDATE_OPENID20 = 506 +} rexmpp_sasl_property; + +/** + @brief SASL context. +*/ +#ifdef HAVE_GSASL +#include +struct rexmpp_sasl_ctx { + Gsasl *ctx; + Gsasl_session *session; +}; +#else +typedef enum { + REXMPP_SASL_MECH_EXTERNAL, + REXMPP_SASL_MECH_PLAIN, + REXMPP_SASL_MECH_UNKNOWN +} rexmpp_sasl_mechanism; + +struct rexmpp_sasl_ctx { + rexmpp_sasl_mechanism mech; + char *authid; + char *password; +}; +#endif + +typedef struct rexmpp_sasl_ctx rexmpp_sasl_ctx_t; + +/** + @brief Initializes SASL context. +*/ +int rexmpp_sasl_ctx_init (rexmpp_t *s); + +/** + @brief Cleans up the state that can be discarded between XMPP + connections, to be called from rexmpp_cleanup. +*/ +void rexmpp_sasl_ctx_cleanup (rexmpp_t *s); + +/** + @brief Deinitializes a SASL context. +*/ +void rexmpp_sasl_ctx_deinit (rexmpp_t *s); + + +int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len); +int rexmpp_sasl_decode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len); + +const char *rexmpp_sasl_suggest_mechanism (rexmpp_t *s, const char *mech_list); + +int rexmpp_sasl_start (rexmpp_t *s, const char *mech); +int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out); + +void rexmpp_sasl_property_set (rexmpp_t *s, rexmpp_sasl_property prop, const char *data); + +#endif -- cgit v1.2.3