Merged marshalling/unmarshalling methods into core interface.
[shibboleth/cpp-xmltooling.git] / xmltoolingtest / SignatureTest.h
index 2087c4e..2582b15 100644 (file)
 #include <openssl/pem.h>\r
 #include <xercesc/util/XMLUniDefs.hpp>\r
 #include <xsec/dsig/DSIGReference.hpp>\r
+#include <xsec/enc/XSECKeyInfoResolverDefault.hpp>\r
 #include <xsec/enc/OpenSSL/OpenSSLCryptoX509.hpp>\r
 #include <xsec/enc/OpenSSL/OpenSSLCryptoKeyRSA.hpp>\r
 \r
-class TestContext : public SigningContext\r
+class TestContext : public SigningContext, public VerifyingContext\r
 {\r
     XSECCryptoKey* m_key;\r
     vector<XSECCryptoX509*> m_certs;\r
@@ -69,6 +70,14 @@ public:
         ref->appendEnvelopedSignatureTransform();\r
         ref->appendCanonicalizationTransform(CANON_C14NE_NOC);\r
     }\r
+\r
+    void verifySignature(DSIGSignature* sig) const {\r
+        const XMLCh* uri=sig->getReferenceList()->item(0)->getURI();\r
+        TSM_ASSERT_SAME_DATA("Reference URI does not match.",uri,m_uri,XMLString::stringLen(uri));\r
+        XSECKeyInfoResolverDefault resolver;\r
+        sig->setKeyInfoResolver(&resolver); // It will clone the resolver for us.\r
+        sig->verify();\r
+    }\r
     \r
     const std::vector<XSECCryptoX509*>& getX509Certificates() const { return m_certs; }\r
     XSECCryptoKey* getSigningKey() const { return m_key->clone(); }\r
@@ -81,27 +90,23 @@ public:
 \r
     void setUp() {\r
         XMLObjectBuilder::registerBuilder(m_qname, new SimpleXMLObjectBuilder());\r
-        Marshaller::registerMarshaller(m_qname, new SimpleXMLObjectMarshaller());\r
-        Unmarshaller::registerUnmarshaller(m_qname, new SimpleXMLObjectUnmarshaller());\r
     }\r
 \r
     void tearDown() {\r
         XMLObjectBuilder::deregisterBuilder(m_qname);\r
-        Marshaller::deregisterMarshaller(m_qname);\r
-        Unmarshaller::deregisterUnmarshaller(m_qname);\r
     }\r
 \r
     void testSignature() {\r
         TS_TRACE("testSignature");\r
 \r
-        const XMLObjectBuilder* b=XMLObjectBuilder::getBuilder(m_qname);\r
+        const SimpleXMLObjectBuilder* b=dynamic_cast<const SimpleXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(m_qname));\r
         TS_ASSERT(b!=NULL);\r
         \r
-        auto_ptr<SimpleXMLObject> sxObject(dynamic_cast<SimpleXMLObject*>(b->buildObject()));\r
+        auto_ptr<SimpleXMLObject> sxObject(b->buildObject());\r
         TS_ASSERT(sxObject.get()!=NULL);\r
         VectorOf(SimpleXMLObject) kids=sxObject->getSimpleXMLObjects();\r
-        kids.push_back(dynamic_cast<SimpleXMLObject*>(b->buildObject()));\r
-        kids.push_back(dynamic_cast<SimpleXMLObject*>(b->buildObject()));\r
+        kids.push_back(b->buildObject());\r
+        kids.push_back(b->buildObject());\r
         \r
         // Test some collection stuff\r
         auto_ptr_XMLCh foo("Foo");\r
@@ -116,7 +121,7 @@ public:
         // Signing context for the whole document.\r
         TestContext tc(&chNull);\r
         MarshallingContext mctx(sig,&tc);\r
-        DOMElement* rootElement = Marshaller::getMarshaller(sxObject.get())->marshall(sxObject.get(),(DOMDocument*)NULL,&mctx);\r
+        DOMElement* rootElement = sxObject->marshall((DOMDocument*)NULL,&mctx);\r
         \r
         string buf;\r
         XMLHelper::serialize(rootElement, buf);\r
@@ -124,10 +129,17 @@ public:
 \r
         istringstream in(buf);\r
         DOMDocument* doc=nonvalidatingPool->parse(in);\r
-        const Unmarshaller* u = Unmarshaller::getUnmarshaller(doc->getDocumentElement());\r
-        auto_ptr<SimpleXMLObject> sxObject2(dynamic_cast<SimpleXMLObject*>(u->unmarshall(doc->getDocumentElement(),true)));\r
+        auto_ptr<SimpleXMLObject> sxObject2(dynamic_cast<SimpleXMLObject*>(b->buildObject()->unmarshall(doc->getDocumentElement(),true)));\r
         TS_ASSERT(sxObject2.get()!=NULL);\r
         TS_ASSERT(sxObject2->getSignature()!=NULL);\r
+        \r
+        try {\r
+            sxObject2->getSignature()->verify(tc);\r
+        }\r
+        catch (SignatureException& e) {\r
+            TS_TRACE(e.what());\r
+            throw;\r
+        }\r
     }\r
 \r
 };\r