U
    ÒZj]  ã                   @   sÔ  U d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dl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mZ zd dlmZ d	ZW n2 ek
rØ   d
ZdZe e e!e!e"e dœdd„ZY nX dZ#dZ$dZ%dZ&dZ'dZ(dZ)e *d¡Z+dZ,dZ-dZ.dZ/dZ0dZ1dZ2e *e-d e. ej3¡Z4e5e6e7ddƒƒƒZ8ej9d ej:dfej9d ej;dfd!œZ<ej=e ej>ej?ej9 e!ej@ej?ej: ej?ej; f e!f f eAd"< e&e'e(d#œZBejCe d$œd%d&„ZDe-d' e.d' fe e e e d(œd)d*„ZEe e!dd+œd,d-„ZFe dd.œd/d0„ZGe ejHe  e e!eej@ej;ej:f  d1œd2d3„ZIe5ej>e!e5f d.œd4d5„ZJe5ej>e!e5f d.œd6d7„ZKe5ej>e5e5f d.œd8d9„ZLe5ej>e!e5f d.œd:d;„ZMe!e d<œd=d>„ZNG d?d@„ d@ƒZOG dAdB„ dBƒZPG dCdD„ dDƒZQG dEdF„ dFƒZRG dGdH„ dHƒZSe$ePƒ e%eQƒ e#eSƒ e&eRdIe T¡ ƒe'eRdJe U¡ ƒe(eRdKe V¡ ƒiZWe dLœdMdN„ZXej@ejYejZej[ej\f Z]d[e ejHe  ej^e]dOœdPdQ„Z_e]e ee dRœdSdT„Z`ej@ejCejaejbejcf Zdd\e ej^eddUœdVdW„Zeede d$œdXdY„ZfdS )]é    N)Úencodebytes)Úutils©ÚUnsupportedAlgorithm)ÚdsaÚecÚed25519Úrsa)ÚCipherÚ
algorithmsÚmodes)ÚEncodingÚKeySerializationEncryptionÚNoEncryptionÚPrivateFormatÚPublicFormatÚ_KeySerializationEncryption)ÚkdfTF)ÚpasswordÚsaltÚdesired_key_bytesÚroundsÚignore_few_roundsÚreturnc                 C   s   t dƒ‚d S )NzNeed bcrypt moduler   )r   r   r   r   r   © r   ús/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/cryptography/hazmat/primitives/serialization/ssh.pyÚ_bcrypt_kdf    s    r   s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@openssh.coms   \A(\S+)[ \t]+(\S+)s   openssh-key-v1 s#   -----BEGIN OPENSSH PRIVATE KEY-----s!   -----END OPENSSH PRIVATE KEY-----s   bcrypts   noneó
   aes256-ctré   s   (.*?)é   é   é    )r   s
   aes256-cbcÚ_SSH_CIPHERS)Z	secp256r1Z	secp384r1Z	secp521r1)Ú
public_keyr   c                 C   s*   | j }|jtkr td|j›�ƒ‚t|j S )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: )ÚcurveÚnameÚ_ECDSA_KEY_TYPEÚ
ValueError)r#   r$   r   r   r   Ú_ecdsa_key_typeW   s    

ÿr(   ó   
)ÚdataÚprefixÚsuffixr   c                 C   s   d  |t| ƒ|g¡S )Nó    )ÚjoinÚ_base64_encode)r*   r+   r,   r   r   r   Ú_ssh_pem_encodea   s    r0   )r*   Ú	block_lenr   c                 C   s    | rt | ƒ| dkrtdƒ‚dS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)Úlenr'   )r*   r1   r   r   r   Ú_check_block_sizei   s    r3   ©r*   r   c                 C   s   | rt dƒ‚dS )z!All data should have been parsed.zCorrupt data: unparsed dataN)r'   ©r*   r   r   r   Ú_check_emptyo   s    r6   )Ú
ciphernamer   r   r   r   c           	      C   sR   |st dƒ‚t|  \}}}}t|||| |dƒ}t||d|… ƒ|||d… ƒƒS )z$Generate key + iv and return cipher.zKey is password-protected.TN)r'   r"   r   r
   )	r7   r   r   r   ÚalgoZkey_lenÚmodeZiv_lenÚseedr   r   r   Ú_init_cipheru   s
    r;   c                 C   s6   t | ƒdk rtdƒ‚tj| dd… dd�| dd… fS )ZUint32é   úInvalid dataNÚbig©Ú	byteorder©r2   r'   ÚintÚ
from_bytesr5   r   r   r   Ú_get_u32„   s    rD   c                 C   s6   t | ƒdk rtdƒ‚tj| dd… dd�| dd… fS )ZUint64é   r=   Nr>   r?   rA   r5   r   r   r   Ú_get_u64‹   s    rF   c                 C   s8   t | ƒ\}} |t| ƒkr tdƒ‚| d|… | |d… fS )zBytes with u32 length prefixr=   N)rD   r2   r'   )r*   Únr   r   r   Ú_get_sshstr’   s    rH   c                 C   s4   t | ƒ\}} |r$|d dkr$tdƒ‚t |d¡| fS )zBig integer.r   é   r=   r>   )rH   r'   rB   rC   )r*   Úvalr   r   r   Ú
_get_mpintš   s    rK   ©rJ   r   c                 C   s4   | dk rt dƒ‚| sdS |  ¡ d d }t | |¡S )z!Storage format for signed bigint.r   znegative mpint not allowedr-   rE   )r'   Ú
bit_lengthr   Zint_to_bytes)rJ   Únbytesr   r   r   Ú	_to_mpint¢   s    rO   c                   @   s²   e Zd ZU dZeje ed< deje ddœdd„Zeddœdd	„Z	e
ddœd
d„Zejed f ddœdd„Ze
ddœdd„Ze
dœdd„Zdee
e
dœdd„Zedœdd„ZdS )Ú	_FragListz,Build recursive structure without data copy.ÚflistN)Úinitr   c                 C   s   g | _ |r| j  |¡ d S ©N)rQ   Úextend)ÚselfrR   r   r   r   Ú__init__±   s    z_FragList.__init__rL   c                 C   s   | j  |¡ dS )zAdd plain bytesN)rQ   Úappend©rU   rJ   r   r   r   Úput_raw¶   s    z_FragList.put_rawc                 C   s   | j  |jddd�¡ dS )zBig-endian uint32r<   r>   )Úlengthr@   N)rQ   rW   Úto_bytesrX   r   r   r   Úput_u32º   s    z_FragList.put_u32c                 C   sL   t |tttfƒr,|  t|ƒ¡ | j |¡ n|  | ¡ ¡ | j 	|j¡ dS )zBytes prefixed with u32 lengthN)
Ú
isinstanceÚbytesÚ
memoryviewÚ	bytearrayr\   r2   rQ   rW   ÚsizerT   rX   r   r   r   Ú
put_sshstr¾   s
    z_FragList.put_sshstrc                 C   s   |   t|ƒ¡ dS )z*Big-endian bigint prefixed with u32 lengthN)rb   rO   rX   r   r   r   Ú	put_mpintÇ   s    z_FragList.put_mpint)r   c                 C   s   t tt| jƒƒS )zCurrent number of bytes)ÚsumÚmapr2   rQ   )rU   r   r   r   ra   Ë   s    z_FragList.sizer   )ÚdstbufÚposr   c                 C   s2   | j D ]&}t|ƒ}|||  }}||||…< q|S )zWrite into bytearray)rQ   r2   )rU   rf   rg   ÚfragZflenÚstartr   r   r   ÚrenderÏ   s
    
z_FragList.renderc                 C   s"   t t|  ¡ ƒƒ}|  |¡ | ¡ S )zReturn as bytes)r_   r`   ra   rj   Útobytes)rU   Úbufr   r   r   rk   ×   s    
z_FragList.tobytes)N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtypingÚListr^   Ú__annotations__rV   rY   rB   r\   ÚUnionrb   rc   ra   r_   rj   rk   r   r   r   r   rP   ¬   s   
	rP   c                   @   s~   e Zd ZdZedœdd„Zeejej	ef dœdd„Z
