[xmlsec] path to libxmlsec
Alexandre Kalendarev
akalend at mail.ru
Sun Feb 11 23:42:21 PST 2007
Hi all,
Rob>Also if you make sure that your template code is good, you should
Rob>probably submit the patches to him as well (that code really doesnt
Rob>belong in the PHP extension but rather within the xmlsec lib itself).
I and Rob Richardson make patch for template.c. The new php_xmlsec extention (beta-version) use the new version of template.c.
Thanks.
Alexandre
-------------- next part --------------
Index: include/xmlsec/soap.h
===================================================================
--- include/xmlsec/soap.h (revision 974)
+++ include/xmlsec/soap.h (working copy)
@@ -27,6 +27,8 @@
*
**********************************************************************/
XMLSEC_EXPORT xmlNodePtr xmlSecSoap11CreateEnvelope (xmlDocPtr doc);
+XMLSEC_EXPORT xmlNodePtr xmlSecSoap11CreateEnvelopeNsPref (xmlDocPtr doc,
+ const xmlChar* nsName);
XMLSEC_EXPORT xmlNodePtr xmlSecSoap11EnsureHeader (xmlNodePtr envNode);
XMLSEC_EXPORT xmlNodePtr xmlSecSoap11AddBodyEntry (xmlNodePtr envNode,
xmlNodePtr entryNode);
Index: include/xmlsec/templates.h
===================================================================
--- include/xmlsec/templates.h (revision 974)
+++ include/xmlsec/templates.h (working copy)
@@ -41,6 +41,12 @@
const xmlChar *id,
const xmlChar *uri,
const xmlChar *type);
+XMLSEC_EXPORT xmlNodePtr xmlSecTmplSignatureAddReferenceNs (xmlNodePtr signNode,
+ xmlSecTransformId digestMethodId,
+ const xmlChar *id,
+ const xmlChar *uri,
+ const xmlChar *type,
+ xmlNsPtr ns);
XMLSEC_EXPORT xmlNodePtr xmlSecTmplSignatureAddObject (xmlNodePtr signNode,
const xmlChar *id,
const xmlChar *mimeType,
@@ -50,6 +56,9 @@
XMLSEC_EXPORT xmlNodePtr xmlSecTmplReferenceAddTransform (xmlNodePtr referenceNode,
xmlSecTransformId transformId);
+XMLSEC_EXPORT xmlNodePtr xmlSecTmplReferenceAddTransformNs (xmlNodePtr referenceNode,
+ xmlSecTransformId transformId,
+ xmlNsPtr ns);
XMLSEC_EXPORT xmlNodePtr xmlSecTmplObjectAddSignProperties (xmlNodePtr objectNode,
const xmlChar *id,
const xmlChar *target);
@@ -72,6 +81,13 @@
const xmlChar *type,
const xmlChar *mimeType,
const xmlChar *encoding);
+XMLSEC_EXPORT xmlNodePtr xmlSecTmplEncDataCreateNsPref (xmlDocPtr doc,
+ xmlSecTransformId encMethodId,
+ const xmlChar *id,
+ const xmlChar *type,
+ const xmlChar *mimeType,
+ const xmlChar *encoding,
+ const xmlChar *nsPrefix);
XMLSEC_EXPORT xmlNodePtr xmlSecTmplEncDataEnsureKeyInfo (xmlNodePtr encNode,
const xmlChar *id);
XMLSEC_EXPORT xmlNodePtr xmlSecTmplEncDataEnsureEncProperties (xmlNodePtr encNode,
@@ -115,6 +131,12 @@
const xmlChar *id,
const xmlChar *type,
const xmlChar *recipient);
+XMLSEC_EXPORT xmlNodePtr xmlSecTmplKeyInfoAddEncryptedKeyNs (xmlNodePtr keyInfoNode,
+ xmlSecTransformId encMethodId,
+ const xmlChar *id,
+ const xmlChar *type,
+ const xmlChar *recipient,
+ xmlNsPtr ns);
/***********************************************************************
*
Index: src/soap.c
===================================================================
--- src/soap.c (revision 974)
+++ src/soap.c (working copy)
@@ -52,6 +52,35 @@
*/
xmlNodePtr
xmlSecSoap11CreateEnvelope(xmlDocPtr doc) {
+ return xmlSecSoap11CreateEnvelopeNsPref(doc, NULL);
+}
+
+/**
+ * xmlSecSoap11CreateEnvelopeNsPref:
+ * @doc: the parent doc (might be NULL).
+ * @nsPrefix: the namespace prefix for the soap envelope (e.g. "soap"), or NULL
+ *
+ * Creates a new SOAP Envelope node. Caller is responsible for
+ * adding the returned node to the XML document.
+ *
+ * XML Schema (http://schemas.xmlsoap.org/soap/envelope/):
+ *
+ * <xs:element name="Envelope" type="tns:Envelope"/>
+ * <xs:complexType name="Envelope">
+ * <xs:sequence>
+ * <xs:element ref="tns:Header" minOccurs="0"/>
+ * <xs:element ref="tns:Body" minOccurs="1"/>
+ * <xs:any namespace="##other" minOccurs="0"
+ * maxOccurs="unbounded" processContents="lax"/>
+ * </xs:sequence>
+ * <xs:anyAttribute namespace="##other" processContents="lax"/>
+ * </xs:complexType>
+ *
+ * Returns pointer to newly created <soap:Envelope> node or NULL
+ * if an error occurs.
+ */
+xmlNodePtr
+xmlSecSoap11CreateEnvelopeNsPref(xmlDocPtr doc, const xmlChar* nsName) {
xmlNodePtr envNode;
xmlNodePtr bodyNode;
xmlNsPtr ns;
@@ -67,8 +96,7 @@
xmlSecErrorsSafeString(xmlSecNodeEnvelope));
return(NULL);
}
-
- ns = xmlNewNs(envNode, xmlSecSoap11Ns, NULL) ;
+ ns = xmlNewNs(envNode, xmlSecSoap11Ns, nsName);
if(ns == NULL) {
xmlSecError(XMLSEC_ERRORS_HERE,
NULL,
Index: src/templates.c
===================================================================
--- src/templates.c (revision 974)
+++ src/templates.c (working copy)
@@ -29,8 +29,16 @@
const xmlChar *id,
const xmlChar *uri,
const xmlChar *type);
+static xmlNodePtr xmlSecTmplAddReferenceNs (xmlNodePtr parentNode,
+ xmlSecTransformId digestMethodId,
+ const xmlChar *id,
+ const xmlChar *uri,
+ const xmlChar *type,
+ xmlNsPtr ns);
static int xmlSecTmplPrepareEncData (xmlNodePtr parentNode,
xmlSecTransformId encMethodId);
+static int xmlSecTmplPrepareEncDataNs (xmlNodePtr parentNode,
+ xmlSecTransformId encMethodId, xmlNsPtr ns);
static int xmlSecTmplNodeWriteNsList (xmlNodePtr parentNode,
const xmlChar** namespaces);
/**************************************************************************
@@ -272,6 +280,29 @@
xmlNodePtr
xmlSecTmplSignatureAddReference(xmlNodePtr signNode, xmlSecTransformId digestMethodId,
const xmlChar *id, const xmlChar *uri, const xmlChar *type) {
+ return xmlSecTmplSignatureAddReferenceNs(signNode, digestMethodId,
+ id, uri, type, NULL);
+}
+
+/**
+ * xmlSecTmplSignatureAddReferenceNs:
+ * @signNode: the pointer to <dsig:Signature/> node.
+ * @digestMethodId: the reference digest method.
+ * @id: the node id (may be NULL).
+ * @uri: the reference node uri (may be NULL).
+ * @type: the reference node type (may be NULL).
+ * @ns: the pointer to the signature namespace (may be NULL).
+ *
+ * Adds <dsig:Reference/> node with given URI (@uri), Id (@id) and
+ * Type (@type) attributes and the required children <dsig:DigestMethod/> and
+ * <dsig:DigestValue/> to the <dsig:SignedInfo/> child of @signNode.
+ *
+ * Returns the pointer to newly created <dsig:Reference/> node or NULL
+ * if an error occurs.
+ */
+xmlNodePtr
+xmlSecTmplSignatureAddReferenceNs(xmlNodePtr signNode, xmlSecTransformId digestMethodId,
+ const xmlChar *id, const xmlChar *uri, const xmlChar *type, xmlNsPtr ns) {
xmlNodePtr signedInfoNode;
xmlSecAssert2(signNode != NULL, NULL);
@@ -288,21 +319,32 @@
return(NULL);
}
- return(xmlSecTmplAddReference(signedInfoNode, digestMethodId, id, uri, type));
+ return(xmlSecTmplAddReferenceNs(signedInfoNode, digestMethodId, id, uri, type, ns));
}
static xmlNodePtr
xmlSecTmplAddReference(xmlNodePtr parentNode, xmlSecTransformId digestMethodId,
- const xmlChar *id, const xmlChar *uri, const xmlChar *type) {
+ const xmlChar *id, const xmlChar *uri, const xmlChar *type) {
+ return xmlSecTmplAddReferenceNs(parentNode, digestMethodId,
+ id, uri, type, NULL);
+}
+
+static xmlNodePtr
+xmlSecTmplAddReferenceNs(xmlNodePtr parentNode, xmlSecTransformId digestMethodId,
+ const xmlChar *id, const xmlChar *uri, const xmlChar *type, xmlNsPtr ns) {
xmlNodePtr res;
xmlNodePtr cur;
-
+ const xmlChar *nsuri = NULL;
+
xmlSecAssert2(parentNode != NULL, NULL);
xmlSecAssert2(digestMethodId != NULL, NULL);
xmlSecAssert2(digestMethodId->href != NULL, NULL);
/* add Reference node */
- res = xmlSecAddChild(parentNode, xmlSecNodeReference, xmlSecDSigNs);
+ if (ns == NULL) {
+ nsuri = xmlSecDSigNs;
+ }
+ res = xmlSecAddChild(parentNode, xmlSecNodeReference, nsuri);
if(res == NULL) {
xmlSecError(XMLSEC_ERRORS_HERE,
NULL,
@@ -312,6 +354,9 @@
xmlSecErrorsSafeString(xmlSecNodeReference));
return(NULL);
}
+ if (ns != NULL) {
+ xmlSetNs(res,ns);
+ }
/* set Reference node attributes */
if(id != NULL) {
@@ -325,7 +370,7 @@
}
/* add DigestMethod node and set algorithm */
- cur = xmlSecAddChild(res, xmlSecNodeDigestMethod, xmlSecDSigNs);
+ cur = xmlSecAddChild(res, xmlSecNodeDigestMethod, nsuri);
if(cur == NULL) {
xmlSecError(XMLSEC_ERRORS_HERE,
NULL,
@@ -337,6 +382,10 @@
xmlFreeNode(res);
return(NULL);
}
+ if (ns != NULL) {
+ xmlSetNs(cur,ns);
+ }
+
if(xmlSetProp(cur, xmlSecAttrAlgorithm, digestMethodId->href) == NULL) {
xmlSecError(XMLSEC_ERRORS_HERE,
NULL,
@@ -351,7 +400,7 @@
}
/* add DigestValue node */
- cur = xmlSecAddChild(res, xmlSecNodeDigestValue, xmlSecDSigNs);
+ cur = xmlSecAddChild(res, xmlSecNodeDigestValue, nsuri);
if(cur == NULL) {
xmlSecError(XMLSEC_ERRORS_HERE,
NULL,
@@ -363,7 +412,10 @@
xmlFreeNode(res);
return(NULL);
}
-
+ if (ns != NULL) {
+ xmlSetNs(cur,ns);
+ }
+
return(res);
}
@@ -472,6 +524,22 @@
*/
xmlNodePtr
xmlSecTmplReferenceAddTransform(xmlNodePtr referenceNode, xmlSecTransformId transformId) {
+ return xmlSecTmplReferenceAddTransformNs(referenceNode, transformId, NULL);
+}
+
+/**
+ * xmlSecTmplReferenceAddTransformNs:
+ * @referenceNode: the pointer to <dsig:Reference/> node.
+ * @transformId: the transform method id.
+ * @ns: the pointer to the dsig namespace (may be NULL).
+ *
+ * Adds <dsig:Transform/> node to the <dsig:Reference/> node @referenceNode.
+ *
+ * Returns the pointer to newly created <dsig:Transform/> node or NULL if an
+ * error occurs.
+ */
+xmlNodePtr
+xmlSecTmplReferenceAddTransformNs(xmlNodePtr referenceNode, xmlSecTransformId transformId, xmlNsPtr ns) {
xmlNodePtr transformsNode;
xmlNodePtr res;
@@ -482,47 +550,55 @@
/* do we need to create Transforms node first */
transformsNode = xmlSecFindChild(referenceNode, xmlSecNodeTransforms, xmlSecDSigNs);
if(transformsNode == NULL) {
- xmlNodePtr tmp;
-
- tmp = xmlSecGetNextElementNode(referenceNode->children);
- if(tmp == NULL) {
- transformsNode = xmlSecAddChild(referenceNode, xmlSecNodeTransforms, xmlSecDSigNs);
+ xmlNodePtr tmp = xmlSecGetNextElementNode(referenceNode->children);
+ if(tmp == NULL) {
+ transformsNode = xmlSecAddChild(referenceNode, xmlSecNodeTransforms, xmlSecDSigNs);
+ } else {
+ transformsNode = xmlSecAddPrevSibling(tmp, xmlSecNodeTransforms, xmlSecDSigNs);
+ }
+ if(transformsNode == NULL) {
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlSecAddChild or xmlSecAddPrevSibling",
+ XMLSEC_ERRORS_R_XMLSEC_FAILED,
+ "node=%s",
+ xmlSecErrorsSafeString(xmlSecNodeTransforms));
+ return(NULL);
+ }
+ if (ns != NULL) {
+ xmlSetNs(transformsNode,ns);
+ }
+ }
+
+ if (ns == NULL) {
+ res = xmlSecAddChild(transformsNode, xmlSecNodeTransform, xmlSecDSigNs);
} else {
- transformsNode = xmlSecAddPrevSibling(tmp, xmlSecNodeTransforms, xmlSecDSigNs);
- }
- if(transformsNode == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlSecAddChild or xmlSecAddPrevSibling",
- XMLSEC_ERRORS_R_XMLSEC_FAILED,
- "node=%s",
- xmlSecErrorsSafeString(xmlSecNodeTransforms));
- return(NULL);
+ res = xmlSecAddChild(transformsNode, xmlSecNodeTransform, NULL);
}
- }
-
- res = xmlSecAddChild(transformsNode, xmlSecNodeTransform, xmlSecDSigNs);
if(res == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlSecAddChild",
- XMLSEC_ERRORS_R_XMLSEC_FAILED,
- "node=%s",
- xmlSecErrorsSafeString(xmlSecNodeTransform));
- return(NULL);
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlSecAddChild",
+ XMLSEC_ERRORS_R_XMLSEC_FAILED,
+ "node=%s",
+ xmlSecErrorsSafeString(xmlSecNodeTransform));
+ return(NULL);
}
+ if (ns != NULL) {
+ xmlSetNs(res,ns);
+ }
if(xmlSetProp(res, xmlSecAttrAlgorithm, transformId->href) == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlSetProp",
- XMLSEC_ERRORS_R_XML_FAILED,
- "name=%s,value=%s",
- xmlSecErrorsSafeString(xmlSecAttrAlgorithm),
- xmlSecErrorsSafeString(transformId->href));
- xmlUnlinkNode(res);
- xmlFreeNode(res);
- return(NULL);
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlSetProp",
+ XMLSEC_ERRORS_R_XML_FAILED,
+ "name=%s,value=%s",
+ xmlSecErrorsSafeString(xmlSecAttrAlgorithm),
+ xmlSecErrorsSafeString(transformId->href));
+ xmlUnlinkNode(res);
+ xmlFreeNode(res);
+ return(NULL);
}
return(res);
@@ -642,6 +718,31 @@
xmlSecTmplEncDataCreate(xmlDocPtr doc, xmlSecTransformId encMethodId,
const xmlChar *id, const xmlChar *type,
const xmlChar *mimeType, const xmlChar *encoding) {
+ return xmlSecTmplEncDataCreateNsPref(doc, encMethodId, id, type,
+ mimeType, encoding, NULL);
+}
+
+/**
+ * xmlSecTmplEncDataCreateNsPref:
+ * @doc: the pointer to signature document or NULL; in the later
+ * case, application must later call @xmlSetTreeDoc to ensure
+ * that all the children nodes have correct pointer to XML document.
+ * @encMethodId: the encryption method (may be NULL).
+ * @id: the Id attribute (optional).
+ * @type: the Type attribute (optional)
+ * @mimeType: the MimeType attribute (optional)
+ * @encoding: the Encoding attribute (optional)
+ * @nsPrefix: the namespace prefix for the signature element (e.g. "enc"), or NULL
+ *
+ * Creates new <enc:EncryptedData /> node for encryption template.
+ *
+ * Returns the pointer newly created <enc:EncryptedData/> node or NULL
+ * if an error occurs.
+ */
+xmlNodePtr
+xmlSecTmplEncDataCreateNsPref(xmlDocPtr doc, xmlSecTransformId encMethodId,
+ const xmlChar *id, const xmlChar *type,
+ const xmlChar *mimeType, const xmlChar *encoding, const xmlChar *nsPrefix) {
xmlNodePtr encNode;
xmlNsPtr ns;
@@ -655,16 +756,20 @@
xmlSecErrorsSafeString(xmlSecNodeEncryptedData));
return(NULL);
}
-
- ns = xmlNewNs(encNode, xmlSecEncNs, NULL);
+
+ if (nsPrefix == NULL)
+ ns = xmlNewNs(encNode, xmlSecEncNs, NULL);
+ else
+ ns = xmlNewNs(encNode, xmlSecEncNs, nsPrefix);
+
if(ns == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlNewNs",
- XMLSEC_ERRORS_R_XML_FAILED,
- "ns=%s",
- xmlSecErrorsSafeString(xmlSecEncNs));
- return(NULL);
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlNewNs",
+ XMLSEC_ERRORS_R_XML_FAILED,
+ "ns=%s",
+ xmlSecErrorsSafeString(xmlSecEncNs));
+ return(NULL);
}
xmlSetNs(encNode, ns);
@@ -688,52 +793,69 @@
return(encNode);
}
-static int
-xmlSecTmplPrepareEncData(xmlNodePtr parentNode, xmlSecTransformId encMethodId) {
+static int
+xmlSecTmplPrepareEncDataNs(xmlNodePtr parentNode, xmlSecTransformId encMethodId, xmlNsPtr ns) {
xmlNodePtr cur;
-
+ const xmlChar *nsuri=NULL;
+
xmlSecAssert2(parentNode != NULL, -1);
xmlSecAssert2((encMethodId == NULL) || (encMethodId->href != NULL), -1);
-
+
+ if (ns == NULL) {
+ nsuri = xmlSecEncNs;
+ }
+
/* add EncryptionMethod node if requested */
if(encMethodId != NULL) {
- cur = xmlSecAddChild(parentNode, xmlSecNodeEncryptionMethod, xmlSecEncNs);
- if(cur == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlSecAddChild",
- XMLSEC_ERRORS_R_XMLSEC_FAILED,
- "node=%s",
- xmlSecErrorsSafeString(xmlSecNodeEncryptionMethod));
- return(-1);
- }
- if(xmlSetProp(cur, xmlSecAttrAlgorithm, encMethodId->href) == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlSetProp",
- XMLSEC_ERRORS_R_XML_FAILED,
- "name=%s,value=%s",
- xmlSecErrorsSafeString(xmlSecAttrAlgorithm),
- xmlSecErrorsSafeString(encMethodId->href));
- return(-1);
- }
+ cur = xmlSecAddChild(parentNode, xmlSecNodeEncryptionMethod, nsuri);
+ if(cur == NULL) {
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlSecAddChild",
+ XMLSEC_ERRORS_R_XMLSEC_FAILED,
+ "node=%s",
+ xmlSecErrorsSafeString(xmlSecNodeEncryptionMethod));
+ return(-1);
+ }
+ if (ns != NULL) {
+ xmlSetNs(cur, ns);
+ }
+
+ if(xmlSetProp(cur, xmlSecAttrAlgorithm, encMethodId->href) == NULL) {
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlSetProp",
+ XMLSEC_ERRORS_R_XML_FAILED,
+ "name=%s,value=%s",
+ xmlSecErrorsSafeString(xmlSecAttrAlgorithm),
+ xmlSecErrorsSafeString(encMethodId->href));
+ return(-1);
+ }
}
-
+
/* and CipherData node */
- cur = xmlSecAddChild(parentNode, xmlSecNodeCipherData, xmlSecEncNs);
+ cur = xmlSecAddChild(parentNode, xmlSecNodeCipherData, nsuri);
+
if(cur == NULL) {
- xmlSecError(XMLSEC_ERRORS_HERE,
- NULL,
- "xmlSecAddChild",
- XMLSEC_ERRORS_R_XMLSEC_FAILED,
- "node=%s",
- xmlSecErrorsSafeString(xmlSecNodeCipherData));
- return(-1);
+ xmlSecError(XMLSEC_ERRORS_HERE,
+ NULL,
+ "xmlSecAddChild",
+ XMLSEC_ERRORS_R_XMLSEC_FAILED,
+ "node=%s",
+ xmlSecErrorsSafeString(xmlSecNodeCipherData));
+ return(-1);
}
-
+ if (ns != NULL) {
+ xmlSetNs(cur, ns);
+ }
+
return(0);
}
+static int
+xmlSecTmplPrepareEncData(xmlNodePtr parentNode, xmlSecTransformId encMethodId) {
+ return xmlSecTmplPrepareEncDataNs(parentNode, encMethodId, NULL);
+}
/**
* xmlSecTmplEncDataEnsureKeyInfo:
@@ -1401,12 +1523,38 @@
xmlNodePtr
xmlSecTmplKeyInfoAddEncryptedKey(xmlNodePtr keyInfoNode, xmlSecTransformId encMethodId,
const xmlChar* id, const xmlChar* type, const xmlChar* recipient) {
+ return xmlSecTmplKeyInfoAddEncryptedKeyNs(keyInfoNode, encMethodId,
+ id, type, recipient, NULL);
+}
+
+/**
+ * xmlSecTmplKeyInfoAddEncryptedKeyNs:
+ * @keyInfoNode: the pointer to <dsig:KeyInfo/> node.
+ * @encMethodId: the encryption method (optional).
+ * @id: the Id attribute (optional).
+ * @type: the Type attribute (optional).
+ * @recipient: the Recipient attribute (optional).
+ * @ns: the pointer to specific enc namespace (optional).
+ *
+ * Adds <enc:EncryptedKey/> node with given attributes to
+ * the <dsig:KeyInfo/> node @keyInfoNode.
+ *
+ * Returns the pointer to the newly created <enc:EncryptedKey/> node or
+ * NULL if an error occurs.
+ */
+xmlNodePtr
+xmlSecTmplKeyInfoAddEncryptedKeyNs(xmlNodePtr keyInfoNode, xmlSecTransformId encMethodId,
+ const xmlChar* id, const xmlChar* type, const xmlChar* recipient, xmlNsPtr ns) {
xmlNodePtr encKeyNode;
xmlSecAssert2(keyInfoNode != NULL, NULL);
/* we allow multiple encrypted key elements */
- encKeyNode = xmlSecAddChild(keyInfoNode, xmlSecNodeEncryptedKey, xmlSecEncNs);
+ if (ns != NULL) {
+ encKeyNode = xmlSecAddChild(keyInfoNode, xmlSecNodeEncryptedKey, xmlSecEncNs);
+ } else {
+ encKeyNode = xmlSecAddChild(keyInfoNode, xmlSecNodeEncryptedKey, NULL);
+ }
if(encKeyNode == NULL) {
xmlSecError(XMLSEC_ERRORS_HERE,
NULL,
@@ -1416,6 +1564,9 @@
xmlSecErrorsSafeString(xmlSecNodeEncryptedKey));
return(NULL);
}
+ if (ns != NULL) {
+ xmlSetNs(encKeyNode,ns);
+ }
if(id != NULL) {
xmlSetProp(encKeyNode, xmlSecAttrId, id);
More information about the xmlsec
mailing list