diff --git a/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java b/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java index f263927ca8531344c80c55021798afe1fe11f7cf..91f3065419855b0c8788660c53ee71ef5f8ae6cf 100644 --- a/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java @@ -260,9 +260,9 @@ class RestrictiveTCPConnection extends TCPConnection { boolean ok = identifyStationToStation(); if (_log.shouldLog(Log.DEBUG)) _log.debug("After station to station [" + ok + "]..."); - if (!ok) + if (!ok) { throw new DataFormatException("Station to station identification failed! MITM?"); - + } if (_log.shouldLog(Log.DEBUG)) _log.debug("before validateVersion..."); boolean versionOk = validateVersion(); @@ -284,6 +284,18 @@ class RestrictiveTCPConnection extends TCPConnection { throw new DataFormatException("Peer is too far out of sync with the current router's clock! dropping"); } + try { + _context.netDb().store(_remoteIdentity.getHash(), _remoteInfo); + } catch (IllegalArgumentException iae) { + if (_log.shouldLog(Log.ERROR)) + _log.error("Peer gave us invalid router info", iae); + // not only do we remove the reference to the invalid peer + _context.netDb().fail(_remoteIdentity.getHash()); + // but we make sure that we don't try to talk to them soon even if we get a new ref + _context.shitlist().shitlistRouter(_remoteIdentity.getHash(), "Invalid peer info"); + throw new DataFormatException("Invalid peer info provided"); + } + if (_log.shouldLog(Log.DEBUG)) _log.debug("before validate peer address..."); boolean peerReachable = validatePeerAddress(); if (_log.shouldLog(Log.DEBUG)) _log.debug("after validatePeerAddress [" + peerReachable + "]..."); diff --git a/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java b/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java index e67f2d9710b97d3c0301be02991a931bf9c33ab2..013108498a54e54bf174656e276f7f3948f21865 100644 --- a/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java +++ b/router/java/src/net/i2p/router/transport/tcp/TCPConnection.java @@ -59,6 +59,7 @@ class TCPConnection implements I2NPMessageReader.I2NPMessageEventListener { protected InputStream _in; protected OutputStream _out; protected RouterIdentity _remoteIdentity; + protected RouterInfo _remoteInfo; protected TCPTransport _transport; protected ConnectionRunner _runner; protected List _toBeSent; @@ -191,15 +192,7 @@ class TCPConnection implements I2NPMessageReader.I2NPMessageEventListener { byte signedData[] = new byte[decr.length - rsig.getData().length]; System.arraycopy(decr, 0, signedData, 0, signedData.length); boolean valid = _context.dsa().verifySignature(rsig, signedData, _remoteIdentity.getSigningPublicKey()); - if (valid) { - try { - _context.netDb().store(_remoteIdentity.getHash(), peer); - } catch (IllegalArgumentException iae) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Peer gave us invalid router info", iae); - valid = false; - } - } + _remoteInfo = peer; return valid; }