public void WriteTest3() { var expected = new byte[0x40]; expected[0x35] = 0x02; expected[0x36] = 0x02; Encrypt(expected, new byte[0x10]); var content = new byte[0x30]; Encrypt(content, new byte[0x10]); var ms = new MemoryStream(); ms.Write(content, 0, 0x30); ms.Position = 0; var xts = new XtsStream(ms, new byte[0x20], new byte[0x10], true, false, 0x20); xts.Position = 0x35; xts.Write(new byte[] { 0x02, 0x02 }, 0, 2); xts.Flush(); Assert.AreEqual(0x40, xts.Length); Assert.IsTrue(ms.ToArray().SequenceEqual(expected)); Assert.AreEqual(0x40, xts.Position); Assert.AreEqual(0, ms.Position); }
public void ReadTest1() { var key = new byte[32]; var final = new byte[] { 0x3a, 0x18, 0xda, 0xa2, 0xca, 0x3b, 0x3a, 0x64, 0x58, 0xe5, 0xaf, 0xac, 0xbc, 0x48, 0x95, 0x8e }; var ms = new MemoryStream(final); var xts = new XtsStream(ms, key, new byte[16], true, false, 0x30); var result = new byte[16]; var expected = new byte[16]; expected[0xf] = 0x01; xts.Read(result, 0, 16); Assert.IsTrue(result.SequenceEqual(expected)); Assert.AreEqual(16, xts.Position); Assert.AreEqual(0, ms.Position); }
public static byte[] DecryptNCAHeader(string selectedFile, long offset) { byte[] array = new byte[3072]; if (File.Exists(selectedFile)) { FileStream fileStream = new FileStream(selectedFile, FileMode.Open, FileAccess.Read); fileStream.Position = offset; fileStream.Read(array, 0, 3072); File.WriteAllBytes(selectedFile + ".tmp", array); Xts xts = XtsAes128.Create(Form1.NcaHeaderEncryptionKey1_Prod, Form1.NcaHeaderEncryptionKey2_Prod); using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(selectedFile + ".tmp"))) { using (XtsStream xtsStream = new XtsStream(binaryReader.BaseStream, xts, 512)) { xtsStream.Read(array, 0, 3072); } } File.Delete(selectedFile + ".tmp"); fileStream.Close(); } return(array); }
/* Switched to MemoryStream and simplified code * No idea if anything broke */ public static byte[] DecryptNCAHeader(string selectedFile, long offset) { byte[] array = new byte[3072]; if (File.Exists(selectedFile)) { using (var stream = new MemoryStream()) { FileStream fs = new FileStream(selectedFile, FileMode.Open, FileAccess.Read); fs.Position = offset; fs.Read(array, 0, 3072); fs.Close(); stream.Write(array, 0, array.Length); stream.Position = 0; Xts xts = XtsAes128.Create(Form1.NcaHeaderEncryptionKey1_Prod, Form1.NcaHeaderEncryptionKey2_Prod); using (XtsStream xtsStream = new XtsStream(stream, xts, 512)) { xtsStream.Read(array, 0, 3072); } } } return(array); }
public void ReadTest2() { var toEncrypt = new byte[0x10]; var sectorId = new byte[0x10]; sectorId[0xf] = 0x01; Encrypt(toEncrypt, sectorId); var content = new byte[0x30]; Array.Copy(toEncrypt, 0, content, 0x20, 0x10); var ms = new MemoryStream(content); var xts = new XtsStream(ms, new byte[32], new byte[16], true, false, 0x20); var result = new byte[16]; var expected = new byte[16]; xts.Position = 32; xts.Read(result, 0, 16); Assert.IsTrue(result.SequenceEqual(expected)); Assert.AreEqual(48, xts.Position); Assert.AreEqual(0, ms.Position); }
private void IdentifyInformation(Stream nca) { var bkPos = nca.Position; nca.Position = 0x200; var magic = new byte[4]; nca.Read(magic, 0, 4); nca.Position = bkPos; var header = nca; if (!Enum.TryParse <NcaVersion>(Encoding.ASCII.GetString(magic), out var ver)) { var xts = new XtsStream(nca, _keyStorage.HeaderKey, new byte[0x10], true, false, NcaConstants.MediaSize) { Position = 0x200 }; xts.Read(magic, 0, 4); if (!Enum.TryParse(Encoding.ASCII.GetString(magic), out ver)) { throw new InvalidOperationException("No valid Nca."); } header = new NcaHeaderStream(nca, ver, _keyStorage.HeaderKey); } NcaVersion = ver; IdentifyMasterKeyRevision(header); IdentifyEncryptedKeyArea(header); IdentifyEncryptedTitleKey(header); IdentifyTitleId(header); IdentifyBodySections(header); header.Position = 0; }
private Task <bool> DoCipher(Stream input, Stream output, IProgress <ProgressReport> progress, bool decrypt) { var key = OnRequestKey("AES256 XTS Key", 64, out var error); if (key == null) { return(Task.Factory.StartNew(() => { progress.Report(new ProgressReport { Percentage = 0, Message = error }); return false; })); } var sectorSize = OnRequestNumber("AES256 XTS SectorSize", 512, out error); if (!string.IsNullOrEmpty(error)) { return(Task.Factory.StartNew(() => { progress.Report(new ProgressReport { Percentage = 0, Message = error }); return false; })); } return(Task.Factory.StartNew(() => { progress.Report(new ProgressReport { Percentage = 0, Message = decrypt ? "Decryption..." : "Encryption..." }); using (var xts = new XtsStream(decrypt ? input : output, key, new byte[32], true, true, (int)sectorSize)) { var buffer = new byte[0x10000]; var totalLength = decrypt ? xts.Length : input.Length; while (xts.Position < totalLength) { var length = (int)Math.Min(0x10000, totalLength - xts.Position); if (decrypt) { xts.Read(buffer, 0, length); output.Write(buffer, 0, length); } else { input.Read(buffer, 0, length); xts.Write(buffer, 0, length); } progress.Report(new ProgressReport { Percentage = (double)xts.Position / totalLength * 100, Message = decrypt ? "Decryption..." : "Encryption...", }); } } progress.Report(new ProgressReport { Percentage = 100, Message = decrypt ? "Decryption finished." : "Encryption finished." }); return true; })); }