6c02dcf3c31ea27955adedd9463f771558344d12
[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     unsigned int secret_len;
44 };
45
46 struct rs_error {
47     int code;
48     char buf[1024];
49 };
50
51 /** Configuration object for a connection.  */
52 struct rs_peer {
53     struct rs_connection *conn;
54     struct rs_realm *realm;
55     char *hostname;
56     char *service;
57     char *secret;               /* RADIUS secret.  */
58     struct evutil_addrinfo *addr_cache;
59     struct rs_peer *next;
60 };
61
62 /** Configuration object for a RADIUS realm.  */
63 struct rs_realm {
64     char *name;
65     enum rs_conn_type type;
66     int timeout;
67     int retries;
68     char *cacertfile;
69     char *cacertpath;
70     char *certfile;
71     char *certkeyfile;
72     struct rs_credentials *transport_cred;
73     struct rs_peer *peers;
74     struct rs_realm *next;
75 };
76
77 /** Top configuration object.  */
78 struct rs_config {
79     struct rs_realm *realms;
80     cfg_t *cfg;
81 };
82
83 struct rs_context {
84     struct rs_config *config;
85     struct rs_alloc_scheme alloc_scheme;
86     struct rs_error *err;
87 };
88
89 struct rs_connection {
90     struct rs_context *ctx;
91     struct rs_realm *realm;     /* Owned by ctx.  */
92     struct event_base *evb;     /* Event base.  */
93     struct event *tev;          /* Timeout event.  */
94     struct rs_conn_callbacks callbacks;
95     void *user_data;
96     struct rs_peer *peers;
97     struct rs_peer *active_peer;
98     struct rs_error *err;
99     struct timeval timeout;
100     char is_connecting;         /* FIXME: replace with a single state member */
101     char is_connected;          /* FIXME: replace with a single state member */
102     int fd;                     /* Socket.  */
103     int tryagain;               /* For server failover.  */
104     int nextid;                 /* Next RADIUS packet identifier.  */
105     /* TCP transport specifics.  */
106     struct bufferevent *bev;    /* Buffer event.  */
107     /* UDP transport specifics.  */
108     struct event *wev;          /* Write event (for UDP).  */
109     struct event *rev;          /* Read event (for UDP).  */
110     struct rs_packet *out_queue; /* Queue for outgoing UDP packets.  */
111 #if defined(RS_ENABLE_TLS)
112     /* TLS specifics.  */
113     SSL_CTX *tls_ctx;
114     SSL *tls_ssl;
115 #endif
116 };
117
118 enum rs_packet_flags {
119     RS_PACKET_HEADER_READ,
120     RS_PACKET_RECEIVED,
121     RS_PACKET_SENT,
122 };
123
124 struct radius_packet;
125
126 struct rs_packet {
127     struct rs_connection *conn;
128     unsigned int flags;
129     uint8_t hdr[RS_HEADER_LEN];
130     struct radius_packet *rpkt; /* FreeRADIUS object.  */
131     struct rs_packet *next;     /* Used for UDP output queue.  */
132 };
133
134 #if defined (__cplusplus)
135 }
136 #endif
137
138 /* Convenience macros.  */
139 #define rs_calloc(h, nmemb, size) \
140     (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size)
141 #define rs_malloc(h, size) \
142     (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size)
143 #define rs_free(h, ptr) \
144     (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr)
145 #define rs_realloc(h, realloc, ptr, size) \
146     (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size)
147 #define min(a, b) ((a) < (b) ? (a) : (b))
148 #define max(a, b) ((a) > (b) ? (a) : (b))
149
150 #endif /* _RADSEC_RADSEC_IMPL_H_ */
151
152 /* Local Variables: */
153 /* c-file-style: "stroustrup" */
154 /* End: */