/** 48 char b32 string (30 bytes of entropy) */ public static String randomString() { I2PAppContext ctx = I2PAppContext.getGlobalContext(); // make a random 48 character password (30 * 8 / 5) byte[] rand = new byte[30]; ctx.random().nextBytes(rand); return Base32.encode(rand); }
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (!validPassphrase()) return; response.setContentType("text/html"); PrintWriter out = null; try { out = response.getWriter(); out.println("<html><head><title>Addresses</title></head>"); out.println("<form method=POST>"); out.println("<table>"); for (Record record : RecordIndex.getInstance()) { out.println("<tr>"); out.println( "<td><input name=\"checked\" type=\"checkbox\" value=\"" + Long.toHexString(record.id) + "\" /></td>"); out.println(" <td>" + record.getName() + "</td>"); out.println(" <td>" + formatter.format(record.getModified()) + "</td>"); out.println(" <td>" + record.getAddress().toBase64() + "</td>"); out.println("</tr>"); } out.println("</table>"); out.println("<input name=\"delete\" type=\"submit\" value=\"Delete Selected\" />"); out.println("</form>"); out.println("<h3>Deleted addresses:</h3>"); out.println("<form method=POST>"); out.println("<table>"); for (Hash hash : blacklist) { String shash = Base32.encode(hash.getData()); out.println("<tr>"); out.println( " <td><input name=\"checked\" type=\"checkbox\" value=\"" + shash + "\" /></td>"); out.println(" <td>" + shash + "</td>"); out.println("</tr>"); } out.println("</table>"); out.println("<input type=\"submit\" name=\"submit\" value=\"Undelete Selected\" />"); out.println("</form></body></html>"); } finally { if (out != null) out.close(); } }
/** Base64 Hash or Hash.i2p or name.i2p using naming service */ Destination getDestination(String ip) { if (ip == null) return null; if (ip.endsWith(".i2p")) { if (ip.length() < 520) { // key + ".i2p" if (_manager != null && ip.length() == BASE32_HASH_LENGTH + 8 && ip.endsWith(".b32.i2p")) { // Use existing I2PSession for b32 lookups if we have it // This is much more efficient than using the naming service I2PSession sess = _manager.getSession(); if (sess != null) { byte[] b = Base32.decode(ip.substring(0, BASE32_HASH_LENGTH)); if (b != null) { // Hash h = new Hash(b); Hash h = Hash.create(b); if (_log.shouldLog(Log.INFO)) _log.info("Using existing session for lookup of " + ip); try { return sess.lookupDest(h, 15 * 1000); } catch (I2PSessionException ise) { } } } } if (_log.shouldLog(Log.INFO)) _log.info("Using naming service for lookup of " + ip); return _context.namingService().lookup(ip); } if (_log.shouldLog(Log.INFO)) _log.info("Creating Destination for " + ip); try { return new Destination(ip.substring(0, ip.length() - 4)); // sans .i2p } catch (DataFormatException dfe) { return null; } } else { if (_log.shouldLog(Log.INFO)) _log.info("Creating Destination for " + ip); try { return new Destination(ip); } catch (DataFormatException dfe) { return null; } } }
/** * Call out to keytool to create a new keystore with a keypair in it. Trying to do this * programatically is a nightmare, requiring either BouncyCastle libs or using proprietary Sun * libs, and it's a huge mess. * * @return success * @since 0.8.3 */ private boolean createKeyStore(File ks) { // make a random 48 character password (30 * 8 / 5) byte[] rand = new byte[30]; _context.random().nextBytes(rand); String keyPassword = Base32.encode(rand); // and one for the cname _context.random().nextBytes(rand); String cname = Base32.encode(rand) + ".console.i2p.net"; String keytool = (new File(System.getProperty("java.home"), "bin/keytool")).getAbsolutePath(); String[] args = new String[] { keytool, "-genkey", // -genkeypair preferred in newer keytools, but this works with more "-storetype", KeyStore.getDefaultType(), "-keystore", ks.getAbsolutePath(), "-storepass", DEFAULT_KEYSTORE_PASSWORD, "-alias", "console", "-dname", "CN=" + cname + ",OU=Console,O=I2P Anonymous Network,L=XX,ST=XX,C=XX", "-validity", "3652", // 10 years "-keyalg", "DSA", "-keysize", "1024", "-keypass", keyPassword }; boolean success = (new ShellCommand()).executeSilentAndWaitTimed(args, 30); // 30 secs if (success) { success = ks.exists(); if (success) { SecureFileOutputStream.setPerms(ks); try { Map<String, String> changes = new HashMap(); changes.put(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD); changes.put(PROP_KEY_PASSWORD, keyPassword); _context.router().saveConfig(changes, null); } catch (Exception e) { } // class cast exception } } if (success) { System.err.println( "Created self-signed certificate for " + cname + " in keystore: " + ks.getAbsolutePath() + "\n" + "The certificate name was generated randomly, and is not associated with your " + "IP address, host name, router identity, or destination keys."); } else { System.err.println("Failed to create console SSL keystore using command line:"); StringBuilder buf = new StringBuilder(256); for (int i = 0; i < args.length; i++) { buf.append('"').append(args[i]).append("\" "); } System.err.println(buf.toString()); System.err.println( "This is for the Sun/Oracle keytool, others may be incompatible.\n" + "If you create the keystore manually, you must add " + PROP_KEYSTORE_PASSWORD + " and " + PROP_KEY_PASSWORD + " to " + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath()); } return success; }