source: trunk/package/hostapd/patches/400-madwifi_key_fixes.patch @ 23933

Last change on this file since 23933 was 23933, checked in by nbd, 6 years ago

hostapd: add some wpa related madwifi fixes

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

    a b madwifi_set_key(const char *ifname, void 
    438438        wpa_printf(MSG_DEBUG, "%s: alg=%d addr=%s key_idx=%d", 
    439439                   __func__, alg, ether_sprintf(addr), key_idx); 
    440440 
    441         if (alg == WPA_ALG_WEP) 
     441        if (alg == WPA_ALG_WEP) { 
    442442                cipher = IEEE80211_CIPHER_WEP; 
    443         else if (alg == WPA_ALG_TKIP) 
     443                if (!addr || !memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN)) 
     444                        return wpa_driver_wext_set_key(ifname, drv->wext, alg, addr, key_idx, set_tx, seq, seq_len, key, key_len); 
     445        } else if (alg == WPA_ALG_TKIP) 
    444446                cipher = IEEE80211_CIPHER_TKIP; 
    445447        else if (alg == WPA_ALG_CCMP) 
    446448                cipher = IEEE80211_CIPHER_AES_CCM; 
    madwifi_set_key(const char *ifname, void 
    464466                memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN); 
    465467                wk.ik_keyix = key_idx; 
    466468                wk.ik_flags |= IEEE80211_KEY_DEFAULT; 
     469                wk.ik_flags |= IEEE80211_KEY_GROUP; 
    467470        } else if (!memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN)) { 
     471                wk.ik_keyix = key_idx; 
    468472                wk.ik_flags |= IEEE80211_KEY_GROUP; 
    469                 memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); 
     473                memset(wk.ik_macaddr, 0, IEEE80211_ADDR_LEN); 
    470474        } else { 
    471475                memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); 
    472476                wk.ik_keyix = IEEE80211_KEYIX_NONE; 
    473477        } 
    474478        wk.ik_keylen = key_len; 
    475479        memcpy(wk.ik_keydata, key, key_len); 
     480#ifdef WORDS_BIGENDIAN 
     481#define WPA_KEY_RSC_LEN 8 
     482        { 
     483                size_t i; 
     484                u8 tmp[WPA_KEY_RSC_LEN]; 
     485                os_memset(tmp, 0, sizeof(tmp)); 
     486                for (i = 0; i < seq_len; i++) 
     487                        tmp[WPA_KEY_RSC_LEN - i - 1] = seq[i]; 
     488                os_memcpy(&wk.ik_keyrsc, tmp, WPA_KEY_RSC_LEN); 
     489        } 
     490#else /* WORDS_BIGENDIAN */ 
     491        os_memcpy(&wk.ik_keyrsc, seq, seq_len); 
     492#endif /* WORDS_BIGENDIAN */ 
    476493 
    477494        ret = set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk)); 
    478495        if (ret < 0) { 
Note: See TracBrowser for help on using the repository browser.