forked from I2P_Developers/i2p.i2p
Data: Check sooner for unknown sig type;
minor efficiency improvements in parsing
This commit is contained in:
@ -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
|
||||
|
@ -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<Hash>(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;
|
||||
|
Reference in New Issue
Block a user