You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by bl...@apache.org on 2003/09/15 13:53:10 UTC
cvs commit: xml-security/c/src/xenc/impl XENCEncryptedTypeImpl.hpp XENCEncryptedTypeImpl.cpp XENCEncryptedDataImpl.hpp XENCEncryptedDataImpl.cpp XENCCipherValueImpl.hpp XENCCipherValueImpl.cpp XENCCipherImpl.hpp XENCCipherImpl.cpp XENCCipherDataImpl.hpp XENCCipherDataImpl.cpp
blautenb 2003/09/15 04:53:10
Modified: c/src/xenc/impl XENCEncryptedTypeImpl.hpp
XENCEncryptedTypeImpl.cpp XENCEncryptedDataImpl.hpp
XENCEncryptedDataImpl.cpp XENCCipherValueImpl.hpp
XENCCipherValueImpl.cpp XENCCipherImpl.hpp
XENCCipherImpl.cpp XENCCipherDataImpl.hpp
XENCCipherDataImpl.cpp
Log:
Integration of AlgorithmMapper and DSIG KeyInfo loading
Revision Changes Path
1.5 +19 -7 xml-security/c/src/xenc/impl/XENCEncryptedTypeImpl.hpp
Index: XENCEncryptedTypeImpl.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptedTypeImpl.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- XENCEncryptedTypeImpl.hpp 11 Sep 2003 11:43:07 -0000 1.4
+++ XENCEncryptedTypeImpl.hpp 15 Sep 2003 11:53:09 -0000 1.5
@@ -74,22 +74,24 @@
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/xenc/XENCEncryptedType.hpp>
+#include <xsec/dsig/DSIGKeyInfoList.hpp>
// Forward declarations
XSEC_DECLARE_XERCES_CLASS(DOMNode);
-class XENCCipherImpl;
class XENCCipherDataImpl;
+class XENCEncryptionMethodImpl;
class TXFMChain;
+class XSECEnv;
class XENCEncryptedTypeImpl : public XENCEncryptedType {
public:
- XENCEncryptedTypeImpl(XENCCipherImpl * cipher);
+ XENCEncryptedTypeImpl(const XSECEnv * env);
XENCEncryptedTypeImpl(
- XENCCipherImpl * cipher,
+ const XSECEnv * env,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * node
);
@@ -103,11 +105,15 @@
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * createBlankEncryptedType(
XMLCh * localName,
XENCCipherData::XENCCipherDataType type,
+ const XMLCh * algorithm,
const XMLCh * value);
// Interface Methods
virtual XENCCipherData * getCipherData(void);
virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * getDOMNode();
+ virtual DSIGKeyInfoList * getKeyInfoList(void) {return &m_keyInfoList;}
+ virtual XENCEncryptionMethod * getEncryptionMethod(void);
+
protected:
@@ -116,10 +122,16 @@
TXFMChain * createCipherTXFMChain(void);
- XENCCipherImpl * mp_cipher;
+ const XSECEnv * mp_env;
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode
- * mp_encryptedTypeNode; // Node at head of structure
- XENCCipherDataImpl * mp_cipherData;
+ * mp_encryptedTypeNode; // Node at head of structure
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMNode
+ * mp_keyInfoNode; // Any underlying KeyInfo
+ XENCCipherDataImpl * mp_cipherData;
+ XENCEncryptionMethodImpl * mp_encryptionMethod;
+
+ // Hold the XML Digital Signature KeyInfo list
+ DSIGKeyInfoList m_keyInfoList;
friend class XENCCipherImpl;
};
1.4 +47 -15 xml-security/c/src/xenc/impl/XENCEncryptedTypeImpl.cpp
Index: XENCEncryptedTypeImpl.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptedTypeImpl.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCEncryptedTypeImpl.cpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCEncryptedTypeImpl.cpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -72,12 +72,14 @@
#include "XENCCipherImpl.hpp"
#include "XENCCipherDataImpl.hpp"
#include "XENCEncryptedTypeImpl.hpp"
+#include "XENCEncryptionMethodImpl.hpp"
#include <xsec/framework/XSECError.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
#include <xsec/transformers/TXFMBase64.hpp>
#include <xsec/transformers/TXFMChain.hpp>
#include <xsec/transformers/TXFMSB.hpp>
+#include <xsec/framework/XSECEnv.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/Janitor.hpp>
@@ -140,18 +142,22 @@
// Constructors and Destructors
// --------------------------------------------------------------------------------
-XENCEncryptedTypeImpl::XENCEncryptedTypeImpl(XENCCipherImpl * cipher) :
-mp_cipher(cipher),
+XENCEncryptedTypeImpl::XENCEncryptedTypeImpl(const XSECEnv * env) :
+mp_env(env),
mp_encryptedTypeNode(NULL),
-mp_cipherData(NULL) {
+mp_cipherData(NULL),
+mp_encryptionMethod(NULL),
+m_keyInfoList(env) {
}
-XENCEncryptedTypeImpl::XENCEncryptedTypeImpl(XENCCipherImpl * cipher, DOMNode * node) :
-mp_cipher(cipher),
+XENCEncryptedTypeImpl::XENCEncryptedTypeImpl(const XSECEnv * env, DOMNode * node) :
+mp_env(env),
mp_encryptedTypeNode(node),
-mp_cipherData(NULL) {
+mp_cipherData(NULL),
+mp_encryptionMethod(NULL),
+m_keyInfoList(env) {
}
@@ -160,6 +166,9 @@
if (mp_cipherData != NULL)
delete mp_cipherData;
+ if (mp_encryptionMethod != NULL)
+ delete mp_encryptionMethod;
+
}
// --------------------------------------------------------------------------------
@@ -183,7 +192,8 @@
if (tmpElt != NULL && strEquals(getXENCLocalName(tmpElt), s_EncryptionMethod)) {
- // For now, ignore
+ XSECnew(mp_encryptionMethod, XENCEncryptionMethodImpl(mp_env, tmpElt));
+ mp_encryptionMethod->load();
tmpElt = findNextChildOfType(tmpElt, DOMNode::ELEMENT_NODE);
@@ -191,7 +201,11 @@
if (tmpElt != NULL && strEquals(getDSIGLocalName(tmpElt), s_KeyInfo)) {
- // For now, ignore
+ // Load
+ mp_keyInfoNode = tmpElt;
+ m_keyInfoList.loadListFromXML(tmpElt);
+
+ // Find the next node
tmpElt = findNextChildOfType(tmpElt, DOMNode::ELEMENT_NODE);
@@ -199,7 +213,7 @@
if (tmpElt != NULL && strEquals(getXENCLocalName(tmpElt), s_CipherData)) {
- XSECnew(mp_cipherData, XENCCipherDataImpl(mp_cipher, tmpElt));
+ XSECnew(mp_cipherData, XENCCipherDataImpl(mp_env, tmpElt));
mp_cipherData->load();
tmpElt = findNextChildOfType(tmpElt, DOMNode::ELEMENT_NODE);
@@ -223,15 +237,17 @@
DOMElement * XENCEncryptedTypeImpl::createBlankEncryptedType(
XMLCh * localName,
XENCCipherData::XENCCipherDataType type,
+ const XMLCh * algorithm,
const XMLCh * value) {
// Reset
mp_cipherData = NULL;
+ mp_encryptionMethod = NULL;
// Get some setup values
safeBuffer str;
- DOMDocument *doc = mp_cipher->getDocument();
- const XMLCh * prefix = mp_cipher->getXENCNSPrefix();
+ DOMDocument *doc = mp_env->getParentDocument();
+ const XMLCh * prefix = mp_env->getXENCNSPrefix();
makeQName(str, prefix, localName);
@@ -251,9 +267,19 @@
str.rawXMLChBuffer(),
DSIGConstants::s_unicodeStrURIXENC);
+ // Create the EncryptionMethod
+ if (algorithm != NULL) {
+
+ XSECnew(mp_encryptionMethod, XENCEncryptionMethodImpl(mp_env));
+ DOMNode * encryptionMethodNode =
+ mp_encryptionMethod->createBlankEncryptedType(algorithm);
+
+ ret->appendChild(encryptionMethodNode);
+
+ }
// Create the cipher Data
- XSECnew(mp_cipherData, XENCCipherDataImpl(mp_cipher));
+ XSECnew(mp_cipherData, XENCCipherDataImpl(mp_env));
DOMNode * cipherDataNode = mp_cipherData->createBlankCipherData(type, value);
// Add to EncryptedType
@@ -280,7 +306,7 @@
ArrayJanitor<char> j_b64(b64);
TXFMSB *sb;
- XSECnew(sb, TXFMSB(mp_cipher->getDocument()));
+ XSECnew(sb, TXFMSB(mp_env->getParentDocument()));
sb->setInput(safeBuffer(b64));
@@ -289,7 +315,7 @@
// Create a base64 decoder
TXFMBase64 * tb64;
- XSECnew(tb64, TXFMBase64(mp_cipher->getDocument()));
+ XSECnew(tb64, TXFMBase64(mp_env->getParentDocument()));
chain->appendTxfm(tb64);
@@ -323,4 +349,10 @@
return static_cast<DOMElement*>(mp_encryptedTypeNode);
return NULL;
+}
+
+XENCEncryptionMethod * XENCEncryptedTypeImpl::getEncryptionMethod(void) {
+
+ return mp_encryptionMethod;
+
}
1.4 +10 -5 xml-security/c/src/xenc/impl/XENCEncryptedDataImpl.hpp
Index: XENCEncryptedDataImpl.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptedDataImpl.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCEncryptedDataImpl.hpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCEncryptedDataImpl.hpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -83,9 +83,9 @@
public:
- XENCEncryptedDataImpl(XENCCipherImpl * cipher);
+ XENCEncryptedDataImpl(const XSECEnv * env);
XENCEncryptedDataImpl(
- XENCCipherImpl * cipher,
+ const XSECEnv * env,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * node
);
virtual ~XENCEncryptedDataImpl();
@@ -95,7 +95,9 @@
// Create a blank EncryptedData DOM structure
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *
- createBlankEncryptedData(XENCCipherData::XENCCipherDataType type, const XMLCh * value);
+ createBlankEncryptedData(XENCCipherData::XENCCipherDataType type,
+ const XMLCh * algorithm,
+ const XMLCh * value);
// Interface methods
@@ -104,7 +106,10 @@
{return XENCEncryptedTypeImpl::getCipherData();}
virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * getDOMNode()
{return XENCEncryptedTypeImpl::getDOMNode();}
-
+ virtual DSIGKeyInfoList * getKeyInfoList(void)
+ {return XENCEncryptedTypeImpl::getKeyInfoList();}
+ virtual XENCEncryptionMethod * getEncryptionMethod(void)
+ {return XENCEncryptedTypeImpl::getEncryptionMethod();}
private:
1.4 +7 -6 xml-security/c/src/xenc/impl/XENCEncryptedDataImpl.cpp
Index: XENCEncryptedDataImpl.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptedDataImpl.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCEncryptedDataImpl.cpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCEncryptedDataImpl.cpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -106,13 +106,13 @@
// --------------------------------------------------------------------------------
-XENCEncryptedDataImpl::XENCEncryptedDataImpl(XENCCipherImpl * cipher) :
-XENCEncryptedTypeImpl(cipher) {
+XENCEncryptedDataImpl::XENCEncryptedDataImpl(const XSECEnv * env) :
+XENCEncryptedTypeImpl(env) {
}
-XENCEncryptedDataImpl::XENCEncryptedDataImpl(XENCCipherImpl * cipher, DOMNode * node) :
-XENCEncryptedTypeImpl(cipher, node) {
+XENCEncryptedDataImpl::XENCEncryptedDataImpl(const XSECEnv * env, DOMNode * node) :
+XENCEncryptedTypeImpl(env, node) {
}
@@ -152,9 +152,10 @@
DOMElement * XENCEncryptedDataImpl::createBlankEncryptedData(
XENCCipherData::XENCCipherDataType type,
+ const XMLCh * algorithm,
const XMLCh * value) {
- return createBlankEncryptedType(s_EncryptedData, type, value);
+ return createBlankEncryptedType(s_EncryptedData, type, algorithm, value);
}
1.4 +8 -5 xml-security/c/src/xenc/impl/XENCCipherValueImpl.hpp
Index: XENCCipherValueImpl.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherValueImpl.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCCipherValueImpl.hpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCCipherValueImpl.hpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -79,13 +79,15 @@
XSEC_DECLARE_XERCES_CLASS(DOMNode);
+class XSECEnv;
+
class XENCCipherValueImpl : public XENCCipherValue {
public:
- XENCCipherValueImpl(XENCCipherImpl * cipher);
+ XENCCipherValueImpl(const XSECEnv * env);
XENCCipherValueImpl(
- XENCCipherImpl * cipher,
+ const XSECEnv * env,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * node
);
@@ -99,7 +101,8 @@
// Interface methods
- const XMLCh * getCipherString(void);
+ virtual const XMLCh * getCipherString(void);
+ virtual void setCipherString(const XMLCh * value);
private:
@@ -107,7 +110,7 @@
XENCCipherValueImpl(const XENCCipherValueImpl &);
XENCCipherValueImpl & operator = (const XENCCipherValueImpl &);
- XENCCipher * mp_cipher;
+ const XSECEnv * mp_env;
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode
* mp_cipherValueNode;
XMLCh * mp_cipherString; // EncryptedData
1.4 +33 -7 xml-security/c/src/xenc/impl/XENCCipherValueImpl.cpp
Index: XENCCipherValueImpl.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherValueImpl.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCCipherValueImpl.cpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCCipherValueImpl.cpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -74,6 +74,7 @@
#include <xsec/framework/XSECError.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
+#include <xsec/framework/XSECEnv.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
@@ -103,15 +104,15 @@
// Constructors/Destructors
// --------------------------------------------------------------------------------
-XENCCipherValueImpl::XENCCipherValueImpl(XENCCipherImpl * cipher) :
-mp_cipher(cipher),
+XENCCipherValueImpl::XENCCipherValueImpl(const XSECEnv * env) :
+mp_env(env),
mp_cipherValueNode(NULL),
mp_cipherString(NULL) {
}
-XENCCipherValueImpl::XENCCipherValueImpl(XENCCipherImpl * cipher, DOMNode * node) :
-mp_cipher(cipher),
+XENCCipherValueImpl::XENCCipherValueImpl(const XSECEnv * env, DOMNode * node) :
+mp_env(env),
mp_cipherValueNode(node),
mp_cipherString(NULL) {
@@ -171,8 +172,8 @@
// Get some setup values
safeBuffer str;
- DOMDocument *doc = mp_cipher->getDocument();
- const XMLCh * prefix = mp_cipher->getXENCNSPrefix();
+ DOMDocument *doc = mp_env->getParentDocument();
+ const XMLCh * prefix = mp_env->getXENCNSPrefix();
makeQName(str, prefix, s_CipherValue);
@@ -198,3 +199,28 @@
}
+void XENCCipherValueImpl::setCipherString(const XMLCh * value) {
+
+ if (mp_cipherValueNode == NULL) {
+
+ throw XSECException(XSECException::CipherValueError,
+ "XENCCipherData::setCipherString - called on empty DOM");
+
+ }
+
+ // Find first text child
+ DOMNode * txt = findFirstChildOfType(mp_cipherValueNode, DOMNode::TEXT_NODE);
+
+ if (txt == NULL) {
+ throw XSECException(XSECException::CipherValueError,
+ "XENCCipherData::setCipherString - Error finding text node");
+ }
+
+ txt->setNodeValue(value);
+
+ if (mp_cipherString != NULL)
+ delete[] mp_cipherString;
+
+ mp_cipherString = XMLString::replicate(value);
+
+}
1.5 +21 -8 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- XENCCipherImpl.hpp 11 Sep 2003 11:43:07 -0000 1.4
+++ XENCCipherImpl.hpp 15 Sep 2003 11:53:09 -0000 1.5
@@ -78,6 +78,9 @@
class XSECProvider;
class XENCEncryptedDataImpl;
class TXFMChain;
+class XSECEnv;
+class XSECKeyInfoResolver;
+class XSECPlatformUtils;
XSEC_DECLARE_XERCES_CLASS(DOMNode);
XSEC_DECLARE_XERCES_CLASS(DOMDocumentFragment);
@@ -95,7 +98,9 @@
// Implementation for encryption Elements
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * encryptElement(
- XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * element);
+ XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * element,
+ encryptionMethod em,
+ const XMLCh * uri = NULL);
// Getter methods
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * getDocument(void)
@@ -104,20 +109,25 @@
// Setter methods
void setKey(XSECCryptoKey * key) {mp_key = key;}
+ void setKeyInfoResolver(const XSECKeyInfoResolver * resolver);
+
void setXENCNSPrefix(const XMLCh * prefix);
// Creation methods
- XENCEncryptedData * createEncryptedData(XENCCipherData::XENCCipherDataType type,
- XMLCh * value);
+ XENCEncryptedData * createEncryptedData(XENCCipherData::XENCCipherDataType type,
+ const XMLCh * algorithm,
+ const XMLCh * value);
+
+protected:
+ // Initialisation
+ static void Initialise(void);
protected:
// Protected to prevent direct creation of objects
XENCCipherImpl(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc);
- // Creates a transform chain that gives the decrypted data
- TXFMChain * createDecryptionTXFMChain(void);
private:
// Internal functions
@@ -139,11 +149,14 @@
// Key
XSECCryptoKey * mp_key;
- // Prefix
- XMLCh * mp_xencPrefixNS;
+ // Environment
+ XSECEnv * mp_env;
+ // Resolvers
+ XSECKeyInfoResolver * mp_keyInfoResolver;
friend class XSECProvider;
+ friend class XSECPlatformUtils;
};
1.4 +173 -88 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.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCCipherImpl.cpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCCipherImpl.cpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -73,14 +73,19 @@
#include <xsec/enc/XSECCryptoKey.hpp>
#include <xsec/transformers/TXFMChain.hpp>
#include <xsec/transformers/TXFMBase.hpp>
-#include <xsec/transformers/TXFMBase64.hpp>
#include <xsec/transformers/TXFMC14n.hpp>
-#include <xsec/transformers/TXFMCipher.hpp>
#include <xsec/transformers/TXFMDocObject.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
+#include <xsec/framework/XSECEnv.hpp>
+#include <xsec/enc/XSECKeyInfoResolver.hpp>
+#include <xsec/framework/XSECAlgorithmMapper.hpp>
+#include <xsec/framework/XSECAlgorithmHandler.hpp>
+#include <xsec/utils/XSECPlatformUtils.hpp>
#include "XENCCipherImpl.hpp"
#include "XENCEncryptedDataImpl.hpp"
+#include "XENCEncryptionMethodImpl.hpp"
+#include "XENCAlgorithmHandlerDefault.hpp"
#include <xercesc/dom/DOMNode.hpp>
#include <xercesc/dom/DOMElement.hpp>
@@ -114,14 +119,14 @@
chNull
};
-const XMLCh s_defaultXENCPrefix[] = {
-
- chLatin_x,
- chLatin_e,
+const XMLCh s_noData[] = {
chLatin_n,
- chLatin_c,
+ chLatin_o,
+ chLatin_D,
+ chLatin_a,
+ chLatin_t,
+ chLatin_a,
chNull
-
};
// --------------------------------------------------------------------------------
@@ -131,9 +136,10 @@
XENCCipherImpl::XENCCipherImpl(DOMDocument * doc) :
mp_doc(doc),
mp_encryptedData(NULL),
-mp_key(NULL) {
+mp_key(NULL),
+mp_keyInfoResolver(NULL) {
- mp_xencPrefixNS = XMLString::replicate(s_defaultXENCPrefix);
+ XSECnew(mp_env, XSECEnv(doc));
}
@@ -145,8 +151,25 @@
if (mp_key != NULL)
delete mp_key;
- if (mp_xencPrefixNS != NULL)
- delete mp_xencPrefixNS;
+ if (mp_env != NULL)
+ delete mp_env;
+
+ if (mp_keyInfoResolver != NULL)
+ delete mp_keyInfoResolver;
+
+}
+
+// --------------------------------------------------------------------------------
+// Initialiser
+// --------------------------------------------------------------------------------
+
+void XENCCipherImpl::Initialise(void) {
+
+ XENCAlgorithmHandlerDefault def;
+
+ // Register default encryption algorithm handlers
+
+ XSECPlatformUtils::registerAlgorithmHandler(DSIGConstants::s_unicodeStrURI3DES_CBC, def);
}
@@ -156,17 +179,25 @@
void XENCCipherImpl::setXENCNSPrefix(const XMLCh * prefix) {
- if (mp_xencPrefixNS != NULL)
- delete mp_xencPrefixNS;
-
- // Copy in new one
- mp_xencPrefixNS = XMLString::replicate(prefix);
+ mp_env->setXENCNSPrefix(prefix);
}
const XMLCh * XENCCipherImpl::getXENCNSPrefix(void) const {
- return mp_xencPrefixNS;
+ return mp_env->getXENCNSPrefix();
+
+}
+// --------------------------------------------------------------------------------
+// Key Info resolvers
+// --------------------------------------------------------------------------------
+
+void XENCCipherImpl::setKeyInfoResolver(const XSECKeyInfoResolver * resolver) {
+
+ if (mp_keyInfoResolver != NULL)
+ delete mp_keyInfoResolver;
+
+ mp_keyInfoResolver = resolver->clone();
}
@@ -302,73 +333,76 @@
}
// --------------------------------------------------------------------------------
-// Build a set of decryption transforms
+// Decrypt an Element and replace in original document
// --------------------------------------------------------------------------------
-TXFMChain * XENCCipherImpl::createDecryptionTXFMChain(void) {
+DOMDocument * XENCCipherImpl::decryptElement(DOMElement * element) {
+
+ // First of all load the element
+ if (mp_encryptedData != NULL)
+ delete mp_encryptedData;
- // First obtain the raw encrypted data
+ XSECnew(mp_encryptedData,
+ XENCEncryptedDataImpl(mp_env, dynamic_cast<DOMNode *>(element)));
+
+ // Load
+ mp_encryptedData->load();
+
+ // Make sure we have a key before we do anything else too drastic
if (mp_key == NULL) {
- throw XSECException(XSECException::CipherError,
- "XENCCipherImpl::createDecryptionTXFMChain - No key set");
- }
- if (mp_encryptedData == NULL) {
- throw XSECException(XSECException::CipherError,
- "XENCCipherImpl::createDecryptionTXFMChain - Encrypted Data");
+ if (mp_keyInfoResolver != NULL)
+ mp_key = mp_keyInfoResolver->resolveKey(mp_encryptedData->getKeyInfoList());
+
+ if (mp_key == NULL) {
+
+ throw XSECException(XSECException::CipherError,
+ "XENCCipherImpl::decryptElement - No key set and cannot resolve");
+ }
}
// Get the raw encrypted data
TXFMChain * c = mp_encryptedData->createCipherTXFMChain();
-
Janitor<TXFMChain> j_c(c);
- // Now add the decryption TXFM
- TXFMCipher * tcipher;
- XSECnew(tcipher, TXFMCipher(mp_doc, mp_key, false));
+ // Get the Algorithm handler for the algorithm
+ XENCEncryptionMethod * encryptionMethod = mp_encryptedData->getEncryptionMethod();
+ XSECAlgorithmHandler *handler;
+
+ if (encryptionMethod != NULL) {
+
+ handler =
+ XSECPlatformUtils::g_algorithmMapper->mapURIToHandler(
+ mp_encryptedData->getEncryptionMethod()->getAlgorithm());
+
+ }
- c->appendTxfm(tcipher);
+ else {
- j_c.release();
- return c;
+ handler =
+ XSECPlatformUtils::g_algorithmMapper->mapURIToHandler(
+ XSECAlgorithmMapper::s_defaultEncryptionMapping);
-}
+ }
-// --------------------------------------------------------------------------------
-// Decrypt an Element and replace in original document
-// --------------------------------------------------------------------------------
+ safeBuffer sb("");
-DOMDocument * XENCCipherImpl::decryptElement(DOMElement * element) {
+ if (handler != NULL) {
- // Make sure we have a key before we do anything too drastic
- if (mp_key == NULL) {
- throw XSECException(XSECException::CipherError,
- "XENCCipherImpl::decryptElement - No key set");
+ handler->decryptToSafeBuffer(c,
+ mp_encryptedData->getEncryptionMethod(),
+ mp_key,
+ mp_env->getParentDocument(),
+ sb);
}
-
- // First of all load the element
- if (mp_encryptedData != NULL)
- delete mp_encryptedData;
-
- XSECnew(mp_encryptedData,
- XENCEncryptedDataImpl(this, dynamic_cast<DOMNode *>(element)));
-
- // Load
- mp_encryptedData->load();
+ else {
- // Get the raw encrypted data
- TXFMChain * c = createDecryptionTXFMChain();
- Janitor<TXFMChain> j_c(c);
- TXFMBase * b = c->getLastTxfm();
+ // Very strange if we get here - any problems should throw an
+ // exception in the AlgorithmMapper.
- // Read the result into a safeBuffer
- XMLByte buf[2050];
- safeBuffer sb("");
+ throw XSECException(XSECException::CipherError,
+ "XENCCipherImpl::decryptElement - Error retrieving a handler for algorithm");
- int len;
- while ((len = b->readBytes(buf, 2048)) > 0) {
- buf[len] = '\0';
- sb.sbStrcatIn((char *) buf);
}
// Now de-serialise
@@ -398,8 +432,9 @@
// --------------------------------------------------------------------------------
XENCEncryptedData * XENCCipherImpl::createEncryptedData(
- XENCCipherData::XENCCipherDataType type,
- XMLCh * value) {
+ XENCCipherData::XENCCipherDataType type,
+ const XMLCh * algorithm,
+ const XMLCh * value) {
// Clean out anything currently being used
if (mp_encryptedData != NULL) {
@@ -408,8 +443,8 @@
}
// Create a new EncryptedData element
- XSECnew(mp_encryptedData, XENCEncryptedDataImpl(this));
- mp_encryptedData->createBlankEncryptedData(type, value);
+ XSECnew(mp_encryptedData, XENCEncryptedDataImpl(mp_env));
+ mp_encryptedData->createBlankEncryptedData(type, algorithm, value);
return mp_encryptedData;
}
@@ -418,7 +453,9 @@
// Encrypt an element
// --------------------------------------------------------------------------------
-DOMDocument * XENCCipherImpl::encryptElement(DOMElement * element) {
+DOMDocument * XENCCipherImpl::encryptElement(DOMElement * element,
+ encryptionMethod em,
+ const XMLCh * algorithmURI) {
// Make sure we have a key before we do anything too drastic
if (mp_key == NULL) {
@@ -426,6 +463,35 @@
"XENCCipherImpl::encryptElement - No key set");
}
+ // Map the encryption method to a URI
+ safeBuffer algorithmSB;
+ const XMLCh * algorithm;
+
+ if (em == ENCRYPT_NONE) {
+ algorithm = algorithmURI;
+ }
+ else {
+ if (encryptionMethod2URI(algorithmSB, em) != true) {
+ throw XSECException(XSECException::CipherError,
+ "XENCCipherImpl::encryptElement - Unknown encryption method");
+ }
+ algorithm = algorithmSB.sbStrToXMLCh();
+ }
+
+ // Create the element with a dummy encrypted value
+
+ if (mp_encryptedData != NULL) {
+ delete mp_encryptedData;
+ mp_encryptedData = NULL;
+ }
+
+ XSECnew(mp_encryptedData, XENCEncryptedDataImpl(mp_env));
+ mp_encryptedData->createBlankEncryptedData(
+ XENCCipherData::VALUE_TYPE,
+ algorithm,
+ s_noData);
+
+
// Create a transform chain to do the encryption
TXFMDocObject * tdocObj;
XSECnew(tdocObj, TXFMDocObject(mp_doc));
@@ -444,29 +510,48 @@
tc14n->activateComments();
tc14n->setExclusive();
- // Do the encryption
- TXFMCipher *tcipher;
- XSECnew(tcipher, TXFMCipher(mp_doc, mp_key, true));
- c->appendTxfm(tcipher);
-
- // Transform to Base64
- TXFMBase64 * tb64;
- XSECnew(tb64, TXFMBase64(mp_doc, false));
- c->appendTxfm(tb64);
+ // Perform the encryption
+ XSECAlgorithmHandler *handler;
+
+ if (algorithm != NULL) {
+
+ handler =
+ XSECPlatformUtils::g_algorithmMapper->mapURIToHandler(algorithm);
+
+ }
+
+ else {
+
+ handler =
+ XSECPlatformUtils::g_algorithmMapper->mapURIToHandler(
+ XSECAlgorithmMapper::s_defaultEncryptionMapping);
+
+ }
- // Read into a safeBuffer
safeBuffer sb;
- sb << c->getLastTxfm();
- // Create the element!
+ if (handler != NULL) {
- if (mp_encryptedData != NULL) {
- delete mp_encryptedData;
- mp_encryptedData = NULL;
+ handler->encryptToSafeBuffer(c,
+ mp_encryptedData->getEncryptionMethod(),
+ mp_key,
+ mp_env->getParentDocument(),
+ sb);
}
-
- XSECnew(mp_encryptedData, XENCEncryptedDataImpl(this));
- mp_encryptedData->createBlankEncryptedData(XENCCipherData::VALUE_TYPE, sb.sbStrToXMLCh());
+ else {
+
+ // Very strange if we get here - any problems should throw an
+ // exception in the AlgorithmMapper.
+
+ throw XSECException(XSECException::CipherError,
+ "XENCCipherImpl::decryptElement - Error retrieving a handler for algorithm");
+
+ }
+
+ // Set the value
+ XENCCipherValue * val = mp_encryptedData->getCipherData()->getCipherValue();
+
+ val->setCipherString(sb.sbStrToXMLCh());
// Replace original element
DOMNode * p = element->getParentNode();
1.4 +4 -4 xml-security/c/src/xenc/impl/XENCCipherDataImpl.hpp
Index: XENCCipherDataImpl.hpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherDataImpl.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCCipherDataImpl.hpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCCipherDataImpl.hpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -84,9 +84,9 @@
public:
- XENCCipherDataImpl(XENCCipherImpl * cipher);
+ XENCCipherDataImpl(const XSECEnv * env);
XENCCipherDataImpl(
- XENCCipherImpl * cipher,
+ const XSECEnv * env,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * node
);
@@ -109,7 +109,7 @@
// Unimplemented constructor
XENCCipherDataImpl();
- XENCCipherImpl * mp_cipher;
+ const XSECEnv * mp_env;
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode
* mp_cipherDataNode; // Node at head of structure
1.4 +10 -9 xml-security/c/src/xenc/impl/XENCCipherDataImpl.cpp
Index: XENCCipherDataImpl.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherDataImpl.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XENCCipherDataImpl.cpp 11 Sep 2003 11:07:07 -0000 1.3
+++ XENCCipherDataImpl.cpp 15 Sep 2003 11:53:09 -0000 1.4
@@ -73,6 +73,7 @@
#include <xsec/framework/XSECError.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
+#include <xsec/framework/XSECEnv.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
@@ -137,16 +138,16 @@
// Constructors and Destructors
// --------------------------------------------------------------------------------
-XENCCipherDataImpl::XENCCipherDataImpl(XENCCipherImpl * cipher) :
-mp_cipher(cipher),
+XENCCipherDataImpl::XENCCipherDataImpl(const XSECEnv * env) :
+mp_env(env),
mp_cipherDataNode(NULL),
mp_cipherValue(NULL) {
}
-XENCCipherDataImpl::XENCCipherDataImpl(XENCCipherImpl * cipher, DOMNode * node) :
-mp_cipher(cipher),
+XENCCipherDataImpl::XENCCipherDataImpl(const XSECEnv * env, DOMNode * node) :
+mp_env(env),
mp_cipherDataNode(node),
mp_cipherValue(NULL) {
@@ -187,7 +188,7 @@
if (tmpElt != NULL && strEquals(getXENCLocalName(tmpElt), s_CipherValue)) {
m_cipherDataType = VALUE_TYPE;
- XSECnew(mp_cipherValue, XENCCipherValueImpl(mp_cipher, tmpElt));
+ XSECnew(mp_cipherValue, XENCCipherValueImpl(mp_env, tmpElt));
mp_cipherValue->load();
}
@@ -225,8 +226,8 @@
// Get some setup values
safeBuffer str;
- DOMDocument *doc = mp_cipher->getDocument();
- const XMLCh * prefix = mp_cipher->getXENCNSPrefix();
+ DOMDocument *doc = mp_env->getParentDocument();
+ const XMLCh * prefix = mp_env->getXENCNSPrefix();
makeQName(str, prefix, s_CipherData);
@@ -239,7 +240,7 @@
// Should set the type attribute
// Create the Cipher Value
- XSECnew(mp_cipherValue, XENCCipherValueImpl(mp_cipher));
+ XSECnew(mp_cipherValue, XENCCipherValueImpl(mp_env));
DOMNode * cipherValueNode = mp_cipherValue->createBlankCipherValue(value);
ret->appendChild(cipherValueNode);