On 09/14/10 02:14, Alexander Hall wrote:
> Not to mess with ifconfig's wpapsk, this diff does instead introduces
> wpapass and -wpapass.
> 
> Same nwid relation as before:
> - A nwid is required prior to supplying a passphrase to wpapass.
> - If the nwid is changed afterwards, the passkey is not adjusted.
> 
> There has been discussion whether we should clear the wpa key on nwid
> change, but I see that as a separate issue.
> 
> Again, bsd.rd size impact not checked.
> 
> I'd appreciate if someone would comment on the Makefile changes too.

Vi editing artifact snuck in, pointed it out to me by Patrick
Keshishian, thanks.

Proper diff follows.

I'll add the manpage bits after diff is agreed on and bikeshedding
is done.

/Alexander


Index: distrib/special/ifconfig/Makefile
===================================================================
RCS file: /cvs/src/distrib/special/ifconfig/Makefile,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile
--- distrib/special/ifconfig/Makefile   28 Oct 2009 07:36:49 -0000      1.2
+++ distrib/special/ifconfig/Makefile   14 Sep 2010 05:33:42 -0000
@@ -1,8 +1,10 @@
 #      $OpenBSD: Makefile,v 1.2 2009/10/28 07:36:49 deraadt Exp $
 
 PROG=  ifconfig
+SRCS=  ifconfig.c pbkdf2.c
 COPTS+=        -DSMALL
-.PATH:  ${.CURDIR}/../../../sbin/ifconfig
+.PATH:  ${.CURDIR}/../../../sbin/ifconfig ${.CURDIR}/../../../sbin/bioctl
+CFLAGS+=-I${.CURDIR}/../../../sbin/bioctl
 
 CPPFLAGS+=-DINET6
 
Index: sbin/ifconfig/Makefile
===================================================================
RCS file: /cvs/src/sbin/ifconfig/Makefile,v
retrieving revision 1.10
diff -u -p -r1.10 Makefile
--- sbin/ifconfig/Makefile      22 Nov 2009 22:00:24 -0000      1.10
+++ sbin/ifconfig/Makefile      14 Sep 2010 05:33:42 -0000
@@ -1,7 +1,10 @@
 #      $OpenBSD: Makefile,v 1.10 2009/11/22 22:00:24 claudio Exp $
 
+.PATH: ${.CURDIR}/../bioctl
+CFLAGS+=-I${.CURDIR}/../bioctl
+
 PROG=  ifconfig
-SRCS=  ifconfig.c brconfig.c
+SRCS=  ifconfig.c brconfig.c pbkdf2.c
 MAN=   ifconfig.8
 
 CPPFLAGS+=-DINET6
Index: sbin/ifconfig/ifconfig.c
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.239
diff -u -p -r1.239 ifconfig.c
--- sbin/ifconfig/ifconfig.c    3 Jul 2010 04:44:51 -0000       1.239
+++ sbin/ifconfig/ifconfig.c    14 Sep 2010 05:33:44 -0000
@@ -161,6 +161,7 @@ void        setifwpaakms(const char *, int);
 void   setifwpaciphers(const char *, int);
 void   setifwpagroupcipher(const char *, int);
 void   setifwpapsk(const char *, int);
+void   setifwpapass(const char *, int);
 void   setifchan(const char *, int);
 void   setifscan(const char *, int);
 void   setiftxpower(const char *, int);
@@ -319,6 +320,8 @@ const struct        cmd {
        { "wpaprotos",  NEXTARG,        0,              setifwpaprotos },
        { "wpapsk",     NEXTARG,        0,              setifwpapsk },
        { "-wpapsk",    -1,             0,              setifwpapsk },
+       { "wpapass",    NEXTARG,        0,              setifwpapass },
+       { "-wpapass",   -1,             0,              setifwpapass },
        { "chan",       NEXTARG0,       0,              setifchan },
        { "-chan",      -1,             0,              setifchan },
        { "scan",       NEXTARG0,       0,              setifscan },
@@ -1715,6 +1718,44 @@ setifwpapsk(const char *val, int d)
                        errx(1, "wpapsk: invalid pre-shared key");
                if (len != sizeof(psk.i_psk))
                        errx(1, "wpapsk: bad pre-shared key length");
+               psk.i_enabled = 1;
+       } else
+               psk.i_enabled = 0;
+
+       (void)strlcpy(psk.i_name, name, sizeof(psk.i_name));
+       if (ioctl(s, SIOCS80211WPAPSK, (caddr_t)&psk) < 0)
+               err(1, "SIOCS80211WPAPSK");
+}
+
+void
+setifwpapass(const char *val, int d)
+{
+       struct ieee80211_wpapsk psk;
+       struct ieee80211_nwid nwid;
+       int passlen, nwid_len;
+
+       if (d != -1) {
+               memset(&ifr, 0, sizeof(ifr));
+               ifr.ifr_data = (caddr_t)&nwid;
+               strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+               if (ioctl(s, SIOCG80211NWID, (caddr_t)&ifr))
+                       err(1, "SIOCG80211NWID");
+
+               passlen = strlen(val);
+               if (passlen < 8 || passlen > 63)
+                       errx(1, "wpapass: passphrase must be between 8 and 63 "
+                           "characters");
+               nwid_len = nwid.i_len;
+               if (nwid_len == 0)
+                       errx(1, "wpapass: nwid not set");
+               else if (nwid_len > IEEE80211_NWID_LEN) {
+                       nwid_len = IEEE80211_NWID_LEN;
+                       warnx("truncating nwid to its first %d characters",
+                           nwid_len);
+               }
+
+               pkcs5_pbkdf2(val, passlen, nwid.i_nwid, nwid_len, psk.i_psk,
+                   sizeof(psk.i_psk), 4096);
                psk.i_enabled = 1;
        } else
                psk.i_enabled = 0;

Reply via email to