package launcher.hasher; import java.io.IOException; import java.nio.file.Path; import java.util.Arrays; import launcher.LauncherAPI; import launcher.helper.IOHelper; import launcher.helper.SecurityHelper; import launcher.helper.SecurityHelper.DigestAlgorithm; import launcher.helper.VerifyHelper; import launcher.serialize.HInput; import launcher.serialize.HOutput; public final class HashedFile extends HashedEntry { private static final byte[] DUMMY_HASH = new byte[0]; // Instance @LauncherAPI public final long size; private final byte[] digest; @LauncherAPI public HashedFile(long size, byte[] digest) { this.size = VerifyHelper.verifyLong(size, VerifyHelper.L_NOT_NEGATIVE, "Illegal size: " + size); this.digest = Arrays.copyOf(digest, digest.length); } @LauncherAPI public HashedFile(Path file, long size, boolean hash) throws IOException { this(size, hash ? SecurityHelper.digest(DigestAlgorithm.MD5, file) : DUMMY_HASH); } @LauncherAPI public HashedFile(HInput input) throws IOException { this(input.readVarLong(), input.readByteArray(SecurityHelper.CRYPTO_MAX_LENGTH)); } @Override public Type getType() { return Type.FILE; } @Override public long size() { return size; } @Override public void write(HOutput output) throws IOException { output.writeVarLong(size); output.writeByteArray(digest, SecurityHelper.CRYPTO_MAX_LENGTH); } @LauncherAPI public boolean isSame(HashedFile o) { return size == o.size && Arrays.equals(digest, o.digest); } @LauncherAPI public boolean isSame(Path file) throws IOException { return isSame(new HashedFile(file, IOHelper.readAttributes(file).size(), true)); } @LauncherAPI public boolean isSameDigest(byte[] digest) { return Arrays.equals(this.digest, digest); } }