Пример #1
0
        internal bool OpenStream()
        {
            if (Mode == StreamMode.GetHeader || Mode == StreamMode.PushHeader)
            {
                parent.ExceptionHandler.CloseConnection("InvalidOperation",
                                                        $"You should not try to open a file stream with {Mode}",
                                                        nameof(FTEventArgs), nameof(OpenStream));
                return(false);
            }
            FileStream fileStream;
            FileMode   fileMode;
            FileAccess fileAccess;
            FileShare  fileShare;

            System.Security.Cryptography.CryptoStreamMode streamMode;
            CryptographicOperation operation;

            if (Mode == StreamMode.GetFile)
            {
                fileMode   = FileMode.Create;
                fileAccess = FileAccess.Write;
                fileShare  = FileShare.None;
                streamMode = System.Security.Cryptography.CryptoStreamMode.Write;
                operation  = CryptographicOperation.Decrypt;
            }
            else // Mode == StreamMode.PushFile
            {
                fileMode   = FileMode.Open;
                fileAccess = FileAccess.Read;
                fileShare  = FileShare.Read;
                streamMode = System.Security.Cryptography.CryptoStreamMode.Read;
                operation  = CryptographicOperation.Encrypt;
            }
            try
            {
                fileStream = new FileStream(Path, fileMode, fileAccess, fileShare);
            }
            catch (Exception ex)
            {
                parent.ExceptionHandler.CloseConnection(ex);
                return(false);
            }
            if (FileMeta.FileEncryption == ContentAlgorithm.None || !FileMeta.Available)
            {
                Stream = new ShaStream(fileStream, streamMode);
            }
            else if (FileMeta.FileEncryption == ContentAlgorithm.Aes256Cbc)
            {
                Stream = new AesShaStream(fileStream, FileMeta.FileKey, streamMode, operation);
            }
            else
            {
                parent.ExceptionHandler.CloseConnection("InvalidFileAlgorithm",
                                                        "Cannot run file transfer with " + FileMeta.FileEncryption,
                                                        nameof(FTEventArgs), nameof(OpenStream));
                return(false);
            }
            return(true);
        }
Пример #2
0
        public void TestDecryptWriteModeFail(string input)
        {
            byte[] ciphertext = Util.GetBytes(input);
            byte[] key        = Util.GetBytes("fe627bd19db579ddd5e4ce42046f45b2fb708d98a6c6230c315df2760d4966ea");

            MemoryStream baseStream = new MemoryStream();
            AesShaStream stream     = new AesShaStream(baseStream, key, CryptoStreamMode.Write, CryptographicOperation.Decrypt);

            stream.Write(ciphertext, 0, ciphertext.Length);
            Assert.ThrowsException <CryptographicException>(() => stream.FlushFinalBlock());
            Assert.ThrowsException <CryptographicException>(() => stream.Dispose());
            Assert.IsFalse(baseStream.CanRead);
            Assert.IsFalse(baseStream.CanWrite);
        }