/** * Método que firma un XML utilizando RSA y SHA1 * * Referencia: http://www.di-mgt.com.au/xmldsig2.html * * @param xml_data Archivo XML que se desea firmar, debe venir con elemento Signature * @return XML firmado * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2014-12-08 */ public function signXML($xml_data) { $doc = new \DomDocument(); $doc->loadXML($xml_data); $dom = $doc->documentElement; // calcular DigestValue y SignatureValue $Signature = $dom->removeChild($dom->getElementsByTagName('Signature')[0]); $digest = base64_encode(sha1($dom->C14N(), true)); $Signature->getElementsByTagName('DigestValue')[0]->nodeValue = $digest; $SignedInfo = $Signature->getElementsByTagName('SignedInfo')[0]; $SignedInfo->setAttribute('xmlns', $Signature->getAttribute('xmlns')); $SignedInfo = $doc->saveHTML($SignedInfo); $signature = wordwrap($this->sign($SignedInfo), $this->config['wordwrap'], "\n", true); // reemplazar valores en la firma de $Signature->getElementsByTagName('SignatureValue')[0]->nodeValue = $signature; $Signature->getElementsByTagName('Modulus')[0]->nodeValue = $this->getModulus(); $Signature->getElementsByTagName('Exponent')[0]->nodeValue = $this->getExponent(); $Signature->getElementsByTagName('X509Certificate')[0]->nodeValue = $this->cleanCert($this->certs['cert']); // agregar y entregar firma $dom->appendChild($Signature); return $doc->C14N(); }