/** * zDigCheck * @param DOMDocument $dom * @param string $tagid * @return boolean * @throws Exception\RuntimeException */ private function zDigCheck($dom, $tagid = '') { $node = $dom->getNode($tagid, 0); if (empty($node)) { throw new Exception\RuntimeException("A tag < {$tagid} > não existe no XML!!"); } if (!$this->zSignatureExists($dom)) { $msg = "O xml não contêm nenhuma assinatura para ser verificada."; throw new Exception\RuntimeException($msg); } //carregar o node em sua forma canonica $tagInf = $node->C14N(true, false, null, null); //calcular o hash sha1 $hashValue = hash('sha1', $tagInf, true); //converter o hash para base64 para obter o digest do node $digestCalculado = base64_encode($hashValue); //pegar o digest informado no xml $digestInformado = $dom->getNodeValue('DigestValue'); //compara os digests calculados e informados if ($digestCalculado != $digestInformado) { $msg = "O conteúdo do XML não confere com o Digest Value.\n\n Digest calculado [{$digestCalculado}], digest informado no XML [{$digestInformado}].\n\n O arquivo pode estar corrompido ou ter sido adulterado."; throw new Exception\RuntimeException($msg); } return true; }
/** * zReadDistDFeInteresse * @param DOMDocument $dom * @param boolean $descompactar * @return array */ protected static function zReadDistDFeInteresse($dom) { $aResposta = array('bStat' => false, 'versao' => '', 'cStat' => '', 'xMotivo' => '', 'dhResp' => '', 'ultNSU' => 0, 'maxNSU' => 0, 'aDoc' => array()); $tag = $dom->getNode('retDistDFeInt'); if (!isset($tag)) { return $aResposta; } $aDocZip = array(); $docs = $tag->getElementsByTagName('docZip'); foreach ($docs as $doc) { $xml = gzdecode(base64_decode($doc->nodeValue)); $aDocZip[] = array('NSU' => $doc->getAttribute('NSU'), 'schema' => $doc->getAttribute('schema'), 'doc' => $xml); } $aResposta = array('bStat' => true, 'versao' => $tag->getAttribute('versao'), 'cStat' => $dom->getValue($tag, 'cStat'), 'xMotivo' => $dom->getValue($tag, 'xMotivo'), 'dhResp' => $dom->getValue($tag, 'dhResp'), 'ultNSU' => $dom->getValue($tag, 'ultNSU'), 'maxNSU' => $dom->getValue($tag, 'maxNSU'), 'aDoc' => $aDocZip); return $aResposta; }
/** * zGetProt * @param DOMDocument $dom * @param DOMDocument $tag * @return array */ private static function zGetProt($dom, $tag) { $aProt = array(); $protMDFe = $tag->getElementsByTagName('protMDFe')->item(0); $infProt = $dom->getNode('infProt'); if (empty($infProt)) { return $aProt; } $aProt = array('versao' => $protMDFe->getAttribute('versao'), 'tpAmb' => $dom->getValue($infProt, 'tpAmb'), 'verAplic' => $dom->getValue($infProt, 'verAplic'), 'chMDFe' => $dom->getValue($infProt, 'chMDFe'), 'dhRecbto' => $dom->getValue($infProt, 'dhRecbto'), 'nProt' => $dom->getValue($infProt, 'nProt'), 'digVal' => $dom->getValue($infProt, 'digVal'), 'cStat' => $dom->getValue($infProt, 'cStat'), 'xMotivo' => $dom->getValue($infProt, 'xMotivo')); return $aProt; }