Add TLS PSK configuration options.
[libradsec.git] / lib / include / radsec / radsec-impl.h
1 /** @file libradsec-impl.h
2     @brief Libraray internal header file for libradsec.  */
3
4 /* See the file COPYING for licensing information.  */
5
6 #include <freeradius/libradius.h>
7 #include <event2/util.h>
8 #include <confuse.h>
9 #if defined(RS_ENABLE_TLS)
10 #include <openssl/ssl.h>
11 #endif
12
13 /* Constants.  */
14 #define RS_HEADER_LEN 4
15
16 /* Data types.  */
17 enum rs_cred_type {
18     RS_CRED_NONE = 0,
19     /* TLS pre-shared keys, RFC 4279.  */
20     RS_CRED_TLS_PSK,
21     /* RS_CRED_TLS_DH_PSK, */
22     /* RS_CRED_TLS_RSA_PSK, */
23 };
24 typedef unsigned int rs_cred_type_t;
25
26 #if defined (__cplusplus)
27 extern "C" {
28 #endif
29
30 struct rs_credentials {
31     enum rs_cred_type type;
32     char *identity;
33     char *secret;
34 };
35
36 struct rs_error {
37     int code;
38     char buf[1024];
39 };
40
41 /** Configuration object for a connection.  */
42 struct rs_peer {
43     struct rs_connection *conn;
44     struct rs_realm *realm;
45     struct evutil_addrinfo *addr;
46     char *secret;               /* RADIUS secret.  */
47     struct rs_peer *next;
48 };
49
50 /** Configuration object for a RADIUS realm.  */
51 struct rs_realm {
52     char *name;
53     enum rs_conn_type type;
54     int timeout;
55     int retries;
56     char *cacertfile;
57     char *cacertpath;
58     char *certfile;
59     char *certkeyfile;
60     struct rs_credentials *transport_cred;
61     struct rs_peer *peers;
62     struct rs_realm *next;
63 };
64
65 /** Top configuration object.  */
66 struct rs_config {
67     char *dictionary;
68     struct rs_realm *realms;
69     cfg_t *cfg;
70 };
71
72 struct rs_context {
73     struct rs_config *config;
74     struct rs_alloc_scheme alloc_scheme;
75     struct rs_error *err;
76     fr_randctx fr_randctx;
77 };
78
79 struct rs_connection {
80     struct rs_context *ctx;
81     struct rs_realm *realm;     /* Owned by ctx.  */
82     struct event_base *evb;     /* Event base.  */
83     struct event *tev;          /* Timeout event.  */
84     struct rs_conn_callbacks callbacks;
85     void *user_data;
86     struct rs_peer *peers;
87     struct rs_peer *active_peer;
88     struct rs_error *err;
89     struct timeval timeout;
90     char is_connecting;         /* FIXME: replace with a single state member */
91     char is_connected;          /* FIXME: replace with a single state member */
92     int fd;                     /* Socket.  */
93     int tryagain;               /* For server failover.  */
94     int nextid;                 /* Next RADIUS packet identifier.  */
95     /* TCP transport specifics.  */
96     struct bufferevent *bev;    /* Buffer event.  */
97     /* UDP transport specifics.  */
98     struct event *wev;          /* Write event (for UDP).  */
99     struct event *rev;          /* Read event (for UDP).  */
100     struct rs_packet *out_queue; /* Queue for outgoing UDP packets.  */
101 #if defined(RS_ENABLE_TLS)
102     /* TLS specifics.  */
103     SSL_CTX *tls_ctx;
104     SSL *tls_ssl;
105 #endif
106 };
107
108 enum rs_packet_flags {
109     rs_packet_hdr_read_flag,
110     rs_packet_received_flag,
111     rs_packet_sent_flag,
112 };
113
114 struct rs_packet {
115     struct rs_connection *conn;
116     unsigned int flags;
117     uint8_t hdr[RS_HEADER_LEN];
118     RADIUS_PACKET *rpkt;        /* FreeRADIUS object.  */
119     struct rs_packet *next;     /* Used for UDP output queue.  */
120 };
121
122 /* Nonpublic functions (in radsec.c -- FIXME: move?).  */
123 struct rs_error *rs_resolv (struct evutil_addrinfo **addr,
124                             rs_conn_type_t type,
125                             const char *hostname,
126                             const char *service);
127 #if defined (__cplusplus)
128 }
129 #endif
130
131 /* Convenience macros.  */
132 #define rs_calloc(h, nmemb, size) \
133     (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size)
134 #define rs_malloc(h, size) \
135     (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size)
136 #define rs_free(h, ptr) \
137     (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr)
138 #define rs_realloc(h, realloc, ptr, size) \
139     (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size)
140 #define min(a, b) ((a) < (b) ? (a) : (b))
141 #define max(a, b) ((a) > (b) ? (a) : (b))
142
143 /* Local Variables: */
144 /* c-file-style: "stroustrup" */
145 /* End: */