Connecting to WEP network via wpa_supplicant/dbus/python

Dan Williams dcbw at redhat.com
Tue Apr 28 10:41:48 EDT 2009


On Tue, 2009-04-28 at 21:25 +1000, James Rayner wrote:
> On Wed, Feb 18, 2009 at 2:19 AM, Dan Williams <dcbw at redhat.com> wrote:
> >
> > How is the key stored in 'profile'?  It's likely you're storing the key
> > as a hex string, right?  That's *not* actually the binary key.  To get
> > the actual binary key, you need to convert the key from hex string
> > representation to bytes.  For every two characters of the hex key,
> > convert that hex value to a byte value from 0 - 255 (ie, '1a' == 0x1a).
> > Thus, of course, the binary key will be 1/2 the size of the hexadecimal
> > key.
> >
> > Note that WPA-PSK keys can be sent as the passphrase, and the D-Bus
> > interface will quote them correctly.  But since WEP has no standard
> > passphrase -> key hashing mechanism, that's not really do-able for WEP.
> > Furthermore, for WEP, hex keys are actually acceptable passphrases.  So
> > the D-Bus interface takes the position that for WEP, since the key type
> > cannot be detected based on the input material, the caller must do the
> > hashing themselves, and pass the actual 5- or 13-byte WEP key to the
> > supplicant.
> >
> > Yeah, the D-Bus interface is somewhat ugly; I admit that.  I've got
> > vague, hand-wavy plans to fix it.
> >
> 
> Thanks!
> 
> Still having some slight problems getting the right syntax to pass.
> 
> I have a hex key of 017CF3C0EE
> I split that up, convert and I get
>  key=[1, 124, 243, 192, 238].
> 
> If I pass dbus a dbus.ByteArray(key), it errors:
>  "Did not receive correct message arguments"

looks like the dbus-python constructor for ByteArray assumes a string or
something there.  Doing that yields:

>>> k = [1, 124, 243, 192]
>>> p = dbus.ByteArray(k)
>>> p
dbus.ByteArray('[1, 124, 243, 192]')

which clearly isn't right; it's converting what you're passing is to a
string, which works great for the SSID (since you don't have any
non-ascii characters in it), but not for the WEP key, which is actually
binary data.  You'll want something like:

a = dbus.ByteArray()
for b in wepkey:
    a += chr(b)

ex - 

>>> k = [1, 124, 243, 192]
>>> k
[1, 124, 243, 192]
>>> a = dbus.ByteArray()
>>> for b in k:
...     a+=chr(b)
... 
>>> a
'\x01|\xf3\xc0'

which looks a bit better.

The vague hand-wavy plans also include introspection, which is why
you're having so much trouble.  dbus-python relies heavily on
introspection to figure out how to automatically convert arguments from
python (where variables are not strongly typed) to dbus (where they
are).  But since wpa_supplicant doesn't provide introspection data, this
falls down and you are required to explicitly cast in python, which is
ugly.  Fortunately, that wouldn't be too hard to fix in wpa_supplicant,
and would be backwards compatible while some new dbus API gets written.

Dan

> I also tried joining them as a string 001124243192238 however this did
> not associate.
> 
> The code is effectively the same as my original email, and the
> arguments passed are:
>   {"ssid":dbus.ByteArray("some essid"), "key_mgmt":
> dbus.String("NONE"), "wep_tx_idx": dbus.Int32(1 or 0, neither work),
> "wep_key0": ??? }
> 
> Thanks in advance.
> James



More information about the HostAP mailing list