#include <xsec/enc/XSECCryptoException.hpp>\r
#include <xsec/framework/XSECException.hpp>\r
\r
+using namespace xmlsignature;\r
using namespace xmltooling;\r
using namespace log4cpp;\r
using namespace std;\r
#pragma warning( disable : 4250 4251 )\r
#endif\r
\r
-namespace xmltooling {\r
+namespace xmlsignature {\r
\r
class XMLTOOL_DLLLOCAL XMLSecSignatureImpl : public UnknownElementImpl, public virtual Signature\r
{\r
\r
void releaseDOM();\r
XMLObject* clone() const;\r
+ Signature* cloneSignature() const;\r
\r
DOMElement* marshall(DOMDocument* document=NULL, MarshallingContext* ctx=NULL) const;\r
DOMElement* marshall(DOMElement* parentElement, MarshallingContext* ctx=NULL) const;\r
void setCanonicalizationMethod(const XMLCh* c14n) { m_c14n = prepareForAssignment(m_c14n,c14n); }\r
void setSignatureAlgorithm(const XMLCh* sm) { m_sm = prepareForAssignment(m_sm,sm); }\r
\r
- void sign(const SigningContext& ctx);\r
+ void sign(SigningContext& ctx);\r
void verify(const VerifyingContext& ctx) const;\r
\r
private:\r
\r
XMLObject* XMLSecSignatureImpl::clone() const\r
{\r
+ return cloneSignature();\r
+}\r
+\r
+Signature* XMLSecSignatureImpl::cloneSignature() const\r
+{\r
XMLSecSignatureImpl* ret=new XMLSecSignatureImpl();\r
\r
ret->m_c14n=XMLString::replicate(m_c14n);\r
}\r
};\r
\r
-void XMLSecSignatureImpl::sign(const SigningContext& ctx)\r
+void XMLSecSignatureImpl::sign(SigningContext& ctx)\r
{\r
Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Signature");\r
log.debug("applying signature");\r
\r
try {\r
log.debug("creating signature content");\r
- ctx.createSignature(m_signature);\r
- const std::vector<XSECCryptoX509*>& certs=ctx.getX509Certificates();\r
- if (!certs.empty()) {\r
- DSIGKeyInfoX509* x509Data=m_signature->appendX509Data();\r
- for_each(certs.begin(),certs.end(),bind1st(_addcert(),x509Data));\r
+ CredentialResolver& cr=ctx.getCredentialResolver();\r
+ if (!ctx.createSignature(m_signature)) {\r
+ auto_ptr<KeyInfo> keyInfo(ctx.getKeyInfo());\r
+ if (keyInfo.get()) {\r
+ DOMElement* domElement=keyInfo->marshall(m_signature->getParentDocument());\r
+ getDOM()->appendChild(domElement);\r
+ }\r
+ else {\r
+ Locker locker1(cr);\r
+ const std::vector<XSECCryptoX509*>* certs=cr.getX509Certificates();\r
+ if (certs && !certs->empty()) {\r
+ DSIGKeyInfoX509* x509Data=m_signature->appendX509Data();\r
+ for_each(certs->begin(),certs->end(),bind1st(_addcert(),x509Data));\r
+ }\r
+ }\r
}\r
\r
log.debug("computing signature");\r
- m_signature->setSigningKey(ctx.getSigningKey());\r
+ Locker locker2(cr);\r
+ XSECCryptoKey* key=cr.getPrivateKey();\r
+ if (!key)\r
+ throw SignatureException(string("Unable to obtain signing key from CredentialResolver (") + cr.getId() + ")");\r
+ m_signature->setSigningKey(key->clone());\r
m_signature->sign();\r
}\r
catch(XSECException& e) {\r
MemBufInputSource src(reinterpret_cast<const XMLByte*>(m_xml.c_str()),m_xml.length(),"XMLSecSignatureImpl");\r
Wrapper4InputSource dsrc(&src,false);\r
log.debug("parsing Signature XML back into DOM tree");\r
- DOMDocument* internalDoc=XMLToolingInternalConfig::getInternalConfig().m_parserPool->parse(dsrc);\r
+ DOMDocument* internalDoc=XMLToolingConfig::getConfig().getParser().parse(dsrc);\r
if (document) {\r
// The caller insists on using his own document, so we now have to import the thing\r
// into it. Then we're just dumping the one we built.\r
MemBufInputSource src(reinterpret_cast<const XMLByte*>(m_xml.c_str()),m_xml.length(),"XMLSecSignatureImpl");\r
Wrapper4InputSource dsrc(&src,false);\r
log.debug("parsing XML back into DOM tree");\r
- DOMDocument* internalDoc=XMLToolingInternalConfig::getInternalConfig().m_parserPool->parse(dsrc);\r
+ DOMDocument* internalDoc=XMLToolingConfig::getConfig().getParser().parse(dsrc);\r
\r
log.debug("reimporting new DOM into caller-supplied document");\r
cachedDOM=static_cast<DOMElement*>(parentElement->getOwnerDocument()->importNode(internalDoc->getDocumentElement(),true));\r