/// <summary> /// Decrypt a packet's data /// </summary> public static int DecryptPacketData(NetcodePacketHeader header, ulong protocolID, byte[] packetData, int packetDataLen, byte[] key, byte[] outBuffer) { byte[] additionalData = BufferPool.GetBuffer(Defines.NETCODE_VERSION_INFO_BYTES + 8 + 1); using (var writer = ByteArrayReaderWriter.Get(additionalData)) { writer.WriteASCII(Defines.NETCODE_VERSION_INFO_STR); writer.Write(protocolID); writer.Write(header.ReadSequenceByte); } byte[] nonce = BufferPool.GetBuffer(12); using (var writer = ByteArrayReaderWriter.Get(nonce)) { writer.Write((UInt32)0); writer.Write(header.SequenceNumber); } int ret; try { ret = CryptoUtils.Decrypt(packetData, 0, packetDataLen, additionalData, key, nonce, outBuffer); } catch (Exception e) { BufferPool.ReturnBuffer(additionalData); BufferPool.ReturnBuffer(nonce); throw e; } BufferPool.ReturnBuffer(additionalData); BufferPool.ReturnBuffer(nonce); return(ret); }
/// <summary> /// Read and decrypt packet data into an output buffer /// </summary> public static int ReadPacketData(NetcodePacketHeader header, ByteArrayReaderWriter stream, int length, ulong protocolID, byte[] key, byte[] outputBuffer) { byte[] encryptedBuffer = BufferPool.GetBuffer(2048); stream.ReadBytesIntoBuffer(encryptedBuffer, length); int decryptedBytes; try { decryptedBytes = DecryptPacketData(header, protocolID, encryptedBuffer, length, key, outputBuffer); } catch (Exception e) { BufferPool.ReturnBuffer(encryptedBuffer); throw e; } return(decryptedBytes); }