File: contentencryptiontest.cpp

package info (click to toggle)
kunifiedpush 25.08.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,036 kB
  • sloc: cpp: 4,524; xml: 154; java: 141; makefile: 5; sh: 1
file content (81 lines) | stat: -rw-r--r-- 3,865 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
    SPDX-FileCopyrightText: 2025 Volker Krause <vkrause@kde.org>
    SPDX-License-Identifier: LGPL-2.0-or-later
*/

#include "../src/client/contentencryption_p.h"

#include <QTest>

using namespace KUnifiedPush;

class ContentEncryptionTest : public QObject
{
    Q_OBJECT
private Q_SLOTS:
    void testDecrypt()
    {
        // see RFC 8291 ยง5 and Appendix A
        ContentEncryption enc(
            QByteArray::fromBase64("BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4", QByteArray::Base64UrlEncoding),
            QByteArray::fromBase64("q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94", QByteArray::Base64UrlEncoding),
            QByteArray::fromBase64("BTBZMqHH6r4Tts7J_aSIgg", QByteArray::Base64UrlEncoding)
        );
        QVERIFY(enc.hasKeys());

        const auto msg = enc.decrypt(QByteArray::fromBase64("DGv6ra1nlYgDCS1FRnbzlwAAEABBBP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIgDll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A_yl95bQpu6cVPTpK4Mqgkf1CXztLVBSt2Ks3oZwbuwXPXLWyouBWLVWGNWQexSgSxsj_Qulcy4a-fN", QByteArray::Base64UrlEncoding));
        QCOMPARE(msg, "When I grow up, I want to be a watermelon");
    }

    void testEmpty()
    {
        ContentEncryption enc;
        QVERIFY(!enc.hasKeys());
        QVERIFY(enc.decrypt(QByteArray::fromBase64("DGv6ra1nlYgDCS1FRnbzlwAAEABBBP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIgDll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A_yl95bQpu6cVPTpK4Mqgkf1CXztLVBSt2Ks3oZwbuwXPXLWyouBWLVWGNWQexSgSxsj_Qulcy4a-fN", QByteArray::Base64UrlEncoding)).isEmpty());
    }

    void testInvalidMessage()
    {
        ContentEncryption enc(
            QByteArray::fromBase64("BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4", QByteArray::Base64UrlEncoding),
            QByteArray::fromBase64("q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94", QByteArray::Base64UrlEncoding),
            QByteArray::fromBase64("BTBZMqHH6r4Tts7J_aSIgg", QByteArray::Base64UrlEncoding)
        );
        QVERIFY(enc.hasKeys());

        QVERIFY(enc.decrypt(QByteArray()).isEmpty());
        QVERIFY(enc.decrypt("When I grow up, I want to be a watermelon").isEmpty());
        const auto msg = enc.decrypt(QByteArray::fromBase64("DGv6ra1nlYgDCS1FRnbzlwAAEABBBP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIgDll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A_yl95bQpu6cVPTpK4Mqgkf1CXztLVBSt2Ks3oZwbuwXPXLWyouBWLVWGNWQexSgSxsj_Qulcy4a-fM", QByteArray::Base64UrlEncoding));
        QCOMPARE(msg, QByteArray());
    }

    void testInvalidKey()
    {
        ContentEncryption enc(
            QByteArray::fromBase64("BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcx aOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw5", QByteArray::Base64UrlEncoding),
            QByteArray::fromBase64("q1dXpw3UpT5VOmu_cf_v6ih07Aems3njxI-JWgLcM94", QByteArray::Base64UrlEncoding),
            QByteArray::fromBase64("BTBZMqHH6r4Tts7J_aSIgg", QByteArray::Base64UrlEncoding)
        );
        QVERIFY(enc.hasKeys());

        QVERIFY(enc.decrypt(QByteArray()).isEmpty());
        const auto msg = enc.decrypt(QByteArray::fromBase64("DGv6ra1nlYgDCS1FRnbzlwAAEABBBP4z9KsN6nGRTbVYI_c7VJSPQTBtkgcy27mlmlMoZIIgDll6e3vCYLocInmYWAmS6TlzAC8wEqKK6PBru3jl7A_yl95bQpu6cVPTpK4Mqgkf1CXztLVBSt2Ks3oZwbuwXPXLWyouBWLVWGNWQexSgSxsj_Qulcy4a-fM", QByteArray::Base64UrlEncoding));
        QCOMPARE(msg, QByteArray());
    }

    void testKeyGen()
    {
        const auto enc = ContentEncryption::generateKeys();
        QCOMPARE(enc.authSecret().size(), 16);
        QCOMPARE(enc.publicKey().size(), 65);
        QCOMPARE(enc.publicKey()[0], 0x04);
        // should be 32 but leading zeros are not included
        QVERIFY(enc.privateKey().size() <= 32);
        QVERIFY(enc.privateKey().size() > 0);
        QVERIFY(enc.hasKeys());
    }
};

QTEST_GUILESS_MAIN(ContentEncryptionTest)

#include "contentencryptiontest.moc"