def files_keys_store_find_key(store, name, keyInfoCtx): assert (store) assert (keyInfoCtx) ctx = xmlsec.KeyInfoCtx(_obj=keyInfoCtx) # It's possible to do not have the key name or desired key type # but we could do nothing in this case if name is None or ctx.keyReq.keyId == xmlsec.KeyDataIdUnknown: print "Return None" return None if ctx.keyReq.keyId == xmlsec.keyDataDsaId( ) or ctx.keyReq.keyId == xmlsec.keyDataRsaId(): # Load key from a pem file, if key is not found then it's an error (is it?) key = xmlsec.CryptoAppKeyLoad(name, xmlsec.KeyDataFormatPem, None, None, None) if key is None: print "Error: failed to load public pem key from \"%s\"" % name return None else: # Otherwise it's a binary key, if key is not found then it's an error (is it?) key = xmlsec.keyReadBinaryFile(ctx.keyReq.keyId, name) if key is None: print "Error: failed to load key from binary file \"%s\"" % name return None # Set key name if key.setName(name) < 0: print "Error: failed to set key name for key from \"%s\"" % name key.destroy() return None return key
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 getKeyCallback(keyInfoNode, keyInfoCtx): # Convert PyCObject object into xmlNode and KeyInfoCtx Objects node = libxml2.xmlNode(_obj=keyInfoNode) ctx = xmlsec.KeyInfoCtx(_obj=keyInfoCtx) return xmlsec.keysMngrGetKey(node, ctx)