summaryrefslogtreecommitdiff
path: root/protocols/WhatsAppWeb/src/proto.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/WhatsAppWeb/src/proto.h')
-rw-r--r--protocols/WhatsAppWeb/src/proto.h67
1 files changed, 58 insertions, 9 deletions
diff --git a/protocols/WhatsAppWeb/src/proto.h b/protocols/WhatsAppWeb/src/proto.h
index 2ff8731eb9..cbd766ea1c 100644
--- a/protocols/WhatsAppWeb/src/proto.h
+++ b/protocols/WhatsAppWeb/src/proto.h
@@ -17,7 +17,7 @@ typedef void (WhatsAppProto:: *WA_PKT_HANDLER)(const WANode &node);
enum WAMSG
{
- Chat,
+ PrivateChat,
GroupChat,
DirectStatus,
OtherStatus,
@@ -113,12 +113,7 @@ class WANoise
struct {
MBinBuffer priv, pub;
- } noiseKeys, signedIdentity, ephemeral;
-
- struct {
- MBinBuffer priv, pub, signature;
- uint32_t keyid;
- } preKey;
+ } noiseKeys, ephemeral;
void deriveKey(const void *pData, size_t cbLen, MBinBuffer &write, MBinBuffer &read);
void mixIntoKey(const void *n, const void *p);
@@ -137,6 +132,59 @@ public:
MBinBuffer encodeFrame(const void *pData, size_t cbLen);
};
+class MSignalSession : public MZeroedObject
+{
+ friend class MSignalStore;
+ signal_protocol_address address;
+ session_cipher *cipher = nullptr;
+
+public:
+ CMStringA szName;
+
+ MSignalSession(const CMStringA &_1, int _2);
+ ~MSignalSession();
+
+ CMStringA getSetting(const MSignalStore*) const;
+
+ __forceinline session_cipher* getCipher(void) const { return cipher; }
+ __forceinline int getDeviceId() const { return address.device_id; }
+};
+
+class MSignalStore
+{
+ void init();
+
+ signal_protocol_store_context *m_pContext;
+
+public:
+ PROTO_INTERFACE *pProto;
+ const char *prefix;
+
+ OBJLIST<MSignalSession> arSessions;
+
+ struct
+ {
+ MBinBuffer priv, pub;
+ }
+ signedIdentity;
+
+ struct
+ {
+ MBinBuffer priv, pub, signature;
+ uint32_t keyid;
+ } preKey;
+
+ MSignalStore(PROTO_INTERFACE *_1, const char *_2);
+ ~MSignalStore();
+
+ MSignalSession *createSession(const CMStringA &szName, int deviceId);
+
+ MBinBuffer decryptSignalProto(const CMStringA &from, const char *pszType, const MBinBuffer &encrypted);
+ MBinBuffer decryptGroupSignalProto(const CMStringA &from, const CMStringA &author, const MBinBuffer &encrypted);
+
+ void processSenderKeyMessage(const proto::Message_SenderKeyDistributionMessage &msg);
+};
+
class WhatsAppProto : public PROTO<WhatsAppProto>
{
friend class WANoise;
@@ -169,8 +217,6 @@ class WhatsAppProto : public PROTO<WhatsAppProto>
EVP_PKEY *m_pKeys; // private & public keys
WANoise *m_noise;
- MBinBuffer getBlob(const char *pSetting);
-
// Contacts management /////////////////////////////////////////////////////////////////
mir_cs m_csUsers;
@@ -248,6 +294,9 @@ class WhatsAppProto : public PROTO<WhatsAppProto>
void OnStreamError(const WANode &node);
void OnSuccess(const WANode &node);
+ // Signal
+ MSignalStore m_signalStore;
+
// Binary packets
void ProcessBinaryPacket(const void *pData, size_t cbLen);