Changeset 27552


Ignore:
Timestamp:
2011-07-08T07:20:03+02:00 (7 years ago)
Author:
nbd
Message:

mac80211: add pending crypto bugfixes

Location:
trunk/package/mac80211/patches
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/300-pending_work.patch

    r27433 r27552  
    533533        ts->ts_tstamp = ads->status4; 
    534534        ts->ts_status = 0; 
     535--- a/net/mac80211/wpa.c 
     536+++ b/net/mac80211/wpa.c 
     537@@ -15,6 +15,7 @@ 
     538 #include <linux/gfp.h> 
     539 #include <asm/unaligned.h> 
     540 #include <net/mac80211.h> 
     541+#include <crypto/aes.h> 
     542  
     543 #include "ieee80211_i.h" 
     544 #include "michael.h" 
     545@@ -86,6 +87,11 @@ ieee80211_rx_h_michael_mic_verify(struct 
     546        struct sk_buff *skb = rx->skb; 
     547        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 
     548        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     549+       int queue = rx->queue; 
     550+ 
     551+       /* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */ 
     552+       if (rx->queue == NUM_RX_DATA_QUEUES - 1) 
     553+               queue = 0; 
     554  
     555        /* 
     556         * it makes no sense to check for MIC errors on anything other 
     557@@ -148,8 +154,8 @@ ieee80211_rx_h_michael_mic_verify(struct 
     558  
     559 update_iv: 
     560        /* update IV in key information to be able to detect replays */ 
     561-       rx->key->u.tkip.rx[rx->queue].iv32 = rx->tkip_iv32; 
     562-       rx->key->u.tkip.rx[rx->queue].iv16 = rx->tkip_iv16; 
     563+       rx->key->u.tkip.rx[queue].iv32 = rx->tkip_iv32; 
     564+       rx->key->u.tkip.rx[queue].iv16 = rx->tkip_iv16; 
     565  
     566        return RX_CONTINUE; 
     567  
     568@@ -165,6 +171,7 @@ static int tkip_encrypt_skb(struct ieee8 
     569        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 
     570        struct ieee80211_key *key = tx->key; 
     571        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     572+       unsigned long flags; 
     573        unsigned int hdrlen; 
     574        int len, tail; 
     575        u8 *pos; 
     576@@ -192,11 +199,12 @@ static int tkip_encrypt_skb(struct ieee8 
     577        pos += hdrlen; 
     578  
     579        /* Increase IV for the frame */ 
     580+       spin_lock_irqsave(&key->u.tkip.txlock, flags); 
     581        key->u.tkip.tx.iv16++; 
     582        if (key->u.tkip.tx.iv16 == 0) 
     583                key->u.tkip.tx.iv32++; 
     584- 
     585-       pos = ieee80211_tkip_add_iv(pos, key, key->u.tkip.tx.iv16); 
     586+       pos = ieee80211_tkip_add_iv(pos, key); 
     587+       spin_unlock_irqrestore(&key->u.tkip.txlock, flags); 
     588  
     589        /* hwaccel - with software IV */ 
     590        if (info->control.hw_key) 
     591@@ -205,9 +213,8 @@ static int tkip_encrypt_skb(struct ieee8 
     592        /* Add room for ICV */ 
     593        skb_put(skb, TKIP_ICV_LEN); 
     594  
     595-       hdr = (struct ieee80211_hdr *) skb->data; 
     596        return ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm, 
     597-                                          key, pos, len, hdr->addr2); 
     598+                                          key, skb, pos, len); 
     599 } 
     600  
     601  
     602@@ -235,6 +242,11 @@ ieee80211_crypto_tkip_decrypt(struct iee 
     603        struct ieee80211_key *key = rx->key; 
     604        struct sk_buff *skb = rx->skb; 
     605        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 
     606+       int queue = rx->queue; 
     607+ 
     608+       /* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */ 
     609+       if (rx->queue == NUM_RX_DATA_QUEUES - 1) 
     610+               queue = 0; 
     611  
     612        hdrlen = ieee80211_hdrlen(hdr->frame_control); 
     613  
     614@@ -255,7 +267,7 @@ ieee80211_crypto_tkip_decrypt(struct iee 
     615        res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm, 
     616                                          key, skb->data + hdrlen, 
     617                                          skb->len - hdrlen, rx->sta->sta.addr, 
     618-                                         hdr->addr1, hwaccel, rx->queue, 
     619+                                         hdr->addr1, hwaccel, queue, 
     620                                          &rx->tkip_iv32, 
     621                                          &rx->tkip_iv16); 
     622        if (res != TKIP_DECRYPT_OK) 
     623@@ -283,6 +295,8 @@ static void ccmp_special_blocks(struct s 
     624        unsigned int hdrlen; 
     625        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     626  
     627+       memset(scratch, 0, 6 * AES_BLOCK_LEN); 
     628+ 
     629        b_0 = scratch + 3 * AES_BLOCK_LEN; 
     630        aad = scratch + 4 * AES_BLOCK_LEN; 
     631  
     632@@ -373,8 +387,10 @@ static int ccmp_encrypt_skb(struct ieee8 
     633        struct ieee80211_key *key = tx->key; 
     634        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     635        int hdrlen, len, tail; 
     636-       u8 *pos, *pn; 
     637-       int i; 
     638+       u8 *pos; 
     639+       u8 pn[6]; 
     640+       u64 pn64; 
     641+       u8 scratch[6 * AES_BLOCK_LEN]; 
     642  
     643        if (info->control.hw_key && 
     644            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { 
     645@@ -402,14 +418,14 @@ static int ccmp_encrypt_skb(struct ieee8 
     646        hdr = (struct ieee80211_hdr *) pos; 
     647        pos += hdrlen; 
     648  
     649-       /* PN = PN + 1 */ 
     650-       pn = key->u.ccmp.tx_pn; 
     651+       pn64 = atomic64_inc_return(&key->u.ccmp.tx_pn); 
     652  
     653-       for (i = CCMP_PN_LEN - 1; i >= 0; i--) { 
     654-               pn[i]++; 
     655-               if (pn[i]) 
     656-                       break; 
     657-       } 
     658+       pn[5] = pn64; 
     659+       pn[4] = pn64 >> 8; 
     660+       pn[3] = pn64 >> 16; 
     661+       pn[2] = pn64 >> 24; 
     662+       pn[1] = pn64 >> 32; 
     663+       pn[0] = pn64 >> 40; 
     664  
     665        ccmp_pn2hdr(pos, pn, key->conf.keyidx); 
     666  
     667@@ -418,8 +434,8 @@ static int ccmp_encrypt_skb(struct ieee8 
     668                return 0; 
     669  
     670        pos += CCMP_HDR_LEN; 
     671-       ccmp_special_blocks(skb, pn, key->u.ccmp.tx_crypto_buf, 0); 
     672-       ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, key->u.ccmp.tx_crypto_buf, pos, len, 
     673+       ccmp_special_blocks(skb, pn, scratch, 0); 
     674+       ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len, 
     675                                  pos, skb_put(skb, CCMP_MIC_LEN)); 
     676  
     677        return 0; 
     678@@ -475,11 +491,12 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
     679        } 
     680  
     681        if (!(status->flag & RX_FLAG_DECRYPTED)) { 
     682+               u8 scratch[6 * AES_BLOCK_LEN]; 
     683                /* hardware didn't decrypt/verify MIC */ 
     684-               ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1); 
     685+               ccmp_special_blocks(skb, pn, scratch, 1); 
     686  
     687                if (ieee80211_aes_ccm_decrypt( 
     688-                           key->u.ccmp.tfm, key->u.ccmp.rx_crypto_buf, 
     689+                           key->u.ccmp.tfm, scratch, 
     690                            skb->data + hdrlen + CCMP_HDR_LEN, data_len, 
     691                            skb->data + skb->len - CCMP_MIC_LEN, 
     692                            skb->data + hdrlen + CCMP_HDR_LEN)) 
     693--- a/drivers/net/wireless/b43/xmit.c 
     694+++ b/drivers/net/wireless/b43/xmit.c 
     695@@ -323,8 +323,7 @@ int b43_generate_txhdr(struct b43_wldev  
     696                        /* we give the phase1key and iv16 here, the key is stored in 
     697                         * shm. With that the hardware can do phase 2 and encryption. 
     698                         */ 
     699-                       ieee80211_get_tkip_key(info->control.hw_key, skb_frag, 
     700-                                       IEEE80211_TKIP_P1_KEY, (u8*)phase1key); 
     701+                       ieee80211_get_tkip_p1k(info->control.hw_key, skb_frag, phase1key); 
     702                        /* phase1key is in host endian. Copy to little-endian txhdr->iv. */ 
     703                        for (i = 0; i < 5; i++) { 
     704                                txhdr->iv[i * 2 + 0] = phase1key[i]; 
     705--- a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c 
     706+++ b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c 
     707@@ -240,8 +240,7 @@ static void iwl4965_tx_cmd_build_hwcrypt 
     708  
     709        case WLAN_CIPHER_SUITE_TKIP: 
     710                tx_cmd->sec_ctl = TX_CMD_SEC_TKIP; 
     711-               ieee80211_get_tkip_key(keyconf, skb_frag, 
     712-                       IEEE80211_TKIP_P2_KEY, tx_cmd->key); 
     713+               ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key); 
     714                IWL_DEBUG_TX(priv, "tx_cmd with tkip hwcrypto\n"); 
     715                break; 
     716  
     717--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c 
     718+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c 
     719@@ -497,8 +497,7 @@ static void iwlagn_tx_cmd_build_hwcrypto 
     720  
     721        case WLAN_CIPHER_SUITE_TKIP: 
     722                tx_cmd->sec_ctl = TX_CMD_SEC_TKIP; 
     723-               ieee80211_get_tkip_key(keyconf, skb_frag, 
     724-                       IEEE80211_TKIP_P2_KEY, tx_cmd->key); 
     725+               ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key); 
     726                IWL_DEBUG_TX(priv, "tx_cmd with tkip hwcrypto\n"); 
     727                break; 
     728  
     729--- a/include/net/mac80211.h 
     730+++ b/include/net/mac80211.h 
     731@@ -960,21 +960,6 @@ enum sta_notify_cmd { 
     732 }; 
     733  
     734 /** 
     735- * enum ieee80211_tkip_key_type - get tkip key 
     736- * 
     737- * Used by drivers which need to get a tkip key for skb. Some drivers need a 
     738- * phase 1 key, others need a phase 2 key. A single function allows the driver 
     739- * to get the key, this enum indicates what type of key is required. 
     740- * 
     741- * @IEEE80211_TKIP_P1_KEY: the driver needs a phase 1 key 
     742- * @IEEE80211_TKIP_P2_KEY: the driver needs a phase 2 key 
     743- */ 
     744-enum ieee80211_tkip_key_type { 
     745-       IEEE80211_TKIP_P1_KEY, 
     746-       IEEE80211_TKIP_P2_KEY, 
     747-}; 
     748- 
     749-/** 
     750  * enum ieee80211_hw_flags - hardware flags 
     751  * 
     752  * These flags are used to indicate hardware capabilities to 
     753@@ -2568,21 +2553,33 @@ struct sk_buff * 
     754 ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif); 
     755  
     756 /** 
     757- * ieee80211_get_tkip_key - get a TKIP rc4 for skb 
     758+ * ieee80211_get_tkip_p1k - get a TKIP phase 1 key 
     759+ * 
     760+ * This function returns the TKIP phase 1 key for the IV32 taken 
     761+ * from the given packet. 
     762+ * 
     763+ * @keyconf: the parameter passed with the set key 
     764+ * @skb: the packet to take the IV32 value from that will be encrypted 
     765+ *     with this P1K 
     766+ * @p1k: a buffer to which the key will be written, as 5 u16 values 
     767+ */ 
     768+void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf, 
     769+                           struct sk_buff *skb, u16 *p1k); 
     770+ 
     771+/** 
     772+ * ieee80211_get_tkip_p2k - get a TKIP phase 2 key 
     773  * 
     774- * This function computes a TKIP rc4 key for an skb. It computes 
     775- * a phase 1 key if needed (iv16 wraps around). This function is to 
     776- * be used by drivers which can do HW encryption but need to compute 
     777- * to phase 1/2 key in SW. 
     778+ * This function computes the TKIP RC4 key for the IV values 
     779+ * in the packet. 
     780  * 
     781  * @keyconf: the parameter passed with the set key 
     782- * @skb: the skb for which the key is needed 
     783- * @type: TBD 
     784- * @key: a buffer to which the key will be written 
     785- */ 
     786-void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf, 
     787-                               struct sk_buff *skb, 
     788-                               enum ieee80211_tkip_key_type type, u8 *key); 
     789+ * @skb: the packet to take the IV32/IV16 values from that will be 
     790+ *     encrypted with this key 
     791+ * @p2k: a buffer to which the key will be written, 16 bytes 
     792+ */ 
     793+void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, 
     794+                           struct sk_buff *skb, u8 *p2k); 
     795+ 
     796 /** 
     797  * ieee80211_wake_queue - wake specific queue 
     798  * @hw: pointer as obtained from ieee80211_alloc_hw(). 
     799--- a/net/mac80211/key.c 
     800+++ b/net/mac80211/key.c 
     801@@ -333,6 +333,7 @@ struct ieee80211_key *ieee80211_key_allo 
     802                                        get_unaligned_le16(seq); 
     803                        } 
     804                } 
     805+               spin_lock_init(&key->u.tkip.txlock); 
     806                break; 
     807        case WLAN_CIPHER_SUITE_CCMP: 
     808                key->conf.iv_len = CCMP_HDR_LEN; 
     809--- a/net/mac80211/key.h 
     810+++ b/net/mac80211/key.h 
     811@@ -52,9 +52,10 @@ enum ieee80211_internal_tkip_state { 
     812 }; 
     813  
     814 struct tkip_ctx { 
     815-       u32 iv32; 
     816-       u16 iv16; 
     817-       u16 p1k[5]; 
     818+       u32 iv32;       /* current iv32 */ 
     819+       u16 iv16;       /* current iv16 */ 
     820+       u16 p1k[5];     /* p1k cache */ 
     821+       u32 p1k_iv32;   /* iv32 for which p1k computed */ 
     822        enum ieee80211_internal_tkip_state state; 
     823 }; 
     824  
     825@@ -71,6 +72,9 @@ struct ieee80211_key { 
     826  
     827        union { 
     828                struct { 
     829+                       /* protects tx context */ 
     830+                       spinlock_t txlock; 
     831+ 
     832                        /* last used TSC */ 
     833                        struct tkip_ctx tx; 
     834  
     835@@ -78,7 +82,7 @@ struct ieee80211_key { 
     836                        struct tkip_ctx rx[NUM_RX_DATA_QUEUES]; 
     837                } tkip; 
     838                struct { 
     839-                       u8 tx_pn[6]; 
     840+                       atomic64_t tx_pn; 
     841                        /* 
     842                         * Last received packet number. The first 
     843                         * NUM_RX_DATA_QUEUES counters are used with Data 
     844@@ -88,12 +92,9 @@ struct ieee80211_key { 
     845                        u8 rx_pn[NUM_RX_DATA_QUEUES + 1][6]; 
     846                        struct crypto_cipher *tfm; 
     847                        u32 replays; /* dot11RSNAStatsCCMPReplays */ 
     848-                       /* scratch buffers for virt_to_page() (crypto API) */ 
     849 #ifndef AES_BLOCK_LEN 
     850 #define AES_BLOCK_LEN 16 
     851 #endif 
     852-                       u8 tx_crypto_buf[6 * AES_BLOCK_LEN]; 
     853-                       u8 rx_crypto_buf[6 * AES_BLOCK_LEN]; 
     854                } ccmp; 
     855                struct { 
     856                        u8 tx_pn[6]; 
     857--- a/net/mac80211/tkip.c 
     858+++ b/net/mac80211/tkip.c 
     859@@ -101,6 +101,7 @@ static void tkip_mixing_phase1(const u8  
     860                p1k[4] += tkipS(p1k[3] ^ get_unaligned_le16(tk + 0 + j)) + i; 
     861        } 
     862        ctx->state = TKIP_STATE_PHASE1_DONE; 
     863+       ctx->p1k_iv32 = tsc_IV32; 
     864 } 
     865  
     866 static void tkip_mixing_phase2(const u8 *tk, struct tkip_ctx *ctx, 
     867@@ -140,60 +141,72 @@ static void tkip_mixing_phase2(const u8  
     868 /* Add TKIP IV and Ext. IV at @pos. @iv0, @iv1, and @iv2 are the first octets 
     869  * of the IV. Returns pointer to the octet following IVs (i.e., beginning of 
     870  * the packet payload). */ 
     871-u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16) 
     872+u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key) 
     873 { 
     874-       pos = write_tkip_iv(pos, iv16); 
     875+       lockdep_assert_held(&key->u.tkip.txlock); 
     876+ 
     877+       pos = write_tkip_iv(pos, key->u.tkip.tx.iv16); 
     878        *pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */; 
     879        put_unaligned_le32(key->u.tkip.tx.iv32, pos); 
     880        return pos + 4; 
     881 } 
     882  
     883-void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf, 
     884-                       struct sk_buff *skb, enum ieee80211_tkip_key_type type, 
     885-                       u8 *outkey) 
     886+static void ieee80211_compute_tkip_p1k(struct ieee80211_key *key, u32 iv32) 
     887 { 
     888-       struct ieee80211_key *key = (struct ieee80211_key *) 
     889-                       container_of(keyconf, struct ieee80211_key, conf); 
     890-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     891-       u8 *data; 
     892-       const u8 *tk; 
     893-       struct tkip_ctx *ctx; 
     894-       u16 iv16; 
     895-       u32 iv32; 
     896- 
     897-       data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); 
     898-       iv16 = data[2] | (data[0] << 8); 
     899-       iv32 = get_unaligned_le32(&data[4]); 
     900- 
     901-       tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
     902-       ctx = &key->u.tkip.tx; 
     903- 
     904-#ifdef CONFIG_MAC80211_TKIP_DEBUG 
     905-       printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n", 
     906-                       iv16, iv32); 
     907+       struct ieee80211_sub_if_data *sdata = key->sdata; 
     908+       struct tkip_ctx *ctx = &key->u.tkip.tx; 
     909+       const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
     910  
     911-       if (iv32 != ctx->iv32) { 
     912-               printk(KERN_DEBUG "skb: iv32 = 0x%08x key: iv32 = 0x%08x\n", 
     913-                       iv32, ctx->iv32); 
     914-               printk(KERN_DEBUG "Wrap around of iv16 in the middle of a " 
     915-                       "fragmented packet\n"); 
     916-       } 
     917-#endif 
     918+       lockdep_assert_held(&key->u.tkip.txlock); 
     919  
     920-       /* Update the p1k only when the iv16 in the packet wraps around, this 
     921-        * might occur after the wrap around of iv16 in the key in case of 
     922-        * fragmented packets. */ 
     923-       if (iv16 == 0 || ctx->state == TKIP_STATE_NOT_INIT) 
     924-               tkip_mixing_phase1(tk, ctx, hdr->addr2, iv32); 
     925+       /* 
     926+        * Update the P1K when the IV32 is different from the value it 
     927+        * had when we last computed it (or when not initialised yet). 
     928+        * This might flip-flop back and forth if packets are processed 
     929+        * out-of-order due to the different ACs, but then we have to 
     930+        * just compute the P1K more often. 
     931+        */ 
     932+       if (ctx->p1k_iv32 != iv32 || ctx->state == TKIP_STATE_NOT_INIT) 
     933+               tkip_mixing_phase1(tk, ctx, sdata->vif.addr, iv32); 
     934+} 
     935  
     936-       if (type == IEEE80211_TKIP_P1_KEY) { 
     937-               memcpy(outkey, ctx->p1k, sizeof(u16) * 5); 
     938-               return; 
     939-       } 
     940+void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf, 
     941+                           struct sk_buff *skb, u16 *p1k) 
     942+{ 
     943+       struct ieee80211_key *key = (struct ieee80211_key *) 
     944+                       container_of(keyconf, struct ieee80211_key, conf); 
     945+       struct tkip_ctx *ctx = &key->u.tkip.tx; 
     946+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     947+       const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); 
     948+       u32 iv32 = get_unaligned_le32(&data[4]); 
     949+       unsigned long flags; 
     950+ 
     951+       spin_lock_irqsave(&key->u.tkip.txlock, flags); 
     952+       ieee80211_compute_tkip_p1k(key, iv32); 
     953+       memcpy(p1k, ctx->p1k, sizeof(ctx->p1k)); 
     954+       spin_unlock_irqrestore(&key->u.tkip.txlock, flags); 
     955+} 
     956+EXPORT_SYMBOL(ieee80211_get_tkip_p1k); 
     957  
     958-       tkip_mixing_phase2(tk, ctx, iv16, outkey); 
     959+void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, 
     960+                           struct sk_buff *skb, u8 *p2k) 
     961+{ 
     962+       struct ieee80211_key *key = (struct ieee80211_key *) 
     963+                       container_of(keyconf, struct ieee80211_key, conf); 
     964+       const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
     965+       struct tkip_ctx *ctx = &key->u.tkip.tx; 
     966+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     967+       const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); 
     968+       u32 iv32 = get_unaligned_le32(&data[4]); 
     969+       u16 iv16 = data[2] | (data[0] << 8); 
     970+       unsigned long flags; 
     971+ 
     972+       spin_lock_irqsave(&key->u.tkip.txlock, flags); 
     973+       ieee80211_compute_tkip_p1k(key, iv32); 
     974+       tkip_mixing_phase2(tk, ctx, iv16, p2k); 
     975+       spin_unlock_irqrestore(&key->u.tkip.txlock, flags); 
     976 } 
     977-EXPORT_SYMBOL(ieee80211_get_tkip_key); 
     978+EXPORT_SYMBOL(ieee80211_get_tkip_p2k); 
     979  
     980 /* 
     981  * Encrypt packet payload with TKIP using @key. @pos is a pointer to the 
     982@@ -204,19 +217,15 @@ EXPORT_SYMBOL(ieee80211_get_tkip_key); 
     983  */ 
     984 int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm, 
     985                                struct ieee80211_key *key, 
     986-                               u8 *pos, size_t payload_len, u8 *ta) 
     987+                               struct sk_buff *skb, 
     988+                               u8 *payload, size_t payload_len) 
     989 { 
     990        u8 rc4key[16]; 
     991-       struct tkip_ctx *ctx = &key->u.tkip.tx; 
     992-       const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
     993- 
     994-       /* Calculate per-packet key */ 
     995-       if (ctx->iv16 == 0 || ctx->state == TKIP_STATE_NOT_INIT) 
     996-               tkip_mixing_phase1(tk, ctx, ta, ctx->iv32); 
     997  
     998-       tkip_mixing_phase2(tk, ctx, ctx->iv16, rc4key); 
     999+       ieee80211_get_tkip_p2k(&key->conf, skb, rc4key); 
     1000  
     1001-       return ieee80211_wep_encrypt_data(tfm, rc4key, 16, pos, payload_len); 
     1002+       return ieee80211_wep_encrypt_data(tfm, rc4key, 16, 
     1003+                                         payload, payload_len); 
     1004 } 
     1005  
     1006 /* Decrypt packet payload with TKIP using @key. @pos is a pointer to the 
     1007--- a/net/mac80211/tkip.h 
     1008+++ b/net/mac80211/tkip.h 
     1009@@ -13,11 +13,13 @@ 
     1010 #include <linux/crypto.h> 
     1011 #include "key.h" 
     1012  
     1013-u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16); 
     1014+u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key); 
     1015  
     1016 int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm, 
     1017-                                struct ieee80211_key *key, 
     1018-                                u8 *pos, size_t payload_len, u8 *ta); 
     1019+                               struct ieee80211_key *key, 
     1020+                               struct sk_buff *skb, 
     1021+                               u8 *payload, size_t payload_len); 
     1022+ 
     1023 enum { 
     1024        TKIP_DECRYPT_OK = 0, 
     1025        TKIP_DECRYPT_NO_EXT_IV = -1, 
     1026--- a/net/mac80211/cfg.c 
     1027+++ b/net/mac80211/cfg.c 
     1028@@ -209,6 +209,7 @@ static int ieee80211_get_key(struct wiph 
     1029        u8 seq[6] = {0}; 
     1030        struct key_params params; 
     1031        struct ieee80211_key *key = NULL; 
     1032+       u64 pn64; 
     1033        u32 iv32; 
     1034        u16 iv16; 
     1035        int err = -ENOENT; 
     1036@@ -256,12 +257,13 @@ static int ieee80211_get_key(struct wiph 
     1037                params.seq_len = 6; 
     1038                break; 
     1039        case WLAN_CIPHER_SUITE_CCMP: 
     1040-               seq[0] = key->u.ccmp.tx_pn[5]; 
     1041-               seq[1] = key->u.ccmp.tx_pn[4]; 
     1042-               seq[2] = key->u.ccmp.tx_pn[3]; 
     1043-               seq[3] = key->u.ccmp.tx_pn[2]; 
     1044-               seq[4] = key->u.ccmp.tx_pn[1]; 
     1045-               seq[5] = key->u.ccmp.tx_pn[0]; 
     1046+               pn64 = atomic64_read(&key->u.ccmp.tx_pn); 
     1047+               seq[0] = pn64; 
     1048+               seq[1] = pn64 >> 8; 
     1049+               seq[2] = pn64 >> 16; 
     1050+               seq[3] = pn64 >> 24; 
     1051+               seq[4] = pn64 >> 32; 
     1052+               seq[5] = pn64 >> 40; 
     1053                params.seq = seq; 
     1054                params.seq_len = 6; 
     1055                break; 
     1056--- a/net/mac80211/debugfs_key.c 
     1057+++ b/net/mac80211/debugfs_key.c 
     1058@@ -79,6 +79,7 @@ static ssize_t key_tx_spec_read(struct f 
     1059                                size_t count, loff_t *ppos) 
     1060 { 
     1061        const u8 *tpn; 
     1062+       u64 pn; 
     1063        char buf[20]; 
     1064        int len; 
     1065        struct ieee80211_key *key = file->private_data; 
     1066@@ -94,9 +95,10 @@ static ssize_t key_tx_spec_read(struct f 
     1067                                key->u.tkip.tx.iv16); 
     1068                break; 
     1069        case WLAN_CIPHER_SUITE_CCMP: 
     1070-               tpn = key->u.ccmp.tx_pn; 
     1071+               pn = atomic64_read(&key->u.ccmp.tx_pn); 
     1072                len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 
     1073-                               tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]); 
     1074+                               (u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24), 
     1075+                               (u8)(pn >> 16), (u8)(pn >> 8), (u8)pn); 
     1076                break; 
     1077        case WLAN_CIPHER_SUITE_AES_CMAC: 
     1078                tpn = key->u.aes_cmac.tx_pn; 
  • trunk/package/mac80211/patches/420-mac80211_ignore_invalid_ccmp_rx_pn.patch

    r26912 r27552  
    11--- a/net/mac80211/key.h 
    22+++ b/net/mac80211/key.h 
    3 @@ -86,6 +86,7 @@ struct ieee80211_key { 
     3@@ -90,6 +90,7 @@ struct ieee80211_key { 
    44                         * Management frames. 
    55                         */ 
     
    88                        struct crypto_cipher *tfm; 
    99                        u32 replays; /* dot11RSNAStatsCCMPReplays */ 
    10                         /* scratch buffers for virt_to_page() (crypto API) */ 
     10 #ifndef AES_BLOCK_LEN 
    1111--- a/net/mac80211/wpa.c 
    1212+++ b/net/mac80211/wpa.c 
    13 @@ -441,6 +441,13 @@ ieee80211_crypto_ccmp_encrypt(struct iee 
     13@@ -457,6 +457,13 @@ ieee80211_crypto_ccmp_encrypt(struct iee 
    1414        return TX_CONTINUE; 
    1515 } 
     
    2525 ieee80211_rx_result 
    2626 ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx) 
    27 @@ -453,6 +460,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
     27@@ -469,6 +476,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
    2828        u8 pn[CCMP_PN_LEN]; 
    2929        int data_len; 
     
    3333        hdrlen = ieee80211_hdrlen(hdr->frame_control); 
    3434  
    35 @@ -486,6 +494,11 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
     35@@ -503,6 +511,11 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
    3636                        return RX_DROP_UNUSABLE; 
    3737        } 
Note: See TracChangeset for help on using the changeset viewer.