diff --git a/history.txt b/history.txt index a3ece9d2e6..f7e2f03d60 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,9 @@ +2020-10-23 zzz + * i2ptunnel: Remove mtn tunnel (new installs only) + * Tunnels: + - Move AES reply keys from HopConfig to TunnelCreatorConfig + - Add missing expiration field to ECIES BRR + 2020-10-21 zzz * NetDB: - ECIES router support for encrypted lookups and stores (proposal #156) diff --git a/router/java/src/net/i2p/data/i2np/BuildRequestRecord.java b/router/java/src/net/i2p/data/i2np/BuildRequestRecord.java index 48ed6b717a..53db1a3ca7 100644 --- a/router/java/src/net/i2p/data/i2np/BuildRequestRecord.java +++ b/router/java/src/net/i2p/data/i2np/BuildRequestRecord.java @@ -112,6 +112,7 @@ public class BuildRequestRecord { public static final int IV_SIZE = 16; /** we show 16 bytes of the peer hash outside the elGamal block */ public static final int PEER_SIZE = 16; + private static final int DEFAULT_EXPIRATION_SECONDS = 10*60; /** * @return 222 (ElG) or 464 (ECIES) bytes, non-null @@ -143,7 +144,8 @@ public class BuildRequestRecord { private static final int OFF_REPLY_IV_EC = OFF_REPLY_KEY_EC + SessionKey.KEYSIZE_BYTES; private static final int OFF_FLAG_EC = OFF_REPLY_IV_EC + IV_SIZE; private static final int OFF_REQ_TIME_EC = OFF_FLAG_EC + 4; - private static final int OFF_SEND_MSG_ID_EC = OFF_REQ_TIME_EC + 4; + private static final int OFF_EXPIRATION = OFF_REQ_TIME_EC + 4; + private static final int OFF_SEND_MSG_ID_EC = OFF_EXPIRATION + 4; private static final int OFF_OPTIONS = OFF_SEND_MSG_ID_EC + 4; private static final int LENGTH_EC = 464; private static final int MAX_OPTIONS_LENGTH = LENGTH_EC - OFF_OPTIONS; // includes options length @@ -253,6 +255,16 @@ public class BuildRequestRecord { return DataHelper.fromLong(_data, off, 4); } + /** + * The expiration in milliseconds from now. + * @since 0.9.48 + */ + public long readExpiration() { + if (!_isEC) + return DEFAULT_EXPIRATION_SECONDS * 1000L; + return DataHelper.fromLong(_data, OFF_EXPIRATION, 4) * 1000L; + } + /** * ECIES only. * @return null for ElGamal or on error @@ -511,6 +523,7 @@ public class BuildRequestRecord { // this ignores leap seconds truncatedMinute /= (60*1000L); DataHelper.toLong(buf, OFF_REQ_TIME_EC, 4, truncatedMinute); + DataHelper.toLong(buf, OFF_EXPIRATION, 4, DEFAULT_EXPIRATION_SECONDS); DataHelper.toLong(buf, OFF_SEND_MSG_ID_EC, 4, nextMsgId); try { int off = DataHelper.toProperties(buf, OFF_OPTIONS, options); @@ -547,7 +560,8 @@ public class BuildRequestRecord { .append(" reply key: ").append(readReplyKey()) .append(" reply IV: ").append(Base64.encode(readReplyIV())) .append(" time: ").append(DataHelper.formatTime(readRequestTime())) - .append(" reply msg id: ").append(readReplyMessageId()); + .append(" reply msg id: ").append(readReplyMessageId()) + .append(" expires in: ").append(DataHelper.formatDuration(readExpiration())); if (_isEC) { buf.append(" options: ").append(readOptions()); if (_chachaReplyKey != null) { @@ -562,6 +576,7 @@ public class BuildRequestRecord { /**** public static void main(String[] args) throws Exception { + System.out.println("OFF_OPTIONS is " + OFF_OPTIONS); RouterContext ctx = new RouterContext(null); TESTKF = new net.i2p.router.transport.crypto.X25519KeyFactory(ctx); byte[] h = new byte[32]; diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f2522cd4ed..7ca1a3ec2c 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 = 9; + public final static long BUILD = 10; /** for example "-test" */ public final static String EXTRA = "";