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