Skip to content

Commit

Permalink
Fast: Add SaslHtClient
Browse files Browse the repository at this point in the history
  • Loading branch information
lnjX committed May 22, 2024
1 parent 9721f0b commit 4741748
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
25 changes: 23 additions & 2 deletions src/base/QXmppSasl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1018,8 +1018,8 @@ std::unique_ptr<QXmppSaslClient> QXmppSaslClient::create(SaslMechanism mechanism
[&](SaslScramMechanism scram) {
return std::make_unique<QXmppSaslClientScram>(scram, parent);
},
[&](SaslHtMechanism) {
return nullptr;
[&](SaslHtMechanism ht) {
return std::make_unique<QXmppSaslClientHt>(ht, parent);
},
[&](SaslPlainMechanism) {
return std::make_unique<QXmppSaslClientPlain>(parent);
Expand Down Expand Up @@ -1636,3 +1636,24 @@ QByteArray QXmppSaslDigestMd5::serializeMessage(const QMap<QByteArray, QByteArra
}
return ba;
}

std::optional<QByteArray> QXmppSaslClientHt::respond(const QByteArray &challenge)
{
// TODO: verify <additional-data/> provided by SASL 2 (hmac key 'Responder' + cb data).

Q_ASSERT(m_mechanism.channelBindingType == QXmpp::Private::SaslHtMechanism::None);

if (m_done || !challenge.isEmpty()) {
return {};
}

// key: 'Initiator' + channel-binding data
const auto key = QByteArrayLiteral("Initiator");
QMessageAuthenticationCode hmac(
ianaHashAlgorithmToQt(m_mechanism.hashAlgorithm),
key);
hmac.addData(password().toUtf8());

m_done = true;
return hmac.result();
}
19 changes: 19 additions & 0 deletions src/base/QXmppSasl_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,25 @@ class QXmppSaslClientScram : public QXmppSaslClient
QByteArray m_nonce;
};

class QXmppSaslClientHt : public QXmppSaslClient
{
Q_OBJECT
using HtMechanism = QXmpp::Private::SaslHtMechanism;

public:
QXmppSaslClientHt(HtMechanism mechanism, QObject *parent)
: QXmppSaslClient(parent), m_mechanism(mechanism)
{
}

QString mechanism() const override { return m_mechanism.toString(); }
std::optional<QByteArray> respond(const QByteArray &challenge) override;

private:
HtMechanism m_mechanism;
bool m_done = false;
};

class QXmppSaslClientWindowsLive : public QXmppSaslClient
{
Q_OBJECT
Expand Down

0 comments on commit 4741748

Please sign in to comment.