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 TestWriteMode(string input) { byte[] buffer = Util.GetBytes(input); MemoryStream baseStream = new MemoryStream(); ShaStream stream = new ShaStream(baseStream, CryptoStreamMode.Write); stream.Write(buffer, 0, buffer.Length); stream.FlushFinalBlock(); stream.Dispose(); Assert.IsFalse(baseStream.CanRead); Assert.IsFalse(baseStream.CanWrite); }