diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java index ac8fd4fb7f7ab7f4c8f1e422e612675dd1215474..c2653c7e862b03310058e06206912441bc71504d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java @@ -934,7 +934,9 @@ class NetDbRenderer { } if (full) { buf.append("</td></tr><tr><td><b>").append(_t("Signing Key")).append(":</b></td><td colspan=\"2\">") - .append(info.getIdentity().getSigningPublicKey().getType().toString()); + .append(info.getIdentity().getSigningPublicKey().getType()); + buf.append("</td></tr><tr><td><b>").append(_t("Encryption Key")).append(":</b></td><td colspan=\"2\">") + .append(info.getIdentity().getPublicKey().getType()); } buf.append("</td></tr>\n<tr>") .append("<td><b>").append(_t("Addresses")).append(":</b></td><td colspan=\"2\""); diff --git a/router/java/src/net/i2p/data/router/RouterPrivateKeyFile.java b/router/java/src/net/i2p/data/router/RouterPrivateKeyFile.java index 2f466ca055d80a18a42cbc5ae7ca2bc7acdaa7e8..9c1363f01cf12e7a4108794c451afcbba674bbaf 100644 --- a/router/java/src/net/i2p/data/router/RouterPrivateKeyFile.java +++ b/router/java/src/net/i2p/data/router/RouterPrivateKeyFile.java @@ -7,6 +7,7 @@ import java.io.FileInputStream; import java.io.InputStream; import java.io.IOException; +import net.i2p.crypto.EncType; import net.i2p.crypto.SigType; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; @@ -36,7 +37,10 @@ public class RouterPrivateKeyFile extends PrivateKeyFile { in = new BufferedInputStream(new FileInputStream(this.file)); RouterIdentity ri = new RouterIdentity(); ri.readBytes(in); - privKey = new PrivateKey(); + EncType etype = ri.getPublicKey().getType(); + if (etype == null) + throw new DataFormatException("Unknown enc type"); + privKey = new PrivateKey(etype); privKey.readBytes(in); SigType type = ri.getSigningPublicKey().getType(); if (type == null) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java index 4396eeedd878a1770e8b81c1bee9e771a763a315..fbf68fb2f6f1cb8f541703e0c573625d735c09a3 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java @@ -2,6 +2,7 @@ package net.i2p.router.networkdb.kademlia; import java.util.List; +import net.i2p.crypto.EncType; import net.i2p.crypto.SigType; import net.i2p.data.Hash; import net.i2p.data.router.RouterAddress; @@ -139,6 +140,11 @@ class FloodfillMonitorJob extends JobImpl { RouterInfo ri = getContext().router().getRouterInfo(); if (ri == null) return false; + + // temp until router ratchet SKM implemented + if (ri.getIdentity().getPublicKey().getType() != EncType.ELGAMAL_2048) + return false; + char bw = ri.getBandwidthTier().charAt(0); // Only if class N, O, P, X if (bw != Router.CAPABILITY_BW128 && bw != Router.CAPABILITY_BW256 && diff --git a/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java b/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java index 9c060a99f7c65fa96fb6bc28064c36b52098cb45..61bfdfa2c9241e9364f9826274600e634cf6d9b4 100644 --- a/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java @@ -56,6 +56,8 @@ public class CreateRouterInfoJob extends JobImpl { public static final String KEYS_FILENAME = "router.keys"; public static final String KEYS2_FILENAME = "router.keys.dat"; static final String PROP_ROUTER_SIGTYPE = "router.sigType"; + /** @since 0.9.48 */ + static final String PROP_ROUTER_ENCTYPE = "router.encType"; private static final SigType DEFAULT_SIGTYPE = SigType.EdDSA_SHA512_Ed25519; private static final EncType DEFAULT_ENCTYPE = EncType.ELGAMAL_2048; @@ -106,8 +108,7 @@ public class CreateRouterInfoJob extends JobImpl { // not necessary, in constructor //info.setPeers(new HashSet()); info.setPublished(getCurrentPublishDate(ctx)); - // TODO - EncType etype = DEFAULT_ENCTYPE; + EncType etype = getEncTypeConfig(ctx); KeyPair keypair = ctx.keyGenerator().generatePKIKeys(etype); PublicKey pubkey = keypair.getPublic(); PrivateKey privkey = keypair.getPrivate(); @@ -196,6 +197,24 @@ public class CreateRouterInfoJob extends JobImpl { return cstype; } + /** + * The configured EncType to expect on read-in + * @since 0.9.48 + */ + public static EncType getEncTypeConfig(RouterContext ctx) { + EncType cstype = DEFAULT_ENCTYPE; + String sstype = ctx.getProperty(PROP_ROUTER_ENCTYPE); + if (sstype != null) { + EncType ntype = EncType.parseEncType(sstype); + if (ntype != null) + cstype = ntype; + } + // fallback? + if (cstype != EncType.ELGAMAL_2048 && !cstype.isAvailable()) + cstype = EncType.ELGAMAL_2048; + return cstype; + } + /** * We probably don't want to expose the exact time at which a router published its info. * perhaps round down to the nearest minute? 10 minutes? 30 minutes? day? diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java index c2cbc2dda96617d1c491d2e389ae99137d7e5e6c..c2adebc12ce70f487cf93e69c09593b75acaf3f1 100644 --- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java @@ -15,6 +15,7 @@ import java.io.InputStream; import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; +import net.i2p.crypto.EncType; import net.i2p.crypto.KeyGenerator; import net.i2p.crypto.SigType; import net.i2p.data.Certificate; @@ -115,22 +116,27 @@ class LoadRouterInfoJob extends JobImpl { PrivateKey privkey = kd.privateKey; SigningPrivateKey signingPrivKey = kd.signingPrivateKey; SigType stype = signingPubKey.getType(); + EncType etype = pubkey.getType(); - // check if the sigtype config changed + // check if the sigtype or enctype config changed SigType cstype = CreateRouterInfoJob.getSigTypeConfig(getContext()); boolean sigTypeChanged = stype != cstype; - if (sigTypeChanged && getContext().getProperty(CreateRouterInfoJob.PROP_ROUTER_SIGTYPE) == null) { + EncType cetype = CreateRouterInfoJob.getEncTypeConfig(getContext()); + boolean encTypeChanged = etype != cetype; + if ((sigTypeChanged && getContext().getProperty(CreateRouterInfoJob.PROP_ROUTER_SIGTYPE) == null) || + (encTypeChanged && getContext().getProperty(CreateRouterInfoJob.PROP_ROUTER_ENCTYPE) == null)) { // Not explicitly configured, and default has changed // Give a 25% chance of rekeying for each restart // TODO reduce to ~3 (i.e. increase probability) in future release - if (getContext().random().nextInt(4) > 0) { + if (getContext().random().nextInt(16) > 0) { sigTypeChanged = false; + encTypeChanged = false; if (_log.shouldWarn()) _log.warn("Deferring RI rekey from " + stype + " to " + cstype); } } - if (sigTypeChanged || shouldRebuild(privkey)) { + if (sigTypeChanged || encTypeChanged || shouldRebuild(privkey)) { if (_us != null) { Hash h = _us.getIdentity().getHash(); _log.logAlways(Log.WARN, "Deleting old router identity " + h.toBase64()); @@ -143,6 +149,8 @@ class LoadRouterInfoJob extends JobImpl { } if (sigTypeChanged) _log.logAlways(Log.WARN, "Rebuilding RouterInfo with new signature type " + cstype); + if (encTypeChanged) + _log.logAlways(Log.WARN, "Rebuilding RouterInfo with new encryption type " + cetype); // windows... close before deleting if (fis1 != null) { try { fis1.close(); } catch (IOException ioe) {}