diff options
Diffstat (limited to 'Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp')
| -rw-r--r-- | Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp | 2 | 
1 files changed, 1 insertions, 1 deletions
diff --git a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp index a261810..5e6179f 100644 --- a/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp +++ b/Swiften/SASL/SCRAMSHA1ClientAuthenticator.cpp @@ -1,89 +1,89 @@  #include "Swiften/SASL/SCRAMSHA1ClientAuthenticator.h"  #include <cassert>  #include <map>  #include <boost/lexical_cast.hpp>  #include "Swiften/StringCodecs/SHA1.h"  #include "Swiften/StringCodecs/Base64.h"  #include "Swiften/StringCodecs/HMACSHA1.h"  #include "Swiften/StringCodecs/PBKDF2.h"  #include "Swiften/StringPrep/StringPrep.h"  namespace Swift {  static String escape(const String& s) {  	String result;  	for (size_t i = 0; i < s.getUTF8Size(); ++i) {  		if (s[i] == ',') {  			result += "=2C";  		}  		else if (s[i] == '=') {  			result += "=3D";  		}  		else {  			result += s[i];  		}  	}  	return result;  }  SCRAMSHA1ClientAuthenticator::SCRAMSHA1ClientAuthenticator(const String& nonce) : ClientAuthenticator("SCRAM-SHA-1"), step(Initial), clientnonce(nonce) {  }  ByteArray SCRAMSHA1ClientAuthenticator::getResponse() const {  	if (step == Initial) {  		return getGS2Header() + getInitialBareClientMessage();  	}  	else {  		ByteArray clientKey = HMACSHA1::getResult(saltedPassword, "Client Key"); -		ByteArray storedKey = SHA1::getBinaryHash(clientKey); +		ByteArray storedKey = SHA1::getHash(clientKey);  		ByteArray clientSignature = HMACSHA1::getResult(storedKey, authMessage);  		ByteArray clientProof = clientKey;  		for (unsigned int i = 0; i < clientProof.getSize(); ++i) {  			clientProof[i] ^= clientSignature[i];  		}  		ByteArray result = ByteArray("c=") + Base64::encode(getGS2Header()) + ",r=" + clientnonce + serverNonce + ",p=" + Base64::encode(clientProof);  		return result;  	}  }  bool SCRAMSHA1ClientAuthenticator::setChallenge(const ByteArray& challenge) {  	if (step == Initial) {  		initialServerMessage = challenge;  		std::map<char, String> keys = parseMap(String(initialServerMessage.getData(), initialServerMessage.getSize()));  		// Extract the salt  		ByteArray salt = Base64::decode(keys['s']);  		// Extract the server nonce  		String clientServerNonce = keys['r'];  		if (clientServerNonce.getUTF8Size() <= clientnonce.getUTF8Size()) {  			return false;  		}  		String receivedClientNonce = clientServerNonce.getSubstring(0, clientnonce.getUTF8Size());  		if (receivedClientNonce != clientnonce) {  			return false;  		}  		serverNonce = clientServerNonce.getSubstring(clientnonce.getUTF8Size(), clientServerNonce.npos());  		// Extract the number of iterations  		int iterations = 0;  		try {  			iterations = boost::lexical_cast<int>(keys['i'].getUTF8String());  		}  		catch (const boost::bad_lexical_cast&) {  			return false;  		}  		if (iterations <= 0) {  			return false;  		}  		// Compute all the values needed for the server signature  		saltedPassword = PBKDF2::encode(StringPrep::getPrepared(getPassword(), StringPrep::SASLPrep), salt, iterations);  		authMessage = getInitialBareClientMessage() + "," + initialServerMessage + "," + "c=" + Base64::encode(getGS2Header()) + ",r=" + clientnonce + serverNonce;  		ByteArray serverKey = HMACSHA1::getResult(saltedPassword, "Server Key");  		serverSignature = HMACSHA1::getResult(serverKey, authMessage);  | 
 Swift