public static Stream CreateBlock(this Stream baseStream, BlockOptions options, byte[] key, byte[] iv) { var compression = options.HasFlag(BlockOptions.Compression); var encryption = options.HasFlag(BlockOptions.Encryption); if (compression) { if (encryption) //compression & encryption { var gzipStream = new GZipStream(baseStream, CompressionLevel.Optimal, true); var rijAlg = Rijndael.Create(); rijAlg.Key = key; rijAlg.IV = iv; var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV); var encryptionStream = new CryptoStream(gzipStream, encryptor, CryptoStreamMode.Write); return(BlockStream.Create(baseStream, encryptionStream, () => { encryptionStream.FlushFinalBlock(); gzipStream.Close(); }, CloseOptions.Flush)); } else //compression { var gzipStream = new GZipStream(baseStream, CompressionLevel.Optimal, true); return(BlockStream.Create(baseStream, gzipStream, null, CloseOptions.Flush | CloseOptions.CloseWrapper)); } } else { if (encryption) //encryption { var rijAlg = Rijndael.Create(); rijAlg.Key = key; rijAlg.IV = iv; var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV); var encryptionStream = new CryptoStream(baseStream, encryptor, CryptoStreamMode.Write); return(BlockStream.Create(baseStream, encryptionStream, () => { encryptionStream.FlushFinalBlock(); }, CloseOptions.Flush)); } else { throw new ArgumentOutOfRangeException(); } } }
private bool MatchesBlockOptionsFilter(string name, BlockOptions options) { var m = _blocksfilter.Match(name); if (m.Success) { switch (int.Parse(m.Groups[1].Value)) { case 4: return(options.HasFlag(BlockOptions.IPv4)); case 6: return(options.HasFlag(BlockOptions.IPv6)); } } return(false); }