示例#1
0
 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);
         }
     }
 }
示例#2
0
 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);
         }
     }
 }
示例#3
0
        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);
        }