forked from I2P_Developers/i2p.i2p
merge of '2e3b52a13c62422d86931cd194870b7e2698f3c2'
and 'fde331f6b10f0ef936a2aa0d68092df22348a581'
This commit is contained in:
@@ -2,6 +2,7 @@ package net.i2p.crypto;
|
||||
|
||||
import gnu.crypto.hash.Sha256Standalone;
|
||||
|
||||
import java.security.DigestException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
@@ -20,6 +21,7 @@ public final class SHA256Generator {
|
||||
private final LinkedBlockingQueue<MessageDigest> _digests;
|
||||
|
||||
private static final boolean _useGnu;
|
||||
|
||||
static {
|
||||
boolean useGnu = false;
|
||||
try {
|
||||
@@ -53,13 +55,13 @@ public final class SHA256Generator {
|
||||
|
||||
/**
|
||||
* Calculate the hash and cache the result.
|
||||
* @param source what to hash
|
||||
*/
|
||||
public final Hash calculateHash(byte[] source, int start, int len) {
|
||||
MessageDigest digest = acquire();
|
||||
digest.update(source, start, len);
|
||||
byte rv[] = digest.digest();
|
||||
release(digest);
|
||||
//return new Hash(rv);
|
||||
return Hash.create(rv);
|
||||
}
|
||||
|
||||
@@ -71,9 +73,12 @@ public final class SHA256Generator {
|
||||
public final void calculateHash(byte[] source, int start, int len, byte out[], int outOffset) {
|
||||
MessageDigest digest = acquire();
|
||||
digest.update(source, start, len);
|
||||
byte rv[] = digest.digest();
|
||||
try {
|
||||
digest.digest(out, outOffset, Hash.HASH_LENGTH);
|
||||
} catch (DigestException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
release(digest);
|
||||
System.arraycopy(rv, 0, out, outOffset, rv.length);
|
||||
}
|
||||
|
||||
private MessageDigest acquire() {
|
||||
|
@@ -199,24 +199,23 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
|
||||
cur += DataHelper.DATE_LENGTH;
|
||||
int size = (int)DataHelper.fromLong(data, cur, 2);
|
||||
cur += 2;
|
||||
//Hash h = new Hash();
|
||||
byte hdata[] = new byte[CHECKSUM_LENGTH];
|
||||
System.arraycopy(data, cur, hdata, 0, CHECKSUM_LENGTH);
|
||||
cur += CHECKSUM_LENGTH;
|
||||
//h.setData(hdata);
|
||||
|
||||
if (cur + size > data.length || headerSize + size > maxLen)
|
||||
throw new I2NPMessageException("Payload is too short ["
|
||||
throw new I2NPMessageException("Payload is too short ["
|
||||
+ "data.len=" + data.length
|
||||
+ "maxLen=" + maxLen
|
||||
+ " offset=" + offset
|
||||
+ " cur=" + cur
|
||||
+ " cur=" + cur
|
||||
+ " wanted=" + size + "]: " + getClass().getSimpleName());
|
||||
|
||||
int sz = Math.min(size, maxLen - headerSize);
|
||||
byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
|
||||
_context.sha().calculateHash(data, cur, sz, calc, 0);
|
||||
boolean eq = DataHelper.eq(hdata, 0, calc, 0, CHECKSUM_LENGTH);
|
||||
|
||||
// Compare the checksum in data to the checksum of the data after the checksum
|
||||
_context.sha().calculateHash(data, cur + CHECKSUM_LENGTH, sz, calc, 0);
|
||||
boolean eq = DataHelper.eq(data, cur, calc, 0, CHECKSUM_LENGTH);
|
||||
cur += CHECKSUM_LENGTH;
|
||||
|
||||
SimpleByteCache.release(calc);
|
||||
if (!eq)
|
||||
throw new I2NPMessageException("Bad checksum on " + size + " byte I2NP " + getClass().getSimpleName());
|
||||
|
Reference in New Issue
Block a user