blautenb 2003/11/09 18:48:23
Modified: c/src/xenc XENCCipher.hpp
c/src/xenc/impl XENCCipherImpl.cpp XENCCipherImpl.hpp
Log:
Implementation of encryptElementContent
Revision Changes Path
1.11 +27 -1 xml-security/c/src/xenc/XENCCipher.hpp
Index: XENCCipher.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/XENCCipher.hpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XENCCipher.hpp 4 Nov 2003 11:28:36 -0000 1.10
+++ XENCCipher.hpp 10 Nov 2003 02:48:23 -0000 1.11
@@ -239,6 +239,32 @@
) = 0;
/**
+ * \brief Encrypt the children of the nominated element
+ *
+ * Encrypts the all children of the passed in element, but
+ * leaves the element itself in place, with one new child - an
+ * EncryptedData node of type #content
+ *
+ * @param element Element whose children are to be encrypted
+ * @param em The encryptionMethod to use for this encryption. Use
+ * ENCRYPT_NONE if a user defined type is required.
+ * @param algorithmURI If ENCRYPT_NONE is passed in, this will be
+ * used to set the algorithm URI. If this is also NULL - no
+ * EncryptionMethod will be set. <b>NULL Value Unsupported if em not
+ * set! It's use could cause problems!</b>
+ *
+ * @returns The owning document with the element's children replaced,
or NULL
+ * if the decryption fails for some reason (normally an exception).
+ * @throws XSECException if the encryption fails.
+ */
+
+ virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *
encryptElementContent(
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * element,
+ encryptionMethod em,
+ const XMLCh * algorithmURI = NULL
+ ) = 0;
+
+ /**
* \brief Encrypt a buffer of data as a key
*
* Encrypts the passed in data and creates an EncryptedKey element
1.15 +82 -3 xml-security/c/src/xenc/impl/XENCCipherImpl.cpp
Index: XENCCipherImpl.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherImpl.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- XENCCipherImpl.cpp 4 Nov 2003 11:28:36 -0000 1.14
+++ XENCCipherImpl.cpp 10 Nov 2003 02:48:23 -0000 1.15
@@ -77,6 +77,7 @@
#include <xsec/transformers/TXFMSB.hpp>
#include <xsec/transformers/TXFMURL.hpp>
#include <xsec/transformers/TXFMDocObject.hpp>
+#include <xsec/transformers/TXFMConcatChains.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
#include <xsec/framework/XSECEnv.hpp>
#include <xsec/enc/XSECKeyInfoResolver.hpp>
@@ -343,9 +344,7 @@
// Create an input source
unsigned int bytes = XMLString::stringLen(sb.rawXMLChBuffer()) *
sizeof(XMLCh);
- char * utf = XMLString::transcode(sb.rawXMLChBuffer());
MemBufInputSource* memIS = new MemBufInputSource ((const XMLByte*)
sb.rawBuffer(), bytes, "XSECMem");
- //MemBufInputSource* memIS = new MemBufInputSource ((const XMLByte*)
utf, strlen(utf), "XSECMem");
Janitor<MemBufInputSource> j_memIS(memIS);
int errorCount = 0;
@@ -1031,9 +1030,89 @@
p->replaceChild(mp_encryptedData->getDOMNode(), element);
+ // Clear up the old child
+ element->release();
+
+ return mp_doc;
+
+}
+
+//
--------------------------------------------------------------------------------
+// Encrypt an element's children
+//
--------------------------------------------------------------------------------
+
+DOMDocument * XENCCipherImpl::encryptElementContent(
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * element,
+ encryptionMethod em,
+ const XMLCh * algorithmURI) {
+
+ // Make sure we have a key before we do anything too drastic
+ if (mp_key == NULL) {
+ throw XSECException(XSECException::CipherError,
+ "XENCCipherImpl::encryptElement - No key set");
+ }
+
+ // Create a transform chain to do the encryption
+ // We use a concat transformer so we can concatinate the bytestreams
+ // from the serialisation of each child in turn
+
+ TXFMConcatChains * tcat;
+ XSECnew(tcat, TXFMConcatChains(mp_doc));
+ TXFMChain * c;
+ XSECnew(c, TXFMChain(tcat));
+ Janitor<TXFMChain> j_c(c);
+
+ DOMNode *n = element->getFirstChild();
+
+ while (n != NULL) {
+
+ TXFMDocObject * tdocObj;
+ XSECnew(tdocObj, TXFMDocObject(mp_doc));
+ TXFMChain * tc;
+ XSECnew(tc, TXFMChain(tdocObj));
+
+ // Add to the concat object, which will own it, so if anything
throws
+ // the memory will be released.
+
+ tcat->setInput(tc);
+ tdocObj->setInput(mp_doc, n);
+
+ // Now need to serialise the element - easiest to just use a
canonicaliser
+ TXFMC14n *tc14n;
+ XSECnew(tc14n, TXFMC14n(mp_doc));
+ tc->appendTxfm(tc14n);
+
+ tc14n->activateComments();
+ tc14n->setExclusive();
+
+ n = n->getNextSibling();
+
+ }
+
+ encryptTXFMChain(c, em, algorithmURI);
+
+
mp_encryptedData->setTypeURI(DSIGConstants::s_unicodeStrURIXENC_CONTENT);
+
+ // Delete current children
+ n = element->getFirstChild();
+ while (n != NULL) {
+
+ element->removeChild(n);
+ n->release();
+
+ n = element->getFirstChild();
+
+ }
+
+ // Now add the EncryptedData
+ element->appendChild(mp_encryptedData->getDOMNode());
+
return mp_doc;
}
+
+
+
//
--------------------------------------------------------------------------------
// Pretty Print functions
1.13 +5 -1 xml-security/c/src/xenc/impl/XENCCipherImpl.hpp
Index: XENCCipherImpl.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherImpl.hpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- XENCCipherImpl.hpp 4 Nov 2003 11:28:36 -0000 1.12
+++ XENCCipherImpl.hpp 10 Nov 2003 02:48:23 -0000 1.13
@@ -116,6 +116,10 @@
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * element,
encryptionMethod em,
const XMLCh * uri = NULL);
+ virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *
encryptElementContent(
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * element,
+ encryptionMethod em,
+ const XMLCh * algorithmURI = NULL);
// Encrypt a key
virtual XENCEncryptedKey * encryptKey(