1 /*
2  * @(#) $Id: GenKPCommand.java,v 1.3 2003/07/08 08:13:53 pankaj Exp $
3  *
4  * Copyright (c) 2002-03 by Pankaj Kumar (http://www.pankaj-k.net). 
5  * All rights reserved.
6  *
7  * The license governing the use of this file can be found in the 
8  * root directory of the containing software.
9  */
10package org.jstk.crypt;
11
12import java.util.*;
13import java.io.*;
14import java.security.*;
15import javax.crypto.SecretKey;
16import javax.crypto.KeyGenerator;
17
18import org.jstk.*;
19
20public class GenKPCommand extends JSTKCommandAdapter{
21    private static HashMap defaults = new HashMap();
22    static {
23        defaults.put("algorithm", "DSA");
24        defaults.put("keysize", "512");
25        defaults.put("action", "discard");
26        defaults.put("file", "my.keypair");
27    }
28    public String briefDescription(){
29        return "generates a key-pair ( for asymmetric algorithms )";
30    }
31    public String optionsDescription(){
32        return
33            "  -algorithm <alg>    : Algorithm for secret key generator.[" +
34            defaults.get("algorithm") + "]\n" +
35            "  -keysize <keysize>  : Key size (in bits).[" +
36            defaults.get("keysize") + "]\n" +
37            "  -action <action>    : what to do with the key?(print|save|discard).[" +
38            defaults.get("action") + "]\n" +
39            "  -file <filename>    : where to save the serialized key-pair?[" +
40            defaults.get("file") + "]\n" +
41            "  -provider <provider>: provider name for KeyPairGenerator.\n";
42    }
43
44    public String[] useForms(){
45        String[] forms = {
46            "[-algorithm <alg> -keysize <keysize>] [-action\n" +
47            "\t(print|discard)] [-provider <provider>]",
48            "[-algorithm <alg> -keysize <keysize>] [-action save\n" +
49            "\t[-file <filename>]] [-provider <provider>]"
50        };
51        return forms;
52    }
53
54    public String[] sampleUses(){
55        String[] uses = {
56            "",
57            "-algorithm DESede action -print",
58            "-action save -file test1.key"
59        };
60        return uses;
61    }
62    public Object execute(JSTKArgs args) throws JSTKException{
63        try {
64            args.setDefaults(defaults);
65            String providerName = args.get("provider");
66            String algorithm = args.get("algorithm");
67            String keysizeString = args.get("keysize");
68            int keysize = Integer.parseInt(keysizeString);
69            String action = args.get("action");
70
71            KeyPairGenerator kpg;
72            if (providerName != null)
73                kpg = KeyPairGenerator.getInstance(algorithm, providerName);
74            else
75                kpg = KeyPairGenerator.getInstance(algorithm);
76
77            kpg.initialize(keysize);
78            KeyPair kp = kpg.generateKeyPair();
79
80            if (action.equals("discard")){
81                return new JSTKResult(kp, true, "Public and Private key pair generated");
82            } else if (action.equals("save")){  // Save the serialized object in a file
83                String fileName = args.get("file");
84                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
85                oos.writeObject(kp);
86                oos.close();
87                return new JSTKResult(kp, true, "KeyPair written to file: " + fileName);
88            } else if (action.equals("print")){
89                return new JSTKResult(kp, true, KeyUtil.format(kp.getPublic(), "PublicKey") +
90                    KeyUtil.format(kp.getPrivate(), "PrivateKey"));
91            }
92            return new JSTKResult(null, false, "unknown action: " + action);
93        } catch (Exception exc){
94            throw new JSTKException("GenKCommand.execute() failed", exc);
95        }
96    }
97
98    public static void main(String[] args) throws Exception {
99        JSTKOptions opts = new JSTKOptions();
00        opts.parse(args, 0);
01        GenKPCommand genKPCmd = new GenKPCommand();
02        JSTKResult result = (JSTKResult)genKPCmd.execute(opts);
03        System.out.println(result.getText());
04        System.exit(result.isSuccess()? 0 : 1);
05    }
06}