diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-11-10 11:10:10 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-11-10 11:10:10 +0000 |
| commit | 83a329cbe139c9980167b9390fcabc1b851e1efc (patch) | |
| tree | 6e1d9db162d9a43be706fdd038ab0ea95c549ffd /src | |
| parent | d6d0b4d7a57b9d36b868b49fb83bf6ddc301274b (diff) | |
| download | qxmpp-83a329cbe139c9980167b9390fcabc1b851e1efc.tar.gz | |
slightly refactor SASL auth to make QXmppSaslDigestMd5 class more generic
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppIncomingClient.cpp | 3 | ||||
| -rw-r--r-- | src/QXmppOutgoingClient.cpp | 3 | ||||
| -rw-r--r-- | src/QXmppSaslAuth.cpp | 29 | ||||
| -rw-r--r-- | src/QXmppSaslAuth.h | 7 |
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; |
