Patch from Masao Nishiku to implement PEAP version 0. It works
authoraland <aland>
Tue, 14 Oct 2003 15:20:38 +0000 (15:20 +0000)
committeraland <aland>
Tue, 14 Oct 2003 15:20:38 +0000 (15:20 +0000)
with clients Windows XP SP1, and Windows 2000 SP4.

It also needs 'include_length = no' in radiusd.conf's tls section,
but the TLS module can be updated later to automatically do that
for PEAP.

The module has minor changes from the one posted by Masao Nishiku.

src/modules/rlm_eap/types/rlm_eap_peap/Makefile.in [new file with mode: 0644]
src/modules/rlm_eap/types/rlm_eap_peap/config.h.in [new file with mode: 0644]
src/modules/rlm_eap/types/rlm_eap_peap/configure [new file with mode: 0755]
src/modules/rlm_eap/types/rlm_eap_peap/configure.in [new file with mode: 0644]
src/modules/rlm_eap/types/rlm_eap_peap/eap_peap.h [new file with mode: 0644]
src/modules/rlm_eap/types/rlm_eap_peap/peap.c [new file with mode: 0644]
src/modules/rlm_eap/types/rlm_eap_peap/rlm_eap_peap.c [new file with mode: 0644]

diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/Makefile.in b/src/modules/rlm_eap/types/rlm_eap_peap/Makefile.in
new file mode 100644 (file)
index 0000000..902b92f
--- /dev/null
@@ -0,0 +1,13 @@
+TARGET      = @targetname@
+SRCS        = rlm_eap_peap.c peap.c
+RLM_CFLAGS  = $(INCLTDL) -I../.. @eap_peap_cflags@ -I../rlm_eap_tls -DOPENSSL_NO_KRB5
+HEADERS     = ../rlm_eap_tls/rlm_eap_tls.h eap_peap.h ../../eap.h ../../rlm_eap.h
+RLM_INSTALL = 
+RLM_LIBS    += @eap_peap_ldflags@
+
+$(STATIC_OBJS): $(HEADERS)
+
+$(DYNAMIC_OBJS): $(HEADERS)
+
+RLM_DIR=../../
+include ${RLM_DIR}../rules.mak
diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/config.h.in b/src/modules/rlm_eap/types/rlm_eap_peap/config.h.in
new file mode 100644 (file)
index 0000000..e0e52a5
--- /dev/null
@@ -0,0 +1,7 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if you have the <openssl/engine.h> header file.  */
+#undef HAVE_OPENSSL_ENGINE_H
+
+/* Define if you have the <openssl/err.h> header file.  */
+#undef HAVE_OPENSSL_ERR_H
diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/configure b/src/modules/rlm_eap/types/rlm_eap_peap/configure
new file mode 100755 (executable)
index 0000000..bde4794
--- /dev/null
@@ -0,0 +1,1679 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --with-rlm-eap-peap-lib-dir=DIR   Directory for EAPPEAP library files []"
+ac_help="$ac_help
+ --with-rlm-eap-peap-include-dir=DIR Directory for EAPPEAP include files []"
+ac_help="$ac_help
+  --with-openssl-includes=DIR       Directory to look for OpenSSL include files"
+ac_help="$ac_help
+  --with-openssl-libraries=DIR      Directory to look for OpenSSL library files"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=rlm_eap_peap.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+# From configure.in Revision: 1.3 
+
+
+fail=
+SMART_LIBS=
+SMART_CLFAGS=
+if test x$with_rlm_eap_peap != xno; then
+
+       # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:544: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:574: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:625: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:657: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 668 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:673: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:699: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:704: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:713: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:732: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+
+               rlm_eap_peap_lib_dir=
+       # Check whether --with-rlm-eap-peap-lib-dir or --without-rlm-eap-peap-lib-dir was given.
+if test "${with_rlm_eap_peap_lib_dir+set}" = set; then
+  withval="$with_rlm_eap_peap_lib_dir"
+   case "$withval" in
+           no)
+               { echo "configure: error: Need rlm-eap-peap-lib-dir" 1>&2; exit 1; }
+               ;;
+           yes)
+               ;;
+           *)
+               rlm_eap_peap_lib_dir="$withval"
+               ;;
+         esac 
+       
+fi
+
+
+               rlm_eap_peap_inc_dir=
+       # Check whether --with-rlm-eap-peap-include-dir or --without-rlm-eap-peap-include-dir was given.
+if test "${with_rlm_eap_peap_include_dir+set}" = set; then
+  withval="$with_rlm_eap_peap_include_dir"
+   case "$withval" in
+           no)
+               { echo "configure: error: Need rlm-eap-peap-include-dir" 1>&2; exit 1; }
+               ;;
+           yes)
+               ;;
+           *)
+               rlm_eap_peap_inc_dir="$withval"
+               ;;
+         esac 
+       
+fi
+
+
+                               # Check whether --with-openssl-includes or --without-openssl-includes was given.
+if test "${with_openssl_includes+set}" = set; then
+  withval="$with_openssl_includes"
+   case "$withval" in
+           *)
+               rlm_eap_peap_inc_dir="$rlm_eap_peap_inc_dir $withval"
+               SMART_CFLAGS="$SMART_CFLAGS -I$withval"
+               ;;
+         esac 
+       
+fi
+
+
+                               # Check whether --with-openssl-libraries or --without-openssl-libraries was given.
+if test "${with_openssl_libraries+set}" = set; then
+  withval="$with_openssl_libraries"
+   case "$withval" in
+           *)
+               rlm_eap_peap_lib_dir="$rlm_eap_peap_lib_dir $withval"
+               SMART_LIBS="$SMART_LIBS -L$withval"
+               ;;
+         esac 
+       
+fi
+
+
+       smart_try_dir=$rlm_eap_peap_inc_dir
+       
+
+ac_safe=`echo "openssl/ssl.h" | sed 'y%./+-%__pm%'`
+echo $ac_n "checking for openssl/ssl.h""... $ac_c" 1>&6
+echo "configure:831: checking for openssl/ssl.h" >&5
+
+smart_include=
+smart_include_dir=
+
+  old_CFLAGS="$CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 838 "configure"
+#include "confdefs.h"
+
+                 #include <openssl/ssl.h>
+int main() {
+ int a = 1;
+; return 0; }
+EOF
+if { (eval echo configure:846: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  smart_include=" "
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  smart_include=
+fi
+rm -f conftest*
+
+  if test "x$smart_include" = "x"; then
+    
+
+if test "x$LOCATE" != "x"; then
+        DIRS=
+  file=openssl/ssl.h
+
+  for x in `${LOCATE} $file 2>/dev/null`; do
+                                        base=`echo $x | sed "s%/${file}%%"`
+    if test "x$x" = "x$base"; then
+      continue;
+    fi
+
+    dir=`${DIRNAME} $x 2>/dev/null`
+                exclude=`echo ${dir} | ${GREP} /home`
+    if test "x$exclude" != "x"; then
+      continue
+    fi
+
+                    already=`echo \$smart_include_dir ${DIRS} | ${GREP} ${dir}`
+    if test "x$already" = "x"; then
+      DIRS="$DIRS $dir"
+    fi
+  done
+fi
+
+eval "smart_include_dir=\"\$smart_include_dir $DIRS\""
+
+
+    for try in $smart_try_dir $smart_include_dir /usr/local/include/ /opt/include; do
+      CFLAGS="$old_CFLAGS -I$try"
+
+      cat > conftest.$ac_ext <<EOF
+#line 890 "configure"
+#include "confdefs.h"
+
+                      #include <openssl/ssl.h>
+int main() {
+ int a = 1;
+; return 0; }
+EOF
+if { (eval echo configure:898: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  smart_include="-I$try"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  smart_include=
+fi
+rm -f conftest*
+
+      if test "x$smart_include" != "x"; then
+        break;
+      fi
+    done
+    CFLAGS="$old_CFLAGS"
+  fi
+
+        if test "x$smart_include" != "x"; then
+    echo "$ac_t""yes" 1>&6
+    eval "ac_cv_header_$ac_safe=yes"
+    CFLAGS="$old_CFLAGS $smart_include"
+    SMART_CFLAGS="$SMART_CFLAGS $smart_include"
+  else
+    echo "$ac_t""no" 1>&6 
+fi
+
+       if test "x$ac_cv_header_openssl_ssl_h" != "xyes"; then
+               fail="$fail (openssl/ssl.h)"
+       fi
+
+       smart_try_dir=$rlm_eap_peap_lib_dir
+       
+
+sm_lib_safe=`echo "crypto" | sed 'y%./+-%__p_%'`
+sm_func_safe=`echo "DH_new" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for DH_new in -lcrypto""... $ac_c" 1>&6
+echo "configure:935: checking for DH_new in -lcrypto" >&5
+
+smart_lib=
+smart_lib_dir=
+
+  old_LIBS="$LIBS"
+  LIBS="$LIBS -lcrypto"
+  cat > conftest.$ac_ext <<EOF
+#line 943 "configure"
+#include "confdefs.h"
+extern char DH_new();
+int main() {
+ DH_new()
+; return 0; }
+EOF
+if { (eval echo configure:950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  smart_lib="-lcrypto"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+
+  if test "x$smart_lib" = "x"; then
+    
+
+if test "x$LOCATE" != "x"; then
+        DIRS=
+  file=libcrypto${libltdl_cv_shlibext}
+
+  for x in `${LOCATE} $file 2>/dev/null`; do
+                                        base=`echo $x | sed "s%/${file}%%"`
+    if test "x$x" = "x$base"; then
+      continue;
+    fi
+
+    dir=`${DIRNAME} $x 2>/dev/null`
+                exclude=`echo ${dir} | ${GREP} /home`
+    if test "x$exclude" != "x"; then
+      continue
+    fi
+
+                    already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+    if test "x$already" = "x"; then
+      DIRS="$DIRS $dir"
+    fi
+  done
+fi
+
+eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+
+    
+
+if test "x$LOCATE" != "x"; then
+        DIRS=
+  file=libcrypto.a
+
+  for x in `${LOCATE} $file 2>/dev/null`; do
+                                        base=`echo $x | sed "s%/${file}%%"`
+    if test "x$x" = "x$base"; then
+      continue;
+    fi
+
+    dir=`${DIRNAME} $x 2>/dev/null`
+                exclude=`echo ${dir} | ${GREP} /home`
+    if test "x$exclude" != "x"; then
+      continue
+    fi
+
+                    already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+    if test "x$already" = "x"; then
+      DIRS="$DIRS $dir"
+    fi
+  done
+fi
+
+eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+
+
+    for try in $smart_try_dir $smart_lib_dir /usr/local/lib/ /opt/lib; do
+      LIBS="$old_LIBS -L$try -lcrypto"
+
+      cat > conftest.$ac_ext <<EOF
+#line 1019 "configure"
+#include "confdefs.h"
+extern char DH_new();
+int main() {
+ DH_new()
+; return 0; }
+EOF
+if { (eval echo configure:1026: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  smart_lib="-L$try -lcrypto"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+      if test "x$smart_lib" != "x"; then
+        break;
+      fi
+    done
+    LIBS="$old_LIBS"
+  fi
+
+        if test "x$smart_lib" != "x"; then
+    echo "$ac_t""yes" 1>&6
+    eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
+    LIBS="$old_LIBS $smart_lib"
+    SMART_LIBS="$SMART_LIBS $smart_lib"
+  else
+    echo "$ac_t""no" 1>&6 
+fi
+
+    if test "x$ac_cv_lib_crypto_DH_new" != "xyes"; then
+           fail="$fail libcrypto"
+    fi
+
+       
+
+sm_lib_safe=`echo "ssl" | sed 'y%./+-%__p_%'`
+sm_func_safe=`echo "SSL_new" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for SSL_new in -lssl""... $ac_c" 1>&6
+echo "configure:1059: checking for SSL_new in -lssl" >&5
+
+smart_lib=
+smart_lib_dir=
+
+  old_LIBS="$LIBS"
+  LIBS="$LIBS -lssl"
+  cat > conftest.$ac_ext <<EOF
+#line 1067 "configure"
+#include "confdefs.h"
+extern char SSL_new();
+int main() {
+ SSL_new()
+; return 0; }
+EOF
+if { (eval echo configure:1074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  smart_lib="-lssl"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+
+  if test "x$smart_lib" = "x"; then
+    
+
+if test "x$LOCATE" != "x"; then
+        DIRS=
+  file=libssl${libltdl_cv_shlibext}
+
+  for x in `${LOCATE} $file 2>/dev/null`; do
+                                        base=`echo $x | sed "s%/${file}%%"`
+    if test "x$x" = "x$base"; then
+      continue;
+    fi
+
+    dir=`${DIRNAME} $x 2>/dev/null`
+                exclude=`echo ${dir} | ${GREP} /home`
+    if test "x$exclude" != "x"; then
+      continue
+    fi
+
+                    already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+    if test "x$already" = "x"; then
+      DIRS="$DIRS $dir"
+    fi
+  done
+fi
+
+eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+
+    
+
+if test "x$LOCATE" != "x"; then
+        DIRS=
+  file=libssl.a
+
+  for x in `${LOCATE} $file 2>/dev/null`; do
+                                        base=`echo $x | sed "s%/${file}%%"`
+    if test "x$x" = "x$base"; then
+      continue;
+    fi
+
+    dir=`${DIRNAME} $x 2>/dev/null`
+                exclude=`echo ${dir} | ${GREP} /home`
+    if test "x$exclude" != "x"; then
+      continue
+    fi
+
+                    already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+    if test "x$already" = "x"; then
+      DIRS="$DIRS $dir"
+    fi
+  done
+fi
+
+eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+
+
+    for try in $smart_try_dir $smart_lib_dir /usr/local/lib/ /opt/lib; do
+      LIBS="$old_LIBS -L$try -lssl"
+
+      cat > conftest.$ac_ext <<EOF
+#line 1143 "configure"
+#include "confdefs.h"
+extern char SSL_new();
+int main() {
+ SSL_new()
+; return 0; }
+EOF
+if { (eval echo configure:1150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  smart_lib="-L$try -lssl"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+      if test "x$smart_lib" != "x"; then
+        break;
+      fi
+    done
+    LIBS="$old_LIBS"
+  fi
+
+        if test "x$smart_lib" != "x"; then
+    echo "$ac_t""yes" 1>&6
+    eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
+    LIBS="$old_LIBS $smart_lib"
+    SMART_LIBS="$SMART_LIBS $smart_lib"
+  else
+    echo "$ac_t""no" 1>&6 
+fi
+
+    if test "x$ac_cv_lib_ssl_SSL_new" != "xyes"; then
+           fail="$fail libssl"
+    fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1179: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1194 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1200: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1211 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1217: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1228 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+for ac_hdr in \
+       openssl/err.h \
+       openssl/engine.h
+       
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1265: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1270 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1275: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+       targetname=rlm_eap_peap
+else
+       targetname=
+       echo \*\*\* module rlm_eap_peap is disabled.
+fi
+
+if test x"$fail" != x""; then
+       if test x"${enable_strict_dependencies}" = x"yes"; then
+               { echo "configure: error: set --without-rlm_eap_peap to disable it explicitly." 1>&2; exit 1; }
+       else
+               echo "configure: warning: silently not building rlm_eap_peap." 1>&2
+               echo "configure: warning: FAILURE: rlm_eap_peap requires: $fail." 1>&2
+               if test x"$headersuggestion" != x; then
+                       echo "configure: warning: $headersuggestion" 1>&2 
+               fi
+               if test x"$libsuggestion" != x; then
+                       echo "configure: warning: $libsuggestion" 1>&2 
+               fi
+               targetname=""
+       fi
+fi
+
+eap_peap_ldflags=$SMART_LIBS
+eap_peap_cflags=$SMART_CFLAGS
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@eap_peap_ldflags@%$eap_peap_ldflags%g
+s%@eap_peap_cflags@%$eap_peap_cflags%g
+s%@targetname@%$targetname%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/configure.in b/src/modules/rlm_eap/types/rlm_eap_peap/configure.in
new file mode 100644 (file)
index 0000000..f9fb72f
--- /dev/null
@@ -0,0 +1,120 @@
+AC_INIT(rlm_eap_peap.c)
+AC_REVISION($Revision$)
+AC_DEFUN(modname,[rlm_eap_peap])
+
+fail=
+SMART_LIBS=
+SMART_CLFAGS=
+if test x$with_[]modname != xno; then
+
+       AC_PROG_CC
+
+       dnl extra argument: --with-rlm-eap-peap-lib-dir
+       rlm_eap_peap_lib_dir=
+       AC_ARG_WITH(rlm-eap-peap-lib-dir,
+       [  --with-rlm-eap-peap-lib-dir=DIR   Directory for EAPPEAP library files []],
+       [ case "$withval" in
+           no)
+               AC_MSG_ERROR(Need rlm-eap-peap-lib-dir)
+               ;;
+           yes)
+               ;;
+           *)
+               rlm_eap_peap_lib_dir="$withval"
+               ;;
+         esac ]
+       )
+
+       dnl extra argument: --with-rlm-eap-peap-include-dir
+       rlm_eap_peap_inc_dir=
+       AC_ARG_WITH(rlm-eap-peap-include-dir,
+       [ --with-rlm-eap-peap-include-dir=DIR Directory for EAPPEAP include files []],
+       [ case "$withval" in
+           no)
+               AC_MSG_ERROR(Need rlm-eap-peap-include-dir)
+               ;;
+           yes)
+               ;;
+           *)
+               rlm_eap_peap_inc_dir="$withval"
+               ;;
+         esac ]
+       )
+
+       dnl #
+       dnl # extra argument: --openssl-includes=dir
+       dnl #
+       AC_ARG_WITH(openssl-includes,
+       [  --with-openssl-includes=DIR       Directory to look for OpenSSL include files],
+       [ case "$withval" in
+           *)
+               rlm_eap_peap_inc_dir="$rlm_eap_peap_inc_dir $withval"
+               SMART_CFLAGS="$SMART_CFLAGS -I$withval"
+               ;;
+         esac ]
+       )
+
+       dnl #
+       dnl # extra argument: --openssl-libraries=dir
+       dnl #
+       AC_ARG_WITH(openssl-libraries,
+       [  --with-openssl-libraries=DIR      Directory to look for OpenSSL library files],
+       [ case "$withval" in
+           *)
+               rlm_eap_peap_lib_dir="$rlm_eap_peap_lib_dir $withval"
+               SMART_LIBS="$SMART_LIBS -L$withval"
+               ;;
+         esac ]
+       )
+
+       smart_try_dir=$rlm_eap_peap_inc_dir
+       AC_SMART_CHECK_INCLUDE(openssl/ssl.h)
+       if test "x$ac_cv_header_openssl_ssl_h" != "xyes"; then
+               fail="$fail (openssl/ssl.h)"
+       fi
+
+       smart_try_dir=$rlm_eap_peap_lib_dir
+       AC_SMART_CHECK_LIB(crypto, DH_new)
+    if test "x$ac_cv_lib_crypto_DH_new" != "xyes"; then
+           fail="$fail libcrypto"
+    fi
+
+       AC_SMART_CHECK_LIB(ssl, SSL_new)
+    if test "x$ac_cv_lib_ssl_SSL_new" != "xyes"; then
+           fail="$fail libssl"
+    fi
+
+AC_CHECK_HEADERS( \
+       openssl/err.h \
+       openssl/engine.h
+       )
+
+       targetname=modname
+else
+       targetname=
+       echo \*\*\* module modname is disabled.
+fi
+
+if test x"$fail" != x""; then
+       if test x"${enable_strict_dependencies}" = x"yes"; then
+               AC_MSG_ERROR([set --without-]modname[ to disable it explicitly.])
+       else
+               AC_MSG_WARN([silently not building ]modname[.])
+               AC_MSG_WARN([FAILURE: ]modname[ requires: $fail.])
+               if test x"$headersuggestion" != x; then
+                       AC_MSG_WARN([$headersuggestion]) 
+               fi
+               if test x"$libsuggestion" != x; then
+                       AC_MSG_WARN([$libsuggestion]) 
+               fi
+               targetname=""
+       fi
+fi
+
+eap_peap_ldflags=$SMART_LIBS
+eap_peap_cflags=$SMART_CFLAGS
+AC_SUBST(eap_peap_ldflags)
+AC_SUBST(eap_peap_cflags)
+AC_SUBST(targetname)
+AC_CONFIG_HEADER([config.h])
+AC_OUTPUT(Makefile)
diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/eap_peap.h b/src/modules/rlm_eap/types/rlm_eap_peap/eap_peap.h
new file mode 100644 (file)
index 0000000..6485a83
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * eap_peap.h 
+ *
+ * Version:     $Id$
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Copyright 2003 Alan DeKok <aland@freeradius.org>
+ */
+#ifndef _EAP_PEAP_H
+#define _EAP_PEAP_H
+
+#include "rlm_eap.h"
+#include "rlm_eap_tls.h"
+
+typedef struct peap_tunnel_t {
+       VALUE_PAIR      *username;
+       VALUE_PAIR      *state;
+       int             status;
+       int             default_eap_type;
+} peap_tunnel_t;
+
+#define PEAP_STATUS_START_PART2 0
+#define PEAP_STATUS_SENT_TLV_SUCCESS 1
+#define PEAP_STATUS_SENT_TLV_FAILURE 2
+
+#define EAP_TLV_SUCCESS (1)
+#define EAP_TLV_FAILURE (2)
+#define EAP_TLV_ACK_RESULT (3)
+
+#define PW_EAP_TLV 33
+
+/*
+ *     Process the PEAP portion of an EAP-PEAP request.
+ */
+int eappeap_process(EAP_HANDLER *handler, tls_session_t *tls_session);
+#endif /* _EAP_PEAP_H */
diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/peap.c b/src/modules/rlm_eap/types/rlm_eap_peap/peap.c
new file mode 100644 (file)
index 0000000..de4a579
--- /dev/null
@@ -0,0 +1,518 @@
+/*
+ * peap.c  contains the interfaces that are called from eap
+ *
+ * Version:     $Id$
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *   Copyright 2003 Alan DeKok <aland@freeradius.org>
+ */
+#include "eap_tls.h"
+#include "eap_peap.h"
+
+/*
+ *     Send protected EAP-Failure
+ *
+ *       Result-TLV = Failure
+ */
+static int eappeap_failure(EAP_HANDLER *handler, tls_session_t *tls_session)
+{
+       uint8_t tlv_packet[11];
+
+       DEBUG2("  rlm_eap_peap: FAILURE");
+
+       tlv_packet[0] = PW_EAP_REQUEST;
+       tlv_packet[1] = handler->eap_ds->response->id +1;
+       tlv_packet[2] = 0;
+       tlv_packet[3] = 11;     /* length of this packet */
+       tlv_packet[4] = PW_EAP_TLV;
+       tlv_packet[5] = 0x80;
+       tlv_packet[6] = EAP_TLV_ACK_RESULT;
+       tlv_packet[7] = 0;
+       tlv_packet[8] = 2;      /* length of the data portion */
+       tlv_packet[9] = 0;
+       tlv_packet[10] = EAP_TLV_FAILURE;
+
+       record_plus(&tls_session->clean_in, tlv_packet, 11);
+
+       /*
+        *      FIXME: Check the return code.
+        */
+       tls_handshake_send(tls_session);
+       record_init(&tls_session->clean_in);
+
+       return 1;
+}
+
+
+/*
+ *     Send protected EAP-Success
+ *
+ *       Result-TLV = Success
+ */
+static int eappeap_success(EAP_HANDLER *handler, tls_session_t *tls_session)
+{
+       uint8_t tlv_packet[11];
+
+       DEBUG2("  rlm_eap_peap: SUCCESS");
+
+       tlv_packet[0] = PW_EAP_REQUEST;
+       tlv_packet[1] = handler->eap_ds->response->id +1;
+       tlv_packet[2] = 0;
+       tlv_packet[3] = 11;     /* length of this packet */
+       tlv_packet[4] = PW_EAP_TLV;
+       tlv_packet[5] = 0x80;   /* mandatory AVP */
+       tlv_packet[6] = EAP_TLV_ACK_RESULT;
+       tlv_packet[7] = 0;
+       tlv_packet[8] = 2;      /* length of the data portion */
+       tlv_packet[9] = 0;
+       tlv_packet[10] = EAP_TLV_SUCCESS;
+
+       record_plus(&tls_session->clean_in, tlv_packet, 11);
+
+       /*
+        *      FIXME: Check the return code.
+        */
+       tls_handshake_send(tls_session);
+       record_init(&tls_session->clean_in);
+
+       return 1;
+}
+
+
+/*
+ *     Verify the tunneled EAP message.
+ */
+static int eapmessage_verify(const uint8_t *data, unsigned int data_len)
+{
+       const eap_packet_t *eap_packet = (const eap_packet_t *) data;
+       uint8_t eap_type;
+       char identity[256];
+
+       if (!data || (data_len <= 1)) {
+               return 0;
+       }
+
+       eap_type = *data;
+       switch (eap_type) {
+       case PW_EAP_IDENTITY:
+               memcpy(identity, data + 1, data_len - 1);
+               identity[data_len - 1] = '\0';
+               DEBUG2("  rlm_eap_peap: Identity - %s", identity);
+               return 1;
+               break;
+               
+               /*
+                *      If the first byte of the packet is
+                *      EAP-Response, and the EAP data is a TLV,
+                *      then it looks OK...
+                */
+       case PW_EAP_RESPONSE:
+               if (eap_packet->data[0] == PW_EAP_TLV) {
+                       DEBUG2("  rlm_eap_peap: Received EAP-TLV response.");
+                       return 1;
+               }
+               DEBUG2("  rlm_eap_peap: Got something weird.");
+               break;
+
+
+               /*
+                *      We normally do Microsoft MS-CHAPv2 (26), versus
+                *      Cisco MS-CHAPv2 (29).
+                */
+       case PW_EAP_MSCHAPV2:
+       default:
+               DEBUG2("  rlm_eap_peap: EAP type %d", eap_type);
+               return 1;
+               break;
+       }
+
+       return 0;
+}
+
+/*
+ *     Convert a pseudo-EAP packet to a list of VALUE_PAIR's.
+ */
+static VALUE_PAIR *eap2vp(EAP_DS *eap_ds,
+                         const uint8_t *data, unsigned int data_len)
+{
+       VALUE_PAIR *vp = NULL;
+
+       /*
+        *      Sanity check this...
+        */
+       if (data_len + EAP_HEADER_LEN > MAX_STRING_LEN) {
+               radlog(L_ERR, "rlm_eap_peap: EAP Response packet is too large.  Code must be fixed to handle this.");
+               return NULL;
+       }
+
+       vp = paircreate(PW_EAP_MESSAGE, PW_TYPE_OCTETS);
+       if (!vp) {
+               DEBUG2("  rlm_eap_peap: Failure in creating VP");
+               return NULL;
+       }
+
+       /*
+        *      Hand-build an EAP packet from the crap in PEAP version 0.
+        */
+       vp->strvalue[0] = PW_EAP_RESPONSE;
+       vp->strvalue[1] = eap_ds->response->id;
+       vp->strvalue[2] = 0;
+       vp->strvalue[3] = EAP_HEADER_LEN + data_len;
+
+       memcpy(vp->strvalue + EAP_HEADER_LEN, data, data_len);
+       vp->length = EAP_HEADER_LEN + data_len;
+
+       return vp;
+}
+
+
+/*
+ *     Convert a list of VALUE_PAIR's to an EAP packet, through the
+ *     simple expedient of dumping the EAP message
+ */
+static int vp2eap(tls_session_t *tls_session, VALUE_PAIR *vp)
+{
+       if (vp->next != NULL) {
+               radlog(L_ERR, "rlm_eap_peap: EAP Request packet is too large.  Code must be fixed to handle this.");
+               return 0;
+       }
+
+       /*
+        *      Skip the id, code, and length.  Just write the EAP
+        *      type & data to the client.
+        */
+#ifndef NDEBUG
+       if (debug_flag > 2) {
+               int i;
+               int total = vp->length - 4;
+               
+               if (debug_flag > 0) for (i = 0; i < total; i++) {
+                       if ((i & 0x0f) == 0) printf("  PEAP tunnel data out %04x: ", i);
+                       
+                       printf("%02x ", vp->strvalue[i + 4]);
+                       
+                       if ((i & 0x0f) == 0x0f) printf("\n");
+               }
+               if ((total & 0x0f) != 0) printf("\n");
+       }
+#endif
+
+       /*
+        *      Send the EAP data, WITHOUT the header.
+        */
+#if 1
+       record_plus(&tls_session->clean_in, vp->strvalue + EAP_HEADER_LEN,
+               vp->length - EAP_HEADER_LEN);
+#else
+       record_plus(&tls_session->clean_in, vp->strvalue, vp->length);
+#endif
+       tls_handshake_send(tls_session);
+       record_init(&tls_session->clean_in);
+
+       return 1;
+}
+
+
+/*
+ *     See if there's a TLV in the response.
+ */
+static int eappeap_check_tlv(const uint8_t *data)
+{
+       const eap_packet_t *eap_packet = (const eap_packet_t *) data;
+
+       if ((eap_packet->code == PW_EAP_RESPONSE) &&
+           (eap_packet->data[0] == PW_EAP_TLV) &&
+           (data[10] == EAP_TLV_SUCCESS)) {
+               return 1;
+       }
+
+       return 0;
+}
+
+/*
+ *     Process the pseudo-EAP contents of the tunneled data.
+ */
+int eappeap_process(EAP_HANDLER *handler, tls_session_t *tls_session)
+{
+       int err;
+       peap_tunnel_t *t = tls_session->opaque;
+       REQUEST *fake;
+       VALUE_PAIR *vp;
+       int rcode = RLM_MODULE_REJECT;
+       const uint8_t *data;
+       unsigned int data_len;
+       unsigned char buffer[1024];
+#ifndef NDEBUG
+       int i;
+#endif
+
+       REQUEST *request = handler->request;
+       EAP_DS *eap_ds = handler->eap_ds;
+
+       /*
+        *      Grab the dirty data, and copy it to our buffer.
+        *
+        *      I *really* don't like these 'record_t' things...
+        */
+       data_len = record_minus(&tls_session->dirty_in, buffer, sizeof(buffer));
+       data = buffer;
+
+       /*
+        *      Write the data from the dirty buffer (i.e. packet
+        *      data) into the buffer which we will give to SSL for
+        *      decoding.
+        *
+        *      Some of this code COULD technically go into the TLS
+        *      module, in eaptls_process(), where it returns EAPTLS_OK.
+        *
+        *      Similarly, the writing of data to the SSL context could
+        *      go there, too...
+        */
+       BIO_write(tls_session->into_ssl, buffer, data_len);
+       record_init(&tls_session->clean_out);
+
+       /*
+        *      Read (and decrypt) the tunneled data from the SSL session,
+        *      and put it into the decrypted data buffer.
+        */
+       err = SSL_read(tls_session->ssl, tls_session->clean_out.data,
+                      sizeof(tls_session->clean_out.data));
+       if (err < 0) {
+               /*
+                *      FIXME: Call SSL_get_error() to see what went
+                *      wrong.
+                */
+               radlog(L_INFO, "rlm_eap_peap: SSL_read Error");
+               return RLM_MODULE_REJECT;
+       }
+
+       /*
+        *      If there's no data, maybe this is an ACK to an
+        *      MS-CHAP2-Success.
+        */     
+       if (err == 0) {
+               /*
+                *      FIXME: Call SSL_get_error() to see what went
+                *      wrong.
+                */
+               radlog(L_INFO, "rlm_eap_peap: No data inside of the tunnel.");
+               return RLM_MODULE_REJECT;
+       }
+       data_len = tls_session->clean_out.used = err;
+       data = tls_session->clean_out.data;
+
+#ifndef NDEBUG
+       if (debug_flag > 2) for (i = 0; i < data_len; i++) {
+               if ((i & 0x0f) == 0) printf("  PEAP tunnel data in %04x: ", i);
+               
+               printf("%02x ", data[i]);
+               
+               if ((i & 0x0f) == 0x0f) printf("\n");
+       }
+       if ((data_len & 0x0f) != 0) printf("\n");
+#endif
+
+       if (!eapmessage_verify(data, data_len)) {
+               return RLM_MODULE_REJECT;
+       }
+
+       DEBUG2("  rlm_eap_peap: Tunneled data is valid.");
+
+       /*
+        *      If we authenticated the user, then it's OK.
+        */
+       if (t->status == PEAP_STATUS_SENT_TLV_SUCCESS) {
+               if (eappeap_check_tlv(data)) {
+                       DEBUG2("  rlm_eap_peap: Success");
+                       return RLM_MODULE_OK;
+               }
+                   
+               return RLM_MODULE_REJECT;
+
+       } else if (t->status == PEAP_STATUS_SENT_TLV_FAILURE) {
+               return RLM_MODULE_REJECT;
+       }
+
+       fake = request_alloc_fake(request);
+
+       rad_assert(fake->packet->vps == NULL);
+
+       fake->packet->vps = eap2vp(eap_ds, data, data_len);
+       if (!fake->packet->vps) {
+               return PW_AUTHENTICATION_REJECT;
+       }
+
+#ifndef NDEBUG
+       if (debug_flag > 0) {
+         printf("  PEAP: Got tunneled EAP-Message\n");
+
+         for (vp = fake->packet->vps; vp != NULL; vp = vp->next) {
+           putchar('\t');vp_print(stdout, vp);putchar('\n');
+         }
+       }
+#endif
+
+       /*
+        *      Tell the request that it's a fake one.
+        */
+       vp = pairmake("Freeradius-Proxied-To", "127.0.0.1", T_OP_EQ);
+       if (vp) {
+               pairadd(&fake->packet->vps, vp);
+       }
+
+       /*
+        *      Update other items in the REQUEST data structure.
+        */
+       if (!t->username) {
+               if ((data[0] == PW_EAP_IDENTITY) && (data_len > 1)) {
+                       t->username = pairmake("User-Name", "", T_OP_EQ);
+                       rad_assert(t->username != NULL);
+                               
+                       memcpy(t->username->strvalue, data+1, data_len - 1);
+                       t->username->length = data_len -1;
+                       t->username->strvalue[t->username->length] = 0;
+                       DEBUG2("  PEAP: Got tunneled identity of %s", t->username->strvalue);
+
+                       /*
+                        *      If there's a default EAP type,
+                        *      set it here.
+                        */
+                       if (t->default_eap_type != 0) {
+                         DEBUG2("  PEAP: Setting default EAP type for tunneled EAP session.");
+                         vp = pairmake("EAP-Type", "0", T_OP_EQ);
+                         vp->lvalue = t->default_eap_type;
+                         pairadd(&fake->config_items, vp);
+                       }
+               }
+       } /* else there WAS a t->username */
+
+       if (t->username) {
+               vp = paircopy(t->username);
+               pairadd(&fake->packet->vps, vp);
+               fake->username = pairfind(fake->packet->vps, PW_USER_NAME);
+       }
+
+       /*
+        *      Add the State attribute, too, if it exists.
+        */
+       if (t->state) {
+               DEBUG2("  PEAP: Adding old state with %02x %02x",
+                      t->state->strvalue[0], t->state->strvalue[1]);
+               vp = paircopy(t->state);
+               if (vp) pairadd(&fake->packet->vps, vp);
+       }
+
+#ifndef NDEBUG
+       if (debug_flag > 0) {
+               printf("  PEAP: Sending tunneled request\n");
+               
+               for (vp = fake->packet->vps; vp != NULL; vp = vp->next) {
+                       putchar('\t');vp_print(stdout, vp);putchar('\n');
+               }
+       }
+#endif
+
+       /*
+        *      Call authentication recursively, which will
+        *      do PAP, CHAP, MS-CHAP, etc.
+        */
+       rad_authenticate(fake);
+
+       /*
+        *      Note that we don't do *anything* with the reply
+        *      attributes.
+        */
+#ifndef NDEBUG
+       if (debug_flag > 0) {
+               printf("  PEAP: Got tunneled reply RADIUS code %d\n",
+                fake->reply->code);
+               
+               for (vp = fake->reply->vps; vp != NULL; vp = vp->next) {
+                       putchar('\t');vp_print(stdout, vp);putchar('\n');
+               }
+       }
+#endif
+
+       switch (fake->reply->code) {
+       case PW_AUTHENTICATION_ACK:
+               DEBUG2("  PEAP: Tunneled authentication was successful.");
+               t->status = PEAP_STATUS_SENT_TLV_SUCCESS;
+               eappeap_success(handler, tls_session);
+               rcode = RLM_MODULE_HANDLED;
+               break;
+
+       case PW_AUTHENTICATION_REJECT:
+               DEBUG2("  PEAP: Tunneled authentication was rejected.");
+               t->status = PEAP_STATUS_SENT_TLV_FAILURE;
+               eappeap_failure(handler, tls_session);
+               rcode = RLM_MODULE_HANDLED;
+               break;
+
+       case PW_ACCESS_CHALLENGE:
+               DEBUG2("  PEAP: Got tunneled Access-Challenge");
+
+               /*
+                *      Keep the State attribute, if necessary.
+                *
+                *      Get rid of the old State, too.
+                */
+               pairfree(&t->state);
+               pairmove2(&t->state, &fake->reply->vps, PW_STATE);
+
+               /*
+                *      We should really be a bit smarter about this,
+                *      and move over only those attributes which
+                *      are relevant to the authentication request,
+                *      but that's a lot more work, and this "dumb"
+                *      method works in 99.9% of the situations.
+                */
+               vp = NULL;
+               pairmove2(&vp, &fake->reply->vps, PW_EAP_MESSAGE);
+
+               /*
+                *      There MUST be a Reply-Message in the challenge,
+                *      which we tunnel back to the client.
+                *
+                *      If there isn't one in the reply VP's, then
+                *      we MUST create one, with an empty string as
+                *      it's value.
+                */
+               pairmove2(&vp, &fake->reply->vps, PW_REPLY_MESSAGE);
+
+               /*
+                *      Handle the ACK, by tunneling any necessary reply
+                *      VP's back to the client.
+                */
+               if (vp) {
+                       vp2eap(tls_session, vp);
+                       pairfree(&vp);
+               }
+               rcode = RLM_MODULE_HANDLED;
+               break;
+
+
+       default:
+               DEBUG2("  PEAP: Unknown RADIUS packet type %d: rejecting tunneled user", fake->reply->code);
+               rcode = RLM_MODULE_REJECT;
+               break;
+       }
+       
+       request_free(&fake);
+       
+       return rcode;
+}
+
diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/rlm_eap_peap.c b/src/modules/rlm_eap/types/rlm_eap_peap/rlm_eap_peap.c
new file mode 100644 (file)
index 0000000..70fc8b3
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * rlm_eap_peap.c  contains the interfaces that are called from eap
+ *
+ * Version:     $Id$
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Copyright 2003 Alan DeKok <aland@freeradius.org>
+ */
+
+#include "autoconf.h"
+#include "eap_tls.h"
+#include "eap_peap.h"
+
+typedef struct rlm_eap_peap_t {
+       /*
+        *      Default tunneled EAP type
+        */
+       char    *default_eap_type_name;
+       int     default_eap_type;
+} rlm_eap_peap_t;
+
+
+static CONF_PARSER module_config[] = {
+       { "default_eap_type", PW_TYPE_STRING_PTR,
+         offsetof(rlm_eap_peap_t, default_eap_type_name), NULL, "mschapv2" },
+
+       { NULL, -1, 0, NULL, NULL }           /* end the list */
+};
+
+/*
+ *     Detach the module.
+ */
+static int eappeap_detach(void *arg)
+{
+       rlm_eap_peap_t *inst = (rlm_eap_peap_t *) arg;
+
+       if (inst->default_eap_type_name) free(inst->default_eap_type_name);
+
+       free(inst);
+
+       return 0;
+}
+
+/*
+ *     Attach the module.
+ */
+static int eappeap_attach(CONF_SECTION *cs, void **instance)
+{
+       rlm_eap_peap_t *inst;
+
+       inst = malloc(sizeof(*inst));
+       if (!inst) {
+               radlog(L_ERR, "rlm_eap_peap: out of memory");
+               return -1;
+       }
+       memset(inst, 0, sizeof(*inst));
+
+       /*
+        *      Parse the configuration attributes.
+        */
+       if (cf_section_parse(cs, inst, module_config) < 0) {
+               eappeap_detach(inst);
+               return -1;
+       }
+
+       /*
+        *      Convert the name to an integer, to make it easier to
+        *      handle.
+        */
+       inst->default_eap_type = eaptype_name2type(inst->default_eap_type_name);
+       if (inst->default_eap_type < 0) {
+               radlog(L_ERR, "rlm_eap_peap: Unknown EAP type %s",
+                      inst->default_eap_type_name);
+               eappeap_detach(inst);
+               return -1;
+       }
+
+       *instance = inst;
+
+       return 0;
+}
+
+/*
+ *     Free the PEAP per-session data
+ */
+static void peap_free(void *p)
+{
+       peap_tunnel_t *t = (peap_tunnel_t *) p;
+
+       if (!t) return;
+
+       pairfree(&t->username);
+       pairfree(&t->state);
+
+       free(t);
+}
+
+
+/*
+ *     Free the PEAP per-session data
+ */
+static peap_tunnel_t *peap_alloc(rlm_eap_peap_t *inst)
+{
+       peap_tunnel_t *t;
+
+       t = rad_malloc(sizeof(*t));
+       memset(t, 0, sizeof(*t));
+
+       t->default_eap_type = inst->default_eap_type;
+
+       return t;
+}
+
+/*
+ *     Do authentication, by letting EAP-TLS do most of the work.
+ */
+static int eappeap_authenticate(void *arg, EAP_HANDLER *handler)
+{
+       int rcode;
+       eaptls_status_t status;
+       rlm_eap_peap_t *inst = (rlm_eap_peap_t *) arg;
+       tls_session_t *tls_session = (tls_session_t *) handler->opaque;
+
+       DEBUG2("  rlm_eap_peap: Authenticate");
+
+       status = eaptls_process(handler);
+       DEBUG2("  eaptls_process returned %d\n", status);
+       switch (status) {
+               /*
+                *      EAP-TLS handshake was successful, tell the
+                *      client to keep talking.
+                *
+                *      If this was EAP-TLS, we would just return
+                *      an EAP-TLS-Success packet here.
+                */
+       case EAPTLS_SUCCESS:
+               {
+                       eap_packet_t eap_packet;
+                       
+                       eap_packet.code = PW_EAP_REQUEST;
+                       eap_packet.id = handler->eap_ds->response->id + 1;
+                       eap_packet.length[0] = 0;
+                       eap_packet.length[1] = EAP_HEADER_LEN + 1;
+                       eap_packet.data[0] = PW_EAP_IDENTITY;
+
+                       record_plus(&tls_session->clean_in,
+                                   &eap_packet, sizeof(eap_packet));
+                       
+                       tls_handshake_send(tls_session);
+                       record_init(&tls_session->clean_in);
+               }
+               eaptls_request(handler->eap_ds, tls_session);
+               DEBUG2("  rlm_eap_peap: EAPTLS_SUCCESS");
+               return 1;
+
+               /*
+                *      The TLS code is still working on the TLS
+                *      exchange, and it's a valid TLS request.
+                *      do nothing.
+                */
+       case EAPTLS_HANDLED:
+               DEBUG2("  rlm_eap_peap: EAPTLS_HANDLED");
+               return 1;
+
+               /*
+                *      Handshake is done, proceed with decoding tunneled
+                *      data.
+                */
+       case EAPTLS_OK:
+               DEBUG2("  rlm_eap_peap: EAPTLS_OK");
+               break;
+
+               /*
+                *      Anything else: fail.
+                */
+       default:
+               DEBUG2("  rlm_eap_peap: EAPTLS_OTHERS");
+               return 0;
+       }
+
+       /*
+        *      Session is established, proceed with decoding
+        *      tunneled data.
+        */
+       DEBUG2("  rlm_eap_peap: Session established.  Proceeding to decode tunneled attributes.");
+
+       /*
+        *      We may need PEAP data associated with the session, so
+        *      allocate it here, if it wasn't already alloacted.
+        */
+       if (!tls_session->opaque) {
+               tls_session->opaque = peap_alloc(inst);
+               tls_session->free_opaque = peap_free;
+       }
+       
+       /*
+        *      Process the PEAP portion of the request.
+        */
+       rcode = eappeap_process(handler, tls_session);
+       switch (rcode) {
+       case RLM_MODULE_REJECT:
+               eaptls_fail(handler->eap_ds, 0);
+               return 0;
+         
+       case RLM_MODULE_HANDLED:
+               eaptls_request(handler->eap_ds, tls_session);
+               return 1;
+
+       case RLM_MODULE_OK:
+               eaptls_success(handler->eap_ds, 0);
+               eaptls_gen_mppe_keys(&handler->request->reply->vps, 
+                                    tls_session->ssl,
+                                    "client EAP encryption");
+               return 1;
+
+       default:
+               break;
+       }
+
+       eaptls_fail(handler->eap_ds, 0);
+       return 0;
+}
+
+/*
+ *     The module name should be the only globally exported symbol.
+ *     That is, everything else should be 'static'.
+ */
+EAP_TYPE rlm_eap_peap = {
+       "eap_peap",
+       eappeap_attach,                 /* attach */
+       /*
+        *      Note! There is NO eappeap_initate() function, as the
+        *      main EAP module takes care of calling
+        *      eaptls_initiate().
+        *
+        *      This is because PEAP is a protocol on top of TLS, so
+        *      before we need to do PEAP, we've got to initiate a TLS
+        *      session.
+        */
+       NULL,                           /* Start the initial request */
+       NULL,                           /* authorization */
+       eappeap_authenticate,           /* authentication */
+       eappeap_detach                  /* detach */
+};