diff --git a/router/java/src/net/i2p/data/router/RouterAddress.java b/router/java/src/net/i2p/data/router/RouterAddress.java index ebdf27bbac03981045ea2fddd857cde5184538da..a56c31c3fe4218c31f541cb45b72fa6ecc32ec85 100644 --- a/router/java/src/net/i2p/data/router/RouterAddress.java +++ b/router/java/src/net/i2p/data/router/RouterAddress.java @@ -288,6 +288,8 @@ public class RouterAddress extends DataStructureImpl { _transportStyle = "SSU"; else if (_transportStyle.equals("NTCP")) _transportStyle = "NTCP"; + else if (_transportStyle.equals("NTCP2")) + _transportStyle = "NTCP2"; DataHelper.readProperties(in, _options); } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index a411b009986dc5f1f6384384ad98aeea42885422..87e5bffca0684477c0ba8daee48da05fbea99f44 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 0; + public final static long BUILD = 1; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/crypto/X25519KeyFactory.java b/router/java/src/net/i2p/router/transport/crypto/X25519KeyFactory.java index c7b2289b4ce30e7e47598405931f7b6b88c55b6f..b0c16c499a43e1057d46bf7a51a6b40df91cfb8e 100644 --- a/router/java/src/net/i2p/router/transport/crypto/X25519KeyFactory.java +++ b/router/java/src/net/i2p/router/transport/crypto/X25519KeyFactory.java @@ -66,7 +66,6 @@ public class X25519KeyFactory extends I2PThread { * Note that this stops the singleton precalc thread. * You don't want to do this if there are multiple routers in the JVM. * Fix this if you care. See Router.shutdown(). - * @since 0.8.8 */ public void shutdown() { _isRunning = false; diff --git a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java index daf339d07cdcecc38e71bbc13b63fb8afdd2582e..5b6d912e4e2b0b94d8570389c47c4fe0351ea09c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java @@ -1006,21 +1006,13 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa /** @since 0.9.36 */ public void gotOptions(byte[] options, boolean isHandshake) { - if (options.length < 12) { + NTCP2Options hisPadding = NTCP2Options.fromByteArray(options); + if (hisPadding == null) { if (_log.shouldWarn()) _log.warn("Got options length " + options.length + " on: " + this); return; } - float tmin = (options[0] & 0xff) / 16.0f; - float tmax = (options[1] & 0xff) / 16.0f; - float rmin = (options[2] & 0xff) / 16.0f; - float rmax = (options[3] & 0xff) / 16.0f; - int tdummy = (int) DataHelper.fromLong(options, 4, 2); - int rdummy = (int) DataHelper.fromLong(options, 6, 2); - int tdelay = (int) DataHelper.fromLong(options, 8, 2); - int rdelay = (int) DataHelper.fromLong(options, 10, 2); - _hisPadding = new NTCP2Options(tmin, tmax, rmin, rmax, - tdummy, rdummy, tdelay, rdelay); + _hisPadding = hisPadding; } /** @since 0.9.36 */ diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCP2Options.java b/router/java/src/net/i2p/router/transport/ntcp/NTCP2Options.java index 96a750d1f9e083776846e147e09d170ea7a61f06..97f25170806b7fb0840bddaea77cf67a2a2e232c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCP2Options.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCP2Options.java @@ -1,5 +1,7 @@ package net.i2p.router.transport.ntcp; +import net.i2p.data.DataHelper; + /** * * NTCP2 Padding/Dummy/Delay configuration for data phase. @@ -60,6 +62,25 @@ class NTCP2Options { xsDummy, xrDummy, xsDelay, xrDelay); } + /** + * @since 0.9.37 consolidated from two places + * @return null on error + */ + public static NTCP2Options fromByteArray(byte[] options) { + if (options.length < 12) + return null; + float tmin = (options[0] & 0xff) / 16.0f; + float tmax = (options[1] & 0xff) / 16.0f; + float rmin = (options[2] & 0xff) / 16.0f; + float rmax = (options[3] & 0xff) / 16.0f; + int tdummy = (int) DataHelper.fromLong(options, 4, 2); + int rdummy = (int) DataHelper.fromLong(options, 6, 2); + int tdelay = (int) DataHelper.fromLong(options, 8, 2); + int rdelay = (int) DataHelper.fromLong(options, 10, 2); + return new NTCP2Options(tmin, tmax, rmin, rmax, + tdummy, rdummy, tdelay, rdelay); + } + @Override public String toString() { return "Padding options: send min/max %: (" + (_sendMin * 100) + ", " + (_sendMax * 100) + diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index b589bd070a4dc50eeeebb6a462823c141d1762cd..6e86e6892ffa6e99e6047c2f7b1d14739efefedc 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -2131,21 +2131,12 @@ public class NTCPConnection implements Closeable { } public void gotOptions(byte[] options, boolean isHandshake) { - if (options.length < 12) { + NTCP2Options hisPadding = NTCP2Options.fromByteArray(options); + if (hisPadding == null) { if (_log.shouldWarn()) _log.warn("Got options length " + options.length + " on: " + this); return; } - float tmin = (options[0] & 0xff) / 16.0f; - float tmax = (options[1] & 0xff) / 16.0f; - float rmin = (options[2] & 0xff) / 16.0f; - float rmax = (options[3] & 0xff) / 16.0f; - int tdummy = (int) DataHelper.fromLong(options, 4, 2); - int rdummy = (int) DataHelper.fromLong(options, 6, 2); - int tdelay = (int) DataHelper.fromLong(options, 8, 2); - int rdelay = (int) DataHelper.fromLong(options, 10, 2); - NTCP2Options hisPadding = new NTCP2Options(tmin, tmax, rmin, rmax, - tdummy, rdummy, tdelay, rdelay); _paddingConfig = OUR_PADDING.merge(hisPadding); if (_log.shouldDebug()) _log.debug("Got padding options:" + diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 3b58a78e9e2c170f12625bf080db1ba1674e2791..191adea7176778209d746d99f02fabd55b92ba76 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -273,7 +273,9 @@ public class NTCPTransport extends TransportImpl { } if (iv == null || iv.length != NTCP2_IV_LEN) { iv = new byte[NTCP2_IV_LEN]; - ctx.random().nextBytes(iv); + do { + ctx.random().nextBytes(iv); + } while (DataHelper.eq(iv, 0, OutboundNTCP2State.ZEROKEY, 0, NTCP2_IV_LEN)); shouldSave = true; } if (shouldSave) {