eejejef dœdd	„Zej	ed
dœdd„Zejed
dœdd„Zd
S )Ú_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    r5   c                 C   s$   t |ƒ\}}t |ƒ\}}||f|fS )zRSA public fields©rK   )rU   r*   ÚerG   r   r   r   Ú
get_publicç   s    z_SSHFormatRSA.get_publicr4   c                 C   s.   |   |¡\\}}}t ||¡}| ¡ }||fS )zMake RSA public key from data.)rx   r	   ÚRSAPublicNumbersr#   )rU   r*   rw   rG   Úpublic_numbersr#   r   r   r   Úload_publicí   s    z_SSHFormatRSA.load_publicc              	   C   s¦   t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}||f|kr\tdƒ‚t ||¡}	t ||¡}
t ||¡}t ||||	|
||¡}| ¡ }||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch)rK   r'   r	   Zrsa_crt_dmp1Zrsa_crt_dmq1ry   ZRSAPrivateNumbersÚprivate_key)rU   r*   Ú	pubfieldsrG   rw   ÚdÚiqmpÚpÚqZdmp1Zdmq1rz   Úprivate_numbersr|   r   r   r   Úload_privateö   s,          ÿz_SSHFormatRSA.load_privateN©r#   Úf_pubr   c                 C   s$   |  ¡ }| |j¡ | |j¡ dS )zWrite RSA public keyN)rz   rc   rw   rG   )rU   r#   r…   Zpubnr   r   r   Úencode_public  s    z_SSHFormatRSA.encode_public©r|   Úf_privr   c                 C   sZ   |  ¡ }|j}| |j¡ | |j¡ | |j¡ | |j¡ | |j¡ | |j¡ dS )zWrite RSA private keyN)	r‚   rz   rc   rG   rw   r~   r   r€   r�   )rU   r|   rˆ   r‚   rz   r   r   r   Úencode_private  s    z_SSHFormatRSA.encode_private)rm   rn   ro   rp   r_   rx   rq   ÚTupler	   ÚRSAPublicKeyr{   ÚRSAPrivateKeyrƒ   rP   r†   r‰   r   r   r   r   ru   Þ   s    þ
þ þ	 þru   c                   @   sž   e Zd ZdZeejejef dœdd„Zeejej	ef dœdd„Z
eejejef dœdd„Zej	ed	d
œdd„Zejed	dœdd„Zejd	dœdd„Zd	S )Ú_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    r4   c                 C   s@   t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}||||f|fS )zDSA public fieldsrv   )rU   r*   r€   r�   ÚgÚyr   r   r   rx   -  s
    z_SSHFormatDSA.get_publicc           	      C   sJ   |   |¡\\}}}}}t |||¡}t ||¡}|  |¡ | ¡ }||fS )zMake DSA public key from data.)rx   r   ÚDSAParameterNumbersÚDSAPublicNumbersÚ	_validater#   )	rU   r*   r€   r�   rŽ   r�   Úparameter_numbersrz   r#   r   r   r   r{   7  s    
