def fileName(self): bt = None if not self.titleId in Titles.keys(): if not Title.getBaseId(self.titleId) in Titles.keys(): Print.info('could not find title key for ' + self.titleId + ' or ' + Title.getBaseId(self.titleId)) return None bt = Titles.get(Title.getBaseId(self.titleId)) t = Title() t.loadCsv(self.titleId + '0000000000000000|0000000000000000|' + bt.name) else: t = Titles.get(self.titleId) if not t: Print.error('could not find title id ' + str(self.titleId)) return None try: if not t.baseId in Titles.keys(): Print.info('could not find baseId for ' + self.path) return None except BaseException as e: print('exception: could not find title id ' + str(self.titleId) + ' ' + str(e)) return None bt = Titles.get(t.baseId) if t.isDLC: format = Config.paths.getTitleDLC(not self.hasValidTicket) elif t.isDemo: if t.idExt != 0: format = Config.paths.getTitleDemoUpdate( not self.hasValidTicket) else: format = Config.paths.getTitleDemo(not self.hasValidTicket) elif t.idExt != 0: format = Config.paths.getTitleUpdate(not self.hasValidTicket) else: format = Config.paths.getTitleBase(not self.hasValidTicket) format = format.replace('{id}', self.cleanFilename(t.id)) format = format.replace('{region}', self.cleanFilename(t.getRegion() or '')) format = format.replace('{name}', self.cleanFilename(t.getName() or '')) format = format.replace('{version}', str(self.getVersion() or 0)) format = format.replace('{baseId}', self.cleanFilename(bt.id)) format = format.replace('{baseName}', self.cleanFilename(bt.getName() or '')) ''' if self.hasValidTicket: format = os.path.splitext(format)[0] + '.nsp' else: format = os.path.splitext(format)[0] + '.nsx' ''' return format
def fileName(self): bt = None if not self.titleId in Titles.keys(): if not Title.getBaseId(self.titleId) in Titles.keys(): Print.info('could not find title key for ' + self.titleId + ' or ' + Title.getBaseId(self.titleId)) return None bt = Titles.get(Title.getBaseId(self.titleId)) t = Title() t.loadCsv(self.titleId + '0000000000000000|0000000000000000|' + bt.name) else: t = Titles.get(self.titleId) if not t: Print.error('could not find title id ' + str(self.titleId)) return None try: if not t.baseId in Titles.keys(): Print.info('could not find baseId for ' + self.path) return None except BaseException as e: print('exception: could not find title id ' + str(self.titleId) + ' ' + str(e)) return None bt = Titles.get(t.baseId) if t.isDLC: format = Config.paths.getTitleDLC(not self.hasValidTicket) elif t.isDemo: if t.idExt != 0: format = Config.paths.getTitleDemoUpdate( not self.hasValidTicket) else: format = Config.paths.getTitleDemo(not self.hasValidTicket) elif t.idExt != 0: format = Config.paths.getTitleUpdate(not self.hasValidTicket) else: format = Config.paths.getTitleBase(not self.hasValidTicket) format = format.replace('{id}', self.cleanFilename(t.id)) format = format.replace('{region}', self.cleanFilename(t.getRegion() or '')) format = format.replace('{name}', self.cleanFilename(t.getName() or '')) format = format.replace('{version}', str(self.getVersion() or 0)) format = format.replace('{baseId}', self.cleanFilename(bt.id)) baseName = self.cleanFilename(bt.getName() or '') result = format.replace('{baseName}', baseName) while (len(os.path.basename(result).encode('utf-8')) > 254 and len(baseName) > 3): baseName = baseName[:-1] result = format.replace('{baseName}', baseName) return result
def move(self): if not self.path: return False if not self.fileName(): #print('could not get filename for ' + self.path) return False if os.path.abspath(self.fileName()).lower() == os.path.abspath( self.path).lower(): return False if os.path.isfile(self.fileName()) and os.path.abspath( self.path) == os.path.abspath(self.fileName()): print('duplicate title: ') print(os.path.abspath(self.path)) print(os.path.abspath(self.fileName())) return False try: os.makedirs(os.path.dirname(self.fileName()), exist_ok=True) newPath = self.fileName() os.rename(self.path, newPath) self.path = newPath except BaseException as e: print('failed to rename file! %s -> %s : %s' % (self.path, self.fileName(), e)) #print(self.path + ' -> ' + self.fileName()) if self.titleId in Titles.keys(): Titles.get(self.titleId).path = self.fileName() return True
def fileName(self): bt = None if not self.titleId in Titles.keys(): if not Title.getBaseId(self.titleId) in Titles.keys(): Print.info('could not find title key for ' + self.titleId + ' or ' + Title.getBaseId(self.titleId)) return None bt = Titles.get(Title.getBaseId(self.titleId)) t = Title() t.loadCsv(self.titleId + '0000000000000000|0000000000000000|' + bt.name) else: t = Titles.get(self.titleId) if not t.baseId in Titles.keys(): Print.info('could not find baseId for ' + self.path) return None bt = Titles.get(t.baseId) if t.isDLC: format = Config.paths.titleDLC elif t.isDemo: if t.idExt != 0: format = Config.paths.titleDemoUpdate else: format = Config.paths.titleDemo elif t.idExt != 0: format = Config.paths.titleUpdate else: format = Config.paths.titleBase format = format.replace('{id}', self.cleanFilename(t.id)) format = format.replace('{region}', self.cleanFilename(t.region or '')) format = format.replace('{name}', self.cleanFilename(t.name or '')) format = format.replace('{version}', str(self.version or 0)) format = format.replace('{baseId}', self.cleanFilename(bt.id)) format = format.replace('{baseName}', self.cleanFilename(bt.name or '')) if self.hasValidTicket: format = os.path.splitext(format)[0] + '.nsp' else: format = os.path.splitext(format)[0] + '.nsx' return format
def title(self): if not self.titleId: raise IOError('NSP no titleId set') if self.titleId in Titles.keys(): return Titles.get(self.titleId) t = Title.Title() t.setId(self.titleId) Titles.data()[self.titleId] = t return t
def open(self, file=None, mode='rb', cryptoType=-1, cryptoKey=-1, cryptoCounter=-1): super(NcaHeader, self).open(file, mode, cryptoType, cryptoKey, cryptoCounter) self.rewind() self.signature1 = self.read(0x100) self.signature2 = self.read(0x100) self.magic = self.read(0x4) self.isGameCard = self.readInt8() self.contentType = self.readInt8() try: self.contentType = Type.Content(self.contentType) except: pass self.cryptoType = self.readInt8() self.keyIndex = self.readInt8() self.size = self.readInt64() self.titleId = hx(self.read(8)[::-1]).decode('utf-8').upper() self.readInt32() # padding self.sdkVersion = self.readInt32() self.cryptoType2 = self.readInt8() self.read(0xF) # padding self.rightsId = hx(self.read(0x10)) if self.magic not in [b'NCA3', b'NCA2']: raise Exception('Failed to decrypt NCA header: ' + str(self.magic)) self.sectionHashes = [] for i in range(4): self.sectionTables.append(SectionTableEntry(self.read(0x10))) for i in range(4): self.sectionHashes.append(self.sectionTables[i]) self.masterKey = (self.cryptoType if self.cryptoType > self.cryptoType2 else self.cryptoType2) - 1 if self.masterKey < 0: self.masterKey = 0 self.encKeyBlock = self.getKeyBlock() #for i in range(4): # offset = i * 0x10 # key = encKeyBlock[offset:offset+0x10] # Print.info('enc %d: %s' % (i, hx(key))) if Keys.keyAreaKey(self.masterKey, self.keyIndex): crypto = aes128.AESECB( Keys.keyAreaKey(self.masterKey, self.keyIndex)) self.keyBlock = crypto.decrypt(self.encKeyBlock) self.keys = [] for i in range(4): offset = i * 0x10 key = self.keyBlock[offset:offset + 0x10] #Print.info('dec %d: %s' % (i, hx(key))) self.keys.append(key) else: self.keys = [None, None, None, None, None, None, None] if self.hasTitleRights(): if self.titleId.upper() in Titles.keys() and Titles.get( self.titleId.upper()).key: self.titleKeyDec = Keys.decryptTitleKey( uhx(Titles.get(self.titleId.upper()).key), self.masterKey) else: pass #Print.info('could not find title key!') else: self.titleKeyDec = self.key()