diff options
| author | Remko Tronçon <git@el-tramo.be> | 2009-11-22 17:20:19 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2009-11-22 17:20:19 (GMT) | 
| commit | 2c4ea892d1da498e486ce48d80de0eee547375f2 (patch) | |
| tree | 6c9497468f0f93071fb7e93e258b8c43684619bc | |
| parent | 497dd9b099e5810057ebcd8a3f6755819cfecdef (diff) | |
| download | swift-2c4ea892d1da498e486ce48d80de0eee547375f2.zip swift-2c4ea892d1da498e486ce48d80de0eee547375f2.tar.bz2 | |
Add support for authorization ID to SCRAM-SHA-1.
| -rw-r--r-- | Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp | 10 | ||||
| -rw-r--r-- | Swiften/SASL/SCRAMSHA1ClientAuthenticator.h | 1 | ||||
| -rw-r--r-- | Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp | 15 | 
3 files changed, 21 insertions, 5 deletions
| diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp index b55e5e4..8621b85 100644 --- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp +++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp @@ -17,7 +17,7 @@ SCRAMSHA1ClientAuthenticator::SCRAMSHA1ClientAuthenticator(const String& nonce)  ByteArray SCRAMSHA1ClientAuthenticator::getResponse() const {  	if (step == Initial) { -		return "n,," + getInitialBareClientMessage(); +		return getGS2Header() + getInitialBareClientMessage();  	}  	else {  		ByteArray clientKey = HMACSHA1::getResult(saltedPassword, "Client Key"); @@ -27,7 +27,7 @@ ByteArray SCRAMSHA1ClientAuthenticator::getResponse() const {  		for (unsigned int i = 0; i < clientProof.getSize(); ++i) {  			clientProof[i] ^= clientSignature[i];  		} -		ByteArray result = ByteArray("c=biwsCg==,r=") + clientnonce + serverNonce + ",p=" + Base64::encode(clientProof); +		ByteArray result = ByteArray("c=") + Base64::encode(getGS2Header()) + ",r=" + clientnonce + serverNonce + ",p=" + Base64::encode(clientProof);  		return result;  	}  } @@ -66,7 +66,7 @@ bool SCRAMSHA1ClientAuthenticator::setChallenge(const ByteArray& challenge) {  		// Compute all the values needed for the server signature  		saltedPassword = PBKDF2::encode(StringPrep::getPrepared(getPassword(), StringPrep::SASLPrep), salt, iterations); -		authMessage = getInitialBareClientMessage() + "," + initialServerMessage + "," + "c=biwsCg==," + "r=" + clientnonce + serverNonce; +		authMessage = getInitialBareClientMessage() + "," + initialServerMessage + "," + "c=" + Base64::encode(getGS2Header()) + ",r=" + clientnonce + serverNonce;  		ByteArray serverKey = HMACSHA1::getResult(saltedPassword, "Server Key");  		serverSignature = HMACSHA1::getResult(serverKey, authMessage); @@ -124,4 +124,8 @@ ByteArray SCRAMSHA1ClientAuthenticator::getInitialBareClientMessage() const {  	return ByteArray(String("n=" + escapedAuthenticationID + ",r=" + clientnonce));  } +ByteArray SCRAMSHA1ClientAuthenticator::getGS2Header() const { +	return ByteArray("n,") + getAuthorizationID() + ","; +} +  } diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h index 108ac2e..b8aaa17 100644 --- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h +++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.h @@ -17,6 +17,7 @@ namespace Swift {  		private:  			ByteArray getInitialBareClientMessage() const;  			static std::map<char, String> parseMap(const String&); +			ByteArray getGS2Header() const;  		private:  			enum Step { diff --git a/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp index 6558ec7..6f64100 100644 --- a/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp +++ b/Swiften/SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp @@ -10,6 +10,7 @@ class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture {  		CPPUNIT_TEST_SUITE(SCRAMSHA1ClientAuthenticatorTest);  		CPPUNIT_TEST(testGetInitialResponse);  		CPPUNIT_TEST(testGetInitialResponse_UsernameHasSpecialChars); +		CPPUNIT_TEST(testGetInitialResponse_WithAuthorizationID);  		CPPUNIT_TEST(testGetFinalResponse);  		CPPUNIT_TEST(testSetChallenge);  		CPPUNIT_TEST(testSetChallenge_InvalidClientNonce); @@ -44,6 +45,15 @@ class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT_EQUAL(String("n,,n==2Cus=3D=2Cer=3D,r=abcdefghABCDEFGH"), testling.getResponse().toString());  		} +		void testGetInitialResponse_WithAuthorizationID() { +			SCRAMSHA1ClientAuthenticator testling("abcdefghABCDEFGH"); +			testling.setCredentials("user", "pass", "auth"); + +			ByteArray response = testling.getResponse(); + +			CPPUNIT_ASSERT_EQUAL(String("n,auth,n=user,r=abcdefghABCDEFGH"), testling.getResponse().toString()); +		} +  		void testGetFinalResponse() {  			SCRAMSHA1ClientAuthenticator testling("abcdefgh");  			testling.setCredentials("user", "pass", ""); @@ -51,14 +61,15 @@ class SCRAMSHA1ClientAuthenticatorTest : public CppUnit::TestFixture {  			ByteArray response = testling.getResponse(); -			CPPUNIT_ASSERT_EQUAL(String("c=biwsCg==,r=abcdefghABCDEFGH,p=bVzb1EAf2hXw5Z+QIMYPTy5TOsU="), testling.getResponse().toString()); +			CPPUNIT_ASSERT_EQUAL(String("c=biws,r=abcdefghABCDEFGH,p=CZbjGDpIteIJwQNBgO0P8pKkMGY="), testling.getResponse().toString());  		}  		void testSetFinalChallenge() {  			SCRAMSHA1ClientAuthenticator testling("abcdefgh");  			testling.setCredentials("user", "pass", "");  			testling.setChallenge(ByteArray("r=abcdefghABCDEFGH,s=MTIzNDU2NzgK,i=4096")); -			bool result = testling.setChallenge(ByteArray("v=xWI/+vT8aAm0hKpqKIqctIDwtQE=")); + +			bool result = testling.setChallenge(ByteArray("v=Dd+Q20knZs9jeeK0pi1Mx1Se+yo="));  			CPPUNIT_ASSERT(result);  		} | 
 Swift
 Swift