mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Do initial bktr section validation
This commit is contained in:
parent
1b595ebffd
commit
14da035273
2 changed files with 28 additions and 6 deletions
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.Serialization.Json;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using libhac.XTSSharp;
|
using libhac.XTSSharp;
|
||||||
|
@ -63,6 +64,8 @@ namespace libhac
|
||||||
if (Sections[index] == null) throw new ArgumentOutOfRangeException(nameof(index));
|
if (Sections[index] == null) throw new ArgumentOutOfRangeException(nameof(index));
|
||||||
var sect = Sections[index];
|
var sect = Sections[index];
|
||||||
|
|
||||||
|
if (sect.SuperblockHashValidity == Validity.Invalid) return null;
|
||||||
|
|
||||||
long offset = sect.Offset;
|
long offset = sect.Offset;
|
||||||
long size = sect.Size;
|
long size = sect.Size;
|
||||||
|
|
||||||
|
@ -200,11 +203,26 @@ namespace libhac
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CheckBktrKey(NcaSection sect)
|
||||||
|
{
|
||||||
|
var offset = sect.Header.Bktr.SubsectionHeader.Offset;
|
||||||
|
using (var streamDec = new RandomAccessSectorStream(new AesCtrStream(Stream, DecryptedKeys[2], sect.Offset, sect.Size, sect.Offset, sect.Header.Ctr)))
|
||||||
|
{
|
||||||
|
var reader = new BinaryReader(streamDec);
|
||||||
|
streamDec.Position = offset + 8;
|
||||||
|
var size = reader.ReadInt64();
|
||||||
|
|
||||||
|
if (size != offset)
|
||||||
|
{
|
||||||
|
sect.SuperblockHashValidity = Validity.Invalid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ValidateSuperblockHash(int index)
|
private void ValidateSuperblockHash(int index)
|
||||||
{
|
{
|
||||||
if (Sections[index] == null) throw new ArgumentOutOfRangeException(nameof(index));
|
if (Sections[index] == null) throw new ArgumentOutOfRangeException(nameof(index));
|
||||||
var sect = Sections[index];
|
var sect = Sections[index];
|
||||||
var stream = OpenSection(index, true);
|
|
||||||
|
|
||||||
byte[] expected = null;
|
byte[] expected = null;
|
||||||
byte[] actual;
|
byte[] actual;
|
||||||
|
@ -228,13 +246,12 @@ namespace libhac
|
||||||
size = 1 << ivfc.LevelHeaders[0].BlockSize;
|
size = 1 << ivfc.LevelHeaders[0].BlockSize;
|
||||||
break;
|
break;
|
||||||
case SectionType.Bktr:
|
case SectionType.Bktr:
|
||||||
var ivfcBktr = sect.Header.Bktr.IvfcHeader;
|
CheckBktrKey(sect);
|
||||||
expected = ivfcBktr.MasterHash;
|
return;
|
||||||
offset = ivfcBktr.LevelHeaders[0].LogicalOffset;
|
|
||||||
size = 1 << ivfcBktr.LevelHeaders[0].BlockSize;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var stream = OpenSection(index, true);
|
||||||
|
if (stream == null) return;
|
||||||
if (expected == null) return;
|
if (expected == null) return;
|
||||||
|
|
||||||
var hashTable = new byte[size];
|
var hashTable = new byte[size];
|
||||||
|
|
|
@ -31,6 +31,11 @@ namespace libhac
|
||||||
ContentsDir = Path.Combine(rootDir, "Contents");
|
ContentsDir = Path.Combine(rootDir, "Contents");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ContentsDir == null)
|
||||||
|
{
|
||||||
|
throw new DirectoryNotFoundException("Could not find \"Contents\" directory");
|
||||||
|
}
|
||||||
|
|
||||||
OpenAllNcas();
|
OpenAllNcas();
|
||||||
ReadTitles();
|
ReadTitles();
|
||||||
ReadControls();
|
ReadControls();
|
||||||
|
|
Loading…
Reference in a new issue