Add debug instrumentation to Rijndael

We added asserts due to Coverity findings. We beieve the findings were false positives
pull/326/head
Jeffrey Walton 2016-09-30 13:14:29 -04:00
parent 2b328e8f8b
commit 19ebf769e7
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
1 changed files with 18 additions and 1 deletions

View File

@ -233,13 +233,18 @@ void Rijndael::Base::UncheckedSetKey(const byte *userKey, unsigned int keylen, c
0x10, 0x20, 0x40, 0x80, 0x10, 0x20, 0x40, 0x80,
0x1B, 0x36, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ 0x1B, 0x36, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
}; };
const word32 *rc = rcLE;
// Coverity finding, appears to be false positive. Assert the condition.
const word32 *ro = rcLE, *rc = rcLE;
CRYPTOPP_UNUSED(ro);
__m128i temp = _mm_loadu_si128((__m128i *)(void *)(userKey+keylen-16)); __m128i temp = _mm_loadu_si128((__m128i *)(void *)(userKey+keylen-16));
memcpy(rk, userKey, keylen); memcpy(rk, userKey, keylen);
while (true) while (true)
{ {
// Coverity finding, appears to be false positive. Assert the condition.
CRYPTOPP_ASSERT(rc < ro + COUNTOF(rcLE));
rk[keylen/4] = rk[0] ^ _mm_extract_epi32(_mm_aeskeygenassist_si128(temp, 0), 3) ^ *(rc++); rk[keylen/4] = rk[0] ^ _mm_extract_epi32(_mm_aeskeygenassist_si128(temp, 0), 3) ^ *(rc++);
rk[keylen/4+1] = rk[1] ^ rk[keylen/4]; rk[keylen/4+1] = rk[1] ^ rk[keylen/4];
rk[keylen/4+2] = rk[2] ^ rk[keylen/4+1]; rk[keylen/4+2] = rk[2] ^ rk[keylen/4+1];
@ -252,19 +257,29 @@ void Rijndael::Base::UncheckedSetKey(const byte *userKey, unsigned int keylen, c
{ {
rk[10] = rk[ 4] ^ rk[ 9]; rk[10] = rk[ 4] ^ rk[ 9];
rk[11] = rk[ 5] ^ rk[10]; rk[11] = rk[ 5] ^ rk[10];
// Coverity finding, appears to be false positive. Assert the condition.
CRYPTOPP_ASSERT(m_key.size() >= 12);
temp = _mm_insert_epi32(temp, rk[11], 3); temp = _mm_insert_epi32(temp, rk[11], 3);
} }
else if (keylen == 32) else if (keylen == 32)
{ {
// Coverity finding, appears to be false positive. Assert the condition.
CRYPTOPP_ASSERT(m_key.size() >= 12);
temp = _mm_insert_epi32(temp, rk[11], 3); temp = _mm_insert_epi32(temp, rk[11], 3);
rk[12] = rk[ 4] ^ _mm_extract_epi32(_mm_aeskeygenassist_si128(temp, 0), 2); rk[12] = rk[ 4] ^ _mm_extract_epi32(_mm_aeskeygenassist_si128(temp, 0), 2);
rk[13] = rk[ 5] ^ rk[12]; rk[13] = rk[ 5] ^ rk[12];
rk[14] = rk[ 6] ^ rk[13]; rk[14] = rk[ 6] ^ rk[13];
rk[15] = rk[ 7] ^ rk[14]; rk[15] = rk[ 7] ^ rk[14];
// Coverity finding, appears to be false positive. Assert the condition.
CRYPTOPP_ASSERT(m_key.size() >= 16);
temp = _mm_insert_epi32(temp, rk[15], 3); temp = _mm_insert_epi32(temp, rk[15], 3);
} }
else else
{
// Coverity finding, appears to be false positive. Assert the condition.
CRYPTOPP_ASSERT(m_key.size() >= 8);
temp = _mm_insert_epi32(temp, rk[7], 3); temp = _mm_insert_epi32(temp, rk[7], 3);
}
rk += keylen/4; rk += keylen/4;
} }
@ -1186,6 +1201,8 @@ inline size_t AESNI_AdvancedProcessBlocks(F1 func1, F4 func4, MAYBE_CONST __m128
if (flags & BlockTransformation::BT_XorInput) if (flags & BlockTransformation::BT_XorInput)
{ {
// Coverity finding, appears to be false positive. Assert the condition.
CRYPTOPP_ASSERT(xorBlocks);
block0 = _mm_xor_si128(block0, _mm_loadu_si128((const __m128i *)(const void *)xorBlocks)); block0 = _mm_xor_si128(block0, _mm_loadu_si128((const __m128i *)(const void *)xorBlocks));
xorBlocks += xorIncrement; xorBlocks += xorIncrement;
block1 = _mm_xor_si128(block1, _mm_loadu_si128((const __m128i *)(const void *)xorBlocks)); block1 = _mm_xor_si128(block1, _mm_loadu_si128((const __m128i *)(const void *)xorBlocks));