From 09f9dd8f515d5b4a99980e8768c3516764e60a0a Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 12 Aug 2021 09:32:24 +0000 Subject: [PATCH] adding radius message handling functions --- hio/lib/Makefile.am | 3 + hio/lib/Makefile.in | 68 ++-- hio/lib/chr.c | 2 - hio/lib/dns-cli.c | 2 - hio/lib/dns.c | 2 - hio/lib/ecs-imp.h | 2 - hio/lib/ecs.c | 2 - hio/lib/err.c | 2 - hio/lib/fmt-imp.h | 2 - hio/lib/fmt.c | 2 - hio/lib/hio-chr.h | 2 - hio/lib/hio-cmn.h | 2 - hio/lib/hio-dns.h | 2 - hio/lib/hio-ecs.h | 2 - hio/lib/hio-fmt.h | 2 - hio/lib/hio-htb.h | 2 - hio/lib/hio-htre.h | 2 - hio/lib/hio-json.h | 2 - hio/lib/hio-mar.h | 6 +- hio/lib/hio-md5.h | 71 ++++ hio/lib/hio-nwif.h | 2 - hio/lib/hio-opt.h | 2 - hio/lib/hio-pac1.h | 2 - hio/lib/hio-path.h | 2 - hio/lib/hio-pipe.h | 6 +- hio/lib/hio-pro.h | 6 +- hio/lib/hio-prv.h | 6 +- hio/lib/hio-rad.h | 453 ++++++++++++++++++++++++ hio/lib/hio-sck.h | 6 +- hio/lib/hio-skad.h | 2 - hio/lib/hio-thr.h | 6 +- hio/lib/hio-upac.h | 2 - hio/lib/hio-utl.h | 6 +- hio/lib/hio.c | 2 - hio/lib/hio.h | 6 +- hio/lib/htb.c | 2 - hio/lib/htre.c | 2 - hio/lib/http-cgi.c | 2 - hio/lib/http-fil.c | 2 - hio/lib/http-prv.h | 2 - hio/lib/http-svr.c | 2 - hio/lib/http-thr.c | 2 - hio/lib/http-txt.c | 2 - hio/lib/json.c | 2 - hio/lib/mar-cli.c | 2 - hio/lib/mar.c | 2 - hio/lib/md5.c | 307 +++++++++++++++++ hio/lib/nwif.c | 2 - hio/lib/opt-imp.h | 2 - hio/lib/opt.c | 2 - hio/lib/path.c | 2 - hio/lib/pipe.c | 2 - hio/lib/pro.c | 2 - hio/lib/rad-msg.c | 820 ++++++++++++++++++++++++++++++++++++++++++++ hio/lib/sck.c | 2 - hio/lib/skad.c | 2 - hio/lib/sys-ass.c | 2 - hio/lib/sys-err.c | 2 - hio/lib/sys-log.c | 2 - hio/lib/sys-mux.c | 2 - hio/lib/sys-prv.h | 2 - hio/lib/sys-tim.c | 2 - hio/lib/sys.c | 2 - hio/lib/thr.c | 2 - hio/lib/tmr.c | 2 - hio/lib/utf8.c | 2 - hio/lib/utl-siph.c | 2 - hio/lib/utl-str.c | 2 - hio/lib/utl.c | 2 - 69 files changed, 1716 insertions(+), 164 deletions(-) create mode 100644 hio/lib/hio-md5.h create mode 100644 hio/lib/hio-rad.h create mode 100644 hio/lib/md5.c create mode 100644 hio/lib/rad-msg.c diff --git a/hio/lib/Makefile.am b/hio/lib/Makefile.am index 202386d..a9bf33f 100644 --- a/hio/lib/Makefile.am +++ b/hio/lib/Makefile.am @@ -44,6 +44,7 @@ include_HEADERS = \ hio-path.h \ hio-pipe.h \ hio-pro.h \ + hio-rad.h \ hio-sck.h \ hio-skad.h \ hio-thr.h \ @@ -74,12 +75,14 @@ libhio_la_SOURCES = \ json.c \ hio-prv.h \ hio.c \ + md5.c \ nwif.c \ opt.c \ opt-imp.h \ path.c \ pipe.c \ pro.c \ + rad-msg.c \ sck.c \ skad.c \ sys.c \ diff --git a/hio/lib/Makefile.in b/hio/lib/Makefile.in index d0b4c95..fdbd643 100644 --- a/hio/lib/Makefile.in +++ b/hio/lib/Makefile.in @@ -150,10 +150,11 @@ libhio_la_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ am__libhio_la_SOURCES_DIST = chr.c dns.c dns-cli.c ecs.c ecs-imp.h \ err.c fmt.c fmt-imp.h htb.c htrd.c htre.c http.c http-cgi.c \ http-fil.c http-prv.h http-svr.c http-thr.c http-txt.c json.c \ - hio-prv.h hio.c nwif.c opt.c opt-imp.h path.c pipe.c pro.c \ - sck.c skad.c sys.c sys-ass.c sys-err.c sys-log.c sys-mux.c \ - sys-prv.h sys-tim.c thr.c uch-case.h uch-prop.h tmr.c utf8.c \ - utl.c utl-siph.c utl-str.c mar.c mar-cli.c + hio-prv.h hio.c md5.c nwif.c opt.c opt-imp.h path.c pipe.c \ + pro.c rad-msg.c sck.c skad.c sys.c sys-ass.c sys-err.c \ + sys-log.c sys-mux.c sys-prv.h sys-tim.c thr.c uch-case.h \ + uch-prop.h tmr.c utf8.c utl.c utl-siph.c utl-str.c mar.c \ + mar-cli.c @ENABLE_MARIADB_TRUE@am__objects_1 = libhio_la-mar.lo \ @ENABLE_MARIADB_TRUE@ libhio_la-mar-cli.lo am_libhio_la_OBJECTS = libhio_la-chr.lo libhio_la-dns.lo \ @@ -162,13 +163,14 @@ am_libhio_la_OBJECTS = libhio_la-chr.lo libhio_la-dns.lo \ libhio_la-htre.lo libhio_la-http.lo libhio_la-http-cgi.lo \ libhio_la-http-fil.lo libhio_la-http-svr.lo \ libhio_la-http-thr.lo libhio_la-http-txt.lo libhio_la-json.lo \ - libhio_la-hio.lo libhio_la-nwif.lo libhio_la-opt.lo \ - libhio_la-path.lo libhio_la-pipe.lo libhio_la-pro.lo \ - libhio_la-sck.lo libhio_la-skad.lo libhio_la-sys.lo \ - libhio_la-sys-ass.lo libhio_la-sys-err.lo libhio_la-sys-log.lo \ - libhio_la-sys-mux.lo libhio_la-sys-tim.lo libhio_la-thr.lo \ - libhio_la-tmr.lo libhio_la-utf8.lo libhio_la-utl.lo \ - libhio_la-utl-siph.lo libhio_la-utl-str.lo $(am__objects_1) + libhio_la-hio.lo libhio_la-md5.lo libhio_la-nwif.lo \ + libhio_la-opt.lo libhio_la-path.lo libhio_la-pipe.lo \ + libhio_la-pro.lo libhio_la-rad-msg.lo libhio_la-sck.lo \ + libhio_la-skad.lo libhio_la-sys.lo libhio_la-sys-ass.lo \ + libhio_la-sys-err.lo libhio_la-sys-log.lo libhio_la-sys-mux.lo \ + libhio_la-sys-tim.lo libhio_la-thr.lo libhio_la-tmr.lo \ + libhio_la-utf8.lo libhio_la-utl.lo libhio_la-utl-siph.lo \ + libhio_la-utl-str.lo $(am__objects_1) libhio_la_OBJECTS = $(am_libhio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -205,9 +207,11 @@ am__depfiles_remade = ./$(DEPDIR)/libhio_la-chr.Plo \ ./$(DEPDIR)/libhio_la-http-txt.Plo \ ./$(DEPDIR)/libhio_la-http.Plo ./$(DEPDIR)/libhio_la-json.Plo \ ./$(DEPDIR)/libhio_la-mar-cli.Plo \ - ./$(DEPDIR)/libhio_la-mar.Plo ./$(DEPDIR)/libhio_la-nwif.Plo \ - ./$(DEPDIR)/libhio_la-opt.Plo ./$(DEPDIR)/libhio_la-path.Plo \ - ./$(DEPDIR)/libhio_la-pipe.Plo ./$(DEPDIR)/libhio_la-pro.Plo \ + ./$(DEPDIR)/libhio_la-mar.Plo ./$(DEPDIR)/libhio_la-md5.Plo \ + ./$(DEPDIR)/libhio_la-nwif.Plo ./$(DEPDIR)/libhio_la-opt.Plo \ + ./$(DEPDIR)/libhio_la-path.Plo ./$(DEPDIR)/libhio_la-pipe.Plo \ + ./$(DEPDIR)/libhio_la-pro.Plo \ + ./$(DEPDIR)/libhio_la-rad-msg.Plo \ ./$(DEPDIR)/libhio_la-sck.Plo ./$(DEPDIR)/libhio_la-skad.Plo \ ./$(DEPDIR)/libhio_la-sys-ass.Plo \ ./$(DEPDIR)/libhio_la-sys-err.Plo \ @@ -248,8 +252,8 @@ am__can_run_installinfo = \ am__include_HEADERS_DIST = hio-cfg.h hio-chr.h hio-cmn.h hio-dns.h \ hio-ecs.h hio-fmt.h hio-htb.h hio-htrd.h hio-htre.h hio-http.h \ hio-json.h hio-nwif.h hio-opt.h hio-pac1.h hio-path.h \ - hio-pipe.h hio-pro.h hio-sck.h hio-skad.h hio-thr.h hio-upac.h \ - hio-utl.h hio.h hio-mar.h + hio-pipe.h hio-pro.h hio-rad.h hio-sck.h hio-skad.h hio-thr.h \ + hio-upac.h hio-utl.h hio.h hio-mar.h HEADERS = $(include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ hio-cfg.h.in @@ -439,16 +443,16 @@ LIBADD_LIB_COMMON = $(LIBM) include_HEADERS = hio-cfg.h hio-chr.h hio-cmn.h hio-dns.h hio-ecs.h \ hio-fmt.h hio-htb.h hio-htrd.h hio-htre.h hio-http.h \ hio-json.h hio-nwif.h hio-opt.h hio-pac1.h hio-path.h \ - hio-pipe.h hio-pro.h hio-sck.h hio-skad.h hio-thr.h hio-upac.h \ - hio-utl.h hio.h $(am__append_1) + hio-pipe.h hio-pro.h hio-rad.h hio-sck.h hio-skad.h hio-thr.h \ + hio-upac.h hio-utl.h hio.h $(am__append_1) lib_LTLIBRARIES = libhio.la libhio_la_SOURCES = chr.c dns.c dns-cli.c ecs.c ecs-imp.h err.c fmt.c \ fmt-imp.h htb.c htrd.c htre.c http.c http-cgi.c http-fil.c \ http-prv.h http-svr.c http-thr.c http-txt.c json.c hio-prv.h \ - hio.c nwif.c opt.c opt-imp.h path.c pipe.c pro.c sck.c skad.c \ - sys.c sys-ass.c sys-err.c sys-log.c sys-mux.c sys-prv.h \ - sys-tim.c thr.c uch-case.h uch-prop.h tmr.c utf8.c utl.c \ - utl-siph.c utl-str.c $(am__append_2) + hio.c md5.c nwif.c opt.c opt-imp.h path.c pipe.c pro.c \ + rad-msg.c sck.c skad.c sys.c sys-ass.c sys-err.c sys-log.c \ + sys-mux.c sys-prv.h sys-tim.c thr.c uch-case.h uch-prop.h \ + tmr.c utf8.c utl.c utl-siph.c utl-str.c $(am__append_2) libhio_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) libhio_la_CFLAGS = $(CFLAGS_LIB_COMMON) $(am__append_3) libhio_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) $(am__append_4) @@ -567,11 +571,13 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-json.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-mar-cli.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-mar.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-md5.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-nwif.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-opt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-path.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-pipe.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-pro.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-rad-msg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-sck.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-skad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhio_la-sys-ass.Plo@am__quote@ # am--include-marker @@ -736,6 +742,13 @@ libhio_la-hio.lo: hio.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -c -o libhio_la-hio.lo `test -f 'hio.c' || echo '$(srcdir)/'`hio.c +libhio_la-md5.lo: md5.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -MT libhio_la-md5.lo -MD -MP -MF $(DEPDIR)/libhio_la-md5.Tpo -c -o libhio_la-md5.lo `test -f 'md5.c' || echo '$(srcdir)/'`md5.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhio_la-md5.Tpo $(DEPDIR)/libhio_la-md5.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='md5.c' object='libhio_la-md5.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -c -o libhio_la-md5.lo `test -f 'md5.c' || echo '$(srcdir)/'`md5.c + libhio_la-nwif.lo: nwif.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -MT libhio_la-nwif.lo -MD -MP -MF $(DEPDIR)/libhio_la-nwif.Tpo -c -o libhio_la-nwif.lo `test -f 'nwif.c' || echo '$(srcdir)/'`nwif.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhio_la-nwif.Tpo $(DEPDIR)/libhio_la-nwif.Plo @@ -771,6 +784,13 @@ libhio_la-pro.lo: pro.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -c -o libhio_la-pro.lo `test -f 'pro.c' || echo '$(srcdir)/'`pro.c +libhio_la-rad-msg.lo: rad-msg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -MT libhio_la-rad-msg.lo -MD -MP -MF $(DEPDIR)/libhio_la-rad-msg.Tpo -c -o libhio_la-rad-msg.lo `test -f 'rad-msg.c' || echo '$(srcdir)/'`rad-msg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhio_la-rad-msg.Tpo $(DEPDIR)/libhio_la-rad-msg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rad-msg.c' object='libhio_la-rad-msg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -c -o libhio_la-rad-msg.lo `test -f 'rad-msg.c' || echo '$(srcdir)/'`rad-msg.c + libhio_la-sck.lo: sck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhio_la_CPPFLAGS) $(CPPFLAGS) $(libhio_la_CFLAGS) $(CFLAGS) -MT libhio_la-sck.lo -MD -MP -MF $(DEPDIR)/libhio_la-sck.Tpo -c -o libhio_la-sck.lo `test -f 'sck.c' || echo '$(srcdir)/'`sck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhio_la-sck.Tpo $(DEPDIR)/libhio_la-sck.Plo @@ -1057,11 +1077,13 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/libhio_la-json.Plo -rm -f ./$(DEPDIR)/libhio_la-mar-cli.Plo -rm -f ./$(DEPDIR)/libhio_la-mar.Plo + -rm -f ./$(DEPDIR)/libhio_la-md5.Plo -rm -f ./$(DEPDIR)/libhio_la-nwif.Plo -rm -f ./$(DEPDIR)/libhio_la-opt.Plo -rm -f ./$(DEPDIR)/libhio_la-path.Plo -rm -f ./$(DEPDIR)/libhio_la-pipe.Plo -rm -f ./$(DEPDIR)/libhio_la-pro.Plo + -rm -f ./$(DEPDIR)/libhio_la-rad-msg.Plo -rm -f ./$(DEPDIR)/libhio_la-sck.Plo -rm -f ./$(DEPDIR)/libhio_la-skad.Plo -rm -f ./$(DEPDIR)/libhio_la-sys-ass.Plo @@ -1141,11 +1163,13 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libhio_la-json.Plo -rm -f ./$(DEPDIR)/libhio_la-mar-cli.Plo -rm -f ./$(DEPDIR)/libhio_la-mar.Plo + -rm -f ./$(DEPDIR)/libhio_la-md5.Plo -rm -f ./$(DEPDIR)/libhio_la-nwif.Plo -rm -f ./$(DEPDIR)/libhio_la-opt.Plo -rm -f ./$(DEPDIR)/libhio_la-path.Plo -rm -f ./$(DEPDIR)/libhio_la-pipe.Plo -rm -f ./$(DEPDIR)/libhio_la-pro.Plo + -rm -f ./$(DEPDIR)/libhio_la-rad-msg.Plo -rm -f ./$(DEPDIR)/libhio_la-sck.Plo -rm -f ./$(DEPDIR)/libhio_la-skad.Plo -rm -f ./$(DEPDIR)/libhio_la-sys-ass.Plo diff --git a/hio/lib/chr.c b/hio/lib/chr.c index 8038cdb..e4915d9 100644 --- a/hio/lib/chr.c +++ b/hio/lib/chr.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/dns-cli.c b/hio/lib/dns-cli.c index a82c75d..2a7e2d6 100644 --- a/hio/lib/dns-cli.c +++ b/hio/lib/dns-cli.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/dns.c b/hio/lib/dns.c index cc6c152..d2ff00a 100644 --- a/hio/lib/dns.c +++ b/hio/lib/dns.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/ecs-imp.h b/hio/lib/ecs-imp.h index 448f173..0ec35a4 100644 --- a/hio/lib/ecs-imp.h +++ b/hio/lib/ecs-imp.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/ecs.c b/hio/lib/ecs.c index b0a0d73..1cfa2c1 100644 --- a/hio/lib/ecs.c +++ b/hio/lib/ecs.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/err.c b/hio/lib/err.c index 33b7df6..e300923 100644 --- a/hio/lib/err.c +++ b/hio/lib/err.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/fmt-imp.h b/hio/lib/fmt-imp.h index 250c2ae..1ef5cad 100644 --- a/hio/lib/fmt-imp.h +++ b/hio/lib/fmt-imp.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/fmt.c b/hio/lib/fmt.c index 970c8af..f50b77c 100644 --- a/hio/lib/fmt.c +++ b/hio/lib/fmt.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-chr.h b/hio/lib/hio-chr.h index aeb51c0..d5f207d 100644 --- a/hio/lib/hio-chr.h +++ b/hio/lib/hio-chr.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-cmn.h b/hio/lib/hio-cmn.h index 6f45947..852212c 100644 --- a/hio/lib/hio-cmn.h +++ b/hio/lib/hio-cmn.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-dns.h b/hio/lib/hio-dns.h index f79c28e..069167d 100644 --- a/hio/lib/hio-dns.h +++ b/hio/lib/hio-dns.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-ecs.h b/hio/lib/hio-ecs.h index 777c953..ddf30d3 100644 --- a/hio/lib/hio-ecs.h +++ b/hio/lib/hio-ecs.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-fmt.h b/hio/lib/hio-fmt.h index 8d31bd6..fd59441 100644 --- a/hio/lib/hio-fmt.h +++ b/hio/lib/hio-fmt.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-htb.h b/hio/lib/hio-htb.h index 2e5f46f..b1f218a 100644 --- a/hio/lib/hio-htb.h +++ b/hio/lib/hio-htb.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-htre.h b/hio/lib/hio-htre.h index a85b5a1..7aeb04a 100644 --- a/hio/lib/hio-htre.h +++ b/hio/lib/hio-htre.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-json.h b/hio/lib/hio-json.h index 0125d5f..0ca8584 100644 --- a/hio/lib/hio-json.h +++ b/hio/lib/hio-json.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-mar.h b/hio/lib/hio-mar.h index fc0c6d8..5871e3e 100644 --- a/hio/lib/hio-mar.h +++ b/hio/lib/hio-mar.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -203,7 +201,7 @@ typedef void (*hio_svc_marc_on_result_t) ( /* -------------------------------------------------------------- */ -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -294,7 +292,7 @@ HIO_EXPORT hio_oow_t hio_svc_marc_escapebchars ( hio_bch_t* buf ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio-md5.h b/hio/lib/hio-md5.h new file mode 100644 index 0000000..081ecf2 --- /dev/null +++ b/hio/lib/hio-md5.h @@ -0,0 +1,71 @@ +/* + Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 THE AUTHOR 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. + */ + +#ifndef _HIO_MD5_H_ +#define _HIO_MD5_H_ + +#include + +#define HIO_MD5_DIGEST_LEN (16) +#define HIO_MD5_BLOCK_LEN (64) + +struct hio_md5_t +{ + hio_uint32_t count[2]; + hio_uint32_t state[4]; + hio_uint8_t buffer[HIO_MD5_BLOCK_LEN]; +}; +typedef struct hio_md5_t hio_md5_t; + +#ifdef __cplusplus +extern "C" { +#endif + +HIO_EXPORT void hio_md5_initialize ( + hio_md5_t* md5 +); + +HIO_EXPORT void hio_md5_update ( + hio_md5_t* md5, + const void* data, + hio_uint32_t len +); + +HIO_EXPORT void hio_md5_updatex ( + hio_md5_t* md5, + const void* data, + hio_oow_t len +); + +HIO_EXPORT hio_oow_t hio_md5_digest ( + hio_md5_t* md5, + void* digest, + hio_oow_t size +); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hio/lib/hio-nwif.h b/hio/lib/hio-nwif.h index 695ced9..b8301ea 100644 --- a/hio/lib/hio-nwif.h +++ b/hio/lib/hio-nwif.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-opt.h b/hio/lib/hio-opt.h index 0249c17..0470ae7 100644 --- a/hio/lib/hio-opt.h +++ b/hio/lib/hio-opt.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-pac1.h b/hio/lib/hio-pac1.h index 95a00cc..d6e37c7 100644 --- a/hio/lib/hio-pac1.h +++ b/hio/lib/hio-pac1.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-path.h b/hio/lib/hio-path.h index b81ad43..a48e6fb 100644 --- a/hio/lib/hio-path.h +++ b/hio/lib/hio-path.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-pipe.h b/hio/lib/hio-pipe.h index 2a59e90..abb7f58 100644 --- a/hio/lib/hio-pipe.h +++ b/hio/lib/hio-pipe.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -92,7 +90,7 @@ enum hio_dev_pipe_ioctl_cmd_t }; typedef enum hio_dev_pipe_ioctl_cmd_t hio_dev_pipe_ioctl_cmd_t; -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -153,7 +151,7 @@ HIO_EXPORT int hio_dev_pipe_close ( hio_dev_pipe_sid_t sid ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio-pro.h b/hio/lib/hio-pro.h index 1bcf872..7b5e190 100644 --- a/hio/lib/hio-pro.h +++ b/hio/lib/hio-pro.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -138,7 +136,7 @@ enum hio_dev_pro_ioctl_cmd_t }; typedef enum hio_dev_pro_ioctl_cmd_t hio_dev_pro_ioctl_cmd_t; -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -205,7 +203,7 @@ HIO_EXPORT int hio_dev_pro_killchild ( hio_dev_pro_t* pro ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio-prv.h b/hio/lib/hio-prv.h index 71c5fca..5c579e2 100644 --- a/hio/lib/hio-prv.h +++ b/hio/lib/hio-prv.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -108,7 +106,7 @@ (hio)->_shuterr = __shuterr; \ } while(0) -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -218,7 +216,7 @@ void hio_sys_getrealtime ( hio_ntime_t* now ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio-rad.h b/hio/lib/hio-rad.h new file mode 100644 index 0000000..6179deb --- /dev/null +++ b/hio/lib/hio-rad.h @@ -0,0 +1,453 @@ +/* + Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 THE AUTHOR 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. + */ + +#ifndef _HIO_RAD_H_ +#define _HIO_RAD_H_ + +#include +#include + +/* ----------------------------------------------------------- + * RARIUS MESSAGE DEFINITIONS + * ----------------------------------------------------------- */ + +#define HIO_RAD_PACKET_MAX (65535) + +/* radius code */ +enum hio_rad_code_t +{ + HIO_RAD_ACCESS_REQUEST = 1, + HIO_RAD_ACCESS_ACCEPT = 2, + HIO_RAD_ACCESS_REJECT = 3, + HIO_RAD_ACCOUNTING_REQUEST = 4, + HIO_RAD_ACCOUNTING_RESPONSE = 5, + HIO_RAD_ACCESS_CHALLENGE = 6, + HIO_RAD_DISCONNECT_REQUEST = 40, + HIO_RAD_DISCONNECT_ACK = 41, + HIO_RAD_DISCONNECT_NAK = 42, + HIO_RAD_COA_REQUEST = 43, + HIO_RAD_COA_ACK = 44, + HIO_RAD_COA_NAK = 45, + + HIO_RAD_ACCOUNTING_ERROR = 255 /* this is not a real radius code */ +}; +typedef enum hio_rad_code_t hio_rad_code_t; + +#define HIO_RAD_MAX_AUTHENTICATOR_LEN 16 +#define HIO_RAD_MAX_ATTR_VALUE_LEN (HIO_TYPE_MAX(hio_uint8_t) - HIO_SIZEOF(hio_rad_attr_hdr_t)) +#define HIO_RAD_MAX_XATTR_VALUE_LEN (HIO_TYPE_MAX(hio_uint8_t) - HIO_SIZEOF(hio_rad_xattr_hdr_t)) +#define HIO_RAD_MAX_LXATTR_VALUE_LEN (HIO_TYPE_MAX(hio_uint8_t) - HIO_SIZEOF(hio_rad_lxattr_hdr_t)) +#define HIO_RAD_MAX_VSATTR_VALUE_LEN (HIO_TYPE_MAX(hio_uint8_t) - HIO_SIZEOF(hio_rad_vsattr_hdr_t)) +#define HIO_RAD_MAX_XVSATTR_VALUE_LEN (HIO_TYPE_MAX(hio_uint8_t) - HIO_SIZEOF(hio_rad_xvsattr_hdr_t)) +#define HIO_RAD_MAX_LXVSATTR_VALUE_LEN (HIO_TYPE_MAX(hio_uint8_t) - HIO_SIZEOF(hio_rad_lxvsattr_hdr_t)) + +typedef struct hio_rad_hdr_t hio_rad_hdr_t; +typedef struct hio_rad_attr_hdr_t hio_rad_attr_hdr_t; +typedef struct hio_rad_xattr_hdr_t hio_rad_xattr_hdr_t; +typedef struct hio_rad_lxattr_hdr_t hio_rad_lxattr_hdr_t; +typedef struct hio_rad_vsattr_hdr_t hio_rad_vsattr_hdr_t; +typedef struct hio_rad_xvsattr_hdr_t hio_rad_xvsattr_hdr_t; +typedef struct hio_rad_lxvsattr_hdr_t hio_rad_lxvsattr_hdr_t; /* evs */ + +typedef struct hio_rad_attr_uint32_t hio_rad_attr_uint32_t; +#if (HIO_SIZEOF_UINT64_T > 0) +typedef struct hio_rad_attr_uint64_t hio_rad_attr_uint64_t; +#endif + +#include +struct hio_rad_hdr_t +{ + hio_uint8_t code; /* hio_rad_code_t */ + hio_uint8_t id; + hio_uint16_t length; + hio_uint8_t authenticator[HIO_RAD_MAX_AUTHENTICATOR_LEN]; /* authenticator */ +}; + +struct hio_rad_attr_hdr_t +{ + hio_uint8_t type; /* hio_rad_attr_type_t */ + hio_uint8_t length; +}; + +struct hio_rad_xattr_hdr_t +{ + hio_uint8_t type; /* hio_rad_attr_type_t - one of 241-244 */ + hio_uint8_t length; + hio_uint8_t xtype; /* extended type */ +}; + +struct hio_rad_lxattr_hdr_t +{ + hio_uint8_t type; /* hio_rad_attr_type_t - 245 or 256*/ + hio_uint8_t length; + + hio_uint8_t xtype; /* extended type */ + hio_uint8_t xflags; /* bit 7: continuation, bit 6-0: reserved. */ +}; + +struct hio_rad_vsattr_hdr_t +{ + hio_uint8_t type; /* type - 26 */ + hio_uint8_t length; /* length */ + hio_uint32_t vendor; /* in network-byte order */ + + /* followed by a standard attribute */ + hio_rad_attr_hdr_t vs; +}; + +struct hio_rad_xvsattr_hdr_t +{ + hio_uint8_t type; /* one of 241-244 */ + hio_uint8_t length; + hio_uint8_t xtype; /* extended type. 26 for evs(extended vendor specific) attribute */ + hio_uint32_t vendor; /* in network-byte order */ + + /* followed by a standard attribute */ + hio_rad_attr_hdr_t xvs; +}; + +struct hio_rad_lxvsattr_hdr_t +{ + hio_uint8_t type; /* 245, 246*/ + hio_uint8_t length; + hio_uint8_t xtype; /* extended type. 26 for evs(extended vendor specific) attribute */ + hio_uint32_t vendor; /* in network-byte order */ + + /* followed by an extended attribute */ + struct + { + hio_uint8_t type; + hio_uint8_t flags; /* bit 7: continuation, bit 6-0: reserved. */ + hio_uint8_t length; + } lxvs; +}; + +struct hio_rad_attr_uint32_t +{ + hio_rad_attr_hdr_t hdr; + hio_uint32_t val; +}; + +#if (HIO_SIZEOF_UINT64_T > 0) +struct hio_rad_attr_uint64_t +{ + hio_rad_attr_hdr_t hdr; + hio_uint64_t val; +}; +#endif + +#include + + +typedef int (*hio_rad_attr_walker_t) ( + const hio_rad_hdr_t* hdr, + hio_uint32_t vendor, /* in host-byte order */ + const hio_rad_attr_hdr_t* attr, + void* ctx +); + +enum hio_rad_attr_type_t +{ + HIO_RAD_ATTR_USER_NAME = 1, /* string */ + HIO_RAD_ATTR_USER_PASSWORD = 2, /* string encrypted */ + HIO_RAD_ATTR_NAS_IP_ADDRESS = 4, /* ipaddr */ + HIO_RAD_ATTR_NAS_PORT = 5, /* integer */ + HIO_RAD_ATTR_SERVICE_TYPE = 6, /* integer */ + HIO_RAD_ATTR_FRAMED_IP_ADDRESS = 8, /* ipaddr */ + HIO_RAD_ATTR_REPLY_MESSAGE = 18, /* string */ + HIO_RAD_ATTR_CLASS = 25, /* octets */ + HIO_RAD_ATTR_VENDOR_SPECIFIC = 26, /* octets */ + HIO_RAD_ATTR_SESSION_TIMEOUT = 27, /* integer */ + HIO_RAD_ATTR_IDLE_TIMEOUT = 28, /* integer */ + HIO_RAD_ATTR_TERMINATION_ACTION = 29, /* integer. 0:default, 1:radius-request */ + HIO_RAD_ATTR_CALLING_STATION_ID = 31, /* string */ + HIO_RAD_ATTR_NAS_IDENTIFIER = 32, /* string */ + HIO_RAD_ATTR_ACCT_STATUS_TYPE = 40, /* integer */ + HIO_RAD_ATTR_ACCT_INPUT_OCTETS = 42, /* integer */ + HIO_RAD_ATTR_ACCT_OUTPUT_OCTETS = 43, /* integer */ + HIO_RAD_ATTR_ACCT_SESSION_ID = 44, /* string */ + HIO_RAD_ATTR_ACCT_SESSION_TIME = 46, /* integer */ + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE = 49, /* integer */ + HIO_RAD_ATTR_ACCT_INPUT_GIGAWORDS = 52, /* integer */ + HIO_RAD_ATTR_ACCT_OUTPUT_GIGAWORDS = 53, /* integer */ + HIO_RAD_ATTR_EVENT_TIMESTAMP = 55, /* integer */ + HIO_RAD_ATTR_NAS_PORT_TYPE = 61, /* integer */ + HIO_RAD_ATTR_ACCT_INTERIM_INTERVAL = 85, /* integer */ + HIO_RAD_ATTR_NAS_PORT_ID = 87, /* string */ + HIO_RAD_ATTR_FRAMED_IPV6_PREFIX = 97, /* ipv6prefix */ + + HIO_RAD_ATTR_EXTENDED_1 = 241, + HIO_RAD_ATTR_EXTENDED_2 = 242, + HIO_RAD_ATTR_EXTENDED_3 = 243, + HIO_RAD_ATTR_EXTENDED_4 = 244, + HIO_RAD_ATTR_EXTENDED_5 = 245, /* long extended */ + HIO_RAD_ATTR_EXTENDED_6 = 246, /* long extended */ +}; + +#define HIO_RAD_ATTR_IS_SHORT_EXTENDED(attrtype) ((attrtype) >= HIO_RAD_ATTR_EXTENDED_1 && (attrtype) <= HIO_RAD_ATTR_EXTENDED_4) +#define HIO_RAD_ATTR_IS_LONG_EXTENDED(attrtype) ((attrtype) >= HIO_RAD_ATTR_EXTENDED_5 && (attrtype) <= HIO_RAD_ATTR_EXTENDED_6) +#define HIO_RAD_ATTR_IS_EXTENDED(attrtype) ((attrtype) >= HIO_RAD_ATTR_EXTENDED_1 && (attrtype) <= HIO_RAD_ATTR_EXTENDED_6) + +enum hio_rad_attr_acct_status_type_t +{ + HIO_RAD_ATTR_ACCT_STATUS_TYPE_START = 1, /* accounting start */ + HIO_RAD_ATTR_ACCT_STATUS_TYPE_STOP = 2, /* accounting stop */ + HIO_RAD_ATTR_ACCT_STATUS_TYPE_UPDATE = 3, /* interim update */ + HIO_RAD_ATTR_ACCT_STATUS_TYPE_ON = 7, /* accounting on */ + HIO_RAD_ATTR_ACCT_STATUS_TYPE_OFF = 8, /* accounting off */ + HIO_RAD_ATTR_ACCT_STATUS_TYPE_FAILED = 15 +}; + +enum hio_rad_attr_acct_terminate_cause_t +{ + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_USER_REQUEST = 1, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_LOST_CARRIER = 2, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_LOST_SERVICE = 3, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT = 4, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_SESSION_TIMEOUT = 5, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_ADMIN_RESET = 6, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_ADMIN_REBOOT = 7, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_ERROR = 8, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_NAS_ERROR = 9, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_NAS_REQUEST = 10, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_NAS_REBOOT = 11, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_UNNEEDED = 12, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_PREEMPTED = 13, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_SUSPENDED = 14, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_SERVICE_UNAVAILABLE = 15, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_CALLBACK = 16, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_USER_ERROR = 17, + HIO_RAD_ATTR_ACCT_TERMINATE_CAUSE_HOST_REQUEST = 18 +}; + +enum hio_rad_attr_nas_port_type_t +{ + HIO_RAD_ATTR_NAS_PORT_TYPE_ASYNC = 0, + HIO_RAD_ATTR_NAS_PORT_TYPE_SYNC = 1, + HIO_RAD_ATTR_NAS_PORT_TYPE_ISDN = 2, + HIO_RAD_ATTR_NAS_PORT_TYPE_ISDN_V120 = 3, + HIO_RAD_ATTR_NAS_PORT_TYPE_ISDN_V110 = 4, + HIO_RAD_ATTR_NAS_PORT_TYPE_VIRTUAL = 5 + /* TODO: more types */ +}; + + +#if defined(__cplusplus) +extern "C" { +#endif + +/* ----------------------------------------------------------- + * RARIUS MESSAGE FUNCTIONS + * ----------------------------------------------------------- */ +HIO_EXPORT void hio_rad_initialize ( + hio_rad_hdr_t* hdr, + hio_rad_code_t code, + hio_uint8_t id +); + +HIO_EXPORT hio_rad_attr_hdr_t* hio_rad_find_attribute ( + hio_rad_hdr_t* hdr, + hio_uint8_t attrtype, + int index +); + +HIO_EXPORT hio_rad_vsattr_hdr_t* hio_rad_find_vsattr ( + hio_rad_hdr_t* hdr, + hio_uint32_t vendor, + hio_uint8_t attrtype, + int index +); + +HIO_EXPORT hio_rad_xvsattr_hdr_t* hio_rad_find_extended_vsattr ( + hio_rad_hdr_t* hdr, + hio_uint32_t vendor, + hio_uint8_t xtype, + hio_uint8_t attrtype, + int index +); + +HIO_EXPORT hio_rad_attr_hdr_t* hio_rad_find_vendor_specific_attribute ( + hio_rad_hdr_t* hdr, + hio_uint32_t vendor, + hio_uint8_t id, + int index +); + +HIO_EXPORT int hio_rad_walk_attributes ( + const hio_rad_hdr_t* hdr, + hio_rad_attr_walker_t walker, + void* ctx +); + +HIO_EXPORT int hio_rad_insert_attribute ( + hio_rad_hdr_t* auth, + int max, + hio_uint8_t id, + const void* ptr, + hio_uint8_t len +); + +HIO_EXPORT int hio_rad_insert_vendor_specific_attribute ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, + hio_uint8_t attrtype, + const void* ptr, + hio_uint8_t len +); + +HIO_EXPORT int hio_rad_insert_extended_vendor_specific_attribute ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, + hio_uint8_t xtype, /* HIO_RAD_ATTR_EXTENDED_X */ + hio_uint8_t attrtype, + const void* ptr, + hio_uint8_t len, + hio_uint8_t lxflags +); + +HIO_EXPORT int hio_rad_delete_attribute ( + hio_rad_hdr_t* auth, + hio_uint8_t attrtype, + int index +); + +HIO_EXPORT int hio_rad_delete_vendor_specific_attribute ( + hio_rad_hdr_t* auth, + hio_uint32_t vendor, + hio_uint8_t attrtype, + int index +); + +HIO_EXPORT int hio_rad_delete_extended_vendor_specific_attribute ( + hio_rad_hdr_t* auth, + hio_uint32_t vendor, + hio_uint8_t xtype, /* HIO_RAD_ATTR_EXTENDED_X */ + hio_uint8_t attrtype, + int index +); + +HIO_EXPORT int hio_rad_insert_attribute_with_bcstr ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, /* in host-byte order */ + hio_uint8_t id, + const hio_bch_t* value +); + +HIO_EXPORT int hio_rad_insert_attribute_ucstr ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, /* in host-byte order */ + hio_uint8_t id, + const hio_uch_t* value +); + +HIO_EXPORT int hio_rad_insert_attribute_with_bchars ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, /* in host-byte order */ + hio_uint8_t id, + const hio_bch_t* value, + hio_uint8_t length +); + +HIO_EXPORT int hio_rad_insert_attribute_with_uchars ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, /* in host-byte order */ + hio_uint8_t id, + const hio_uch_t* value, + hio_uint8_t length +); + +HIO_EXPORT int hio_rad_insert_uint32_attribute ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, /* in host-byte order */ + hio_uint8_t id, + hio_uint32_t value /* in host-byte order */ +); + +HIO_EXPORT int hio_rad_insert_ipv6prefix_attribute ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, /* in host-byte order */ + hio_uint8_t id, + hio_uint8_t prefix_bits, + const hio_ip6ad_t* value +); + +HIO_EXPORT int hio_rad_insert_giga_attribute ( + hio_rad_hdr_t* auth, + int max, + hio_uint32_t vendor, + int low_id, + int high_id, + hio_uint64_t value +); + +HIO_EXPORT int hio_rad_set_user_password ( + hio_rad_hdr_t* auth, + int max, + const hio_bch_t* password, + const hio_bch_t* secret +); + +HIO_EXPORT void hio_rad_fill_authenticator ( + hio_rad_hdr_t* auth +); + +HIO_EXPORT void hio_rad_copy_authenticator ( + hio_rad_hdr_t* dst, + const hio_rad_hdr_t* src +); + +HIO_EXPORT int hio_rad_set_authenticator ( + hio_rad_hdr_t* req, + const hio_bch_t* secret +); + +/* + * verify an accounting request. + * the authenticator of an access request is filled randomly. + * so this function doesn't apply + */ +HIO_EXPORT int hio_rad_verify_request ( + hio_rad_hdr_t* req, + const hio_bch_t* secret +); + +HIO_EXPORT int hio_rad_verify_response ( + hio_rad_hdr_t* res, + const hio_rad_hdr_t* req, + const hio_bch_t* secret +); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/hio/lib/hio-sck.h b/hio/lib/hio-sck.h index 5ef07bf..b22bafc 100644 --- a/hio/lib/hio-sck.h +++ b/hio/lib/hio-sck.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -445,7 +443,7 @@ struct hio_dev_sck_qxmsg_t typedef struct hio_dev_sck_qxmsg_t hio_dev_sck_qxmsg_t; -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -614,7 +612,7 @@ HIO_EXPORT hio_uint16_t hio_checksum_ip ( hio_oow_t len ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio-skad.h b/hio/lib/hio-skad.h index a7af248..688a081 100644 --- a/hio/lib/hio-skad.h +++ b/hio/lib/hio-skad.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-thr.h b/hio/lib/hio-thr.h index 699b6b2..9226e0e 100644 --- a/hio/lib/hio-thr.h +++ b/hio/lib/hio-thr.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -111,7 +109,7 @@ enum hio_dev_thr_ioctl_cmd_t }; typedef enum hio_dev_thr_ioctl_cmd_t hio_dev_thr_ioctl_cmd_t; -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -177,7 +175,7 @@ void hio_dev_thr_haltslave ( hio_dev_thr_sid_t sid ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio-upac.h b/hio/lib/hio-upac.h index c65db74..8f4c3aa 100644 --- a/hio/lib/hio-upac.h +++ b/hio/lib/hio-upac.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio-utl.h b/hio/lib/hio-utl.h index 5de9dc6..b79b281 100644 --- a/hio/lib/hio-utl.h +++ b/hio/lib/hio-utl.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -241,7 +239,7 @@ enum hio_trim_oochars_flag_t #define HIO_TRIM_BCHARS_RIGHT HIO_TRIM_OOCHARS_RIGHT }; -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -1077,7 +1075,7 @@ HIO_EXPORT void hio_sip_hash_24 ( hio_uint8_t out[8] ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/hio.c b/hio/lib/hio.c index b39e147..4882a02 100644 --- a/hio/lib/hio.c +++ b/hio/lib/hio.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/hio.h b/hio/lib/hio.h index e9a395d..0f79dd0 100644 --- a/hio/lib/hio.h +++ b/hio/lib/hio.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -764,7 +762,7 @@ struct hio_t /* ========================================================================= */ -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -1422,7 +1420,7 @@ HIO_EXPORT hio_oow_t hio_dev_cap_to_bcstr ( hio_oow_t bsz ); -#ifdef __cplusplus +#if defined(__cplusplus) } #endif diff --git a/hio/lib/htb.c b/hio/lib/htb.c index 9c39ef3..1bd32ff 100644 --- a/hio/lib/htb.c +++ b/hio/lib/htb.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/htre.c b/hio/lib/htre.c index 06e6b7f..a97b0bc 100644 --- a/hio/lib/htre.c +++ b/hio/lib/htre.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/http-cgi.c b/hio/lib/http-cgi.c index 9fa107f..f5ce6ee 100644 --- a/hio/lib/http-cgi.c +++ b/hio/lib/http-cgi.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/http-fil.c b/hio/lib/http-fil.c index b6e02e5..c856757 100644 --- a/hio/lib/http-fil.c +++ b/hio/lib/http-fil.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/http-prv.h b/hio/lib/http-prv.h index f11a2a8..2077523 100644 --- a/hio/lib/http-prv.h +++ b/hio/lib/http-prv.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/http-svr.c b/hio/lib/http-svr.c index e6ae1d1..dabfac8 100644 --- a/hio/lib/http-svr.c +++ b/hio/lib/http-svr.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/http-thr.c b/hio/lib/http-thr.c index 6df6a8f..7a0f42d 100644 --- a/hio/lib/http-thr.c +++ b/hio/lib/http-thr.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/http-txt.c b/hio/lib/http-txt.c index 43fc66e..43dbf8d 100644 --- a/hio/lib/http-txt.c +++ b/hio/lib/http-txt.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/json.c b/hio/lib/json.c index 49af042..fc3b486 100644 --- a/hio/lib/json.c +++ b/hio/lib/json.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2018 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/mar-cli.c b/hio/lib/mar-cli.c index 811f13e..1c9cf0e 100644 --- a/hio/lib/mar-cli.c +++ b/hio/lib/mar-cli.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/mar.c b/hio/lib/mar.c index a7fbbea..6b69c77 100644 --- a/hio/lib/mar.c +++ b/hio/lib/mar.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/md5.c b/hio/lib/md5.c new file mode 100644 index 0000000..9d87140 --- /dev/null +++ b/hio/lib/md5.c @@ -0,0 +1,307 @@ +/* + Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 THE AUTHOR 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 +#include "hio-prv.h" + +/* + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (hio_uint32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (hio_uint32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (hio_uint32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (hio_uint32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} + +static hio_uint8_t padding[64] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static void __transform (hio_uint32_t state[4], hio_uint8_t block[64]); +static void __encode (hio_uint8_t* output, hio_uint32_t* input, hio_oow_t len); +static void __decode (hio_uint32_t* output, hio_uint8_t* input, hio_oow_t len); + +void hio_md5_initialize (hio_md5_t* md5) +{ + md5->count[0] = 0; + md5->count[1] = 0; + + md5->state[0] = 0x67452301; + md5->state[1] = 0xEFCDAB89; + md5->state[2] = 0x98BADCFE; + md5->state[3] = 0x10325476; +} + +void hio_md5_update (hio_md5_t* md5, const void* data, hio_uint32_t len) +{ + hio_uint8_t* input = (hio_uint8_t*)data; + hio_uint32_t index, part_len, i; + + /* compute number of bytes mod 64 */ + index = (hio_uint32_t)((md5->count[0] >> 3) & 0x3F); + + /* update number of bits */ + md5->count[0] += ((hio_uint32_t)len << 3); + if (md5->count[0] < ((hio_uint32_t)len << 3)) md5->count[1]++; + md5->count[1] += (hio_uint32_t)len >> 29; + + part_len = 64 - index; + + /* transform as many times as possible */ + if (len >= part_len) + { + HIO_MEMCPY (&md5->buffer[index], input, part_len); + __transform (md5->state, md5->buffer); + + for (i = part_len; i + 63 < len; i += 64) + __transform (md5->state, &input[i]); + index = 0; + } + else i = 0; + + /* buffer remaining input */ + HIO_MEMCPY (&md5->buffer[index], &input[i], len - i); +} + +void hio_md5_updatex (hio_md5_t* md5, const void* data, hio_oow_t len) +{ + /* if len is greater than the max value of hio_uint32_t, + it splits the data to multiple calls to hio_md5_update */ + + const hio_uint8_t* input = (hio_uint8_t*)data; + while (len > HIO_TYPE_MAX(hio_uint32_t)) + { + hio_md5_update (md5, input, HIO_TYPE_MAX(hio_uint32_t)); + input += HIO_TYPE_MAX(hio_uint32_t); + len -= HIO_TYPE_MAX(hio_uint32_t); + } + + hio_md5_update (md5, input, len); +} + +hio_oow_t hio_md5_digest (hio_md5_t* md5, void* digest, hio_oow_t size) +{ + hio_uint8_t bits[8]; + hio_uint32_t index, pad_len; + hio_uint8_t digbuf[HIO_MD5_DIGEST_LEN]; + + /* save number of bits */ + __encode (bits, md5->count, 8); + + /* pad out to 56 mod 64 */ + index = (hio_uint32_t)((md5->count[0] >> 3) & 0x3F); + pad_len = (index < 56)? (56 - index): (120 - index); + hio_md5_update (md5, padding, pad_len); + + /* append length (before padding) */ + hio_md5_update (md5, bits, 8); + + /* store state in digest */ + __encode (digbuf, md5->state, HIO_COUNTOF(digbuf)); + hio_md5_initialize (md5); + + if (size > HIO_COUNTOF(digbuf)) size = HIO_COUNTOF(digbuf); + HIO_MEMCPY (digest, digbuf, size); + return size; +} + +static void __transform (hio_uint32_t state[4], hio_uint8_t block[64]) +{ + hio_uint32_t a, b, c, d, x[16]; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + + __decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; +} + +static void __encode (hio_uint8_t* output, hio_uint32_t* input, hio_oow_t len) +{ + hio_oow_t i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + { + output[j + 0] = (hio_uint8_t)((input[i] >> 0) & 0xFF); + output[j + 1] = (hio_uint8_t)((input[i] >> 8) & 0xFF); + output[j + 2] = (hio_uint8_t)((input[i] >> 16) & 0xFF); + output[j + 3] = (hio_uint8_t)((input[i] >> 24) & 0xFF); + } +} + +static void __decode (hio_uint32_t* output, hio_uint8_t* input, hio_oow_t len) +{ + hio_oow_t i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + { + output[i] = input[j] | (input[j + 1] << 8) | (input[j + 2] << 16) | (input[j + 3] << 24); + } +} diff --git a/hio/lib/nwif.c b/hio/lib/nwif.c index e8858b9..01c50fb 100644 --- a/hio/lib/nwif.c +++ b/hio/lib/nwif.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/opt-imp.h b/hio/lib/opt-imp.h index 3af187d..de93f2e 100644 --- a/hio/lib/opt-imp.h +++ b/hio/lib/opt-imp.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/opt.c b/hio/lib/opt.c index 567080c..fa112d2 100644 --- a/hio/lib/opt.c +++ b/hio/lib/opt.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/path.c b/hio/lib/path.c index c7e470e..8ddd7a9 100644 --- a/hio/lib/path.c +++ b/hio/lib/path.c @@ -1,6 +1,4 @@ /* - * $Id - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/pipe.c b/hio/lib/pipe.c index 0a4cfc9..c839acf 100644 --- a/hio/lib/pipe.c +++ b/hio/lib/pipe.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/pro.c b/hio/lib/pro.c index 5e24df7..e60e68d 100644 --- a/hio/lib/pro.c +++ b/hio/lib/pro.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/rad-msg.c b/hio/lib/rad-msg.c new file mode 100644 index 0000000..941144d --- /dev/null +++ b/hio/lib/rad-msg.c @@ -0,0 +1,820 @@ +/* + Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 THE AUTHOR 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 +#include +#include "hio-prv.h" + +#include +#include +#include +#include + +void hio_rad_initialize (hio_rad_hdr_t* hdr, hio_rad_code_t code, hio_uint8_t id) +{ + HIO_MEMSET (hdr, 0, sizeof(*hdr)); + hdr->code = code; + hdr->id = id; + hdr->length = hio_hton16(sizeof(*hdr)); +} + +static HIO_INLINE void xor (void* p, void* q, int length) +{ + int i; + hio_uint8_t* pp = (hio_uint8_t*)p; + hio_uint8_t* qq = (hio_uint8_t*)q; + for (i = 0; i < length; i++) *(pp++) ^= *(qq++); +} + +static void fill_authenticator_randomly (void* authenticator, int length) +{ + hio_uint8_t* v = (hio_uint8_t*)authenticator; + int total = 0; + +#if defined(__linux) + int fd; + + fd = open("/dev/urandom", O_RDONLY, 0); /* Linux: get *real* random numbers */ + if (fd >= 0) + { + while (total < length) + { + int bytes = read(fd, &v[total], length - total); + if (bytes <= 0) break; + total += bytes; + } + close (fd); + } +#endif + + if (total < length) + { + struct timeval now; + unsigned int seed; + + gettimeofday (&now, HIO_NULL); + seed = getpid() + now.tv_sec + now.tv_usec; + srandom (seed); + + while (total < length) + { + seed = random(); + v[total] = seed % HIO_TYPE_MAX(hio_uint8_t); + total++; + } + } +} + +static hio_rad_attr_hdr_t* find_attribute (hio_rad_attr_hdr_t* attr, int* len, hio_uint8_t attrtype) +{ + int rem = *len; + + while (rem >= HIO_SIZEOF(*attr)) + { + /* sanity checks */ + if (rem < attr->length) return HIO_NULL; + if (attr->length < HIO_SIZEOF(*attr)) + { + /* attribute length cannot be less than the header size. + * the packet could be corrupted... */ + return HIO_NULL; + } + + rem -= attr->length; + if (attr->type == attrtype) + { + *len = rem; /* remaining length */ + return attr; + } + + attr = (hio_rad_attr_hdr_t*)((hio_uint8_t*)attr + attr->length); + } + + return HIO_NULL; +} + +static hio_rad_attr_hdr_t* find_extended_attribute (hio_rad_attr_hdr_t* attr, int* len, hio_uint8_t xtype, hio_uint8_t attrtype) +{ + int rem = *len; + + /* xtype must be one of the followings: + * HIO_RAD_ATTR_EXTENDED_1 + * HIO_RAD_ATTR_EXTENDED_2 + * HIO_RAD_ATTR_EXTENDED_3 + * HIO_RAD_ATTR_EXTENDED_4 + * HIO_RAD_ATTR_EXTENDED_5 + * HIO_RAD_ATTR_EXTENDED_6 + */ + + while (rem >= HIO_SIZEOF(*attr)) + { + /* sanity checks */ + if (rem < attr->length) return HIO_NULL; + + /* attribute length cannot be less than the header size. + * the packet could be corrupted... */ + if (attr->length < HIO_SIZEOF(*attr)) goto oops; + + rem -= attr->length; + if (attr->type == xtype) + { + hio_uint8_t xattrtype; + + if (HIO_RAD_ATTR_IS_LONG_EXTENDED(xtype)) + { + hio_rad_lxattr_hdr_t* lxattr; + lxattr = (hio_rad_lxattr_hdr_t*)attr; + if (lxattr->length < HIO_SIZEOF(*lxattr)) goto oops; + xattrtype = lxattr->xtype; + } + else + { + hio_rad_xattr_hdr_t* xattr; + xattr = (hio_rad_xattr_hdr_t*)attr; + if (xattr->length < HIO_SIZEOF(*xattr)) goto oops; + xattrtype = xattr->xtype; + } + + if (xattrtype == attrtype) + { + *len = rem; + return attr; + } + } + + attr = (hio_rad_attr_hdr_t*)((hio_uint8_t*)attr + attr->length); + } + +oops: + return HIO_NULL; +} + +hio_rad_attr_hdr_t* hio_rad_find_attribute (hio_rad_hdr_t* hdr, hio_uint8_t attrtype, int index) +{ + hio_rad_attr_hdr_t *attr = (hio_rad_attr_hdr_t*)(hdr+1); + + if (hio_ntoh16(hdr->length) >= HIO_SIZEOF(*hdr)) + { + int len = hio_ntoh16(hdr->length) - HIO_SIZEOF(*hdr); + attr = find_attribute(attr, &len, attrtype); + while (attr) + { + if (index <= 0) return attr; + index--; + attr = find_attribute((hio_rad_attr_hdr_t*)((hio_uint8_t*)attr+attr->length), &len, attrtype); + } + } + + return HIO_NULL; +} + +hio_rad_attr_hdr_t* hio_rad_find_extended_attribute (hio_rad_hdr_t* hdr, hio_uint8_t xtype, hio_uint8_t attrtype, int index) +{ + hio_rad_attr_hdr_t *attr = (hio_rad_attr_hdr_t*)(hdr + 1); + + if (HIO_RAD_ATTR_IS_EXTENDED(xtype) && hio_ntoh16(hdr->length) >= HIO_SIZEOF(*hdr)) + { + int len = hio_ntoh16(hdr->length) - HIO_SIZEOF(*hdr); + attr = find_extended_attribute(attr, &len, xtype, attrtype); + while (attr) + { + if (index <= 0) return attr; + index--; + attr = find_extended_attribute((hio_rad_attr_hdr_t*)((hio_uint8_t*)attr + attr->length), &len, xtype, attrtype); + } + } + + return HIO_NULL; +} + +hio_rad_vsattr_hdr_t* hio_rad_find_vsattr (hio_rad_hdr_t* hdr, hio_uint32_t vendor, hio_uint8_t attrtype, int index) +{ + hio_rad_attr_hdr_t *attr = (hio_rad_attr_hdr_t*)(hdr+1); + + if (hio_ntoh16(hdr->length) >= HIO_SIZEOF(*hdr)) + { + int len = hio_ntoh16(hdr->length) - HIO_SIZEOF(*hdr); + + attr = find_attribute(attr, &len, HIO_RAD_ATTR_VENDOR_SPECIFIC); + while (attr) + { + hio_rad_vsattr_hdr_t* vsattr; + + if (attr->length >= HIO_SIZEOF(*vsattr)) /* sanity check */ + { + vsattr = (hio_rad_vsattr_hdr_t*)attr; + + if (hio_ntoh32(vsattr->vendor) == vendor && vsattr->vs.type == attrtype) + { + int val_len; + + val_len = (int)vsattr->length - HIO_SIZEOF(*vsattr); + + if ((int)vsattr->vs.length == val_len + HIO_SIZEOF(vsattr->vs)) + { + if (index <= 0) return vsattr; + index--; + } + } + } + + attr = find_attribute((hio_rad_attr_hdr_t*)((hio_uint8_t*)attr + attr->length), &len, HIO_RAD_ATTR_VENDOR_SPECIFIC); + } + } + + return HIO_NULL; +} + +hio_rad_xvsattr_hdr_t* hio_rad_find_extended_vsattr (hio_rad_hdr_t* hdr, hio_uint32_t vendor, hio_uint8_t xtype, hio_uint8_t attrtype, int index) +{ + hio_rad_attr_hdr_t *attr = (hio_rad_attr_hdr_t*)(hdr+1); + + if (HIO_RAD_ATTR_IS_EXTENDED(xtype) && hio_ntoh16(hdr->length) >= HIO_SIZEOF(*hdr)) + { + int len = hio_ntoh16(hdr->length) - HIO_SIZEOF(*hdr); + + attr = find_extended_attribute(attr, &len, xtype, HIO_RAD_ATTR_VENDOR_SPECIFIC); + while (attr) + { + if (HIO_RAD_ATTR_IS_LONG_EXTENDED(xtype)) + { + hio_rad_lxvsattr_hdr_t* lxvsattr; + if (attr->length >= HIO_SIZEOF(*lxvsattr)) /* sanity check */ + { + lxvsattr = (hio_rad_lxvsattr_hdr_t*)attr; + + if (hio_ntoh32(lxvsattr->vendor) == vendor && lxvsattr->lxvs.type == attrtype) + { + int val_len; + + val_len = (int)lxvsattr->length - HIO_SIZEOF(*lxvsattr); + + if ((int)lxvsattr->lxvs.length == val_len + HIO_SIZEOF(lxvsattr->lxvs)) + { + /* the caller must check if the extended type is long. + * if long, it must cast back to hio_rad_lxvsattr_hdr_t* */ + if (index <= 0) return (hio_rad_xvsattr_hdr_t*)lxvsattr; + index--; + } + } + } + } + else + { + hio_rad_xvsattr_hdr_t* xvsattr; + if (attr->length >= HIO_SIZEOF(*xvsattr)) /* sanity check */ + { + xvsattr = (hio_rad_xvsattr_hdr_t*)attr; + + if (hio_ntoh32(xvsattr->vendor) == vendor && xvsattr->xvs.type == attrtype) + { + int val_len; + + val_len = (int)xvsattr->length - HIO_SIZEOF(*xvsattr); + + if ((int)xvsattr->xvs.length == val_len + HIO_SIZEOF(xvsattr->xvs)) + { + if (index <= 0) return xvsattr; + index--; + } + } + } + } + + attr = find_extended_attribute((hio_rad_attr_hdr_t*)((hio_uint8_t*)attr + attr->length), &len, xtype, HIO_RAD_ATTR_VENDOR_SPECIFIC); + } + } + + return HIO_NULL; +} + +hio_rad_attr_hdr_t* hio_rad_find_vendor_specific_attribute (hio_rad_hdr_t* hdr, hio_uint32_t vendor, hio_uint8_t attrtype, int index) +{ + hio_rad_vsattr_hdr_t* vsattr; + vsattr = hio_rad_find_vsattr(hdr, vendor, attrtype, index); + return vsattr? &vsattr->vs: HIO_NULL; +} + +int hio_rad_walk_attributes (const hio_rad_hdr_t* hdr, hio_rad_attr_walker_t walker, void* ctx) +{ + int totlen, rem; + hio_rad_attr_hdr_t* attr; + + totlen = hio_ntoh16(hdr->length); + if (totlen < HIO_SIZEOF(*hdr)) return -1; + + rem = totlen - HIO_SIZEOF(*hdr); + attr = (hio_rad_attr_hdr_t*)(hdr + 1); + while (rem >= HIO_SIZEOF(*attr)) + { + /* sanity checks */ + if (rem < attr->length) return -1; + if (attr->length < HIO_SIZEOF(*attr)) + { + /* attribute length cannot be less than the header size. + * the packet could be corrupted... */ + return -1; + } + + rem -= attr->length; + + if (attr->type == HIO_RAD_ATTR_VENDOR_SPECIFIC) + { + hio_rad_vsattr_hdr_t* vsattr; + int val_len; + + if (attr->length < HIO_SIZEOF(*vsattr)) return -1; + vsattr = (hio_rad_vsattr_hdr_t*)attr; + + val_len = (int)vsattr->length - HIO_SIZEOF(*vsattr); + if ((int)vsattr->vs.length != val_len + HIO_SIZEOF(vsattr->vs)) return -1; + + /* if this vendor happens to be 0, walker can't tell + * if it is vendor specific or not because 0 is passed in + * for non-VSAs. but i don't care. in reality, + * 0 is reserved in IANA enterpirse number assignments. + * (http://www.iana.org/assignments/enterprise-numbers) */ + if (walker(hdr, hio_ntoh32(vsattr->vendor), &vsattr->vs, ctx) <= -1) return -1; + } + else + { + if (walker(hdr, 0, attr, ctx) <= -1) return -1; + } + + attr = (hio_rad_attr_hdr_t*)((hio_uint8_t*) attr + attr->length); + } + + return 0; +} + + +int hio_rad_insert_attribute ( + hio_rad_hdr_t* auth, int max, + hio_uint8_t id, const void* ptr, hio_uint8_t len) +{ + hio_rad_attr_hdr_t* attr; + int auth_len = hio_ntoh16(auth->length); + int new_auth_len; + + /*if (len > HIO_RAD_MAX_ATTR_VALUE_LEN) return -1;*/ + if (len > HIO_RAD_MAX_ATTR_VALUE_LEN) len = HIO_RAD_MAX_ATTR_VALUE_LEN; + new_auth_len = auth_len + len + HIO_SIZEOF(*attr); + + if (new_auth_len > max) return -1; + + attr = (hio_rad_attr_hdr_t*)((hio_uint8_t*)auth + auth_len); + attr->type = id; + attr->length = new_auth_len - auth_len; + HIO_MEMCPY (attr + 1, ptr, len); + auth->length = hio_hton16(new_auth_len); + + return 0; +} + +int hio_rad_insert_vendor_specific_attribute ( + hio_rad_hdr_t* auth, int max, + hio_uint32_t vendor, hio_uint8_t attrtype, const void* ptr, hio_uint8_t len) +{ + hio_rad_vsattr_hdr_t* vsattr; + int auth_len = hio_ntoh16(auth->length); + int new_auth_len; + + /*if (len > HIO_RAD_MAX_VSATTR_VALUE_LEN) return -1;*/ + if (len > HIO_RAD_MAX_VSATTR_VALUE_LEN) len = HIO_RAD_MAX_VSATTR_VALUE_LEN; + new_auth_len = auth_len + HIO_SIZEOF(*vsattr) + len; + + if (new_auth_len > max) return -1; + + vsattr = (hio_rad_vsattr_hdr_t*)((hio_uint8_t*)auth + auth_len); + vsattr->type = HIO_RAD_ATTR_VENDOR_SPECIFIC; + vsattr->length = new_auth_len - auth_len; + vsattr->vendor = hio_hton32(vendor); + + vsattr->vs.type = attrtype; + vsattr->vs.length = HIO_SIZEOF(vsattr->vs) + len; + HIO_MEMCPY (vsattr + 1, ptr, len); + + auth->length = hio_hton16(new_auth_len); + return 0; +} + +static int delete_attribute (hio_rad_hdr_t* auth, hio_rad_attr_hdr_t* attr) +{ + hio_uint16_t auth_len; + hio_uint16_t tmp_len; + + auth_len = hio_ntoh16(auth->length); + tmp_len = ((hio_uint8_t*)attr - (hio_uint8_t*)auth) + attr->length; + if (tmp_len > auth_len) return -1; /* can this happen? */ + + HIO_MEMCPY (attr, (hio_uint8_t*)attr + attr->length, auth_len - tmp_len); + + auth_len -= attr->length; + auth->length = hio_hton16(auth_len); + return 0; +} + +int hio_rad_delete_attribute (hio_rad_hdr_t* auth, hio_uint8_t attrtype, int index) +{ + hio_rad_attr_hdr_t* attr; + + attr = hio_rad_find_attribute(auth, attrtype, index); + if (!attr) return 0; /* not found */ + return (delete_attribute(auth, attr) <= -1)? -1: 1; +} + +int hio_rad_delete_vendor_specific_attribute ( + hio_rad_hdr_t* auth, hio_uint32_t vendor, hio_uint8_t attrtype, int index) +{ + hio_rad_vsattr_hdr_t* vsattr; + + vsattr = hio_rad_find_vsattr(auth, vendor, attrtype, 0); + if (!vsattr) return 0; /* not found */ + return (delete_attribute(auth, (hio_rad_attr_hdr_t*)vsattr) <= -1)? -1: 1; +} + +int hio_rad_delete_extended_vendor_specific_attribute ( + hio_rad_hdr_t* auth, hio_uint32_t vendor, hio_uint8_t xtype, hio_uint8_t attrtype, int index) +{ + hio_rad_xvsattr_hdr_t* xvsattr; + + xvsattr = hio_rad_find_extended_vsattr(auth, vendor, xtype, attrtype, 0); + if (!xvsattr) return 0; /* not found */ + + return (delete_attribute(auth, (hio_rad_attr_hdr_t*)xvsattr) <= -1)? -1: 1; +} + +int hio_rad_insert_attribute_with_bcstr ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, + hio_uint8_t id, const hio_bch_t* value) +{ + return (vendor == 0)? + hio_rad_insert_attribute(auth, max, id, value, hio_count_bcstr(value)): + hio_rad_insert_vendor_specific_attribute(auth, max, vendor, id, value, hio_count_bcstr(value)); +} + +int hio_rad_insert_attribute_with_ucstr ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, + hio_uint8_t id, const hio_uch_t* value) +{ + int n; + hio_oow_t bcslen, ucslen; + hio_bch_t bcsval[HIO_RAD_MAX_ATTR_VALUE_LEN + 1]; + + bcslen = HIO_COUNTOF(bcsval); + if (hio_conv_ucstr_to_utf8(value, &ucslen, bcsval, &bcslen) <= -1) return -1; + n = (vendor == 0)? + hio_rad_insert_attribute(auth, max, id, bcsval, bcslen): + hio_rad_insert_vendor_specific_attribute(auth, max, vendor, id, bcsval, bcslen); + + return n; +} + +int hio_rad_insert_attribute_with_bchars ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, + hio_uint8_t id, const hio_bch_t* value, hio_uint8_t length) +{ + return (vendor == 0)? + hio_rad_insert_attribute(auth, max, id, value, length): + hio_rad_insert_vendor_specific_attribute(auth, max, vendor, id, value, length); +} + +int hio_rad_insert_attribute_with_uchars ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, + hio_uint8_t id, const hio_uch_t* value, hio_uint8_t length) +{ + int n; + hio_oow_t bcslen, ucslen; + hio_bch_t bcsval[HIO_RAD_MAX_ATTR_VALUE_LEN]; + + ucslen = length; + bcslen = HIO_COUNTOF(bcsval); + if (hio_conv_uchars_to_utf8(value, &ucslen, bcsval, &bcslen) <= -1) return -1; + + n = (vendor == 0)? + hio_rad_insert_attribute(auth, max, id, bcsval, bcslen): + hio_rad_insert_vendor_specific_attribute(auth, max, vendor, id, bcsval, bcslen); + + return n; +} + +int hio_rad_insert_uint32_attribute ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, hio_uint8_t id, hio_uint32_t value) +{ + hio_uint32_t val = hio_hton32(value); + return (vendor == 0)? + hio_rad_insert_attribute(auth, max, id, &val, HIO_SIZEOF(val)): + hio_rad_insert_vendor_specific_attribute(auth, max, vendor, id, &val, HIO_SIZEOF(val)); +} + +int hio_rad_insert_ipv6prefix_attribute ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, hio_uint8_t id, + hio_uint8_t prefix_bits, const hio_ip6ad_t* value) +{ + struct ipv6prefix_t + { + hio_uint8_t reserved; + hio_uint8_t bits; + hio_ip6ad_t value; + } __attribute__((__packed__)); + + struct ipv6prefix_t ipv6prefix; + hio_uint8_t i, j; + + if (prefix_bits > 128) prefix_bits = 128; + + HIO_MEMSET (&ipv6prefix, 0, sizeof(ipv6prefix)); + ipv6prefix.bits = prefix_bits; + + for (i = 0, j = 0; i < prefix_bits; i += 8, j++) + { + hio_uint8_t bits = prefix_bits - i; + if (bits >= 8) + { + ipv6prefix.value.v[j] = value->v[j]; + } + else + { + /* + 1 -> 10000000 + 2 -> 11000000 + 3 -> 11100000 + 4 -> 11110000 + 5 -> 11111000 + 6 -> 11111100 + 7 -> 11111110 + */ + ipv6prefix.value.v[j] = value->v[j] & (0xFF << (8 - bits)); + } + } + + return (vendor == 0)? + hio_rad_insert_attribute(auth, max, id, &ipv6prefix, j + 2): + hio_rad_insert_vendor_specific_attribute(auth, max, vendor, id, &ipv6prefix, j + 2); +} + +int hio_rad_insert_giga_attribute ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, int low_id, int high_id, hio_uint64_t value) +{ + hio_uint32_t low; + low = value & HIO_TYPE_MAX(hio_uint32_t); + low = hio_hton32(low); + + if (vendor == 0) + { + if (hio_rad_insert_attribute(auth, max, low_id, &low, HIO_SIZEOF(low)) <= -1) return -1; + + if (value > HIO_TYPE_MAX(hio_uint32_t)) + { + hio_uint32_t high; + high = value >> (HIO_SIZEOF(hio_uint32_t) * 8); + high = hio_hton32(high); + if (hio_rad_insert_attribute(auth, max, high_id, &high, HIO_SIZEOF(high)) <= -1) return -1; + } + } + else + { + if (hio_rad_insert_vendor_specific_attribute(auth, max, vendor, low_id, &low, HIO_SIZEOF(low)) <= -1) return -1; + + if (value > HIO_TYPE_MAX(hio_uint32_t)) + { + hio_uint32_t high; + high = value >> (HIO_SIZEOF(hio_uint32_t) * 8); + high = hio_hton32(high); + if (hio_rad_insert_vendor_specific_attribute(auth, max, vendor, high_id, &high, HIO_SIZEOF(high)) <= -1) return -1; + } + } + + return 0; +} + +int hio_rad_insert_extended_vendor_specific_attribute ( + hio_rad_hdr_t* auth, int max, hio_uint32_t vendor, hio_uint8_t xtype, + hio_uint8_t attrtype, const void* ptr, hio_uint8_t len, hio_uint8_t lxflags) +{ + /* RFC6929 */ + hio_rad_xvsattr_hdr_t* xvsattr; + int auth_len = hio_ntoh16(auth->length); + int new_auth_len, maxvallen, hdrlen; + + if (HIO_RAD_ATTR_IS_SHORT_EXTENDED(xtype)) + { + maxvallen = HIO_RAD_MAX_XVSATTR_VALUE_LEN; + hdrlen = HIO_SIZEOF(hio_rad_xvsattr_hdr_t); + } + else if (HIO_RAD_ATTR_IS_LONG_EXTENDED(xtype)) + { + maxvallen = HIO_RAD_MAX_LXVSATTR_VALUE_LEN; + hdrlen = HIO_SIZEOF(hio_rad_lxvsattr_hdr_t); + } + else return -1; + + /*if (len > maxvallen) return -1;*/ + if (len > maxvallen) len = HIO_RAD_MAX_XVSATTR_VALUE_LEN; + new_auth_len = auth_len + hdrlen + len; + + if (new_auth_len > max) return -1; + + xvsattr = (hio_rad_xvsattr_hdr_t*)((hio_uint8_t*)auth + auth_len); + xvsattr->type = xtype; + xvsattr->length = new_auth_len - auth_len; + xvsattr->xtype = HIO_RAD_ATTR_VENDOR_SPECIFIC; + xvsattr->vendor = hio_hton32(vendor); + + if (HIO_RAD_ATTR_IS_LONG_EXTENDED(xtype)) + { + /* this function is still low-level. it doesn't handle continuation of big data */ + hio_rad_lxvsattr_hdr_t* lxvsattr; + lxvsattr = (hio_rad_lxvsattr_hdr_t*)xvsattr; + lxvsattr->lxvs.type = attrtype; + lxvsattr->lxvs.flags = lxflags; + lxvsattr->lxvs.length = len + HIO_SIZEOF(lxvsattr->lxvs); + HIO_MEMCPY (lxvsattr + 1, ptr, len); + } + else + { + xvsattr->xvs.type = attrtype; + xvsattr->xvs.length = len + HIO_SIZEOF(xvsattr->xvs); + HIO_MEMCPY (xvsattr + 1, ptr, len); + } + + auth->length = hio_hton16(new_auth_len); + return 0; +} + +#define PASS_BLKSIZE HIO_RAD_MAX_AUTHENTICATOR_LEN +#define ALIGN(x,factor) ((((x) + (factor) - 1) / (factor)) * (factor)) + +int hio_rad_set_user_password (hio_rad_hdr_t* auth, int max, const hio_bch_t* password, const hio_bch_t* secret) +{ + hio_md5_t md5; + + hio_uint8_t hashed[HIO_RAD_MAX_ATTR_VALUE_LEN]; /* can't be longer than this */ + hio_uint8_t tmp[PASS_BLKSIZE]; + + int i, pwlen, padlen; + + /*HIO_ASSERT (HIO_SIZEOF(tmp) >= HIO_MD5_DIGEST_LEN);*/ + + pwlen = hio_count_bcstr(password); + + /* calculate padlen to be the multiples of 16. + * 0 is forced to 16. */ + padlen = (pwlen <= 0)? PASS_BLKSIZE: ALIGN(pwlen,PASS_BLKSIZE); + + /* keep the padded length limited within the maximum attribute length */ + if (padlen > HIO_RAD_MAX_ATTR_VALUE_LEN) + { + padlen = HIO_RAD_MAX_ATTR_VALUE_LEN; + padlen = ALIGN(padlen,PASS_BLKSIZE); + if (padlen > HIO_RAD_MAX_ATTR_VALUE_LEN) padlen -= PASS_BLKSIZE; + + /* also limit the original length */ + if (pwlen > padlen) pwlen = padlen; + } + + HIO_MEMSET (hashed, 0, padlen); + HIO_MEMCPY (hashed, password, pwlen); + + /* + * c1 = p1 XOR MD5(secret + authenticator) + * c2 = p2 XOR MD5(secret + c1) + * ... + * cn = pn XOR MD5(secret + cn-1) + */ + hio_md5_initialize (&md5); + hio_md5_update (&md5, secret, hio_count_bcstr(secret)); + hio_md5_update (&md5, auth->authenticator, HIO_SIZEOF(auth->authenticator)); + hio_md5_digest (&md5, tmp, HIO_SIZEOF(tmp)); + + xor (&hashed[0], tmp, HIO_SIZEOF(tmp)); + + for (i = 1; i < (padlen >> 4); i++) + { + hio_md5_initialize (&md5); + hio_md5_update (&md5, secret, hio_count_bcstr(secret)); + hio_md5_update (&md5, &hashed[(i-1) * PASS_BLKSIZE], PASS_BLKSIZE); + hio_md5_digest (&md5, tmp, HIO_SIZEOF(tmp)); + xor (&hashed[i * PASS_BLKSIZE], tmp, HIO_SIZEOF(tmp)); + } + + /* ok if not found or deleted. but not ok if an error occurred */ + while (1) + { + int n; + n = hio_rad_delete_attribute(auth, HIO_RAD_ATTR_USER_PASSWORD, 0); + if (n <= -1) goto oops; + if (n == 0) break; + } + if (hio_rad_insert_attribute(auth, max, HIO_RAD_ATTR_USER_PASSWORD, hashed, padlen) <= -1) goto oops; + + return 0; + +oops: + return -1; +} + +void hio_rad_fill_authenticator (hio_rad_hdr_t* auth) +{ + fill_authenticator_randomly (auth->authenticator, HIO_SIZEOF(auth->authenticator)); +} + +void hio_rad_copy_authenticator (hio_rad_hdr_t* dst, const hio_rad_hdr_t* src) +{ + HIO_MEMCPY (dst->authenticator, src->authenticator, HIO_SIZEOF(dst->authenticator)); +} + +int hio_rad_set_authenticator (hio_rad_hdr_t* req, const hio_bch_t* secret) +{ + hio_md5_t md5; + + /* this assumes that req->authentcator at this point + * is filled with zeros. so make sure that it contains zeros + * before you call this function */ + + hio_md5_initialize (&md5); + hio_md5_update (&md5, req, hio_ntoh16(req->length)); + if (*secret) hio_md5_update (&md5, secret, hio_count_bcstr(secret)); + hio_md5_digest (&md5, req->authenticator, HIO_SIZEOF(req->authenticator)); + + return 0; +} + +int hio_rad_verify_request (hio_rad_hdr_t* req, const hio_bch_t* secret) +{ + hio_md5_t md5; + hio_uint8_t orgauth[HIO_RAD_MAX_AUTHENTICATOR_LEN]; + int ret; + + HIO_MEMCPY (orgauth, req->authenticator, HIO_SIZEOF(req->authenticator)); + HIO_MEMSET (req->authenticator, 0, HIO_SIZEOF(req->authenticator)); + + hio_md5_initialize (&md5); + hio_md5_update (&md5, req, hio_ntoh16(req->length)); + if (*secret) hio_md5_update (&md5, secret, hio_count_bcstr(secret)); + hio_md5_digest (&md5, req->authenticator, HIO_SIZEOF(req->authenticator)); + + ret = (HIO_MEMCMP (req->authenticator, orgauth, HIO_SIZEOF(req->authenticator)) == 0)? 1: 0; + HIO_MEMCPY (req->authenticator, orgauth, HIO_SIZEOF(req->authenticator)); + + return ret; +} + +int hio_rad_verify_response (hio_rad_hdr_t* res, const hio_rad_hdr_t* req, const hio_bch_t* secret) +{ + hio_md5_t md5; + + hio_uint8_t calculated[HIO_RAD_MAX_AUTHENTICATOR_LEN]; + hio_uint8_t reply[HIO_RAD_MAX_AUTHENTICATOR_LEN]; + + /*HIO_ASSERT (HIO_SIZEOF(req->authenticator) == HIO_RAD_MAX_AUTHENTICATOR_LEN); + HIO_ASSERT (HIO_SIZEOF(res->authenticator) == HIO_RAD_MAX_AUTHENTICATOR_LEN);*/ + + /* + * We could dispense with the HIO_MEMCPY, and do MD5's of the packet + * + authenticator piece by piece. This is easier understand, + * and maybe faster. + */ + HIO_MEMCPY(reply, res->authenticator, HIO_SIZEOF(res->authenticator)); /* save the reply */ + HIO_MEMCPY(res->authenticator, req->authenticator, HIO_SIZEOF(req->authenticator)); /* sent authenticator */ + + /* MD5(response packet header + authenticator + response packet data + secret) */ + hio_md5_initialize (&md5); + hio_md5_update (&md5, res, hio_ntoh16(res->length)); + + /* + * This next bit is necessary because of a bug in the original Livingston + * RADIUS server. The authentication authenticator is *supposed* to be + * MD5'd with the old password (as the secret) for password changes. + * However, the old password isn't used. The "authentication" authenticator + * for the server reply packet is simply the MD5 of the reply packet. + * Odd, the code is 99% there, but the old password is never copied + * to the secret! + */ + if (*secret) hio_md5_update (&md5, secret, hio_count_bcstr(secret)); + hio_md5_digest (&md5, calculated, HIO_SIZEOF(calculated)); + + /* Did he use the same random authenticator + shared secret? */ + return (HIO_MEMCMP(calculated, reply, HIO_SIZEOF(reply)) != 0)? 0: 1; +} diff --git a/hio/lib/sck.c b/hio/lib/sck.c index c875e64..03066aa 100644 --- a/hio/lib/sck.c +++ b/hio/lib/sck.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/skad.c b/hio/lib/skad.c index 2690f83..42adeb2 100644 --- a/hio/lib/skad.c +++ b/hio/lib/skad.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys-ass.c b/hio/lib/sys-ass.c index ca3d48e..14107bc 100644 --- a/hio/lib/sys-ass.c +++ b/hio/lib/sys-ass.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys-err.c b/hio/lib/sys-err.c index ff6bdcf..ff8b10f 100644 --- a/hio/lib/sys-err.c +++ b/hio/lib/sys-err.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys-log.c b/hio/lib/sys-log.c index 53663a6..4bceb03 100644 --- a/hio/lib/sys-log.c +++ b/hio/lib/sys-log.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys-mux.c b/hio/lib/sys-mux.c index e83a1aa..ea78f87 100644 --- a/hio/lib/sys-mux.c +++ b/hio/lib/sys-mux.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys-prv.h b/hio/lib/sys-prv.h index dc69487..bfeaba9 100644 --- a/hio/lib/sys-prv.h +++ b/hio/lib/sys-prv.h @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys-tim.c b/hio/lib/sys-tim.c index 91c04c1..6b73352 100644 --- a/hio/lib/sys-tim.c +++ b/hio/lib/sys-tim.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/sys.c b/hio/lib/sys.c index 3e3ff7c..4d781a4 100644 --- a/hio/lib/sys.c +++ b/hio/lib/sys.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/thr.c b/hio/lib/thr.c index 4c79513..3105355 100644 --- a/hio/lib/thr.c +++ b/hio/lib/thr.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/tmr.c b/hio/lib/tmr.c index f7a77cc..3ce8daf 100644 --- a/hio/lib/tmr.c +++ b/hio/lib/tmr.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/utf8.c b/hio/lib/utf8.c index 191a155..2d21ec5 100644 --- a/hio/lib/utf8.c +++ b/hio/lib/utf8.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/utl-siph.c b/hio/lib/utl-siph.c index ab7296f..da7845f 100644 --- a/hio/lib/utl-siph.c +++ b/hio/lib/utl-siph.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/utl-str.c b/hio/lib/utl-str.c index 59daffa..70d6d44 100644 --- a/hio/lib/utl-str.c +++ b/hio/lib/utl-str.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/hio/lib/utl.c b/hio/lib/utl.c index d6310fb..0dfc7bb 100644 --- a/hio/lib/utl.c +++ b/hio/lib/utl.c @@ -1,6 +1,4 @@ /* - * $Id$ - * Copyright (c) 2016-2020 Chung, Hyung-Hwan. All rights reserved. Redistribution and use in source and binary forms, with or without