Verify certificate CN against configured hostname.
[radsecproxy.git] / lib / tests / test-udp.c
1 #include <stdlib.h>
2 #include <cgreen/cgreen.h>
3 #include <freeradius/libradius.h>
4 #include "radsec/radsec.h"
5 #include "radsec/request.h"
6 #include "udp.h"
7
8 #define true 1                  /* FIXME: Bug report cgreen.  */
9 #define false 0
10
11 static void
12 authenticate (struct rs_connection *conn, const char *user, const char *pw)
13 {
14   struct rs_request *req;
15   struct rs_packet *msg, *resp;
16
17   assert_true (rs_request_create (conn, &req) == 0);
18   assert_true (rs_packet_create_authn_request (conn, &msg, user, pw) == 0);
19   rs_request_add_reqpkt (req, msg);
20   assert_true (rs_request_send (req, &resp) == 0);
21   //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
22   assert_true (rs_packet_frpkt (resp)->code == PW_AUTHENTICATION_ACK);
23
24   rs_request_destroy (req);
25 }
26
27 static void
28 send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
29 {
30   struct rs_packet *msg0, *msg1;
31
32   assert_true (rs_packet_create_authn_request (conn, &msg0, NULL, NULL) == 0);
33   assert_true (rs_packet_create_authn_request (conn, &msg1, NULL, NULL) == 0);
34   assert_true (rs_packet_send (msg0, NULL) == 0);
35   assert_true (rs_packet_send (msg1, NULL) == 0);
36 }
37
38 static void
39 send_large_packet (struct rs_connection *conn)
40 {
41   struct rs_packet *msg0;
42   struct radius_packet *frpkt = NULL;
43   char *buf;
44   int f;
45
46   buf = malloc (4096);
47   assert_true (buf != NULL);
48   memset (buf, 0, 4096);
49
50   assert_true (rs_packet_create (conn, &msg0) == 0);
51   frpkt = rs_packet_frpkt (msg0);
52   assert_true (frpkt != NULL);
53   /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
54   for (f = 0; f < 15; f++)
55     {
56       VALUE_PAIR *vp = NULL;
57       memset (buf, 'a' + f, 252);
58       vp = pairmake ("EAP-Message", buf, T_OP_EQ);
59       assert_true (vp != NULL);
60       pairadd (&frpkt->vps, vp);
61     }
62   assert_true (rs_packet_send (msg0, NULL) == 0);
63 }
64
65 /* ************************************************************ */
66 static struct setup {
67   char *config_file;
68   char *config_name;
69   char *username;
70   char *pw;
71 } setup;
72
73 static void
74 test_auth ()
75 {
76   struct rs_context *ctx;
77   struct rs_connection *conn;
78
79   setup.config_file = "test.conf";
80   setup.config_name = "test-udp-auth";
81   setup.username = "molgan@PROJECT-MOONSHOT.ORG";
82   setup.pw = "password";
83
84   assert_true (rs_context_create (&ctx) == 0);
85   assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
86   assert_true (rs_context_init_freeradius_dict (ctx, NULL) == 0);
87   assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
88
89   authenticate (conn, setup.username, setup.pw);
90
91   rs_conn_destroy (conn);
92   rs_context_destroy (ctx);
93 }
94
95 static ssize_t
96 test_buffering_cb (const uint8_t *buf, ssize_t len)
97 {
98   /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
99      [RFC 2865]*/
100 #if 0
101   hd (buf, len);
102 #endif
103   assert_true (len >= 20);
104   assert_true (len <= 4096);
105   assert_true ((buf[2] << 8) +  buf[3] == len);
106   return len;
107 }
108
109 static void
110 test_buffering ()
111 {
112   struct rs_context *ctx;
113   struct rs_connection *conn;
114   struct timeval timeout;
115   struct polldata *polldata;
116
117   assert_true (rs_context_create (&ctx) == 0);
118   assert_true (rs_context_read_config (ctx, "test.conf") == 0);
119   assert_true (rs_context_init_freeradius_dict (ctx, NULL) == 0);
120   assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
121
122   timeout.tv_sec = 0;
123   timeout.tv_usec = 150000;
124   polldata = udp_server ("11820", &timeout, test_buffering_cb);
125   assert_true (polldata != NULL);
126
127   send_more_than_one_msg_in_one_packet (conn);
128   assert_true (udp_poll (polldata) > 0);
129   assert_true (udp_poll (polldata) > 0);
130
131 #if 0
132 "
133 send_large_packet() disabled, it's hanging after
134
135 Sending Access-Request of id 1 to (null) port 0
136         Message-Authenticator = 0x00000000000000000000000000000000
137 packet_do_send: about to send this to localhost:11820:
138         Code: 1, Identifier: 1, Lenght: 38
139 rs_packet_send: entering event loop
140 _evcb: fd=5 what = WRITE
141 rs_packet_send: event loop done
142 "
143   send_large_packet (conn);
144   assert_true (udp_poll (polldata) > 0);
145 #endif  /* 0 */
146
147   udp_free_polldata (polldata);
148   rs_conn_destroy (conn);
149   rs_context_destroy (ctx);
150 }
151
152 /* ************************************************************ */
153 static void
154 setup_auth (TestSuite *ts)
155 {
156   add_test (ts, test_auth);
157 }
158
159 static void
160 setup_buffering (TestSuite *ts)
161 {
162   add_test (ts, test_buffering);
163 }
164
165 int
166 main (int argc, char *argv[])
167 {
168   TestSuite *ts = create_test_suite ();
169
170   setup_auth (ts);
171   setup_buffering (ts);
172
173   if (argc > 1)
174     return run_single_test (ts, argv[1], create_text_reporter ());
175   else
176     return run_test_suite (ts, create_text_reporter ());
177 }