1- #include " GameNetwork/GeneralsOnline/NetworkBitstream.h"
2-
3- #define SODIUM_STATIC 1
4- #include " GameNetwork/GeneralsOnline/vendor/libsodium/sodium.h"
5- #pragma comment(lib, "libsodium/libsodium.lib")
6-
7- CBitStream::CBitStream (EPacketID packetID)
8- {
9- m_memBuffer = MemoryBuffer (BITSTREAM_DEFAULT_SIZE );
10-
11- m_Offset = 0 ;
12- m_packetID = packetID;
13-
14- Write (packetID);
15- }
16-
17- #define ENABLE_ENCRYPTION
18- void CBitStream::Decrypt (std::vector<BYTE >& vecKey, std::vector<BYTE >& vecIV)
19- {
20- #if defined(ENABLE_ENCRYPTION)
21- std::vector<unsigned char > vecDecryptedBytes (m_memBuffer.GetAllocatedSize ());
22- unsigned long long decrypted_len = 0 ;
23- if (crypto_aead_aes256gcm_decrypt (&vecDecryptedBytes.data ()[0 ], &decrypted_len,
24- NULL ,
25- &m_memBuffer.GetData ()[0 ], m_memBuffer.GetAllocatedSize (),
26- nullptr ,
27- 0 ,
28- &vecIV.data ()[0 ], &vecKey.data ()[0 ]) != 0 )
29- {
30- /* message forged! */
31- NetworkLog (" [NGMP]: Message forged! Decrypt failed" );
32- }
33- else
34- {
35- // resize buffer
36- vecDecryptedBytes.resize (decrypted_len);
37-
38- // reset the read offset
39- m_Offset = 0 ;
40-
41- m_memBuffer.ReAllocate (decrypted_len);
42- memcpy (&m_memBuffer.GetData ()[0 ], &vecDecryptedBytes[0 ], decrypted_len);
43- }
44-
45- #endif
46- }
47-
48-
49-
50- void CBitStream::Encrypt (std::vector<BYTE >& vecKey, std::vector<BYTE >& vecIV)
51- {
52- #if defined(ENABLE_ENCRYPTION)
53- std::vector<unsigned char > ciphertext (GetNumBytesUsed () + crypto_aead_aes256gcm_ABYTES );
54-
55- unsigned long long ciphertext_len;
56-
57- // NetworkLog("Encrypting message %s", MESSAGE);
58-
59-
60-
61- crypto_aead_aes256gcm_encrypt (&ciphertext.data ()[0 ], &ciphertext_len,
62- GetRawBuffer (), GetNumBytesUsed (),
63- nullptr , 0 ,
64- NULL , &vecIV.data ()[0 ], &vecKey.data ()[0 ]);
65-
66- // resize buffer and copy back
67- ciphertext.resize (ciphertext_len);
68-
69- m_memBuffer.ReAllocate (ciphertext_len);
70- memcpy (&m_memBuffer.GetData ()[0 ], &ciphertext[0 ], ciphertext.size ());
71- m_Offset = ciphertext.size ();
72- #endif
73- }
74-
75- CBitStream::CBitStream (int64_t len, void * pBuffer, size_t sz)
76- {
77- m_memBuffer = MemoryBuffer (len);
78-
79- memcpy (m_memBuffer.GetData () + m_Offset, pBuffer, sz);
80- m_Offset += sz;
81- }
82-
83- CBitStream::CBitStream (CBitStream* bsIn)
84- {
85- m_memBuffer = MemoryBuffer (bsIn->GetNumBytesUsed ());
86-
87- memcpy (m_memBuffer.GetData () + m_Offset, bsIn->GetRawBuffer (), bsIn->GetNumBytesUsed ());
88-
89- m_packetID = bsIn->GetPacketID ();
90- m_Offset = bsIn->GetNumBytesUsed ();
91- }
92-
93- CBitStream::CBitStream (int64_t len)
94- {
95- m_memBuffer = MemoryBuffer (len);
96- }
97-
98- CBitStream::CBitStream (std::vector<BYTE > vecBytes)
99- {
100- m_memBuffer = MemoryBuffer (vecBytes.size ());
101- memcpy (m_memBuffer.GetData (), (void *)vecBytes.data (), vecBytes.size ());
102- m_Offset = vecBytes.size ();
103- }
104-
105- CBitStream::~CBitStream ()
106- {
107-
1+ #include " GameNetwork/GeneralsOnline/NetworkBitstream.h"
2+
3+ #define SODIUM_STATIC 1
4+ #include " GameNetwork/GeneralsOnline/vendor/libsodium/sodium.h"
5+ #pragma comment(lib, "libsodium/libsodium.lib")
6+
7+ CBitStream::CBitStream (EPacketID packetID)
8+ {
9+ m_memBuffer = MemoryBuffer (BITSTREAM_DEFAULT_SIZE );
10+
11+ m_Offset = 0 ;
12+ m_packetID = packetID;
13+
14+ Write (packetID);
15+ }
16+
17+ #define ENABLE_ENCRYPTION
18+ void CBitStream::Decrypt (std::vector<BYTE >& vecKey, std::vector<BYTE >& vecIV)
19+ {
20+ #if defined(ENABLE_ENCRYPTION)
21+ std::vector<unsigned char > vecDecryptedBytes (m_memBuffer.GetAllocatedSize ());
22+ unsigned long long decrypted_len = 0 ;
23+ if (crypto_aead_xchacha20poly1305_ietf_decrypt (&vecDecryptedBytes.data ()[0 ], &decrypted_len,
24+ NULL ,
25+ &m_memBuffer.GetData ()[0 ], m_memBuffer.GetAllocatedSize (),
26+ nullptr ,
27+ 0 ,
28+ &vecIV.data ()[0 ], &vecKey.data ()[0 ]) != 0 )
29+ {
30+ /* message forged! */
31+ NetworkLog (" [NGMP]: Message forged! Decrypt failed" );
32+ }
33+ else
34+ {
35+ // resize buffer
36+ vecDecryptedBytes.resize (decrypted_len);
37+
38+ // reset the read offset
39+ m_Offset = 0 ;
40+
41+ m_memBuffer.ReAllocate (decrypted_len);
42+ memcpy (&m_memBuffer.GetData ()[0 ], &vecDecryptedBytes[0 ], decrypted_len);
43+ }
44+
45+ #endif
46+ }
47+
48+
49+
50+ void CBitStream::Encrypt (std::vector<BYTE >& vecKey, std::vector<BYTE >& vecIV)
51+ {
52+ #if defined(ENABLE_ENCRYPTION)
53+ std::vector<unsigned char > ciphertext (GetNumBytesUsed () + crypto_aead_xchacha20poly1305_ietf_ABYTES );
54+
55+ unsigned long long ciphertext_len;
56+
57+ // NetworkLog("Encrypting message %s", MESSAGE);
58+
59+
60+
61+ crypto_aead_xchacha20poly1305_ietf_encrypt (&ciphertext.data ()[0 ], &ciphertext_len,
62+ GetRawBuffer (), GetNumBytesUsed (),
63+ nullptr , 0 ,
64+ NULL , &vecIV.data ()[0 ], &vecKey.data ()[0 ]);
65+
66+ // resize buffer and copy back
67+ ciphertext.resize (ciphertext_len);
68+
69+ m_memBuffer.ReAllocate (ciphertext_len);
70+ memcpy (&m_memBuffer.GetData ()[0 ], &ciphertext[0 ], ciphertext.size ());
71+ m_Offset = ciphertext.size ();
72+ #endif
73+ }
74+
75+ CBitStream::CBitStream (int64_t len, void * pBuffer, size_t sz)
76+ {
77+ m_memBuffer = MemoryBuffer (len);
78+
79+ memcpy (m_memBuffer.GetData () + m_Offset, pBuffer, sz);
80+ m_Offset += sz;
81+ }
82+
83+ CBitStream::CBitStream (CBitStream* bsIn)
84+ {
85+ m_memBuffer = MemoryBuffer (bsIn->GetNumBytesUsed ());
86+
87+ memcpy (m_memBuffer.GetData () + m_Offset, bsIn->GetRawBuffer (), bsIn->GetNumBytesUsed ());
88+
89+ m_packetID = bsIn->GetPacketID ();
90+ m_Offset = bsIn->GetNumBytesUsed ();
91+ }
92+
93+ CBitStream::CBitStream (int64_t len)
94+ {
95+ m_memBuffer = MemoryBuffer (len);
96+ }
97+
98+ CBitStream::CBitStream (std::vector<BYTE > vecBytes)
99+ {
100+ m_memBuffer = MemoryBuffer (vecBytes.size ());
101+ memcpy (m_memBuffer.GetData (), (void *)vecBytes.data (), vecBytes.size ());
102+ m_Offset = vecBytes.size ();
103+ }
104+
105+ CBitStream::~CBitStream ()
106+ {
107+
108108}
0 commit comments