From b5d0be6e0d5b57effc5b7883d6e6e72aa2a1f062 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sat, 12 Mar 2011 16:56:09 +0100
Subject: Added optimized version of HMACSHA1 as comment.


diff --git a/QA/UnitTest/SConscript b/QA/UnitTest/SConscript
index 805ac39..25e9b05 100644
--- a/QA/UnitTest/SConscript
+++ b/QA/UnitTest/SConscript
@@ -20,6 +20,7 @@ if env["TEST"] :
 		myenv.MergeFlags(env.get("LIBXML_FLAGS", ""))
 		myenv.MergeFlags(env.get("EXPAT_FLAGS", ""))
 		myenv.MergeFlags(env.get("ZLIB_FLAGS", ""))
+		myenv.MergeFlags(env.get("OPENSSL_FLAGS", ""))
 		myenv.MergeFlags(env["PLATFORM_FLAGS"])
 		if env.get("HAVE_LIBXML") :
 			myenv.Append(CPPDEFINES = ["HAVE_LIBXML"])
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
+
 }
-- 
cgit v0.10.2-6-g49f6