a
    /$ZB                      @   sx  d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZmZ zddlZW n eyr   dZY n0 dZdZdZd	Zd
ZdZd*ddZdd ZdddeefddZd+ddZdd Zd,ddZd-ddZd.ddZedkrtdZ ee Z!e"e! ee d d!d"Z#e"ee#  d#Z ee d$ d$d!d"edd%Z#e"e ee#   ee$d&% Z&ee#d' e#d( e&dd)stJ dS )/z,Pythonic XML Security Library implementation    )print_functionN)StringIO)BIOEVPRSAX509m2a  
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
  <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
  <Reference URI="%(ref_uri)s">
    <Transforms>
      <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
    <DigestValue>%(digest_value)s</DigestValue>
  </Reference>
</SignedInfo>
z
<?xml version="1.0" encoding="UTF-8"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
%(signed_info)s
<SignatureValue>%(signature_value)s</SignatureValue>
%(key_info)s
%(ref_xml)s
</Signature>
aO  
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
  <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
  <Reference URI="">
    <Transforms>
       <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
       <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <DigestValue>%(digest_value)s</DigestValue>
  </Reference>
</SignedInfo>
z<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
%(signed_info)s
<SignatureValue>%(signature_value)s</SignatureValue>
%(key_info)s
</Signature>z
<KeyInfo>
  <KeyValue>
    <RSAKeyValue>
      <Modulus>%(modulus)s</Modulus>
      <Exponent>%(exponent)s</Exponent>
    </RSAKeyValue>
  </KeyValue>
</KeyInfo>
z
<KeyInfo>
    <X509Data>
        <X509IssuerSerial>
            <X509IssuerName>%(issuer_name)s</X509IssuerName>
            <X509SerialNumber>%(serial_number)s</X509SerialNumber>
        </X509IssuerSerial>
    </X509Data>
</KeyInfo>
Tc                 C   sT   t  }tdur.tjt | }|j||d nddlm} || j||d | S )z@Return the canonical (c14n) form of the xml document for hashingN)Z	exclusive   )SimpleXMLElement)r   lxmlZetreeparseZ
write_c14nZ	simplexmlr
   getvalue)xmlc14n_excoutputZetr
    r   5/usr/lib/python3/dist-packages/pysimplesoap/xmlsec.pycanonicalizeb   s    r   c                 C   s   t t|  S )z/Create a SHA1 hash and return the base64 string)base64	b64encodehashlibsha1digest)Zpayloadr   r   r   sha1_hash_digestq   s    r   c                    sl   t | |}||t|d }	t |	|}	t| fdd}
|
t|	 }|||	t	|t
|
||dS )zISign an XML document usign RSA (templates: enveloped -ref- or enveloping))ref_uriZdigest_valuec                     s    S )Nr   )argskwargspasswordr   r   <lambda>       zrsa_sign.<locals>.<lambda>)ref_xmlr   signed_infosignature_valuekey_info)r   r   r   Zload_keyZsignr   r   r   r   r   r$   )r   r   Zprivate_keyr   certr   sign_templatekey_info_templater!   r"   pkey	signaturer   r   r   rsa_signv   s    


r*   c                 C   sx   | dr t|}t|}n
tt}t }|	| |j
dd |  |t| | |t|}|dkS )zDVerify a XML document signature usign RSA-SHA1, return True if validz-----BEGIN PUBLIC KEY-----r   )Zmdr	   )
startswithr   MemoryBufferr   Zload_pub_key_bioZload_pub_keyZcertificater   ZPKeyZ
assign_rsaZreset_contextZverify_initZverify_updater   Zverify_finalr   Z	b64decode)r   r)   keyr   bioZrsaZpubkeyZretr   r   r   
rsa_verify   s    



r/   c                 C   sp   t | jdd }tt| jdd}|r>t	|nd}||||rX|
  nd|rf| ndd S )zHConvert private key (PEM) to XML Signature format (RSAKeyValue/X509Data)   Nhexr    )modulusexponentZissuer_nameZserial_number)r   r   er   Z	bn_to_hexZ	mpi_to_bnndecodeencodex509_parse_certZ
get_issuerZas_textZget_serial_number)r(   r%   r'   r4   r3   x509r   r   r   r$      s    r$   Fc                 C   sR   |rt | }t|tj}n0| drBt | }t|tj}nt| d}|S )zECreate a X509 certificate from binary DER, plain text PEM or filenamez-----BEGIN CERTIFICATE-----r	   )r   r,   r   Zload_cert_bioZ
FORMAT_DERr+   Z
FORMAT_PEMZ	load_cert)r%   binaryr.   r:   r   r   r   r9      s    


r9   c                 C   s   t | |}|   S )z:Return the public key (PEM format) from a X509 certificate)r9   
get_pubkeyZget_rsaZas_pem)r%   r;   r:   r   r   r   x509_extract_rsa_public_key   s    
r=   c                 C   s    t | }t ||}|| S )zGValidate the certificate's authenticity using a certification authority)r9   Zverifyr<   )Zcacertr%   r;   ZcaZcrtr   r   r   x509_verify   s    
r>   __main__zL<Object xmlns="http://www.w3.org/2000/09/xmldsig#" Id="object">data</Object>z#objectzno_encriptada.keyr   z=<?xml version="1.0" encoding="UTF-8"?><Object>data%s</Object>r2   )r&   r   zzunimercado.crtr"   r#   )r   )T)T)F)F)F)'__doc__Z
__future__r   r   r   osZ	cStringIOr   ZM2Cryptor   r   r   r   r   Z
lxml.etreer   ImportErrorZSIGN_REF_TMPLZSIGNED_TMPLZSIGN_ENV_TMPLZSIGNATURE_TMPLZKEY_INFO_RSA_TMPLZKEY_INFO_X509_TMPLr   r   r*   r/   r$   r9   r=   r>   __name__Z
sample_xmlr   printvarsopenreadZ
public_keyr   r   r   r   <module>   sR   







