1 /*
2  * @(#) $Id: KeyUtil.java,v 1.4 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;
11import java.security.*;
12import javax.crypto.SecretKey;
13import java.io.*;
14import org.jstk.JSTKUtil;
15import org.jstk.JSTKArgs;
16
17public class KeyUtil {
18    public static String format(Key key, String label){
19        StringBuffer sb = new StringBuffer();
20        sb.append(label + "::\n");
21        sb.append("alg = " + key.getAlgorithm() +
22            ", fmt = " + key.getFormat() + ", encoded content = \n");
23        sb.append(JSTKUtil.hexStringFromBytes(key.getEncoded()) + "\n");
24        return sb.toString();
25    }
26    public static void printKey(Key key, String label){
27        System.out.println(format(key, label));
28    }
29
30    public static Key getKey(JSTKArgs args, Class keyClass) throws Exception{
31        String keyfile = args.get("keyfile");
32        Object obj = null;
33        if (keyfile != null){   // Key file specified
34            FileInputStream fis = new FileInputStream(keyfile);
35            ObjectInputStream ois = new ObjectInputStream(fis);
36            obj = ois.readObject();
37        } else {                // Look in the keystore
38            String providerName = args.get("provider");
39            String keystore = args.get("keystore");
40            String storepass = args.get("storepass");
41            String type = args.get("kstype");
42            String keypass = args.get("keypass");
43            if (keypass == null)
44                keypass = storepass;
45            String alias = args.get("alias");
46
47            FileInputStream fis = new FileInputStream(keystore);
48
49            KeyStore ks;
50            if (providerName != null)
51                ks = KeyStore.getInstance(type, providerName);
52            else
53                ks = KeyStore.getInstance(type);
54
55            ks.load(fis, storepass.toCharArray());
56            fis.close();
57            if (ks.isKeyEntry(alias)) {
58                Key key = ks.getKey(alias, keypass.toCharArray());
59                if (key instanceof SecretKey){
60                    obj = key;
61                } else if (key instanceof PrivateKey){
62                    PrivateKey prvKey = (PrivateKey)key;
63                    java.security.cert.Certificate cert = ks.getCertificate(alias);
64                    PublicKey pubKey = null;
65                    if (cert != null){
66                        pubKey = cert.getPublicKey();
67                        obj = new KeyPair(pubKey, prvKey);
68                    } else {
69                        obj = prvKey;
70                    }
71                }
72            } else if (ks.isCertificateEntry(alias)) {
73                java.security.cert.Certificate cert = ks.getCertificate(alias);
74                obj = cert.getPublicKey();
75            }
76        }
77        if (obj == null){
78            throw new Exception("Key not found");
79        } else if (obj instanceof Key){
80            if (keyClass.isInstance(obj))
81                return (Key)obj;
82            else
83                throw new Exception("unknown object in place of key");
84        } if (obj instanceof KeyPair){
85            PublicKey pubK = ((KeyPair)obj).getPublic();
86            PrivateKey prvK = ((KeyPair)obj).getPrivate();
87            if (keyClass.isInstance(pubK))
88                return pubK;
89            else if (keyClass.isInstance(prvK))
90                return prvK;
91            else
92                throw new Exception("key type mismatch");
93        } else {
94            throw new Exception("unexpected object in keyfile: " + obj.getClass().getName());
95        }
96    }
97
98    public static java.security.cert.Certificate getCertificate(JSTKArgs args) throws Exception{
99        // Look in the keystore
00        String providerName = args.get("provider");
01        String keystore = args.get("keystore");
02        String storepass = args.get("storepass");
03        String type = args.get("kstype");
04        String keypass = args.get("keypass");
05        if (keypass == null)
06            keypass = storepass;
07        String alias = args.get("alias");
08
09        FileInputStream fis = new FileInputStream(keystore);
10
11        KeyStore ks;
12        if (providerName != null)
13            ks = KeyStore.getInstance(type, providerName);
14        else
15            ks = KeyStore.getInstance(type);
16
17        ks.load(fis, storepass.toCharArray());
18        fis.close();
19        java.security.cert.Certificate cert = ks.getCertificate(alias);
20        return cert;
21    }
22
23    public static KeyPair getKeyPair(JSTKArgs args) throws Exception{
24        String keyfile = args.get("keyfile");
25        Object obj = null;
26        if (keyfile != null){   // Key file specified
27            FileInputStream fis = new FileInputStream(keyfile);
28            ObjectInputStream ois = new ObjectInputStream(fis);
29            obj = ois.readObject();
30        } else {                // Look in the keystore
31            String providerName = args.get("provider");
32            String keystore = args.get("keystore");
33            String storepass = args.get("storepass");
34            String type = args.get("kstype");
35            String keypass = args.get("keypass");
36            if (keypass == null)
37                keypass = storepass;
38            String alias = args.get("alias");
39
40            FileInputStream fis = new FileInputStream(keystore);
41
42            KeyStore ks;
43            if (providerName != null)
44                ks = KeyStore.getInstance(type, providerName);
45            else
46                ks = KeyStore.getInstance(type);
47
48            ks.load(fis, storepass.toCharArray());
49            fis.close();
50            if (ks.isKeyEntry(alias)) {
51                obj = ks.getKey(alias, keypass.toCharArray());
52                throw new Exception("found key entry. rest not implemented.");
53            } else {
54                throw new Exception("key entry expected. found certificate entry.");
55            }
56        }
57        if (!(obj instanceof KeyPair)){
58            throw new Exception("unexpected object in keyfile: " + obj.getClass().getName());
59        }
60        return (KeyPair)obj;
61    }
62}