o
    Œõ±jÀx  ã                   @   sj  d dl mZmZmZmZ d dlZd dlZd dlZd dlZddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZ ddlmZmZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& dd	l'm(Z(m)Z)m*Z* G d
d„ dƒZ+G dd„ dƒZ,G dd„ dƒZ-dd„ Z.dd„ Z/e e!ee"edœZ0dd„ Z1dd„ Z2d%dd„Z3d%dd„Z4dd„ Z5dd „ Z6d!d"„ Z7d#d$„ Z8dS )&é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functionNé   )ÚCertBagÚCertificateÚDSAPrivateKeyÚECPrivateKeyÚEncryptedDataÚEncryptedPrivateKeyInfoÚIntegerÚOctetStringÚPfxÚPrivateKeyInfoÚPublicKeyInfoÚRSAPrivateKeyÚRSAPublicKeyÚSafeContentsÚunarmor)Úpbkdf1Úpbkdf2Ú
pkcs12_kdf)Úaes_cbc_pkcs7_decryptÚdes_cbc_pkcs5_decryptÚrc2_cbc_pkcs5_decryptÚrc4_decryptÚtripledes_cbc_pkcs5_decrypt)Úconstant_compare)Úpretty_message)Úbyte_clsÚstr_clsÚ	type_namec                   @   sL   e Zd ZdZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZ	ed
d„ ƒZ
dS )Ú_PrivateKeyBaseNc                 C   sœ   | j dkr| jd jS | j dkr/| jd d }td|d |d |d	 | j ¡ | jd jd
œƒS | j dkrL| jd j}| jd d |d< | j ¡ |d< |S dS )a.  
        Unwraps the private key into an asn1crypto.keys.RSAPrivateKey,
        asn1crypto.keys.DSAPrivateKey or asn1crypto.keys.ECPrivateKey object

        :return:
            An asn1crypto.keys.RSAPrivateKey, asn1crypto.keys.DSAPrivateKey or
            asn1crypto.keys.ECPrivateKey object
        ÚrsaÚprivate_keyÚdsaÚprivate_key_algorithmÚ
parametersr   ÚpÚqÚg©Úversionr)   r*   r+   Ú
public_keyr%   Úecr.   N)Ú	algorithmÚasn1Úparsedr	   r.   Úunwrap)ÚselfÚparamsÚoutput© r7   ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/oscrypto/_asymmetric.pyr3   -   s$   



ú
	üz_PrivateKeyBase.unwrapc                 C   ó   | j jS ©zO
        :return:
            A unicode string of "rsa", "dsa" or "ec"
        ©r1   r0   ©r4   r7   r7   r8   r0   K   ó   z_PrivateKeyBase.algorithmc                 C   ó   | j jd S ©úH
        :return:
            A unicode string of EC curve name
        r   ©r1   Úcurver<   r7   r7   r8   rB   T   ó   z_PrivateKeyBase.curvec                 C   r9   ©zS
        :return:
            The number of bits in the key, as an integer
        ©r1   Úbit_sizer<   r7   r7   r8   rF   ]   r=   z_PrivateKeyBase.bit_sizec                 C   r9   ©zT
        :return:
            The number of bytes in the key, as an integer
        ©r1   Ú	byte_sizer<   r7   r7   r8   rI   f   r=   z_PrivateKeyBase.byte_size)Ú__name__Ú
__module__Ú__qualname__r1   Ú_fingerprintr3   Úpropertyr0   rB   rF   rI   r7   r7   r7   r8   r#   (   s    


r#   c                   @   sX   e Zd ZdZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZ	ed
d„ ƒZ
edd„ ƒZdS )Ú_PublicKeyBaseNc                 C   s    | j dkr
| jd S | jd jS )a7  
        Unwraps a public key into an asn1crypto.keys.RSAPublicKey,
        asn1crypto.core.Integer (for DSA) or asn1crypto.keys.ECPointBitString
        object

        :return:
            An asn1crypto.keys.RSAPublicKey, asn1crypto.core.Integer or
            asn1crypto.keys.ECPointBitString object
        r/   r.   )r0   r1   r2   r<   r7   r7   r8   r3   u   s   

