diff options
author | Jack Lloyd <[email protected]> | 2016-01-03 19:56:04 -0500 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2016-01-03 19:56:04 -0500 |
commit | 77b8eb8a4ed5f5b63710afd85766e8f30d0bd2d9 (patch) | |
tree | d17fcc018b990faaedc523dc6025ca655dcd4805 /src/lib/block | |
parent | 9ec5243e2dc8fba1d024269f1a756af7df0421b8 (diff) |
Use valgrind's memcheck API for checking const time annotations
Has the same effect as using ctgrind, but without requiring a
custom-compiled valgrind binary.
Add ct checking annotations to the SSSE3 AES code.
Diffstat (limited to 'src/lib/block')
-rw-r--r-- | src/lib/block/aes_ssse3/aes_ssse3.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/lib/block/aes_ssse3/aes_ssse3.cpp b/src/lib/block/aes_ssse3/aes_ssse3.cpp index bfc76ecee..373a5265a 100644 --- a/src/lib/block/aes_ssse3/aes_ssse3.cpp +++ b/src/lib/block/aes_ssse3/aes_ssse3.cpp @@ -1,6 +1,6 @@ /* * AES using SSSE3 -* (C) 2010 Jack Lloyd +* (C) 2010,2016 Jack Lloyd * * This is more or less a direct translation of public domain x86-64 * assembly written by Mike Hamburg, described in "Accelerating AES @@ -12,6 +12,7 @@ #include <botan/aes_ssse3.h> #include <botan/cpuid.h> +#include <botan/internal/ct_utils.h> #include <tmmintrin.h> namespace Botan { @@ -345,11 +346,16 @@ void AES_128_SSSE3::encrypt_n(const byte in[], byte out[], size_t blocks) const const __m128i* keys = reinterpret_cast<const __m128i*>(EK.data()); + CT::poison(in, blocks * block_size()); + for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 10)); } + + CT::unpoison(in, blocks * block_size()); + CT::unpoison(out, blocks * block_size()); } /* @@ -362,11 +368,16 @@ void AES_128_SSSE3::decrypt_n(const byte in[], byte out[], size_t blocks) const const __m128i* keys = reinterpret_cast<const __m128i*>(DK.data()); + CT::poison(in, blocks * block_size()); + for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 10)); } + + CT::unpoison(in, blocks * block_size()); + CT::unpoison(out, blocks * block_size()); } /* @@ -423,11 +434,16 @@ void AES_192_SSSE3::encrypt_n(const byte in[], byte out[], size_t blocks) const const __m128i* keys = reinterpret_cast<const __m128i*>(EK.data()); + CT::poison(in, blocks * block_size()); + for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 12)); } + + CT::unpoison(in, blocks * block_size()); + CT::unpoison(out, blocks * block_size()); } /* @@ -440,11 +456,16 @@ void AES_192_SSSE3::decrypt_n(const byte in[], byte out[], size_t blocks) const const __m128i* keys = reinterpret_cast<const __m128i*>(DK.data()); + CT::poison(in, blocks * block_size()); + for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 12)); } + + CT::unpoison(in, blocks * block_size()); + CT::unpoison(out, blocks * block_size()); } /* @@ -530,11 +551,16 @@ void AES_256_SSSE3::encrypt_n(const byte in[], byte out[], size_t blocks) const const __m128i* keys = reinterpret_cast<const __m128i*>(EK.data()); + CT::poison(in, blocks * block_size()); + for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 14)); } + + CT::unpoison(in, blocks * block_size()); + CT::unpoison(out, blocks * block_size()); } /* @@ -547,11 +573,16 @@ void AES_256_SSSE3::decrypt_n(const byte in[], byte out[], size_t blocks) const const __m128i* keys = reinterpret_cast<const __m128i*>(DK.data()); + CT::poison(in, blocks * block_size()); + for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 14)); } + + CT::unpoison(in, blocks * block_size()); + CT::unpoison(out, blocks * block_size()); } /* |