1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/**
@file rexmpp_sasl.h
@brief SASL
@author defanor <defanor@uberspace.net>
@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 <gsasl.h>
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
|