Merged marshalling/unmarshalling methods into core interface.
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / XMLSecSignature.cpp
index 5221329..eb01345 100644 (file)
@@ -97,7 +97,7 @@ public:
     }\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
@@ -107,15 +107,15 @@ void XMLSecSignatureImpl::sign(const SigningContext* ctx)
 \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
@@ -127,26 +127,42 @@ void XMLSecSignatureImpl::sign(const SigningContext* ctx)
     }\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
@@ -155,11 +171,12 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMDocumen
         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
@@ -172,29 +189,27 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMDocumen
         // 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
@@ -214,9 +229,10 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMDocumen
 \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
@@ -234,31 +250,27 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMDocumen
     // 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
@@ -267,11 +279,12 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMElement
         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
@@ -284,36 +297,37 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMElement
         // 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
@@ -327,21 +341,21 @@ DOMElement* XMLSecSignatureMarshaller::marshall(XMLObject* xmlObject, DOMElement
     // 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
@@ -351,6 +365,6 @@ XMLObject* XMLSecSignatureUnmarshaller::unmarshall(DOMElement* element, bool bin
         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