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