diff --git a/cc3200/mods/modwlan.c b/cc3200/mods/modwlan.c index 6a03fdbb85..b58d4aa247 100644 --- a/cc3200/mods/modwlan.c +++ b/cc3200/mods/modwlan.c @@ -196,6 +196,7 @@ STATIC void wlan_reenable (SlWlanMode_t mode); STATIC void wlan_servers_start (void); STATIC void wlan_servers_stop (void); STATIC void wlan_get_sl_mac (void); +STATIC void wlan_wep_key_unhexlify(const char *key, char *key_out); STATIC modwlan_Status_t wlan_do_connect (const char* ssid, uint32_t ssid_len, const char* bssid, uint8_t sec, const char* key, uint32_t key_len, uint32_t timeout); STATIC void wlan_lpds_callback_enable (mp_obj_t self_in); @@ -479,6 +480,12 @@ void wlan_sl_enable (int8_t mode, const char *ssid, uint8_t ssid_len, uint8_t se wlan_obj.ssid[ssid_len] = '\0'; ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, ssid_len, (unsigned char *)wlan_obj.ssid)); ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, sizeof(uint8_t), &sec)); + if (sec == SL_SEC_TYPE_WEP) { + _u8 wep_key[32]; + wlan_wep_key_unhexlify(key, (char *)&wep_key); + key = (const char *)&wep_key; + key_len /= 2; + } ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, key_len, (unsigned char *)key)); _u8* country = (_u8*)"EU"; ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, 2, country)); @@ -651,6 +658,25 @@ STATIC void wlan_get_sl_mac (void) { sl_NetCfgGet(SL_MAC_ADDRESS_GET, NULL, &macAddrLen, wlan_obj.mac); } +STATIC void wlan_wep_key_unhexlify(const char *key, char *key_out) { + int len = strlen(key); + byte hex_byte = 0; + for (mp_uint_t i = len; i--;) { + byte hex_ch = *key++; + if (unichar_isxdigit(hex_ch)) { + hex_byte += unichar_xdigit_value(hex_ch); + } else { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, mpexception_value_invalid_arguments)); + } + if (i & 1) { + hex_byte <<= 4; + } else { + *key_out++ = hex_byte; + hex_byte = 0; + } + } +} + /// \method iwconfig(*, mode, ssid, security, key, channel, antenna) /// /// Initialise the WLAN engine with the given parameters: @@ -707,8 +733,9 @@ STATIC mp_obj_t wlan_iwconfig(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map if (args[3].u_obj != MP_OBJ_NULL) { // get the key mp_uint_t key_len; - const char *key = mp_obj_str_get_data(args[3].u_obj, &key_len); - if (key_len < 5 || key_len > 64) { + const char *key; + key = mp_obj_str_get_data(args[3].u_obj, &key_len); + if ((wlan_obj.security == SL_SEC_TYPE_WEP && (key_len < 10 || key_len > 58)) || key_len < 8 || key_len > 64) { goto arg_error; } memcpy (wlan_obj.key, key, key_len); @@ -806,8 +833,6 @@ STATIC mp_obj_t wlan_make_new (mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_k } /// \method connect(ssid, *, security=OPEN, key=None, bssid=None, timeout=5000) -// if security is WPA/WPA2, the key must be a string -/// if security is WEP, the key must be binary STATIC mp_obj_t wlan_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { STATIC const mp_arg_t allowed_args[] = { { MP_QSTR_ssid, MP_ARG_REQUIRED | MP_ARG_OBJ, }, @@ -836,17 +861,16 @@ STATIC mp_obj_t wlan_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_ // get key and its len mp_uint_t key_len = 0; const char *key = NULL; - mp_buffer_info_t wepkey; mp_obj_t key_o = args[2].u_obj; if (key_o != mp_const_none) { - // wep key must be given as raw bytes - if (sec == SL_SEC_TYPE_WEP) { - mp_get_buffer_raise(key_o, &wepkey, MP_BUFFER_READ); - key = wepkey.buf; - key_len = wepkey.len; - } else { - key = mp_obj_str_get_data(key_o, &key_len); - } + key = mp_obj_str_get_data(key_o, &key_len); + } + + if (sec == SL_SEC_TYPE_WEP) { + _u8 wep_key[32]; + wlan_wep_key_unhexlify(key, (char *)&wep_key); + key = (const char *)&wep_key; + key_len /= 2; } // get bssid diff --git a/docs/library/network.rst b/docs/library/network.rst index 8957b263c8..99a300dbec 100644 --- a/docs/library/network.rst +++ b/docs/library/network.rst @@ -272,7 +272,8 @@ class WLAN - ``security`` can be ``WLAN.OPEN``, ``WLAN.WEP``, ``WLAN.WPA`` or ``WLAN.WPA2``. Only needed when mode is ``WLAN.AP``. - ``key`` is a string with the network password. Not needed when mode is ``WLAN.STA`` - or security is ``WLAN.OPEN``. + or security is ``WLAN.OPEN``. If ``security`` is ``WLAN.WEP`` the key must be a + string representing hexadecimal values (e.g. 'ABC1DE45BF'). - ``channel`` a number in the range 1-11. Only needed when mode is ``WLAN.AP``. - ``antenna`` selects between the internal and the external antenna. Can be either ``WLAN.INTERNAL`` or ``WLAN.EXTERNAL``. @@ -295,6 +296,8 @@ class WLAN Connect to a wifi access point using the given SSID, and other security parameters. + - ``key`` is always a string, but if ``security`` is ``WLAN.WEP`` the key must be a string + representing hexadecimal values (e.g. 'ABC1DE45BF'). - ``bssid`` is the MAC address of the AP to connect to. Useful when there are several APs with the same ssid. - ``timeout`` is the maximum time in milliseconds to wait for the connection to succeed.