From bb0dc4a60625c94fac1fb8dada797243b2b83c9e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sat, 20 Jun 2009 16:36:56 +0200
Subject: Fixed a bug where SHA1 would alter the input.


diff --git a/Swiften/StringCodecs/SHA1.cpp b/Swiften/StringCodecs/SHA1.cpp
index 18fde71..e59836c 100644
--- a/Swiften/StringCodecs/SHA1.cpp
+++ b/Swiften/StringCodecs/SHA1.cpp
@@ -188,11 +188,12 @@ boost::uint8_t finalcount[8];
 namespace Swift {
 
 ByteArray SHA1::getBinaryHash(const ByteArray& input) {
+	ByteArray inputCopy(input);
 	ByteArray digest;
 	digest.resize(20);
 	SHA1_CTX context;
 	SHA1Init(&context);
-	SHA1Update(&context, (boost::uint8_t*) input.getData(), input.getSize());
+	SHA1Update(&context, (boost::uint8_t*) inputCopy.getData(), inputCopy.getSize());
 	SHA1Final((boost::uint8_t*) digest.getData(), &context);
 	return digest;
 }
diff --git a/Swiften/StringCodecs/UnitTest/SHA1Test.cpp b/Swiften/StringCodecs/UnitTest/SHA1Test.cpp
index a6c7a72..e556429 100644
--- a/Swiften/StringCodecs/UnitTest/SHA1Test.cpp
+++ b/Swiften/StringCodecs/UnitTest/SHA1Test.cpp
@@ -9,6 +9,7 @@ class SHA1Test : public CppUnit::TestFixture
 {
 		CPPUNIT_TEST_SUITE(SHA1Test);
 		CPPUNIT_TEST(testGetBinaryHash);
+		CPPUNIT_TEST(testGetBinaryHash_Twice);
 		CPPUNIT_TEST(testGetHexHash);
 		CPPUNIT_TEST_SUITE_END();
 
@@ -20,6 +21,15 @@ class SHA1Test : public CppUnit::TestFixture
 			CPPUNIT_ASSERT_EQUAL(ByteArray("\x42\x06\xb2\x3c\xa6\xb0\xa6\x43\xd2\x0d\x89\xb0\x4f\xf5\x8c\xf7\x8b\x80\x96\xed"), result);
 		}
 
+
+		void testGetBinaryHash_Twice() {
+			ByteArray input("client/pc//Exodus 0.9.1<http://jabber.org/protocol/caps<http://jabber.org/protocol/disco#info<http://jabber.org/protocol/disco#items<http://jabber.org/protocol/muc<");
+			SHA1::getBinaryHash(input);
+			ByteArray result(SHA1::getBinaryHash(input));
+
+			CPPUNIT_ASSERT_EQUAL(ByteArray("\x42\x06\xb2\x3c\xa6\xb0\xa6\x43\xd2\x0d\x89\xb0\x4f\xf5\x8c\xf7\x8b\x80\x96\xed"), result);
+		}
+
 		void testGetHexHash() {
 			String result(SHA1::getHexHash("client/pc//Exodus 0.9.1<http://jabber.org/protocol/caps<http://jabber.org/protocol/disco#info<http://jabber.org/protocol/disco#items<http://jabber.org/protocol/muc<"));
 			CPPUNIT_ASSERT_EQUAL(String("4206b23ca6b0a643d20d89b04ff58cf78b8096ed"), result);
-- 
cgit v0.10.2-6-g49f6