// RSA public key server // // Server which provides a randomly generated RSA public key // and instantiates a Login Server and "service" server with RMI names based // on the hex representation of the public key. // // R. Perry, July 1998 import java.security.*; import java.io.*; import java.net.InetAddress; import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.LocateRegistry; import java.lang.reflect.*; import cryptix.provider.rsa.*; import cryptix.util.core.Hex; public class KeyServer extends UnicastRemoteObject implements Key { private static int port = 21099; public KeyServer() throws java.rmi.RemoteException { super(); // setLog( System.out); } public PublicKey getKey( String service) throws java.rmi.RemoteException, java.rmi.server.ServerNotActiveException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException { KeyPairGenerator kg; // generator for random RSA keys SecureRandom rand; // to pass to kg.initialize() int key_size = 1024; // number of bits for RSA key KeyPair pair; // RSA key pair PublicKey pk; // RSA public key PrivateKey sk; // RSA private key // ToDo: hosts.allow restrictions for ClientHost // System.out.println( "KeyServer: getKey(): called from " + this.getClientHost()); rand = SecureRandom.getInstance( "SHA1PRNG"); rand.setSeed(0); kg = KeyPairGenerator.getInstance("RSA"); System.out.println("KeyServer: getkey(): Generating keypair..."); kg.initialize(key_size, rand); pair = kg.generateKeyPair(); pk = pair.getPublic(); sk = pair.getPrivate(); // System.out.println( "KeyServer: getkey(): returning public key:\n " + pk); String pk_hex = Hex.toString(pk.getEncoded()); System.out.println( "KeyServer: getKey(): RawRSAPublicKey = " + pk_hex); // start up a Login Server // LoginServer L = new LoginServer( sk); try { Naming.rebind("rmi://:" + port + "/LoginServer-" + pk_hex, (Login) L); System.out.println("KeyServer: new LoginServer created and bound in the registry on port " + port); } catch( Exception e) { System.out.println("KeyServer: " + e); } // start up the Server class named by the service string // Class[] args; Class serviceClass; Constructor C; Object o = null; try { args = new Class[] {LoginServer.class}; serviceClass = Class.forName( service); C = serviceClass.getConstructor( args); o = C.newInstance( new Object[] {L}); } catch( Exception e) { System.out.println("KeyServer: " + e); } try { Naming.rebind("rmi://:" + port + "/" + service + "-" + pk_hex, (java.rmi.Remote) o); System.out.println("KeyServer: new " + service + " created and bound in the registry on port " + port); } catch( Exception e) { System.out.println("KeyServer: " + e); } return pk; } /* * createPortFile: save hostname and port number in ./port file */ private static void createPortFile( int port) throws java.io.IOException { PrintWriter fout = new PrintWriter( new BufferedWriter( new FileWriter( "port"))); fout.println( InetAddress.getLocalHost().getHostName()); fout.println( port); if( fout.checkError()) { System.err.println( "KeyServer: error writing port file."); System.exit(1); } fout.close(); } public static void main (String[] args) throws Exception { if (args.length == 1) port = Integer.parseInt(args[0]); // System.setSecurityManager(new RMISecurityManager()); -- need policy file with JDK1.2 try { LocateRegistry.createRegistry(port); Key f = new KeyServer(); Naming.rebind("rmi://:" + port + "/KeyServer", f); System.out.println("KeyServer: created and bound in the registry on port " + port); } catch (Exception e) { System.out.println("KeyServer: " + e); System.exit(1); } createPortFile( port); System.out.println("KeyServer: created port file."); } }