On Sun, Jan 27, 2013 at 06:17:13PM +0000, Stuart Henderson wrote:
> On 2013/01/27 17:33, Stuart Henderson wrote:
> > I will merge this with my port diff to update to 2.0 and send out a diff 
> > soon.
> 
> I haven't tested WPA enterprise, but I have tested wired authentication
> with this version (TP-Link switch / MD5 / freeradius).
> 
> I made a start at enabling the privilege separation code, but haven't
> finished that yet, so the diff is in place but it's still disabled
> for now.
> 
> This diff also enables smartcard support via pcsc-lite - this could
> be made a flavour instead if people prefer to avoid it pulling in an
> LGPL dependency (libusb1) but have kept it simple for now.
> 

Works for me on my lab's wifi which uses TTLS PAP with:

network={
        ssid="whatever"
        key_mgmt=WPA-EAP
        eap=TTLS PEAP
        identity="matthieu"
        password="my_passord"
        phase2="auth=PAP"
}

Thanks to both kettenis and sthen !

> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/security/wpa_supplicant/Makefile,v
> retrieving revision 1.5
> diff -u -p -r1.5 Makefile
> --- Makefile  19 Jan 2012 16:14:11 -0000      1.5
> +++ Makefile  27 Jan 2013 18:13:11 -0000
> @@ -2,7 +2,7 @@
>  
>  COMMENT=     IEEE 802.1X supplicant
>  
> -DISTNAME=    wpa_supplicant-0.7.3
> +DISTNAME=    wpa_supplicant-2.0
>  CATEGORIES=  security net
>  
>  HOMEPAGE=    http://hostap.epitest.fi/wpa_supplicant/
> @@ -15,7 +15,9 @@ PERMIT_PACKAGE_FTP= Yes
>  PERMIT_DISTFILES_CDROM=      Yes
>  PERMIT_DISTFILES_FTP=        Yes
>  
> -WANTLIB += c ssl crypto pcap
> +WANTLIB += c ssl crypto pcap pcsclite pthread
> +
> +LIB_DEPENDS= security/pcsc-lite
>  
>  MASTER_SITES=        http://hostap.epitest.fi/releases/
>  
> @@ -26,15 +28,14 @@ MAKE_FLAGS=       V=1
>  
>  WRKSRC=              ${WRKDIST}/wpa_supplicant
>  
> -MAN5=        wpa_supplicant.conf.5
> -MAN8=        wpa_background.8 wpa_cli.8 wpa_passphrase.8 wpa_supplicant.8
> -
>  EXAMPLEDIR=  ${PREFIX}/share/examples/wpa_supplicant
>  
>  post-extract:
> -     cp ${FILESDIR}/config ${WRKSRC}/.config
> +     @${SUBST_CMD} -c ${FILESDIR}/config ${WRKSRC}/.config
> +     @cp ${FILESDIR}/driver_openbsd.c ${WRKSRC}/../src/drivers/
>  
>  post-install:
> +     @#${INSTALL_PROGRAM} ${WRKBUILD}/wpa_priv ${PREFIX}/sbin
>       ${INSTALL_MAN} ${WRKBUILD}/doc/docbook/*.5 ${PREFIX}/man/man5/
>       ${INSTALL_MAN} ${WRKBUILD}/doc/docbook/*.8 ${PREFIX}/man/man8/
>       ${INSTALL_DATA_DIR} ${EXAMPLEDIR}
> Index: distinfo
> ===================================================================
> RCS file: /cvs/ports/security/wpa_supplicant/distinfo,v
> retrieving revision 1.2
> diff -u -p -r1.2 distinfo
> --- distinfo  19 Jan 2012 16:14:11 -0000      1.2
> +++ distinfo  27 Jan 2013 18:13:11 -0000
> @@ -1,5 +1,2 @@
> -MD5 (wpa_supplicant-0.7.3.tar.gz) = 9RbxkThKmlRuP1FFwIrd2g==
> -RMD160 (wpa_supplicant-0.7.3.tar.gz) = 4i8EQNZMlD5LCIbu+jQY516gG2A=
> -SHA1 (wpa_supplicant-0.7.3.tar.gz) = ylHbiTH6vzhjUsh0IvPmL7RMP+M=
> -SHA256 (wpa_supplicant-0.7.3.tar.gz) = 
> 0M1QyqhTRszDdtzaXtPCWO7xmpOzyt450ldgEYrVlEM=
> -SIZE (wpa_supplicant-0.7.3.tar.gz) = 1638224
> +SHA256 (wpa_supplicant-2.0.tar.gz) = 
> LBFWCfu1Ij1ROBCEpclERVqK/NqB1YQXP/VbojM3ngk=
> +SIZE (wpa_supplicant-2.0.tar.gz) = 2044281
> Index: files/config
> ===================================================================
> RCS file: /cvs/ports/security/wpa_supplicant/files/config,v
> retrieving revision 1.1
> diff -u -p -r1.1 config
> --- files/config      19 Jan 2012 16:14:11 -0000      1.1
> +++ files/config      27 Jan 2013 18:13:11 -0000
> @@ -1,19 +1,36 @@
> +# $OpenBSD$
> +# see defconfig and README for notes
> +
> +CFLAGS += -I${LOCALBASE}/include/PCSC
> +LIBS += -L${LOCALBASE}/lib
> +
> +CONFIG_BACKEND=file
>  CONFIG_CTRL_IFACE=y
>  CONFIG_DRIVER_WIRED=y
> +CONFIG_DRIVER_OPENBSD=y
>  CONFIG_IEEE8021X_EAPOL=y
> +CONFIG_PEERKEY=y
> +
>  CONFIG_EAP_MD5=y
>  CONFIG_EAP_MSCHAPV2=y
>  CONFIG_EAP_TLS=y
>  CONFIG_EAP_PEAP=y
>  CONFIG_EAP_TTLS=y
> +CONFIG_EAP_FAST=y
>  CONFIG_EAP_GTC=y
>  CONFIG_EAP_OTP=y
> -CONFIG_EAP_AKA=y
>  CONFIG_EAP_PSK=y
>  CONFIG_EAP_SAKE=y
>  CONFIG_EAP_GPSK=y
>  CONFIG_EAP_PAX=y
>  CONFIG_EAP_LEAP=y
> +CONFIG_EAP_IKEV2=y
> +
> +CONFIG_EAP_AKA=y
>  CONFIG_EAP_SIM=y
> -#CONFIG_EAP_FAST=n
> -CONFIG_L2_PACKET=freebsd
> +CONFIG_PCSC=y
> +CONFIG_SMARTCARD=y
> +
> +# privilege separation, see README.
> +# WIP: not yet tested.
> +# CONFIG_PRIVSEP=y
> Index: files/driver_openbsd.c
> ===================================================================
> RCS file: files/driver_openbsd.c
> diff -N files/driver_openbsd.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ files/driver_openbsd.c    27 Jan 2013 18:13:11 -0000
> @@ -0,0 +1,136 @@
> +/*
> + * Driver interaction with OpenBSD net80211 layer
> + * Copyright (c) 2013, Mark Kettenis
> + *
> + * This software may be distributed under the terms of the BSD license.
> + * See README for more details.
> + */
> +
> +#include "includes.h"
> +#include <sys/ioctl.h>
> +
> +#include <net/if.h>
> +#include <net80211/ieee80211.h>
> +#include <net80211/ieee80211_crypto.h>
> +#include <net80211/ieee80211_ioctl.h>
> +
> +#include "common.h"
> +#include "driver.h"
> +
> +struct openbsd_driver_data {
> +     char ifname[IFNAMSIZ + 1];
> +     void *ctx;
> +
> +     int sock;                       /* open socket for 802.11 ioctls */
> +};
> +
> +
> +static int
> +wpa_driver_openbsd_get_ssid(void *priv, u8 *ssid)
> +{
> +     struct openbsd_driver_data *drv = priv;
> +     struct ieee80211_nwid nwid;
> +     struct ifreq ifr;
> +
> +     os_memset(&ifr, 0, sizeof(ifr));
> +     os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
> +     ifr.ifr_data = (void *)&nwid;
> +     if (ioctl(drv->sock, SIOCG80211NWID, &ifr) < 0 ||
> +         nwid.i_len > IEEE80211_NWID_LEN)
> +             return -1;
> +
> +     os_memcpy(ssid, nwid.i_nwid, nwid.i_len);
> +     return nwid.i_len;
> +}
> +
> +static int
> +wpa_driver_openbsd_get_bssid(void *priv, u8 *bssid)
> +{
> +     struct openbsd_driver_data *drv = priv;
> +     struct ieee80211_bssid id;
> +
> +     os_strlcpy(id.i_name, drv->ifname, sizeof(id.i_name));
> +     if (ioctl(drv->sock, SIOCG80211BSSID, &id) < 0)
> +             return -1;
> +
> +     os_memcpy(bssid, id.i_bssid, IEEE80211_ADDR_LEN);
> +     return 0;
> +}
> +
> +
> +static int
> +wpa_driver_openbsd_get_capa(void *priv, struct wpa_driver_capa *capa)
> +{
> +     os_memset(capa, 0, sizeof(*capa));
> +     capa->flags = WPA_DRIVER_FLAGS_4WAY_HANDSHAKE;
> +     return 0;
> +}
> +
> +
> +static int
> +wpa_driver_openbsd_set_key(const char *ifname, void *priv, enum wpa_alg alg,
> +         const unsigned char *addr, int key_idx, int set_tx, const u8 *seq,
> +         size_t seq_len, const u8 *key, size_t key_len)
> +{
> +     struct openbsd_driver_data *drv = priv;
> +     struct ieee80211_keyavail keyavail;
> +
> +     if (alg != WPA_ALG_PMK || key_len > IEEE80211_PMK_LEN)
> +             return -1;
> +
> +     memset(&keyavail, 0, sizeof(keyavail));
> +     os_strlcpy(keyavail.i_name, drv->ifname, sizeof(keyavail.i_name));
> +     if (wpa_driver_openbsd_get_bssid(priv, keyavail.i_macaddr) < 0)
> +             return -1;
> +     memcpy(keyavail.i_key, key, key_len);
> +
> +     if (ioctl(drv->sock, SIOCS80211KEYAVAIL, &keyavail) < 0)
> +             return -1;
> +
> +     return 0;
> +}
> +
> +static void *
> +wpa_driver_openbsd_init(void *ctx, const char *ifname)
> +{
> +     struct openbsd_driver_data *drv;
> +
> +     drv = os_zalloc(sizeof(*drv));
> +     if (drv == NULL)
> +             return NULL;
> +
> +     drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
> +     if (drv->sock < 0)
> +             goto fail;
> +
> +     drv->ctx = ctx;
> +     os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
> +
> +     return drv;
> +
> +fail:
> +     os_free(drv);
> +     return NULL;
> +}
> +
> +
> +static void
> +wpa_driver_openbsd_deinit(void *priv)
> +{
> +     struct openbsd_driver_data *drv = priv;
> +
> +     close(drv->sock);
> +     os_free(drv);
> +}
> +
> +
> +const struct wpa_driver_ops wpa_driver_openbsd_ops = {
> +     .name = "openbsd",
> +     .desc = "OpenBSD 802.11 support",
> +     .get_ssid = wpa_driver_openbsd_get_ssid,
> +     .get_bssid = wpa_driver_openbsd_get_bssid,
> +     .get_capa = wpa_driver_openbsd_get_capa,
> +     .set_key = wpa_driver_openbsd_set_key,
> +     .init = wpa_driver_openbsd_init,
> +     .deinit = wpa_driver_openbsd_deinit,
> +};
> Index: files/wpa_supplicant.conf
> ===================================================================
> RCS file: /cvs/ports/security/wpa_supplicant/files/wpa_supplicant.conf,v
> retrieving revision 1.1
> diff -u -p -r1.1 wpa_supplicant.conf
> --- files/wpa_supplicant.conf 1 Jul 2007 19:50:57 -0000       1.1
> +++ files/wpa_supplicant.conf 27 Jan 2013 18:13:11 -0000
> @@ -6,10 +6,22 @@ ctrl_interface=/var/run/wpa_supplicant
>  ctrl_interface_group=wheel
>  ap_scan=0
>  
> -network={
> -     key_mgmt=IEEE8021X
> -     eap=MD5
> -     identity="user"
> -     password="password"
> -     eapol_flags=0
> -}
> +# wired network:
> +
> +#network={
> +#    key_mgmt=IEEE8021X
> +#    eap=MD5
> +#    identity="user"
> +#    password="password"
> +#    eapol_flags=0
> +#}
> +
> +# wireless network:
> +
> +#network={
> +#        ssid="humppa"
> +#        key_mgmt=WPA-EAP
> +#        eap=TTLS PEAP
> +#        identity="user"
> +#        password="password"
> +#}
> Index: patches/patch-os_internal_c
> ===================================================================
> RCS file: /cvs/ports/security/wpa_supplicant/patches/patch-os_internal_c,v
> retrieving revision 1.3
> diff -u -p -r1.3 patch-os_internal_c
> --- patches/patch-os_internal_c       19 Jan 2012 16:14:11 -0000      1.3
> +++ patches/patch-os_internal_c       27 Jan 2013 18:13:11 -0000
> @@ -1,7 +1,7 @@
>  $OpenBSD: patch-os_internal_c,v 1.3 2012/01/19 16:14:11 sthen Exp $
> ---- src/utils/os_internal.c.orig     Tue May 29 03:08:48 2007
> -+++ src/utils/os_internal.c  Sat Jan 14 12:52:53 2012
> -@@ -178,7 +178,7 @@ int os_setenv(const char *name, const char *value, int
> +--- src/utils/os_internal.c.orig     Sat Jan 12 15:42:53 2013
> ++++ src/utils/os_internal.c  Fri Jan 25 20:18:22 2013
> +@@ -190,7 +190,7 @@ int os_setenv(const char *name, const char *value, int
>   
>   int os_unsetenv(const char *name)
>   {
> Index: patches/patch-src_drivers_drivers_c
> ===================================================================
> RCS file: patches/patch-src_drivers_drivers_c
> diff -N patches/patch-src_drivers_drivers_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-src_drivers_drivers_c       27 Jan 2013 18:13:11 -0000
> @@ -0,0 +1,23 @@
> +$OpenBSD$
> +--- src/drivers/drivers.c.orig       Sun Jan 27 18:04:16 2013
> ++++ src/drivers/drivers.c    Sun Jan 27 18:05:04 2013
> +@@ -24,6 +24,9 @@ extern struct wpa_driver_ops wpa_driver_madwifi_ops; /
> + #ifdef CONFIG_DRIVER_BSD
> + extern struct wpa_driver_ops wpa_driver_bsd_ops; /* driver_bsd.c */
> + #endif /* CONFIG_DRIVER_BSD */
> ++#ifdef CONFIG_DRIVER_OPENBSD
> ++extern struct wpa_driver_ops wpa_driver_openbsd_ops; /* driver_openbsd.c */
> ++#endif /* CONFIG_DRIVER_OPENBSD */
> + #ifdef CONFIG_DRIVER_NDIS
> + extern struct wpa_driver_ops wpa_driver_ndis_ops; /* driver_ndis.c */
> + #endif /* CONFIG_DRIVER_NDIS */
> +@@ -62,6 +65,9 @@ struct wpa_driver_ops *wpa_drivers[] =
> + #ifdef CONFIG_DRIVER_BSD
> +     &wpa_driver_bsd_ops,
> + #endif /* CONFIG_DRIVER_BSD */
> ++#ifdef CONFIG_DRIVER_OPENBSD
> ++    &wpa_driver_openbsd_ops,
> ++#endif /* CONFIG_DRIVER_OPENBSD */
> + #ifdef CONFIG_DRIVER_NDIS
> +     &wpa_driver_ndis_ops,
> + #endif /* CONFIG_DRIVER_NDIS */
> Index: patches/patch-src_drivers_drivers_mak
> ===================================================================
> RCS file: patches/patch-src_drivers_drivers_mak
> diff -N patches/patch-src_drivers_drivers_mak
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-src_drivers_drivers_mak     27 Jan 2013 18:13:11 -0000
> @@ -0,0 +1,18 @@
> +$OpenBSD$
> +--- src/drivers/drivers.mak.orig     Sun Jan 27 18:05:10 2013
> ++++ src/drivers/drivers.mak  Sun Jan 27 18:05:42 2013
> +@@ -55,6 +55,14 @@ CONFIG_L2_FREEBSD=y
> + CONFIG_DNET_PCAP=y
> + endif
> + 
> ++ifdef CONFIG_DRIVER_OPENBSD
> ++ifndef CONFIG_L2_PACKET
> ++CONFIG_L2_PACKET=freebsd
> ++endif
> ++DRV_CFLAGS += -DCONFIG_DRIVER_OPENBSD
> ++DRV_OBJS += ../src/drivers/driver_openbsd.o
> ++endif
> ++
> + ifdef CONFIG_DRIVER_TEST
> + DRV_CFLAGS += -DCONFIG_DRIVER_TEST
> + DRV_OBJS += ../src/drivers/driver_test.o
> Index: patches/patch-src_drivers_drivers_mk
> ===================================================================
> RCS file: patches/patch-src_drivers_drivers_mk
> diff -N patches/patch-src_drivers_drivers_mk
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-src_drivers_drivers_mk      27 Jan 2013 18:13:11 -0000
> @@ -0,0 +1,18 @@
> +$OpenBSD$
> +--- src/drivers/drivers.mk.orig      Sun Jan 27 18:05:45 2013
> ++++ src/drivers/drivers.mk   Sun Jan 27 18:06:11 2013
> +@@ -55,6 +55,14 @@ CONFIG_L2_FREEBSD=y
> + CONFIG_DNET_PCAP=y
> + endif
> + 
> ++ifdef CONFIG_DRIVER_OPENBSD
> ++ifndef CONFIG_L2_PACKET
> ++CONFIG_L2_PACKET=freebsd
> ++endif
> ++DRV_CFLAGS += -DCONFIG_DRIVER_OPENBSD
> ++DRV_OBJS += src/drivers/driver_openbsd.c
> ++endif
> ++
> + ifdef CONFIG_DRIVER_TEST
> + DRV_CFLAGS += -DCONFIG_DRIVER_TEST
> + DRV_OBJS += src/drivers/driver_test.c
> Index: patches/patch-src_l2_packet_l2_packet_freebsd_c
> ===================================================================
> RCS file: patches/patch-src_l2_packet_l2_packet_freebsd_c
> diff -N patches/patch-src_l2_packet_l2_packet_freebsd_c
> --- patches/patch-src_l2_packet_l2_packet_freebsd_c   25 Jun 2012 14:06:26 
> -0000      1.1
> +++ /dev/null 1 Jan 1970 00:00:00 -0000
> @@ -1,11 +0,0 @@
> -$OpenBSD: patch-src_l2_packet_l2_packet_freebsd_c,v 1.1 2012/06/25 14:06:26 
> naddy Exp $
> ---- src/l2_packet/l2_packet_freebsd.c.orig   Mon Jun 25 07:51:11 2012
> -+++ src/l2_packet/l2_packet_freebsd.c        Mon Jun 25 07:51:32 2012
> -@@ -20,6 +20,7 @@
> - #include <pcap.h>
> - 
> - #include <sys/ioctl.h>
> -+#include <sys/param.h>
> - #include <sys/sysctl.h>
> - 
> - #include <net/if.h>
> Index: patches/patch-wpa_supplicant_Makefile
> ===================================================================
> RCS file: patches/patch-wpa_supplicant_Makefile
> diff -N patches/patch-wpa_supplicant_Makefile
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-wpa_supplicant_Makefile     27 Jan 2013 18:13:11 -0000
> @@ -0,0 +1,12 @@
> +$OpenBSD$
> +--- wpa_supplicant/Makefile.orig     Fri Jan 25 23:16:50 2013
> ++++ wpa_supplicant/Makefile  Fri Jan 25 23:16:53 2013
> +@@ -50,7 +50,7 @@ mkconfig:
> +     echo CONFIG_DRIVER_WEXT=y >> .config
> + 
> + $(DESTDIR)$(BINDIR)/%: %
> +-    install -D $(<) $(@)
> ++    install $(<) $(@)
> + 
> + install: $(addprefix $(DESTDIR)$(BINDIR)/,$(BINALL))
> +     $(MAKE) -C ../src install
> Index: patches/patch-wpa_supplicant_wpa_priv_c
> ===================================================================
> RCS file: patches/patch-wpa_supplicant_wpa_priv_c
> diff -N patches/patch-wpa_supplicant_wpa_priv_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-wpa_supplicant_wpa_priv_c   27 Jan 2013 18:13:11 -0000
> @@ -0,0 +1,34 @@
> +$OpenBSD$
> +--- wpa_supplicant/wpa_priv.c.orig   Sat Jan 26 10:49:28 2013
> ++++ wpa_supplicant/wpa_priv.c        Sat Jan 26 10:50:56 2013
> +@@ -92,6 +92,7 @@ static void wpa_priv_cmd_unregister(struct wpa_priv_in
> + }
> + 
> + 
> ++#if 0
> + static void wpa_priv_cmd_scan(struct wpa_priv_interface *iface,
> +                           char *buf, size_t len)
> + {
> +@@ -170,6 +171,7 @@ static void wpa_priv_cmd_get_scan_results(struct wpa_p
> +             sendto(iface->fd, "", 0, 0, (struct sockaddr *) from,
> +                    sizeof(*from));
> + }
> ++#endif
> + 
> + 
> + static void wpa_priv_cmd_associate(struct wpa_priv_interface *iface,
> +@@ -487,12 +489,14 @@ static void wpa_priv_receive(int sock, void *eloop_ctx
> +     case PRIVSEP_CMD_UNREGISTER:
> +             wpa_priv_cmd_unregister(iface, &from);
> +             break;
> ++#if 0
> +     case PRIVSEP_CMD_SCAN:
> +             wpa_priv_cmd_scan(iface, cmd_buf, cmd_len);
> +             break;
> +     case PRIVSEP_CMD_GET_SCAN_RESULTS:
> +             wpa_priv_cmd_get_scan_results(iface, &from);
> +             break;
> ++#endif
> +     case PRIVSEP_CMD_ASSOCIATE:
> +             wpa_priv_cmd_associate(iface, cmd_buf, cmd_len);
> +             break;
> Index: pkg/PLIST
> ===================================================================
> RCS file: /cvs/ports/security/wpa_supplicant/pkg/PLIST,v
> retrieving revision 1.2
> diff -u -p -r1.2 PLIST
> --- pkg/PLIST 19 Jan 2012 16:14:11 -0000      1.2
> +++ pkg/PLIST 27 Jan 2013 18:13:11 -0000
> @@ -1,10 +1,11 @@
>  @comment $OpenBSD: PLIST,v 1.2 2012/01/19 16:14:11 sthen Exp $
> +@comment @man man/man8/wpa_priv.8
> +@comment @bin sbin/wpa_priv
>  @man man/man5/wpa_supplicant.conf.5
>  @man man/man8/wpa_background.8
>  @man man/man8/wpa_cli.8
>  @comment @man man/man8/wpa_gui.8
>  @man man/man8/wpa_passphrase.8
> -@comment @man man/man8/wpa_priv.8
>  @man man/man8/wpa_supplicant.8
>  @bin sbin/wpa_cli
>  @bin sbin/wpa_passphrase
> 

-- 
Matthieu Herrb

Reply via email to