aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/utils
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-01-31 22:30:50 +0000
committerlloyd <[email protected]>2014-01-31 22:30:50 +0000
commite11024f26113189f45ca1759f6a045ca6989849e (patch)
tree33ea9eb4c4faabc899fa03aff5132e00a21f5d84 /src/lib/utils
parent9332870c160d7a02f1bef6f249fa1baae196dc51 (diff)
Add ChaCha
Diffstat (limited to 'src/lib/utils')
-rw-r--r--src/lib/utils/xor_buf.h53
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,