Multi-line svn commit, see body.
authorScott Cantor <cantor.2@osu.edu>
Mon, 19 Nov 2007 05:05:16 +0000 (05:05 +0000)
committerScott Cantor <cantor.2@osu.edu>
Mon, 19 Nov 2007 05:05:16 +0000 (05:05 +0000)
KeyInfo should be base64-decoded in simple sign rule.
Add encoded KeyInfo to POST simple-sign binding.

saml/binding/impl/SimpleSigningRule.cpp
saml/saml2/binding/impl/SAML2POSTEncoder.cpp

index bca976d..c8cbf5f 100644 (file)
@@ -178,17 +178,24 @@ void SimpleSigningRule::evaluate(const XMLObject& message, const GenericRequest*
     KeyInfo* keyInfo=NULL;
     pch = request->getParameter("KeyInfo");
     if (pch) {
     KeyInfo* keyInfo=NULL;
     pch = request->getParameter("KeyInfo");
     if (pch) {
-        try {
-            istringstream kstrm(pch);
-            DOMDocument* doc = XMLToolingConfig::getConfig().getParser().parse(kstrm);
-            XercesJanitor<DOMDocument> janitor(doc);
-            XMLObject* kxml = XMLObjectBuilder::buildOneFromElement(doc->getDocumentElement(), true);
-            janitor.release();
-            if (!(keyInfo=dynamic_cast<KeyInfo*>(kxml)))
-                delete kxml;
+        unsigned int x;
+        XMLByte* decoded=Base64::decode(reinterpret_cast<const XMLByte*>(pch),&x);
+        if (decoded) {
+            try {
+                istringstream kstrm(pch);
+                DOMDocument* doc = XMLToolingConfig::getConfig().getParser().parse(kstrm);
+                XercesJanitor<DOMDocument> janitor(doc);
+                XMLObject* kxml = XMLObjectBuilder::buildOneFromElement(doc->getDocumentElement(), true);
+                janitor.release();
+                if (!(keyInfo=dynamic_cast<KeyInfo*>(kxml)))
+                    delete kxml;
+            }
+            catch (XMLToolingException& ex) {
+                log.warn("Failed to load KeyInfo from message: %s", ex.what());
+            }
         }
         }
-        catch (XMLToolingException& ex) {
-            log.warn("Failed to load KeyInfo from message: %s", ex.what());
+        else {
+            log.warn("Failed to load KeyInfo from message: Unable to decode base64-encoded KeyInfo.");
         }
     }
     
         }
     }
     
index 65ccb38..5820150 100644 (file)
@@ -175,6 +175,19 @@ long SAML2POSTEncoder::encode(
         memset(sigbuf,0,sizeof(sigbuf));
         Signature::createRawSignature(credential->getPrivateKey(), signatureAlg, input.c_str(), input.length(), sigbuf, sizeof(sigbuf)-1);
         pmap.m_map["Signature"] = sigbuf;
         memset(sigbuf,0,sizeof(sigbuf));
         Signature::createRawSignature(credential->getPrivateKey(), signatureAlg, input.c_str(), input.length(), sigbuf, sizeof(sigbuf)-1);
         pmap.m_map["Signature"] = sigbuf;
+
+        auto_ptr<KeyInfo> keyInfo(credential->getKeyInfo());
+        if (keyInfo.get()) {
+            string& kstring = pmap.m_map["KeyInfo"];
+            XMLHelper::serialize(keyInfo->marshall((DOMDocument*)NULL), kstring);
+            unsigned int len=0;
+            XMLByte* out=Base64::encode(reinterpret_cast<const XMLByte*>(kstring.data()),kstring.size(),&len);
+            if (!out)
+                throw BindingException("Base64 encoding of XML failed.");
+            kstring.erase();
+            kstring.append(reinterpret_cast<char*>(out),len);
+            XMLString::release(&out);
+        }
     }
     
     // Base64 the message.
     }
     
     // Base64 the message.