def verifica_assinatura_xml(self, xml): self._inicia_funcoes_externas() xml = self._prepara_doc_xml(xml) # # Colocamos o texto no avaliador XML # doc_xml = libxml2.parseMemory(xml.encode('utf-8'), len(xml.encode('utf-8'))) # # Separa o nó da assinatura # noh_assinatura = xmlsec.findNode(doc_xml.getRootElement(), xmlsec.NodeSignature, xmlsec.DSigNs) # # Prepara o gerenciador dos certificados confiáveis para verificação # certificados_confiaveis = xmlsec.KeysMngr() xmlsec.cryptoAppDefaultKeysMngrInit(certificados_confiaveis) # # Prepara a cadeia certificadora # certificados = os.listdir(DIRNAME + '/cadeia-certificadora/certificados') certificados.sort() for certificado in certificados: certificados_confiaveis.certLoad(filename=str(DIRNAME + '/cadeia-certificadora/certificados/' + certificado), format=xmlsec.KeyDataFormatPem, type=xmlsec.KeyDataTypeTrusted) # # Cria a variável de chamada (callable) da função de assinatura/verificação, # agora passando quais autoridades certificadoras são consideradas # confiáveis # verificador = xmlsec.DSigCtx(certificados_confiaveis) # # Separa o certificado que assinou o arquivo, e prepara a instância # com os dados desse certificado # certificado = xmlsec.findNode(noh_assinatura, xmlsec.NodeX509Certificate, xmlsec.DSigNs).content self.prepara_certificado_txt(certificado) # # Recupera a chave do certificado que assinou o documento, e altera # a data que será usada para fazer a verificação, para que a assinatura # seja validada mesmo que o certificado já tenha expirado # Para isso, define a data de validação para a data de início da validade # do certificado # Essa data deve ser informada como um inteiro tipo "unixtime" # noh_chave = xmlsec.findNode(noh_assinatura, xmlsec.NodeKeyInfo, xmlsec.DSigNs) manipulador_chave = xmlsec.KeyInfoCtx(mngr=certificados_confiaveis) manipulador_chave.certsVerificationTime = mktime(self.data_inicio_validade.timetuple()) # # Cria uma chave vazia e recupera a chave, dizendo ao verificador que # é essa a chave que deve ser usada na validação da assinatura # verificador.signKey = xmlsec.Key() xmlsec.keyInfoNodeRead(noh_chave, verificador.signKey, manipulador_chave) # # Realiza a verificação # verificador.verify(noh_assinatura) # # Guarda o status # status = verificador.status resultado = status == xmlsec.DSigStatusSucceeded # # Libera a memória ocupada pelo verificador manualmente # verificador.destroy() certificados_confiaveis.destroy() if status != xmlsec.DSigStatusSucceeded: # # Libera a memória ocupada pelo documento xml manualmente # doc_xml.freeDoc() self._finaliza_funcoes_externas() raise RuntimeError('Erro ao validar a assinatura do arquivo; status: "' + str(status) + '"') # # Libera a memória ocupada pelo documento xml manualmente # doc_xml.freeDoc() self._finaliza_funcoes_externas() return resultado
def test_load_invalid_key(self): mngr = xmlsec.KeysManager() with self.assertRaises(ValueError): mngr.add_key(xmlsec.Key())
def test_set_invalid_key(self): ctx = xmlsec.SignatureContext(manager=xmlsec.KeysManager()) with self.assertRaisesRegex(TypeError, 'empty key.'): ctx.key = xmlsec.Key()
def test_set_name_invalid_key(self): key = xmlsec.Key() with self.assertRaisesRegex(ValueError, 'key is not ready'): key.name = 'foo'