z_SSHFormatDSA.load_publicc                 C   sz   |   |¡\\}}}}}t|ƒ\}}||||f|kr:tdƒ‚t |||¡}t ||¡}	|  |	¡ t ||	¡}
|
 ¡ }||fS )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	rx   rK   r'   r   r�   r‘   r’   ZDSAPrivateNumbersr|   )rU   r*   r}   r€   r�   rŽ   r�   Úxr“   rz   r‚   r|   r   r   r   rƒ   B  s    
z_SSHFormatDSA.load_privateNr„   c                 C   sL   |  ¡ }|j}|  |¡ | |j¡ | |j¡ | |j¡ | |j¡ dS )zWrite DSA public keyN)rz   r“   r’   rc   r€   r�   rŽ   r�   )rU   r#   r…   rz   r“   r   r   r   r†   R  s    
z_SSHFormatDSA.encode_publicr‡   c                 C   s$   |   | ¡ |¡ | | ¡ j¡ dS )zWrite DSA private keyN)r†   r#   rc   r‚   r”   )rU   r|   rˆ   r   r   r   r‰   _  s    z_SSHFormatDSA.encode_private)rz   r   c                 C   s    |j }|j ¡ dkrtdƒ‚d S )Ni   z#SSH supports only 1024 bit DSA keys)r“   r€   rM   r'   )rU   rz   r“   r   r   r   r’   f  s    z_SSHFormatDSA._validate)rm   rn   ro   rp   r_   rq   rŠ   rx   r   ÚDSAPublicKeyr{   ÚDSAPrivateKeyrƒ   rP   r†   r‰   r‘   r’   r   r   r   r   r�   $  s&   	þþþ þ þr�   c                   @   sž   e Zd ZdZeejdœdd„Zee	j
e	j
ef dœdd„Zee	j
ejef dœdd	„Zee	j
ejef dœd
d„Zejeddœdd„Zejeddœdd„ZdS )Ú_SSHFormatECDSAz–Format for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    ©Ússh_curve_namer$   c                 C   s   || _ || _d S rS   r˜   )rU   r™   r$   r   r   r   rV   x  s    z_SSHFormatECDSA.__init__r4   c                 C   sJ   t |ƒ\}}t |ƒ\}}|| jkr*tdƒ‚|d dkr>tdƒ‚||f|fS )zECDSA public fieldszCurve name mismatchr   r<   zNeed uncompressed point)rH   r™   r'   ÚNotImplementedError)rU   r*   r$   Úpointr   r   r   rx   |  s    
z_SSHFormatECDSA.get_publicc                 C   s.   |   |¡\\}}}tj | j| ¡ ¡}||fS )z Make ECDSA public key from data.)rx   r   ÚEllipticCurvePublicKeyZfrom_encoded_pointr$   rk   )rU   r*   Ú
curve_namer›   r#   r   r   r   r{   ˆ  s     ÿz_SSHFormatECDSA.load_publicc                 C   sH   |   |¡\\}}}t|ƒ\}}||f|kr2tdƒ‚t || j¡}||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)rx   rK   r'   r   Zderive_private_keyr$   )rU   r*   r}   r�   r›   Úsecretr|   r   r   r   rƒ   ’  s    z_SSHFormatECDSA.load_privateNr„   c                 C   s*   |  tjtj¡}| | j¡ | |¡ dS )zWrite ECDSA public keyN)Úpublic_bytesr   ZX962r   ZUncompressedPointrb   r™   )rU   r#   r…   r›   r   r   r   r†   ž  s     ÿz_SSHFormatECDSA.encode_publicr‡   c                 C   s,   |  ¡ }| ¡ }|  ||¡ | |j¡ dS )zWrite ECDSA private keyN)r#   r‚   r†   rc   Zprivate_value)rU   r|   rˆ   r#   r‚   r   r   r   r‰   ¨  s    z_SSHFormatECDSA.encode_private)rm   rn   ro   rp   r^   r   ZEllipticCurverV   r_   rq   rŠ   rx   rœ   r{   ÚEllipticCurvePrivateKeyrƒ   rP   r†   r‰   r   r   r   r   r—   l  s&   þþþ þ þr—   c                   @   sŒ   e Zd ZdZeejejef dœdd„Zeejej	ef dœdd„Z
eejejef dœdd„Zej	ed	d
œdd„Zejed	dœdd„Zd	S )Ú_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    r4   c                 C   s   t |ƒ\}}|f|fS )zEd25519 public fields)rH   )rU   r*   r›   r   r   r   rx   ½  s    z_SSHFormatEd25519.get_publicc                 C   s(   |   |¡\\}}tj | ¡ ¡}||fS )z"Make Ed25519 public key from data.)rx   r   ÚEd25519PublicKeyZfrom_public_bytesrk   )rU   r*   r›   r#   r   r   r   r{   Ä  s
    ÿz_SSHFormatEd25519.load_publicc                 C   sb   |   |¡\\}}t|ƒ\}}|dd… }|dd… }||ksF|f|krNtdƒ‚tj |¡}||fS )z#Make Ed25519 private key from data.Nr!   z$Corrupt data: ed25519 field mismatch)rx   rH   r'   r   ÚEd25519PrivateKeyZfrom_private_bytes)rU   r*   r}   r›   Zkeypairrž   Zpoint2r|   r   r   r   rƒ   Î  s    z_SSHFormatEd25519.load_privateNr„   c                 C   s   |  tjtj¡}| |¡ dS )zWrite Ed25519 public keyN)rŸ   r   ÚRawr   rb   )rU   r#   r…   Úraw_public_keyr   r   r   r†   Ü  s
     ÿz_SSHFormatEd25519.encode_publicr‡   c                 C   sR   |  ¡ }| tjtjtƒ ¡}| tjtj¡}t||gƒ}|  	||¡ | 
