diff options
Diffstat (limited to 'src/lib/utils')
-rw-r--r-- | src/lib/utils/xor_buf.h | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/src/lib/utils/xor_buf.h b/src/lib/utils/xor_buf.h index 5773a619c..3c348659e 100644 --- a/src/lib/utils/xor_buf.h +++ b/src/lib/utils/xor_buf.h @@ -19,18 +19,15 @@ namespace Botan { * @param in the read-only input buffer * @param length the length of the buffers */ -inline void xor_buf(byte out[], const byte in[], size_t length) +template<typename T> +void xor_buf(T out[], const T in[], size_t length) { while(length >= 8) { -#if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK - *reinterpret_cast<u64bit*>(out) ^= *reinterpret_cast<const u64bit*>(in); -#else out[0] ^= in[0]; out[1] ^= in[1]; out[2] ^= in[2]; out[3] ^= in[3]; out[4] ^= in[4]; out[5] ^= in[5]; out[6] ^= in[6]; out[7] ^= in[7]; -#endif out += 8; in += 8; length -= 8; } @@ -46,6 +43,43 @@ inline void xor_buf(byte out[], const byte in[], size_t length) * @param in2 the second output buffer * @param length the length of the three buffers */ +template<typename T> void xor_buf(T out[], + const T in[], + const T in2[], + size_t length) + { + while(length >= 8) + { + out[0] = in[0] ^ in2[0]; + out[1] = in[1] ^ in2[1]; + out[2] = in[2] ^ in2[2]; + out[3] = in[3] ^ in2[3]; + out[4] = in[4] ^ in2[4]; + out[5] = in[5] ^ in2[5]; + out[6] = in[6] ^ in2[6]; + out[7] = in[7] ^ in2[7]; + + in += 8; in2 += 8; out += 8; length -= 8; + } + + for(size_t i = 0; i != length; ++i) + out[i] = in[i] ^ in2[i]; + } + +#if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK + +inline void xor_buf(byte out[], const byte in[], size_t length) + { + while(length >= 8) + { + *reinterpret_cast<u64bit*>(out) ^= *reinterpret_cast<const u64bit*>(in); + out += 8; in += 8; length -= 8; + } + + for(size_t i = 0; i != length; ++i) + out[i] ^= in[i]; + } + inline void xor_buf(byte out[], const byte in[], const byte in2[], @@ -53,16 +87,9 @@ inline void xor_buf(byte out[], { while(length >= 8) { -#if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK *reinterpret_cast<u64bit*>(out) = *reinterpret_cast<const u64bit*>(in) ^ *reinterpret_cast<const u64bit*>(in2); -#else - out[0] = in[0] ^ in2[0]; out[1] = in[1] ^ in2[1]; - out[2] = in[2] ^ in2[2]; out[3] = in[3] ^ in2[3]; - out[4] = in[4] ^ in2[4]; out[5] = in[5] ^ in2[5]; - out[6] = in[6] ^ in2[6]; out[7] = in[7] ^ in2[7]; -#endif in += 8; in2 += 8; out += 8; length -= 8; } @@ -71,6 +98,8 @@ inline void xor_buf(byte out[], out[i] = in[i] ^ in2[i]; } +#endif + template<typename Alloc, typename Alloc2> void xor_buf(std::vector<byte, Alloc>& out, const std::vector<byte, Alloc2>& in, |