- string xmlbuf;
- XMLHelper::serialize(rootElement, xmlbuf);
- unsigned int len=0;
- XMLByte* out=Base64::encode(reinterpret_cast<const XMLByte*>(xmlbuf.data()),xmlbuf.size(),&len);
- if (out) {
- xmlbuf.erase();
- xmlbuf.append(reinterpret_cast<char*>(out),len);
- XMLString::release(&out);
+ // Serialize the message.
+ TemplateEngine::TemplateParameters pmap;
+ string& msg = pmap.m_map[(request ? "SAMLRequest" : "SAMLResponse")];
+ XMLHelper::serialize(rootElement, msg);
+ log.debug("marshalled message:\n%s", msg.c_str());
+
+ // SimpleSign.
+ if (credential && m_simple) {
+ log.debug("applying simple signature to message data");
+ string input = (request ? "SAMLRequest=" : "SAMLResponse=") + msg;
+ if (relayState && *relayState)
+ input = input + "&RelayState=" + relayState;
+ if (!signatureAlg)
+ signatureAlg = DSIGConstants::s_unicodeStrURIRSA_SHA1;
+ auto_ptr_char alg(signatureAlg);
+ pmap.m_map["SigAlg"] = alg.get();
+ input = input + "&SigAlg=" + alg.get();
+
+ char sigbuf[1024];
+ 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*)nullptr), kstring);
+ xsecsize_t 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);
+#ifdef OPENSAML_XERCESC_HAS_XMLBYTE_RELEASE
+ XMLString::release(&out);
+#else
+ XMLString::release((char**)&out);
+#endif
+ }