diff options
Diffstat (limited to 'protocols/WhatsAppWeb/src/proto.h')
-rw-r--r-- | protocols/WhatsAppWeb/src/proto.h | 67 |
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); |