amattheu    2003/12/19 03:53:55

  Modified:    src/org/apache/xml/security/encryption XMLCipher.java
  Log:
  Fixed Base 64 encoding problem.
  Fixed element content encryption.
  Credit to Werner Dittmann of Siemens.
  
  Revision  Changes    Path
  1.17      +81 -102   
xml-security/src/org/apache/xml/security/encryption/XMLCipher.java
  
  Index: XMLCipher.java
  ===================================================================
  RCS file: 
/home/cvs/xml-security/src/org/apache/xml/security/encryption/XMLCipher.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- XMLCipher.java    17 Nov 2003 09:27:04 -0000      1.16
  +++ XMLCipher.java    19 Dec 2003 11:53:55 -0000      1.17
  @@ -112,7 +112,7 @@
   import org.w3c.dom.NodeList;
   import org.xml.sax.InputSource;
   import org.xml.sax.SAXException;
  -import sun.misc.BASE64Encoder;
  +// import sun.misc.BASE64Encoder;
   import org.apache.xml.security.utils.Base64;
   
   
  @@ -634,12 +634,10 @@
           if(_cipherMode != ENCRYPT_MODE)
               logger.error("XMLCipher unexpectedly not in ENCRYPT_MODE...");
   
  -             if (_algorithm == null) {
  -
  -                     throw new XMLEncryptionException("XMLCipher instance 
without transformation specified");
  -             }
  -
  -             encryptData(_contextDocument, element);
  +     if (_algorithm == null) {
  +         throw new XMLEncryptionException("XMLCipher instance without 
transformation specified");
  +     }
  +     encryptData(_contextDocument, element, false);
   
           Element encryptedElement = _factory.toElement(_ed);
   
  @@ -670,60 +668,10 @@
           if(_cipherMode != ENCRYPT_MODE)
               logger.error("XMLCipher unexpectedly not in ENCRYPT_MODE...");
   
  -             if (_algorithm == null) {
  -
  -                     throw new XMLEncryptionException("XMLCipher instance 
without transformation specified");
  -             }
  -
  -        NodeList children = element.getChildNodes();
  -        String serializedOctets = null;
  -        if ((null != children)) {
  -            serializedOctets = _serializer.serialize(children);
  -        } else {
  -            Object exArgs[] = {"Element has no content."};
  -            throw new XMLEncryptionException("empty", exArgs);
  -        }
  -        logger.debug("Serialized octets:\n" + serializedOctets);
  -
  -        byte[] encryptedBytes = null;
  -        try {
  -            encryptedBytes =
  -                _contextCipher.doFinal(serializedOctets.getBytes("UTF-8"));
  -
  -            logger.debug("Expected cipher.outputSize = " +
  -                Integer.toString(_contextCipher.getOutputSize(
  -                    serializedOctets.getBytes().length)));
  -            logger.debug("Actual cipher.outputSize = " +
  -                Integer.toString(encryptedBytes.length));
  -        } catch (IllegalStateException ise) {
  -            throw new XMLEncryptionException("empty", ise);
  -        } catch (IllegalBlockSizeException ibse) {
  -            throw new XMLEncryptionException("empty", ibse);
  -        } catch (BadPaddingException bpe) {
  -            throw new XMLEncryptionException("empty", bpe);
  -        } catch (UnsupportedEncodingException uee) {
  -                     throw new XMLEncryptionException("empty", uee);
  -        }
  -
  -        String base64EncodedEncryptedOctets = new BASE64Encoder().encode(
  -            encryptedBytes);
  -
  -        logger.debug("Encrypted octets:\n" + base64EncodedEncryptedOctets);
  -        logger.debug("Encrypted octets length = " +
  -            base64EncodedEncryptedOctets.length());
  -
  -        try {
  -                     CipherData cd = _ed.getCipherData();
  -                     CipherValue cv = cd.getCipherValue();
  -                     cv.setValue(base64EncodedEncryptedOctets.getBytes());
  -
  -            _ed.setType(new 
URI(EncryptionConstants.TYPE_CONTENT).toString());
  -            EncryptionMethod method = _factory.newEncryptionMethod(
  -                new URI(_algorithm).toString());
  -            _ed.setEncryptionMethod(method);
  -        } catch (URI.MalformedURIException mfue) {
  -            throw new XMLEncryptionException("empty", mfue);
  -        }
  +     if (_algorithm == null) {
  +         throw new XMLEncryptionException("XMLCipher instance without 
transformation specified");
  +     }
  +     encryptData(_contextDocument, element, true);   
   
           Element encryptedElement = _factory.toElement(_ed);
   
  @@ -860,7 +808,7 @@
                   "empty", new IllegalStateException());
           }
   
  -        return (null);
  +        return (result);
       }
   
       /**
  @@ -918,7 +866,13 @@
        * @param element the <code>Element</code> that will be encrypted.
        * @throws XMLEncryptionException.
        */
  -    public EncryptedData encryptData(Document context, Element element) 
throws
  +
  +    public EncryptedData encryptData(Document context, Element element) 
throws 
  +            XMLEncryptionException {
  +     return encryptData(context, element, false);
  +    }
  +
  +    private EncryptedData encryptData(Document context, Element element, 
boolean contentMode) throws
               XMLEncryptionException {
           logger.debug("Encrypting element...");
           if(null == context)
  @@ -930,13 +884,26 @@
   
           _contextDocument = context;
   
  -             if (_algorithm == null) {
  -
  -                     throw new XMLEncryptionException("XMLCipher instance 
without transformation specified");
  -             }
  +     if (_algorithm == null) {
  +         throw new XMLEncryptionException("XMLCipher instance without 
transformation specified");
  +     }
  +     
   
  -        String serializedOctets = _serializer.serialize(element);
  -        logger.debug("Serialized octets:\n" + serializedOctets);
  +        String serializedOctets = null;
  +     if (contentMode) {
  +         NodeList children = element.getChildNodes();
  +         if ((null != children)) {
  +             serializedOctets = _serializer.serialize(children);
  +         }
  +         else {
  +             Object exArgs[] = {"Element has no content."};
  +             throw new XMLEncryptionException("empty", exArgs);
  +         }
  +        }
  +     else {
  +         serializedOctets = _serializer.serialize(element);
  +     }
  +     logger.debug("Serialized octets:\n" + serializedOctets);
   
           byte[] encryptedBytes = null;
                // Now create the working cipher
  @@ -1005,26 +972,30 @@
                                                 iv.length,
                                                 encryptedBytes.length);
   
  -        String base64EncodedEncryptedOctets = new BASE64Encoder().encode(
  -            finalEncryptedBytes);
  +        String base64EncodedEncryptedOctets = 
Base64.encode(finalEncryptedBytes);
   
           logger.debug("Encrypted octets:\n" + base64EncodedEncryptedOctets);
           logger.debug("Encrypted octets length = " +
               base64EncodedEncryptedOctets.length());
   
           try {
  -                     CipherData cd = _ed.getCipherData();
  -                     CipherValue cv = cd.getCipherValue();
  -                     cv.setValue(base64EncodedEncryptedOctets.getBytes());
  -
  -            _ed.setType(new 
URI(EncryptionConstants.TYPE_ELEMENT).toString());
  +         CipherData cd = _ed.getCipherData();
  +         CipherValue cv = cd.getCipherValue();
  +         // cv.setValue(base64EncodedEncryptedOctets.getBytes());
  +             cv.setValue(base64EncodedEncryptedOctets);
  +
  +         if (contentMode) {
  +             _ed.setType(new 
URI(EncryptionConstants.TYPE_CONTENT).toString());
  +         }
  +         else {
  +             _ed.setType(new 
URI(EncryptionConstants.TYPE_ELEMENT).toString());
  +         }
               EncryptionMethod method = _factory.newEncryptionMethod(
  -                new URI(_algorithm).toString());
  +              new URI(_algorithm).toString());
               _ed.setEncryptionMethod(method);
           } catch (URI.MalformedURIException mfue) {
               throw new XMLEncryptionException("empty", mfue);
           }
  -
           return (_ed);
       }
   
  @@ -1159,15 +1130,14 @@
                        throw new XMLEncryptionException("empty", ibse);
                }
   
  -        String base64EncodedEncryptedOctets = new BASE64Encoder().encode(
  -            encryptedBytes);
  +        String base64EncodedEncryptedOctets = Base64.encode(encryptedBytes);
   
           logger.debug("Encrypted key octets:\n" + 
base64EncodedEncryptedOctets);
           logger.debug("Encrypted key octets length = " +
               base64EncodedEncryptedOctets.length());
   
                CipherValue cv = _ek.getCipherData().getCipherValue();
  -             cv.setValue(base64EncodedEncryptedOctets.getBytes());
  +             cv.setValue(base64EncodedEncryptedOctets);
   
           try {
               EncryptionMethod method = _factory.newEncryptionMethod(
  @@ -1342,14 +1312,13 @@
   
                if (sourceParent instanceof Document) {
                        
  -                     // If this is a content decryption, this may have 
problems
  +                 // If this is a content decryption, this may have problems
   
  -                     
_contextDocument.removeChild(_contextDocument.getDocumentElement());
  -                     _contextDocument.appendChild(decryptedFragment);
  +                 
_contextDocument.removeChild(_contextDocument.getDocumentElement());
  +                 _contextDocument.appendChild(decryptedFragment);
                }
                else {
  -
  -                     sourceParent.replaceChild(decryptedFragment, element);
  +                 sourceParent.replaceChild(decryptedFragment, element);
   
                }
   
  @@ -1801,8 +1770,14 @@
               try {
                   for (int i =0; i < content.getLength(); i++) {
                       Node n = content.item(i);
  -                    if ((null != n) && (n.getNodeType() == 
Node.ELEMENT_NODE)) {
  -                        _serializer.serialize((Element) n);
  +                    if (null != n) {
  +                     int nodeType = n.getNodeType();
  +                     if (nodeType == Node.ELEMENT_NODE) {
  +                         _serializer.serialize((Element) n);
  +                     }
  +                     else if (nodeType == Node.TEXT_NODE) {
  +                         output.write(n.getNodeValue());
  +                     }
                       }
                   }
               } catch (IOException ioe) {
  @@ -1887,7 +1862,7 @@
                                        result.appendChild(child);
                                        child = fragElt.getFirstChild();
                                }
  -                             String outp = serialize(d);
  +                             // String outp = serialize(d);
   
               } catch (SAXException se) {
                   throw new XMLEncryptionException("empty", se);
  @@ -1939,11 +1914,11 @@
   
           /**
            *
  -         */
  +         
           CipherValue newCipherValue(byte[] value) {
               return (new CipherValueImpl(value));
           }
  -
  +             */
           /**
            *
            */
  @@ -2870,26 +2845,30 @@
           }
   
           private class CipherValueImpl implements CipherValue {
  -            private byte[] cipherValue = null;
  -
  -            public CipherValueImpl(byte[] value) {
  -                cipherValue = value;
  -            }
  +                     private String cipherValue = null;
  +                     
  +            // public CipherValueImpl(byte[] value) {
  +               // cipherValue = value;
  +            // }
   
               public CipherValueImpl(String value) {
  -                cipherValue = value.getBytes();
  +                             // cipherValue = value.getBytes();
  +                             cipherValue = value;
               }
   
  -            public byte[] getValue() {
  +                     // public byte[] getValue() {
  +                     public String getValue() {
                   return (cipherValue);
               }
   
  -            public void setValue(byte[] value) {
  -                cipherValue = value;
  -            }
  +                     // public void setValue(byte[] value) {
  +                     // public void setValue(String value) {
  +               // cipherValue = value;
  +            // }
   
               public void setValue(String value) {
  -                cipherValue = value.getBytes();
  +                // cipherValue = value.getBytes();
  +                             cipherValue = value;
               }
   
               Element toElement() {
  
  
  

Reply via email to