z_PublicKeyBase.unwrapc                 C   s   | j du rt | jdƒ| _ | j S )aZ  
        Creates a fingerprint that can be compared with a private key to see if
        the two form a pair.

        This fingerprint is not compatible with fingerprints generated by any
        other software.

        :return:
            A byte string that is a sha256 hash of selected components (based
            on the key type)
        N)rM   r1   r<   r7   r7   r8   Úfingerprint„   s   
z_PublicKeyBase.fingerprintc                 C   r9   r:   r;   r<   r7   r7   r8   r0   –   r=   z_PublicKeyBase.algorithmc                 C   r>   r?   rA   r<   r7   r7   r8   rB   Ÿ   rC   z_PublicKeyBase.curvec                 C   r9   rD   rE   r<   r7   r7   r8   rF   ¨   r=   z_PublicKeyBase.bit_sizec                 C   r9   rG   rH   r<   r7   r7   r8   rI   ±   r=   z_PublicKeyBase.byte_size)rJ   rK   rL   r1   rM   r3   rN   rP   r0   rB   rF   rI   r7   r7   r7   r8   rO   p   s    



rO   c                   @   s@   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZdS )
Ú_CertificateBaseNc                 C   r9   r:   )r.   r0   r<   r7   r7   r8   r0   ¿   r=   z_CertificateBase.algorithmc                 C   r9   )r@   )r.   rB   r<   r7   r7   r8   rB   È   r=   z_CertificateBase.curvec                 C   r9   )zZ
        :return:
            The number of bits in the public key, as an integer
        )r.   rF   r<   r7   r7   r8   rF   Ñ   r=   z_CertificateBase.bit_sizec                 C   r9   )z[
        :return:
            The number of bytes in the public key, as an integer
        )r.   rI   r<   r7   r7   r8   rI   Ú   r=   z_CertificateBase.byte_size)	rJ   rK   rL   r1   rN   r0   rB   rF   rI   r7   r7   r7   r8   rQ   »   s    


rQ   c                 C   s®   | j }|dks|dkr| d jS |dkr=| d d }| d j}td|d |d	 |d
 tt|d
 j|j|d jƒƒ|dœƒS |dkrP| d j}| d d |d< |S td| j  ƒ‚)a‡  
    Unwraps an asn1crypto.keys.PrivateKeyInfo object into an
    asn1crypto.keys.RSAPrivateKey, asn1crypto.keys.DSAPrivateKey
    or asn1crypto.keys.ECPrivateKey.

    :param key_info:
        An asn1crypto.keys.PrivateKeyInfo object

    :return:
        One of:
         - asn1crypto.keys.RSAPrivateKey
         - asn1crypto.keys.DSAPrivateKey
         - asn1crypto.keys.ECPrivateKey
    r$   Ú
rsassa_pssr%   r&   r'   r(   r   r)   r*   r+   r,   r/   z#Unsupported key_info.algorithm "%s")r0   r2   r	   r   ÚpowÚnativeÚ
ValueError)Úkey_infoÚkey_algr5   r2   r7   r7   r8   Ú_unwrap_private_key_infoä   s.   

ýö
rX   c                 C   sô  t | tƒr‡| d j}| jdkrd|d j|d jf }nZ| jdkrL| d d }tt|d	 j| d jj|d
 jƒƒ}d|d
 j|d j|d	 j|jf }n*| jdkrv|d j}|du rf|| ƒj}|jd jj}d| j	d  }| 
d¡}||7 }t |tƒr€| 
d¡}t |¡ ¡ S t | tƒrñ| jdkr£| d j}d|d j|d jf }n=| jdkrÆ| d j}| d d }d|d
 j|d j|d	 j|jf }n| jdkrà| d j}d| j	d  }| 
