| 
							
							
							
						 |  |  | @@ -1,306 +1,58 @@ | 
		
	
		
			
				|  |  |  |  | #include <time.h> | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #include "xades.h" | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define xmlXadesAssert2(p, ret) \ | 
		
	
		
			
				|  |  |  |  |   xmlSecAssert2(p, ret) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define xmlXadesNodeNotFoundError(errorFunction, startNode, targetNodeName, errorObject) \ | 
		
	
		
			
				|  |  |  |  |   xmlSecNodeNotFoundError(errorFunction, startNode, targetNodeName, errorObject) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define xmlXadesXmlError2(errorFunction, errorObject, msg, param) \ | 
		
	
		
			
				|  |  |  |  |   xmlSecXmlError2(errorFunction, errorObject, msg, param) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define xmlXadesErrorsSafeString(msg) \ | 
		
	
		
			
				|  |  |  |  |   xmlSecErrorsSafeString(msg) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define xmlXadesInternalError(errorFunction, errorObject) \ | 
		
	
		
			
				|  |  |  |  |   xmlSecInternalError(errorFunction, errorObject) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | #define xmlXadesNodeAlreadyPresentError(parent, nodeName, errObject) \ | 
		
	
		
			
				|  |  |  |  |   xmlSecNodeAlreadyPresentError(parent, nodeName, errObject) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | xmlNodePtr | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplQualifyingPropertiesCreateNsPref(xmlDocPtr doc, const xmlChar* id, const xmlChar* nsPrefix) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr qualifyingPropertiesNode; | 
		
	
		
			
				|  |  |  |  | int | 
		
	
		
			
				|  |  |  |  | xmlFachoAppSign(xmlDocPtr doc, | 
		
	
		
			
				|  |  |  |  |                 xmlSecTransformId hashMethodId) { | 
		
	
		
			
				|  |  |  |  |   xmlXadesAssert2(doc != NULL, NULL); | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr cur; | 
		
	
		
			
				|  |  |  |  |   xmlNsPtr ns; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // crear nodo | 
		
	
		
			
				|  |  |  |  |   qualifyingPropertiesNode = xmlNewDocNode(doc, NULL, xmlXadesNodeQualifyingProperties, NULL); | 
		
	
		
			
				|  |  |  |  |   if (qualifyingPropertiesNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesXmlError2("xmlNewDocNode", NULL, "node=%s", xmlXadesErrorsSafeString(xmlXadesNodeQualifyingProperties)); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // crear namespace y asignar | 
		
	
		
			
				|  |  |  |  |   ns = xmlNewNs(qualifyingPropertiesNode, xmlXadesDSigNs, nsPrefix); | 
		
	
		
			
				|  |  |  |  |   if (ns == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesXmlError2("xmlNewNs", NULL, | 
		
	
		
			
				|  |  |  |  |                    "ns=%s", xmlXadesErrorsSafeString(xmlXadesDSigNs)); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(qualifyingPropertiesNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   xmlSetNs(qualifyingPropertiesNode, ns); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (id != NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlSetProp(qualifyingPropertiesNode, BAD_CAST "id", id); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // add SignedProperties | 
		
	
		
			
				|  |  |  |  |   cur = xmlSecAddChild(qualifyingPropertiesNode, xmlXadesNodeSignedProperties, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (cur == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSignedProperties)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(qualifyingPropertiesNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return (qualifyingPropertiesNode); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | xmlNodePtr | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplAddSignedSignatureProperties(xmlNodePtr parentNode, const xmlChar* id, struct tm* signingTime) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr cur; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr node; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr signedPropertiesNode; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   xmlXadesAssert2(parentNode != NULL, NULL); | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr signedSignaturePropertiesNode; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr signaturePolicyIdentifierNode; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr signaturePolicyIdNode; | 
		
	
		
			
				|  |  |  |  |   xmlChar* signedPropertiesId = BAD_CAST "ref1-signedprops"; | 
		
	
		
			
				|  |  |  |  |   time_t now = time(NULL); | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   signedPropertiesNode = xmlSecFindChild(parentNode, xmlXadesNodeSignedProperties, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (signedPropertiesNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesNodeNotFoundError("xmlSecFindChild", parentNode, | 
		
	
		
			
				|  |  |  |  |                               xmlXadesNodeSignedProperties, NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // add SignedSignatureProperties | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(signedPropertiesNode, xmlXadesNodeSignedSignatureProperties, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (node == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSignedSignatureProperties)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if (id != NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlSetProp(node, BAD_CAST "id", id); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // add SignigTime | 
		
	
		
			
				|  |  |  |  |   cur = xmlSecAddChild(node, xmlXadesNodeSigningTime, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   cur = xmlXadesTmplQualifyingPropertiesCreateNsPref(doc, "qualify-ref1", BAD_CAST "ds"); | 
		
	
		
			
				|  |  |  |  |   if (cur == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSigningTime)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(node); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   { | 
		
	
		
			
				|  |  |  |  |     int ret; | 
		
	
		
			
				|  |  |  |  |     char strtime[200]; | 
		
	
		
			
				|  |  |  |  |   cur = xmlXadesTmplAddSignedProperties(cur, signedPropertiesId); | 
		
	
		
			
				|  |  |  |  |   if (cur == NULL) { | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     if (strftime(strtime, sizeof(strtime), "%Y-%m-%dT%T", signingTime) == 0) { | 
		
	
		
			
				|  |  |  |  |       xmlXadesInternalError("strftime", NULL); | 
		
	
		
			
				|  |  |  |  |       xmlFreeNode(cur); | 
		
	
		
			
				|  |  |  |  |       xmlFreeNode(node); | 
		
	
		
			
				|  |  |  |  |       return(NULL); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     ret = xmlSecNodeEncodeAndSetContent(cur, BAD_CAST strtime); | 
		
	
		
			
				|  |  |  |  |     if (ret < 0) { | 
		
	
		
			
				|  |  |  |  |       xmlXadesInternalError("xmlSecNodeEncodeAndSetContent", NULL); | 
		
	
		
			
				|  |  |  |  |       xmlFreeNode(cur); | 
		
	
		
			
				|  |  |  |  |       xmlFreeNode(node); | 
		
	
		
			
				|  |  |  |  |       return(NULL); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   signedSignaturePropertiesNode = xmlXadesTmplAddSignedSignatureProperties(cur,  now); | 
		
	
		
			
				|  |  |  |  |   if (signedSignaturePropertiesNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // addSigningCertificate | 
		
	
		
			
				|  |  |  |  |   cur = xmlSecAddChild(node, xmlXadesNodeSigningCertificate, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // addSignaturePolicyIdentifier | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   signaturePolicyIdNode = xmlXadesAddChildRecursiveNs(signedSignaturePropertiesNode, BAD_CAST "SignaturePolicyIdentifier/SignaturePolicyId", xmlXadesDSigNs) | 
		
	
		
			
				|  |  |  |  |   if (signaturePolicyIdNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   cur = xmlXadesTmplAddSigPolicyId(signaturePolicyIdNode, identifier, description, hashMethodId); | 
		
	
		
			
				|  |  |  |  |   if (cur == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSigningCertificate)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(node); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   return(node); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | xmlNodePtr | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplAddSigningCertificate(xmlNodePtr signedSignaturePropertiesNode) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr node; | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   xmlXadesAssert2(signedSignaturePropertiesNode != NULL, NULL); | 
		
	
		
			
				|  |  |  |  |   if (xmlSecFindChild(signedSignaturePropertiesNode, xmlXadesNodeSigningCertificate, xmlXadesDSigNs) != NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesNodeAlreadyPresentError(signedSignaturePropertiesNode, xmlXadesNodeSigningCertificate, NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(signedSignaturePropertiesNode, xmlXadesNodeSigningCertificate, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (node == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlsecAddChild(xmlXadesNodeSigningCertificate)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return(node); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | xmlNodePtr | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplAddCert(xmlNodePtr parentNode) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr node; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   xmlXadesAssert2(parentNode != NULL, NULL); | 
		
	
		
			
				|  |  |  |  |   if (xmlSecFindChild(parentNode, xmlXadesNodeCertificate, xmlXadesDSigNs) != NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesNodeAlreadyPresentError(parentNode, xmlXadesNodeCertificate, NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(parentNode, xmlXadesNodeCertificate, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (node == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeCertificate)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return(node); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | xmlNodePtr | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplAddSignaturePolicyIdentifierSignaturePolicyId(xmlNodePtr signedSignaturePropertiesNode) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr cur; | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   xmlXadesAssert2(signedSignaturePropertiesNode != NULL, NULL); | 
		
	
		
			
				|  |  |  |  |   if (xmlSecFindChild(signedSignaturePropertiesNode, xmlXadesNodeSigningCertificate, xmlXadesDSigNs) != NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesNodeAlreadyPresentError(signedSignaturePropertiesNode, xmlXadesNodeSigningCertificate, NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   cur = xmlSecAddChild(signedSignaturePropertiesNode, xmlXadesNodeSignaturePolicyIdentifier, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   // SignaturePolicyIdentifier/SignaturePolicyId/SigPolicyHash | 
		
	
		
			
				|  |  |  |  |   cur = xmlXadesTmplAddSigPolicyHash(signaturePolicyIdNode); | 
		
	
		
			
				|  |  |  |  |   if (cur == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlsecAddChild(xmlXadesNodeSignaturePolicyIdentifier)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   cur = xmlSecAddChild(cur, xmlXadesNodeSignaturePolicyId, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   cur = xmlXadesTmplAddDigest(cur, hashMethodId); | 
		
	
		
			
				|  |  |  |  |   if (cur == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlsecAddChild(xmlXadesNodeSignaturePolicyId)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |     return(-1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   // addSignerRole | 
		
	
		
			
				|  |  |  |  |   xmlXadesTmplAddSignerRole(signedSignaturePropertiesNode, BAD_CAST "supplier"); | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   return(cur); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | xmlNodePtr | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplAddSigPolicyId(xmlNodePtr signaturePolicyId, const xmlChar* identifier, const xmlChar *description, xmlSecTransformId policyDigestMethodId) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr sigPolicyIdNode; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr sigPolicyHashNode; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr node; | 
		
	
		
			
				|  |  |  |  |   int ret; | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   sigPolicyIdNode = xmlSecAddChild(signaturePolicyId, xmlXadesNodeSigPolicyId, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (sigPolicyIdNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSigPolicyId)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(sigPolicyIdNode, xmlXadesNodeIdentifier, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (node == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeIdentifier)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyIdNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   ret = xmlSecNodeEncodeAndSetContent(node, identifier); | 
		
	
		
			
				|  |  |  |  |   if (ret < 0) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecNodeEncodeAndSetContent", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyIdNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(node); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(sigPolicyIdNode, xmlXadesNodeDescription, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (node == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeDescription)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyIdNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   ret = xmlSecNodeEncodeAndSetContent(node, identifier); | 
		
	
		
			
				|  |  |  |  |   if (ret < 0) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecNodeEncodeAndSetContent", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyIdNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(node); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   //add policyHash | 
		
	
		
			
				|  |  |  |  |   sigPolicyHashNode = xmlSecAddChild(sigPolicyIdNode, xmlXadesNodeSigPolicyHash, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (sigPolicyHashNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSigPolicyHash)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyIdNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |    | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(sigPolicyHashNode, xmlSecNodeDigestMethod, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (sigPolicyHashNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlSecNodeDigestMethod)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlUnlinkNode(sigPolicyHashNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyHashNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   if (xmlSetProp(node, xmlSecAttrAlgorithm, policyDigestMethodId->href) == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesXmlError2("xmlSetProp", NULL, | 
		
	
		
			
				|  |  |  |  |                       "name=%s", xmlXadesErrorsSafeString(xmlSecAttrAlgorithm)); | 
		
	
		
			
				|  |  |  |  |     xmlUnlinkNode(sigPolicyHashNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyHashNode); | 
		
	
		
			
				|  |  |  |  |     return(node); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   node = xmlSecAddChild(sigPolicyHashNode, xmlSecNodeDigestValue, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (node == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlSecNodeDigestValue)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlUnlinkNode(sigPolicyHashNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(sigPolicyHashNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return(sigPolicyIdNode); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | void | 
		
	
		
			
				|  |  |  |  | xmlXadesTmplAddSignerRole(xmlNodePtr signedSignaturePropertiesNode, const xmlChar* role) { | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr signerRoleNode; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr claimedRolesNode; | 
		
	
		
			
				|  |  |  |  |   xmlNodePtr claimedRoleNode; | 
		
	
		
			
				|  |  |  |  |   int ret; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   signerRoleNode = xmlSecAddChild(signedSignaturePropertiesNode, xmlXadesNodeSignerRole, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (signerRoleNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeSignerRole)", NULL); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   claimedRolesNode = xmlSecAddChild(signerRoleNode, xmlXadesNodeClaimedRoles, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (claimedRolesNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeClaimedRoles)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlUnlinkNode(signerRoleNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(signerRoleNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   claimedRoleNode = xmlSecAddChild(claimedRolesNode, xmlXadesNodeClaimedRole, xmlXadesDSigNs); | 
		
	
		
			
				|  |  |  |  |   if (claimedRoleNode == NULL) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecAddChild(xmlXadesNodeClaimedRole)", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlUnlinkNode(signerRoleNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(signerRoleNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   ret = xmlSecNodeEncodeAndSetContent(claimedRoleNode, role); | 
		
	
		
			
				|  |  |  |  |   if (ret < 0) { | 
		
	
		
			
				|  |  |  |  |     xmlXadesInternalError("xmlSecNodeEncodeAndSetContent", NULL); | 
		
	
		
			
				|  |  |  |  |     xmlUnlinkNode(signerRoleNode); | 
		
	
		
			
				|  |  |  |  |     xmlFreeNode(signerRoleNode); | 
		
	
		
			
				|  |  |  |  |     return(NULL); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   return; | 
		
	
		
			
				|  |  |  |  |   cur = xmlSecTmplSignatureAddReference(xmlDocGetRootElement(doc), | 
		
	
		
			
				|  |  |  |  |                                         hashMethodId, | 
		
	
		
			
				|  |  |  |  |                                         signedPropertiesId, | 
		
	
		
			
				|  |  |  |  |                                         NULL, NULL); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					
					| 
							
							
							
						 |  |  |   |