/**
  * Modified slightly from source found at:
  *  http://forums.java.sun.com/thread.jsp?forum=2&thread=4210
  */
  
import java.io.*;
import java.security.*;
import java.util.*;

public class keymove 
{
    public static void main(String args[]) throws Throwable 
    {
        java.security.Security.addProvider
        ( 
            new com.sun.net.ssl.internal.ssl.Provider()
        );

        if (args.length < 6) 
        {
            System.out.println
            (
                "Usage: keymove <source> <destination> where\n" +
                " <source> and <destination> are " +
                "<storetype> <keystore> <password>\n"
            );
            System.exit(0);
        }

        String inStoretype = args[0];
        String inKeystore  = args[1];
        String inPassword  = args[2];

        String outStoretype= args[3];
        String outKeystore = args[4];
        String outPassword = args[5];

        FileInputStream in;

        in = new FileInputStream( inKeystore );
        KeyStore ksin = KeyStore.getInstance( inStoretype );
        char[] pwin = inPassword.toCharArray();
        if (pwin.length==0) { pwin = null; }

        ksin.load(in,pwin);
        in.close();

        in = new FileInputStream( outKeystore );
        KeyStore ksout = KeyStore.getInstance( outStoretype );
        char[] pwout = outPassword.toCharArray();
        if (pwout.length==0) { pwout = null; }

        ksout.load(in,pwout);
        in.close();

        Enumeration en = ksin.aliases();
        while (en.hasMoreElements()) 
        {
            String alias = (String) en.nextElement();
            if (ksout.containsAlias(alias)) 
            {
                System.out.println
                (
                    outKeystore + " already contains " + alias
                );
                continue;
            }

            if (ksin.isCertificateEntry(alias)) 
            {
                System.out.println("importing certificate " + alias);
                ksout.setCertificateEntry
                (
                    alias,ksin.getCertificate(alias)
                );
            }

            if (ksin.isKeyEntry(alias)) 
            {
                System.out.println("importing key " + alias);
                ksout.setKeyEntry
                (
                    alias,ksin.getKey(alias,pwin),
                    pwout,ksin.getCertificateChain(alias)
                );
            }

        } // end while

        FileOutputStream out = new FileOutputStream( outKeystore );
        ksout.store(out,pwout);
        out.close();

        System.exit(0);
    } // end main

} // end keymove

