6 #ifndef QXMPPOMEMOMANAGER_P_H 7 #define QXMPPOMEMOMANAGER_P_H 9 #include "QXmppConstants_p.h" 10 #include "QXmppE2eeMetadata.h" 11 #include "QXmppOmemoDeviceBundle_p.h" 12 #include "QXmppOmemoManager.h" 13 #include "QXmppOmemoStorage.h" 14 #include "QXmppPubSubManager.h" 16 #include "OmemoLibWrappers.h" 17 #include "QcaInitializer_p.h" 19 #include <QDomElement> 28 class QXmppPubSubNodeConfig;
29 class QXmppPubSubPublishOptions;
31 class QXmppOmemoEnvelope;
32 class QXmppOmemoElement;
33 class QXmppOmemoDeviceListItem;
34 class QXmppOmemoDeviceBundleItem;
36 using namespace QXmpp;
46 constexpr
int UNRESPONDED_STANZAS_UNTIL_ENCRYPTION_IS_STOPPED = 106;
49 constexpr
int UNRESPONDED_STANZAS_UNTIL_HEARTBEAT_MESSAGE_IS_SENT = 53;
52 constexpr
int EMPTY_MESSAGE_DECRYPTION_DATA_SIZE = 32;
56 constexpr uint64_t PUBSUB_NODE_MAX_ITEMS_1 = 1000;
57 constexpr uint64_t PUBSUB_NODE_MAX_ITEMS_2 = 100;
58 constexpr uint64_t PUBSUB_NODE_MAX_ITEMS_3 = 10;
60 constexpr uint32_t PRE_KEY_ID_MIN = 1;
61 constexpr uint32_t SIGNED_PRE_KEY_ID_MIN = 1;
62 constexpr uint32_t PRE_KEY_ID_MAX = std::numeric_limits<int32_t>::max();
63 constexpr uint32_t SIGNED_PRE_KEY_ID_MAX = std::numeric_limits<int32_t>::max();
64 constexpr uint32_t PRE_KEY_INITIAL_CREATION_COUNT = 100;
67 constexpr
int DEVICES_PER_JID_MAX = 200;
70 constexpr
int DEVICES_PER_STANZA_MAX = 1000;
73 constexpr
auto SIGNED_PRE_KEY_RENEWAL_INTERVAL = 24h * 7 * 4;
76 constexpr
auto SIGNED_PRE_KEY_RENEWAL_CHECK_INTERVAL = 24h;
79 constexpr
auto DEVICE_REMOVAL_INTERVAL = 24h * 7 * 12;
82 constexpr
auto DEVICE_REMOVAL_CHECK_INTERVAL = 24h;
84 constexpr QStringView PAYLOAD_CIPHER_TYPE = u
"aes256";
85 constexpr QCA::Cipher::Mode PAYLOAD_CIPHER_MODE = QCA::Cipher::CBC;
86 constexpr QCA::Cipher::Padding PAYLOAD_CIPHER_PADDING = QCA::Cipher::PKCS7;
88 inline constexpr
auto HKDF_INFO =
"OMEMO Payload";
89 constexpr
int HKDF_KEY_SIZE = 32;
90 constexpr
int HKDF_SALT_SIZE = 32;
91 constexpr
int HKDF_OUTPUT_SIZE = 80;
93 inline constexpr QStringView PAYLOAD_MESSAGE_AUTHENTICATION_CODE_TYPE = u
"hmac(sha256)";
94 constexpr uint32_t PAYLOAD_MESSAGE_AUTHENTICATION_CODE_SIZE = 16;
96 constexpr
int PAYLOAD_KEY_SIZE = 32;
97 constexpr uint32_t PAYLOAD_INITIALIZATION_VECTOR_SIZE = 16;
98 constexpr uint32_t PAYLOAD_AUTHENTICATION_KEY_SIZE = 32;
101 constexpr uint32_t SCE_RPAD_SIZE_MIN = 0;
102 constexpr uint32_t SCE_RPAD_SIZE_MAX = 200;
104 struct PayloadEncryptionResult {
105 QCA::SecureArray decryptionData;
106 QByteArray encryptedPayload;
109 struct DecryptionResult {
110 QDomElement sceContent;
114 struct IqDecryptionResult {
124 class QXmppOmemoManagerPrivate
127 using Result = std::variant<QXmpp::Success, QXmppError>;
131 bool isStarted =
false;
132 bool isNewDeviceAutoSessionBuildingEnabled =
false;
138 QcaInitializer cryptoLibInitializer;
139 QTimer signedPreKeyPairsRenewalTimer;
140 QTimer deviceRemovalTimer;
142 TrustLevels acceptedSessionBuildingTrustLevels = ACCEPTED_TRUST_LEVELS;
145 QHash<uint32_t, QByteArray> preKeyPairs;
146 QHash<uint32_t, QXmppOmemoStorage::SignedPreKeyPair> signedPreKeyPairs;
147 QXmppOmemoDeviceBundle deviceBundle;
149 int maximumDevicesPerJid = DEVICES_PER_JID_MAX;
150 int maximumDevicesPerStanza = DEVICES_PER_STANZA_MAX;
153 QHash<QString, QHash<uint32_t, QXmppOmemoStorage::Device>> devices;
155 QList<QString> jidsOfManuallySubscribedDevices;
157 OmemoContextPtr globalContext;
158 StoreContextPtr storeContext;
159 QRecursiveMutex mutex;
160 signal_crypto_provider cryptoProvider;
162 signal_protocol_identity_key_store identityKeyStore;
163 signal_protocol_pre_key_store preKeyStore;
164 signal_protocol_signed_pre_key_store signedPreKeyStore;
165 signal_protocol_session_store sessionStore;
171 QXMPP_EXPORT
bool initGlobalContext();
172 QXMPP_EXPORT
bool initLocking();
173 QXMPP_EXPORT
bool initCryptoProvider();
176 signal_protocol_identity_key_store createIdentityKeyStore()
const;
177 signal_protocol_signed_pre_key_store createSignedPreKeyStore()
const;
178 signal_protocol_pre_key_store createPreKeyStore()
const;
179 signal_protocol_session_store createSessionStore()
const;
182 std::optional<uint32_t> generateDeviceId();
183 std::optional<uint32_t> generateDeviceId(
const QVector<QString> &existingIds);
184 bool setUpIdentityKeyPair(ratchet_identity_key_pair **identityKeyPair);
185 void schedulePeriodicTasks();
186 void renewSignedPreKeyPairs();
187 bool updateSignedPreKeyPair(ratchet_identity_key_pair *identityKeyPair);
188 bool renewPreKeyPairs(uint32_t keyPairBeingRenewed);
189 bool updatePreKeyPairs(uint32_t count = 1);
190 void removeDevicesRemovedFromServer();
193 QVector<QString> recipientJids,
194 TrustLevels acceptedTrustLevels);
197 std::optional<PayloadEncryptionResult> encryptPayload(
const QByteArray &payload)
const;
199 QByteArray createSceEnvelope(
const T &stanza);
200 QByteArray createOmemoEnvelopeData(
const signal_protocol_address &address,
const QCA::SecureArray &payloadDecryptionData)
const;
206 const QString &senderJid,
207 uint32_t senderDeviceId,
208 const QXmppOmemoEnvelope &omemoEnvelope,
209 const QByteArray &omemoPayload,
210 bool isMessageStanza =
true);
212 uint32_t senderDeviceId,
213 const QXmppOmemoEnvelope &omemoEnvelope,
214 const QByteArray &omemoPayload,
215 bool isMessageStanza);
217 uint32_t senderDeviceId,
218 const QXmppOmemoEnvelope &omemoEnvelope,
219 bool isMessageStanza =
true);
220 QByteArray decryptPayload(
const QCA::SecureArray &payloadDecryptionData,
const QByteArray &payload)
const;
224 template<
typename Function>
225 void publishDeviceBundle(
bool isDeviceBundlesNodeExistent,
226 bool arePublishOptionsSupported,
227 bool isAutomaticCreationSupported,
228 bool isCreationAndConfigurationSupported,
229 bool isCreationSupported,
230 bool isConfigurationSupported,
231 bool isConfigNodeMaxSupported,
232 Function continuation);
233 template<
typename Function>
234 void publishDeviceBundleWithoutOptions(
bool isDeviceBundlesNodeExistent,
235 bool isCreationAndConfigurationSupported,
236 bool isCreationSupported,
237 bool isConfigurationSupported,
238 bool isConfigNodeMaxSupported,
239 Function continuation);
240 template<
typename Function>
241 void configureNodeAndPublishDeviceBundle(
bool isConfigNodeMaxSupported, Function continuation);
242 template<
typename Function>
243 void createAndConfigureDeviceBundlesNode(
bool isConfigNodeMaxSupported, Function continuation);
244 template<
typename Function>
245 void createDeviceBundlesNode(Function continuation);
246 template<
typename Function>
247 void configureDeviceBundlesNode(
bool isConfigNodeMaxSupported, Function continuation);
248 template<
typename Function>
249 void publishDeviceBundleItem(Function continuation);
250 template<
typename Function>
251 void publishDeviceBundleItemWithOptions(Function continuation);
252 QXmppOmemoDeviceBundleItem deviceBundleItem()
const;
254 template<
typename Function>
255 void deleteDeviceBundle(Function continuation);
257 template<
typename Function>
258 void publishDeviceElement(
bool isDeviceListNodeExistent,
259 bool arePublishOptionsSupported,
260 bool isAutomaticCreationSupported,
261 bool isCreationAndConfigurationSupported,
262 bool isCreationSupported,
263 bool isConfigurationSupported,
264 Function continuation);
265 template<
typename Function>
266 void publishDeviceElementWithoutOptions(
bool isDeviceListNodeExistent,
267 bool isCreationAndConfigurationSupported,
268 bool isCreationSupported,
269 bool isConfigurationSupported,
270 Function continuation);
271 template<
typename Function>
272 void configureNodeAndPublishDeviceElement(Function continuation);
273 template<
typename Function>
274 void createAndConfigureDeviceListNode(Function continuation);
275 template<
typename Function>
276 void createDeviceListNode(Function continuation);
277 template<
typename Function>
278 void configureDeviceListNode(Function continuation);
279 template<
typename Function>
280 void publishDeviceListItem(
bool addOwnDevice, Function continuation);
281 template<
typename Function>
282 void publishDeviceListItemWithOptions(Function continuation);
283 QXmppOmemoDeviceListItem deviceListItem(
bool addOwnDevice =
true);
284 template<
typename Function>
285 void updateOwnDevicesLocally(
bool isDeviceListNodeExistent, Function continuation);
286 std::optional<QXmppOmemoDeviceListItem> updateContactDevices(
const QString &deviceOwnerJid,
const QVector<QXmppOmemoDeviceListItem> &deviceListItems);
287 void updateDevices(
const QString &deviceOwnerJid,
const QXmppOmemoDeviceListItem &deviceListItem);
288 void handleIrregularDeviceListChanges(
const QString &deviceOwnerJid);
289 template<
typename Function>
290 void deleteDeviceElement(Function continuation);
292 template<
typename Function>
293 void createNode(
const QString &node, Function continuation);
294 template<
typename Function>
295 void createNode(
const QString &node,
const QXmppPubSubNodeConfig &config, Function continuation);
296 template<
typename Function>
297 void configureNode(
const QString &node,
const QXmppPubSubNodeConfig &config, Function continuation);
298 template<
typename Function>
299 void retractItem(
const QString &node, uint32_t itemId, Function continuation);
300 template<
typename Function>
301 void deleteNode(
const QString &node, Function continuation);
303 template<
typename T,
typename Function>
304 void publishItem(
const QString &node,
const T &item, Function continuation);
305 template<
typename T,
typename Function>
306 void publishItem(
const QString &node,
const T &item,
const QXmppPubSubPublishOptions &publishOptions, Function continuation);
308 template<
typename T,
typename Function>
309 void runPubSubQueryWithContinuation(
QXmppTask<T> future,
const QString &errorMessage, Function continuation);
314 void subscribeToNewDeviceLists(
const QString &jid, uint32_t deviceId);
322 void resetCachedData();
326 bool buildSession(signal_protocol_address address,
const QXmppOmemoDeviceBundle &deviceBundle);
327 bool createSessionBundle(session_pre_key_bundle **sessionBundle,
328 const QByteArray &serializedPublicIdentityKey,
329 const QByteArray &serializedSignedPublicPreKey,
330 uint32_t signedPublicPreKeyId,
331 const QByteArray &serializedSignedPublicPreKeySignature,
332 const QByteArray &serializedPublicPreKey,
333 uint32_t publicPreKeyId);
335 bool deserializeIdentityKeyPair(ratchet_identity_key_pair **identityKeyPair)
const;
336 bool deserializePrivateIdentityKey(ec_private_key **privateIdentityKey,
const QByteArray &serializedPrivateIdentityKey)
const;
337 bool deserializePublicIdentityKey(ec_public_key **publicIdentityKey,
const QByteArray &serializedPublicIdentityKey)
const;
338 bool deserializeSignedPublicPreKey(ec_public_key **signedPublicPreKey,
const QByteArray &serializedSignedPublicPreKey)
const;
339 bool deserializePublicPreKey(ec_public_key **publicPreKey,
const QByteArray &serializedPublicPreKey)
const;
341 QXmppTask<QXmpp::SendResult> sendEmptyMessage(
const QString &recipientJid, uint32_t recipientDeviceId,
bool isKeyExchange =
false)
const;
343 QXmppTask<TrustLevel> storeKeyDependingOnSecurityPolicy(
const QString &keyOwnerJid,
const QByteArray &key);
345 QString ownBareJid()
const;
346 QString ownFullJid()
const;
347 QHash<uint32_t, QXmppOmemoStorage::Device> otherOwnDevices();
349 void warning(
const QString &msg)
const;
352 #endif // QXMPPOMEMOMANAGER_P_H
TrustLevel
Definition: QXmppTrustLevel.h:19
The QXmppOmemoStorage class stores data used by XEP-0384: OMEMO Encryption.
Definition: QXmppOmemoStorage.h:16
Definition: QXmppTask.h:61
The key is manually trusted (e.g., by clicking a button).
The QXmppTrustManager manages end-to-end encryption trust decisions.
Definition: QXmppTrustManager.h:17
Definition: QXmppOmemoManager.h:68
Definition: QXmppOmemoStorage.h:70
The QXmppMessage class represents an XMPP message.
Definition: QXmppMessage.h:63
Definition: Algorithms.h:12
The QXmppPubSubManager aims to provide publish-subscribe functionality as specified in XEP-0060: Publ...
Definition: QXmppPubSubManager.h:20
Definition: OmemoCryptoProvider.cpp:220
Definition: QXmppOmemoStorage.h:22