diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java index be6b54aa8e4e7e067364c0e8cf72f17079171f58..432a5e813394ec816f679d91e5435c2b0b531730 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java @@ -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());