mirror of
https://github.com/Maschell/JNUSLib.git
synced 2024-11-22 07:59:19 +01:00
Throw proper exception while hashing
This commit is contained in:
parent
9f6f9aaabe
commit
59411e4c7d
@ -124,7 +124,12 @@ public final class WUDService {
|
||||
Integer oldOffset = null;
|
||||
do {
|
||||
int read = StreamUtils.getChunkFromStream(in, blockBuffer, overflow, bufferSize);
|
||||
ByteArrayWrapper hash = new ByteArrayWrapper(HashUtil.hashSHA1(blockBuffer));
|
||||
ByteArrayWrapper hash;
|
||||
try {
|
||||
hash = new ByteArrayWrapper(HashUtil.hashSHA1(blockBuffer));
|
||||
} catch (NoSuchAlgorithmException e1) {
|
||||
throw new IOException(e1);
|
||||
}
|
||||
|
||||
if ((oldOffset = sectorHashes.get(hash)) == null) {
|
||||
sectorMapping.put(curSector, realSector);
|
||||
|
@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -95,13 +96,13 @@ public class FSTDataProviderNUSTitle implements FSTDataProvider, HasNUSTitle {
|
||||
}
|
||||
try {
|
||||
return decryptFSTEntryToStream(entry, out, fileOffsetBlock, fileOffset, usedSize);
|
||||
} catch (CheckSumWrongException e) {
|
||||
} catch (CheckSumWrongException | NoSuchAlgorithmException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean decryptFSTEntryToStream(FSTEntry entry, OutputStream outputStream, long fileOffsetBlock, long fileOffset, long fileSize)
|
||||
throws IOException, CheckSumWrongException {
|
||||
throws IOException, CheckSumWrongException, NoSuchAlgorithmException {
|
||||
if (entry.isNotInPackage() || !entry.getContent().isPresent() || !title.getTicket().isPresent()) {
|
||||
if (!title.getTicket().isPresent()) {
|
||||
log.info("Decryption not possible because no ticket was set.");
|
||||
|
@ -16,6 +16,7 @@
|
||||
****************************************************************************/
|
||||
package de.mas.wiiu.jnus.implementations.wud.parser;
|
||||
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
@ -85,8 +86,12 @@ public final class WUDPartitionHeader {
|
||||
byte[] hash = Arrays.copyOfRange(header, start_offset + offset * 0x14, start_offset + (offset + cnt_hashes) * 0x14);
|
||||
|
||||
// Checking the hash of the h3 file.
|
||||
if (!Arrays.equals(HashUtil.hashSHA1(hash), c.getSHA2Hash())) {
|
||||
log.info("h3 incorrect from WUD");
|
||||
try {
|
||||
if (!Arrays.equals(HashUtil.hashSHA1(hash), c.getSHA2Hash())) {
|
||||
log.info("h3 incorrect from WUD");
|
||||
}
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
log.warning(e.getMessage());
|
||||
}
|
||||
|
||||
addH3Hashes(c.getIndex(), hash);
|
||||
|
@ -19,6 +19,7 @@ package de.mas.wiiu.jnus.utils;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
|
||||
@ -75,15 +76,20 @@ public class DataProviderUtils {
|
||||
File output = new File(outputFolder + File.separator + h3Filename);
|
||||
|
||||
if (output.exists()) {
|
||||
if (Arrays.equals(content.getSHA2Hash(), HashUtil.hashSHA1(output))) {
|
||||
log.fine(h3Filename + " already exists");
|
||||
return false;
|
||||
} else {
|
||||
if (Arrays.equals(content.getSHA2Hash(), Arrays.copyOf(HashUtil.hashSHA256(output), 20))) { // 0005000c1f941200 used sha256 instead of SHA1
|
||||
try {
|
||||
if (Arrays.equals(content.getSHA2Hash(), HashUtil.hashSHA1(output))) {
|
||||
log.fine(h3Filename + " already exists");
|
||||
return false;
|
||||
} else {
|
||||
if (Arrays.equals(content.getSHA2Hash(), Arrays.copyOf(HashUtil.hashSHA256(output), 20))) { // 0005000c1f941200 used sha256 instead of SHA1
|
||||
log.fine(h3Filename + " already exists");
|
||||
return false;
|
||||
}
|
||||
log.warning(h3Filename + " already exists but hash is differrent than expected.");
|
||||
}
|
||||
log.warning(h3Filename + " already exists but hash is differrent than expected.");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
log.warning(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -68,50 +68,31 @@ public final class HashUtil {
|
||||
return hash;
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(byte[] data) {
|
||||
MessageDigest sha1;
|
||||
try {
|
||||
sha1 = MessageDigest.getInstance("SHA1");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
return new byte[0x14];
|
||||
}
|
||||
public static byte[] hashSHA1(byte[] data) throws NoSuchAlgorithmException {
|
||||
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
|
||||
|
||||
return sha1.digest(data);
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(InputStream in, long length) {
|
||||
public static byte[] hashSHA1(InputStream in, long length) throws NoSuchAlgorithmException, IOException {
|
||||
return hashSHA1(in, length, 0);
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(InputStream in, long length, int aligmnent) {
|
||||
public static byte[] hashSHA1(InputStream in, long length, int aligmnent) throws IOException, NoSuchAlgorithmException {
|
||||
byte[] hash = new byte[0x14];
|
||||
MessageDigest sha1 = null;
|
||||
try {
|
||||
sha1 = MessageDigest.getInstance("SHA1");
|
||||
hash = hash(sha1, in, length, 0x8000, aligmnent);
|
||||
} catch (NoSuchAlgorithmException | FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
|
||||
hash = hash(sha1, in, length, 0x8000, aligmnent);
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(File file) {
|
||||
public static byte[] hashSHA1(File file) throws NoSuchAlgorithmException, IOException {
|
||||
return hashSHA1(file, 0);
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(File file, int aligmnent) {
|
||||
InputStream in;
|
||||
try {
|
||||
in = new FileInputStream(file);
|
||||
return hashSHA1(in, file.length(), aligmnent);
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
public static byte[] hashSHA1(File file, int aligmnent) throws NoSuchAlgorithmException, IOException {
|
||||
InputStream in = new FileInputStream(file);
|
||||
return hashSHA1(in, file.length(), aligmnent);
|
||||
}
|
||||
|
||||
public static byte[] hash(MessageDigest digest, InputStream in, long inputSize1, int bufferSize, int alignment) throws IOException {
|
||||
@ -142,7 +123,7 @@ public final class HashUtil {
|
||||
return digest.digest();
|
||||
}
|
||||
|
||||
public static boolean compareHashFolder(File input1, File input2) {
|
||||
public static boolean compareHashFolder(File input1, File input2) throws NoSuchAlgorithmException, IOException {
|
||||
List<File> expectedFiles = getInputFilesForFolder(input1);
|
||||
List<File> givenFiles = getInputFilesForFolder(input2);
|
||||
String regexInput = input1.getAbsolutePath().toLowerCase();
|
||||
@ -193,7 +174,7 @@ public final class HashUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static boolean compareHashFile(File file1, File file2) {
|
||||
private static boolean compareHashFile(File file1, File file2) throws NoSuchAlgorithmException, IOException {
|
||||
if (file1 == null || !file1.exists() || file2 == null || !file2.exists()) {
|
||||
return false;
|
||||
}
|
||||
@ -226,7 +207,7 @@ public final class HashUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void checkFileChunkHashes(byte[] hashes, byte[] h3Hashes, byte[] output, int block) throws CheckSumWrongException {
|
||||
public static void checkFileChunkHashes(byte[] hashes, byte[] h3Hashes, byte[] output, int block) throws CheckSumWrongException, NoSuchAlgorithmException {
|
||||
int H0_start = (block % 16) * 20;
|
||||
int H1_start = (16 + (block / 16) % 16) * 20;
|
||||
int H2_start = (32 + (block / 256) % 16) * 20;
|
||||
@ -277,5 +258,6 @@ public final class HashUtil {
|
||||
log.finest("h3 checksum right!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ public class NUSDecryption extends AESDecryption {
|
||||
}
|
||||
|
||||
public void decryptFileStreamHashed(InputStream inputStream, OutputStream outputStream, long filesize, long fileoffset, short contentIndex, byte[] h3Hash)
|
||||
throws IOException, CheckSumWrongException {
|
||||
throws IOException, CheckSumWrongException, NoSuchAlgorithmException {
|
||||
int BLOCKSIZE = 0x10000;
|
||||
int HASHBLOCKSIZE = 0xFC00;
|
||||
|
||||
@ -215,7 +215,7 @@ public class NUSDecryption extends AESDecryption {
|
||||
byte[] output;
|
||||
try {
|
||||
output = decryptFileChunkHash(encryptedBlockBuffer, (int) block, contentIndex, h3Hash);
|
||||
} catch (CheckSumWrongException e) {
|
||||
} catch (CheckSumWrongException | NoSuchAlgorithmException e) {
|
||||
throw e;
|
||||
}
|
||||
|
||||
@ -247,7 +247,8 @@ public class NUSDecryption extends AESDecryption {
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] decryptFileChunkHash(byte[] blockBuffer, int block, int contentIndex, byte[] h3_hashes) throws CheckSumWrongException {
|
||||
private byte[] decryptFileChunkHash(byte[] blockBuffer, int block, int contentIndex, byte[] h3_hashes)
|
||||
throws CheckSumWrongException, NoSuchAlgorithmException {
|
||||
int hashSize = 0x400;
|
||||
int blocksize = 0xFC00;
|
||||
byte[] IV = ByteBuffer.allocate(16).putShort((short) contentIndex).array();
|
||||
@ -268,7 +269,7 @@ public class NUSDecryption extends AESDecryption {
|
||||
}
|
||||
|
||||
public boolean decryptStreams(InputStream inputStream, OutputStream outputStream, long size, long offset, Content content, Optional<byte[]> h3HashHashed)
|
||||
throws IOException, CheckSumWrongException {
|
||||
throws IOException, CheckSumWrongException, NoSuchAlgorithmException {
|
||||
|
||||
short contentIndex = (short) content.getIndex();
|
||||
|
||||
@ -278,7 +279,6 @@ public class NUSDecryption extends AESDecryption {
|
||||
if (content.isEncrypted()) {
|
||||
if (content.isHashed()) {
|
||||
byte[] h3 = h3HashHashed.orElseThrow(() -> new FileNotFoundException("h3 hash not found."));
|
||||
|
||||
decryptFileStreamHashed(inputStream, outputStream, size, offset, (short) contentIndex, h3);
|
||||
} else {
|
||||
byte[] h3Hash = content.getSHA2Hash();
|
||||
|
Loading…
Reference in New Issue
Block a user