source: branches/backfire/package/hostapd/patches/340-madwifi_key_fixes.patch @ 26370

Last change on this file since 26370 was 26370, checked in by nbd, 5 years ago

backport mac80211, hostapd, iw, crda from trunk as of r26369

File size: 2.4 KB
  • src/drivers/driver_madwifi.c

    a b madwifi_set_key(const char *ifname, void 
    439439                   __func__, alg, ether_sprintf(addr), key_idx); 
    440440 
    441441        if (alg == WPA_ALG_WEP) 
     442        { 
    442443                cipher = IEEE80211_CIPHER_WEP; 
     444                if ((!addr || !memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN)) && drv->wext) 
     445                        return wpa_driver_wext_set_key(ifname, drv->wext, alg, addr, key_idx, set_tx, seq, seq_len, key, key_len); 
     446        } 
    443447        else if (alg == WPA_ALG_TKIP) 
    444448                cipher = IEEE80211_CIPHER_TKIP; 
    445449        else if (alg == WPA_ALG_CCMP) 
    madwifi_set_key(const char *ifname, void 
    458462 
    459463        memset(&wk, 0, sizeof(wk)); 
    460464        wk.ik_type = cipher; 
    461         wk.ik_flags = IEEE80211_KEY_RECV | IEEE80211_KEY_XMIT; 
    462         if (addr == NULL || is_broadcast_ether_addr(addr)) { 
    463                 memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN); 
     465        wk.ik_flags = IEEE80211_KEY_RECV; 
     466        if (set_tx) 
     467                wk.ik_flags |= IEEE80211_KEY_XMIT; 
     468        if (addr == NULL) { 
     469                os_memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN); 
    464470                wk.ik_keyix = key_idx; 
    465                 wk.ik_flags |= IEEE80211_KEY_DEFAULT; 
    466         } else if (!memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN)) { 
    467                 wk.ik_flags |= IEEE80211_KEY_GROUP; 
    468                 memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); 
    469471        } else { 
    470                 memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); 
    471                 wk.ik_keyix = IEEE80211_KEYIX_NONE; 
     472                os_memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); 
     473                /* 
     474                 * Deduce whether group/global or unicast key by checking 
     475                 * the address (yech).  Note also that we can only mark global 
     476                 * keys default; doing this for a unicast key is an error. 
     477                 */ 
     478                if (os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", 
     479                              IEEE80211_ADDR_LEN) == 0) { 
     480                        wk.ik_flags |= IEEE80211_KEY_GROUP; 
     481                        wk.ik_keyix = key_idx; 
     482                } else { 
     483                        wk.ik_keyix = key_idx == 0 ? IEEE80211_KEYIX_NONE : 
     484                                key_idx; 
     485                } 
    472486        } 
     487        if (wk.ik_keyix != IEEE80211_KEYIX_NONE && set_tx) 
     488                wk.ik_flags |= IEEE80211_KEY_DEFAULT; 
    473489        wk.ik_keylen = key_len; 
    474490        memcpy(wk.ik_keydata, key, key_len); 
     491#ifdef WORDS_BIGENDIAN 
     492#define WPA_KEY_RSC_LEN 8 
     493        { 
     494                size_t i; 
     495                u8 tmp[WPA_KEY_RSC_LEN]; 
     496                os_memset(tmp, 0, sizeof(tmp)); 
     497                for (i = 0; i < seq_len; i++) 
     498                        tmp[WPA_KEY_RSC_LEN - i - 1] = seq[i]; 
     499                os_memcpy(&wk.ik_keyrsc, tmp, WPA_KEY_RSC_LEN); 
     500        } 
     501#else /* WORDS_BIGENDIAN */ 
     502        os_memcpy(&wk.ik_keyrsc, seq, seq_len); 
     503#endif /* WORDS_BIGENDIAN */ 
    475504 
    476505        ret = set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk)); 
    477506        if (ret < 0) { 
Note: See TracBrowser for help on using the repository browser.