summaryrefslogtreecommitdiff
path: root/lib/radius/examples
diff options
context:
space:
mode:
authorLuke Howard <lukeh@padl.com>2011-11-13 16:16:05 +1100
committerLuke Howard <lukeh@padl.com>2011-11-13 16:16:05 +1100
commit7ec93ff9e4d979e4bbcf33f9c90c94dc9d3cdba9 (patch)
treef10529f4e308bd082dcc348487d53bb50b3cbd87 /lib/radius/examples
parentceecc52da787a7a2e495d913cbaa7dbe1d7830fb (diff)
add new RADIUS client library
Diffstat (limited to 'lib/radius/examples')
-rw-r--r--lib/radius/examples/Makefile54
-rw-r--r--lib/radius/examples/example_1.c86
-rw-r--r--lib/radius/examples/example_2.c86
-rw-r--r--lib/radius/examples/example_3.c123
-rw-r--r--lib/radius/examples/example_4.c94
-rw-r--r--lib/radius/examples/nr_vp_create.c61
6 files changed, 504 insertions, 0 deletions
diff --git a/lib/radius/examples/Makefile b/lib/radius/examples/Makefile
new file mode 100644
index 0000000..f39c343
--- /dev/null
+++ b/lib/radius/examples/Makefile
@@ -0,0 +1,54 @@
+#
+# GNU Makefile
+#
+.PHONY: all clean install
+
+SRCS = example_1.c example_2.c example_3.c example_4.c
+
+OBJS := ${SRCS:.c=.o}
+PROGRAMS := ${SRCS:.c=}
+
+all: ${PROGRAMS}
+
+HEADERS := ../client.h ../radius.h
+
+${OBJS}: ${HEADERS}
+
+$(info ${PROGRAMS} ${OBJS})
+
+${PROGRAMS}: ../libnetworkradius-client.a
+
+
+%.o : %.c
+ $(CC) $(CFLAGS) -I.. -I. -c $<
+
+%.o: ${HEADERS}
+
+LDFLAGS = -L.. -lnetworkradius-client -lcrypto -lssl
+CFLAGS = -I..
+
+../libnetworkradius-client.a:
+ @${MAKE} -C .. libnetworkradius-client.a
+
+radsample.o: radsample.c ${HEADERS} nr_vp_create.c nr_packet_send.c
+
+#radsample: radsample.o ../libnetworkradius-client.a
+# ${CC} ${LFDLAGS} ${LIBS} -o $@ $^
+
+sample_chap.o: sample_chap.c ${HEADERS}
+
+sample_chap: sample_chap.o ../libnetworkradius-client.a
+ ${CC} ${LFDLAGS} ${LIBS} -o $@ $^
+
+radsample2.o: radsample2.c ${HEADERS} nr_vp_create.c
+
+radsample2: radsample2.o ../libnetworkradius-client.a
+ ${CC} ${LFDLAGS} ${LIBS} -o $@ $^
+
+radsample3.o: radsample3.c ${HEADERS} nr_transmit.c nr_server_t.c nr_vp_create.c
+
+radsample3: radsample3.o ../libnetworkradius-client.a
+ ${CC} ${LFDLAGS} ${LIBS} -o $@ $^
+
+clean:
+ @rm -rf *.o *.a *~
diff --git a/lib/radius/examples/example_1.c b/lib/radius/examples/example_1.c
new file mode 100644
index 0000000..503d927
--- /dev/null
+++ b/lib/radius/examples/example_1.c
@@ -0,0 +1,86 @@
+/*
+Copyright (c) 2011, Network RADIUS SARL
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <networkradius-devel/client.h>
+
+/** \file example_1.c
+ * \brief Sample code to initialize a RADIUS packet.
+ *
+ * This example initializes a packet, and then adds User-Name and
+ * User-Password to it. The resulting packet is then printed to the
+ * standard output.
+ */
+
+static const char *secret = "testing123";
+static uint8_t request_buffer[NR_MAX_PACKET_LEN];
+static uint8_t response_buffer[NR_MAX_PACKET_LEN];
+static RADIUS_PACKET request, response;
+
+int main(int argc, const char *argv[])
+{
+ ssize_t rcode;
+ const char *user = "bob";
+ const char *password = "password";
+
+ rcode = nr_packet_init(&request, NULL, secret, PW_ACCESS_REQUEST,
+ request_buffer, sizeof(request_buffer));
+ if (rcode < 0) {
+ error:
+ fprintf(stderr, "Error: %s\n", nr_strerror(rcode));
+ return 1;
+ }
+
+ if (argc > 1) user = argv[1];
+ if (argc > 2) password = argv[2];
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_NAME,
+ user, 0);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_PASSWORD,
+ password, 0);
+ if (rcode < 0) goto error;
+
+ /*
+ * ALWAYS call nr_packet_sign() before sending the packet
+ * to anyone else!
+ */
+ rcode = nr_packet_sign(&request, NULL);
+ if (rcode < 0) goto error;
+
+ nr_packet_print_hex(&request);
+
+ rcode = nr_packet_decode(&request, NULL);
+ if (rcode < 0) goto error;
+
+ nr_vp_fprintf_list(stdout, request.vps);
+ nr_vp_free(&request.vps);
+
+ return 0;
+}
diff --git a/lib/radius/examples/example_2.c b/lib/radius/examples/example_2.c
new file mode 100644
index 0000000..1065c8e
--- /dev/null
+++ b/lib/radius/examples/example_2.c
@@ -0,0 +1,86 @@
+/*
+Copyright (c) 2011, Network RADIUS SARL
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <networkradius-devel/client.h>
+
+/** \file example_2.c
+ * \brief Sample code to initialize a RADIUS packet.
+ *
+ * This example initializes a packet, and then adds User-Name and
+ * CHAP-Password to it. The resulting packet is then printed to the
+ * standard output.
+ */
+
+static const char *secret = "testing123";
+static uint8_t request_buffer[NR_MAX_PACKET_LEN];
+static uint8_t response_buffer[NR_MAX_PACKET_LEN];
+static RADIUS_PACKET request, response;
+
+int main(int argc, const char *argv[])
+{
+ int rcode;
+ const char *user = "bob";
+ const char *password = "password";
+
+ rcode = nr_packet_init(&request, NULL, secret, PW_ACCESS_REQUEST,
+ request_buffer, sizeof(request_buffer));
+ if (rcode < 0) {
+ error:
+ fprintf(stderr, "Error: %s\n", nr_strerror(rcode));
+ return 1;
+ }
+
+ if (argc > 1) user = argv[1];
+ if (argc > 2) password = argv[2];
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_NAME,
+ user, 0);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_CHAP_PASSWORD,
+ password, strlen(password));
+ if (rcode < 0) goto error;
+
+ /*
+ * ALWAYS call nr_packet_sign() before sending the packet
+ * to anyone else!
+ */
+ rcode = nr_packet_sign(&request, NULL);
+ if (rcode < 0) goto error;
+
+ nr_packet_print_hex(&request);
+
+ rcode = nr_packet_decode(&request, NULL);
+ if (rcode < 0) goto error;
+
+ nr_vp_fprintf_list(stdout, request.vps);
+ nr_vp_free(&request.vps);
+
+ return 0;
+}
diff --git a/lib/radius/examples/example_3.c b/lib/radius/examples/example_3.c
new file mode 100644
index 0000000..6104f6f
--- /dev/null
+++ b/lib/radius/examples/example_3.c
@@ -0,0 +1,123 @@
+/*
+Copyright (c) 2011, Network RADIUS SARL
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <networkradius-devel/client.h>
+
+/** \file example_3.c
+ * \brief Sample code to initialize a RADIUS packet and a response to it.
+ *
+ * This example initializes a packet, and then adds User-Name and
+ * User-Password to it. The resulting packet is then printed to the
+ * standard output.
+ *
+ * As a next step, it then creates the response, and prints that,
+ * too.
+ */
+
+static const char *secret = "testing123";
+static uint8_t request_buffer[NR_MAX_PACKET_LEN];
+static uint8_t response_buffer[NR_MAX_PACKET_LEN];
+static RADIUS_PACKET request, response;
+
+int main(int argc, const char *argv[])
+{
+ int rcode;
+ const char *user = "bob";
+ const char *password = "password";
+
+ rcode = nr_packet_init(&request, NULL, secret, PW_ACCESS_REQUEST,
+ request_buffer, sizeof(request_buffer));
+ if (rcode < 0) {
+ error:
+ fprintf(stderr, "Error :%s\n", nr_strerror(rcode));
+ return 1;
+ }
+
+ if (argc > 1) user = argv[1];
+ if (argc > 2) password = argv[2];
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_NAME,
+ user, 0);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_PASSWORD,
+ password, 0);
+ if (rcode < 0) goto error;
+
+ /*
+ * ALWAYS call nr_packet_sign() before sending the packet
+ * to anyone else!
+ */
+ rcode = nr_packet_sign(&request, NULL);
+ if (rcode < 0) goto error;
+
+ nr_packet_print_hex(&request);
+
+ rcode = nr_packet_init(&response, &request, secret, PW_ACCESS_ACCEPT,
+ response_buffer, sizeof(response_buffer));
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&response, &request,
+ NR_DA_REPLY_MESSAGE,
+ "Success!", 0);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&response, &request,
+ NR_DA_TUNNEL_PASSWORD,
+ password, 0);
+ if (rcode < 0) goto error;
+ rcode = nr_packet_sign(&response, &request);
+ if (rcode < 0) goto error;
+
+ nr_packet_print_hex(&response);
+
+ /*
+ * Check that the response is well-formed. The
+ * nr_packet_verify() function also calls nr_packet_ok().
+ * However, it is sometimes useful to separate "malformed
+ * packet" errors from "packet is not a response to a
+ * reqeust" errors.
+ */
+ rcode = nr_packet_ok(&response);
+ if (rcode < 0) goto error;
+
+ /*
+ * Double-check the signature of the response.
+ */
+ rcode = nr_packet_verify(&response, &request);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_decode(&response, &request);
+ if (rcode < 0) goto error;
+
+ nr_vp_fprintf_list(stdout, response.vps);
+ nr_vp_free(&response.vps);
+
+ return 0;
+}
diff --git a/lib/radius/examples/example_4.c b/lib/radius/examples/example_4.c
new file mode 100644
index 0000000..f93764c
--- /dev/null
+++ b/lib/radius/examples/example_4.c
@@ -0,0 +1,94 @@
+/*
+Copyright (c) 2011, Network RADIUS SARL
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <networkradius-devel/client.h>
+
+/** \file example_4.c
+ * \brief Allocate and manage multiple packets.
+ */
+
+static const char *secret = "testing123";
+static nr_server_t server;
+
+int main(int argc, const char *argv[])
+{
+ int rcode;
+ const char *user = "bob";
+ const char *password = "password";
+
+ rcode = nr_packet_init(&request, NULL, secret, PW_ACCESS_REQUEST,
+ request_buffer, sizeof(request_buffer));
+ if (rcode < 0) {
+ error:
+ fprintf(stderr, "Error :%s\n", nr_strerror(rcode));
+ return 1;
+ }
+
+ if (argc > 1) user = argv[1];
+ if (argc > 2) password = argv[2];
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_NAME,
+ user, 0);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&request, NULL,
+ NR_DA_USER_PASSWORD,
+ password, 0);
+ if (rcode < 0) goto error;
+
+ /*
+ * ALWAYS call nr_packet_sign() before sending the packet
+ * to anyone else!
+ */
+ rcode = nr_packet_sign(&request, NULL);
+ if (rcode < 0) goto error;
+
+ nr_packet_print_hex(&request);
+
+ rcode = nr_packet_init(&response, &request, secret, PW_ACCESS_ACCEPT,
+ response_buffer, sizeof(response_buffer));
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_attr_append(&response, &request,
+ NR_DA_REPLY_MESSAGE,
+ "Success!", 0);
+ if (rcode < 0) goto error;
+
+ rcode = nr_packet_sign(&response, &request);
+ if (rcode < 0) goto error;
+
+ nr_packet_print_hex(&response);
+
+ /*
+ * Double-check the signature of the response.
+ */
+ rcode = nr_packet_verify(&response, &request);
+ if (rcode < 0) goto error;
+
+ return 0;
+}
diff --git a/lib/radius/examples/nr_vp_create.c b/lib/radius/examples/nr_vp_create.c
new file mode 100644
index 0000000..bd04f17
--- /dev/null
+++ b/lib/radius/examples/nr_vp_create.c
@@ -0,0 +1,61 @@
+/*
+ * The person or persons who have associated work with this document
+ * (the "Dedicator" or "Certifier") hereby either (a) certifies that,
+ * to the best of his knowledge, the work of authorship identified is
+ * in the public domain of the country from which the work is
+ * published, or (b) hereby dedicates whatever copyright the
+ * dedicators holds in the work of authorship identified below (the
+ * "Work") to the public domain. A certifier, moreover, dedicates any
+ * copyright interest he may have in the associated work, and for
+ * these purposes, is described as a "dedicator" below.
+ *
+ * A certifier has taken reasonable steps to verify the copyright
+ * status of this work. Certifier recognizes that his good faith
+ * efforts may not shield him from liability if in fact the work
+ * certified is not in the public domain.
+ *
+ * Dedicator makes this dedication for the benefit of the public at
+ * large and to the detriment of the Dedicator's heirs and
+ * successors. Dedicator intends this dedication to be an overt act of
+ * relinquishment in perpetuity of all present and future rights under
+ * copyright law, whether vested or contingent, in the Work. Dedicator
+ * understands that such relinquishment of all rights includes the
+ * relinquishment of all rights to enforce (by lawsuit or otherwise)
+ * those copyrights in the Work.
+ *
+ * Dedicator recognizes that, once placed in the public domain, the
+ * Work may be freely reproduced, distributed, transmitted, used,
+ * modified, built upon, or otherwise exploited by anyone for any
+ * purpose, commercial or non-commercial, and in any way, including by
+ * methods that have not yet been invented or conceived.
+ */
+
+static VALUE_PAIR *example_nr_vp_create(void)
+{
+ VALUE_PAIR *vp;
+ VALUE_PAIR *head = NULL;
+
+ /*
+ * Create the request contents.
+ */
+ vp = nr_vp_create(PW_USER_NAME, 0, "bob", 4);
+ if (!vp) {
+ fprintf(stderr, "User-Name: %s\n", nr_strerror(0));
+ exit(1);
+ }
+ nr_vps_append(&head, vp);
+
+ /*
+ * The User-Password attribute is automatically encrypted
+ * when being placed in the packet. This version stays
+ * untouched, and should be "plain text".
+ */
+ vp = nr_vp_create(PW_USER_PASSWORD, 0, "hello", 6);
+ if (!vp) {
+ fprintf(stderr, "User-Password: %s\n", nr_strerror(0));
+ exit(1);
+ }
+ nr_vps_append(&head, vp);
+
+ return head;
+}