Custom KeyInfo support in signature creation.
[shibboleth/cpp-xmltooling.git] / xmltooling / signature / impl / XMLSecSignatureImpl.cpp
index bf169bb..2d97b94 100644 (file)
@@ -57,6 +57,7 @@ namespace xmlsignature {
         \r
         void releaseDOM();\r
         XMLObject* clone() const;\r
+        Signature* cloneSignature() const;\r
 \r
         DOMElement* marshall(DOMDocument* document=NULL, MarshallingContext* ctx=NULL) const;\r
         DOMElement* marshall(DOMElement* parentElement, MarshallingContext* ctx=NULL) const;\r
@@ -109,6 +110,11 @@ void XMLSecSignatureImpl::releaseDOM()
 \r
 XMLObject* XMLSecSignatureImpl::clone() const\r
 {\r
+    return cloneSignature();\r
+}\r
+\r
+Signature* XMLSecSignatureImpl::cloneSignature() const\r
+{\r
     XMLSecSignatureImpl* ret=new XMLSecSignatureImpl();\r
 \r
     ret->m_c14n=XMLString::replicate(m_c14n);\r
@@ -142,10 +148,17 @@ void XMLSecSignatureImpl::sign(const SigningContext& ctx)
     try {\r
         log.debug("creating signature content");\r
         ctx.createSignature(m_signature);\r
-        const std::vector<XSECCryptoX509*>& certs=ctx.getX509Certificates();\r
-        if (!certs.empty()) {\r
+        const std::vector<XSECCryptoX509*>* certs=ctx.getX509Certificates();\r
+        if (certs && !certs->empty()) {\r
             DSIGKeyInfoX509* x509Data=m_signature->appendX509Data();\r
-            for_each(certs.begin(),certs.end(),bind1st(_addcert(),x509Data));\r
+            for_each(certs->begin(),certs->end(),bind1st(_addcert(),x509Data));\r
+        }\r
+        else {\r
+            auto_ptr<KeyInfo> keyInfo(ctx.getKeyInfo());\r
+            if (keyInfo.get()) {\r
+                DOMElement* domElement=keyInfo->marshall(m_signature->getParentDocument());\r
+                getDOM()->appendChild(domElement);\r
+            }\r
         }\r
         \r
         log.debug("computing signature");\r