[openfirmware] [commit] r2528 - ofw/wifi

repository service svn at openfirmware.info
Fri Sep 23 07:00:37 CEST 2011


Author: wmb
Date: Fri Sep 23 07:00:36 2011
New Revision: 2528
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2528

Log:
Wifi - improved user interface for WPA authentication.

Modified:
   ofw/wifi/eapol.fth
   ofw/wifi/wifi-cfg.fth

Modified: ofw/wifi/eapol.fth
==============================================================================
--- ofw/wifi/eapol.fth	Fri Sep 23 06:59:53 2011	(r2527)
+++ ofw/wifi/eapol.fth	Fri Sep 23 07:00:36 2011	(r2528)
@@ -699,8 +699,24 @@
 ;
 
 : pmk-ok?  ( -- flag )
-   wifi-pmk$ nip d# 32 =  
-   atype at-preshared =  and
+   atype at-preshared <>  if  false exit  then
+
+   \ If necessary, compute the PMK (pairwise master key) from the PSK (pre-shared key)
+   \ The PSK is the user-visible password, whereas the PMK is a hash of the PSK and
+   \ the SSID which is used in the key exchange.
+   wifi-pmk$ nip  case  ( length )
+      0  of                                           ( )
+         wifi-psk$ wifi-ssid$ pad d# 32 pbkdf2-sha1   ( )
+         pad d# 32 $pmk                               ( )
+         true                                         ( okay? )
+      endof
+
+      d# 32  of
+	 true                                         ( okay? )
+      endof
+
+      ( default )  false swap
+   endcase                                            ( okay? )
 ;
 
 : key-ok?  ( -- ok? )

Modified: ofw/wifi/wifi-cfg.fth
==============================================================================
--- ofw/wifi/wifi-cfg.fth	Fri Sep 23 06:59:53 2011	(r2527)
+++ ofw/wifi/wifi-cfg.fth	Fri Sep 23 07:00:36 2011	(r2528)
@@ -12,6 +12,7 @@
     /n field >wc-wep3		\ pstr (binary, len=5 or 13)
     /n field >wc-wep4		\ pstr (binary, len=5 or 13)
     /n field >wc-pmk		\ pstr (binary, len=32)
+    /n field >wc-psk		\ pstr (ASCII, arbitrary length)
 constant /wifi-cfg
 
 /wifi-cfg buffer: ram-wifi-cfg
@@ -35,12 +36,22 @@
 : pstr@   ( src -- adr len )  @ ?dup  if  count  else  " "  then  ;
 : wifi-ssid$     ( -- $ )  wifi-cfg >wc-ssid pstr@  ;
 : wifi-pmk$      ( -- $ )  wifi-cfg >wc-pmk  pstr@  ;
+: wifi-psk$      ( -- $ )  wifi-cfg >wc-psk  pstr@  ; 
 : wifi-wep1$     ( -- $ )  wifi-cfg >wc-wep1 pstr@  ;
 : wifi-wep2$     ( -- $ )  wifi-cfg >wc-wep2 pstr@  ;
 : wifi-wep3$     ( -- $ )  wifi-cfg >wc-wep3 pstr@  ;
 : wifi-wep4$     ( -- $ )  wifi-cfg >wc-wep4 pstr@  ; 
 : wifi-wep-idx   ( -- n )  wifi-cfg >wc-wep-idx @ 1- 0 max 4 min  ;
 
+\ The PMK is used internally, rarely entered directly
+\ Computing it from the user-visible PSK is relatively expensive, so
+\ we store the value for later reuse.  The supplicant package calls $pmk 
+\ to store the computed value in the wifi-cfg data structure.
+: $pmk  ( pmk$ -- )
+   dup d# 32 <>  abort" PMK must be 32 bytes"
+   wifi-cfg >wc-pmk pstr!  ( )
+;
+
 defer default-ssids  ( -- $ )  ' null$ to default-ssids
 
 0 value ssid-reset?
@@ -53,19 +64,6 @@
    ['] null$ to default-ssids
 ;
 
-: $wep  ( wep$ -- )
-   dup 5 <>  over d# 13 <>  and  abort" WEP key must be 5 or 13 bytes"
-   wifi-cfg >wc-wep-idx   dup @          ( wep$ adr idx )
-   dup 4 >=  abort" Too many WEP keys"   ( wep$ adr idx )
-   2dup 1+ swap !                        ( wep$ adr idx )
-   2* na+ na1+  pstr!                    ( )
-;
-
-: $pmk  ( pmk$ -- )
-   dup d# 32 <>  abort" PMK must be 32 bytes"
-   wifi-cfg >wc-pmk pstr!  ( )
-;
-
 \ Stores the result at here
 : decode-hex  ( hex$ -- bin$ )
    here >r
@@ -79,12 +77,30 @@
    r>  here over -                       ( bin-adr bin-len )
 ;
 
+\ WEP keys are fundamentally either 5 or 13 bytes long, but they can be
+\ expressed either in straight ASCII or in hexadecimal.  In hex, the
+\ length is either 10 or 26 bytes, which converts to 5 or 13 ASCII bytes.
+: $wep  ( wep$ -- )
+   dup d# 10 =  over d# 26 =  if         ( wep$ )
+      decode-hex                         ( wep$' )
+   else                                  ( wep$ )
+      dup 5 <>  over d# 13 <>  and  abort" WEP key must be 5 or 13 ASCII characters or 10 or 26 hex digits"
+   then                                  ( wep$ )
+
+   wifi-cfg >wc-wep-idx   dup @          ( wep$ adr idx )
+   dup 4 >=  abort" Too many WEP keys"   ( wep$ adr idx )
+   2dup 1+ swap !                        ( wep$ adr idx )
+   2* na+ na1+  pstr!                    ( )
+;
+
+: $wpa  ( psk$ -- )   wifi-cfg >wc-psk pstr!  ;
+
 : essid  ( "ssid" -- )  0 parse $essid  ;
 alias wifi essid
 alias ssid essid
-: wep  ( "wep" -- )  parse-word  decode-hex  $wep  ;
-: pmk  ( "pmk" -- )  parse-word  decode-hex  $pmk  ;
 
+: wep  ( "wep" -- )  parse-word  $wep  ;
+: wpa  ( "psk" -- )  parse-word  $wpa  ;
 
 \ =====================================================================
 \ Scan wireless networks



More information about the openfirmware mailing list