d¡}||7 }t |tƒrê| 
d¡}t |¡ ¡ S ttdt| ƒƒƒ‚)a5  
    Returns a fingerprint used for correlating public keys and private keys

    :param key_object:
        An asn1crypto.keys.PrivateKeyInfo or asn1crypto.keys.PublicKeyInfo

    :raises:
        ValueError - when the key_object is not of the proper type

    ;return:
        A byte string fingerprint
    r%   r$   z%d:%dÚmodulusÚpublic_exponentr&   r'   r(   r+   r)   z%d:%d:%d:%dr*   r/   r.   Nz%s:r   zutf-8r0   z—
        key_object must be an instance of the
        asn1crypto.keys.PrivateKeyInfo or asn1crypto.keys.PublicKeyInfo
        classes, not %s
        )Ú
isinstancer   r2   r0   rT   r   rS   r.   r1   rB   Úencoder!   ÚhashlibÚsha256Údigestr   rU   r   r"   )Ú
key_objectÚload_private_keyÚkeyÚto_hashr5   r.   Úpublic_key_objectr7   r7   r8   rM     sv   


þ

ýü








þ

ü




úrM   )Úrc2Úrc4ÚdesÚ	tripledesÚaesc                 C   s   t | tƒsttdt| ƒƒƒ‚d}t d| ¡dur3t| ƒ\}}} |dkr)ttdƒƒ‚|dkr3t	 
| d¡S |du s;|dkrizt	 | ¡}|j |W S  tyO   Y nw zt | ¡}|j t	 
|d¡W S  tyh   Y nw |du sq|dkrŒzt | ¡}|d	 d
 }|W S  ty‹   Y tdƒ‚w tdƒ‚)aå  
    Loads a public key from a DER or PEM-formatted file. Supports RSA, DSA and
    EC public keys. For RSA keys, both the old RSAPublicKey and
    SubjectPublicKeyInfo structures are supported. Also allows extracting a
    public key from an X.509 certificate.

    :param data:
        A byte string to load the public key from

    :raises:
        ValueError - when the data does not appear to contain a public key

    :return:
        An asn1crypto.keys.PublicKeyInfo object
    ú<
            data must be a byte string, not %s
            Nó   \s*-----úprivate keyz�
                The data specified does not appear to be a public key or
                certificate, but rather a private key
                r$   ú
public keyÚcertificateÚtbs_certificateÚsubject_public_key_infozQThe data specified does not appear to be a known public key or certificate format)r[   r    Ú	TypeErrorr   r"   ÚreÚmatchÚ_unarmor_pemrU   r   ÚwrapÚloadrT   r   r   )ÚdataÚkey_typeÚalgoÚpkiÚrpkÚparsed_certrV   r7   r7   r8   Úparse_public~  sN   
üÿ

ÿ
ÿ
ýr}   c                 C   s¢   t | tƒsttdt| ƒƒƒ‚d}t d| ¡dur3t| ƒ\}}} |dkr)ttdƒƒ‚|dkr3ttdƒƒ‚|du s;|dkrKzt	 
| ¡W S  tyJ   Y nw ttd	ƒƒ‚)
a@  
    Loads a certificate from a DER or PEM-formatted file. Supports X.509
    certificates only.

    :param data:
        A byte string to load the certificate from

    :raises:
        ValueError - when the data does not appear to contain a certificate

    :return:
        An asn1crypto.x509.Certificate object
    rj   Nrk   rl   z‚
                The data specified does not appear to be a certificate, but
                rather a private key
                rm   z�
                The data specified does not appear to be a certificate, but
                rather a public key
                rn   zU
        The data specified does not appear to be a known certificate format
        )r[   r    rq   r   r"   rr   rs   rt   rU   r   rv   )rw   rx   Ú_r7   r7   r8   Úparse_certificateÇ  s2   
üÿÿÿÿr   c           
      C   s¬  t | tƒsttdt| ƒƒƒ‚|dur!t |tƒs ttdt|ƒƒƒ‚nd}t d| ¡durGt| |ƒ\}}} |dkr=ttdƒƒ‚|dkrGttd	ƒƒ‚zt	 
| ¡}|j |W S  ty[   Y nw zt 
| ¡}|d
 }|d j}t|||ƒ}t	 
