Browse Source

base-files, mac80211 (#6491) - fix wep key handling in iw with mac80211 based drivers - sanitize keys where necessary - put a procedure prepare_key_wep() into /sbin/wifi for use by other driver backends

SVN-Revision: 19118
Jo-Philipp Wich 16 years ago
parent
commit
cb30b52ec1
2 changed files with 37 additions and 14 deletions
  1. 13 0
      package/base-files/files/sbin/wifi
  2. 24 14
      package/mac80211/files/lib/wifi/mac80211.sh

+ 13 - 0
package/base-files/files/sbin/wifi

@@ -34,6 +34,19 @@ bridge_interface() {(
 	[ "$iftype" = bridge ] && config_get "$cfg" ifname
 )}
 
+prepare_key_wep() {
+	local key="$1"
+	local hex=1
+
+	echo -n "$key" | grep -qE "[^a-fA-F0-9]" && hex=0
+	[ "${#key}" -eq 10 -a $hex -eq 1 ] || \
+	[ "${#key}" -eq 26 -a $hex -eq 1 ] || {
+		[ "${key:0:2}" = "s:" ] && key="${key#s:}"
+        	key="$(echo -n "$key" | hexdump -ve '1/1 "%02x" ""')"
+	}
+	echo "$key"
+}
+
 wifi_fixup_hwmode() {
 	local device="$1"
 	local default="$2"

+ 24 - 14
package/mac80211/files/lib/wifi/mac80211.sh

@@ -176,20 +176,30 @@ enable_mac80211() {
 		# configured to handle the wep connection
 		if [ ! "$mode" = "ap" ]; then
 			case "$enc" in
-				wep)
+				*wep*)
 					config_get keymgmt "$vif" keymgmt
-					if [ -n "$keymgmt" ]; then
-						for idx in 1 2 3 4; do
-							local zidx
-							zidx=$(($idx - 1))
-							config_get key "$vif" "key${idx}"
-							if [ -n "$key" ]; then
-								append keystring "${zidx}:${key} "
-							fi
-						done
+					if [ -z "$keymgmt" ]; then
+						config_get key "$vif" key
+						key="${key:-1}"
+						case "$key" in
+							[1234])
+								for idx in 1 2 3 4; do
+									local zidx
+									zidx=$(($idx - 1))
+									config_get ckey "$vif" "key${idx}"
+									if [ -n "$ckey" ]; then
+										[ $idx -eq $key ] && zidx="d:${zidx}"
+										append keystring "${zidx}:$(prepare_key_wep "$ckey")"
+									fi
+								done
+								;;
+							*)
+								keystring="d:0:$(prepare_key_wep "$key")"
+								;;
+						esac
 					fi
 				;;
-				*wpa*|*psk*)
+				*psk*|*wpa*)
 					config_get key "$vif" key
 				;;
 			esac
@@ -241,10 +251,10 @@ enable_mac80211() {
 			sta|mesh)
 				config_get bssid "$vif" bssid
 				case "$enc" in
-					wep)
-						if [ -n "$keymgmt" ]; then
+					*wep*)
+						if [ -z "$keymgmt" ]; then
 							[ -n "$keystring" ] &&
-								iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid key "$keystring"
+								iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid key $keystring
 						else
 							if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
 								wpa_supplicant_setup_vif "$vif" wext || {