package org.openslx.imagemaster.db; import java.math.BigInteger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPublicKeySpec; import org.apache.log4j.Logger; /** * Represents a satellite in the database. * Is used to authenticate the satellite. */ public class DbSatellite { private static final Logger LOG = Logger.getLogger( DbSatellite.class ); private String organization, address, name, prefix, publickeyString; private PublicKey publickey = null; private static final KeyFactory keyFact; static { KeyFactory kf; try { kf = KeyFactory.getInstance( "RSA" ); } catch ( NoSuchAlgorithmException e ) { kf = null; } keyFact = kf; } // needs to be public in order to be found by MySQL public DbSatellite( String organization, String address, String name, String prefix, String publickeyString ) { this.organization = organization; this.address = address; this.name = name; this.prefix = prefix; this.publickeyString = publickeyString; } public static DbSatellite fromOrganization( String organization ) { return MySQL .findUniqueOrNull( DbSatellite.class, "SELECT satellite.organization, satellite.address, satellite.name, satellite.prefix, satellite.publickey FROM satellite WHERE satellite.organization = ? LIMIT 1", organization ); } public static DbSatellite fromPrefix( String prefix ) { return MySQL .findUniqueOrNull( DbSatellite.class, "SELECT satellite.organization, satellite.address, satellite.name, satellite.prefix, satellite.publickey FROM satellite WHERE satellite.prefix = ? LIMIT 1", prefix ); } public String getAddress() { return address; } public String getName() { return name; } public String getOrganization() { return organization; } public String getPrefix() { return this.prefix; } /** * Get the public key of this organization, if known and valid. * * @return Public key, null on error or not known */ public PublicKey getPubkey() { if ( publickey == null && keyFact != null && publickeyString != null ) { String parts[] = publickeyString.split( " " ); if ( parts.length != 2 ) return null; try { BigInteger mod = new BigInteger( parts[0] ); BigInteger exp = new BigInteger( parts[1] ); RSAPublicKeySpec keySpec = new RSAPublicKeySpec( mod, exp ); synchronized ( keyFact ) { publickey = keyFact.generatePublic( keySpec ); } } catch ( InvalidKeySpecException e ) { LOG.info( "PubKey of " + this.organization + " is not valid.", e ); } catch ( NumberFormatException e ) { LOG.info( "PubKey of " + this.organization + " is corrupted in database!", e ); } } return publickey; } }