public UdpRawMessage Encrypt(ICipher cipher) { CheckDisposed(); using (var encryptor = cipher.CreateEncryptor()) { UdpRawMessage encryptedMessage = new UdpRawMessage(this.memoryStreamPool, (int)this.stream.Length); using (CryptoStream cryptoStream = new CryptoStream(new NonDisposableStream(encryptedMessage.BaseStream), encryptor, CryptoStreamMode.Write)) { this.stream.Position = 0; this.stream.CopyTo(cryptoStream); cryptoStream.FlushFinalBlock(); return(encryptedMessage); } } }
public UdpRawMessage Decrypt(ICipher cipher) { CheckDisposed(); using (var encryptor = cipher.CreateDecryptor()) { this.stream.Position = 0; using (CryptoStream cryptoStream = new CryptoStream(new NonDisposableStream(this.stream), encryptor, CryptoStreamMode.Read)) { UdpRawMessage decryptedMessage = new UdpRawMessage(this.memoryStreamPool, (int)this.stream.Length); cryptoStream.CopyTo(decryptedMessage.BaseStream); decryptedMessage.BaseStream.Position = 0; return(decryptedMessage); } } }
public UdpRawMessage Merge(MemoryStreamPool memoryStreamPool) { if (disposed) { throw new ObjectDisposedException(nameof(FragmentHolder)); } if (!IsCompleted) { throw new InvalidOperationException($"{nameof(FragmentHolder)} isn't completed"); } if (datagrams.Length == 0) { throw new ArgumentException("Datagrams collection is empty"); } var firstDatagram = datagrams.First(); if (firstDatagram.Length == 0) { throw new ArgumentException("Head datagram is empty"); } MessageType messageType = (MessageType)firstDatagram.BaseStream.ReadByte(); int payloadSize = (int)datagrams.Sum(d => d.Length) - 1; UdpRawMessage message = new UdpRawMessage(memoryStreamPool, payloadSize, false); foreach (var datagram in datagrams) { datagram.Position = 0; datagram.CopyTo(message.BaseStream); message.DeliveryType = datagram.DeliveryType; message.Channel = datagram.Channel; } return(message); }