Loading drivers/staging/vt6656/aes_ccmp.c +272 −289 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * * File: aes_ccmp.c * * Purpose: AES_CCMP decryption Loading @@ -28,9 +27,7 @@ * Functions: * AESbGenCCMP - Parsing RX-packet * * * Revision History: * */ #include "device.h" Loading @@ -46,8 +43,7 @@ * SBOX Table */ BYTE sbox_table[256] = { BYTE sbox_table[256] = { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, Loading Loading @@ -155,10 +151,8 @@ void SubBytes(BYTE *in, BYTE *out) int i; for (i = 0; i < 16; i++) { out[i] = sbox_table[in[i]]; } } void ShiftRows(BYTE *in, BYTE *out) { Loading Loading @@ -189,7 +183,6 @@ void MixColumns(BYTE *in, BYTE *out) out[3] = dot3_table[in[0]] ^ in[1] ^ in[2] ^ dot2_table[in[3]]; } void AESv128(BYTE *key, BYTE *data, BYTE *ciphertext) { int i; Loading @@ -201,21 +194,15 @@ BYTE abyRoundKey[16]; for (i = 0; i < 16; i++) abyRoundKey[i] = key[i]; for (round = 0; round < 11; round++) { if (round == 0) { for (round = 0; round < 11; round++) { if (round == 0) { xor_128(abyRoundKey, data, ciphertext); AddRoundKey(abyRoundKey, round); } else if (round == 10) { } else if (round == 10) { SubBytes(ciphertext, TmpdataA); ShiftRows(TmpdataA, TmpdataB); xor_128(TmpdataB, abyRoundKey, ciphertext); } else // round 1 ~ 9 { } else { /* round 1 ~ 9 */ SubBytes(ciphertext, TmpdataA); ShiftRows(TmpdataA, TmpdataB); MixColumns(&TmpdataB[0], &TmpdataA[0]); Loading Loading @@ -243,6 +230,7 @@ BYTE abyRoundKey[16]; * Return Value: MIC compare result * */ BOOL AESbGenCCMP(PBYTE pbyRxKey, PBYTE pbyFrame, WORD wFrameSize) { BYTE abyNonce[13]; Loading @@ -259,24 +247,24 @@ PS802_11Header pMACHeader = (PS802_11Header) pbyFrame; PBYTE pbyIV; PBYTE pbyPayload; WORD wHLen = 22; WORD wPayloadSize = wFrameSize - 8 - 8 - 4 - WLAN_HDR_ADDR3_LEN;//8 is IV, 8 is MIC, 4 is CRC /* 8 is IV, 8 is MIC, 4 is CRC */ WORD wPayloadSize = wFrameSize - 8 - 8 - 4 - WLAN_HDR_ADDR3_LEN; BOOL bA4 = FALSE; BYTE byTmp; WORD wCnt; int ii, jj, kk; pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN; if (WLAN_GET_FC_TODS(*(PWORD) pbyFrame) && WLAN_GET_FC_FROMDS(*(PWORD) pbyFrame)) { bA4 = TRUE; pbyIV += 6; // 6 is 802.11 address4 pbyIV += 6; /* 6 is 802.11 address4 */ wHLen += 6; wPayloadSize -= 6; } pbyPayload = pbyIV + 8; //IV-length pbyPayload = pbyIV + 8; /* IV-length */ abyNonce[0] = 0x00; //now is 0, if Qos here will be priority abyNonce[0] = 0x00; /* now is 0, if Qos here will be priority */ memcpy(&(abyNonce[1]), pMACHeader->abyAddr2, ETH_ALEN); abyNonce[7] = pbyIV[7]; abyNonce[8] = pbyIV[6]; Loading @@ -285,13 +273,13 @@ int ii,jj,kk; abyNonce[11] = pbyIV[1]; abyNonce[12] = pbyIV[0]; //MIC_IV /* MIC_IV */ MIC_IV[0] = 0x59; memcpy(&(MIC_IV[1]), &(abyNonce[0]), 13); MIC_IV[14] = (BYTE)(wPayloadSize >> 8); MIC_IV[15] = (BYTE)(wPayloadSize & 0xff); //MIC_HDR1 /* MIC_HDR1 */ MIC_HDR1[0] = (BYTE)(wHLen >> 8); MIC_HDR1[1] = (BYTE)(wHLen & 0xff); byTmp = (BYTE)(pMACHeader->wFrameCtl & 0xff); Loading @@ -302,7 +290,7 @@ int ii,jj,kk; memcpy(&(MIC_HDR1[4]), pMACHeader->abyAddr1, ETH_ALEN); memcpy(&(MIC_HDR1[10]), pMACHeader->abyAddr2, ETH_ALEN); //MIC_HDR2 /* MIC_HDR2 */ memcpy(&(MIC_HDR2[0]), pMACHeader->abyAddr3, ETH_ALEN); byTmp = (BYTE)(pMACHeader->wSeqCtl & 0xff); MIC_HDR2[6] = byTmp & 0x0f; Loading @@ -321,15 +309,15 @@ int ii,jj,kk; MIC_HDR2[14] = 0x00; MIC_HDR2[15] = 0x00; //CCMP /* CCMP */ AESv128(pbyRxKey, MIC_IV, abyMIC); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = MIC_HDR1[kk] ^ abyMIC[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = MIC_HDR2[kk] ^ abyMIC[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); wCnt = 1; Loading @@ -343,61 +331,56 @@ int ii,jj,kk; AESv128(pbyRxKey, abyCTRPLD, abyTmp); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyPlainText[kk] = abyTmp[kk] ^ pbyPayload[kk]; } for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = abyMIC[kk] ^ abyPlainText[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); memcpy(pbyPayload, abyPlainText, 16); wCnt++; pbyPayload += 16; } //for wPayloadSize } /* for wPayloadSize */ //last payload /* last payload */ memcpy(&(abyLastCipher[0]), pbyPayload, jj); for ( ii=jj; ii<16; ii++ ) { for (ii = jj; ii < 16; ii++) abyLastCipher[ii] = 0x00; } abyCTRPLD[14] = (BYTE) (wCnt >> 8); abyCTRPLD[15] = (BYTE) (wCnt & 0xff); AESv128(pbyRxKey, abyCTRPLD, abyTmp); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyPlainText[kk] = abyTmp[kk] ^ abyLastCipher[kk]; } memcpy(pbyPayload, abyPlainText, jj); pbyPayload += jj; //for MIC calculation for ( ii=jj; ii<16; ii++ ) { /* for MIC calculation */ for (ii = jj; ii < 16; ii++) abyPlainText[ii] = 0x00; } for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = abyMIC[kk] ^ abyPlainText[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); //=>above is the calculate MIC //-------------------------------------------- /* => above is the calculated MIC */ wCnt = 0; abyCTRPLD[14] = (BYTE) (wCnt >> 8); abyCTRPLD[15] = (BYTE) (wCnt & 0xff); AESv128(pbyRxKey, abyCTRPLD, abyTmp); for ( kk=0; kk<8; kk++ ) { for (kk = 0; kk < 8; kk++) abyTmp[kk] = abyTmp[kk] ^ pbyPayload[kk]; } //=>above is the dec-MIC from packet //-------------------------------------------- if ( !memcmp(abyMIC,abyTmp,8) ) { /* => above is the packet dec-MIC */ if (!memcmp(abyMIC, abyTmp, 8)) return TRUE; } else { else return FALSE; } } Loading
drivers/staging/vt6656/aes_ccmp.c +272 −289 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * * File: aes_ccmp.c * * Purpose: AES_CCMP decryption Loading @@ -28,9 +27,7 @@ * Functions: * AESbGenCCMP - Parsing RX-packet * * * Revision History: * */ #include "device.h" Loading @@ -46,8 +43,7 @@ * SBOX Table */ BYTE sbox_table[256] = { BYTE sbox_table[256] = { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, Loading Loading @@ -155,10 +151,8 @@ void SubBytes(BYTE *in, BYTE *out) int i; for (i = 0; i < 16; i++) { out[i] = sbox_table[in[i]]; } } void ShiftRows(BYTE *in, BYTE *out) { Loading Loading @@ -189,7 +183,6 @@ void MixColumns(BYTE *in, BYTE *out) out[3] = dot3_table[in[0]] ^ in[1] ^ in[2] ^ dot2_table[in[3]]; } void AESv128(BYTE *key, BYTE *data, BYTE *ciphertext) { int i; Loading @@ -201,21 +194,15 @@ BYTE abyRoundKey[16]; for (i = 0; i < 16; i++) abyRoundKey[i] = key[i]; for (round = 0; round < 11; round++) { if (round == 0) { for (round = 0; round < 11; round++) { if (round == 0) { xor_128(abyRoundKey, data, ciphertext); AddRoundKey(abyRoundKey, round); } else if (round == 10) { } else if (round == 10) { SubBytes(ciphertext, TmpdataA); ShiftRows(TmpdataA, TmpdataB); xor_128(TmpdataB, abyRoundKey, ciphertext); } else // round 1 ~ 9 { } else { /* round 1 ~ 9 */ SubBytes(ciphertext, TmpdataA); ShiftRows(TmpdataA, TmpdataB); MixColumns(&TmpdataB[0], &TmpdataA[0]); Loading Loading @@ -243,6 +230,7 @@ BYTE abyRoundKey[16]; * Return Value: MIC compare result * */ BOOL AESbGenCCMP(PBYTE pbyRxKey, PBYTE pbyFrame, WORD wFrameSize) { BYTE abyNonce[13]; Loading @@ -259,24 +247,24 @@ PS802_11Header pMACHeader = (PS802_11Header) pbyFrame; PBYTE pbyIV; PBYTE pbyPayload; WORD wHLen = 22; WORD wPayloadSize = wFrameSize - 8 - 8 - 4 - WLAN_HDR_ADDR3_LEN;//8 is IV, 8 is MIC, 4 is CRC /* 8 is IV, 8 is MIC, 4 is CRC */ WORD wPayloadSize = wFrameSize - 8 - 8 - 4 - WLAN_HDR_ADDR3_LEN; BOOL bA4 = FALSE; BYTE byTmp; WORD wCnt; int ii, jj, kk; pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN; if (WLAN_GET_FC_TODS(*(PWORD) pbyFrame) && WLAN_GET_FC_FROMDS(*(PWORD) pbyFrame)) { bA4 = TRUE; pbyIV += 6; // 6 is 802.11 address4 pbyIV += 6; /* 6 is 802.11 address4 */ wHLen += 6; wPayloadSize -= 6; } pbyPayload = pbyIV + 8; //IV-length pbyPayload = pbyIV + 8; /* IV-length */ abyNonce[0] = 0x00; //now is 0, if Qos here will be priority abyNonce[0] = 0x00; /* now is 0, if Qos here will be priority */ memcpy(&(abyNonce[1]), pMACHeader->abyAddr2, ETH_ALEN); abyNonce[7] = pbyIV[7]; abyNonce[8] = pbyIV[6]; Loading @@ -285,13 +273,13 @@ int ii,jj,kk; abyNonce[11] = pbyIV[1]; abyNonce[12] = pbyIV[0]; //MIC_IV /* MIC_IV */ MIC_IV[0] = 0x59; memcpy(&(MIC_IV[1]), &(abyNonce[0]), 13); MIC_IV[14] = (BYTE)(wPayloadSize >> 8); MIC_IV[15] = (BYTE)(wPayloadSize & 0xff); //MIC_HDR1 /* MIC_HDR1 */ MIC_HDR1[0] = (BYTE)(wHLen >> 8); MIC_HDR1[1] = (BYTE)(wHLen & 0xff); byTmp = (BYTE)(pMACHeader->wFrameCtl & 0xff); Loading @@ -302,7 +290,7 @@ int ii,jj,kk; memcpy(&(MIC_HDR1[4]), pMACHeader->abyAddr1, ETH_ALEN); memcpy(&(MIC_HDR1[10]), pMACHeader->abyAddr2, ETH_ALEN); //MIC_HDR2 /* MIC_HDR2 */ memcpy(&(MIC_HDR2[0]), pMACHeader->abyAddr3, ETH_ALEN); byTmp = (BYTE)(pMACHeader->wSeqCtl & 0xff); MIC_HDR2[6] = byTmp & 0x0f; Loading @@ -321,15 +309,15 @@ int ii,jj,kk; MIC_HDR2[14] = 0x00; MIC_HDR2[15] = 0x00; //CCMP /* CCMP */ AESv128(pbyRxKey, MIC_IV, abyMIC); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = MIC_HDR1[kk] ^ abyMIC[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = MIC_HDR2[kk] ^ abyMIC[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); wCnt = 1; Loading @@ -343,61 +331,56 @@ int ii,jj,kk; AESv128(pbyRxKey, abyCTRPLD, abyTmp); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyPlainText[kk] = abyTmp[kk] ^ pbyPayload[kk]; } for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = abyMIC[kk] ^ abyPlainText[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); memcpy(pbyPayload, abyPlainText, 16); wCnt++; pbyPayload += 16; } //for wPayloadSize } /* for wPayloadSize */ //last payload /* last payload */ memcpy(&(abyLastCipher[0]), pbyPayload, jj); for ( ii=jj; ii<16; ii++ ) { for (ii = jj; ii < 16; ii++) abyLastCipher[ii] = 0x00; } abyCTRPLD[14] = (BYTE) (wCnt >> 8); abyCTRPLD[15] = (BYTE) (wCnt & 0xff); AESv128(pbyRxKey, abyCTRPLD, abyTmp); for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyPlainText[kk] = abyTmp[kk] ^ abyLastCipher[kk]; } memcpy(pbyPayload, abyPlainText, jj); pbyPayload += jj; //for MIC calculation for ( ii=jj; ii<16; ii++ ) { /* for MIC calculation */ for (ii = jj; ii < 16; ii++) abyPlainText[ii] = 0x00; } for ( kk=0; kk<16; kk++ ) { for (kk = 0; kk < 16; kk++) abyTmp[kk] = abyMIC[kk] ^ abyPlainText[kk]; } AESv128(pbyRxKey, abyTmp, abyMIC); //=>above is the calculate MIC //-------------------------------------------- /* => above is the calculated MIC */ wCnt = 0; abyCTRPLD[14] = (BYTE) (wCnt >> 8); abyCTRPLD[15] = (BYTE) (wCnt & 0xff); AESv128(pbyRxKey, abyCTRPLD, abyTmp); for ( kk=0; kk<8; kk++ ) { for (kk = 0; kk < 8; kk++) abyTmp[kk] = abyTmp[kk] ^ pbyPayload[kk]; } //=>above is the dec-MIC from packet //-------------------------------------------- if ( !memcmp(abyMIC,abyTmp,8) ) { /* => above is the packet dec-MIC */ if (!memcmp(abyMIC, abyTmp, 8)) return TRUE; } else { else return FALSE; } }