|¡ dS )zWrite Ed25519 private keyN)r#   Zprivate_bytesr   r¤   r   r   rŸ   r   rP   r†   rb   )rU   r|   rˆ   r#   Zraw_private_keyr¥   Z	f_keypairr   r   r   r‰   å  s      ÿ ÿz _SSHFormatEd25519.encode_private)rm   rn   ro   rp   r_   rq   rŠ   rx   r   r¢   r{   r£   rƒ   rP   r†   r‰   r   r   r   r   r¡   ³  s$   
þþþ þ
 þr¡   s   nistp256s   nistp384s   nistp521©Úkey_typec                 C   s8   t | tƒst| ƒ ¡ } | tkr&t|  S td| ›�ƒ‚dS )z"Return valid format or throw errorzUnsupported key type: N)r]   r^   r_   rk   Ú_KEY_FORMATSr   r¦   r   r   r   Ú_lookup_kformat   s
    
r©   )r*   r   Úbackendr   c                 C   sJ  t  d| ¡ |dk	r t  d|¡ t | ¡}|s6tdƒ‚| d¡}| d¡}t 	t
| ƒ||… ¡} |  t¡srtdƒ‚t
| ƒttƒd… } t| ƒ\}} t| ƒ\}} t| ƒ\}} t| ƒ\}	} |	dkrÆtdƒ‚t| ƒ\}
} t|
ƒ\}}
t|ƒ}| |
¡\}}
t|
ƒ t| ƒ\}} t| ƒ ||fttfk�r¶| ¡ }|tk�rBtd|›�ƒ‚|tk�rZtd|›�ƒ‚t| d	 }t||ƒ t|ƒ\}}t|ƒ\}}t|ƒ t||| ¡ |ƒ}t
| ¡  |¡ƒ}nd
}t||ƒ t|ƒ\}}t|ƒ\}}||k�rîtdƒ‚t|ƒ\}}||k�rtdƒ‚| ||¡\}}t|ƒ\}}|tdt|ƒ… k�rFtdƒ‚|S )z.Load private key from OpenSSH custom encoding.r*   Nr   zNot OpenSSH private key formatr   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: é   rE   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid padding)r   Ú_check_byteslikeÚ_check_bytesÚ_PEM_RCÚsearchr'   ri   ÚendÚbinasciiÚ
a2b_base64r_   Ú
startswithÚ	_SK_MAGICr2   rH   rD   r©   rx   r6   Ú_NONErk   r"   r   Ú_BCRYPTr3   r;   Z	decryptorÚupdaterƒ   Ú_PADDING)r*   r   rª   ÚmÚp1Zp2r7   ÚkdfnameZ
kdfoptionsÚnkeysZpubdataZpub_key_typeÚkformatr}   ZedataZciphername_bytesÚblklenr   Zkbufr   ÚciphZck1Zck2r§   r|   Úcommentr   r   r   Úload_ssh_private_key  sl    




