private boolean knownPasswordHash(byte[] passwordHash) throws IOException {
long targetEstimate = estimateHashOffset(passwordHash);
long bestGuess = targetEstimate;
+ bestGuess = clampOffset(bestGuess);
hashBuffer.clear();
database.read(hashBuffer, bestGuess);
break;
}
bestGuess = bestGuess + targetEstimate - bestGuessEstimate;
+ bestGuess = clampOffset(bestGuess);
hashBuffer.clear();
database.read(hashBuffer, bestGuess);
}
int newSearchDirection = searchDirection;
while (searchDirection == newSearchDirection) {
bestGuess += digestLength * searchDirection;
+ if (bestGuess < 0 || bestGuess >= database.size()) {
+ break;
+ }
hashBuffer.clear();
database.read(hashBuffer, bestGuess);
newSearchDirection = compareHashes(passwordHash, hashBuffer.array());
/ (1L << 32);
return (pos / digestLength) * digestLength;
}
+
+ private long clampOffset(long offset) throws IOException {
+ if (offset < 0) {
+ return 0;
+ }
+ if (offset >= database.size()) {
+ return database.size() - 1;
+ }
+ return offset;
+ }
}