Check crc/whirlpool of archives

This commit is contained in:
Adam
2015-10-17 20:19:19 -04:00
parent 9b5a7981aa
commit 0c022eef3e
5 changed files with 26 additions and 17 deletions

View File

@@ -12,7 +12,9 @@ import java.util.Objects;
import net.runelite.cache.fs.io.InputStream; import net.runelite.cache.fs.io.InputStream;
import net.runelite.cache.fs.io.OutputStream; import net.runelite.cache.fs.io.OutputStream;
import net.runelite.cache.fs.util.BZipDecompressor; import net.runelite.cache.fs.util.BZipDecompressor;
import net.runelite.cache.fs.util.CRC32HGenerator;
import net.runelite.cache.fs.util.GZip; import net.runelite.cache.fs.util.GZip;
import net.runelite.cache.fs.util.Whirlpool;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -310,6 +312,8 @@ public class DataFile implements Closeable
DataFileReadResult res = new DataFileReadResult(); DataFileReadResult res = new DataFileReadResult();
res.data = data; res.data = data;
res.revision = revision; res.revision = revision;
res.crc = CRC32HGenerator.getHash(b, b.length - 2);
res.whirlpool = Whirlpool.getHash(b, 0, b.length - 2);
return res; return res;
} }

View File

@@ -4,4 +4,6 @@ public class DataFileReadResult
{ {
public byte[] data; public byte[] data;
public int revision; public int revision;
public int crc; // crc of compressed data
public byte[] whirlpool;
} }

View File

@@ -9,6 +9,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import net.runelite.cache.fs.io.InputStream; import net.runelite.cache.fs.io.InputStream;
import net.runelite.cache.fs.io.OutputStream; import net.runelite.cache.fs.io.OutputStream;
import net.runelite.cache.fs.util.CRC32HGenerator;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -19,11 +20,8 @@ public class Index implements Closeable
private final Store store; private final Store store;
private final IndexFile index; private final IndexFile index;
private final int id; private final int id;
private int compression;
private boolean named, usesWhirpool; private boolean named, usesWhirpool;
private int revision; private int revision;
private int crc;
private byte[] whirlpool;
private final List<Archive> archives = new ArrayList<>(); private final List<Archive> archives = new ArrayList<>();
public Index(Store store, IndexFile index, int id) public Index(Store store, IndexFile index, int id)
@@ -46,8 +44,6 @@ public class Index implements Closeable
hash = 97 * hash + Objects.hashCode(this.index); hash = 97 * hash + Objects.hashCode(this.index);
hash = 97 * hash + this.id; hash = 97 * hash + this.id;
hash = 97 * hash + this.revision; hash = 97 * hash + this.revision;
hash = 97 * hash + this.crc;
hash = 97 * hash + Arrays.hashCode(this.whirlpool);
hash = 97 * hash + Objects.hashCode(this.archives); hash = 97 * hash + Objects.hashCode(this.archives);
return hash; return hash;
} }
@@ -76,14 +72,6 @@ public class Index implements Closeable
{ {
return false; return false;
} }
if (this.crc != other.crc)
{
return false;
}
if (!Arrays.equals(this.whirlpool, other.whirlpool))
{
return false;
}
if (!Objects.equals(this.archives, other.archives)) if (!Objects.equals(this.archives, other.archives))
{ {
return false; return false;
@@ -91,6 +79,11 @@ public class Index implements Closeable
return true; return true;
} }
public int getId()
{
return id;
}
public IndexFile getIndex() public IndexFile getIndex()
{ {
return index; return index;
@@ -143,7 +136,7 @@ public class Index implements Closeable
{ {
if (protocol >= 6) if (protocol >= 6)
{ {
int revision = stream.readInt(); // what is this and why is it different from checkRevision? this.revision = stream.readInt();
} }
int hash = stream.readUnsignedByte(); int hash = stream.readUnsignedByte();
@@ -242,6 +235,16 @@ public class Index implements Closeable
DataFileReadResult res = store.getData().read(this.id, entry.getId(), entry.getSector(), entry.getLength()); // needs decompress etc... DataFileReadResult res = store.getData().read(this.id, entry.getId(), entry.getSector(), entry.getLength()); // needs decompress etc...
byte[] data = res.data; byte[] data = res.data;
if (a.getCrc() != res.crc)
{
logger.warn("crc mismatch for archive {}", a);
}
if (a.getWhirlpool() != null && !Arrays.equals(a.getWhirlpool(), res.whirlpool))
{
logger.warn("whirlpool mismatch for archive {}", a);
}
if (a.getFiles().size() == 1) if (a.getFiles().size() == 1)
{ {
a.getFiles().get(0).setContents(data); a.getFiles().get(0).setContents(data);

View File

@@ -6,11 +6,11 @@ public final class CRC32HGenerator
{ {
public static final CRC32 CRC32Instance = new CRC32(); public static final CRC32 CRC32Instance = new CRC32();
public static int getHash(byte[] data) public static int getHash(byte[] data, int len)
{ {
synchronized (CRC32Instance) synchronized (CRC32Instance)
{ {
CRC32Instance.update(data, 0, data.length); CRC32Instance.update(data, 0, len);
int hash = (int) CRC32Instance.getValue(); int hash = (int) CRC32Instance.getValue();
CRC32Instance.reset(); CRC32Instance.reset();
return hash; return hash;

View File

@@ -1,4 +1,4 @@
package net.runelite.cache.fs.util.whirlpool; package net.runelite.cache.fs.util;
import java.util.Arrays; import java.util.Arrays;