private void Load(ChunkLookup.IChunkVariantInfo chunkVariantInfo, Stream output) { using (var file = MemoryMappedFile.CreateFromFile(chunkVariantInfo.DataPath, FileMode.Open)) using (var input = file.CreateViewStream(chunkVariantInfo.Offset, chunkVariantInfo.Size.Align(16))) { if (chunkVariantInfo.CryptoInfo.HasValue == false) { output.WriteFromStream(input, chunkVariantInfo.Size); return; } var keyId = chunkVariantInfo.CryptoInfo.Value.KeyId; byte[] keyBytes; if (this._CryptoKeys.TryGetValue(keyId, out keyBytes) == false) { throw new ChunkCryptoKeyMissingException(keyId); } using (var aes = Aes.Create()) { aes.Key = keyBytes; aes.IV = keyBytes; // yes, it's that stupid aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using (var decryptor = aes.CreateDecryptor()) using (var cryptoStream = new CryptoStream(input, decryptor, CryptoStreamMode.Read)) { output.WriteFromStream(cryptoStream, chunkVariantInfo.Size); } } } }
public void Load(ChunkLookup.IChunkVariantInfo chunkVariantInfo, long size, Stream output) { if (chunkVariantInfo == null) { throw new ArgumentNullException("chunkVariantInfo"); } if (chunkVariantInfo.Size == size) { Load(chunkVariantInfo, output); } else { using (var temp = new MemoryStream()) { Load(chunkVariantInfo, temp); if (temp.Length != chunkVariantInfo.Size) { throw new InvalidOperationException(); } temp.Position = 0; Decompress(temp, output, size); } } }