1
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){ FileInputStream fis = new FileInputStream(keyfile);
35 ObjectInputStream ois = new ObjectInputStream(fis);
36 obj = ois.readObject();
37 } else { 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 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){ FileInputStream fis = new FileInputStream(keyfile);
28 ObjectInputStream ois = new ObjectInputStream(fis);
29 obj = ois.readObject();
30 } else { 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}