|¡}|j |W S  ty„   Y nw zt 
| ¡}	|	j t	 |	d¡W S  ty�   Y nw zt 
| ¡}	|	j t	 |	d¡W S  ty¶   Y nw zt 
| ¡}	|	j t	 |	d¡W S  tyÏ   Y nw ttdƒƒ‚)a%  
    Loads a private key from a DER or PEM-formatted file. Supports RSA, DSA and
    EC private keys. Works with the follow formats:

     - RSAPrivateKey (PKCS#1)
     - ECPrivateKey (SECG SEC1 V2)
     - DSAPrivateKey (OpenSSL)
     - PrivateKeyInfo (RSA/DSA/EC - PKCS#8)
     - EncryptedPrivateKeyInfo (RSA/DSA/EC - PKCS#8)
     - Encrypted RSAPrivateKey (PEM only, OpenSSL)
     - Encrypted DSAPrivateKey (PEM only, OpenSSL)
     - Encrypted ECPrivateKey (PEM only, OpenSSL)

    :param data:
        A byte string to load the private key from

    :param password:
        The password to unencrypt the private key

    :raises:
        ValueError - when the data does not appear to contain a private key, or the password is invalid

    :return:
        An asn1crypto.keys.PrivateKeyInfo object
    rj   NúH
                password must be a byte string, not %s
                ó    rk   rm   z�
                The data specified does not appear to be a private key, but
                rather a public key
                rn   z‚
                The data specified does not appear to be a private key, but
                rather a certificate
                Úencryption_algorithmÚencrypted_datar$   r&   r/   zU
        The data specified does not appear to be a known private key format
        )r[   r    rq   r   r"   rr   rs   rt   rU   r   rv   rT   r   Ú_decrypt_encrypted_datar   ru   r	   r
   )
rw   Úpasswordrx   r~   rz   Úparsed_wrapperÚencryption_algorithm_inforƒ   Údecrypted_datar2   r7   r7   r8   Úparse_private  s‚   
ü
üÿÿÿ
ÿ


ÿ
ÿ
ÿ
ÿÿr‰   c           
      C   s¤   t | ƒ\}}}d}t ||¡}|sttdƒƒ‚| d¡}|  ¡ } |tg d¢ƒv r8| d¡ ¡ }d|t	|||ƒfS | ¡ }	d}|	dkrEd}	n|	d	krMd
}	d}|	||fS )a3  
    Removes PEM-encoding from a public key, private key or certificate. If the
    private key is encrypted, the password will be used to decrypt it.

    :param data:
        A byte string of the PEM-encoded data

    :param password:
        A byte string of the encryption password, or None

    :return:
        A 3-element tuple in the format: (key_type, algorithm, der_bytes). The
        key_type will be a unicode string of "public key", "private key" or
        "certificate". The algorithm will be a unicode string of "rsa", "dsa"
        or "ec".
    zc^((DSA|EC|RSA) PRIVATE KEY|ENCRYPTED PRIVATE KEY|PRIVATE KEY|PUBLIC KEY|RSA PUBLIC KEY|CERTIFICATE)zx
            data does not seem to contain a PEM-encoded certificate, private
            key or public key
            r   )zRSA PRIVATE KEYzDSA PRIVATE KEYzEC PRIVATE KEYé   rl   Nzencrypted private keyzrsa public keyrm   r$   )
r   rr   rs   rU   r   ÚgroupÚstripÚsetÚlowerÚ_unarmor_pem_openssl_private)
rw   r…   Úobject_typeÚheadersÚ	der_bytesÚ
type_regexÚ
armor_typeÚ
pem_headerry   rx   r7   r7   r8   rt   v  s(   ÿ

rt   c                 C   sÜ  d}d}d}d| v r!| d }|  d¡dkr| ¡  d¡\}}nd}|s%|S |r/t | d¡¡}| ¡ }i dd“d	d“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dddœ¥| }t ||dd…  ¡ 	¡ }|t
|ƒkr™|t || |dd…  ¡ 	¡ 7 }|t
|ƒks‚|d|… }i dd“d	d“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “dd “dd “dd “d!d!dœ¥| }	t|	 }
|	dkrè|
||ƒS |
|||ƒS )"aŽ  
    Parses a PKCS#1 private key, or encrypted private key

    :param headers:
        A dict of "Name: Value" lines from right after the PEM header

    :param data:
        A byte string of the DER-encoded PKCS#1 private key

    :param password:
        A byte string of the password to use if the private key is encrypted

    :return:
        A byte string of the DER-encoded private key
    NzDEK-Infoú,éÿÿÿÿÚRC4Úasciizaes-128-cbcé   zaes-128zaes-192-cbcé   zaes-192zaes-256-cbcé    zaes-256rf   zrc4-64é   zrc4-40é   z
