def verificar_assinatura(filho_id, atributo_id, certificadoras=''): # certificadoras -> lista de arquivos e/ou diretório separados por ponto e vígula (;) xml = filho_id while (xml._XML__pai): xml = xml._XML__pai return PoleXmlSec.verify(serializar(xml), atributo_id, filho_id._XML__nome, certificadoras) == 1
def verificar_assinatura(filho_id, atributo_id, certificadoras=''): # certificadoras -> lista de arquivos e/ou diretório # separados por ponto e vígula (;) xml = filho_id while (xml._XML__pai): xml = xml._XML__pai return (PoleXmlSec.verify(serializar(xml), atributo_id, filho_id._XML__nome, certificadoras) == 1)
def assinar(filho_id, atributo_id, arquivo_chave_pem, arquivo_certificado_pem): # Se não existir, criar estrutura para assinatura com o atributo_id informado xml = filho_id while (xml._XML__pai): xml = xml._XML__pai no_assinatura = filho_id._XML__pai if not no_assinatura('Signature'): no_assinatura.Signature['xmlns'] = "http://www.w3.org/2000/09/xmldsig#" no_assinatura.Signature.SignedInfo.CanonicalizationMethod[ 'Algorithm'] = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" no_assinatura.Signature.SignedInfo.SignatureMethod[ 'Algorithm'] = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" if atributo_id is None or len(atributo_id) == 0: no_assinatura.Signature.SignedInfo.Reference['URI'] = '' else: no_assinatura.Signature.SignedInfo.Reference[ 'URI'] = '#' + filho_id[atributo_id] no_assinatura.Signature.SignedInfo.Reference.Transforms.Transform[ 'Algorithm'] = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" no_assinatura.Signature.SignedInfo.Reference.Transforms.Transform( )['Algorithm'] = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" no_assinatura.Signature.SignedInfo.Reference.DigestMethod[ 'Algorithm'] = "http://www.w3.org/2000/09/xmldsig#sha1" no_assinatura.Signature.SignedInfo.Reference.DigestValue no_assinatura.Signature.SignatureValue no_assinatura.Signature.KeyInfo.X509Data.X509Certificate # Otimizar tamanho do XML tirando espaços extras e quebras de linha, salvando em um arquivo #open('/tmp/nao_assinado.xml', 'w').write(exportar(xml, -1)) # Assinar o conteúdo do arquivo salvo acima e salvar o resultado em outro #import os #os.system('xmlsec1 sign --id-attr:' + atributo_id + ' ' + filho_id._XML__nome + ' --output /tmp/assinado.xml --privkey-pem ' + arquivo_chave_pem + ',' + arquivo_certificado_pem + ' /tmp/nao_assinado.xml') #del os # Recarregar o xml assinado e retorná-lo #return open('/tmp/assinado.xml').read().replace('\r', '').replace('\n', '') xml_assinado = PoleXmlSec.sign(serializar(xml), arquivo_chave_pem, arquivo_certificado_pem, atributo_id, filho_id._XML__nome) xml_assinado = xml_assinado.replace('\r', '').replace('\n', '') xml_assinado = importar(xml_assinado) caminho = ['Signature'] pai = no_assinatura while pai._XML__nome is not None: caminho.append(pai._XML__nome) pai = pai._XML__pai assinatura = xml_assinado for c in caminho[::-1]: assinatura = assinatura(c, 1) no_assinatura.Signature.SignedInfo.Reference.DigestValue = assinatura.SignedInfo.Reference.DigestValue no_assinatura.Signature.SignatureValue = assinatura.SignatureValue no_assinatura.Signature.KeyInfo.X509Data.X509Certificate = assinatura.KeyInfo.X509Data.X509Certificate return xml
def assinar(filho_id, atributo_id, arquivo_chave_pem, arquivo_certificado_pem): # Se não existir, criar estrutura para assinatura com o atributo_id informado xml = filho_id while (xml._XML__pai): xml = xml._XML__pai no_assinatura = filho_id._XML__pai if not no_assinatura('Signature'): no_assinatura.Signature['xmlns'] = "http://www.w3.org/2000/09/xmldsig#" no_assinatura.Signature.SignedInfo.CanonicalizationMethod['Algorithm'] = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" no_assinatura.Signature.SignedInfo.SignatureMethod['Algorithm'] = "http://www.w3.org/2000/09/xmldsig#rsa-sha1" if atributo_id is None or len(atributo_id) == 0: no_assinatura.Signature.SignedInfo.Reference['URI'] = '' else: no_assinatura.Signature.SignedInfo.Reference['URI'] = '#' + filho_id[atributo_id] no_assinatura.Signature.SignedInfo.Reference.Transforms.Transform['Algorithm'] = "http://www.w3.org/2000/09/xmldsig#enveloped-signature" no_assinatura.Signature.SignedInfo.Reference.Transforms.Transform()['Algorithm'] = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" no_assinatura.Signature.SignedInfo.Reference.DigestMethod['Algorithm'] = "http://www.w3.org/2000/09/xmldsig#sha1" no_assinatura.Signature.SignedInfo.Reference.DigestValue no_assinatura.Signature.SignatureValue no_assinatura.Signature.KeyInfo.X509Data.X509Certificate # Otimizar tamanho do XML tirando espaços extras e quebras de linha, salvando em um arquivo #open('/tmp/nao_assinado.xml', 'w').write(exportar(xml, -1)) # Assinar o conteúdo do arquivo salvo acima e salvar o resultado em outro #import os #os.system('xmlsec1 sign --id-attr:' + atributo_id + ' ' + filho_id._XML__nome + ' --output /tmp/assinado.xml --privkey-pem ' + arquivo_chave_pem + ',' + arquivo_certificado_pem + ' /tmp/nao_assinado.xml') #del os # Recarregar o xml assinado e retorná-lo #return open('/tmp/assinado.xml').read().replace('\r', '').replace('\n', '') xml_assinado = PoleXmlSec.sign(serializar(xml), arquivo_chave_pem, arquivo_certificado_pem, atributo_id, filho_id._XML__nome) xml_assinado = xml_assinado.replace('\r', '').replace('\n', '') xml_assinado = importar(xml_assinado) caminho = ['Signature'] pai = no_assinatura while pai._XML__nome is not None: caminho.append(pai._XML__nome) pai = pai._XML__pai assinatura = xml_assinado for c in caminho[::-1]: assinatura = assinatura(c, 1) no_assinatura.Signature.SignedInfo.Reference.DigestValue = assinatura.SignedInfo.Reference.DigestValue no_assinatura.Signature.SignatureValue = assinatura.SignatureValue no_assinatura.Signature.KeyInfo.X509Data.X509Certificate = assinatura.KeyInfo.X509Data.X509Certificate return xml