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.");
}
}
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.