| 293 | |
| 294 | #ifdef USE_SSE |
| 295 | void Rijndael::blockDecryptSSE(const byte *input, size_t numBlocks, byte *outBuffer) |
| 296 | { |
| 297 | __m128i initVector = _mm_loadu_si128((__m128i*)m_initVector); |
| 298 | __m128i *src=(__m128i*)input; |
| 299 | __m128i *dest=(__m128i*)outBuffer; |
| 300 | __m128i *rkey=(__m128i*)m_expandedKey; |
| 301 | while (numBlocks > 0) |
| 302 | { |
| 303 | __m128i rl = _mm_loadu_si128(rkey + m_uRounds); |
| 304 | __m128i d = _mm_loadu_si128(src++); |
| 305 | __m128i v = _mm_xor_si128(rl, d); |
| 306 | |
| 307 | for (int i=m_uRounds-1; i>0; i--) |
| 308 | { |
| 309 | __m128i ri = _mm_loadu_si128(rkey + i); |
| 310 | v = _mm_aesdec_si128(v, ri); |
| 311 | } |
| 312 | |
| 313 | __m128i r0 = _mm_loadu_si128(rkey); |
| 314 | v = _mm_aesdeclast_si128(v, r0); |
| 315 | |
| 316 | if (CBCMode) |
| 317 | v = _mm_xor_si128(v, initVector); |
| 318 | initVector = d; |
| 319 | _mm_storeu_si128(dest++,v); |
| 320 | numBlocks--; |
| 321 | } |
| 322 | _mm_storeu_si128((__m128i*)m_initVector,initVector); |
| 323 | } |
| 324 | #endif |
| 325 | |
| 326 |
nothing calls this directly
no outgoing calls
no test coverage detected