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); }
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); }