summaryrefslogtreecommitdiffstatshomepage
path: root/cc3200/mods/modwlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'cc3200/mods/modwlan.c')
-rw-r--r--cc3200/mods/modwlan.c50
1 files changed, 37 insertions, 13 deletions
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