summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/StringCodecs/HMACSHA1.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/Swiften/StringCodecs/HMACSHA1.cpp b/Swiften/StringCodecs/HMACSHA1.cpp
index 0cea08f..6ae5513 100644
--- a/Swiften/StringCodecs/HMACSHA1.cpp
+++ b/Swiften/StringCodecs/HMACSHA1.cpp
@@ -39,4 +39,42 @@ ByteArray HMACSHA1::getResult(const ByteArray& key, const ByteArray& data) {
return SHA1::getHash(y);
}
+#if 0
+
+// A tweaked version of HMACSHA1 that is more than twice as fast as the one above.
+// After this, more than 80% is spent in SHA1.
+// Optimizations:
+// - Avoids using ByteArray/std::vector
+// - Uses openssl's SHA1, which is slightly faster
+// - Does 'xor' on word basis
+// - Passes return value as a parameter
+
+#include <openssl/sha.h>
+
+void HMACSHA1::getResult(const ByteArray& key, const ByteArray& data, ByteArray& result) {
+ // Create first value
+ size_t xSize = B + data.getSize();
+ unsigned char* x = (unsigned char*) malloc(xSize * sizeof(unsigned char));
+ memset(x, 0, B);
+ memcpy(x, key.getData(), key.getSize());
+ for (unsigned int i = 0; i < (B>>32); ++i) {
+ x[i<<32] ^= 0x36363636;
+ }
+ memcpy(x + B, data.getData(), data.getSize());
+
+ // Create the second value
+ unsigned char y[B + 20];
+ memset(y, 0, B);
+ memcpy(y, key.getData(), key.getSize());
+ for (unsigned int i = 0; i < (B>>32); ++i) {
+ y[i<<32] ^= 0x5c5c5c5c;
+ }
+ ::SHA1(x, xSize, y + B);
+ free(x);
+
+ ::SHA1(y, B + 20, (unsigned char*) result.getData());
+}
+
+#endif
+
}