/**
 * GetKeyData - KeyStore Utility
 * This little tool can be used to liberate Key pairs from their Java Key stores.
 * 
 * Usage: java GetKeyData <Keystore> <Key alias> <password> [<keypass>]
 * 
 * Copyright 2008 Mark Boddington  http://www.badpenguin.co.uk
 * 
 */

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;

import sun.misc.BASE64Encoder;

public class GetKeyData {
	
	KeyStore ks = null;
	String password = null;
	String alias = null;
	String keyPass = null;
	
	public static void main(String[] args) {
		GetKeyData kd = new GetKeyData();
		kd.run(args);
	}
	
	public void run(String[] args){
		
		FileInputStream fio = null;
		
		if ( args.length < 3) {
			System.err.println("\r\nGetKeyData - Java KeyStore - Private key liberator");
			System.err.println("Copyright 2008 Mark Boddington - http://www.badpenguin.co.uk\r\n");
			System.err.println("Usage: GetKeyData <Keystore> <Key alias> <password> [<keypass>]\r\n");
			System.exit(1);
		}
		
		try {
			fio = new FileInputStream(args[0]);
		} catch (FileNotFoundException f) {
			System.err.println("Error: File not Found: " + args[0] );
			System.exit(1);
		}
		
		alias = args[1];
		password = args[2];
		
		if ( args.length == 4) {
			keyPass = args[3];
		}
		
		try {
			ks = KeyStore.getInstance("JKS");
			ks.load(fio, password.toCharArray());
		} catch (KeyStoreException e ) {
			e.printStackTrace();
		} catch( IOException e ) {
			System.err.println("Failed to open keystore.");
			e.printStackTrace();
		} catch (Exception e ) {
			e.printStackTrace();
		}
		
		System.out.println("Public Key");
		printCert();
		
		System.out.println("\nPrivate Key");
		printKey();
	}
	
	public void printKey() {
		PrivateKey key = null;
		try {
			if ( keyPass != null ) {
				key = (PrivateKey) ks.getKey(alias, keyPass.toCharArray());
			} else {
				key = (PrivateKey) ks.getKey(alias, password.toCharArray());
			}
		} catch (UnrecoverableKeyException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		BASE64Encoder bs = new BASE64Encoder();
		String bs64 = bs.encode(key.getEncoded());
		System.out.println("-----BEGIN PRIVATE KEY-----");
		System.out.println(bs64);
		System.out.println("-----END PRIVATE KEY-----");
	}
	
	public void printCert() {
		Certificate cert = null;
		String bs64 = null;
		
		try {
			cert = ks.getCertificate(alias);
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} 
		BASE64Encoder bs = new BASE64Encoder();
		
		try {
			bs64 = bs.encode(cert.getEncoded());
		} catch ( CertificateEncodingException c) {
			System.err.println("Certificate encoding error.");
			c.printStackTrace();
		}
		System.out.println("-----BEGIN CERTIFICATE-----");
		System.out.println(bs64);
		System.out.println("-----END CERTIFICATE-----");
	}
	
	

}
