package net.i2p.router.networkdb.kademlia;
/*
* free (adj.): unencumbered; not under the control of others
* Written by jrandom in 2003 and released into the public domain
* with no warranty of any kind, either expressed or implied.
* It probably won't make your computer catch on fire, or eat
* your children, but it might. Use at your own risk.
*
*/
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import net.i2p.crypto.KeyGenerator;
import net.i2p.data.Certificate;
import net.i2p.data.PrivateKey;
import net.i2p.data.PublicKey;
import net.i2p.data.router.RouterAddress;
import net.i2p.data.router.RouterIdentity;
import net.i2p.data.router.RouterInfo;
import net.i2p.data.SigningPrivateKey;
import net.i2p.data.SigningPublicKey;
import net.i2p.util.Clock;
public class RouterGenerator {
public static void main(String args[]) {
RouterGenerator gen = new RouterGenerator();
switch (args.length) {
case 0:
gen.createRouters(10000, "dummyRouters");
break;
case 1:
gen.createRouters(10000, args[0]);
break;
case 2:
try { gen.createRouters(Integer.parseInt(args[1]), args[0]); } catch (NumberFormatException nfe) { nfe.printStackTrace(); }
break;
}
}
private void createRouters(int numRouters, String outDir) {
File dir = new File(outDir);
if (!dir.exists())
dir.mkdirs();
int numSuccess = 0;
for (int i = 1; numSuccess < numRouters; i++) {
RouterInfo ri = createRouterInfo(i);
String hash = ri.getIdentity().getHash().toBase64();
if (!hash.startsWith("fwI")) {
System.out.print(".");
if ( (i % 100) == 0) System.out.println();
continue;
}
System.out.println("Router " + i + " created: \t" + hash);
numSuccess++;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(dir, "routerInfo-" + hash + ".dat"));
ri.writeBytes(fos);
} catch (Exception e) {
System.err.println("Error writing router - " + e.getMessage());
e.printStackTrace();
return;
} finally {
if (fos != null) try { fos.close(); } catch (Exception e) {}
}
}
}
private static PublicKey pubkey = null;
private static PrivateKey privkey = null;
private static SigningPublicKey signingPubKey = null;
private static SigningPrivateKey signingPrivKey = null;
private static Object keypair[] = KeyGenerator.getInstance().generatePKIKeypair();
private static Object signingKeypair[] = KeyGenerator.getInstance().generateSigningKeypair();
static {
pubkey = (PublicKey)keypair[0];
privkey = (PrivateKey)keypair[1];
signingPubKey = (SigningPublicKey)signingKeypair[0];
signingPrivKey = (SigningPrivateKey)signingKeypair[1];
}
static RouterInfo createRouterInfo(int num) {
RouterInfo info = new RouterInfo();
try {
info.setAddresses(createAddresses(num));
// not necessary, in constructor
//info.setOptions(new Properties());
//info.setPeers(new HashSet());
info.setPublished(Clock.getInstance().now());
RouterIdentity ident = new RouterIdentity();
BigInteger bv = new BigInteger(""+num);
Certificate cert = new Certificate(Certificate.CERTIFICATE_TYPE_NULL, bv.toByteArray());
ident.setCertificate(cert);
ident.setPublicKey(pubkey);
ident.setSigningPublicKey(signingPubKey);
info.setIdentity(ident);
info.sign(signingPrivKey);
} catch (Exception e) {
System.err.println("Error building router " + num + ": " + e.getMessage());
e.printStackTrace();
}
return info;
}
static Set<RouterAddress> createAddresses(int num) {
Set<RouterAddress> addresses = new HashSet<RouterAddress>();
RouterAddress addr = createTCPAddress(num);
if (addr != null)
addresses.add(addr);
return addresses;
}
private static RouterAddress createTCPAddress(int num) {
RouterAddress addr = new RouterAddress();
addr.setCost(10);
addr.setExpiration(null);
Properties props = new Properties();
String name = "blah.random.host.org";
String port = "" + (1024+num);
props.setProperty("host", name);
props.setProperty("port", port);
addr.setOptions(props);
addr.setTransportStyle("TCP");
return addr;
}
}