mirror of
https://github.com/Maschell/JNUSLib.git
synced 2024-11-05 07:45:11 +01:00
Refactor the readFileToStream function of the FSTDataProviderNUSTitle
This commit is contained in:
parent
c57cee987a
commit
dd4219423f
@ -66,28 +66,16 @@ public class FSTDataProviderNUSTitle implements FSTDataProvider, HasNUSTitle {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean readFileToStream(OutputStream out, FSTEntry entry, long offset, Optional<Long> size) throws IOException {
|
public boolean readFileToStream(OutputStream out, FSTEntry entry, long offset, Optional<Long> size) throws IOException {
|
||||||
long fileOffset = entry.getFileOffset() + offset;
|
|
||||||
long fileOffsetBlock = fileOffset;
|
|
||||||
long usedSize = size.orElse(entry.getFileSize());
|
long usedSize = size.orElse(entry.getFileSize());
|
||||||
Content c = title.getTMD().getContentByIndex(entry.getContentIndex());
|
|
||||||
|
|
||||||
if (c.isHashed()) {
|
|
||||||
fileOffsetBlock = (fileOffset / 0xFC00) * 0x10000;
|
|
||||||
} else {
|
|
||||||
fileOffsetBlock = (fileOffset / 0x8000) * 0x8000;
|
|
||||||
// We need the previous IV if we don't start at the first block.
|
|
||||||
if (fileOffset >= 0x8000 && fileOffset % 0x8000 == 0) {
|
|
||||||
fileOffsetBlock -= 16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
return decryptFSTEntryToStream(entry, out, fileOffsetBlock, fileOffset, usedSize);
|
return decryptFSTEntryToStream(entry, out, offset, usedSize);
|
||||||
} catch (CheckSumWrongException | NoSuchAlgorithmException e) {
|
} catch (CheckSumWrongException | NoSuchAlgorithmException e) {
|
||||||
throw new IOException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean decryptFSTEntryToStream(FSTEntry entry, OutputStream outputStream, long fileOffsetBlock, long fileOffset, long fileSize)
|
private boolean decryptFSTEntryToStream(FSTEntry entry, OutputStream outputStream, long offset, long fileSize)
|
||||||
throws IOException, CheckSumWrongException, NoSuchAlgorithmException {
|
throws IOException, CheckSumWrongException, NoSuchAlgorithmException {
|
||||||
if (entry.isNotInPackage() || !title.getTicket().isPresent()) {
|
if (entry.isNotInPackage() || !title.getTicket().isPresent()) {
|
||||||
if (!title.getTicket().isPresent()) {
|
if (!title.getTicket().isPresent()) {
|
||||||
@ -101,11 +89,14 @@ public class FSTDataProviderNUSTitle implements FSTDataProvider, HasNUSTitle {
|
|||||||
|
|
||||||
Content c = title.getTMD().getContentByIndex(entry.getContentIndex());
|
Content c = title.getTMD().getContentByIndex(entry.getContentIndex());
|
||||||
|
|
||||||
NUSDataProvider dataProvider = title.getDataProvider();
|
long payloadOffset = entry.getFileOffset() + offset;
|
||||||
|
|
||||||
|
long streamOffset = payloadOffset;
|
||||||
|
|
||||||
Optional<Long> readFilesize = Optional.empty();
|
Optional<Long> readFilesize = Optional.empty();
|
||||||
if (c.isHashed()) {
|
if (c.isHashed()) {
|
||||||
long offsetInBlock = fileOffset - ((fileOffsetBlock / 0x10000) * 0xFC00);
|
streamOffset = (payloadOffset / 0xFC00) * 0x10000;
|
||||||
|
long offsetInBlock = payloadOffset - ((streamOffset / 0x10000) * 0xFC00);
|
||||||
if (offsetInBlock + fileSize < 0xFC00) {
|
if (offsetInBlock + fileSize < 0xFC00) {
|
||||||
readFilesize = Optional.of(0x10000L);
|
readFilesize = Optional.of(0x10000L);
|
||||||
} else {
|
} else {
|
||||||
@ -120,9 +111,17 @@ public class FSTDataProviderNUSTitle implements FSTDataProvider, HasNUSTitle {
|
|||||||
|
|
||||||
readFilesize = Optional.of(curVal);
|
readFilesize = Optional.of(curVal);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
streamOffset = (payloadOffset / 0x8000) * 0x8000;
|
||||||
|
// We need the previous IV if we don't start at the first block.
|
||||||
|
if (payloadOffset >= 0x8000 && payloadOffset % 0x8000 == 0) {
|
||||||
|
streamOffset -= 16;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InputStream in = dataProvider.getInputStreamFromContent(c, fileOffsetBlock, readFilesize);
|
NUSDataProvider dataProvider = title.getDataProvider();
|
||||||
|
|
||||||
|
InputStream in = dataProvider.getInputStreamFromContent(c, streamOffset, readFilesize);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
NUSDecryption nusdecryption = new NUSDecryption(title.getTicket().get());
|
NUSDecryption nusdecryption = new NUSDecryption(title.getTicket().get());
|
||||||
@ -130,7 +129,7 @@ public class FSTDataProviderNUSTitle implements FSTDataProvider, HasNUSTitle {
|
|||||||
if (c.isHashed()) {
|
if (c.isHashed()) {
|
||||||
h3HashedOpt = dataProvider.getContentH3Hash(c);
|
h3HashedOpt = dataProvider.getContentH3Hash(c);
|
||||||
}
|
}
|
||||||
return nusdecryption.decryptStreams(in, outputStream, fileOffset, fileSize, c, h3HashedOpt, fileSize == entry.getFileSize());
|
return nusdecryption.decryptStreams(in, outputStream, payloadOffset, fileSize, c, h3HashedOpt, fileSize == entry.getFileSize());
|
||||||
} catch (CheckSumWrongException e) {
|
} catch (CheckSumWrongException e) {
|
||||||
if (c.isUNKNWNFlag1Set()) {
|
if (c.isUNKNWNFlag1Set()) {
|
||||||
log.info("Hash doesn't match. But file is optional. Don't worry.");
|
log.info("Hash doesn't match. But file is optional. Don't worry.");
|
||||||
|
Loading…
Reference in New Issue
Block a user