rc2-64-cbcz
rc2-40-cbczrc2-cbcre   zdes-ede3-cbczdes-ede3Údes3zdes-ede-cbc)zdes-cbcrg   r   ri   rh   rg   )ÚfindrŒ   ÚsplitÚbinasciiÚ	unhexlifyr\   rŽ   r]   Úmd5r_   ÚlenÚcrypto_funcs)r‘   rw   r…   Úenc_algoÚ
enc_iv_hexÚenc_ivr5   Úenc_key_lengthÚenc_keyÚenc_algo_nameÚdecrypt_funcr7   r7   r8   r�   ©  sÌ   ÿþýüûúùø	÷
öõôóòñðïíì"ÿÿþýüûúùø	÷
öõôóòñðïíì
r�   c                    s”  t | tƒsttdt| ƒƒƒ‚|dur!t |tƒs ttdt|ƒƒƒ‚nd}i ‰ i }t | ¡}|d }|d jdkr=ttdƒƒ‚|j	}|d	 }|r‹|d
 d d j}ddddddddœ| }	t
|||d j|d j|	dƒ}
tt|ƒ}t |
|d j|¡ ¡ }|d
 d j}t||ƒs‹tdƒ‚|D ];}|d }t |tƒr¢t|jˆ |||ƒ q�t |tƒrÃ|d }|d }|d j}t|||ƒ}t|ˆ |||ƒ q�ttdƒƒ‚t| ¡ ƒ}tˆ  ¡ ƒ}tt||@ ƒƒ}d}d}g }t|ƒdk�r|d ‰|ˆ }ˆ ˆ }‡ ‡fdd „ˆ D ƒ}|||fS t|ƒdk�rtt| ¡ ƒƒd }|| }tˆ ƒdk�r2ttˆ  ¡ ƒƒd }ˆ | }ˆ |= tˆ ƒdk�rEttˆ  ¡ ƒd!d"„ d#�}|||fS )$aY  
    Parses a PKCS#12 ANS.1 DER-encoded structure and extracts certs and keys

    :param data:
        A byte string of a DER-encoded PKCS#12 file

    :param password:
        A byte string of the password to any encrypted data

    :param load_private_key:
        A callable that will accept a byte string and return an
        oscrypto.asymmetric.PrivateKey object

    :raises:
        ValueError - when any of the parameters are of the wrong type or value
        OSError - when an error is returned by one of the OS decryption functions

    :return:
        A three-element tuple of:
         1. An asn1crypto.keys.PrivateKeyInfo object
         2. An asn1crypto.x509.Certificate object
         3. A list of zero or more asn1crypto.x509.Certificate objects that are
            "extra" certificates, possibly intermediates from the cert chain
    rj   Nr€   r�   Ú	auth_safeÚcontent_typerw   zV
            Only password-protected PKCS12 files are currently supported
            Úmac_dataÚmacÚdigest_algorithmr0   é   é   rœ   é0   é@   )Úsha1Úsha224r^   Úsha384Úsha512Ú
