diff options
| author | Melvin Keskin <melvo@olomono.de> | 2021-09-02 23:41:16 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2021-09-03 16:16:15 +0200 |
| commit | 0623aa38f2ead734dddea4cbad899a868f01cb1e (patch) | |
| tree | ce6539732310386d2ba0faf7383c054a4690f3a2 /tests | |
| parent | 12c63eddded9f02369bd4e569f62acfdd95cc723 (diff) | |
| download | qxmpp-0623aa38f2ead734dddea4cbad899a868f01cb1e.tar.gz | |
Add QXmppOmemoElement
Co-authored-by: Germán Márquez Mejía <mancho@olomono.de>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/qxmppmessage/tst_qxmppmessage.cpp | 84 | ||||
| -rw-r--r-- | tests/qxmppomemodata/tst_qxmppomemodata.cpp | 171 |
2 files changed, 255 insertions, 0 deletions
diff --git a/tests/qxmppmessage/tst_qxmppmessage.cpp b/tests/qxmppmessage/tst_qxmppmessage.cpp index 3b9f4208..fe3340d8 100644 --- a/tests/qxmppmessage/tst_qxmppmessage.cpp +++ b/tests/qxmppmessage/tst_qxmppmessage.cpp @@ -4,6 +4,8 @@ * Authors: * Jeremy Lainé * Manjeet Dahiya + * Germán Márquez Mejía + * Melvin Keskin * * Source: * https://github.com/qxmpp-project/qxmpp @@ -26,6 +28,7 @@ #include "QXmppBitsOfBinaryDataList.h" #include "QXmppMessage.h" #include "QXmppMixInvitation.h" +#include "QXmppOmemoElement.h" #include "QXmppTrustMessageElement.h" #include <optional> @@ -69,6 +72,7 @@ private slots: void testSlashMe(); void testMixInvitation(); void testTrustMessageElement(); + void testOmemoElement(); }; void tst_QXmppMessage::testBasic_data() @@ -1131,5 +1135,85 @@ void tst_QXmppMessage::testTrustMessageElement() QVERIFY(message2.trustMessageElement()); } +void tst_QXmppMessage::testOmemoElement() +{ + const QByteArray xmlIn(QByteArrayLiteral( + "<message id=\"send1\" to=\"juliet@capulet.lit\" from=\"romeo@montague.lit\" type=\"normal\">" + "<store xmlns=\"urn:xmpp:hints\"/>" + "<encrypted xmlns=\"urn:xmpp:omemo:1\">" + "<header sid=\"27183\">" + "<keys jid=\"juliet@capulet.lit\">" + "<key rid=\"31415\">Oy5TSG9vVVV4Wz9wUkUvI1lUXiVLIU5bbGIsUV0wRngK</key>" + "</keys>" + "<keys jid=\"romeo@montague.lit\">" + "<key rid=\"1337\">PTEoSk91VnRZSXBzcFlPXy4jZ3NKcGVZZ2d3YVJbVj8K</key>" + "<key rid=\"12321\" kex=\"true\">a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK</key>" + "</keys>" + "</header>" + "<payload>" + "Vk9NPi99bHFWKmErOUVTTkAwW1VcZjJvPlElZWUoOk90Kz03YUF7OHc/WjpaQz9ieFdsZjBsSH1w" + "R1d2Zzt1bEFAMSZqP0dVJj9oaygmcWRPKGU3Kjc8aV4sJSlpSXBqaENCT2NUVFFmaFNXbCxQaHsj" + "OnthQDJyUW9qNjwoZCtpLzpzLGpbKlJRY1NtMVVeRzdsOWRQciNnXV9tajEyWztnKiEhRHs5K2hX" + "ZFloaEZtUENTQWIxM0tcVkxIVWY+aGYoeEk/SldZcyNlTzk2Q2NHW1NqWEhEPmhPXl1WZV5xNE9p" + "WDZuck8zPGE2Rk4vKWJXd3F1YV0mSXA/NVNGNEQsK18mTlJNbl9WcGJXcVE5e1E0dlFAPVQ8THM+" + "QjdcdjZSNDVJclo0QVo6cDBMQDtVcUFnNDpcd1ZXSkcsXz82QjhXLl9NSVBFdipeOmF4NC5YKnNx" + "K2dxMGx1MDkrdnJhWTovUjk1ZCZUUSNTKHIvJUgmTyE4bjJbZlZAPl9IZi8ucSM7a2FAQWUzXUJO" + "LmpALilFWGRqYlh1Siw2MzJqbipsWlZRMG91MGVQVlExLCFeayMuM3dfSn1ONiU8LixZWSx3YUlV" + "bGtIcnVWP2Y0LGwvTzFIQy8qZVVBSVZLS1peSW0xNTRPcXRDIXBkXnhmWyNxQFxHQ19cYXVAO214" + "RWw1P0AmIUAlQjk7ZFBWXW1RbWxoTFE+cUxMbk5UCg==" + "</payload>" + "</encrypted>" + "</message>")); + + // An OMEMO element having its OMEMO envelopes sorted in reverse order is + // needed since they are serialized in the reverse order in which they are + // deserialized. + const QByteArray xmlOut1(QByteArrayLiteral( + "<message id=\"send1\" to=\"juliet@capulet.lit\" from=\"romeo@montague.lit\" type=\"normal\">" + "<store xmlns=\"urn:xmpp:hints\"/>" + "<encrypted xmlns=\"urn:xmpp:omemo:1\">" + "<header sid=\"27183\">" + "<keys jid=\"juliet@capulet.lit\">" + "<key rid=\"31415\">Oy5TSG9vVVV4Wz9wUkUvI1lUXiVLIU5bbGIsUV0wRngK</key>" + "</keys>" + "<keys jid=\"romeo@montague.lit\">" + "<key rid=\"12321\" kex=\"true\">a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK</key>" + "<key rid=\"1337\">PTEoSk91VnRZSXBzcFlPXy4jZ3NKcGVZZ2d3YVJbVj8K</key>" + "</keys>" + "</header>" + "<payload>" + "Vk9NPi99bHFWKmErOUVTTkAwW1VcZjJvPlElZWUoOk90Kz03YUF7OHc/WjpaQz9ieFdsZjBsSH1w" + "R1d2Zzt1bEFAMSZqP0dVJj9oaygmcWRPKGU3Kjc8aV4sJSlpSXBqaENCT2NUVFFmaFNXbCxQaHsj" + "OnthQDJyUW9qNjwoZCtpLzpzLGpbKlJRY1NtMVVeRzdsOWRQciNnXV9tajEyWztnKiEhRHs5K2hX" + "ZFloaEZtUENTQWIxM0tcVkxIVWY+aGYoeEk/SldZcyNlTzk2Q2NHW1NqWEhEPmhPXl1WZV5xNE9p" + "WDZuck8zPGE2Rk4vKWJXd3F1YV0mSXA/NVNGNEQsK18mTlJNbl9WcGJXcVE5e1E0dlFAPVQ8THM+" + "QjdcdjZSNDVJclo0QVo6cDBMQDtVcUFnNDpcd1ZXSkcsXz82QjhXLl9NSVBFdipeOmF4NC5YKnNx" + "K2dxMGx1MDkrdnJhWTovUjk1ZCZUUSNTKHIvJUgmTyE4bjJbZlZAPl9IZi8ucSM7a2FAQWUzXUJO" + "LmpALilFWGRqYlh1Siw2MzJqbipsWlZRMG91MGVQVlExLCFeayMuM3dfSn1ONiU8LixZWSx3YUlV" + "bGtIcnVWP2Y0LGwvTzFIQy8qZVVBSVZLS1peSW0xNTRPcXRDIXBkXnhmWyNxQFxHQ19cYXVAO214" + "RWw1P0AmIUAlQjk7ZFBWXW1RbWxoTFE+cUxMbk5UCg==" + "</payload>" + "</encrypted>" + "</message>")); + + const QByteArray xmlOut2(QByteArrayLiteral( + "<message type=\"chat\">" + "<encrypted xmlns=\"urn:xmpp:omemo:1\">" + "<header sid=\"0\"/>" + "<payload/>" + "</encrypted>" + "</message>")); + + QXmppMessage message1; + parsePacket(message1, xmlIn); + QVERIFY(message1.omemoElement()); + serializePacket(message1, xmlOut1); + + QXmppMessage message2; + message2.setOmemoElement(QXmppOmemoElement()); + QVERIFY(message2.omemoElement()); + serializePacket(message2, xmlOut2); +} + QTEST_MAIN(tst_QXmppMessage) #include "tst_qxmppmessage.moc" diff --git a/tests/qxmppomemodata/tst_qxmppomemodata.cpp b/tests/qxmppomemodata/tst_qxmppomemodata.cpp index 8a583622..d53c7220 100644 --- a/tests/qxmppomemodata/tst_qxmppomemodata.cpp +++ b/tests/qxmppomemodata/tst_qxmppomemodata.cpp @@ -25,6 +25,7 @@ #include "QXmppOmemoDeviceBundle.h" #include "QXmppOmemoDeviceElement.h" #include "QXmppOmemoDeviceList.h" +#include "QXmppOmemoElement.h" #include "QXmppOmemoEnvelope.h" #include "util.h" @@ -49,6 +50,9 @@ private slots: void testIsOmemoEnvelope(); void testOmemoEnvelope_data(); void testOmemoEnvelope(); + void testIsOmemoElement_data(); + void testIsOmemoElement(); + void testOmemoElement(); }; void tst_QXmppOmemoData::testIsOmemoDeviceElement_data() @@ -310,5 +314,172 @@ void tst_QXmppOmemoData::testOmemoEnvelope() serializePacket(omemoEnvelope2, xml); } +void tst_QXmppOmemoData::testIsOmemoElement_data() +{ + QTest::addColumn<QByteArray>("xml"); + QTest::addColumn<bool>("isValid"); + + QTest::newRow("valid") + << QByteArrayLiteral("<encrypted xmlns=\"urn:xmpp:omemo:1\"/>") + << true; + QTest::newRow("invalidTag") + << QByteArrayLiteral("<invalid xmlns=\"urn:xmpp:omemo:1\"/>") + << false; + QTest::newRow("invalidNamespace") + << QByteArrayLiteral("<encrypted xmlns=\"invalid\"/>") + << false; +} + +void tst_QXmppOmemoData::testIsOmemoElement() +{ + QFETCH(QByteArray, xml); + QFETCH(bool, isValid); + + QDomDocument doc; + QCOMPARE(doc.setContent(xml, true), true); + const QDomElement element = doc.documentElement(); + QCOMPARE(QXmppOmemoElement::isOmemoElement(element), isValid); +} + +void tst_QXmppOmemoData::testOmemoElement() +{ + const QByteArray xmlIn(QByteArrayLiteral( + "<encrypted xmlns=\"urn:xmpp:omemo:1\">" + "<header sid=\"27183\">" + "<keys jid=\"juliet@capulet.lit\">" + "<key rid=\"31415\">Oy5TSG9vVVV4Wz9wUkUvI1lUXiVLIU5bbGIsUV0wRngK</key>" + "</keys>" + "<keys jid=\"romeo@montague.lit\">" + "<key rid=\"1337\">PTEoSk91VnRZSXBzcFlPXy4jZ3NKcGVZZ2d3YVJbVj8K</key>" + "<key rid=\"12321\" kex=\"true\">a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK</key>" + "</keys>" + "</header>" + "<payload>" + "Vk9NPi99bHFWKmErOUVTTkAwW1VcZjJvPlElZWUoOk90Kz03YUF7OHc/WjpaQz9ieFdsZjBsSH1w" + "R1d2Zzt1bEFAMSZqP0dVJj9oaygmcWRPKGU3Kjc8aV4sJSlpSXBqaENCT2NUVFFmaFNXbCxQaHsj" + "OnthQDJyUW9qNjwoZCtpLzpzLGpbKlJRY1NtMVVeRzdsOWRQciNnXV9tajEyWztnKiEhRHs5K2hX" + "ZFloaEZtUENTQWIxM0tcVkxIVWY+aGYoeEk/SldZcyNlTzk2Q2NHW1NqWEhEPmhPXl1WZV5xNE9p" + "WDZuck8zPGE2Rk4vKWJXd3F1YV0mSXA/NVNGNEQsK18mTlJNbl9WcGJXcVE5e1E0dlFAPVQ8THM+" + "QjdcdjZSNDVJclo0QVo6cDBMQDtVcUFnNDpcd1ZXSkcsXz82QjhXLl9NSVBFdipeOmF4NC5YKnNx" + "K2dxMGx1MDkrdnJhWTovUjk1ZCZUUSNTKHIvJUgmTyE4bjJbZlZAPl9IZi8ucSM7a2FAQWUzXUJO" + "LmpALilFWGRqYlh1Siw2MzJqbipsWlZRMG91MGVQVlExLCFeayMuM3dfSn1ONiU8LixZWSx3YUlV" + "bGtIcnVWP2Y0LGwvTzFIQy8qZVVBSVZLS1peSW0xNTRPcXRDIXBkXnhmWyNxQFxHQ19cYXVAO214" + "RWw1P0AmIUAlQjk7ZFBWXW1RbWxoTFE+cUxMbk5UCg==" + "</payload>" + "</encrypted>")); + + // An OMEMO element having its OMEMO envelopes sorted in reverse order is + // needed since they are serialized in the reverse order in which they are + // deserialized. + const QByteArray xmlOut(QByteArrayLiteral( + "<encrypted xmlns=\"urn:xmpp:omemo:1\">" + "<header sid=\"27183\">" + "<keys jid=\"juliet@capulet.lit\">" + "<key rid=\"31415\">Oy5TSG9vVVV4Wz9wUkUvI1lUXiVLIU5bbGIsUV0wRngK</key>" + "</keys>" + "<keys jid=\"romeo@montague.lit\">" + "<key rid=\"12321\" kex=\"true\">a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK</key>" + "<key rid=\"1337\">PTEoSk91VnRZSXBzcFlPXy4jZ3NKcGVZZ2d3YVJbVj8K</key>" + "</keys>" + "</header>" + "<payload>" + "Vk9NPi99bHFWKmErOUVTTkAwW1VcZjJvPlElZWUoOk90Kz03YUF7OHc/WjpaQz9ieFdsZjBsSH1w" + "R1d2Zzt1bEFAMSZqP0dVJj9oaygmcWRPKGU3Kjc8aV4sJSlpSXBqaENCT2NUVFFmaFNXbCxQaHsj" + "OnthQDJyUW9qNjwoZCtpLzpzLGpbKlJRY1NtMVVeRzdsOWRQciNnXV9tajEyWztnKiEhRHs5K2hX" + "ZFloaEZtUENTQWIxM0tcVkxIVWY+aGYoeEk/SldZcyNlTzk2Q2NHW1NqWEhEPmhPXl1WZV5xNE9p" + "WDZuck8zPGE2Rk4vKWJXd3F1YV0mSXA/NVNGNEQsK18mTlJNbl9WcGJXcVE5e1E0dlFAPVQ8THM+" + "QjdcdjZSNDVJclo0QVo6cDBMQDtVcUFnNDpcd1ZXSkcsXz82QjhXLl9NSVBFdipeOmF4NC5YKnNx" + "K2dxMGx1MDkrdnJhWTovUjk1ZCZUUSNTKHIvJUgmTyE4bjJbZlZAPl9IZi8ucSM7a2FAQWUzXUJO" + "LmpALilFWGRqYlh1Siw2MzJqbipsWlZRMG91MGVQVlExLCFeayMuM3dfSn1ONiU8LixZWSx3YUlV" + "bGtIcnVWP2Y0LGwvTzFIQy8qZVVBSVZLS1peSW0xNTRPcXRDIXBkXnhmWyNxQFxHQ19cYXVAO214" + "RWw1P0AmIUAlQjk7ZFBWXW1RbWxoTFE+cUxMbk5UCg==" + "</payload>" + "</encrypted>")); + + QXmppOmemoElement omemoElement1; + parsePacket(omemoElement1, xmlIn); + + QCOMPARE(omemoElement1.senderDeviceId(), uint32_t(27183)); + + const auto omemoEnvelope1 = omemoElement1.searchEnvelope(("juliet@capulet.lit"), 31415); + QVERIFY(omemoEnvelope1); + QCOMPARE(omemoEnvelope1->recipientDeviceId(), uint32_t(31415)); + QVERIFY(!omemoEnvelope1->isUsedForKeyExchange()); + QCOMPARE(omemoEnvelope1->data().toBase64(), QByteArrayLiteral("Oy5TSG9vVVV4Wz9wUkUvI1lUXiVLIU5bbGIsUV0wRngK")); + + const auto omemoEnvelope2 = omemoElement1.searchEnvelope(QStringLiteral("romeo@montague.lit"), 12321); + QVERIFY(omemoEnvelope2); + QCOMPARE(omemoEnvelope2->recipientDeviceId(), uint32_t(12321)); + QVERIFY(omemoEnvelope2->isUsedForKeyExchange()); + QCOMPARE(omemoEnvelope2->data().toBase64(), QByteArrayLiteral("a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK")); + + const auto omemoEnvelope3 = omemoElement1.searchEnvelope(QStringLiteral("romeo@montague.lit"), 1337); + QVERIFY(omemoEnvelope3); + QCOMPARE(omemoEnvelope3->recipientDeviceId(), uint32_t(1337)); + QVERIFY(!omemoEnvelope3->isUsedForKeyExchange()); + QCOMPARE(omemoEnvelope3->data().toBase64(), QByteArrayLiteral("PTEoSk91VnRZSXBzcFlPXy4jZ3NKcGVZZ2d3YVJbVj8K")); + + QCOMPARE( + omemoElement1.payload().toBase64(), + QByteArrayLiteral( + "Vk9NPi99bHFWKmErOUVTTkAwW1VcZjJvPlElZWUoOk90Kz03YUF7OHc/WjpaQz9ieFdsZjBsSH1w" + "R1d2Zzt1bEFAMSZqP0dVJj9oaygmcWRPKGU3Kjc8aV4sJSlpSXBqaENCT2NUVFFmaFNXbCxQaHsj" + "OnthQDJyUW9qNjwoZCtpLzpzLGpbKlJRY1NtMVVeRzdsOWRQciNnXV9tajEyWztnKiEhRHs5K2hX" + "ZFloaEZtUENTQWIxM0tcVkxIVWY+aGYoeEk/SldZcyNlTzk2Q2NHW1NqWEhEPmhPXl1WZV5xNE9p" + "WDZuck8zPGE2Rk4vKWJXd3F1YV0mSXA/NVNGNEQsK18mTlJNbl9WcGJXcVE5e1E0dlFAPVQ8THM+" + "QjdcdjZSNDVJclo0QVo6cDBMQDtVcUFnNDpcd1ZXSkcsXz82QjhXLl9NSVBFdipeOmF4NC5YKnNx" + "K2dxMGx1MDkrdnJhWTovUjk1ZCZUUSNTKHIvJUgmTyE4bjJbZlZAPl9IZi8ucSM7a2FAQWUzXUJO" + "LmpALilFWGRqYlh1Siw2MzJqbipsWlZRMG91MGVQVlExLCFeayMuM3dfSn1ONiU8LixZWSx3YUlV" + "bGtIcnVWP2Y0LGwvTzFIQy8qZVVBSVZLS1peSW0xNTRPcXRDIXBkXnhmWyNxQFxHQ19cYXVAO214" + "RWw1P0AmIUAlQjk7ZFBWXW1RbWxoTFE+cUxMbk5UCg==")); + + serializePacket(omemoElement1, xmlOut); + + QXmppOmemoElement omemoElement2; + omemoElement2.setSenderDeviceId(27183); + omemoElement2.setPayload( + QByteArray::fromBase64(QByteArrayLiteral( + "Vk9NPi99bHFWKmErOUVTTkAwW1VcZjJvPlElZWUoOk90Kz03YUF7OHc/WjpaQz9ieFdsZjBsSH1w" + "R1d2Zzt1bEFAMSZqP0dVJj9oaygmcWRPKGU3Kjc8aV4sJSlpSXBqaENCT2NUVFFmaFNXbCxQaHsj" + "OnthQDJyUW9qNjwoZCtpLzpzLGpbKlJRY1NtMVVeRzdsOWRQciNnXV9tajEyWztnKiEhRHs5K2hX" + "ZFloaEZtUENTQWIxM0tcVkxIVWY+aGYoeEk/SldZcyNlTzk2Q2NHW1NqWEhEPmhPXl1WZV5xNE9p" + "WDZuck8zPGE2Rk4vKWJXd3F1YV0mSXA/NVNGNEQsK18mTlJNbl9WcGJXcVE5e1E0dlFAPVQ8THM+" + "QjdcdjZSNDVJclo0QVo6cDBMQDtVcUFnNDpcd1ZXSkcsXz82QjhXLl9NSVBFdipeOmF4NC5YKnNx" + "K2dxMGx1MDkrdnJhWTovUjk1ZCZUUSNTKHIvJUgmTyE4bjJbZlZAPl9IZi8ucSM7a2FAQWUzXUJO" + "LmpALilFWGRqYlh1Siw2MzJqbipsWlZRMG91MGVQVlExLCFeayMuM3dfSn1ONiU8LixZWSx3YUlV" + "bGtIcnVWP2Y0LGwvTzFIQy8qZVVBSVZLS1peSW0xNTRPcXRDIXBkXnhmWyNxQFxHQ19cYXVAO214" + "RWw1P0AmIUAlQjk7ZFBWXW1RbWxoTFE+cUxMbk5UCg=="))); + + QXmppOmemoEnvelope omemoEnvelope4; + omemoEnvelope4.setRecipientDeviceId(31415); + omemoEnvelope4.setData(QByteArray::fromBase64("Oy5TSG9vVVV4Wz9wUkUvI1lUXiVLIU5bbGIsUV0wRngK")); + omemoElement2.addEnvelope(QStringLiteral("juliet@capulet.lit"), omemoEnvelope4); + + QXmppOmemoEnvelope omemoEnvelope5; + omemoEnvelope5.setRecipientDeviceId(12321); + omemoEnvelope5.setIsUsedForKeyExchange(true); + omemoEnvelope5.setData(QByteArray::fromBase64("a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK")); + omemoElement2.addEnvelope(QStringLiteral("romeo@montague.lit"), omemoEnvelope5); + + QXmppOmemoEnvelope omemoEnvelope6; + omemoEnvelope6.setRecipientDeviceId(1337); + omemoEnvelope6.setData(QByteArray::fromBase64("PTEoSk91VnRZSXBzcFlPXy4jZ3NKcGVZZ2d3YVJbVj8K")); + omemoElement2.addEnvelope(QStringLiteral("romeo@montague.lit"), omemoEnvelope6); + + QCOMPARE(omemoElement2.senderDeviceId(), uint32_t(27183)); + + const auto omemoEnvelope7 = omemoElement2.searchEnvelope(QStringLiteral("romeo@montague.lit"), 12321); + QVERIFY(omemoEnvelope7); + QCOMPARE(omemoEnvelope7->recipientDeviceId(), uint32_t(12321)); + QVERIFY(omemoEnvelope7->isUsedForKeyExchange()); + QCOMPARE(omemoEnvelope7->data().toBase64(), QByteArrayLiteral("a012U0R9WixWKUYhYipucnZOWG06akFOR3Q1NGNOOmUK")); + + const auto omemoEnvelope8 = omemoElement2.searchEnvelope(QStringLiteral("juliet@capulet.lit"), 31415); + QVERIFY(omemoEnvelope8); + QVERIFY(!omemoEnvelope8->isUsedForKeyExchange()); + + serializePacket(omemoElement2, xmlIn); +} + QTEST_MAIN(tst_QXmppOmemoData) #include "tst_qxmppomemodata.moc" |
