MCPcopy Create free account
hub / github.com/abbeycode/UnrarKit / blockDecrypt

Method blockDecrypt

Libraries/unrar/rijndael.cpp:224–291  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

222
223
224void 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);

Callers 1

DecryptBlockMethod · 0.80

Calls 2

Xor128Function · 0.85
Copy128Function · 0.85

Tested by

no test coverage detected