package org.openslx.satellitedaemon; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.math.BigInteger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPrivateKeySpec; import org.apache.log4j.Logger; public class AsymKeyHolder { private static final Logger LOG = Logger.getLogger( AsymKeyHolder.class ); private static PrivateKey privKey = null; private static PublicKey pubKey = null; /** * Get private key for this server. If none exists yet, create a new one. * * @return */ public static PrivateKey getPrivateKey() { if (privKey == null) { if (!loadKey() && !generateKey()) { LOG.warn( "Could not load or generate keypair for communication with masterserver" ); } } return privKey; } private static boolean loadKey() { BufferedReader br = null; String modulus, exponent; KeyFactory keyFact; try { keyFact = KeyFactory.getInstance( "RSA" ); } catch ( NoSuchAlgorithmException nSAE ) { LOG.warn( "Could not get a KeyFactory to load the key from disk", nSAE ); return false; } try { br = new BufferedReader( new FileReader( "config/private.key" ) ); modulus = br.readLine(); exponent = br.readLine(); } catch ( FileNotFoundException e ) { LOG.error( "File 'private.key' not found!", e ); return false; } catch ( IOException e ) { LOG.error( "File 'private.key' not correct readable.", e ); return false; } finally { try { br.close(); } catch ( IOException e ) { } } if ( modulus == null || exponent == null ) { return false; } try { BigInteger mod = new BigInteger( modulus ); BigInteger exp = new BigInteger( exponent ); RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec( mod, exp ); synchronized ( keyFact ) { privKey = keyFact.generatePrivate( keySpec ); } return privKey != null; } catch ( InvalidKeySpecException e ) { LOG.error( "Not able to build key with given numbers.", e ); } catch ( NumberFormatException e ) { LOG.error( "Invalid number format.", e ); } return false; } private static boolean generateKey() { // KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // kpg.initialize(4096); // KeyPair kp = kpg.generateKeyPair(); // RSAPrivateKey privateKey = (RSAPrivateKey) kp.getPrivate(); // RSAPublicKey publicKey = (RSAPublicKey) kp.getPublic(); // // log.debug("modulus: " + privateKey.getModulus().toString()); // log.debug("exponent: " + privateKey.getPrivateExponent().toString()); // // // log.debug("modulus: " + publicKey.getModulus().toString()); // log.debug("exponent: " + publicKey.getPublicExponent().toString()); // // System.exit(1); return true; } }