/* KeyLoader.java             nov 2000
 *
 * Erwan Lemonnier & Eric Nordenstam
 *
 * IO interface to load and save RSA keys.
 ***********************************************************************/

import java.math.BigInteger;
import java.io.*;

/**
 * KeyLoader is an IO interface used by RSA to load
 * and save the keys and modulus associated with one
 * user. Thus KeyLoader is user dependent, and its
 * constructor asks for a username.
 * <p>
 * In fact, a user's public key is stored in the local
 * directory in a file named "username.pub.key". As well
 * for "username.pri.key" (user's private key) and 
 * "username.mod" (its modulus). The methods below do
 * what their names tell.
 * <p>
 * @author E.Lemonnier & E.Nordenstam
 */

public class KeyLoader {
	
	private String username;
	
	/**
	 * Create a KeyLoader for a given user.
	 * <p>
	 * @param username a user name.
	 */
	public KeyLoader(String username) {
		this.username = username;
	}
	
	public BigInteger loadPublicKey() {
		return loadIntegerFrom(username+".pub.key");
	}
	
	public BigInteger loadPrivateKey() {
		return loadIntegerFrom(username+".pri.key");
	}
	
	public BigInteger loadModulus() {
		return loadIntegerFrom(username+".pub.mod");
	}
	
	
	public void savePublicKey(BigInteger k) {
		saveIntegerIn(k, username+".pub.key");
	}

	public void savePrivateKey(BigInteger k) {
		saveIntegerIn(k, username+".pri.key");
	}

	public void saveModulus(BigInteger m) {
		saveIntegerIn(m, username+".pub.mod");
	}
	
	
	private void saveIntegerIn(BigInteger k, String filename) {
		try {
			byte[] b = k.toByteArray();
			FileOutputStream out = new FileOutputStream(filename);
			out.write(b);
			out.flush();
			out.close();
		} catch(Exception e) {
			System.out.println("Error: "+e.getMessage());
			System.exit(0);
		}
	}
	
	private BigInteger loadIntegerFrom(String filename) {
		//hack to bypass compilator that does not check for return value in try {...}
		BigInteger r = new BigInteger("0");
		
		try {
			FileInputStream in = new FileInputStream(filename);
			int l = in.available();			
			byte[] b = new byte[l];
			in.read(b);
			r = new BigInteger(b);
			
		} catch(Exception e) {
			System.out.println("Error: "+e.getMessage());
			System.exit(0);
		}
		
		return r;
	}
} 
	