Skip to content

Commit

Permalink
alucryd/fullxci
Browse files Browse the repository at this point in the history
  • Loading branch information
seiya-git committed Jan 1, 2024
1 parent ee6c4b5 commit d5dbed1
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
2 changes: 1 addition & 1 deletion build/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

setuptools.setup(
name = 'nstools',
version = '1.1.9.dev10',
version = '1.2.0.dev1',
url = 'https://github.com/seiya-dev/NSTools',
long_description = long_description,
long_description_content_type = 'text/markdown',
Expand Down
36 changes: 33 additions & 3 deletions py/nstools/Fs/Xci.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,16 @@ def write(self):
class Xci(File):
def __init__(self, file = None):
super(Xci, self).__init__()

self.headerOffset = 0x0

self.challengeResponseAuthData = None
self.challengeResponseAuthMac = None
self.challengeResponseAuthNonce = None

self.titleKey1 = None
self.titleKey2 = None

self.header = None
self.signature = None
self.magic = None
Expand Down Expand Up @@ -254,8 +264,23 @@ def __init__(self, file = None):
if file:
self.open(file)

def isFullXci(self):
self.seek(0x100)
magic = self.read(0x4)
self.seek(0x0)
return magic != b'HEAD'

def readKeyArea(self):
self.packageId = self.readInt64()
self.seek(0x10)
self.challengeResponseAuthData = self.read(0x10)
self.challengeResponseAuthMac = self.read(0x10)
self.challengeResponseAuthNonce = self.read(0x10)
self.seek(0x200)
self.titleKey1 = self.read(0x8)
self.titleKey2 = self.read(0x8)

def readHeader(self):

self.signature = self.read(0x100)
self.magic = self.read(0x4)
self.secureOffset = self.readInt32()
Expand Down Expand Up @@ -284,10 +309,14 @@ def readHeader(self):

def open(self, path = None, mode = 'rb', cryptoType = -1, cryptoKey = -1, cryptoCounter = -1):
r = super(Xci, self).open(path, mode, cryptoType, cryptoKey, cryptoCounter)
if self.isFullXci():
self.readKeyArea()
self.headerOffset = 0x1000
self.seek(self.headerOffset)
self.readHeader()
self.seek(0xF000)
self.seek(self.hfs0Offset + self.headerOffset)
self.hfs0 = Hfs0(None, cryptoKey = None)
self.partition(0xf000, None, self.hfs0, cryptoKey = None)
self.partition(self.hfs0Offset + self.headerOffset, None, self.hfs0, cryptoKey = None)

def unpack(self, path, extractregex="*"):
os.makedirs(str(path), exist_ok=True)
Expand Down Expand Up @@ -322,3 +351,4 @@ def printInfo(self, maxDepth = 3, indent = 0):
Print.info(tabs + 'gamecardCert = ' + str(hx(self.gamecardCert.magic + self.gamecardCert.unknown1 + self.gamecardCert.unknown2 + self.gamecardCert.data)))

self.hfs0.printInfo(maxDepth, indent)

0 comments on commit d5dbed1

Please sign in to comment.