/** * Método que verifica la validez de la firma de un XML utilizando RSA y SHA1 * @param xml_data Archivo XML que se desea validar * @return =true si la firma del documento XML es válida o =false si no lo es * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) * @version 2015-09-02 */ public function verifyXML($xml_data, $tag = null) { $doc = new XML(); $doc->loadXML($xml_data); // preparar datos que se verificarán $SignaturesElements = $doc->documentElement->getElementsByTagName('Signature'); $Signature = $doc->documentElement->removeChild($SignaturesElements->item($SignaturesElements->length - 1)); $SignedInfo = $Signature->getElementsByTagName('SignedInfo')->item(0); $SignedInfo->setAttribute('xmlns', $Signature->getAttribute('xmlns')); $signed_info = $doc->saveHTML($SignedInfo); $signature = $Signature->getElementsByTagName('SignatureValue')->item(0)->nodeValue; $pub_key = $Signature->getElementsByTagName('X509Certificate')->item(0)->nodeValue; // verificar firma if (!$this->verify($signed_info, $signature, $pub_key)) { return false; } // verificar digest $digest_original = $Signature->getElementsByTagName('DigestValue')->item(0)->nodeValue; if ($tag) { $digest_calculado = base64_encode(sha1($doc->documentElement->getElementsByTagName($tag)->item(0)->C14N(), true)); } else { $digest_calculado = base64_encode(sha1($doc->C14N(), true)); } return $digest_original == $digest_calculado; }