diff options
Diffstat (limited to 'net/mac80211/wpa.c')
| -rw-r--r-- | net/mac80211/wpa.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index 70778694877b..5332014cb229 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c | |||
| @@ -85,16 +85,16 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx) | |||
| 85 | u8 *data, *key = NULL, key_offset; | 85 | u8 *data, *key = NULL, key_offset; |
| 86 | size_t data_len; | 86 | size_t data_len; |
| 87 | unsigned int hdrlen; | 87 | unsigned int hdrlen; |
| 88 | struct ieee80211_hdr *hdr; | ||
| 89 | u8 mic[MICHAEL_MIC_LEN]; | 88 | u8 mic[MICHAEL_MIC_LEN]; |
| 90 | struct sk_buff *skb = rx->skb; | 89 | struct sk_buff *skb = rx->skb; |
| 90 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | ||
| 91 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | ||
| 91 | int authenticator = 1, wpa_test = 0; | 92 | int authenticator = 1, wpa_test = 0; |
| 92 | 93 | ||
| 93 | /* No way to verify the MIC if the hardware stripped it */ | 94 | /* No way to verify the MIC if the hardware stripped it */ |
| 94 | if (rx->status->flag & RX_FLAG_MMIC_STRIPPED) | 95 | if (status->flag & RX_FLAG_MMIC_STRIPPED) |
| 95 | return RX_CONTINUE; | 96 | return RX_CONTINUE; |
| 96 | 97 | ||
| 97 | hdr = (struct ieee80211_hdr *)skb->data; | ||
| 98 | if (!rx->key || rx->key->conf.alg != ALG_TKIP || | 98 | if (!rx->key || rx->key->conf.alg != ALG_TKIP || |
| 99 | !ieee80211_has_protected(hdr->frame_control) || | 99 | !ieee80211_has_protected(hdr->frame_control) || |
| 100 | !ieee80211_is_data_present(hdr->frame_control)) | 100 | !ieee80211_is_data_present(hdr->frame_control)) |
| @@ -216,6 +216,7 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx) | |||
| 216 | int hdrlen, res, hwaccel = 0, wpa_test = 0; | 216 | int hdrlen, res, hwaccel = 0, wpa_test = 0; |
| 217 | struct ieee80211_key *key = rx->key; | 217 | struct ieee80211_key *key = rx->key; |
| 218 | struct sk_buff *skb = rx->skb; | 218 | struct sk_buff *skb = rx->skb; |
| 219 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | ||
| 219 | 220 | ||
| 220 | hdrlen = ieee80211_hdrlen(hdr->frame_control); | 221 | hdrlen = ieee80211_hdrlen(hdr->frame_control); |
| 221 | 222 | ||
| @@ -225,8 +226,8 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx) | |||
| 225 | if (!rx->sta || skb->len - hdrlen < 12) | 226 | if (!rx->sta || skb->len - hdrlen < 12) |
| 226 | return RX_DROP_UNUSABLE; | 227 | return RX_DROP_UNUSABLE; |
| 227 | 228 | ||
| 228 | if (rx->status->flag & RX_FLAG_DECRYPTED) { | 229 | if (status->flag & RX_FLAG_DECRYPTED) { |
| 229 | if (rx->status->flag & RX_FLAG_IV_STRIPPED) { | 230 | if (status->flag & RX_FLAG_IV_STRIPPED) { |
| 230 | /* | 231 | /* |
| 231 | * Hardware took care of all processing, including | 232 | * Hardware took care of all processing, including |
| 232 | * replay protection, and stripped the ICV/IV so | 233 | * replay protection, and stripped the ICV/IV so |
| @@ -442,6 +443,7 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx) | |||
| 442 | int hdrlen; | 443 | int hdrlen; |
| 443 | struct ieee80211_key *key = rx->key; | 444 | struct ieee80211_key *key = rx->key; |
| 444 | struct sk_buff *skb = rx->skb; | 445 | struct sk_buff *skb = rx->skb; |
| 446 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | ||
| 445 | u8 pn[CCMP_PN_LEN]; | 447 | u8 pn[CCMP_PN_LEN]; |
| 446 | int data_len; | 448 | int data_len; |
| 447 | 449 | ||
| @@ -455,8 +457,8 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx) | |||
| 455 | if (!rx->sta || data_len < 0) | 457 | if (!rx->sta || data_len < 0) |
| 456 | return RX_DROP_UNUSABLE; | 458 | return RX_DROP_UNUSABLE; |
| 457 | 459 | ||
| 458 | if ((rx->status->flag & RX_FLAG_DECRYPTED) && | 460 | if ((status->flag & RX_FLAG_DECRYPTED) && |
| 459 | (rx->status->flag & RX_FLAG_IV_STRIPPED)) | 461 | (status->flag & RX_FLAG_IV_STRIPPED)) |
| 460 | return RX_CONTINUE; | 462 | return RX_CONTINUE; |
| 461 | 463 | ||
| 462 | ccmp_hdr2pn(pn, skb->data + hdrlen); | 464 | ccmp_hdr2pn(pn, skb->data + hdrlen); |
| @@ -466,7 +468,7 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx) | |||
| 466 | return RX_DROP_UNUSABLE; | 468 | return RX_DROP_UNUSABLE; |
| 467 | } | 469 | } |
| 468 | 470 | ||
| 469 | if (!(rx->status->flag & RX_FLAG_DECRYPTED)) { | 471 | if (!(status->flag & RX_FLAG_DECRYPTED)) { |
| 470 | /* hardware didn't decrypt/verify MIC */ | 472 | /* hardware didn't decrypt/verify MIC */ |
| 471 | ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1); | 473 | ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1); |
| 472 | 474 | ||
| @@ -563,6 +565,7 @@ ieee80211_rx_result | |||
| 563 | ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) | 565 | ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) |
| 564 | { | 566 | { |
| 565 | struct sk_buff *skb = rx->skb; | 567 | struct sk_buff *skb = rx->skb; |
| 568 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | ||
| 566 | struct ieee80211_key *key = rx->key; | 569 | struct ieee80211_key *key = rx->key; |
| 567 | struct ieee80211_mmie *mmie; | 570 | struct ieee80211_mmie *mmie; |
| 568 | u8 aad[20], mic[8], ipn[6]; | 571 | u8 aad[20], mic[8], ipn[6]; |
| @@ -571,8 +574,8 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) | |||
| 571 | if (!ieee80211_is_mgmt(hdr->frame_control)) | 574 | if (!ieee80211_is_mgmt(hdr->frame_control)) |
| 572 | return RX_CONTINUE; | 575 | return RX_CONTINUE; |
| 573 | 576 | ||
| 574 | if ((rx->status->flag & RX_FLAG_DECRYPTED) && | 577 | if ((status->flag & RX_FLAG_DECRYPTED) && |
| 575 | (rx->status->flag & RX_FLAG_IV_STRIPPED)) | 578 | (status->flag & RX_FLAG_IV_STRIPPED)) |
| 576 | return RX_CONTINUE; | 579 | return RX_CONTINUE; |
| 577 | 580 | ||
| 578 | if (skb->len < 24 + sizeof(*mmie)) | 581 | if (skb->len < 24 + sizeof(*mmie)) |
| @@ -591,7 +594,7 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) | |||
| 591 | return RX_DROP_UNUSABLE; | 594 | return RX_DROP_UNUSABLE; |
| 592 | } | 595 | } |
| 593 | 596 | ||
| 594 | if (!(rx->status->flag & RX_FLAG_DECRYPTED)) { | 597 | if (!(status->flag & RX_FLAG_DECRYPTED)) { |
| 595 | /* hardware didn't decrypt/verify MIC */ | 598 | /* hardware didn't decrypt/verify MIC */ |
| 596 | bip_aad(skb, aad); | 599 | bip_aad(skb, aad); |
| 597 | ieee80211_aes_cmac(key->u.aes_cmac.tfm, | 600 | ieee80211_aes_cmac(key->u.aes_cmac.tfm, |
