public bool CommitHeader(Keyset keyset) { // todo Stream headerStream = BaseStorage.AsStream(); var hashData = new byte[0x3d00]; headerStream.Position = 0x300; headerStream.Read(hashData, 0, hashData.Length); byte[] hash = Crypto.ComputeSha256(hashData, 0, hashData.Length); headerStream.Position = 0x108; headerStream.Write(hash, 0, hash.Length); if (keyset.SaveMacKey.IsEmpty()) { return(false); } var cmacData = new byte[0x200]; var cmac = new byte[0x10]; headerStream.Position = 0x100; headerStream.Read(cmacData, 0, 0x200); Crypto.CalculateAesCmac(keyset.SaveMacKey, cmacData, 0, cmac, 0, 0x200); headerStream.Position = 0; headerStream.Write(cmac, 0, 0x10); headerStream.Flush(); return(true); }
public Result Commit(Keyset keyset) { CoreDataIvfcStorage.Flush(); FatIvfcStorage?.Flush(); Stream headerStream = BaseStorage.AsStream(); var hashData = new byte[0x3d00]; headerStream.Position = 0x300; headerStream.Read(hashData, 0, hashData.Length); byte[] hash = Crypto.ComputeSha256(hashData, 0, hashData.Length); headerStream.Position = 0x108; headerStream.Write(hash, 0, hash.Length); if (keyset == null || keyset.SaveMacKey.IsEmpty()) { return(ResultFs.PreconditionViolation); } var cmacData = new byte[0x200]; var cmac = new byte[0x10]; headerStream.Position = 0x100; headerStream.Read(cmacData, 0, 0x200); Crypto.CalculateAesCmac(keyset.SaveMacKey, cmacData, 0, cmac, 0, 0x200); headerStream.Position = 0; headerStream.Write(cmac, 0, 0x10); headerStream.Flush(); return(Result.Success); }
public ArchiveFile(ArchiveFileInfo file) { File = file; Mode = OpenMode.Read; Size = (File.UncompressedSize > 0 ? File.UncompressedSize : File.DataSize); if (File.RomfsParent != null) { BaseStorage = File.RomfsParent.GetBaseStorage().Slice(File.DataOffset + File.RomfsParent.Header.DataOffset, File.DataSize); } else { BaseStorage = File.ArchiveParent.Slice(File.DataOffset, File.DataSize); } if (File.UncompressedSize > 0) { using (var deflate = new ZlibStream(BaseStorage.AsStream(), CompressionMode.Decompress, true)) { MemoryStream deflateStream = new MemoryStream(); deflate.CopyStream(deflateStream, File.UncompressedSize); BaseStorage = deflateStream.AsStorage(); } } }
public Result Commit(Keyset keyset) { CoreDataIvfcStorage.Flush(); FatIvfcStorage?.Flush(); Stream headerStream = BaseStorage.AsStream(); var hashData = new byte[0x3d00]; headerStream.Position = 0x300; headerStream.Read(hashData, 0, hashData.Length); var hash = new byte[Sha256.DigestSize]; Sha256.GenerateSha256Hash(hashData, hash); headerStream.Position = 0x108; headerStream.Write(hash, 0, hash.Length); if (keyset == null || keyset.SaveMacKey.IsEmpty()) { return(ResultFs.PreconditionViolation.Log()); } var cmacData = new byte[0x200]; var cmac = new byte[0x10]; headerStream.Position = 0x100; headerStream.Read(cmacData, 0, 0x200); Aes.CalculateCmac(cmac, cmacData, keyset.SaveMacKey); headerStream.Position = 0; headerStream.Write(cmac, 0, 0x10); headerStream.Flush(); return(Result.Success); }