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()) { %>
+
+
+
+
+
+
+
+
+ <% } // 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()) { %>
+
+
+
+
+ <% } // isAdvanced %>>