예제 #1
0
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
예제 #2
0
    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
예제 #3
0
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)