diff options
author | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2016-01-20 14:01:31 -0300 |
---|---|---|
committer | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2016-01-20 14:01:31 -0300 |
commit | b4b7ff4b08e691656c9d77c758fc355833128ac0 (patch) | |
tree | 82fcb00e6b918026dc9f2d1f05ed8eee83874cc0 /drivers/staging/rtl8712/rtl871x_security.c | |
parent | 35acfa0fc609f2a2cd95cef4a6a9c3a5c38f1778 (diff) |
Linux-libre 4.4-gnupck-4.4-gnu
Diffstat (limited to 'drivers/staging/rtl8712/rtl871x_security.c')
-rw-r--r-- | drivers/staging/rtl8712/rtl871x_security.c | 133 |
1 files changed, 73 insertions, 60 deletions
diff --git a/drivers/staging/rtl8712/rtl871x_security.c b/drivers/staging/rtl8712/rtl871x_security.c index 862792826..09242425d 100644 --- a/drivers/staging/rtl8712/rtl871x_security.c +++ b/drivers/staging/rtl8712/rtl871x_security.c @@ -175,22 +175,22 @@ void r8712_wep_encrypt(struct _adapter *padapter, u8 *pxmitframe) if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL) return; - pframe = ((struct xmit_frame *)pxmitframe)->buf_addr+TXDESC_OFFSET; + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; /*start to encrypt each fragment*/ if ((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) { keylength = psecuritypriv->DefKeylen[psecuritypriv-> PrivacyKeyIndex]; for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { - iv = pframe+pattrib->hdrlen; + iv = pframe + pattrib->hdrlen; memcpy(&wepkey[0], iv, 3); memcpy(&wepkey[3], &psecuritypriv->DefKey[ psecuritypriv->PrivacyKeyIndex].skey[0], keylength); - payload = pframe+pattrib->iv_len+pattrib->hdrlen; + payload = pframe + pattrib->iv_len + pattrib->hdrlen; if ((curfragnum + 1) == pattrib->nr_frags) { - length = pattrib->last_txcmdsz-pattrib-> - hdrlen-pattrib->iv_len - + length = pattrib->last_txcmdsz - pattrib-> + hdrlen - pattrib->iv_len - pattrib->icv_len; *((u32 *)crc) = cpu_to_le32(getcrc32( payload, length)); @@ -200,14 +200,15 @@ void r8712_wep_encrypt(struct _adapter *padapter, u8 *pxmitframe) arcfour_encrypt(&mycontext, payload + length, crc, 4); } else { - length = pxmitpriv->frag_len-pattrib->hdrlen - - pattrib->iv_len-pattrib->icv_len; + length = pxmitpriv->frag_len - + pattrib->hdrlen - pattrib->iv_len - + pattrib->icv_len; *((u32 *)crc) = cpu_to_le32(getcrc32( payload, length)); arcfour_init(&mycontext, wepkey, 3 + keylength); arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, + arcfour_encrypt(&mycontext, payload + length, crc, 4); pframe += pxmitpriv->frag_len; pframe = (u8 *)RND4((addr_t)(pframe)); @@ -241,8 +242,8 @@ void r8712_wep_decrypt(struct _adapter *padapter, u8 *precvframe) psecuritypriv->PrivacyKeyIndex].skey[0], keylength); length = ((union recv_frame *)precvframe)-> - u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - payload = pframe+prxattrib->iv_len+prxattrib->hdrlen; + u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len; + payload = pframe + prxattrib->iv_len + prxattrib->hdrlen; /* decrypt payload include icv */ arcfour_init(&mycontext, wepkey, 3 + keylength); arcfour_encrypt(&mycontext, payload, payload, length); @@ -495,11 +496,11 @@ static void phase1(u16 *p1k, const u8 *tk, const u8 *ta, u32 iv32) /* Now compute an unbalanced Feistel cipher with 80-bit block */ /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ for (i = 0; i < PHASE1_LOOP_CNT; i++) { /* Each add is mod 2**16 */ - p1k[0] += _S_(p1k[4] ^ TK16((i&1) + 0)); - p1k[1] += _S_(p1k[0] ^ TK16((i&1) + 2)); - p1k[2] += _S_(p1k[1] ^ TK16((i&1) + 4)); - p1k[3] += _S_(p1k[2] ^ TK16((i&1) + 6)); - p1k[4] += _S_(p1k[3] ^ TK16((i&1) + 0)); + p1k[0] += _S_(p1k[4] ^ TK16((i & 1) + 0)); + p1k[1] += _S_(p1k[0] ^ TK16((i & 1) + 2)); + p1k[2] += _S_(p1k[1] ^ TK16((i & 1) + 4)); + p1k[3] += _S_(p1k[2] ^ TK16((i & 1) + 6)); + p1k[4] += _S_(p1k[3] ^ TK16((i & 1) + 0)); p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ } } @@ -587,7 +588,7 @@ u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe) if (((struct xmit_frame *)pxmitframe)->buf_addr == NULL) return _FAIL; - pframe = ((struct xmit_frame *)pxmitframe)->buf_addr+TXDESC_OFFSET; + pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; /* 4 start to encrypt each fragment */ if (pattrib->encrypt == _TKIP_) { if (pattrib->psta) @@ -600,7 +601,7 @@ u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe) for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { iv = pframe + pattrib->hdrlen; - payload = pframe+pattrib->iv_len + + payload = pframe + pattrib->iv_len + pattrib->hdrlen; GET_TKIP_PN(iv, txpn); pnl = (u16)(txpn.val); @@ -612,7 +613,8 @@ u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe) if ((curfragnum + 1) == pattrib->nr_frags) { /* 4 the last fragment */ length = pattrib->last_txcmdsz - - pattrib->hdrlen-pattrib->iv_len - + pattrib->hdrlen - + pattrib->iv_len - pattrib->icv_len; *((u32 *)crc) = cpu_to_le32( getcrc32(payload, length)); @@ -622,22 +624,25 @@ u32 r8712_tkip_encrypt(struct _adapter *padapter, u8 *pxmitframe) arcfour_encrypt(&mycontext, payload + length, crc, 4); } else { - length = pxmitpriv->frag_len-pattrib-> - hdrlen-pattrib-> - iv_len-pattrib->icv_len; + length = pxmitpriv->frag_len - + pattrib->hdrlen - + pattrib->iv_len - + pattrib->icv_len; *((u32 *)crc) = cpu_to_le32(getcrc32( payload, length)); arcfour_init(&mycontext, rc4key, 16); arcfour_encrypt(&mycontext, payload, payload, length); arcfour_encrypt(&mycontext, - payload+length, crc, 4); + payload + length, crc, + 4); pframe += pxmitpriv->frag_len; pframe = (u8 *)RND4((addr_t)(pframe)); } } - } else + } else { res = _FAIL; + } } return res; } @@ -666,8 +671,9 @@ u32 r8712_tkip_decrypt(struct _adapter *padapter, u8 *precvframe) stainfo = r8712_get_stainfo(&padapter->stapriv, &prxattrib->ta[0]); if (stainfo != NULL) { - iv = pframe+prxattrib->hdrlen; - payload = pframe+prxattrib->iv_len + prxattrib->hdrlen; + iv = pframe + prxattrib->hdrlen; + payload = pframe + prxattrib->iv_len + + prxattrib->hdrlen; length = ((union recv_frame *)precvframe)-> u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len; @@ -675,10 +681,11 @@ u32 r8712_tkip_decrypt(struct _adapter *padapter, u8 *precvframe) idx = iv[3]; prwskey = &psecuritypriv->XGrpKey[ ((idx >> 6) & 0x3) - 1].skey[0]; - if (psecuritypriv->binstallGrpkey == false) + if (!psecuritypriv->binstallGrpkey) return _FAIL; - } else + } else { prwskey = &stainfo->x_UncstKey.skey[0]; + } GET_TKIP_PN(iv, txpn); pnl = (u16)(txpn.val); pnh = (u32)(txpn.val >> 16); @@ -696,8 +703,9 @@ u32 r8712_tkip_decrypt(struct _adapter *padapter, u8 *precvframe) crc[1] != payload[length - 3] || crc[0] != payload[length - 4]) return _FAIL; - } else + } else { return _FAIL; + } } return _SUCCESS; } @@ -851,7 +859,7 @@ static void mix_column(u8 *in, u8 *out) andf7[3] = in[3] & 0x7f; for (i = 3; i > 0; i--) { /* logical shift left 1 bit */ andf7[i] = andf7[i] << 1; - if ((andf7[i-1] & 0x80) == 0x80) + if ((andf7[i - 1] & 0x80) == 0x80) andf7[i] = (andf7[i] | 0x01); } andf7[0] = andf7[0] << 1; @@ -1069,14 +1077,15 @@ static sint aes_cipher(u8 *key, uint hdrlen, if (hdrlen != WLAN_HDR_A3_QOS_LEN) hdrlen += 2; qc_exists = 1; - } else + } else { qc_exists = 0; + } pn_vector[0] = pframe[hdrlen]; - pn_vector[1] = pframe[hdrlen+1]; - pn_vector[2] = pframe[hdrlen+4]; - pn_vector[3] = pframe[hdrlen+5]; - pn_vector[4] = pframe[hdrlen+6]; - pn_vector[5] = pframe[hdrlen+7]; + pn_vector[1] = pframe[hdrlen + 1]; + pn_vector[2] = pframe[hdrlen + 4]; + pn_vector[3] = pframe[hdrlen + 5]; + pn_vector[4] = pframe[hdrlen + 6]; + pn_vector[5] = pframe[hdrlen + 7]; construct_mic_iv(mic_iv, qc_exists, a4_exists, pframe, plen, pn_vector); construct_mic_header1(mic_header1, hdrlen, pframe); construct_mic_header2(mic_header2, pframe, a4_exists, qc_exists); @@ -1108,7 +1117,7 @@ static sint aes_cipher(u8 *key, uint hdrlen, mic[j] = aes_out[j]; /* Insert MIC into payload */ for (j = 0; j < 8; j++) - pframe[payload_index+j] = mic[j]; + pframe[payload_index + j] = mic[j]; payload_index = hdrlen + 8; for (i = 0; i < num_blocks; i++) { construct_ctr_preload(ctr_preload, a4_exists, qc_exists, @@ -1121,11 +1130,11 @@ static sint aes_cipher(u8 *key, uint hdrlen, if (payload_remainder > 0) { /* If short final block, then pad it,*/ /* encrypt and copy unpadded part back */ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, - pframe, pn_vector, num_blocks+1); + pframe, pn_vector, num_blocks + 1); for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < payload_remainder; j++) - padded_buffer[j] = pframe[payload_index+j]; + padded_buffer[j] = pframe[payload_index + j]; aes128k128d(key, ctr_preload, aes_out); bitwise_xor(aes_out, padded_buffer, chain_buffer); for (j = 0; j < payload_remainder; j++) @@ -1137,7 +1146,7 @@ static sint aes_cipher(u8 *key, uint hdrlen, for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < 8; j++) - padded_buffer[j] = pframe[j+hdrlen+8+plen]; + padded_buffer[j] = pframe[j + hdrlen + 8 + plen]; aes128k128d(key, ctr_preload, aes_out); bitwise_xor(aes_out, padded_buffer, chain_buffer); for (j = 0; j < 8; j++) @@ -1188,8 +1197,9 @@ u32 r8712_aes_encrypt(struct _adapter *padapter, u8 *pxmitframe) pframe = (u8 *)RND4((addr_t)(pframe)); } } - } else + } else { res = _FAIL; + } } return res; } @@ -1224,13 +1234,13 @@ static sint aes_decipher(u8 *key, uint hdrlen, /* start to decrypt the payload */ /*(plen including llc, payload and mic) */ num_blocks = (plen - 8) / 16; - payload_remainder = (plen-8) % 16; + payload_remainder = (plen - 8) % 16; pn_vector[0] = pframe[hdrlen]; - pn_vector[1] = pframe[hdrlen+1]; - pn_vector[2] = pframe[hdrlen+4]; - pn_vector[3] = pframe[hdrlen+5]; - pn_vector[4] = pframe[hdrlen+6]; - pn_vector[5] = pframe[hdrlen+7]; + pn_vector[1] = pframe[hdrlen + 1]; + pn_vector[2] = pframe[hdrlen + 4]; + pn_vector[3] = pframe[hdrlen + 5]; + pn_vector[4] = pframe[hdrlen + 6]; + pn_vector[5] = pframe[hdrlen + 7]; if ((hdrlen == WLAN_HDR_A3_LEN) || (hdrlen == WLAN_HDR_A3_QOS_LEN)) a4_exists = 0; else @@ -1264,7 +1274,7 @@ static sint aes_decipher(u8 *key, uint hdrlen, if (payload_remainder > 0) { /* If short final block, pad it,*/ /* encrypt it and copy the unpadded part back */ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, - pframe, pn_vector, num_blocks+1); + pframe, pn_vector, num_blocks + 1); for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < payload_remainder; j++) @@ -1277,12 +1287,12 @@ static sint aes_decipher(u8 *key, uint hdrlen, /* start to calculate the mic */ memcpy((void *)message, pframe, (hdrlen + plen + 8)); pn_vector[0] = pframe[hdrlen]; - pn_vector[1] = pframe[hdrlen+1]; - pn_vector[2] = pframe[hdrlen+4]; - pn_vector[3] = pframe[hdrlen+5]; - pn_vector[4] = pframe[hdrlen+6]; - pn_vector[5] = pframe[hdrlen+7]; - construct_mic_iv(mic_iv, qc_exists, a4_exists, message, plen-8, + pn_vector[1] = pframe[hdrlen + 1]; + pn_vector[2] = pframe[hdrlen + 4]; + pn_vector[3] = pframe[hdrlen + 5]; + pn_vector[4] = pframe[hdrlen + 6]; + pn_vector[5] = pframe[hdrlen + 7]; + construct_mic_iv(mic_iv, qc_exists, a4_exists, message, plen - 8, pn_vector); construct_mic_header1(mic_header1, hdrlen, message); construct_mic_header2(mic_header2, message, a4_exists, qc_exists); @@ -1314,7 +1324,7 @@ static sint aes_decipher(u8 *key, uint hdrlen, mic[j] = aes_out[j]; /* Insert MIC into payload */ for (j = 0; j < 8; j++) - message[payload_index+j] = mic[j]; + message[payload_index + j] = mic[j]; payload_index = hdrlen + 8; for (i = 0; i < num_blocks; i++) { construct_ctr_preload(ctr_preload, a4_exists, qc_exists, @@ -1327,7 +1337,7 @@ static sint aes_decipher(u8 *key, uint hdrlen, if (payload_remainder > 0) { /* If short final block, pad it,*/ /* encrypt and copy unpadded part back */ construct_ctr_preload(ctr_preload, a4_exists, qc_exists, - message, pn_vector, num_blocks+1); + message, pn_vector, num_blocks + 1); for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < payload_remainder; j++) @@ -1370,21 +1380,24 @@ u32 r8712_aes_decrypt(struct _adapter *padapter, u8 *precvframe) &prxattrib->ta[0]); if (stainfo != NULL) { if (IS_MCAST(prxattrib->ra)) { - iv = pframe+prxattrib->hdrlen; + iv = pframe + prxattrib->hdrlen; idx = iv[3]; prwskey = &psecuritypriv->XGrpKey[ ((idx >> 6) & 0x3) - 1].skey[0]; - if (psecuritypriv->binstallGrpkey == false) + if (!psecuritypriv->binstallGrpkey) return _FAIL; - } else + } else { prwskey = &stainfo->x_UncstKey.skey[0]; + } length = ((union recv_frame *)precvframe)-> - u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + u.hdr.len - prxattrib->hdrlen - + prxattrib->iv_len; aes_decipher(prwskey, prxattrib->hdrlen, pframe, length); - } else + } else { return _FAIL; + } } return _SUCCESS; } |