ÿ




rÁ   )r|   r   Úencryption_algorithmr   c                 C   s  t  d|¡ t| tjƒr&t|  ¡ ƒ}n>t| tjƒr8t	}n,t| t
jƒrJt}nt| tjƒr\t}ntdƒ‚t|ƒ}tƒ }|rÖt}t| d }t}t}	t|tƒr¨|jdk	r¨|j}	t d¡}
| |
¡ | |	¡ t|||
|	ƒ}nt }}d}d}d}t d¡}d	}tƒ }| |¡ | |  ¡ |¡ t||gƒ}| |¡ |  | |¡ | |¡ | !t"d|| #¡ |  … ¡ tƒ }| !t$¡ | |¡ | |¡ | |¡ | |¡ | |¡ | |¡ | #¡ }| #¡ }t%t&|| ƒƒ}| '|¡ || }|dk	�r
| (¡  )|||… ||d… ¡ t*|d|… ƒS )
z3Serialize private key with OpenSSH custom encoding.r   úUnsupported key typer«   Nr   rE   r   r<   r-   )+r   r­   r]   r   r    r(   r#   r	   rŒ   Ú_SSH_RSAr   r–   Ú_SSH_DSAr   r£   Ú_SSH_ED25519r'   r©   rP   Ú_DEFAULT_CIPHERr"   r¶   Ú_DEFAULT_ROUNDSr   Z_kdf_roundsÚosÚurandomrb   r\   r;   rµ   r†   r‰   rY   r¸   ra   r´   r_   r`   rj   Z	encryptorZupdate_intor0   )r|   r   rÂ   r§   r½   Zf_kdfoptionsr7   r¾   r»   r   r   r¿   r¼   ZcheckvalrÀ   Zf_public_keyZ	f_secretsZf_mainÚslenÚmlenrl   Zofsr   r   r   Ú_serialize_ssh_private_key^  sp    ÿþ















 rÍ   )r*   rª   r   c              	   C   sx  t  d| ¡ t | ¡}|s"tdƒ‚| d¡ }}| d¡}d}t|ttƒ d… krjd}|dttƒ … }t|ƒ}zt	t
 |¡ƒ}W n" tt
