diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java index ed18fcbe9..42bad53f0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java @@ -1396,7 +1396,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { } /** - * Generate a new keypair + * Generate a new keypair. + * Does NOT support non-default sig types. * Deprecated - only used by CLI * * Sets the event "genkeysResult" = "ok" or "error" after the generation is complete @@ -1439,7 +1440,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { } /** - * Generate a new keypair + * Generate a new keypair. + * Does NOT support non-default sig types. * Deprecated - only used by CLI * * Sets the event "privateKey" = base64 of the privateKey stream and @@ -1448,7 +1450,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { * @param l logger to receive events and output */ private static void runGenTextKeys(Logging l) { - ByteArrayOutputStream privkey = new ByteArrayOutputStream(512); + ByteArrayOutputStream privkey = new ByteArrayOutputStream(1024); ByteArrayOutputStream pubkey = new ByteArrayOutputStream(512); makeKey(privkey, pubkey, l); l.log("Private key: " + Base64.encode(privkey.toByteArray())); @@ -1694,10 +1696,11 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { /** * Create a new destination, storing the destination and its private keys where - * instructed + * instructed. + * Does NOT support non-default sig types. * Deprecated - only used by CLI * - * @param writeTo location to store the private keys + * @param writeTo location to store the destination and private keys * @param pubDest location to store the destination * @param l logger to send messages to */ diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java index 1b1fdefcf..5936b6936 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java @@ -7,11 +7,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; + import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.I2PClient; import net.i2p.client.I2PClientFactory; import net.i2p.client.I2PSession; +import net.i2p.crypto.SigType; import net.i2p.data.Base32; import net.i2p.data.Destination; import net.i2p.i2ptunnel.socks.I2PSOCKSTunnel; @@ -49,8 +51,8 @@ public class TunnelController implements Logging { * the prefix should be used (and, in turn, that prefix should be stripped off * before being interpreted by this controller) * - * @param config original key=value mapping - * @param prefix beginning of key values that are relevent to this tunnel + * @param config original key=value mapping non-null + * @param prefix beginning of key values that are relevant to this tunnel */ public TunnelController(Properties config, String prefix) { this(config, prefix, true); @@ -58,6 +60,8 @@ public class TunnelController implements Logging { /** * + * @param config original key=value mapping non-null + * @param prefix beginning of key values that are relevant to this tunnel * @param createKey for servers, whether we want to create a brand new destination * with private keys at the location specified or not (does not * overwrite existing ones) @@ -99,7 +103,16 @@ public class TunnelController implements Logging { FileOutputStream fos = null; try { fos = new SecureFileOutputStream(keyFile); - Destination dest = client.createDestination(fos); + SigType stype = I2PClient.DEFAULT_SIGTYPE; + String st = _config.getProperty("option." + I2PClient.PROP_SIGTYPE); + if (st != null) { + SigType type = SigType.parseSigType(st); + if (type != null) + stype = type; + else + log("Unsupported sig type " + st); + } + Destination dest = client.createDestination(fos, stype); String destStr = dest.toBase64(); log("Private key created and saved in " + keyFile.getAbsolutePath()); log("You should backup this file in a secure place."); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java index 425cfb9ca..f1e8abaab 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java @@ -12,6 +12,7 @@ import net.i2p.client.I2PClient; import net.i2p.client.I2PClientFactory; import net.i2p.client.I2PSession; import net.i2p.client.I2PSessionException; +import net.i2p.crypto.SigType; import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnel; import net.i2p.i2ptunnel.I2PTunnelTask; @@ -78,8 +79,17 @@ import net.i2p.util.EventDispatcher; I2PClient client = I2PClientFactory.createClient(); byte[] key; try { - ByteArrayOutputStream out = new ByteArrayOutputStream(512); - client.createDestination(out); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + SigType stype = I2PClient.DEFAULT_SIGTYPE; + String st = tunnel.getClientOptions().getProperty(I2PClient.PROP_SIGTYPE); + if (st != null) { + SigType type = SigType.parseSigType(st); + if (type != null) + stype = type; + else + l.log("Unsupported sig type " + st); + } + client.createDestination(out, stype); key = out.toByteArray(); } catch(Exception exc) { throw new RuntimeException("failed to create i2p-destination", exc); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java index 990d2d1f1..77c89319b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -14,6 +14,7 @@ import java.util.Properties; import java.util.Set; import java.util.TreeMap; +import net.i2p.client.I2PClient; import net.i2p.data.Base64; import net.i2p.data.Destination; import net.i2p.data.PrivateKeyFile; @@ -177,6 +178,11 @@ public class EditBean extends IndexBean { return getBooleanProperty(tunnel, "i2cp.encryptLeaseSet"); } + /** @since 0.9.12 */ + public int getSigType(int tunnel) { + return getProperty(tunnel, I2PClient.PROP_SIGTYPE, 0); + } + /** @since 0.8.9 */ public boolean getDCC(int tunnel) { return getBooleanProperty(tunnel, I2PTunnelIRCClient.PROP_DCC); @@ -358,6 +364,11 @@ public class EditBean extends IndexBean { return Addresses.getAllAddresses(); } + /** @since 0.9.12 */ + public boolean isAdvanced() { + return _context.getBooleanProperty("routerconsole.advanced"); + } + public String getI2CPHost(int tunnel) { if (_context.isRouterContext()) return _("internal"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index f674f490c..9b9ad31ad 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; import net.i2p.I2PAppContext; import net.i2p.app.ClientAppManager; import net.i2p.app.Outproxy; +import net.i2p.client.I2PClient; import net.i2p.data.Base32; import net.i2p.data.Certificate; import net.i2p.data.Destination; @@ -983,6 +984,7 @@ public class IndexBean { } catch (NumberFormatException nfe) {} } } + public void setCert(String val) { if (val != null) { try { @@ -990,10 +992,24 @@ public class IndexBean { } catch (NumberFormatException nfe) {} } } + public void setSigner(String val) { _certSigner = val; } + /** @since 0.9.12 */ + public void setSigType(String val) { + if (val != null) { + _otherOptions.put(I2PClient.PROP_SIGTYPE, val); + if (val.equals("0")) + _certType = 0; + else + _certType = 5; + } + // TODO: Call modifyDestination?? + // Otherwise this only works on a new tunnel... + } + /** Modify or create a destination */ private String modifyDestination() { if (_privKeyFile == null || _privKeyFile.trim().length() <= 0) @@ -1234,13 +1250,14 @@ public class IndexBean { "outproxyUsername", "outproxyPassword", I2PTunnelHTTPClient.PROP_JUMP_SERVERS, I2PTunnelHTTPClientBase.PROP_AUTH, + I2PClient.PROP_SIGTYPE, I2PTunnelHTTPClient.PROP_SSL_OUTPROXIES }; private static final String _otherServerOpts[] = { "i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.leaseSetKey", "i2cp.accessList", PROP_MAX_CONNS_MIN, PROP_MAX_CONNS_HOUR, PROP_MAX_CONNS_DAY, PROP_MAX_TOTAL_CONNS_MIN, PROP_MAX_TOTAL_CONNS_HOUR, PROP_MAX_TOTAL_CONNS_DAY, - PROP_MAX_STREAMS + PROP_MAX_STREAMS, I2PClient.PROP_SIGTYPE }; private static final String _httpServerOpts[] = { I2PTunnelHTTPServer.OPT_POST_WINDOW, diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index ff397556c..2b560173c 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -449,6 +449,37 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% } %> + <% if (editBean.isAdvanced()) { %> +
+ +
+
+
+ + class="tickbox" /> +
+
+ + class="tickbox" /> +
+
+ + class="tickbox" /> +
+
+ + class="tickbox" /> +
+
+ +
+
+
+ <% } // isAdvanced %>> + <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index a6c8e7413..978afd63a 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -491,6 +491,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
+<% /***************** %>
+<% **********************/ %> + + <% if (editBean.isAdvanced()) { %> +
+ +
+
+
+ + class="tickbox" /> +
+
+ + class="tickbox" /> +
+
+ + class="tickbox" /> +
+
+ + class="tickbox" /> +
+

+ <% } // isAdvanced %>>