You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@santuario.apache.org by hyejung <ki...@yahoo.com> on 2004/01/23 05:00:21 UTC

Decryption Exception

I have seperate classes which encrypt and decrypt input stream which is XML 
contents.
I am testing decryption using XmlCipher.
Encryption worked OK. However, in the decryptionOnly, I am getting the 
encrypted xml contents as an input and trying to convert its contents back to 
the original XML input.  I am getting the error below

java.lang.ArrayIndexOutOfBoundsException: -1 < 0
	at java.util.Vector.elementAt(Vector.java:437)
	at org.apache.xerces.dom.DeepNodeListImpl.item(Unknown Source)
	at org.apache.xml.security.encryption.XMLCipher$Factory.newEncryptedData
(XMLCipher.java:2182)
	at org.apache.xml.security.encryption.XMLCipher.decryptToByteArray
(XMLCipher.java:1367)
	at org.apache.xml.security.encryption.XMLCipher.decryptElement
(XMLCipher.java:1299)
	at org.apache.xml.security.encryption.XMLCipher.doFinal
(XMLCipher.java:748)
	at XmlEncryptionTester.testDecryptOnly(XmlEncryptionTester.java:659)


---------------------------------------------------
My encrypted xml contents

<?xml version="1.0" encoding="UTF-8"?>
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
    <xenc:EncryptionMethod
        Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" 
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"/>
    <xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
        <xenc:CipherValue 
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">ECG7APZegNRhwInDUboc3Ret/T/wcGTaN
AillgDt8pyD8VLZSDntd+7u2jNkrjsT</xenc:CipherValue>
    </xenc:CipherData>
</xenc:EncryptedData>

----------------------------------------------------
Here is my codes. 
If I used the document which parse a file when Document is created, the 
Decryption works OK. When documentbyParsingInputStream is called to get the 
Document in testDecryptionOnly method, the prefix value of the ee element
ee = (Element) ed.getElementsByTagName("xenc:EncryptedData").item(0); is null.

private Document documentbyParsingInputStream(String inputFile) {
   Document d = null;
   try {
         File f = new File(inputFile);
	 FileInputStream input = new FileInputStream(f);			
	 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	 DocumentBuilder db = dbf.newDocumentBuilder();
	 dbf.setValidating(true);
	 dbf.setNamespaceAware(true);
	d= db.parse(input);
   } catch (Exception e) {
	 e.printStackTrace();
	 System.exit(-1);
   }

   return (d);
}




private Document documentbyParsingInputStream(String inputFile) {
  Document d = null;
  try {
      File f = new File(inputFile);
      FileInputStream input = new FileInputStream(f);				
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      dbf.setValidating(true);
      dbf.setNamespaceAware(true);
      d= db.parse(input);
  } catch (Exception e) {
      e.printStackTrace();
      System.exit(-1);
  }
      return (d);
}



public void testDecryptOnly() throws Exception{
    // if I call  document method instread   
    // the documentbyParsingInputStream   method , the deryption works fine.
    Document ed = document("encrypted_TrippleDes.xml"); // source
    
   // If documentbyParsingInputStream is called, then getting the 
   // exception above
   //Document ed = documentbyParsingInputStream("e_TrippleDes.xml");// source
    Document dd = null;      // target
    Element e = ed.getDocumentElement();
    Element ee = null;
    try {
	 // prepare for encryption
	 byte[] passPhrase = "24 Bytes per DESede key!".getBytes();
	 DESedeKeySpec keySpec = new DESedeKeySpec(passPhrase);
	 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
	 SecretKey key = keyFactory.generateSecret(keySpec);
	//decrypt
	cipher = XMLCipher.getInstance(XMLCipher.TRIPLEDES);
	cipher.init(XMLCipher.DECRYPT_MODE, key);
	ee = (Element) ed.getElementsByTagName("xenc:EncryptedData").item(0);
	
        System.out.println(" ee.getPrefix() :"+ee.getPrefix());
	// ee.getPrefix()  is xenc when document is called.
        // ee.getPrefix()  is null when documentbyParsingInputStream is called.

        dd = cipher.doFinal(ed, ee);
	target = toString(dd);
    } catch (Exception ex) {
	ex.printStackTrace();
    }
      Assert.assertEquals( toString(document().getDocumentElement()), target);

   }


I need to use an input as a stream when Document is created, I can't work out 
why prefix is null  if the inputStream is passed to the parse method when 
creating the Document object. contents of the ed is same regardless of a method 
I call.  What am I doing wrong ? Any ideas will be appreciated
Thanks

hyejung