public static byte[] XTS(byte[] Key1, byte[] Key2, int SectorSize, byte[] Data, ulong Sector, bool Encrypt) { byte[] TransformedBytes, BlockData; Xts XTS128 = XtsAes128.Create(Key1, Key2); int Blocks; var MemStrm = new MemoryStream(); var Writer = new BinaryWriter(MemStrm); XtsCryptoTransform CryptoTransform; if (Encrypt) { CryptoTransform = XTS128.CreateEncryptor(); } else { CryptoTransform = XTS128.CreateDecryptor(); } BlockData = new byte[SectorSize]; Blocks = Data.Length / SectorSize; for (int i = 0; i < Blocks; i++) { CryptoTransform.TransformBlock(Data, i * SectorSize, SectorSize, BlockData, 0, Sector++); Writer.Write(BlockData); } TransformedBytes = MemStrm.ToArray(); return(TransformedBytes); }
public Stream OpenProdInfo() { SparseStream encStream = ProdInfo.Open(); Xts xts = XtsAes128.Create(Keyset.BisKeys[0]); var decStream = new RandomAccessSectorStream(new XtsSectorStream(encStream, xts, 0x4000, 0), true); return(decStream); }
public NandPartition OpenUserPartition() { SparseStream encStream = User.Open(); Xts xts = XtsAes128.Create(Keyset.BisKeys[3]); var decStream = new RandomAccessSectorStream(new XtsSectorStream(encStream, xts, 0x4000, 0), true); var fat = new FatFileSystem(decStream, Ownership.None); return(new NandPartition(fat)); }
public Nax0(Keyset keyset, Stream stream, string sdPath, bool keepOpen) { stream.Position = 0; KeepOpen = keepOpen; ReadHeader(stream); DeriveKeys(keyset, sdPath, stream); stream.Position = 0x4000; Xts xts = XtsAes128.Create(Keys[0], Keys[1]); Stream = new RandomAccessSectorStream(new XtsSectorStream(stream, xts, 0x4000, 0x4000), keepOpen); }
public static byte[] XTS128(byte[] block, byte[] key, int block_size, bool _nin_tweak = false, int section_id = 0) { var result = new byte[block.Length]; var xts = XtsAes128.Create(key, _nin_tweak); using (var transform = xts.CreateDecryptor()) { for (int i = 0; i < block.Length / block_size; i++) { transform.TransformBlock(block, i * block_size, block_size, result, i * block_size, Convert.ToUInt64(section_id++)); } } return(result); }
// Thanks, Falo! public static byte[] AES_XTS(byte[] Key1, byte[] Key2, int SectorSize, byte[] Data, ulong Sector) { byte[] BlockData; Xts XTS128 = XtsAes128.Create(Key1, Key2, true); int Blocks; var MemStrm = new MemoryStream(); var Writer = new BinaryWriter(MemStrm); var CryptoTransform = XTS128.CreateEncryptor(); BlockData = new byte[SectorSize]; Blocks = Data.Length / SectorSize; for (int i = 0; i < Blocks; i++) { CryptoTransform.TransformBlock(Data, i * SectorSize, SectorSize, BlockData, 0, Sector++); Writer.Write(BlockData); } return(MemStrm.ToArray()); }
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); }