jfk
r¦   tdƒ‚Y nX t|ƒ\}	}|	|krÄtdƒ‚|rÔt|ƒ\}
}| |¡\}}|�rlt|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ |S )	z-Load public key from OpenSSH one-line format.r*   zInvalid line formatr   é   FNTzInvalid key format)r   r¬   Ú_SSH_PUBKEY_RCÚmatchr'   ÚgroupÚ_CERT_SUFFIXr2   r©   r_   r±   r²   Ú	TypeErrorÚErrorrH   r{   rF   rD   r6   )r*   rª   r¹   r§   Zorig_key_typeZkey_bodyZ	with_certr½   ÚrestZinner_key_typeÚnoncer#   ÚserialZcctypeZkey_idZ
principalsZvalid_afterZvalid_beforeZcrit_optionsÚ
extensionsÚreservedZsig_keyÚ	signaturer   r   r   Úload_ssh_public_keyµ  sF    

rÛ   c                 C   sš   t | tjƒrt| ƒ}n>t | tjƒr(t}n,t | tjƒr:t	}nt | t
jƒrLt}ntdƒ‚t|ƒ}tƒ }| |¡ | | |¡ t | ¡ ¡ ¡ }d |d|g¡S )z&One-line public key format for OpenSSHrÃ   r-   ó    )r]   r   rœ   r(   r	   r‹   rÄ   r   r•   rÅ   r   r¢   rÆ   r'   r©   rP   rb   r†   r±   Ú
b2a_base64rk   Ústripr.   )r#   r§   r½   r…   Zpubr   r   r   Úserialize_ssh_public_keyá  s    

rß   )F)N)N)gr±   rÉ   Úrerq   Úbase64r   r/   Zcryptographyr   Zcryptography.exceptionsr   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r	   Z&cryptography.hazmat.primitives.ciphersr
   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Zbcryptr   r   Z_bcrypt_supportedÚImportErrorr^   rB   ÚboolrÆ   rÄ   rÅ   Z_ECDSA_NISTP256Z_ECDSA_NISTP384Z_ECDSA_NISTP521rÒ   ÚcompilerÏ   r´   Z	_SK_STARTZ_SK_ENDr¶   rµ   rÇ   rÈ   ÚDOTALLr®   r_   r`   Úranger¸   ZAESZCTRZCBCr"   ÚDictrŠ   ÚTypert   rs   r&   rœ   r(   r0   r3   r6   ÚOptionalr;   rD   rF   rH   rK   rO   rP   ru   r�   r—   r¡   Z	SECP256R1Z	SECP384R1Z	SECP521R1r¨   r©   r    rŒ   r–   r£   Z_SSH_PRIVATE_KEY_TYPESÚAnyrÁ   rÍ   r‹   r•   r¢   Z_SSH_PUBLIC_KEY_TYPESrÛ   rß   r   r   r   r   Ú<module>   s
    	 ûú

þø
ýÿÿÿýýüû
2FHGD      ú
	ýÿ ýüNüOýÿ	 ÿ þ,