sha512_224Ú
sha512_256Úmac_saltÚ
iterationsé   Úcontentr_   zPassword provided is invalidÚencrypted_content_infoÚcontent_encryption_algorithmÚencrypted_contentz[
                Public-key-based PKCS12 files are not currently supported
                r   r   c                    s   g | ]
}|ˆkrˆ | ‘qS r7   r7   )Ú.0Úf©ÚcertsrP   r7   r8   Ú
<listcomp>|  s    z!_parse_pkcs12.<locals>.<listcomp>c                 S   r9   ©N)ÚsubjectÚhuman_friendly)Úcr7   r7   r8   Ú<lambda>‰  s    z_parse_pkcs12.<locals>.<lambda>)rb   )r[   r    rq   r   r"   r   rv   rT   rU   Úauthenticated_safer   Úgetattrr]   ÚhmacÚnewÚcontentsr_   r   r   Ú_parse_safe_contentsr   r„   r�   ÚkeysÚsortedÚlistr¥   Úvalues)rw   r…   ra   Úprivate_keysÚpfxr®   rÎ   r°   Úmac_algoÚ
key_lengthÚmac_keyÚhash_modÚcomputed_hmacÚstored_hmacÚcontent_inforÀ   rÁ   r‡   rÃ   Údecrypted_contentÚkey_fingerprintsÚcert_fingerprintsÚcommon_fingerprintsrb   ÚcertÚother_certsÚ	first_keyr7   rÆ   r8   Ú_parse_pkcs12  s¦   
ü
üÿ
ÿùø	ú




ÿ

rè   c                 C   sè   t | tƒr
t | ¡} | D ]e}|d }t |tƒr4|d jdkr3|d j}|d d }|d j|t|dƒ< qt |tƒrA||t||ƒ< qt |t	ƒrb|d }	|d	 j}
t
|	|
|ƒ}t |¡}||t||ƒ< qt |tƒrpt|||||ƒ q	 qdS )
a&  
    Parses a SafeContents PKCS#12 ANS.1 structure and extracts certs and keys

    :param safe_contents:
        A byte string of ber-encoded SafeContents, or a asn1crypto.pkcs12.SafeContents
        parsed object

    :param certs:
        A dict to store certificates in

    :param keys:
        A dict to store keys in

    :param password:
        A byte string of the password to any encrypted data

    :param load_private_key:
        A callable that will accept a byte string and return an
        oscrypto.asymmetric.PrivateKey object
    Ú	bag_valueÚcert_idÚx509Ú
cert_valuero   rp   Nr‚   rƒ   )r[   r    r   rv   r   rT   r2   rM   r   r   r„   rÓ   )Úsafe_contentsrÇ   rØ   r…   ra   Úsafe_bagré   rå   Úpublic_key_infor‡   Úencrypted_key_bytesÚdecrypted_key_bytesr%   r7   r7   r8   rÓ   Ž  s,   



€




èrÓ   c                 C   s  t | j }| jdkr,| jdkrttdƒƒ‚t| j|| j| j| j	ƒ}| j
}||||ƒ}|S | jdkrSt| j|| j| j| j	d ƒ}|dd… }|dd… }||||ƒ}|S | jdkr„t| j|| j| j| j	d	ƒ}| jd
krq|||ƒ}|S t| j|| j| j| jdƒ}||||ƒ}|S )al  
    Decrypts encrypted ASN.1 data

    :param encryption_algorithm_info:
        An instance of asn1crypto.pkcs5.Pkcs5EncryptionAlgorithm

    :param encrypted_content:
        A byte string of the encrypted content

    :param password:
        A byte string of the encrypted content's password

    :return:
        A byte string of the decrypted plaintext
    r   Úrc5zc
                PBES2 encryption scheme utilizing RC5 encryption is not supported
                r   r�   r   rš   r   r   rf   rŠ   )r¦   Úencryption_cipherÚkdfrU   r   r   Úkdf_hmacÚkdf_saltÚkdf_iterationsrÛ   Úencryption_ivr   r   Úencryption_block_size)r‡   rÃ   r…   r­   r«   r©   Ú	plaintextÚderived_outputr7   r7   r8   r„   Â  sd   


ÿû(
Úû
çú


öúr„   rÉ   )9Ú
__future__r   r   r   r   r]   rÐ   rr   r¢   Ú_asn1r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   rô   r   r   r   Ú	symmetricr   r   r   r   r   Úutilr   Ú_errorsr   Ú_typesr    r!   r"   r#   rO   rQ   rX   rM   r¦   r}   r   r‰   rt   r�   rè   rÓ   r„   r7   r7   r7   r8   Ú<module>   s>   DHK)-eû	I
:
u3[ 4