}\r
};\r
\r
-void XMLSecSignatureImpl::sign(const SigningContext* ctx)\r
+void XMLSecSignatureImpl::sign(const 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
+ 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
}\r
\r
log.debug("computing signature");\r
- m_signature->setSigningKey(ctx->getSigningKey());\r
+ m_signature->setSigningKey(ctx.getSigningKey());\r
m_signature->sign();\r
}\r
catch(XSECException& e) {\r
}\r
}\r
\r
-DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMDocument* document, MarshallingContext* ctx) const\r
+void XMLSecSignatureImpl::verify(const VerifyingContext& ctx) const\r
+{\r
+ Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Signature");\r
+ log.debug("verifying signature");\r
+\r
+ if (!m_signature)\r
+ throw SignatureException("Only a marshalled Signature object can be verified.");\r
+\r
+ try {\r
+ ctx.verifySignature(m_signature);\r
+ }\r
+ catch(XSECException& e) {\r
+ auto_ptr_char temp(e.getMsg());\r
+ throw SignatureException(string("Caught an XMLSecurity exception verifying signature: ") + temp.get());\r
+ }\r
+ catch(XSECCryptoException& e) {\r
+ throw SignatureException(string("Caught an XMLSecurity exception verifying signature: ") + e.getMsg());\r
+ }\r
+}\r
+\r
+DOMElement* XMLSecSignatureImpl::marshall(DOMDocument* document, MarshallingContext* ctx) const\r
{\r
#ifdef _DEBUG\r
xmltooling::NDC ndc("marshall");\r
#endif\r
\r
- Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Marshaller");\r
+ Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Signature");\r
log.debug("marshalling ds:Signature");\r
\r
- XMLSecSignatureImpl* sig=dynamic_cast<XMLSecSignatureImpl*>(xmlObject);\r
- if (!sig)\r
- throw MarshallingException("Only objects of class XMLSecSignatureImpl can be marshalled.");\r
- \r
- DOMElement* cachedDOM=sig->getDOM();\r
+ DOMElement* cachedDOM=getDOM();\r
if (cachedDOM) {\r
if (!document || document==cachedDOM->getOwnerDocument()) {\r
log.debug("Signature has a usable cached DOM, reusing it");\r
if (document)\r
setDocumentElement(cachedDOM->getOwnerDocument(),cachedDOM);\r
- sig->releaseParentDOM(true);\r
+ releaseParentDOM(true);\r
return cachedDOM;\r
}\r
\r
cachedDOM=static_cast<DOMElement*>(document->importNode(cachedDOM, true));\r
\r
try {\r
- XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->releaseSignature(sig->m_signature);\r
- sig->m_signature=NULL;\r
- sig->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
+ XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->releaseSignature(m_signature);\r
+ m_signature=NULL;\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
document, cachedDOM\r
);\r
+ m_signature->load();\r
}\r
catch(XSECException& e) {\r
auto_ptr_char temp(e.getMsg());\r
// Recache the DOM.\r
setDocumentElement(document, cachedDOM);\r
log.debug("caching imported DOM for Signature");\r
- sig->setDOM(cachedDOM, false);\r
- sig->releaseParentDOM(true);\r
+ setDOM(cachedDOM, false);\r
+ releaseParentDOM(true);\r
return cachedDOM;\r
}\r
\r
// If we get here, we didn't have a usable DOM.\r
bool bindDocument=false;\r
- if (sig->m_xml.empty()) {\r
+ if (m_xml.empty()) {\r
// Fresh signature, so we just create an empty one.\r
log.debug("creating empty Signature element");\r
if (!document) {\r
document=DOMImplementationRegistry::getDOMImplementation(NULL)->createDocument();\r
bindDocument=true;\r
}\r
- sig->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignature();\r
- sig->m_signature->setDSIGNSPrefix(Signature::PREFIX);\r
- cachedDOM=sig->m_signature->createBlankSignature(\r
- document, sig->getCanonicalizationMethod(), sig->getSignatureAlgorithm()\r
- );\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignature();\r
+ m_signature->setDSIGNSPrefix(Signature::PREFIX);\r
+ cachedDOM=m_signature->createBlankSignature(document, getCanonicalizationMethod(), getSignatureAlgorithm());\r
}\r
else {\r
// We need to reparse the XML we saved off into a new DOM.\r
- MemBufInputSource src(reinterpret_cast<const XMLByte*>(sig->m_xml.c_str()),sig->m_xml.length(),"XMLSecSignatureImpl");\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
\r
// Now reload the signature from the DOM.\r
try {\r
- sig->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
document, cachedDOM\r
);\r
+ m_signature->load();\r
}\r
catch(XSECException& e) {\r
if (bindDocument)\r
// Recache the DOM and clear the serialized copy.\r
setDocumentElement(document, cachedDOM);\r
log.debug("caching DOM for Signature (document is %sbound)", bindDocument ? "" : "not ");\r
- sig->setDOM(cachedDOM, bindDocument);\r
- sig->releaseParentDOM(true);\r
- sig->m_xml.erase();\r
+ setDOM(cachedDOM, bindDocument);\r
+ releaseParentDOM(true);\r
+ m_xml.erase();\r
return cachedDOM;\r
}\r
\r
-DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMElement* parentElement, MarshallingContext* ctx) const\r
+DOMElement* XMLSecSignatureImpl::marshall(DOMElement* parentElement, MarshallingContext* ctx) const\r
{\r
#ifdef _DEBUG\r
xmltooling::NDC ndc("marshall");\r
#endif\r
\r
- Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Marshaller");\r
+ Category& log=Category::getInstance(XMLTOOLING_LOGCAT".Signature");\r
log.debug("marshalling ds:Signature");\r
\r
- XMLSecSignatureImpl* sig=dynamic_cast<XMLSecSignatureImpl*>(xmlObject);\r
- if (!sig)\r
- throw MarshallingException("Only objects of class XMLSecSignatureImpl can be marshalled.");\r
- \r
- DOMElement* cachedDOM=sig->getDOM();\r
+ DOMElement* cachedDOM=getDOM();\r
if (cachedDOM) {\r
if (parentElement->getOwnerDocument()==cachedDOM->getOwnerDocument()) {\r
log.debug("Signature has a usable cached DOM, reusing it");\r
parentElement->appendChild(cachedDOM);\r
- sig->releaseParentDOM(true);\r
+ releaseParentDOM(true);\r
return cachedDOM;\r
}\r
\r
cachedDOM=static_cast<DOMElement*>(parentElement->getOwnerDocument()->importNode(cachedDOM, true));\r
\r
try {\r
- XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->releaseSignature(sig->m_signature);\r
- sig->m_signature=NULL;\r
- sig->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
+ XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->releaseSignature(m_signature);\r
+ m_signature=NULL;\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
parentElement->getOwnerDocument(), cachedDOM\r
);\r
+ m_signature->load();\r
}\r
catch(XSECException& e) {\r
auto_ptr_char temp(e.getMsg());\r
// Recache the DOM.\r
parentElement->appendChild(cachedDOM);\r
log.debug("caching imported DOM for Signature");\r
- sig->setDOM(cachedDOM, false);\r
- sig->releaseParentDOM(true);\r
+ setDOM(cachedDOM, false);\r
+ releaseParentDOM(true);\r
return cachedDOM;\r
}\r
\r
// If we get here, we didn't have a usable DOM.\r
- if (sig->m_xml.empty()) {\r
+ if (m_xml.empty()) {\r
// Fresh signature, so we just create an empty one.\r
log.debug("creating empty Signature element");\r
- sig->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignature();\r
- sig->m_signature->setDSIGNSPrefix(Signature::PREFIX);\r
- cachedDOM=sig->m_signature->createBlankSignature(\r
- parentElement->getOwnerDocument(), sig->getCanonicalizationMethod(), sig->getSignatureAlgorithm()\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignature();\r
+ m_signature->setDSIGNSPrefix(Signature::PREFIX);\r
+ cachedDOM=m_signature->createBlankSignature(\r
+ parentElement->getOwnerDocument(), getCanonicalizationMethod(), getSignatureAlgorithm()\r
);\r
}\r
else {\r
- MemBufInputSource src(reinterpret_cast<const XMLByte*>(sig->m_xml.c_str()),sig->m_xml.length(),"XMLSecSignatureImpl");\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
\r
log.debug("reimporting new DOM into caller-supplied document");\r
- cachedDOM=static_cast<DOMElement*>(parentElement->getOwnerDocument()->importNode(internalDoc->getDocumentElement(), true));\r
+ cachedDOM=static_cast<DOMElement*>(parentElement->getOwnerDocument()->importNode(internalDoc->getDocumentElement(),true));\r
internalDoc->release();\r
\r
// Now reload the signature from the DOM.\r
try {\r
- sig->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
parentElement->getOwnerDocument(), cachedDOM\r
);\r
+ m_signature->load();\r
}\r
catch(XSECException& e) {\r
auto_ptr_char temp(e.getMsg());\r
// Recache the DOM and clear the serialized copy.\r
parentElement->appendChild(cachedDOM);\r
log.debug("caching DOM for Signature");\r
- sig->setDOM(cachedDOM, false);\r
- sig->releaseParentDOM(true);\r
- sig->m_xml.erase();\r
+ setDOM(cachedDOM, false);\r
+ releaseParentDOM(true);\r
+ m_xml.erase();\r
return cachedDOM;\r
}\r
\r
-XMLObject* XMLSecSignatureUnmarshaller::unmarshall(DOMElement* element, bool bindDocument) const\r
+XMLObject* XMLSecSignatureImpl::unmarshall(DOMElement* element, bool bindDocument)\r
{\r
- Category::getInstance(XMLTOOLING_LOGCAT".Unmarshaller").debug("unmarshalling ds:Signature");\r
+ Category::getInstance(XMLTOOLING_LOGCAT".Signature").debug("unmarshalling ds:Signature");\r
\r
- auto_ptr<XMLSecSignatureImpl> ret(new XMLSecSignatureImpl());\r
try {\r
- ret->m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
+ m_signature=XMLToolingInternalConfig::getInternalConfig().m_xsecProvider->newSignatureFromDOM(\r
element->getOwnerDocument(), element\r
);\r
+ m_signature->load();\r
}\r
catch(XSECException& e) {\r
auto_ptr_char temp(e.getMsg());\r
throw UnmarshallingException(string("Caught an XMLSecurity exception while loading signature: ") + e.getMsg());\r
}\r
\r
- ret->setDOM(element, bindDocument);\r
- return ret.release();\r
+ setDOM(element, bindDocument);\r
+ return this;\r
}\r