diff options
author | Linus Nordberg <linus@nordberg.se> | 2014-02-05 11:10:02 +0100 |
---|---|---|
committer | Linus Nordberg <linus@nordberg.se> | 2014-02-05 11:10:02 +0100 |
commit | 3d954bfd2f658ac05a0f20a1241738ed3e3fdd28 (patch) | |
tree | d95b364fbab298c9b94c9c729afc98904c7c5bb0 /tests | |
parent | 67bdfa83f1879312fef0fbac769f6fb45df12d1a (diff) |
Move lib to the root.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 12 | ||||
-rw-r--r-- | tests/README | 39 | ||||
-rw-r--r-- | tests/demoCA/index.txt | 3 | ||||
-rw-r--r-- | tests/demoCA/index.txt.attr | 1 | ||||
-rw-r--r-- | tests/demoCA/newcerts/01.pem | 46 | ||||
-rw-r--r-- | tests/demoCA/newcerts/02.pem | 49 | ||||
-rw-r--r-- | tests/demoCA/newcerts/03.pem | 49 | ||||
-rw-r--r-- | tests/demoCA/private/cakey.pem | 9 | ||||
-rw-r--r-- | tests/demoCA/private/cli1.key | 9 | ||||
-rw-r--r-- | tests/demoCA/private/srv1.key | 9 | ||||
-rw-r--r-- | tests/demoCA/serial | 1 | ||||
-rw-r--r-- | tests/test-udp.c | 153 | ||||
-rw-r--r-- | tests/test.conf | 30 | ||||
-rw-r--r-- | tests/udp-server.c | 35 | ||||
-rw-r--r-- | tests/udp.c | 141 | ||||
-rw-r--r-- | tests/udp.h | 20 |
16 files changed, 606 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..09f9d28 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,12 @@ +AUTOMAKE_OPTIONS = foreign +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir) +AM_CFLAGS = -Wall -Werror -g + +TESTS = test-udp + +check_PROGRAMS = test-udp udp-server + +test_udp_SOURCES = test-udp.c udp.c udp.h +test_udp_LDADD = ../libradsec.la -lcunit -lm + +udp_server_SOURCES = udp-server.c udp.c udp.h diff --git a/tests/README b/tests/README new file mode 100644 index 0000000..33bddc1 --- /dev/null +++ b/tests/README @@ -0,0 +1,39 @@ +This is the README file for the test directory of libradsec. + +Build +----- + +In order to build and run the tests, you'll need to have CUnit +installed. + +Source code: http://cunit.sourceforge.net/ +Debian package: libcunit1-dev +FreeBSD port: devel/cunit + + +Run +--- + +NOTE: To run the tests you currently need +- a RADIUS server running at localhost:1820 with the shared RADIUS + secret "sikrit" configured (or whatever "test-udp-auth" in test.conf + says) +- a user "molgan@PROJECT-MOONSHOT.ORG" with password "password" + present in the RADIUS database +These requirements will be removed in a future libradsec release. + + +Run the tests by typing + + make check + +The output should read something like + + --Run Summary: Type Total Ran Passed Failed + suites 2 2 n/a 0 + tests 2 2 2 0 + asserts 23 23 23 0 + PASS: test-udp + ============= + 1 test passed + ============= diff --git a/tests/demoCA/index.txt b/tests/demoCA/index.txt new file mode 100644 index 0000000..51f934f --- /dev/null +++ b/tests/demoCA/index.txt @@ -0,0 +1,3 @@ +V 250806115449Z 01 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=ca +V 250806115457Z 02 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=srv1 +V 250806115504Z 03 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=cli1 diff --git a/tests/demoCA/index.txt.attr b/tests/demoCA/index.txt.attr new file mode 100644 index 0000000..8f7e63a --- /dev/null +++ b/tests/demoCA/index.txt.attr @@ -0,0 +1 @@ +unique_subject = yes diff --git a/tests/demoCA/newcerts/01.pem b/tests/demoCA/newcerts/01.pem new file mode 100644 index 0000000..29cb5ee --- /dev/null +++ b/tests/demoCA/newcerts/01.pem @@ -0,0 +1,46 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca + Validity + Not Before: Sep 12 11:54:49 2012 GMT + Not After : Aug 6 11:54:49 2025 GMT + Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (512 bit) + Modulus: + 00:eb:9e:52:bf:1a:7c:32:63:9f:96:80:71:f1:98: + 87:90:97:f1:7a:4a:81:6d:66:7e:8e:7c:50:5f:f9: + 6e:94:1a:b0:7b:46:87:b5:9e:23:48:04:ad:f3:55: + a1:f9:31:50:a1:10:ab:ca:ba:70:ac:58:95:4e:9d: + 3a:2b:52:36:df + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05 + X509v3 Authority Key Identifier: + keyid:11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05 + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: sha1WithRSAEncryption + 15:12:3b:79:3d:61:d2:c7:d2:a8:0c:df:82:ea:66:76:26:cb: + ab:b5:83:a3:52:a0:23:1a:a9:92:8e:93:41:f7:6c:3f:8a:2c: + bd:32:3d:70:3f:b6:fd:f2:37:50:0a:66:8c:1c:44:bf:ef:50: + 24:33:bd:48:47:04:ee:8c:61:88 +-----BEGIN CERTIFICATE----- +MIIB5TCCAY+gAwIBAgIBATANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJBVTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQswCQYDVQQDDAJjYTAeFw0xMjA5MTIxMTU0NDlaFw0yNTA4MDYxMTU0 +NDlaMFIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK +DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxCzAJBgNVBAMMAmNhMFwwDQYJKoZI +hvcNAQEBBQADSwAwSAJBAOueUr8afDJjn5aAcfGYh5CX8XpKgW1mfo58UF/5bpQa +sHtGh7WeI0gErfNVofkxUKEQq8q6cKxYlU6dOitSNt8CAwEAAaNQME4wHQYDVR0O +BBYEFBFXQAvwMy+uwtqkOgC66TSzdSAFMB8GA1UdIwQYMBaAFBFXQAvwMy+uwtqk +OgC66TSzdSAFMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADQQAVEjt5PWHS +x9KoDN+C6mZ2JsurtYOjUqAjGqmSjpNB92w/iiy9Mj1wP7b98jdQCmaMHES/71Ak +M71IRwTujGGI +-----END CERTIFICATE----- diff --git a/tests/demoCA/newcerts/02.pem b/tests/demoCA/newcerts/02.pem new file mode 100644 index 0000000..2e1cccb --- /dev/null +++ b/tests/demoCA/newcerts/02.pem @@ -0,0 +1,49 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca + Validity + Not Before: Sep 12 11:54:57 2012 GMT + Not After : Aug 6 11:54:57 2025 GMT + Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=srv1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (512 bit) + Modulus: + 00:ac:21:78:6f:cb:1c:10:c2:71:7b:72:03:e3:4b: + b2:c7:f6:63:3f:69:d3:d3:48:e0:90:16:0f:5a:44: + f5:9c:ed:b9:6b:72:be:11:6e:26:09:32:0c:51:25: + 10:35:fe:a0:33:fe:cf:90:9f:2c:8b:3a:c5:98:86: + c2:a9:5c:ba:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 08:13:6F:A0:93:47:21:31:9F:02:79:A5:CF:24:4A:D1:0B:A7:10:09 + X509v3 Authority Key Identifier: + keyid:11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05 + + Signature Algorithm: sha1WithRSAEncryption + 2c:7e:61:65:48:cc:46:50:58:cc:9d:1b:b2:e7:2d:2b:72:e2: + a1:2f:2c:14:35:4d:b8:42:87:66:57:77:c4:02:17:fa:3c:db: + 83:3f:89:37:ae:f8:e9:00:fe:96:d8:4b:80:63:db:08:7a:c6: + e1:c7:59:ec:d9:76:4a:be:1a:19 +-----BEGIN CERTIFICATE----- +MIICEjCCAbygAwIBAgIBAjANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJBVTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQswCQYDVQQDDAJjYTAeFw0xMjA5MTIxMTU0NTdaFw0yNTA4MDYxMTU0 +NTdaMFQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK +DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDTALBgNVBAMMBHNydjEwXDANBgkq +hkiG9w0BAQEFAANLADBIAkEArCF4b8scEMJxe3ID40uyx/ZjP2nT00jgkBYPWkT1 +nO25a3K+EW4mCTIMUSUQNf6gM/7PkJ8sizrFmIbCqVy6pwIDAQABo3sweTAJBgNV +HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp +Y2F0ZTAdBgNVHQ4EFgQUCBNvoJNHITGfAnmlzyRK0QunEAkwHwYDVR0jBBgwFoAU +EVdAC/AzL67C2qQ6ALrpNLN1IAUwDQYJKoZIhvcNAQEFBQADQQAsfmFlSMxGUFjM +nRuy5y0rcuKhLywUNU24QodmV3fEAhf6PNuDP4k3rvjpAP6W2EuAY9sIesbhx1ns +2XZKvhoZ +-----END CERTIFICATE----- diff --git a/tests/demoCA/newcerts/03.pem b/tests/demoCA/newcerts/03.pem new file mode 100644 index 0000000..d07be19 --- /dev/null +++ b/tests/demoCA/newcerts/03.pem @@ -0,0 +1,49 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 3 (0x3) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca + Validity + Not Before: Sep 12 11:55:04 2012 GMT + Not After : Aug 6 11:55:04 2025 GMT + Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=cli1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (512 bit) + Modulus: + 00:99:7b:86:e0:46:de:f1:69:10:97:f8:4e:78:c8: + ee:c2:c8:65:64:90:72:dd:51:4f:c6:58:78:49:07: + 61:b9:ed:0a:77:7b:d2:6a:c3:49:e5:91:6c:bf:78: + d0:fc:8a:5c:80:1a:b0:03:28:b2:ea:e8:c8:a0:b6: + be:a1:42:30:5d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 10:17:90:80:D8:B0:7E:91:91:13:32:27:8C:EF:A6:DE:9F:C1:C4:A7 + X509v3 Authority Key Identifier: + keyid:11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05 + + Signature Algorithm: sha1WithRSAEncryption + b1:08:87:88:7d:90:78:01:da:4a:e7:be:82:22:3f:58:07:f7: + 46:a9:9a:42:a4:88:d9:b8:6a:69:bf:cb:d0:39:2d:c9:49:06: + fa:31:80:66:17:32:cc:e8:ae:36:9c:c1:d5:ae:6d:3c:eb:72: + 77:55:92:fa:ab:f5:a3:bc:19:2d +-----BEGIN CERTIFICATE----- +MIICEjCCAbygAwIBAgIBAzANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJBVTET +MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ +dHkgTHRkMQswCQYDVQQDDAJjYTAeFw0xMjA5MTIxMTU1MDRaFw0yNTA4MDYxMTU1 +MDRaMFQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK +DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDTALBgNVBAMMBGNsaTEwXDANBgkq +hkiG9w0BAQEFAANLADBIAkEAmXuG4Ebe8WkQl/hOeMjuwshlZJBy3VFPxlh4SQdh +ue0Kd3vSasNJ5ZFsv3jQ/IpcgBqwAyiy6ujIoLa+oUIwXQIDAQABo3sweTAJBgNV +HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp +Y2F0ZTAdBgNVHQ4EFgQUEBeQgNiwfpGREzInjO+m3p/BxKcwHwYDVR0jBBgwFoAU +EVdAC/AzL67C2qQ6ALrpNLN1IAUwDQYJKoZIhvcNAQEFBQADQQCxCIeIfZB4AdpK +576CIj9YB/dGqZpCpIjZuGppv8vQOS3JSQb6MYBmFzLM6K42nMHVrm0863J3VZL6 +q/WjvBkt +-----END CERTIFICATE----- diff --git a/tests/demoCA/private/cakey.pem b/tests/demoCA/private/cakey.pem new file mode 100644 index 0000000..e7df9d0 --- /dev/null +++ b/tests/demoCA/private/cakey.pem @@ -0,0 +1,9 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOgIBAAJBAOueUr8afDJjn5aAcfGYh5CX8XpKgW1mfo58UF/5bpQasHtGh7We +I0gErfNVofkxUKEQq8q6cKxYlU6dOitSNt8CAwEAAQJAR+SmQPN24/Ur88M7gUlW +TBNgtjzXoyb8BMP/zlkQmZW5Tcv1xCa1UwK33u2wSmhSNP6zA1QrC2d2pv/7XZEp +wQIhAPpf2QuEooR5BPrvDiAVPlKp31EROrZOiOV5hbV1Kzx/AiEA8OmZZrvgrdQu +3PKRLfxD11NKf0yhC+7WdVWguYZ1VaECIF99XMcyz9TcXxThRa7gy0M1vJErlAvh +yf5TKba6OEI7AiBpNctdl11G7OxOZ8zJZWsHRYO6Vm/as0KLWYromvTxIQIhAK0c +r+G23R+dHDUdNEBSi6G74dbaJqaA8LsVr9w9m5gY +-----END RSA PRIVATE KEY----- diff --git a/tests/demoCA/private/cli1.key b/tests/demoCA/private/cli1.key new file mode 100644 index 0000000..09381f1 --- /dev/null +++ b/tests/demoCA/private/cli1.key @@ -0,0 +1,9 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOQIBAAJBAJl7huBG3vFpEJf4TnjI7sLIZWSQct1RT8ZYeEkHYbntCnd70mrD +SeWRbL940PyKXIAasAMosuroyKC2vqFCMF0CAwEAAQJAEozki1zle0YYlFWVnnGi +sfYokxQGXguC2dU9jI4Q2LjGut6mVx/zLIU59BS4nUq2aYHg0hxwwzOba92c0lT/ +HQIhAMp0+k7FtDdRQzIaDzeEY6MYyLhhhukhI3xpyXYVuyx7AiEAwhLQl6hYlsgh +78CzTAhAdbheAwIQWyvY7XjKzxdpGwcCIG/hr0YC2bHMNZ8laY1bmxhRpPLH6p9A +0fR6HXwlTDerAiA1y21SfHGB6huuD2Yjry3e86nrf4j1HKRWvuLIoJ6bxQIgWmyj +YOSFsaBwj9ptkY0d4H84SDHnt7GRypm0/98OSg8= +-----END RSA PRIVATE KEY----- diff --git a/tests/demoCA/private/srv1.key b/tests/demoCA/private/srv1.key new file mode 100644 index 0000000..284f1e1 --- /dev/null +++ b/tests/demoCA/private/srv1.key @@ -0,0 +1,9 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOgIBAAJBAKwheG/LHBDCcXtyA+NLssf2Yz9p09NI4JAWD1pE9ZztuWtyvhFu +JgkyDFElEDX+oDP+z5CfLIs6xZiGwqlcuqcCAwEAAQJAbviJF7GfH2LsHISt4vyr +fuTmqTxF1wI13E6MiUrJ+eftT7Hq1Wq6B7gmlI1iJiJLlAH6o93PYhp8559Dfp+q +wQIhAOMbFp0NJPrVpycx5dQAYpM/edqXoOENQf1lMLOmOHlhAiEAwgfTbAaGNfQS +uXfzj0sx+IvoKE/MXfLKZ/uE9futCQcCIQC/mMjZMo+yNrHQdV5KHxEK3RB2hFmr +xD2aA9a0mVUnwQIgbYjHdNNWDr1DmMo7h+g2RI6Ot7scruiyFPNrgwXaEB8CICMa +8wjF27wlJ2nmhM9ZXUBtvBKgU+jspsA8n+wU+o+f +-----END RSA PRIVATE KEY----- diff --git a/tests/demoCA/serial b/tests/demoCA/serial new file mode 100644 index 0000000..6496923 --- /dev/null +++ b/tests/demoCA/serial @@ -0,0 +1 @@ +04 diff --git a/tests/test-udp.c b/tests/test-udp.c new file mode 100644 index 0000000..ed176c0 --- /dev/null +++ b/tests/test-udp.c @@ -0,0 +1,153 @@ +/* Copyright 2011,2013, NORDUnet A/S. All rights reserved. */ +/* See LICENSE for licensing information. */ + +#include <stdlib.h> +#include <assert.h> +#include <CUnit/Basic.h> +#include "radius/client.h" +#include "radsec/radsec.h" +#include "radsec/request.h" +#include "udp.h" + +static void +authenticate (struct rs_connection *conn, const char *user, const char *pw) +{ + struct rs_request *req; + struct rs_packet *msg, *resp; + + CU_ASSERT (rs_request_create (conn, &req) == 0); + CU_ASSERT (!rs_packet_create_authn_request (conn, &msg, user, pw)); + rs_request_add_reqpkt (req, msg); + CU_ASSERT (rs_request_send (req, &resp) == 0); + //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1)); + CU_ASSERT (rs_packet_code(resp) == PW_ACCESS_ACCEPT); + + rs_request_destroy (req); +} + +static void +send_more_than_one_msg_in_one_packet (struct rs_connection *conn) +{ + struct rs_packet *msg0, *msg1; + + CU_ASSERT (rs_packet_create_authn_request (conn, &msg0, NULL, NULL) == 0); + CU_ASSERT (rs_packet_create_authn_request (conn, &msg1, NULL, NULL) == 0); + CU_ASSERT (rs_packet_send (msg0, NULL) == 0); + CU_ASSERT (rs_packet_send (msg1, NULL) == 0); +} + +#if 0 +static void +send_large_packet (struct rs_connection *conn) +{ + struct rs_packet *msg0; + struct radius_packet *frpkt = NULL; + char *buf; + int f; + + buf = malloc (RS_MAX_PACKET_LEN); + CU_ASSERT (buf != NULL); + memset (buf, 0, RS_MAX_PACKET_LEN); + + CU_ASSERT (rs_packet_create (conn, &msg0) == 0); + /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */ + for (f = 0; f < 15; f++) + { + memset (buf, 'a' + f, 252); + //vp = pairmake ("EAP-Message", buf, T_OP_EQ); + CU_ASSERT (rs_packet_append_avp (msg0, fixme...) == RSE_OK); + } + CU_ASSERT (rs_packet_send (msg0, NULL) == 0); +} +#endif /* 0 */ + +/* ************************************************************ */ +static struct setup { + char *config_file; + char *config_name; + char *username; + char *pw; +} setup; + +static void +test_auth () +{ + struct rs_context *ctx; + struct rs_connection *conn; + + setup.config_file = "test.conf"; + setup.config_name = "test-udp-auth"; + setup.username = "molgan@PROJECT-MOONSHOT.ORG"; + setup.pw = "password"; + + CU_ASSERT (rs_context_create (&ctx) == 0); + CU_ASSERT (rs_context_read_config (ctx, setup.config_file) == 0); + CU_ASSERT (rs_conn_create (ctx, &conn, setup.config_name) == 0); + + authenticate (conn, setup.username, setup.pw); + + rs_conn_destroy (conn); + rs_context_destroy (ctx); +} + +static ssize_t +test_buffering_cb (const uint8_t *buf, ssize_t len) +{ + /* "Exactly one RADIUS packet is encapsulated in the UDP Data field" + [RFC 2865]*/ +#if 0 + hd (buf, len); +#endif + CU_ASSERT (len >= 20); + CU_ASSERT (len <= RS_MAX_PACKET_LEN); + CU_ASSERT ((buf[2] << 8) + buf[3] == len); + return len; +} + +static void +test_buffering () +{ + struct rs_context *ctx; + struct rs_connection *conn; + struct timeval timeout; + struct polldata *polldata; + + CU_ASSERT (rs_context_create (&ctx) == 0); + CU_ASSERT (rs_context_read_config (ctx, "test.conf") == 0); + CU_ASSERT (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0); + + timeout.tv_sec = 0; + timeout.tv_usec = 150000; + polldata = udp_server ("11820", &timeout, test_buffering_cb); + CU_ASSERT (polldata != NULL); + + send_more_than_one_msg_in_one_packet (conn); + CU_ASSERT (udp_poll (polldata) > 0); + CU_ASSERT (udp_poll (polldata) > 0); + + + udp_free_polldata (polldata); + rs_conn_destroy (conn); + rs_context_destroy (ctx); +} + +/* ************************************************************ */ +int +main (int argc, char *argv[]) +{ + CU_pSuite s = NULL; + CU_pTest t = NULL; + unsigned int nfail; + + assert (CU_initialize_registry () == CUE_SUCCESS); + s = CU_add_suite ("auth", NULL, NULL); assert (s); + t = CU_ADD_TEST (s, test_auth); assert (t); + s = CU_add_suite ("buffering", NULL, NULL); assert (s); + t = CU_ADD_TEST (s, test_buffering); assert (t); + + assert (CU_basic_run_tests () == CUE_SUCCESS); + nfail = CU_get_number_of_failures(); + + CU_cleanup_registry (); + return nfail; +} diff --git a/tests/test.conf b/tests/test.conf new file mode 100644 index 0000000..98d0330 --- /dev/null +++ b/tests/test.conf @@ -0,0 +1,30 @@ +realm test-udp-auth { + type = "UDP" + server { + hostname = "localhost" + service = "1820" + secret = "sikrit" + } +} + +realm test-udp-buffering { + type = "UDP" + server { + hostname = "localhost" + service = "11820" + secret = "sikrit" + } +} + +realm test-tls-test { + type = "TLS" + cacertfile = "/home/linus/nordberg-ca.crt" + certfile = "/home/linus/p/radsecproxy/src/maatuska.nordberg.se.crt" + certkeyfile = "/home/linus/p/radsecproxy/src/maatuska.nordberg.se.key" + + server { + hostname = "localhost" + service = "1820" + secret = "sikrit" + } +} diff --git a/tests/udp-server.c b/tests/udp-server.c new file mode 100644 index 0000000..77a35df --- /dev/null +++ b/tests/udp-server.c @@ -0,0 +1,35 @@ +/* Copyright 2011, NORDUnet A/S. All rights reserved. */ +/* See LICENSE for licensing information. */ + +#include <stdlib.h> +#include <stdio.h> +#include "udp.h" + +ssize_t +handle_data (const uint8_t *buf, ssize_t len) +{ + return hd (buf, len); +} + +int +main (int argc, char *argv[]) +{ + int n, i; + struct timeval tv; + struct polldata *data; + +#define TIMEOUT 1 /* Seconds. */ + + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + data = udp_server (argv[1], &tv, handle_data); + + for (i = 0, n = udp_poll (data); n == 0 && i < 3; n = udp_poll (data), i++) + { + fprintf (stderr, "waiting another %ld second%s\n", + tv.tv_sec, tv.tv_sec > 1 ? "s" : ""); + } + + udp_free_polldata (data); + return (n <= 0); +} diff --git a/tests/udp.c b/tests/udp.c new file mode 100644 index 0000000..2c580da --- /dev/null +++ b/tests/udp.c @@ -0,0 +1,141 @@ +/* Copyright 2011,2013, NORDUnet A/S. All rights reserved. */ +/* See LICENSE for licensing information. */ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <assert.h> +#include <stdio.h> +#include <event2/event.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <sys/types.h> +#include <netdb.h> +#include <sys/select.h> +#include <sys/time.h> +#include "radius/client.h" +#include "udp.h" + +static struct addrinfo * +_resolve (const char *str) +{ + static int first = 1; + static struct addrinfo hints, *result = NULL; + struct addrinfo *rp = NULL; + int r; + + if (first) + { + first = 0; + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_INET; /* AF_UNSPEC */ + hints.ai_socktype = SOCK_DGRAM; + r = getaddrinfo (NULL, str, &hints, &result); + if (r) + fprintf (stderr, "getaddrinfo: %s\n", gai_strerror (r)); + } + + if (result) + { + rp = result; + result = result->ai_next; + } + + return rp; +} + +void +udp_free_polldata (struct polldata *data) +{ + if (data) + { + if (data->timeout) + free (data->timeout); + free (data); + } +} + +/* @return if select() returns error or timeout, return select() + else return value from invoked callback function */ +ssize_t +udp_poll (struct polldata *data) +{ + int r; + long timeout = 0; + fd_set rfds; + ssize_t len; + uint8_t buf[RS_MAX_PACKET_LEN]; + + FD_ZERO (&rfds); + FD_SET (data->s, &rfds); + if (data->timeout) + timeout = data->timeout->tv_sec; /* Save from destruction (Linux). */ + //fprintf (stderr, "calling select with timeout %ld\n", timeout); + r = select (data->s + 1, &rfds, NULL, NULL, data->timeout); + if (data->timeout) + data->timeout->tv_sec = timeout; /* Restore. */ + //fprintf (stderr, "select returning %d\n", r); + if (r > 0) + { + len = recv (data->s, buf, sizeof (buf), 0); + if (len > 0) + return data->cb (buf, len); + } + return r; +} + +struct polldata * +udp_server (const char *bindto, struct timeval *timeout, data_cb cb) +{ + struct addrinfo *res; + int s = -1; + + for (res = _resolve (bindto); res; res = _resolve (bindto)) + { + s = socket (res->ai_family, res->ai_socktype, res->ai_protocol); + if (s >= 0) + { + if (bind (s, res->ai_addr, res->ai_addrlen) == 0) + break; /* Done. */ + else + { + close (s); + s = -1; + } + } + } + + if (s >= 0) + { + struct polldata *data = malloc (sizeof (struct polldata)); + assert (data); + memset (data, 0, sizeof (struct polldata)); + data->s = s; + data->cb = cb; + if (timeout) + { + data->timeout = malloc (sizeof (struct timeval)); + assert (data->timeout); + memcpy (data->timeout, timeout, sizeof (struct timeval)); + } + return data; + } + + return NULL; +} + +ssize_t +hd (const uint8_t *buf, ssize_t len) +{ + int i; + + printf ("# len: %ld\n", len); + for (i = 0; i < len; i++) + { + printf ("%02x%s", buf[i], (i+1) % 8 ? " " : " "); + if ((i + 1) % 16 == 0) + printf ("\n"); + } + printf ("\n"); + return len; +} diff --git a/tests/udp.h b/tests/udp.h new file mode 100644 index 0000000..a8d5f23 --- /dev/null +++ b/tests/udp.h @@ -0,0 +1,20 @@ +/* Copyright 2011, NORDUnet A/S. All rights reserved. */ +/* See LICENSE for licensing information. */ + +#include <stdint.h> +#include <unistd.h> +#include <sys/time.h> + +typedef ssize_t (*data_cb) (const uint8_t *buf, ssize_t len); + +struct polldata { + int s; + data_cb cb; + struct timeval *timeout; +}; + +struct polldata *udp_server (const char *bindto, struct timeval *timeout, data_cb cb); +ssize_t udp_poll (struct polldata *data); +void udp_free_polldata (struct polldata *data); + +ssize_t hd (const uint8_t *buf, ssize_t len); |