Exemplo n.º 1
0
        public static byte[] Decrypt(IExchangeDecrypt exchangeDecrypt, byte[] value)
        {
            if (exchangeDecrypt.ExchangeAlgorithm == ExchangeAlgorithm.Rsa2048)
            {
                return(Rsa2048.Decrypt(exchangeDecrypt.PrivateKey, value));
            }

            return(null);
        }
Exemplo n.º 2
0
        public static SignatureMessage FromSignatureMessageBlock(ArraySegment<byte> package, IExchangeDecrypt privateKey)
        {
            if (package.Array == null) throw new ArgumentNullException("package.Array");
            if (privateKey == null) throw new ArgumentNullException("privateKey");

            try
            {
                using (Stream typeStream = new MemoryStream(package.Array, package.Offset, package.Count))
                using (Stream cryptoStream = ContentConverter.RemoveType(typeStream, "SignatureMessage"))
                using (Stream hashStream = ContentConverter.Decrypt(cryptoStream, privateKey))
                using (Stream paddingStream = ContentConverter.RemoveHash(hashStream))
                using (Stream compressStream = ContentConverter.RemovePadding(paddingStream))
                using (Stream packageStream = ContentConverter.Decompress(compressStream))
                {
                    return SignatureMessage.Import(packageStream, _bufferManager);
                }
            }
            catch (Exception)
            {
                return null;
            }
        }
Exemplo n.º 3
0
        public static SignatureMessage FromSignatureMessageBlock(ArraySegment <byte> message, IExchangeDecrypt privateKey)
        {
            if (message.Array == null)
            {
                throw new ArgumentNullException("message.Array");
            }
            if (privateKey == null)
            {
                throw new ArgumentNullException("privateKey");
            }

            try
            {
                using (Stream typeStream = new MemoryStream(message.Array, message.Offset, message.Count))
                    using (Stream cryptoStream = ContentConverter.RemoveType(typeStream, "SignatureMessage"))
                        using (Stream hashStream = ContentConverter.Decrypt(cryptoStream, privateKey))
                            using (Stream paddingStream = ContentConverter.RemoveHash(hashStream))
                                using (Stream compressStream = ContentConverter.RemovePadding(paddingStream))
                                    using (Stream messageStream = ContentConverter.Decompress(compressStream))
                                    {
                                        return(SignatureMessage.Import(messageStream, _bufferManager));
                                    }
            }
            catch (Exception)
            {
                return(null);
            }
        }
Exemplo n.º 4
0
        private static Stream Decrypt(Stream stream, IExchangeDecrypt privateKey)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }
            if (privateKey == null)
            {
                throw new ArgumentNullException("privateKey");
            }

            try
            {
                byte type = (byte)stream.ReadByte();

                if (type == (byte)ConvertCryptoAlgorithm.Aes256)
                {
                    byte[] cryptoKey;

                    {
                        byte[] lengthBuffer = new byte[4];
                        if (stream.Read(lengthBuffer, 0, lengthBuffer.Length) != lengthBuffer.Length)
                        {
                            throw new ArgumentException();
                        }
                        int length = NetworkConverter.ToInt32(lengthBuffer);

                        byte[] encryptedBuffer = new byte[length];
                        if (stream.Read(encryptedBuffer, 0, encryptedBuffer.Length) != encryptedBuffer.Length)
                        {
                            throw new ArgumentException();
                        }

                        cryptoKey = Exchange.Decrypt(privateKey, encryptedBuffer);
                    }

                    BufferStream outStream = null;

                    try
                    {
                        outStream = new BufferStream(_bufferManager);

                        using (Stream dataStream = new WrapperStream(stream, true))
                        {
                            var iv = new byte[32];
                            dataStream.Read(iv, 0, iv.Length);

                            using (var rijndael = new RijndaelManaged()
                            {
                                KeySize = 256, BlockSize = 256, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7
                            })
                                using (var inStream = new RangeStream(dataStream, dataStream.Position, dataStream.Length - dataStream.Position))
                                    using (CryptoStream cs = new CryptoStream(inStream, rijndael.CreateDecryptor(cryptoKey, iv), CryptoStreamMode.Read))
                                    {
                                        byte[] buffer = null;

                                        try
                                        {
                                            buffer = _bufferManager.TakeBuffer(1024 * 4);

                                            int i = -1;

                                            while ((i = cs.Read(buffer, 0, buffer.Length)) > 0)
                                            {
                                                outStream.Write(buffer, 0, i);
                                            }
                                        }
                                        finally
                                        {
                                            _bufferManager.ReturnBuffer(buffer);
                                        }
                                    }
                        }

                        outStream.Seek(0, SeekOrigin.Begin);
                    }
                    catch (Exception)
                    {
                        if (outStream != null)
                        {
                            outStream.Dispose();
                        }

                        throw;
                    }

                    return(outStream);
                }

                throw new NotSupportedException();
            }
            catch (Exception e)
            {
                throw new ArgumentException(e.Message, e);
            }
        }
Exemplo n.º 5
0
        private static Stream Decrypt(Stream stream, IExchangeDecrypt privateKey)
        {
            if (stream == null) throw new ArgumentNullException("stream");
            if (privateKey == null) throw new ArgumentNullException("privateKey");

            try
            {
                byte type = (byte)stream.ReadByte();

                if (type == (byte)ConvertCryptoAlgorithm.Aes256)
                {
                    byte[] cryptoKey;

                    {
                        byte[] lengthBuffer = new byte[4];
                        if (stream.Read(lengthBuffer, 0, lengthBuffer.Length) != lengthBuffer.Length) throw new ArgumentException();
                        int length = NetworkConverter.ToInt32(lengthBuffer);

                        byte[] encryptedBuffer = new byte[length];
                        if (stream.Read(encryptedBuffer, 0, encryptedBuffer.Length) != encryptedBuffer.Length) throw new ArgumentException();

                        cryptoKey = Exchange.Decrypt(privateKey, encryptedBuffer);
                    }

                    BufferStream outStream = null;

                    try
                    {
                        outStream = new BufferStream(_bufferManager);

                        using (Stream dataStream = new WrapperStream(stream, true))
                        {
                            var iv = new byte[32];
                            dataStream.Read(iv, 0, iv.Length);

                            using (var rijndael = new RijndaelManaged() { KeySize = 256, BlockSize = 256, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 })
                            using (var inStream = new RangeStream(dataStream, dataStream.Position, dataStream.Length - dataStream.Position))
                            using (CryptoStream cs = new CryptoStream(inStream, rijndael.CreateDecryptor(cryptoKey, iv), CryptoStreamMode.Read))
                            {
                                byte[] buffer = null;

                                try
                                {
                                    buffer = _bufferManager.TakeBuffer(1024 * 4);

                                    int i = -1;

                                    while ((i = cs.Read(buffer, 0, buffer.Length)) > 0)
                                    {
                                        outStream.Write(buffer, 0, i);
                                    }
                                }
                                finally
                                {
                                    _bufferManager.ReturnBuffer(buffer);
                                }
                            }
                        }

                        outStream.Seek(0, SeekOrigin.Begin);
                    }
                    catch (Exception)
                    {
                        if (outStream != null)
                        {
                            outStream.Dispose();
                        }

                        throw;
                    }

                    return outStream;
                }

                throw new NotSupportedException();
            }
            catch (Exception e)
            {
                throw new ArgumentException(e.Message, e);
            }
        }