1 | package com.nailabs.abac.credential; |
---|
2 | |
---|
3 | import java.security.*; |
---|
4 | import java.security.cert.*; |
---|
5 | import org.w3c.dom.*; |
---|
6 | import org.apache.xml.security.signature.*; |
---|
7 | import org.apache.xml.security.exceptions.*; |
---|
8 | import org.apache.xml.security.transforms.Transforms; |
---|
9 | import org.apache.xml.security.utils.*; |
---|
10 | |
---|
11 | /** |
---|
12 | * A utility for signing a credential domain document. |
---|
13 | */ |
---|
14 | public class SignCredential extends Application { |
---|
15 | /** signature algorithm is set to DSA */ |
---|
16 | protected static String SIG_TYPE = XMLSignature.ALGO_ID_SIGNATURE_DSA; |
---|
17 | /** digest algorithm is SHA-1 */ |
---|
18 | protected static String DIGEST_TYPE = Constants.ALGO_ID_DIGEST_SHA1; |
---|
19 | |
---|
20 | protected static String KEY_PAIR_TYPE = "DSA"; |
---|
21 | |
---|
22 | protected PrivateKey privateKey = null; |
---|
23 | |
---|
24 | protected PublicKey publicKey = null; |
---|
25 | |
---|
26 | protected X509Certificate cert = null; |
---|
27 | |
---|
28 | /** |
---|
29 | * Constructor for the application which reads in an XML document, |
---|
30 | * parses the doc into a DOM tree, signs the document, and writes |
---|
31 | * the signed tree into an XML file. Cryptographic material is supplied |
---|
32 | * by a Java keystore. |
---|
33 | */ |
---|
34 | public SignCredential(String argv[]) { |
---|
35 | super(argv); |
---|
36 | name = "SignCredential"; |
---|
37 | parseParameters(); |
---|
38 | getKeys(); |
---|
39 | readDoc(); |
---|
40 | signDoc(); |
---|
41 | writeDoc(); |
---|
42 | } |
---|
43 | |
---|
44 | private void generateKeyPair() { |
---|
45 | if(DEBUG) { |
---|
46 | out.println("Generating random keypair for use in signature"); |
---|
47 | out.println("(useful for demo purposes only)" ); |
---|
48 | } |
---|
49 | try { |
---|
50 | KeyPairGenerator kpg = KeyPairGenerator.getInstance(KEY_PAIR_TYPE); |
---|
51 | kpg.initialize(512); |
---|
52 | KeyPair newKeyPair = kpg.generateKeyPair(); |
---|
53 | privateKey = newKeyPair.getPrivate(); |
---|
54 | publicKey = newKeyPair.getPublic(); |
---|
55 | } catch( java.security.NoSuchAlgorithmException nsae ) { |
---|
56 | if(DEBUG)nsae.printStackTrace(); |
---|
57 | } |
---|
58 | } |
---|
59 | |
---|
60 | protected void getKeys() { |
---|
61 | super.getKeys(); // loads the keystore to a class instance field |
---|
62 | if( keys == null ) |
---|
63 | generateKeyPair(); // Generate a random, one-time-use key |
---|
64 | else { |
---|
65 | try { |
---|
66 | cert = (X509Certificate)keyStore.getCertificate(alias); |
---|
67 | publicKey = cert.getPublicKey(); |
---|
68 | privateKey = |
---|
69 | (PrivateKey)keyStore.getKey(alias, password.toCharArray()); |
---|
70 | } catch( Exception e ) { |
---|
71 | cert = null; |
---|
72 | publicKey = null; |
---|
73 | e.printStackTrace(); |
---|
74 | } |
---|
75 | } |
---|
76 | } |
---|
77 | |
---|
78 | protected void signDoc() { |
---|
79 | try { |
---|
80 | String baseURI = outXML.toURL().toString(); |
---|
81 | XMLSignature sig = new XMLSignature(doc, baseURI, SIG_TYPE ); |
---|
82 | docElement.appendChild( sig.getElement() ); |
---|
83 | Transforms transforms = new Transforms( doc ); |
---|
84 | transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE ); |
---|
85 | transforms.addTransform( Transforms.TRANSFORM_C14N_WITH_COMMENTS ); |
---|
86 | if( includeTransform ) { |
---|
87 | sig.addDocument("", transforms, DIGEST_TYPE); |
---|
88 | } |
---|
89 | if( includeCert && ( cert != null ) ) { |
---|
90 | sig.addKeyInfo( cert ); |
---|
91 | } else if( publicKey != null ) |
---|
92 | sig.addKeyInfo( publicKey ); |
---|
93 | sig.sign( privateKey ); |
---|
94 | } catch( XMLSecurityException xmlse ) { |
---|
95 | xmlse.printStackTrace(); |
---|
96 | } catch( java.net.MalformedURLException murle ) { |
---|
97 | murle.printStackTrace(); |
---|
98 | } |
---|
99 | } |
---|
100 | |
---|
101 | |
---|
102 | /** standard main routine for launching the application */ |
---|
103 | public static void main(String argv[]) { |
---|
104 | SignCredential sc = new SignCredential(argv); |
---|
105 | } |
---|
106 | |
---|
107 | } |
---|