1 /*
2  * @(#) $Id: WSSUtility.java,v 1.2 2003/07/08 08:13:52 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.wss4axis;
11
12import java.io.FileInputStream;
13import java.io.FileOutputStream;
14import java.security.PrivateKey;
15import java.security.PublicKey;
16import java.security.SecureRandom;
17import javax.crypto.SecretKey;
18import javax.crypto.KeyGenerator;
19import java.security.cert.X509Certificate;
20
21import org.w3c.dom.Document;
22
23import com.verisign.xmlsig.SigningKey;
24import com.verisign.xmlsig.SigningKeyFactory;
25import com.verisign.xmlsig.KeyInfo;
26import com.verisign.messaging.WSSecurity;
27import com.verisign.xmlenc.AlgorithmType;
28import org.xmltrustcenter.verifier.TrustVerifier;
29import org.xmltrustcenter.verifier.X509TrustVerifier;
30import com.verisign.messaging.MessageValidity;
31
32public class WSSUtility {
33    public static void sign(Document doc, String keystore, String storetype,
34                        String storepass, String alias, String keypass) throws Exception {
35        FileInputStream fis = new FileInputStream(keystore);
36        java.security.KeyStore ks = java.security.KeyStore.getInstance(storetype);
37        ks.load(fis, storepass.toCharArray());
38        PrivateKey key = (PrivateKey)ks.getKey(alias, keypass.toCharArray());
39        X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
40
41        SigningKey sk = SigningKeyFactory.makeSigningKey(key);
42        KeyInfo ki = new KeyInfo();
43        ki.setCertificate(cert);
44
45        WSSecurity wss = new WSSecurity();
46        wss.sign(doc, sk, ki);
47    }
48
49    public static boolean verify(Document doc, String keystore, String storetype,
50                        String storepass) throws Exception {
51        FileInputStream fis = new FileInputStream(keystore);
52        java.security.KeyStore ks = java.security.KeyStore.getInstance(storetype);
53        ks.load(fis, storepass.toCharArray());
54
55        TrustVerifier verifier = new X509TrustVerifier(ks);
56
57        WSSecurity wss = new WSSecurity();
58        MessageValidity[] resa = wss.verify(doc, verifier, null);
59        if (resa.length > 0)
60            return resa[0].isValid();
61        return false;
62    }
63
64    public static void encrypt(Document doc, String keystore, String storetype,
65                        String storepass, String alias) throws Exception {
66        FileInputStream fis = new FileInputStream(keystore);
67        java.security.KeyStore ks = java.security.KeyStore.getInstance(storetype);
68        ks.load(fis, storepass.toCharArray());
69        X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
70        PublicKey pubk = cert.getPublicKey();
71
72        KeyGenerator kg = KeyGenerator.getInstance("DESede");
73        kg.init(112, new SecureRandom());
74        SecretKey key = kg.generateKey();
75
76        KeyInfo ki = new KeyInfo();
77        ki.setCertificate(cert);
78
79        WSSecurity wss = new WSSecurity();
80        wss.encrypt(doc, key, AlgorithmType.TRIPLEDES, pubk, AlgorithmType.RSA1_5, ki);
81    }
82
83    public static void decrypt(Document doc, String keystore, String storetype,
84                        String storepass, String alias, String keypass) throws Exception {
85        FileInputStream fis = new FileInputStream(keystore);
86        java.security.KeyStore ks = java.security.KeyStore.getInstance(storetype);
87        ks.load(fis, storepass.toCharArray());
88        PrivateKey prvk2 = (PrivateKey)ks.getKey(alias, keypass.toCharArray());
89
90        WSSecurity wss = new WSSecurity();
91        wss.decrypt(doc, prvk2, null);
92        WSSecurityExtn.removeWSSEncryptedKey(doc);
93    }
94
95    public static void cleanup(Document doc) throws Exception {
96        WSSecurityExtn.removeWSSInfo(doc);
97    }
98
99    public static void main(String[] unused) throws Exception {
00        String datafile = "soap.xml";
01
02        Document doc = XmlUtility.readXML(datafile);
03
04        System.out.println("Input Document:");
05        XmlUtility.writeXML(doc, System.out);
06
07        sign(doc, "client.ks", "JCEKS", "changeit", "mykey", "clientpass");
08        encrypt(doc, "client.ks", "JCEKS", "changeit", "serverkey");
09
10        System.out.println();
11        System.out.println("Signed and Encrypted Document:");
12        XmlUtility.writeXML(doc, System.out);
13
14        decrypt(doc, "server.ks", "JCEKS", "changeit", "mykey", "serverpass");
15        boolean verified = verify(doc, "server.ks", "JCEKS", "changeit");
16        cleanup(doc);
17
18        System.out.println();
19        if (!verified){
20            System.out.println("Verification failed.");
21            return;
22        }
23        System.out.println("Decrypted, Verified and Cleaned Document:");
24        XmlUtility.writeXML(doc, System.out);
25    }
26}
27