1
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