aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-11-10 11:10:10 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-11-10 11:10:10 +0000
commit83a329cbe139c9980167b9390fcabc1b851e1efc (patch)
tree6e1d9db162d9a43be706fdd038ab0ea95c549ffd /src
parentd6d0b4d7a57b9d36b868b49fb83bf6ddc301274b (diff)
downloadqxmpp-83a329cbe139c9980167b9390fcabc1b851e1efc.tar.gz
slightly refactor SASL auth to make QXmppSaslDigestMd5 class more generic
Diffstat (limited to 'src')
-rw-r--r--src/QXmppIncomingClient.cpp3
-rw-r--r--src/QXmppOutgoingClient.cpp3
-rw-r--r--src/QXmppSaslAuth.cpp29
-rw-r--r--src/QXmppSaslAuth.h7
4 files changed, 37 insertions, 5 deletions
diff --git a/src/QXmppIncomingClient.cpp b/src/QXmppIncomingClient.cpp
index 81ef14de..ff2dc940 100644
--- a/src/QXmppIncomingClient.cpp
+++ b/src/QXmppIncomingClient.cpp
@@ -213,13 +213,14 @@ void QXmppIncomingClient::handleStanza(const QDomElement &nodeRecv)
{
// generate nonce
d->saslDigest.setNonce(QXmppSaslDigestMd5::generateNonce());
+ d->saslDigest.setQop("auth");
d->saslDigest.setRealm(d->domain.toUtf8());
d->saslStep = 1;
QMap<QByteArray, QByteArray> challenge;
challenge["nonce"] = d->saslDigest.nonce();
challenge["realm"] = d->saslDigest.realm();
- challenge["qop"] = "auth";
+ challenge["qop"] = d->saslDigest.qop();
challenge["charset"] = "utf-8";
challenge["algorithm"] = "md5-sess";
diff --git a/src/QXmppOutgoingClient.cpp b/src/QXmppOutgoingClient.cpp
index 08f557a9..a403520f 100644
--- a/src/QXmppOutgoingClient.cpp
+++ b/src/QXmppOutgoingClient.cpp
@@ -633,6 +633,7 @@ void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep1(const QString& challeng
d->saslDigest.setDigestUri(QString("xmpp/%1").arg(configuration().domain()).toUtf8());
d->saslDigest.setNc("00000001");
d->saslDigest.setNonce(map.value("nonce"));
+ d->saslDigest.setQop("auth");
d->saslDigest.setRealm(map.value("realm"));
d->saslDigest.setUsername(configuration().user().toUtf8());
d->saslDigest.setPassword(configuration().password().toUtf8());
@@ -645,7 +646,7 @@ void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep1(const QString& challeng
response["nonce"] = d->saslDigest.nonce();
response["cnonce"] = d->saslDigest.cnonce();
response["nc"] = d->saslDigest.nc();
- response["qop"] = "auth";
+ response["qop"] = d->saslDigest.qop();
response["digest-uri"] = d->saslDigest.digestUri();
response["response"] = d->saslDigest.calculateDigest(
QByteArray("AUTHENTICATE:") + d->saslDigest.digestUri());
diff --git a/src/QXmppSaslAuth.cpp b/src/QXmppSaslAuth.cpp
index 89f4edd4..4a7453d8 100644
--- a/src/QXmppSaslAuth.cpp
+++ b/src/QXmppSaslAuth.cpp
@@ -79,6 +79,16 @@ void QXmppSaslDigestMd5::setNonce(const QByteArray &nonce)
m_nonce = nonce;
}
+QByteArray QXmppSaslDigestMd5::qop() const
+{
+ return m_qop;
+}
+
+void QXmppSaslDigestMd5::setQop(const QByteArray &qop)
+{
+ m_qop = qop;
+}
+
QByteArray QXmppSaslDigestMd5::realm() const
{
return m_realm;
@@ -113,6 +123,11 @@ QByteArray QXmppSaslDigestMd5::generateNonce()
return nonce.toBase64();
}
+/// Calculate digest response for use with XMPP/SASL.
+///
+/// \param A2
+///
+
QByteArray QXmppSaslDigestMd5::calculateDigest(const QByteArray &A2) const
{
const QByteArray a1 = m_username + ':' + m_realm + ':' + m_password;
@@ -122,11 +137,21 @@ QByteArray QXmppSaslDigestMd5::calculateDigest(const QByteArray &A2) const
if (!m_authzid.isEmpty())
ha1 += ':' + m_authzid;
- QByteArray A1(ha1);
+ return calculateDigest(ha1, A2);
+}
+
+/// Calculate generic digest response.
+///
+/// \param A1
+/// \param A2
+///
+
+QByteArray QXmppSaslDigestMd5::calculateDigest(const QByteArray &A1, const QByteArray &A2) const
+{
QByteArray HA1 = QCryptographicHash::hash(A1, QCryptographicHash::Md5).toHex();
QByteArray HA2 = QCryptographicHash::hash(A2, QCryptographicHash::Md5).toHex();
QByteArray KD = HA1 + ':' + m_nonce + ':' + m_nc + ':' + m_cnonce + ':'
- + "auth" + ':' + HA2;
+ + m_qop + ':' + HA2;
return QCryptographicHash::hash(KD, QCryptographicHash::Md5).toHex();
}
diff --git a/src/QXmppSaslAuth.h b/src/QXmppSaslAuth.h
index 1667826f..21e93b35 100644
--- a/src/QXmppSaslAuth.h
+++ b/src/QXmppSaslAuth.h
@@ -46,6 +46,9 @@ public:
QByteArray nonce() const;
void setNonce(const QByteArray &nonce);
+ QByteArray qop() const;
+ void setQop(const QByteArray &qop);
+
QByteArray realm() const;
void setRealm(const QByteArray &realm);
@@ -54,7 +57,8 @@ public:
void setPassword(const QByteArray &password);
- QByteArray calculateDigest(const QByteArray &a2) const;
+ QByteArray calculateDigest(const QByteArray &A2) const;
+ QByteArray calculateDigest(const QByteArray &A1, const QByteArray &A2) const;
static QByteArray generateNonce();
// message parsing and serialization
@@ -67,6 +71,7 @@ private:
QByteArray m_digestUri;
QByteArray m_nc;
QByteArray m_nonce;
+ QByteArray m_qop;
QByteArray m_realm;
QByteArray m_username;
QByteArray m_password;