| 289 | |
| 290 | |
| 291 | std::size_t CNetworkClient::RecvCryptedPacket(const void* c_lpData, std::size_t uMaxLength) |
| 292 | { |
| 293 | if (uMaxLength < TCryptedPacket::size()) |
| 294 | return 0; |
| 295 | |
| 296 | NETWORK_LOG(LL_SYS, "Got crypted packet!"); |
| 297 | |
| 298 | if (uMaxLength != TCryptedPacket::size()) |
| 299 | { |
| 300 | NETWORK_LOG(LL_CRI, "Packet size mismatch! Size: %u Capacity: %u", uMaxLength, TCryptedPacket::size()); |
| 301 | return TCryptedPacket::size(); |
| 302 | } |
| 303 | |
| 304 | auto pCryptedPacket = reinterpret_cast<const TCryptedPacket*>(c_lpData); |
| 305 | |
| 306 | // Magic value check |
| 307 | if (memcmp(pCryptedPacket->pMagic, gs_pNetworkMagicValue, sizeof(pCryptedPacket->pMagic))) |
| 308 | { |
| 309 | NETWORK_LOG(LL_CRI, "Unknown magic value: 0x%X", pCryptedPacket->pMagic); |
| 310 | return TCryptedPacket::size(); |
| 311 | } |
| 312 | |
| 313 | // Packet sum check |
| 314 | auto pCorrectChecksum = g_nmApp->NetworkMgrInstance()->CreateChecksum(c_lpData, uMaxLength - (NET_CHECKSUM_LENGTH /* hash */ + NET_CHECKSUM_LENGTH /* sum */)); |
| 315 | if (pCorrectChecksum != pCryptedPacket->ulChecksum) |
| 316 | { |
| 317 | NETWORK_LOG(LL_CRI, "Packet checksum mismatch! Current: %p Correct: %p", pCryptedPacket->ulChecksum, pCorrectChecksum); |
| 318 | return TCryptedPacket::size(); |
| 319 | } |
| 320 | |
| 321 | // Packet hash check |
| 322 | auto pCorrectPacketHash = XXH32(c_lpData, uMaxLength - NET_CHECKSUM_LENGTH, NET_PACKET_HASH_MAGIC); |
| 323 | if (pCorrectPacketHash != pCryptedPacket->ulHash) |
| 324 | { |
| 325 | NETWORK_LOG(LL_CRI, "Packet hash mismatch! Current: %p Correct: %p", pCryptedPacket->ulHash, pCorrectPacketHash); |
| 326 | return TCryptedPacket::size(); |
| 327 | } |
| 328 | |
| 329 | NETWORK_LOG(LL_SYS, "Got crypted packet! Original Packet ID: %u Sub Packet ID: %u Crypted packet capacity: %u Crypted packet size: %u", |
| 330 | pCryptedPacket->uiPacketID, pCryptedPacket->uiDecryptedPacketId, TCryptedPacket::size(), uMaxLength); |
| 331 | |
| 332 | // Packet ID Check |
| 333 | auto pPacketHandler = m_pHandlers.find(pCryptedPacket->uiDecryptedPacketId); |
| 334 | if (pPacketHandler == m_pHandlers.end()) |
| 335 | { |
| 336 | NETWORK_LOG(LL_CRI, "Unknown target packet ID: %u", pCryptedPacket->uiDecryptedPacketId); |
| 337 | return TCryptedPacket::size(); |
| 338 | } |
| 339 | NETWORK_LOG(LL_SYS, "Handled packet decrypted id: %u", pCryptedPacket->uiDecryptedPacketId); |
| 340 | |
| 341 | // -- |
| 342 | |
| 343 | NETWORK_LOG(LL_SYS, "Decryption has been started. Crpyted data: %p Crypted data size: %u", pCryptedPacket->pContext, pCryptedPacket->ulCryptedSize); |
| 344 | |
| 345 | // Size & sum param check |
| 346 | if (!pCryptedPacket->ulCryptedSize || !pCryptedPacket->ulDecryptedSize || !pCryptedPacket->ulCryptedSum || !pCryptedPacket->ulDecryptedSum) |
| 347 | { |
| 348 | NETWORK_LOG(LL_CRI, "Corrupted crypted data!"); |
nothing calls this directly
no test coverage detected