private HierarchicalIntegrityVerificationStream InitIvfcStream(bool enableIntegrityChecks) { IvfcHeader ivfc = Header.Ivfc; const int ivfcLevels = 5; var initInfo = new IntegrityVerificationInfo[ivfcLevels]; initInfo[0] = new IntegrityVerificationInfo { Data = new MemoryStream(Header.MasterHashA), BlockSizePower = 0, Type = IntegrityStreamType.Save }; for (int i = 1; i < ivfcLevels; i++) { IvfcLevelHeader level = ivfc.LevelHeaders[i - 1]; Stream data = i == ivfcLevels - 1 ? (Stream)JournalStream : MetaRemapSource.CreateStream(level.LogicalOffset, level.HashDataSize); initInfo[i] = new IntegrityVerificationInfo { Data = data, BlockSizePower = level.BlockSize, Salt = new HMACSHA256(Encoding.ASCII.GetBytes(SaltSources[i - 1])).ComputeHash(ivfc.SaltSource), Type = IntegrityStreamType.Save }; } return(new HierarchicalIntegrityVerificationStream(initInfo, enableIntegrityChecks)); }
private static HierarchicalIntegrityVerificationStorage InitIvfcForRomFs(NcaFsIntegrityInfoIvfc ivfc, IStorage dataStorage, IntegrityCheckLevel integrityCheckLevel, bool leaveOpen) { var initInfo = new IntegrityVerificationInfo[ivfc.LevelCount]; initInfo[0] = new IntegrityVerificationInfo { Data = new MemoryStorage(ivfc.MasterHash.ToArray()), BlockSize = 0 }; for (int i = 1; i < ivfc.LevelCount; i++) { initInfo[i] = new IntegrityVerificationInfo { Data = dataStorage.Slice(ivfc.GetLevelOffset(i - 1), ivfc.GetLevelSize(i - 1)), BlockSize = 1 << ivfc.GetLevelBlockSize(i - 1), Type = IntegrityStorageType.RomFs }; } return(new HierarchicalIntegrityVerificationStorage(initInfo, integrityCheckLevel, leaveOpen)); }
private static HierarchicalIntegrityVerificationStorage InitIvfcForPartitionFs(NcaFsIntegrityInfoSha256 info, IStorage pfsStorage, IntegrityCheckLevel integrityCheckLevel, bool leaveOpen) { Debug.Assert(info.LevelCount == 2); IStorage hashStorage = pfsStorage.Slice(info.GetLevelOffset(0), info.GetLevelSize(0), leaveOpen); IStorage dataStorage = pfsStorage.Slice(info.GetLevelOffset(1), info.GetLevelSize(1), leaveOpen); var initInfo = new IntegrityVerificationInfo[3]; // Set the master hash initInfo[0] = new IntegrityVerificationInfo { // todo Get hash directly from header Data = new MemoryStorage(info.MasterHash.ToArray()), BlockSize = 0, Type = IntegrityStorageType.PartitionFs }; initInfo[1] = new IntegrityVerificationInfo { Data = hashStorage, BlockSize = (int)info.GetLevelSize(0), Type = IntegrityStorageType.PartitionFs }; initInfo[2] = new IntegrityVerificationInfo { Data = dataStorage, BlockSize = info.BlockSize, Type = IntegrityStorageType.PartitionFs }; return(new HierarchicalIntegrityVerificationStorage(initInfo, integrityCheckLevel, leaveOpen)); }