summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-11-22 10:20:58 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-11-22 10:27:01 (GMT)
commit4e244a9d1967ad416530aa3b9b07faad54097327 (patch)
tree413ee864cb85976178eaf9efee7cf6ff92acd4b7
parent38fbde49ec4ff77708237d768581a47e6dd7d553 (diff)
downloadswift-4e244a9d1967ad416530aa3b9b07faad54097327.zip
swift-4e244a9d1967ad416530aa3b9b07faad54097327.tar.bz2
Added SCRAM-SHA-1 unit test.
-rw-r--r--Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp16
-rw-r--r--Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp5
-rw-r--r--Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp42
-rw-r--r--Swiften/SConscript1
4 files changed, 58 insertions, 6 deletions
diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp
index 41e8f72..15c8ab6 100644
--- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp
+++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp
@@ -42,53 +42,65 @@ bool SCRAMSHA1ClientAuthenticator::setChallenge(const ByteArray& challenge) {
if (step == Initial) {
initialServerMessage = challenge;
// TODO: Check if these values are correct
std::map<char, String> keys = parseMap(String(initialServerMessage.getData(), initialServerMessage.getSize()));
salt = Base64::decode(keys['s']);
String clientServerNonce = keys['r'];
serverNonce = clientServerNonce.getSubstring(clientnonce.getUTF8Size(), clientServerNonce.npos());
iterations = boost::lexical_cast<int>(keys['i'].getUTF8String());
step = Proof;
return true;
}
else {
return challenge == Base64::encode(ByteArray("v=") + Base64::encode(serverSignature));
}
}
std::map<char, String> SCRAMSHA1ClientAuthenticator::parseMap(const String& s) {
// TODO: Do some proper checking here
std::map<char, String> result;
if (s.getUTF8Size() > 0) {
char key;
String value;
size_t i = 0;
bool expectKey = true;
while (i < s.getUTF8Size()) {
if (expectKey) {
key = s[i];
expectKey = false;
i++;
}
else if (s[i] == ',') {
result[key] = value;
value = "";
expectKey = true;
}
else {
value += s[i];
}
i++;
}
result[key] = value;
}
return result;
}
ByteArray SCRAMSHA1ClientAuthenticator::getInitialBareClientMessage() const {
- // TODO: Replace , and =
- return ByteArray(String("n=" + getAuthenticationID() + ",r=" + clientnonce));
+ String authenticationID = getAuthenticationID();
+ String escapedAuthenticationID;
+ for (size_t i = 0; i < authenticationID.getUTF8Size(); ++i) {
+ if (authenticationID[i] == ',') {
+ escapedAuthenticationID += "=2C";
+ }
+ else if (authenticationID[i] == '=') {
+ escapedAuthenticationID += "=3D";
+ }
+ else {
+ escapedAuthenticationID += authenticationID[i];
+ }
+ }
+ return ByteArray(String("n=" + escapedAuthenticationID + ",r=" + clientnonce));
}
}
diff --git a/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp
index b83e1f5..e92cd34 100644
--- a/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp
+++ b/Swiften/SASL/UnitTest/PLAINClientAuthenticatorTest.cpp
@@ -1,35 +1,32 @@
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include "Swiften/SASL/PLAINClientAuthenticator.h"
using namespace Swift;
-class PLAINClientAuthenticatorTest : public CppUnit::TestFixture
-{
+class PLAINClientAuthenticatorTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(PLAINClientAuthenticatorTest);
CPPUNIT_TEST(testGetResponse_WithoutAuthzID);
CPPUNIT_TEST(testGetResponse_WithAuthzID);
CPPUNIT_TEST_SUITE_END();
public:
- PLAINClientAuthenticatorTest() {}
-
void testGetResponse_WithoutAuthzID() {
PLAINClientAuthenticator testling;
testling.setCredentials("user", "pass");
CPPUNIT_ASSERT_EQUAL(testling.getResponse(), ByteArray("\0user\0pass", 10));
}
void testGetResponse_WithAuthzID() {
PLAINClientAuthenticator testling;
testling.setCredentials("user", "pass", "authz");
CPPUNIT_ASSERT_EQUAL(testling.getResponse(), ByteArray("authz\0user\0pass", 15));
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(PLAINClientAuthenticatorTest);
diff --git a/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp
new file mode 100644
index 0000000..9f7ef38
--- /dev/null
+++ b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp
@@ -0,0 +1,42 @@
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#include "Swiften/SASL/SCRAMSHA1ClientAuthenticator.h"
+#include "Swiften/Base/ByteArray.h"
+
+using namespace Swift;
+
+class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture {
+ CPPUNIT_TEST_SUITE(SCRAMSHA1ClientAuthenticatorTest);
+ CPPUNIT_TEST(testGetInitialResponse);
+ CPPUNIT_TEST(testGetInitialResponse_UsernameHasSpecialChars);
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+ void setUp() {
+ nonce = String("abcdefghABCDEFGH");
+ }
+
+ void testGetInitialResponse() {
+ SCRAMSHA1ClientAuthenticator testling(nonce);
+ testling.setCredentials("user", "pass", "");
+
+ ByteArray response = testling.getResponse();
+
+ CPPUNIT_ASSERT_EQUAL(String("n,,n=user,r=abcdefghABCDEFGH"), testling.getResponse().toString());
+ }
+
+ void testGetInitialResponse_UsernameHasSpecialChars() {
+ SCRAMSHA1ClientAuthenticator testling(nonce);
+ testling.setCredentials(",us=,er=", "pass", "");
+
+ ByteArray response = testling.getResponse();
+
+ CPPUNIT_ASSERT_EQUAL(String("n,,n==2Cus=3D=2Cer=3D,r=abcdefghABCDEFGH"), testling.getResponse().toString());
+ }
+
+ private:
+ String nonce;
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SCRAMSHA1ClientAuthenticatorTest);
diff --git a/Swiften/SConscript b/Swiften/SConscript
index d04c9fb..3b37f90 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -121,73 +121,74 @@ env.Append(UNITTEST_SOURCES = [
File("Elements/UnitTest/StanzasTest.cpp"),
File("EventLoop/UnitTest/EventLoopTest.cpp"),
File("EventLoop/UnitTest/SimpleEventLoopTest.cpp"),
File("History/UnitTest/SQLiteHistoryManagerTest.cpp"),
File("JID/UnitTest/JIDTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalConnectorTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceTest.cpp"),
File("Network/UnitTest/HostAddressTest.cpp"),
File("Network/UnitTest/ConnectorTest.cpp"),
File("Parser/PayloadParsers/UnitTest/BodyParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/DiscoInfoParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ErrorParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RawXMLPayloadParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ResourceBindParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RosterParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SecurityLabelParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SoftwareVersionParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StatusParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StatusShowParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/VCardParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StorageParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/PrivateStorageParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/VCardUpdateParserTest.cpp"),
File("Parser/UnitTest/AttributeMapTest.cpp"),
File("Parser/UnitTest/IQParserTest.cpp"),
File("Parser/UnitTest/MessageParserTest.cpp"),
File("Parser/UnitTest/PayloadParserFactoryCollectionTest.cpp"),
File("Parser/UnitTest/PresenceParserTest.cpp"),
File("Parser/UnitTest/SerializingParserTest.cpp"),
File("Parser/UnitTest/StanzaParserTest.cpp"),
File("Parser/UnitTest/StreamFeaturesParserTest.cpp"),
File("Parser/UnitTest/XMLParserTest.cpp"),
File("Parser/UnitTest/XMPPParserTest.cpp"),
File("Presence/UnitTest/PresenceOracleTest.cpp"),
File("Queries/Requests/UnitTest/GetPrivateStorageRequestTest.cpp"),
File("Queries/Responders/UnitTest/DiscoInfoResponderTest.cpp"),
File("Queries/UnitTest/IQRouterTest.cpp"),
File("Queries/UnitTest/RequestTest.cpp"),
File("Queries/UnitTest/ResponderTest.cpp"),
File("Roster/UnitTest/OfflineRosterFilterTest.cpp"),
File("Roster/UnitTest/RosterTest.cpp"),
File("Roster/UnitTest/XMPPRosterTest.cpp"),
File("SASL/UnitTest/PLAINMessageTest.cpp"),
File("SASL/UnitTest/PLAINClientAuthenticatorTest.cpp"),
+ File("SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PayloadsSerializer.cpp"),
File("Serializer/PayloadSerializers/UnitTest/CapsInfoSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/DiscoInfoSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/ErrorSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PrioritySerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/ResourceBindSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/RosterSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/SecurityLabelSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/SecurityLabelsCatalogSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/SoftwareVersionSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/StatusSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/StatusShowSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/VCardUpdateSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PrivateStorageSerializerTest.cpp"),
File("Serializer/UnitTest/StreamFeaturesSerializerTest.cpp"),
File("Serializer/XML/UnitTest/XMLElementTest.cpp"),
File("Server/UnitTest/ServerStanzaRouterTest.cpp"),
File("StreamStack/UnitTest/StreamStackTest.cpp"),
File("StreamStack/UnitTest/XMPPLayerTest.cpp"),
File("StringCodecs/UnitTest/Base64Test.cpp"),
File("StringCodecs/UnitTest/SHA1Test.cpp"),
File("StringCodecs/UnitTest/HMACSHA1Test.cpp"),
File("StringCodecs/UnitTest/PBKDF2Test.cpp"),
])