import java.io.FileInputStream;
import org.w3c.dom.Document;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;

public class WSSEncryptionSample {
   public static void main ( String argv[] )
   {
      try {
         FileInputStream br = new FileInputStream( "input.xml" );
         String message = "";
         int ch = 0;
         while ( ( ch = br.read() ) != -1 )
            message += (char)ch;
         WSSMessage wssMessage = new WSSMessage ( message );

         if ( wssMessage.getWSSDocument() != null )
         {
            System.out.println ( "The plain text WSS message is :\n" );
            printDocument ( wssMessage.getWSSDocument() );
         }//if

         System.out.println ( "***************************************************" );
         System.out.println ( );
         System.out.println ( );
         System.out.println ( );

         EncryptedKeyToken encToken = new EncryptedKeyToken (
                                                            "tourOperatorRSAKey",
                                                            "myKeyStorePass",
                                                            "myTourOperatorKey",
                                                            "EncryptedKeyByEncryptedKeyToken",
                                                            wssMessage
                                                            );

         encToken.setSecret( new String ( "myKeyPass" ).getBytes() );

         EncryptedData ed1 = wssMessage.encryptElement (
                                                 "Param1",
                                                 encToken,
                                                 "encryptedParam1",
                                                 "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
                                                  );

         if ( wssMessage.getWSSDocument() != null )
         {
            System.out.println ( "The XML Encrypted Message with EncryptedKeyToken is :\n" );
            printDocument ( wssMessage.getWSSDocument() );
         }//if

         System.out.println ( "***************************************************" );
         System.out.println ( );
         System.out.println ( );
         System.out.println ( );


         EncryptedKeyTokenWithCrossReference encTokenWithRef
                     = new EncryptedKeyTokenWithCrossReference(
                                         "tourOperatorRSAKey",
                                         "myKeyStorePass",
                                         "myTourOperatorKey",
                                         "EncryptedKeyByEncryptedKeyTokenWithCrossReference1",
                                         wssMessage
                                         );

         encTokenWithRef.setSecret( new String ( "myKeyPass" ).getBytes() );

         EncryptedData ed4 = wssMessage.encryptElementWithXPath (
                                                 "//*[@Id=\"Param4\"]",
                                                 encTokenWithRef,
                                                 "encryptedParam4",
                                                 "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
                                                  );

         if ( ed4.getDocument() != null )
         {
            System.out.println ( "The XML Encrypted Message with EncryptedKeyTokenWithCrossReference is :\n" );
            printDocument ( wssMessage.getWSSDocument() );
         }//if

         System.out.println ( "***************************************************" );
         System.out.println ( );
         System.out.println ( );
         System.out.println ( );


         EncryptedKeyTokenWithCrossReference encTokenWithRef2
                     = new EncryptedKeyTokenWithCrossReference(
                                         "tourOperatorRSAKey",
                                         "myKeyStorePass",
                                         "myTourOperatorKey",
                                         "EncryptedKeyByEncryptedKeyTokenWithCrossReference2",
                                         wssMessage
                                         );

         encTokenWithRef2.setSecret( new String ( "myKeyPass" ).getBytes() );

         EncryptedData ed3 = wssMessage.encryptElementWithXPath (
                                                 "//*[@Id=\"Param3\"]",
                                                 encTokenWithRef2,
                                                 "encryptedParam3",
                                                 "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
                                                  );

         if ( ed3.getDocument() != null )
         {
            System.out.println ( "The XML Encrypted Message with EncryptedKeyTokenWithCrossReference is :\n" );
            printDocument ( wssMessage.getWSSDocument() );
         }//if

      }//try
      catch ( Exception e ) {
      System.out.println ( "Exception in the main method of WSSEncryptionSample......." );
      e.printStackTrace();
      }//catch
   }// main()


   private static void printDocument ( Document XMLDoc ) {
      try {
         System.out.println();
         OutputFormat f = new OutputFormat ( XMLDoc );
         f.setPreserveSpace ( true );
         XMLSerializer s = new XMLSerializer ( System.out, f );
         s.serialize ( XMLDoc );
         System.out.println();
      }//try
         catch ( Exception e ) {
         System.out.println ( "Exception in printDocument's method of Encrypt Class......." );
         e.printStackTrace();
      }//catch
   }//printDocument

}//WSSEncryptionSample