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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/*
This software is in the public domain, furnished "as is", without technical
support, and with no warranty, express or implied, as to its usefulness for
any purpose.
*/
#include <QtTest>
#include "clientsideencryption.h"
using namespace OCC;
class TestClientSideEncryption : public QObject
{
Q_OBJECT
QByteArray convertToOldStorageFormat(const QByteArray &data)
{
return data.split('|').join("fA==");
}
private slots:
void shouldEncryptPrivateKeys()
{
// GIVEN
const auto encryptionKey = QByteArrayLiteral("foo");
const auto privateKey = QByteArrayLiteral("bar");
const auto originalSalt = QByteArrayLiteral("baz");
// WHEN
const auto cipher = EncryptionHelper::encryptPrivateKey(encryptionKey, privateKey, originalSalt);
// THEN
const auto parts = cipher.split('|');
QCOMPARE(parts.size(), 3);
const auto encryptedKey = QByteArray::fromBase64(parts[0]);
const auto iv = QByteArray::fromBase64(parts[1]);
const auto salt = QByteArray::fromBase64(parts[2]);
// We're not here to check the merits of the encryption but at least make sure it's been
// somewhat ciphered
QVERIFY(!encryptedKey.isEmpty());
QVERIFY(encryptedKey != privateKey);
QVERIFY(!iv.isEmpty());
QCOMPARE(salt, originalSalt);
}
void shouldDecryptPrivateKeys()
{
// GIVEN
const auto encryptionKey = QByteArrayLiteral("foo");
const auto originalPrivateKey = QByteArrayLiteral("bar");
const auto originalSalt = QByteArrayLiteral("baz");
const auto cipher = EncryptionHelper::encryptPrivateKey(encryptionKey, originalPrivateKey, originalSalt);
// WHEN
const auto privateKey = EncryptionHelper::decryptPrivateKey(encryptionKey, cipher);
const auto salt = EncryptionHelper::extractPrivateKeySalt(cipher);
// THEN
QCOMPARE(privateKey, originalPrivateKey);
QCOMPARE(salt, originalSalt);
}
void shouldDecryptPrivateKeysInOldStorageFormat()
{
// GIVEN
const auto encryptionKey = QByteArrayLiteral("foo");
const auto originalPrivateKey = QByteArrayLiteral("bar");
const auto originalSalt = QByteArrayLiteral("baz");
const auto cipher = convertToOldStorageFormat(EncryptionHelper::encryptPrivateKey(encryptionKey, originalPrivateKey, originalSalt));
// WHEN
const auto privateKey = EncryptionHelper::decryptPrivateKey(encryptionKey, cipher);
const auto salt = EncryptionHelper::extractPrivateKeySalt(cipher);
// THEN
QCOMPARE(privateKey, originalPrivateKey);
QCOMPARE(salt, originalSalt);
}
void shouldSymmetricEncryptStrings()
{
// GIVEN
const auto encryptionKey = QByteArrayLiteral("foo");
const auto data = QByteArrayLiteral("bar");
// WHEN
const auto cipher = EncryptionHelper::encryptStringSymmetric(encryptionKey, data);
// THEN
const auto parts = cipher.split('|');
QCOMPARE(parts.size(), 2);
const auto encryptedData = QByteArray::fromBase64(parts[0]);
const auto iv = QByteArray::fromBase64(parts[1]);
// We're not here to check the merits of the encryption but at least make sure it's been
// somewhat ciphered
QVERIFY(!encryptedData.isEmpty());
QVERIFY(encryptedData != data);
QVERIFY(!iv.isEmpty());
}
void shouldSymmetricDecryptStrings()
{
// GIVEN
const auto encryptionKey = QByteArrayLiteral("foo");
const auto originalData = QByteArrayLiteral("bar");
const auto cipher = EncryptionHelper::encryptStringSymmetric(encryptionKey, originalData);
// WHEN
const auto data = EncryptionHelper::decryptStringSymmetric(encryptionKey, cipher);
// THEN
QCOMPARE(data, originalData);
}
void shouldSymmetricDecryptStringsInOldStorageFormat()
{
// GIVEN
const auto encryptionKey = QByteArrayLiteral("foo");
const auto originalData = QByteArrayLiteral("bar");
const auto cipher = convertToOldStorageFormat(EncryptionHelper::encryptStringSymmetric(encryptionKey, originalData));
// WHEN
const auto data = EncryptionHelper::decryptStringSymmetric(encryptionKey, cipher);
// THEN
QCOMPARE(data, originalData);
}
};
QTEST_APPLESS_MAIN(TestClientSideEncryption)
#include "testclientsideencryption.moc"
|