diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java index f6ad769eab..88b1f9d59f 100644 --- a/core/java/src/net/i2p/data/Certificate.java +++ b/core/java/src/net/i2p/data/Certificate.java @@ -89,7 +89,8 @@ public class Certificate extends DataStructureImpl { * @since 0.8.3 */ public static Certificate create(InputStream in) throws DataFormatException, IOException { - int type = (int) DataHelper.readLong(in, 1); + // EOF will be thrown in next read + int type = in.read(); int length = (int) DataHelper.readLong(in, 2); if (type == 0 && length == 0) return NULL_CERT; @@ -161,7 +162,8 @@ public class Certificate extends DataStructureImpl { public void readBytes(InputStream in) throws DataFormatException, IOException { if (_type != 0 || _payload != null) throw new IllegalStateException("already set"); - _type = (int) DataHelper.readLong(in, 1); + // EOF will be thrown in next read + _type = in.read(); int length = (int) DataHelper.readLong(in, 2); if (length > 0) { _payload = new byte[length]; diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java index 84f045d5e8..ada70620bd 100644 --- a/core/java/src/net/i2p/data/LeaseSet.java +++ b/core/java/src/net/i2p/data/LeaseSet.java @@ -19,6 +19,7 @@ import java.util.List; import net.i2p.I2PAppContext; import net.i2p.crypto.DSAEngine; +import net.i2p.crypto.SigType; import net.i2p.util.Clock; import net.i2p.util.Log; import net.i2p.util.RandomSource; @@ -327,9 +328,15 @@ public class LeaseSet extends DatabaseEntry { _destination = Destination.create(in); _encryptionKey = PublicKey.create(in); // revocation signing key must be same type as the destination signing key - _signingKey = new SigningPublicKey(_destination.getSigningPublicKey().getType()); + SigType type = _destination.getSigningPublicKey().getType(); + // Even if not verifying, we have to construct a Signature object + // below, which will fail for null type. + if (type == null) + throw new DataFormatException("unknown sig type"); + _signingKey = new SigningPublicKey(type); + // EOF will be thrown in signature read below _signingKey.readBytes(in); - int numLeases = (int) DataHelper.readLong(in, 1); + int numLeases = in.read(); if (numLeases > MAX_LEASES) throw new DataFormatException("Too many leases - max is " + MAX_LEASES); //_version = DataHelper.readLong(in, 4); @@ -339,7 +346,7 @@ public class LeaseSet extends DatabaseEntry { addLease(lease); } // signature must be same type as the destination signing key - _signature = new Signature(_destination.getSigningPublicKey().getType()); + _signature = new Signature(type); _signature.readBytes(in); } diff --git a/router/java/src/net/i2p/data/router/RouterAddress.java b/router/java/src/net/i2p/data/router/RouterAddress.java index 7d868a0899..ebdf27bbac 100644 --- a/router/java/src/net/i2p/data/router/RouterAddress.java +++ b/router/java/src/net/i2p/data/router/RouterAddress.java @@ -279,7 +279,8 @@ public class RouterAddress extends DataStructureImpl { public void readBytes(InputStream in) throws DataFormatException, IOException { if (_transportStyle != null) throw new IllegalStateException(); - _cost = (short) DataHelper.readLong(in, 1); + // EOF will be thrown in next read + _cost = (short) in.read(); _expiration = DataHelper.readLong(in, 8); _transportStyle = DataHelper.readString(in); // reduce Object proliferation diff --git a/router/java/src/net/i2p/data/router/RouterInfo.java b/router/java/src/net/i2p/data/router/RouterInfo.java index 7d49b9a925..ec2f5d99c3 100644 --- a/router/java/src/net/i2p/data/router/RouterInfo.java +++ b/router/java/src/net/i2p/data/router/RouterInfo.java @@ -549,11 +549,15 @@ public class RouterInfo extends DatabaseEntry { // can't set the digest until we know the sig type InputStream din; MessageDigest digest; + SigType type = _identity.getSigningPublicKey().getType(); + // Even if not verifying, we have to construct a Signature object + // below, which will fail for null type. + if (type == null) + throw new DataFormatException("unknown sig type"); if (verifySig) { - SigType type = _identity.getSigningPublicKey().getType(); if (type != SigType.EdDSA_SHA512_Ed25519) { // This won't work for EdDSA - digest = _identity.getSigningPublicKey().getType().getDigestInstance(); + digest = type.getDigestInstance(); // TODO any better way? digest.update(_identity.toByteArray()); din = new DigestInputStream(in, digest); @@ -572,14 +576,16 @@ public class RouterInfo extends DatabaseEntry { //else // _published = when.getTime(); _published = DataHelper.readLong(din, 8); - int numAddresses = (int) DataHelper.readLong(din, 1); + // EOF will be thrown in properties read below + int numAddresses = din.read(); for (int i = 0; i < numAddresses; i++) { RouterAddress address = new RouterAddress(); address.readBytes(din); _addresses.add(address); } - int numPeers = (int) DataHelper.readLong(din, 1); - if (numPeers == 0) { + // EOF will be thrown in properties read below + int numPeers = din.read(); + if (numPeers <= 0) { _peers = null; } else { _peers = new HashSet(numPeers); @@ -590,14 +596,13 @@ public class RouterInfo extends DatabaseEntry { } } DataHelper.readProperties(din, _options); - _signature = new Signature(_identity.getSigningPublicKey().getType()); + _signature = new Signature(type); _signature.readBytes(in); if (verifySig) { - SigType type = _identity.getSigningPublicKey().getType(); if (type != SigType.EdDSA_SHA512_Ed25519) { // This won't work for EdDSA - SimpleDataStructure hash = _identity.getSigningPublicKey().getType().getHashInstance(); + SimpleDataStructure hash = type.getHashInstance(); hash.setData(digest.digest()); _isValid = DSAEngine.getInstance().verifySignature(_signature, hash, _identity.getSigningPublicKey()); _validated = true;