diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index 46112b4450f0e46daa09fc74b675cbc9fae462e7..9cd7bd7d705ac27d4645b2d8807fb6da461d4184 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -35,6 +35,7 @@ import java.util.HashMap; import org.klomp.snark.bencode.*; import net.i2p.data.Base64; import net.i2p.util.Log; +import net.i2p.crypto.SHA1; /** * Note: this class is buggy, as it doesn't propogate custom meta fields into the bencoded @@ -298,6 +299,12 @@ public class MetaInfo */ public boolean checkPiece(int piece, byte[] bs, int off, int length) { + if (true) + return fast_checkPiece(piece, bs, off, length); + else + return orig_checkPiece(piece, bs, off, length); + } + private boolean orig_checkPiece(int piece, byte[] bs, int off, int length) { // Check digest MessageDigest sha1; try @@ -316,6 +323,17 @@ public class MetaInfo return false; return true; } + + private boolean fast_checkPiece(int piece, byte[] bs, int off, int length) { + SHA1 sha1 = new SHA1(); + + sha1.update(bs, off, length); + byte[] hash = sha1.digest(); + for (int i = 0; i < 20; i++) + if (hash[i] != piece_hashes[20 * piece + i]) + return false; + return true; + } /** * Returns the total length of the torrent in bytes. diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 1f5183a8aded25401016f4b636795489a7913b96..83c485479ecb98c9ed1d1d8b7afc48e6b9127401 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -319,7 +319,7 @@ public class SnarkManager implements Snark.CompleteListener { return "Too many files in " + info.getName() + " (" + files.size() + "), deleting it"; } else if (info.getPieces() <= 0) { return "No pieces in " + info.getName() + "? deleting it"; - } else if (info.getPieceLength(0) > 1024*1024) { + } else if (info.getPieceLength(0) > 10*1024*1024) { return "Pieces are too large in " + info.getName() + " (" + info.getPieceLength(0)/1024 + "KB, deleting it"; } else if (info.getTotalLength() > 10*1024*1024*1024l) { System.out.println("torrent info: " + info.toString()); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index e330b40ab82dec8ad6c4fc7735be74bef286c086..5a6690574d2d1cebab0fd2a1dbe6d1388d1c498b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -25,6 +25,8 @@ import java.util.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import net.i2p.crypto.SHA1; + /** * Maintains pieces on disk. Can be used to store and retrieve pieces. */ @@ -129,6 +131,14 @@ public class Storage // Creates piece hases for a new storage. private void create() throws IOException { + if (true) { + fast_digestCreate(); + } else { + orig_digestCreate(); + } + } + + private void orig_digestCreate() throws IOException { // Calculate piece_hashes MessageDigest digest = null; try @@ -164,6 +174,34 @@ public class Storage metainfo = metainfo.reannounce(metainfo.getAnnounce()); } + private void fast_digestCreate() throws IOException { + // Calculate piece_hashes + SHA1 digest = new SHA1(); + + byte[] piece_hashes = metainfo.getPieceHashes(); + + byte[] piece = new byte[piece_size]; + for (int i = 0; i < pieces; i++) + { + int length = getUncheckedPiece(i, piece, 0); + digest.update(piece, 0, length); + byte[] hash = digest.digest(); + for (int j = 0; j < 20; j++) + piece_hashes[20 * i + j] = hash[j]; + + bitfield.set(i); + + if (listener != null) + listener.storageChecked(this, i, true); + } + + if (listener != null) + listener.storageAllChecked(this); + + // Reannounce to force recalculating the info_hash. + metainfo = metainfo.reannounce(metainfo.getAnnounce()); + } + private void getFiles(File base) throws IOException { ArrayList files = new ArrayList(); diff --git a/history.txt b/history.txt index ba8b1e40dc75d6736d242c01c4fe34817fd01055..b6c11a1d45b57ae96f1e08af90ccb4d95a198242 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,8 @@ -$Id: history.txt,v 1.360 2005/12/16 18:18:56 jrandom Exp $ +$Id: history.txt,v 1.361 2005/12/16 22:47:04 jrandom Exp $ + +2005-12-17 jrandom + * Use our faster SHA1, rather than the JVM's within I2PSnark, and let + 'piece' sizes grow larger than before. 2005-12-16 jrandom * Added some I2PSnark sanity checks, an OOMListener when running