| 222 | |
| 223 | |
| 224 | void Rijndael::blockDecrypt(const byte *input, size_t inputLen, byte *outBuffer) |
| 225 | { |
| 226 | if (inputLen <= 0) |
| 227 | return; |
| 228 | |
| 229 | size_t numBlocks=inputLen/16; |
| 230 | #ifdef USE_SSE |
| 231 | if (AES_NI) |
| 232 | { |
| 233 | blockDecryptSSE(input,numBlocks,outBuffer); |
| 234 | return; |
| 235 | } |
| 236 | #endif |
| 237 | |
| 238 | byte block[16], iv[4][4]; |
| 239 | memcpy(iv,m_initVector,16); |
| 240 | |
| 241 | for (size_t i = numBlocks; i > 0; i--) |
| 242 | { |
| 243 | byte temp[4][4]; |
| 244 | |
| 245 | Xor128(temp,input,m_expandedKey[m_uRounds]); |
| 246 | |
| 247 | Xor128(block, T5[temp[0][0]],T6[temp[3][1]],T7[temp[2][2]],T8[temp[1][3]]); |
| 248 | Xor128(block+4, T5[temp[1][0]],T6[temp[0][1]],T7[temp[3][2]],T8[temp[2][3]]); |
| 249 | Xor128(block+8, T5[temp[2][0]],T6[temp[1][1]],T7[temp[0][2]],T8[temp[3][3]]); |
| 250 | Xor128(block+12,T5[temp[3][0]],T6[temp[2][1]],T7[temp[1][2]],T8[temp[0][3]]); |
| 251 | |
| 252 | for(int r = m_uRounds-1; r > 1; r--) |
| 253 | { |
| 254 | Xor128(temp,block,m_expandedKey[r]); |
| 255 | Xor128(block, T5[temp[0][0]],T6[temp[3][1]],T7[temp[2][2]],T8[temp[1][3]]); |
| 256 | Xor128(block+4, T5[temp[1][0]],T6[temp[0][1]],T7[temp[3][2]],T8[temp[2][3]]); |
| 257 | Xor128(block+8, T5[temp[2][0]],T6[temp[1][1]],T7[temp[0][2]],T8[temp[3][3]]); |
| 258 | Xor128(block+12,T5[temp[3][0]],T6[temp[2][1]],T7[temp[1][2]],T8[temp[0][3]]); |
| 259 | } |
| 260 | |
| 261 | Xor128(temp,block,m_expandedKey[1]); |
| 262 | block[ 0] = S5[temp[0][0]]; |
| 263 | block[ 1] = S5[temp[3][1]]; |
| 264 | block[ 2] = S5[temp[2][2]]; |
| 265 | block[ 3] = S5[temp[1][3]]; |
| 266 | block[ 4] = S5[temp[1][0]]; |
| 267 | block[ 5] = S5[temp[0][1]]; |
| 268 | block[ 6] = S5[temp[3][2]]; |
| 269 | block[ 7] = S5[temp[2][3]]; |
| 270 | block[ 8] = S5[temp[2][0]]; |
| 271 | block[ 9] = S5[temp[1][1]]; |
| 272 | block[10] = S5[temp[0][2]]; |
| 273 | block[11] = S5[temp[3][3]]; |
| 274 | block[12] = S5[temp[3][0]]; |
| 275 | block[13] = S5[temp[2][1]]; |
| 276 | block[14] = S5[temp[1][2]]; |
| 277 | block[15] = S5[temp[0][3]]; |
| 278 | Xor128(block,block,m_expandedKey[0]); |
| 279 | |
| 280 | if (CBCMode) |
| 281 | Xor128(block,block,iv); |
no test coverage detected