Misc fixes from addtl KeyInfo tests.
authorScott Cantor <cantor.2@osu.edu>
Thu, 13 Apr 2006 01:20:32 +0000 (01:20 +0000)
committerScott Cantor <cantor.2@osu.edu>
Thu, 13 Apr 2006 01:20:32 +0000 (01:20 +0000)
xmltooling/signature/KeyInfo.h
xmltooling/signature/impl/KeyInfoImpl.cpp
xmltooling/validation/Validator.cpp
xmltoolingtest/KeyInfoTest.h
xmltoolingtest/data/KeyInfo1.xml
xmltoolingtest/data/KeyInfo2.xml [new file with mode: 0644]
xmltoolingtest/data/KeyInfo3.xml [new file with mode: 0644]
xmltoolingtest/xmltoolingtest.h

index c1c6358..40b3722 100644 (file)
@@ -261,7 +261,8 @@ namespace xmlsignature {
     END_XMLOBJECTVALIDATOR;
 
     BEGIN_XMLOBJECTVALIDATOR(XMLTOOL_DLLLOCAL,KeyInfo);
-        XMLOBJECTVALIDATOR_NONEMPTY(KeyInfo,XMLObject);
+        if (!ptr->hasChildren())
+            throw xmltooling::ValidationException("KeyInfo must have at least one child element.");
     END_XMLOBJECTVALIDATOR;
 #endif /* XMLTOOLING_DECLARE_VALIDATORS */
 
index 3186a98..f86ebd9 100644 (file)
@@ -561,10 +561,11 @@ namespace xmlsignature {
             // Unknown child (has to be paired with the last SPKISexp processed.
             const XMLCh* nsURI=root->getNamespaceURI();
             if (!XMLString::equals(nsURI,XMLConstants::XMLSIG_NS) && nsURI && *nsURI) {
-                // Update second half of pair in vector, then add to master list.
-                if (m_SPKISexps.back().second==NULL) {
+                // Update second half of pair in vector, and in master list.
+                if (!m_SPKISexps.empty() && m_SPKISexps.back().second==NULL) {
                     m_SPKISexps.back().second=childXMLObject;
-                    m_children.push_back(childXMLObject);
+                    m_children.back()=childXMLObject;
+                    return;
                 }
                 else
                     throw UnmarshallingException("Extension element must follow ds:SPKISexp element.");
index c398c62..a39a332 100644 (file)
@@ -31,6 +31,9 @@ map< QName, vector<Validator*> > Validator::m_map;
 \r
 void Validator::checkValidity(const XMLObject* xmlObject)\r
 {\r
+    if (!xmlObject)\r
+        return;\r
+\r
     map< QName, vector<Validator*> >::iterator i;\r
     if (xmlObject->getSchemaType()) {\r
         i=m_map.find(*(xmlObject->getSchemaType()));\r
index 06b208a..7e65639 100644 (file)
@@ -58,6 +58,50 @@ public:
         auto_ptr_XMLCh expected("Public Key for CN=xmldap.org, OU=Domain Control Validated, O=xmldap.org");\r
         TSM_ASSERT_SAME_DATA("KeyName was not expected value",\r
             expected.get(), kiObject->getKeyNames().front()->getName(), XMLString::stringLen(expected.get()));\r
+\r
+        Validator::checkValidity(kiObject.get());\r
     }\r
 \r
+    void testKeyInfo2() {\r
+        TS_TRACE("testKeyInfo2");\r
+\r
+        string path=data_path + "KeyInfo2.xml";\r
+        ifstream fs(path.c_str());\r
+        DOMDocument* doc=validatingPool->parse(fs);\r
+        TS_ASSERT(doc!=NULL);\r
+\r
+        const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
+        TS_ASSERT(b!=NULL);\r
+\r
+        auto_ptr<KeyInfo> kiObject(\r
+            dynamic_cast<KeyInfo*>(b->buildFromDocument(doc))\r
+            );\r
+        TS_ASSERT(kiObject.get()!=NULL);\r
+        TSM_ASSERT_EQUALS("Number of child elements was not expected value",\r
+            2, kiObject->getOrderedChildren().size());\r
+        TSM_ASSERT_EQUALS("Number of child elements was not expected value",\r
+            1, kiObject->getRetrievalMethods().size());\r
+        TSM_ASSERT_EQUALS("Number of child elements was not expected value",\r
+            2, kiObject->getSPKIDatas().front()->getSPKISexps().size());\r
+\r
+        Validator::checkValidity(kiObject.get());\r
+    }\r
+\r
+    void testKeyInfo3() {\r
+        TS_TRACE("testKeyInfo3");\r
+\r
+        string path=data_path + "KeyInfo3.xml";\r
+        ifstream fs(path.c_str());\r
+        DOMDocument* doc=nonvalidatingPool->parse(fs);\r
+        TS_ASSERT(doc!=NULL);\r
+\r
+        const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
+        TS_ASSERT(b!=NULL);\r
+\r
+        auto_ptr<KeyInfo> kiObject(\r
+            dynamic_cast<KeyInfo*>(b->buildFromDocument(doc))\r
+            );\r
+        TS_ASSERT(kiObject.get()!=NULL);\r
+        TS_ASSERT_THROWS(Validator::checkValidity(kiObject.get()),ValidationException);\r
+    }\r
 };\r
index d323c44..cc62cb8 100644 (file)
@@ -1 +1,14 @@
-<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:KeyName>Public Key for CN=xmldap.org, OU=Domain Control Validated, O=xmldap.org</ds:KeyName><ds:KeyValue><ds:RSAKeyValue><ds:Modulus>ANCxWwHKKOzwCtsbZUhhzQjXcyKHA7zrl8UqoCyu7haKzrEmI7udl7B6L+zxgnmVRz4zsw1PJsVYUt9zG6ABC+P7Xtx46Tk/h5gO6hWL4XBzFUuKwsMRZ0RB0sAv6iQtz6TCyH47OBSJSN24h7e/viUQ0ZtKYsJo/r8BHrnoiJk1</ds:Modulus><ds:Exponent>AQAB</ds:Exponent></ds:RSAKeyValue></ds:KeyValue><ds:X509Data><ds:X509Certificate>MIIEYTCCA8qgAwIBAgIDPbIoMA0GCSqGSIb3DQEBBQUAMIHsMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEwMC4GA1UECxMnaHR0cDovL3d3dy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MTEwLwYDVQQDEyhTdGFyZmllbGQgU2VjdXJlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSowKAYJKoZIhvcNAQkBFhtwcmFjdGljZXNAc3RhcmZpZWxkdGVjaC5jb20wHhcNMDYwMzI5MjAwNzIxWhcNMDcwMzI5MjAwNzIxWjBNMRMwEQYDVQQKEwp4bWxkYXAub3JnMSEwHwYDVQQLExhEb21haW4gQ29udHJvbCBWYWxpZGF0ZWQxEzARBgNVBAMTCnhtbGRhcC5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANCxWwHKKOzwCtsbZUhhzQjXcyKHA7zrl8UqoCyu7haKzrEmI7udl7B6L+zxgnmVRz4zsw1PJsVYUt9zG6ABC+P7Xtx46Tk/h5gO6hWL4XBzFUuKwsMRZ0RB0sAv6iQtz6TCyH47OBSJSN24h7e/viUQ0ZtKYsJo/r8BHrnoiJk1AgMBAAGjggGtMIIBqTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NlcnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L3N0YXJmaWVsZGlzc3VpbmcuY3JsME8GA1UdIARIMEYwRAYLYIZIAYb4RQEHFwMwNTAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MIGGBggrBgEFBQcBAQR6MHgwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnN0YXJmaWVsZHRlY2guY29tMEsGCCsGAQUFBzAChj9odHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2ZfaXNzdWluZy5jcnQwHQYDVR0OBBYEFMcfOhkD6X5rEFFGmj1aV4Rg7Nr9MB8GA1UdIwQYMBaAFKxV3rfqE+v8mGjiU2Ae8SU+jO7nMA0GCSqGSIb3DQEBBQUAA4GBAB0qT6gCXzgWua2P9/CPqsbXztwJAMPVx2zyAVYuZwgThsEmg53EhpqhUFz6DssNFzIxGT8vMrOMJs0hgndBTtWVfdJbrhbgtdc7/Zp10WO/6ioX3lIzJq+un2MA9Rdwk3QQyHCH9baYgHbcPEOj3N+dk2nzCzK34IbPpjYzE7H0</ds:X509Certificate></ds:X509Data></ds:KeyInfo>
+<ds:KeyInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.w3.org/2000/09/xmldsig# ../../schemas/xmldsig-core-schema.xsd"
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+    <ds:KeyName>Public Key for CN=xmldap.org, OU=Domain Control Validated, O=xmldap.org</ds:KeyName>
+    <ds:KeyValue>
+        <ds:RSAKeyValue>
+            <ds:Modulus>ANCxWwHKKOzwCtsbZUhhzQjXcyKHA7zrl8UqoCyu7haKzrEmI7udl7B6L+zxgnmVRz4zsw1PJsVYUt9zG6ABC+P7Xtx46Tk/h5gO6hWL4XBzFUuKwsMRZ0RB0sAv6iQtz6TCyH47OBSJSN24h7e/viUQ0ZtKYsJo/r8BHrnoiJk1</ds:Modulus>
+            <ds:Exponent>AQAB</ds:Exponent>
+        </ds:RSAKeyValue>
+    </ds:KeyValue>
+    <ds:X509Data>
+        <ds:X509Certificate>MIIEYTCCA8qgAwIBAgIDPbIoMA0GCSqGSIb3DQEBBQUAMIHsMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEwMC4GA1UECxMnaHR0cDovL3d3dy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MTEwLwYDVQQDEyhTdGFyZmllbGQgU2VjdXJlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSowKAYJKoZIhvcNAQkBFhtwcmFjdGljZXNAc3RhcmZpZWxkdGVjaC5jb20wHhcNMDYwMzI5MjAwNzIxWhcNMDcwMzI5MjAwNzIxWjBNMRMwEQYDVQQKEwp4bWxkYXAub3JnMSEwHwYDVQQLExhEb21haW4gQ29udHJvbCBWYWxpZGF0ZWQxEzARBgNVBAMTCnhtbGRhcC5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANCxWwHKKOzwCtsbZUhhzQjXcyKHA7zrl8UqoCyu7haKzrEmI7udl7B6L+zxgnmVRz4zsw1PJsVYUt9zG6ABC+P7Xtx46Tk/h5gO6hWL4XBzFUuKwsMRZ0RB0sAv6iQtz6TCyH47OBSJSN24h7e/viUQ0ZtKYsJo/r8BHrnoiJk1AgMBAAGjggGtMIIBqTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NlcnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L3N0YXJmaWVsZGlzc3VpbmcuY3JsME8GA1UdIARIMEYwRAYLYIZIAYb4RQEHFwMwNTAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MIGGBggrBgEFBQcBAQR6MHgwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnN0YXJmaWVsZHRlY2guY29tMEsGCCsGAQUFBzAChj9odHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2ZfaXNzdWluZy5jcnQwHQYDVR0OBBYEFMcfOhkD6X5rEFFGmj1aV4Rg7Nr9MB8GA1UdIwQYMBaAFKxV3rfqE+v8mGjiU2Ae8SU+jO7nMA0GCSqGSIb3DQEBBQUAA4GBAB0qT6gCXzgWua2P9/CPqsbXztwJAMPVx2zyAVYuZwgThsEmg53EhpqhUFz6DssNFzIxGT8vMrOMJs0hgndBTtWVfdJbrhbgtdc7/Zp10WO/6ioX3lIzJq+un2MA9Rdwk3QQyHCH9baYgHbcPEOj3N+dk2nzCzK34IbPpjYzE7H0</ds:X509Certificate>
+    </ds:X509Data>
+</ds:KeyInfo>
diff --git a/xmltoolingtest/data/KeyInfo2.xml b/xmltoolingtest/data/KeyInfo2.xml
new file mode 100644 (file)
index 0000000..f479a3f
--- /dev/null
@@ -0,0 +1,10 @@
+<ds:KeyInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.w3.org/2000/09/xmldsig# ../../schemas/xmldsig-core-schema.xsd"
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+    <ds:RetrievalMethod URI="#foo"/>
+    <ds:SPKIData>
+        <ds:SPKISexp>AQAB</ds:SPKISexp>
+        <ds:SPKISexp>AQAB</ds:SPKISexp>
+        <foo:Bar xmlns:foo="urn:x-dummy"/>
+    </ds:SPKIData>
+</ds:KeyInfo>
diff --git a/xmltoolingtest/data/KeyInfo3.xml b/xmltoolingtest/data/KeyInfo3.xml
new file mode 100644 (file)
index 0000000..745e811
--- /dev/null
@@ -0,0 +1,6 @@
+<ds:KeyInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.w3.org/2000/09/xmldsig# ../../schemas/xmldsig-core-schema.xsd"
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+    <ds:RetrievalMethod URI="#foo"/>
+    <ds:X509Data/>
+</ds:KeyInfo>
index d63fccb..20450a4 100644 (file)
@@ -38,7 +38,9 @@ public:
         nonvalidatingPool = new ParserPool();\r
         if (getenv("XMLTOOLINGTEST_DATA"))\r
             data_path=std::string(getenv("XMLTOOLINGTEST_DATA")) + "/";\r
-        return true;\r
+        std::string catpath=data_path + "catalog.xml";\r
+        auto_ptr_XMLCh temp(catpath.c_str());\r
+        return validatingPool->loadCatalog(temp.get());\r
     }\r
     bool tearDownWorld() {\r
         delete validatingPool;\r
@@ -72,12 +74,6 @@ public:
         XMLObjectBuilder::deregisterDefaultBuilder();\r
     }\r
 \r
-    void testCatalog(void) {\r
-        std::string path=data_path + "catalog.xml";\r
-        auto_ptr_XMLCh temp(path.c_str());\r
-        TS_ASSERT(validatingPool->loadCatalog(temp.get()));\r
-    }\r
-\r
     void testUnknown() {\r
         ifstream fs("../xmltoolingtest/data/SimpleXMLObjectWithChildren.xml");\r
         DOMDocument* doc=nonvalidatingPool->parse(fs);\r