Ticket #11352: wpa_supplicant.sh.patch

File wpa_supplicant.sh.patch, 6.2 KB (added by sshore@…, 4 years ago)
  • package/hostapd/files/wpa_supplicant.sh

     
    33        local driver="$2" 
    44        local key="$key" 
    55        local options="$3" 
    6         local freq="" 
    7         [ -n "$4" ] && freq="frequency=$4" 
     6        local freq="$4" 
    87 
    98        # wpa_supplicant should use wext for mac80211 cards 
    109        [ "$driver" = "mac80211" ] && driver='wext' 
    1110 
    1211        # make sure we have the encryption type and the psk 
    13         [ -n "$enc" ] || { 
    14                 config_get enc "$vif" encryption 
    15         } 
    16         [ -n "$key" ] || { 
    17                 config_get key "$vif" key 
    18         } 
     12        local encryption key enc_mode ciphers 
     13        config_get encryption "$vif" encryption 
     14        config_get key "$vif" key 
     15        enc_mode=${encryption%%+*} 
     16        ciphers=${encryption#$enc_mode} 
    1917 
    2018        local net_cfg bridge 
    2119        config_get bridge "$vif" bridge 
     
    3331                echo "wpa_supplicant_setup_vif($ifname): Refusing to bridge $mode mode interface" 
    3432                return 1 
    3533        } 
    36         [ "$mode" = "adhoc" ] && modestr="mode=1" 
     34        [ "$mode" = "adhoc" ] && modestr="1" 
    3735 
    38         key_mgmt='NONE' 
    39         case "$enc" in 
    40                 *none*) ;; 
    41                 *wep*) 
    42                         config_get key "$vif" key 
    43                         key="${key:-1}" 
    44                         case "$key" in 
    45                                 [1234]) 
    46                                         for idx in 1 2 3 4; do 
    47                                                 local zidx 
    48                                                 zidx=$(($idx - 1)) 
    49                                                 config_get ckey "$vif" "key${idx}" 
    50                                                 [ -n "$ckey" ] && \ 
    51                                                         append "wep_key${zidx}" "wep_key${zidx}=$(prepare_key_wep "$ckey")" 
    52                                         done 
    53                                         wep_tx_keyidx="wep_tx_keyidx=$((key - 1))" 
     36        # set key mgmt 
     37        [ "$mode" = "adhoc" -a "$driver" != "nl80211" ] && key_mgmt='WPA-NONE' 
     38        case "$enc_mode" in 
     39                psk|psk2|mixed-psk)     key_mgmt='WPA-PSK' ;; 
     40                wpa|wpa2|mixed-wpa)     key_mgmt='WPA-EAP' ;; 
     41                none|wep|*)             key_mgmt='NONE' ;; 
     42        esac 
     43 
     44        # set WEP parameters 
     45        if [ "$enc_mode" = "wep" ]; then 
     46                config_get key "$vif" key 
     47                key="${key:-1}" 
     48                case "$key" in 
     49                        [1234]) 
     50                                for idx in 1 2 3 4; do 
     51                                        local zidx 
     52                                        zidx=$(($idx - 1)) 
     53                                        config_get ckey "$vif" "key${idx}" 
     54                                        [ -n "$ckey" ] && \ 
     55                                                append "wep_key${zidx}" "wep_key${zidx}=$(prepare_key_wep "$ckey")" 
     56                                done 
     57                                wep_tx_keyidx="wep_tx_keyidx=$((key - 1))" 
     58                        ;; 
     59                        *) 
     60                                wep_key0="wep_key0=$(prepare_key_wep "$key")" 
     61                                wep_tx_keyidx="wep_tx_keyidx=0" 
     62                        ;; 
     63                esac 
     64        fi 
     65 
     66        # set WPA parameters 
     67        if [ $key_mgmt = 'WPA-PSK' -o $key_mgmt = 'WPA-EAP' ]; then 
     68                # set proto 
     69                case "$enc_mode" in 
     70                        psk|wpa)                proto='WPA' ;; 
     71                        psk2|wpa2)              proto='WPA2' ;; 
     72                        mixed-psk|mixed-wpa)    proto='WPA WPA2' ;; 
     73                esac 
     74 
     75                # set ciphers 
     76                if [ -z "${ciphers}" ]; then 
     77                        case ${enc_mode} in 
     78                                psk|wpa)                ciphers=tkip ;; 
     79                                psk2|wpa2)              ciphers=ccmp ;; 
     80                                mixed-psk|mixed-wpa)    ciphers=tkip+ccmp ;; 
     81                        esac 
     82                fi 
     83                IFS="+" 
     84                for cipher in $ciphers; do 
     85                        case $cipher in 
     86                                ccmp|aes) 
     87                                        pairwise="$pairwise CCMP" 
     88                                        group="$group CCMP" 
    5489                                ;; 
    55                                 *) 
    56                                         wep_key0="wep_key0=$(prepare_key_wep "$key")" 
    57                                         wep_tx_keyidx="wep_tx_keyidx=0" 
     90                                tkip) 
     91                                        pairwise="$pairwise TKIP" 
     92                                        group="$group TKIP" 
    5893                                ;; 
    5994                        esac 
    60                 ;; 
    61                 *psk*) 
    62                         key_mgmt='WPA-PSK' 
    63                         [ "$mode" = "adhoc" -a "$driver" != "nl80211" ] && key_mgmt='WPA-NONE' 
     95                done 
     96                unset IFS 
     97                pairwise=${pairwise# } 
     98                group=${group# } 
     99 
     100                # set WPA PSK parameters 
     101                if [ "$key_mgmt" = "WPA-PSK" ]; then 
     102                        config_get key "$vif" key 
    64103                        config_get_bool usepassphrase "$vif" usepassphrase 1 
     104                        passphrase="${key}" 
    65105                        if [ "$usepassphrase" = "1" ]; then 
    66                                 passphrase="psk=\"${key}\"" 
    67                         else 
    68                                 passphrase="psk=${key}" 
     106                                passphrase="\"$passphrase\"" 
    69107                        fi 
    70                         case "$enc" in 
    71                                 *psk2*) 
    72                                         proto='proto=RSN' 
    73                                         config_get ieee80211w "$vif" ieee80211w 
    74                                 ;; 
    75                                 *psk*) 
    76                                         proto='proto=WPA' 
    77                                 ;; 
    78                         esac 
    79                 ;; 
    80                 *wpa*|*8021x*) 
    81                         proto='proto=WPA2' 
    82                         key_mgmt='WPA-EAP' 
    83                         config_get ieee80211w "$vif" ieee80211w 
     108                fi 
     109 
     110                # set WPA EAP parameters 
     111                if [ "$key_mgmt" = "WPA-EAP" ]; then 
    84112                        config_get ca_cert "$vif" ca_cert 
    85113                        config_get eap_type "$vif" eap_type 
    86                         ca_cert=${ca_cert:+"ca_cert=\"$ca_cert\""} 
    87114                        case "$eap_type" in 
    88115                                tls) 
    89                                         pairwise='pairwise=CCMP' 
    90                                         group='group=CCMP' 
    91116                                        config_get identity "$vif" identity 
    92117                                        config_get client_cert "$vif" client_cert 
    93118                                        config_get priv_key "$vif" priv_key 
    94119                                        config_get priv_key_pwd "$vif" priv_key_pwd 
    95                                         identity="identity=\"$identity\"" 
    96                                         client_cert="client_cert=\"$client_cert\"" 
    97                                         priv_key="private_key=\"$priv_key\"" 
    98                                         priv_key_pwd="private_key_passwd=\"$priv_key_pwd\"" 
    99120                                ;; 
    100121                                peap|ttls) 
    101122                                        config_get auth "$vif" auth 
    102123                                        config_get identity "$vif" identity 
    103124                                        config_get password "$vif" password 
    104                                         phase2="phase2=\"auth=${auth:-MSCHAPV2}\"" 
    105                                         identity="identity=\"$identity\"" 
    106                                         password="password=\"$password\"" 
    107125                                ;; 
    108126                        esac 
    109                         eap_type="eap=$(echo $eap_type | tr 'a-z' 'A-Z')" 
    110                 ;; 
    111         esac 
     127                        eap_type="$(echo $eap_type | tr 'a-z' 'A-Z')" 
     128                fi 
     129         
     130                # set 802.11w parameter 
     131                config_get ieee80211w "$vif" ieee80211w 
     132        fi 
    112133 
    113         case "$ieee80211w" in 
    114                 [012]) 
    115                         ieee80211w="ieee80211w=$ieee80211w" 
    116                 ;; 
    117         esac 
    118  
    119134        config_get ifname "$vif" ifname 
    120135        config_get bridge "$vif" bridge 
    121136        config_get ssid "$vif" ssid 
    122137        config_get bssid "$vif" bssid 
     138 
     139        # expand parameters for use in config file 
     140        modestr=${modestr:+"mode=$modestr"} 
     141        ssid="ssid=\"${ssid:?}\"" 
    123142        bssid=${bssid:+"bssid=$bssid"} 
     143        key_mgmt="key_mgmt=${key_mgmt:?}" 
     144        proto=${proto:+"proto=$proto"} 
     145        freq=${freq:+"frequency=$freq"} 
     146        ieee80211w=${ieee80211w:+"ieee80211w=$ieee80211w"} 
     147        passphrase=${passphrase:+"psk=$passphrase"} 
     148        pairwise=${pairwise:+"pairwise=$pairwise"} 
     149        group=${group:+"group=$group"} 
     150        eap_type=${eap_type:+"eap=$eap_type"} 
     151        ca_cert=${ca_cert:+"ca_cert=\"$ca_cert\""} 
     152        client_cert=${client_cert:+"client_cert=\"$client_cert\""} 
     153        priv_key=${priv_key:+"private_key=\"$priv_key\""} 
     154        priv_key_pwd=${priv_key_pwd:+"private_key_passwd=\"${priv_key_pwd}\""} 
     155        phase2=${phase2:+"phase2=\"auth=${auth:-"MSCHAPV2"}\""} 
     156        identity=${identity:+"identity=\"$identity\""} 
     157        password=${password:+"password=\"$password\""} 
     158 
    124159        rm -rf /var/run/wpa_supplicant-$ifname 
    125160        cat > /var/run/wpa_supplicant-$ifname.conf <<EOF 
    126161ctrl_interface=/var/run/wpa_supplicant-$ifname 
    127162network={ 
    128163        $modestr 
    129164        scan_ssid=1 
    130         ssid="$ssid" 
     165        $ssid 
    131166        $bssid 
    132         key_mgmt=$key_mgmt 
     167        $key_mgmt 
    133168        $proto 
    134169        $freq 
    135170        $ieee80211w