Thread: [Madwifi-cvs] madwifi/net80211 ieee80211_crypto.c,1.1.4.1,1.1.4.2 ieee80211_crypto.h,1.1.4.1,1.1.4.2
Status: Beta
Brought to you by:
otaku
From: <sam...@us...> - 2004-02-27 17:09:14
|
Update of /cvsroot/madwifi/madwifi/net80211 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22847 Modified Files: Tag: WPA ieee80211_crypto.c ieee80211_crypto.h ieee80211_input.c Log Message: change software crypto support to honor/use per-station (unicast) keys Index: ieee80211_crypto.c =================================================================== RCS file: /cvsroot/madwifi/madwifi/net80211/Attic/ieee80211_crypto.c,v retrieving revision 1.1.4.1 retrieving revision 1.1.4.2 diff -C2 -d -r1.1.4.1 -r1.1.4.2 *** ieee80211_crypto.c 24 Feb 2004 23:33:21 -0000 1.1.4.1 --- ieee80211_crypto.c 27 Feb 2004 16:52:30 -0000 1.1.4.2 *************** *** 79,87 **** struct sk_buff * ! ieee80211_wep_crypt(struct ieee80211com *ic, struct sk_buff *skb0, int txflag) { struct sk_buff *skb, *n, *n0; struct ieee80211_frame *wh; ! int i, left, len, moff, noff, kid; u_int32_t iv, crc; u_int8_t *ivp; --- 79,89 ---- struct sk_buff * ! ieee80211_wep_crypt(struct ieee80211com *ic, struct ieee80211_node *ni, ! struct sk_buff *skb0, int txflag) { struct sk_buff *skb, *n, *n0; struct ieee80211_frame *wh; ! struct ieee80211_wepkey *key; ! int i, left, len, moff, noff, ismcast, kid; u_int32_t iv, crc; u_int8_t *ivp; *************** *** 122,132 **** noff = sizeof(struct ieee80211_frame); if (txflag) { - kid = ic->ic_wep_txkey; - if (kid == IEEE80211_KEYIX_NONE) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_CRYPTO, - ("no xmit key setup\n")); - /* XXX statistic */ - goto fail; - } wh->i_fc[1] |= IEEE80211_FC1_WEP; iv = ic->ic_iv; --- 124,127 ---- *************** *** 135,140 **** * (B, 255, N) with 3 <= B < 8 */ ! if (iv >= 0x03ff00 && ! (iv & 0xf8ff00) == 0x00ff00) iv += 0x000100; ic->ic_iv = iv + 1; --- 130,134 ---- * (B, 255, N) with 3 <= B < 8 */ ! if (iv >= 0x03ff00 && (iv & 0xf8ff00) == 0x00ff00) iv += 0x000100; ic->ic_iv = iv + 1; *************** *** 145,149 **** iv >>= 8; } ! ivp[IEEE80211_WEP_IVLEN] = kid << 6; /* pad and keyid */ noff += IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN; } else { --- 139,157 ---- iv >>= 8; } ! ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); ! if (ismcast || ni->ni_ucastkeyix == IEEE80211_KEYIX_NONE) { ! kid = ic->ic_wep_txkey; ! if (kid == IEEE80211_KEYIX_NONE) { ! IEEE80211_DPRINTF(ic, IEEE80211_MSG_CRYPTO, ! ("no xmit key setup\n")); ! /* XXX statistic */ ! goto fail; ! } ! ivp[IEEE80211_WEP_IVLEN] = kid << 6;/* pad and keyid */ ! key = &ic->ic_nw_keys[kid]; ! } else { ! ivp[IEEE80211_WEP_IVLEN] = 0; /* pad and keyid */ ! key= &ni->ni_ucastkey; ! } noff += IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN; } else { *************** *** 151,161 **** ivp = skb->data + moff; kid = ivp[IEEE80211_WEP_IVLEN] >> 6; moff += IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN; } memcpy(keybuf, ivp, IEEE80211_WEP_IVLEN); ! memcpy(keybuf + IEEE80211_WEP_IVLEN, ic->ic_nw_keys[kid].wk_key, ! ic->ic_nw_keys[kid].wk_len); ! arc4_setkey(ctx, keybuf, ! IEEE80211_WEP_IVLEN + ic->ic_nw_keys[kid].wk_len); /* encrypt with calculating CRC */ --- 159,172 ---- ivp = skb->data + moff; kid = ivp[IEEE80211_WEP_IVLEN] >> 6; + /* check for station key; fallback to shared key */ + if (kid == 0 && ni->ni_ucastkeyix != IEEE80211_KEYIX_NONE) + key = &ni->ni_ucastkey; + else + key = &ic->ic_nw_keys[kid]; moff += IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN; } memcpy(keybuf, ivp, IEEE80211_WEP_IVLEN); ! memcpy(keybuf + IEEE80211_WEP_IVLEN, key->wk_key, key->wk_len); ! arc4_setkey(ctx, keybuf, IEEE80211_WEP_IVLEN + key->wk_len); /* encrypt with calculating CRC */ Index: ieee80211_crypto.h =================================================================== RCS file: /cvsroot/madwifi/madwifi/net80211/Attic/ieee80211_crypto.h,v retrieving revision 1.1.4.1 retrieving revision 1.1.4.2 diff -C2 -d -r1.1.4.1 -r1.1.4.2 *** ieee80211_crypto.h 24 Feb 2004 23:33:21 -0000 1.1.4.1 --- ieee80211_crypto.h 27 Feb 2004 16:52:30 -0000 1.1.4.2 *************** *** 50,57 **** struct ieee80211com; struct sk_buff; extern void ieee80211_crypto_attach(struct ieee80211com *); extern void ieee80211_crypto_detach(struct ieee80211com *); extern struct sk_buff * ieee80211_wep_crypt(struct ieee80211com *, ! struct sk_buff *skb0, int txflag); #endif /* _NET80211_IEEE80211_CRYPTO_H_ */ --- 50,58 ---- struct ieee80211com; + struct ieee80211_node; struct sk_buff; extern void ieee80211_crypto_attach(struct ieee80211com *); extern void ieee80211_crypto_detach(struct ieee80211com *); extern struct sk_buff * ieee80211_wep_crypt(struct ieee80211com *, ! struct ieee80211_node *, struct sk_buff *skb0, int txflag); #endif /* _NET80211_IEEE80211_CRYPTO_H_ */ Index: ieee80211_input.c =================================================================== RCS file: /cvsroot/madwifi/madwifi/net80211/Attic/ieee80211_input.c,v retrieving revision 1.1.4.1 retrieving revision 1.1.4.2 diff -C2 -d -r1.1.4.1 -r1.1.4.2 *** ieee80211_input.c 24 Feb 2004 23:33:21 -0000 1.1.4.1 --- ieee80211_input.c 27 Feb 2004 16:52:30 -0000 1.1.4.2 *************** *** 330,334 **** */ if (ic->ic_flags & IEEE80211_F_WEPON) { ! skb = ieee80211_wep_crypt(ic, skb, 0); if (skb == NULL) { ic->ic_stats.is_rx_wepfail++; --- 330,334 ---- */ if (ic->ic_flags & IEEE80211_F_WEPON) { ! skb = ieee80211_wep_crypt(ic, ni, skb, 0); if (skb == NULL) { ic->ic_stats.is_rx_wepfail++; |