diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java index 980ba017d7902da22452750d5912f2cade6e65bd..e0d719c4278d7c9cf890f4c7fcf1cb64862d4244 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java @@ -55,10 +55,16 @@ public class GeneralHelper { private final I2PAppContext _context; protected final TunnelControllerGroup _group; + /** + * @param tcg may be null ??? + */ public GeneralHelper(TunnelControllerGroup tcg) { this(I2PAppContext.getGlobalContext(), tcg); } + /** + * @param tcg may be null ??? + */ public GeneralHelper(I2PAppContext context, TunnelControllerGroup tcg) { _context = context; _group = tcg; @@ -68,6 +74,10 @@ public class GeneralHelper { return getController(_group, tunnel); } + /** + * @param tcg may be null + * @return null if not found or tcg is null + */ public static TunnelController getController(TunnelControllerGroup tcg, int tunnel) { if (tunnel < 0) return null; if (tcg == null) return null; @@ -696,6 +706,21 @@ public class GeneralHelper { return type.getCode(); } + /** + * @param encType code + * @since 0.9.44 + */ + public boolean hasEncType(int tunnel, int encType) { + String senc = getProperty(tunnel, "i2cp.leaseSetEncType", "0"); + String[] senca = DataHelper.split(senc, ","); + String se = Integer.toString(encType); + for (int i = 0; i < senca.length; i++) { + if (se.equals(senca[i])) + return true; + } + return false; + } + /** * Random keys */ diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java index 01289da930f44a494063cf7104d8df651dfa5133..fb072c1296af106da7d9069157b56aea6249372c 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java @@ -632,6 +632,19 @@ public class TunnelConfig { _otherOptions.put(I2PClient.PROP_SIGTYPE, val.trim()); } + /** + * Adds to existing, comma separated + * @since 0.9.44 + */ + public void setEncType(String val) { + if (val != null) { + String p = _otherOptions.get("i2cp.leaseSetEncType"); + if (p != null) + val = p + ',' + val; + _otherOptions.put("i2cp.leaseSetEncType", val); + } + } + /** * Random keys */ @@ -837,6 +850,7 @@ public class TunnelConfig { p = OPT + "i2cp.leaseSetPrivateKey"; keys = KeyGenerator.getInstance().generatePKIKeys(); config.setProperty(p, "ELGAMAL_2048:" + keys[1].toBase64()); + // TODO ECIES key } catch (GeneralSecurityException gse) { // so much for that } @@ -1062,7 +1076,8 @@ public class TunnelConfig { I2PClient.PROP_SIGTYPE, I2PTunnelHTTPClient.PROP_SSL_OUTPROXIES, // following are mostly server but could also be persistent client - "inbound.randomKey", "outbound.randomKey", "i2cp.leaseSetSigningPrivateKey", "i2cp.leaseSetPrivateKey" + "inbound.randomKey", "outbound.randomKey", "i2cp.leaseSetSigningPrivateKey", "i2cp.leaseSetPrivateKey", + "i2cp.leaseSetEncType" }; private static final String _otherServerOpts[] = { "i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.leaseSetKey", "i2cp.accessList", @@ -1071,7 +1086,8 @@ public class TunnelConfig { PROP_MAX_STREAMS, I2PClient.PROP_SIGTYPE, "inbound.randomKey", "outbound.randomKey", "i2cp.leaseSetSigningPrivateKey", "i2cp.leaseSetPrivateKey", I2PTunnelServer.PROP_ALT_PKF, - "i2cp.leaseSetSecret", "i2cp.leaseSetType", "i2cp.leaseSetAuthType", "i2cp.leaseSetPrivKey" + "i2cp.leaseSetSecret", "i2cp.leaseSetType", "i2cp.leaseSetAuthType", "i2cp.leaseSetPrivKey", + "i2cp.leaseSetEncType" }; private static final String _httpServerOpts[] = { I2PTunnelHTTPServer.OPT_POST_WINDOW, 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 a3599e3fe346568e5307986f6f4e87bdf72cf3d6..8dbed733593562314254ff6e2f50e608f679a74c 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -259,6 +259,14 @@ public class EditBean extends IndexBean { return getTunnelStatus(tunnel) == GeneralHelper.NOT_RUNNING; } + /** + * @param encType code + * @since 0.9.44 + */ + public boolean hasEncType(int tunnel, int encType) { + return _helper.hasEncType(tunnel, encType); + } + /** * Random keys, hidden in forms * @since 0.9.18 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 b09beceaa801bb89f03d5e661549ab276bbf326a..85fcd595b8c702226e525ee181c99ab6a06abce9 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -1239,6 +1239,14 @@ public class IndexBean { // Otherwise this only works on a new tunnel... } + /** + * Adds to existing, comma separated + * @since 0.9.44 + */ + public void setEncType(String s) { + _config.setEncType(s); + } + /** * Random keys, hidden in forms * @since 0.9.18 diff --git a/apps/i2ptunnel/jsp/editClient.jsi b/apps/i2ptunnel/jsp/editClient.jsi index 2ece40a25589c2757d32a0d5450149238f8e896e..666bfc789075e8cb1d83cb6be99f7bc1cfaccd3c 100644 --- a/apps/i2ptunnel/jsp/editClient.jsi +++ b/apps/i2ptunnel/jsp/editClient.jsi @@ -487,13 +487,12 @@ <% } // if httpclient - if (true /* editBean.isAdvanced() */ ) { - int currentSigType = editBean.getSigType(curTunnel, tunnelType); - String disabled = editBean.canChangeSigType(curTunnel) ? "" : " disabled=\"disabled\" "; + int currentSigType = editBean.getSigType(curTunnel, tunnelType); + String disabled = editBean.canChangeSigType(curTunnel) ? "" : " disabled=\"disabled\" "; %> <tr> <th colspan="2"> - <%=intl._t("Signature type")%> <%-- (<%=intl._t("Experts only!")%>) --%> + <%=intl._t("Signature type")%> </th> </tr><tr> <td colspan="2"> @@ -529,6 +528,31 @@ </select> </td> </tr> +<% + if (editBean.isAdvanced()) { + boolean has0 = editBean.hasEncType(curTunnel, 0); + boolean has4 = editBean.hasEncType(curTunnel, 4); +%> + <tr> + <th colspan="2"> + <%=intl._t("Encryption types")%> + </th> + </tr><tr> + <td colspan="2"> + <span class="multiOption"> + <label><input value="0" type="radio" id="startOnLoad" name="encType" <%=(has0 ? " checked=\"checked\"" : "")%> class="tickbox" /> + ElGamal-2048</label> + </span> + <span class="multiOption"> + <label><input value="4" type="radio" id="startOnLoad" name="encType" <%=(has4 ? " checked=\"checked\"" : "")%> class="tickbox" /> + ECIES-X25519 (<%=intl._t("Experts only!")%>)</label> + </span> + <span class="multiOption"> + <label><input value="0,4" type="radio" id="startOnLoad" name="encType" <%=((has0 && has4) ? " checked=\"checked\"" : "")%> class="tickbox" /> + <%=intl._t("Both")%> (<%=intl._t("Experts only!")%>)</label> + </span> + </td> + </tr> <% } // isAdvanced diff --git a/apps/i2ptunnel/jsp/editServer.jsi b/apps/i2ptunnel/jsp/editServer.jsi index 37db6c3f3404cb7aafec3fe741e3cb8eabdfcaa5..4222c16f34d4e8b8995e96d5095c5018215a4745 100644 --- a/apps/i2ptunnel/jsp/editServer.jsi +++ b/apps/i2ptunnel/jsp/editServer.jsi @@ -802,12 +802,11 @@ <% **********************/ int currentSigType = editBean.getSigType(curTunnel, tunnelType); - if (true /* editBean.isAdvanced() */ ) { - String disabled = editBean.canChangeSigType(curTunnel) ? "" : " disabled=\"disabled\" "; + String disabled = editBean.canChangeSigType(curTunnel) ? "" : " disabled=\"disabled\" "; %> <tr> <th colspan="2"> - <%=intl._t("Signature type")%> <%-- (<%=intl._t("Experts only! Changes B32!")%>) --%> + <%=intl._t("Signature type")%> </th> </tr><tr> <td colspan="2"> @@ -838,7 +837,33 @@ </select> </td> </tr> -<% } // isAdvanced +<% + if (editBean.isAdvanced()) { + boolean has0 = editBean.hasEncType(curTunnel, 0); + boolean has4 = editBean.hasEncType(curTunnel, 4); +%> + <tr> + <th colspan="2"> + <%=intl._t("Encryption types")%> + </th> + </tr><tr> + <td colspan="2"> + <span class="multiOption"> + <label><input value="0" type="radio" id="startOnLoad" name="encType" <%=(has0 ? " checked=\"checked\"" : "")%> class="tickbox" /> + ElGamal-2048</label> + </span> + <span class="multiOption"> + <label><input value="4" type="radio" id="startOnLoad" name="encType" <%=(has4 ? " checked=\"checked\"" : "")%> class="tickbox" /> + ECIES-X25519 (<%=intl._t("Experts only!")%>)</label> + </span> + <span class="multiOption"> + <label><input value="0,4" type="radio" id="startOnLoad" name="encType" <%=((has0 && has4) ? " checked=\"checked\"" : "")%> class="tickbox" /> + <%=intl._t("Both")%> (<%=intl._t("Experts only!")%>)</label> + </span> + </td> + </tr> +<% + } // isAdvanced /* alternate dest, only if current dest is set and is DSA_SHA1 */