aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2021-01-31 01:18:35 +0100
committerTobias Fella <fella@posteo.de>2021-12-01 21:34:52 +0100
commitfe9b2f918753d40d93f8aecf182485e75d4b75bb (patch)
tree718b9f341c1ca04cca4b89699f753e9f5b74fa89 /lib
parent4593856411a2a8e4b82333abd5684b253daab47c (diff)
downloadlibquotient-fe9b2f918753d40d93f8aecf182485e75d4b75bb.tar.gz
libquotient-fe9b2f918753d40d93f8aecf182485e75d4b75bb.zip
More test but still failing in signing/signature verification
Diffstat (limited to 'lib')
-rw-r--r--lib/crypto/qolmaccount.cpp36
-rw-r--r--lib/crypto/qolmaccount.h8
-rw-r--r--lib/crypto/qolmutility.cpp23
-rw-r--r--lib/crypto/qolmutility.h2
4 files changed, 45 insertions, 24 deletions
diff --git a/lib/crypto/qolmaccount.cpp b/lib/crypto/qolmaccount.cpp
index 750d7318..e27bbee1 100644
--- a/lib/crypto/qolmaccount.cpp
+++ b/lib/crypto/qolmaccount.cpp
@@ -110,10 +110,10 @@ IdentityKeys QOlmAccount::identityKeys() const
QByteArray QOlmAccount::sign(const QByteArray &message) const
{
- const size_t signatureLength = olm_account_signature_length(m_account);
- QByteArray signatureBuffer(signatureLength, '0');
+ QByteArray signatureBuffer(olm_account_signature_length(m_account), '0');
+
const auto error = olm_account_sign(m_account, message.data(), message.length(),
- signatureBuffer.data(), signatureLength);
+ signatureBuffer.data(), signatureBuffer.length());
if (error == olm_error()) {
throw lastError(m_account);
@@ -216,9 +216,8 @@ OlmAccount *Quotient::QOlmAccount::data()
return m_account;
}
-UploadKeysJob *QOlmAccount::createUploadKeyRequest(const OneTimeKeys &oneTimeKeys)
+DeviceKeys QOlmAccount::getDeviceKeys() const
{
-
DeviceKeys deviceKeys;
deviceKeys.userId = m_userId;
deviceKeys.deviceId = m_deviceId;
@@ -231,6 +230,13 @@ UploadKeysJob *QOlmAccount::createUploadKeyRequest(const OneTimeKeys &oneTimeKey
const auto sign = signIdentityKeys();
deviceKeys.signatures[m_userId]["ed25519:" + m_deviceId] = sign;
+ return deviceKeys;
+}
+
+UploadKeysJob *QOlmAccount::createUploadKeyRequest(const OneTimeKeys &oneTimeKeys)
+{
+ auto deviceKeys = getDeviceKeys();
+
if (oneTimeKeys.curve25519().isEmpty()) {
return new UploadKeysJob(deviceKeys);
}
@@ -272,36 +278,34 @@ bool Quotient::verifyIdentitySignature(const DeviceKeys &deviceKeys,
const auto signingKey = deviceKeys.keys[signKeyId];
const auto signature = deviceKeys.signatures[userId][signKeyId];
-
if (signature.isEmpty()) {
+ qDebug() << "signature empty";
return false;
}
return ed25519VerifySignature(signingKey, toJson(deviceKeys), signature);
}
-bool Quotient::ed25519VerifySignature(QString signingKey,
- QJsonObject obj,
- QString signature)
+bool Quotient::ed25519VerifySignature(const QString &signingKey,
+ const QJsonObject &obj,
+ const QString &signature)
{
if (signature.isEmpty()) {
return false;
}
+ QJsonObject obj1 = obj;
- obj.remove("unsigned");
- obj.remove("signatures");
-
- QJsonDocument doc;
- doc.setObject(obj);
- auto canonicalJson = doc.toJson(QJsonDocument::Compact);
+ obj1.remove("unsigned");
+ obj1.remove("signatures");
- qDebug() << canonicalJson;
+ auto canonicalJson = QJsonDocument(obj1).toJson(QJsonDocument::Compact);
QByteArray signingKeyBuf = signingKey.toUtf8();
QOlmUtility utility;
auto signatureBuf = signature.toUtf8();
auto result = utility.ed25519Verify(signingKeyBuf, canonicalJson, signatureBuf);
if (std::holds_alternative<QOlmError>(result)) {
+ qDebug() << "error:" << std::get<QOlmError>(result);
return false;
}
diff --git a/lib/crypto/qolmaccount.h b/lib/crypto/qolmaccount.h
index 09ef623a..de78a8af 100644
--- a/lib/crypto/qolmaccount.h
+++ b/lib/crypto/qolmaccount.h
@@ -72,6 +72,8 @@ public:
UploadKeysJob *createUploadKeyRequest(const OneTimeKeys &oneTimeKeys);
+ DeviceKeys getDeviceKeys() const;
+
//! Remove the one time key used to create the supplied session.
[[nodiscard]] std::optional<QOlmError> removeOneTimeKeys(const std::unique_ptr<QOlmSession> &session) const;
@@ -104,9 +106,9 @@ bool verifyIdentitySignature(const DeviceKeys &deviceKeys,
const QString &userId);
//! checks if the signature is signed by the signing_key
-bool ed25519VerifySignature(QString signingKey,
- QJsonObject obj,
- QString signature);
+bool ed25519VerifySignature(const QString &signingKey,
+ const QJsonObject &obj,
+ const QString &signature);
} // namespace Quotient
diff --git a/lib/crypto/qolmutility.cpp b/lib/crypto/qolmutility.cpp
index 3c6a14c7..ad78a226 100644
--- a/lib/crypto/qolmutility.cpp
+++ b/lib/crypto/qolmutility.cpp
@@ -5,6 +5,7 @@
#ifdef Quotient_E2EE_ENABLED
#include "crypto/qolmutility.h"
#include "olm/olm.h"
+#include <QDebug>
using namespace Quotient;
@@ -19,10 +20,12 @@ QOlmUtility::QOlmUtility()
{
auto utility = new uint8_t[olm_utility_size()];
m_utility = olm_utility(utility);
+ qDebug() << "created";
}
QOlmUtility::~QOlmUtility()
{
+ qDebug() << "deleted";
olm_clear_utility(m_utility);
delete[](reinterpret_cast<uint8_t *>(m_utility));
}
@@ -43,15 +46,27 @@ QString QOlmUtility::sha256Utf8Msg(const QString &message) const
}
std::variant<bool, QOlmError> QOlmUtility::ed25519Verify(const QByteArray &key,
- const QByteArray &message, QByteArray &signature)
+ const QByteArray &message, const QByteArray &signature)
{
- const auto error = olm_ed25519_verify(m_utility, key.data(), key.length(),
- message.data(), message.length(), signature.data(), signature.length());
+ QByteArray signatureBuf(signature.length(), '0');
+ std::copy(signature.begin(), signature.end(), signatureBuf.begin());
+ qDebug() << "3" << key << message << signature;
+
+ const auto ret = olm_ed25519_verify(m_utility, key.data(), key.size(),
+ message.data(), message.size(), (void *)signatureBuf.data(), signatureBuf.size());
+
+ const auto error = ret;
if (error == olm_error()) {
+ qDebug() << QString(olm_utility_last_error(m_utility));
return lastError(m_utility);
}
- return error == 0;
+
+ if (ret != 0) {
+ qDebug() << "ed25519Verify" << ret;
+ return false;
+ }
+ return true;
}
diff --git a/lib/crypto/qolmutility.h b/lib/crypto/qolmutility.h
index 16c330eb..3de09ab4 100644
--- a/lib/crypto/qolmutility.h
+++ b/lib/crypto/qolmutility.h
@@ -36,7 +36,7 @@ public:
//! \param message QByteArray The message that was signed.
//! \param signature QByteArray The signature of the message.
std::variant<bool, QOlmError> ed25519Verify(const QByteArray &key,
- const QByteArray &message, QByteArray &signature);
+ const QByteArray &message, const QByteArray &signature);
private: