On Tue, Jan 14, 2020 at 12:34:29PM -0700, Theo de Raadt wrote:
> Channeling a conversation from 15 years ago: "How about wpakeyfile"

ifconfig wpakeyfile would be trivial to add if we really want it.

The downside is loss of unveil, here handled the same way as for the
bridge rulesfile. Looks like unveil(argv[i], "r") is considered bad
practice even for an 'i' that should contain a path?

diff a7540b3fac3fd3a71fd4134709ac4d4f71a3b5a4 /usr/src
blob - 3fb0780ba7cf1333894f5c3485a95e71885fbd6d
file + sbin/ifconfig/ifconfig.8
--- sbin/ifconfig/ifconfig.8
+++ sbin/ifconfig/ifconfig.8
@@ -940,6 +940,7 @@ will begin advertising as master.
 .Op Cm wpaciphers Ar cipher,cipher,...
 .Op Cm wpagroupcipher Ar cipher
 .Op Oo Fl Oc Ns Cm wpakey Ar passphrase | hexkey
+.Op Cm wpakeyfile Ar path
 .Op Cm wpaprotos Ar proto,proto,...
 .Ek
 .nr nS 0
@@ -990,6 +991,7 @@ the
 .Cm join
 list will record
 .Cm wpakey ,
+.Cm wpakeyfile ,
 .Cm wpaprotos ,
 or
 .Cm nwkey
@@ -1209,6 +1211,8 @@ The default value is
 .Dq psk
 can only be used if a pre-shared key is configured using the
 .Cm wpakey
+or
+.Cm wpakeyfile
 option.
 .It Cm wpaciphers Ar cipher,cipher,...
 Set the comma-separated list of allowed pairwise ciphers.
@@ -1268,6 +1272,10 @@ or
 option must first be specified, since
 .Nm
 will hash the nwid along with the passphrase to create the key.
+.It Cm wpakeyfile Ar path
+Set the WPA key contained in the file at the specified
+.Ar path .
+Trailing whitespace is ignored.
 .It Cm -wpakey
 Delete the pre-shared WPA key and disable WPA.
 .It Cm wpaprotos Ar proto,proto,...
blob - f242d72cd73e8d50ccf1dd3d96ac62e35fe7025b
file + sbin/ifconfig/ifconfig.c
--- sbin/ifconfig/ifconfig.c
+++ sbin/ifconfig/ifconfig.c
@@ -63,6 +63,7 @@
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
+#include <sys/stat.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -106,6 +107,7 @@
 #include <resolv.h>
 #include <util.h>
 #include <ifaddrs.h>
+#include <fcntl.h>
 
 #ifndef SMALL
 #include <dev/usb/mbim.h>
@@ -211,6 +213,7 @@ void        setifwpaakms(const char *, int);
 void   setifwpaciphers(const char *, int);
 void   setifwpagroupcipher(const char *, int);
 void   setifwpakey(const char *, int);
+void   setifwpakeyfile(const char *, int);
 void   setifchan(const char *, int);
 void   setifscan(const char *, int);
 void   setifnwflag(const char *, int);
@@ -415,6 +418,7 @@ const struct        cmd {
        { "wpagroupcipher", NEXTARG,    0,              setifwpagroupcipher },
        { "wpaprotos",  NEXTARG,        0,              setifwpaprotos },
        { "wpakey",     NEXTARG,        0,              setifwpakey },
+       { "wpakeyfile", NEXTARG,        0,              setifwpakeyfile },
        { "-wpakey",    -1,             0,              setifwpakey },
        { "chan",       NEXTARG0,       0,              setifchan },
        { "-chan",      -1,             0,              setifchan },
@@ -728,7 +732,7 @@ main(int argc, char *argv[])
        int create = 0;
        int Cflag = 0;
        int gflag = 0;
-       int found_rulefile = 0;
+       int found_rulefile = 0, found_wpakeyfile = 0, wpafileidx = 0;
        int i;
 
        /* If no args at all, print all interfaces.  */
@@ -785,9 +789,13 @@ main(int argc, char *argv[])
                        found_rulefile = 1;
                        break;
                }
+               if (strcmp(argv[i], "wpakeyfile") == 0) {
+                       found_wpakeyfile = 1;
+                       break;
+               }
        }
 
-       if (!found_rulefile) {
+       if (!found_rulefile && !found_wpakeyfile) {
                if (unveil(_PATH_RESCONF, "r") == -1)
                        err(1, "unveil");
                if (unveil(_PATH_HOSTS, "r") == -1)
@@ -2240,6 +2248,40 @@ setifwpakey(const char *val, int d)
        wpa.i_enabled = psk.i_enabled;
        if (ioctl(sock, SIOCS80211WPAPARMS, (caddr_t)&wpa) == -1)
                err(1, "SIOCS80211WPAPARMS");
+}
+
+void
+setifwpakeyfile(const char *val, int d)
+{
+       char *wpakey;
+       int fd;
+       struct stat sb;
+       ssize_t n;
+
+       fd = open(val, O_RDONLY);
+       if (fd == -1)
+               err(1, "open %s", val);
+
+       if (fstat(fd, &sb) == -1)
+               err(1, "fstat %s", val);
+
+       wpakey = malloc(sb.st_size);
+       if (wpakey == NULL)
+               err(1, "malloc");
+               
+       n = read(fd, wpakey, sb.st_size);
+       if (n == -1)
+               err(1, "read %s", val);
+       if (n != sb.st_size)
+               errx(1, "failed to read from file %s", val);
+       close(fd);
+
+       while (n > 0 && isspace(wpakey[n - 1])) {
+               wpakey[n - 1] = '\0';
+               n--;
+       }
+
+       setifwpakey(wpakey, d);
 }
 
 void


Reply via email to