U
    m5{iÄÑ  ã                   @  sæ  U d dl mZ d dlZd dlZ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 d dl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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 n4 e*k
�r"   dZ)dšdddddddœdd„Z(Y nX dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5e 6d¡Z7d Z8d!Z9d"Z:d#Z;d$Z<d%Z=d&Z>e 6e9d' e: ej?¡Z@eAeBeCd(d)ƒƒƒZDeG d*d+„ d+ƒƒZEeEejFd,ejGd&d&ddd-�eEejFd,ejHd&d&ddd-�eEejFd,ejId&d.d&dd-�d/œZJd0eKd1< e.e/e0d2œZLd3dd4œd5d6„ZMd7dd8œd9d:„ZNe9d; e:d; fd<dddd=œd>d?„ZOd<dd@dAœdBdC„ZPd<d@dDœdEdF„ZQddGdddHdIœdJdK„ZRdLdMdDœdNdO„ZSdLdMdDœdPdQ„ZTdLdRdDœdSdT„ZUdLdMdDœdUdV„ZVdddWœdXdY„ZWG dZd[„ d[ƒZXG d\d]„ d]ƒZYG d^d_„ d_ƒZZG d`da„ daƒZ[G dbdc„ dcƒZ\dRddœdedf„Z]G dgdh„ dhƒZ^G didj„ djƒZ_e,eYƒ e-eZƒ e+e\ƒ e.e[dke `¡ ƒe/e[dle a¡ ƒe0e[dme b¡ ƒe2e^ƒ e3e_ƒ iZcd<dnœdodp„Zdejeejfejgejhejif Zjd›ddqœd<dGdrddsdtœdudv„Zkdsddwddxœdydz„Zlejeejmejnejoejpf Zqejeejmejnejpf ZrG d{d|„ d|ejsƒZtG d}d~„ d~ƒZudd€d�œd‚dƒ„Zvdœd<d„dDœd…d†„Zwd<d„dDœd‡dˆ„ZxdLd‰dŠœd‹dŒ„Zyd�dŽdd�œd�d‘„Zzd�d<drd�d’œd“d”„Z{d�dd8œd•d–„Z|ejeejfejgejif Z}d—Z~G d˜d™„ d™ƒZdS )žé    )ÚannotationsN)Úencodebytes)Ú	dataclass)Úutils©ÚUnsupportedAlgorithm)Úhashes)ÚdsaÚecÚed25519ÚpaddingÚrsa)ÚAEADDecryptionContextÚCipherÚ
algorithmsÚmodes)ÚEncodingÚKeySerializationEncryptionÚNoEncryptionÚPrivateFormatÚPublicFormatÚ_KeySerializationEncryption)ÚkdfTFÚbytesÚintÚbool)Ú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"   úT/tmp/pip-unpacked-wheel-6hw_jadn/cryptography/hazmat/primitives/serialization/ssh.pyÚ_bcrypt_kdf1   s    r$   s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@openssh.coms   sk-ssh-ed25519@openssh.coms"   sk-ecdsa-sha2-nistp256@openssh.coms   rsa-sha2-256s   rsa-sha2-512s   \A(\S+)[ \t]+(\S+)s   openssh-key-v1 s#   -----BEGIN OPENSSH PRIVATE KEY-----s!   -----END OPENSSH PRIVATE KEY-----s   bcrypts   noneó
   aes256-ctré   s   (.*?)é   é   c                   @  sF   e Zd ZU ded< ded< ded< ded< ded< d	ed
< ded< dS )Ú
_SSHCipherztype[algorithms.AES]Úalgr   Úkey_lenz3type[modes.CTR] | type[modes.CBC] | type[modes.GCM]ÚmodeÚ	block_lenÚiv_lenú
int | NoneÚtag_lenr   Úis_aeadN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r"   r"   r"   r#   r)   \   s   
r)   é    )r*   r+   r,   r-   r.   r0   r1   é   )r%   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]Ú_SSH_CIPHERS)Z	secp256r1Z	secp384r1Z	secp521r1z&SSHPrivateKeyTypes | SSHPublicKeyTypes)Úkeyr!   c                 C  s„   t | tjƒrt|  ¡ ƒ}nft | tjƒr0t| ƒ}nPt | tjtjfƒrHt	}n8t | t
jt
jfƒr`t}n t | tjtjfƒrxt}ntdƒ‚|S )NúUnsupported key type)Ú
isinstancer
   ÚEllipticCurvePrivateKeyÚ_ecdsa_key_typeÚ
public_keyÚEllipticCurvePublicKeyr   ÚRSAPrivateKeyÚRSAPublicKeyÚ_SSH_RSAr	   ÚDSAPrivateKeyÚDSAPublicKeyÚ_SSH_DSAr   ÚEd25519PrivateKeyÚEd25519PublicKeyÚ_SSH_ED25519Ú
ValueError)r9   Úkey_typer"   r"   r#   Ú_get_ssh_key_typeŽ   s    
 
ÿrK   úec.EllipticCurvePublicKey©r>   r!   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_TYPErI   )r>   rN   r"   r"   r#   r=   ¡   s    

ÿr=   ó   
úutils.Buffer)ÚdataÚprefixÚsuffixr!   c                 C  s   d  |t| ƒ|g¡S )Nó    )ÚjoinÚ_base64_encode)rS   rT   rU   r"   r"   r#   Ú_ssh_pem_encode«   s    rY   ÚNone)rS   r-   r!   c                 C  s    | rt | ƒ| dkrtdƒ‚dS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)ÚlenrI   )rS   r-   r"   r"   r#   Ú_check_block_size³   s    r\   ©rS   r!   c                 C  s   | rt dƒ‚dS )z!All data should have been parsed.zCorrupt data: unparsed dataN)rI   ©rS   r"   r"   r#   Ú_check_empty¹   s    r_   úbytes | Nonez)Cipher[modes.CBC | modes.CTR | modes.GCM])Ú
ciphernamer   r   r   r!   c                 C  sV   |st dƒ‚t|  }t|||j|j |dƒ}t| |d|j… ¡| ||jd… ¡ƒS )z$Generate key + iv and return cipher.z9Key is password-protected, but password was not provided.TN)Ú	TypeErrorr8   r$   r+   r.   r   r*   r,   )ra   r   r   r   ÚciphÚseedr"   r"   r#   Ú_init_cipher¿   s     ÿ  
  ÿþre   Ú
memoryviewztuple[int, memoryview]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©r[   rI   r   Ú
from_bytesr^   r"   r"   r#   Ú_get_u32Õ   s    rn   c                 C  s6   t | ƒdk rtdƒ‚tj| dd… dd�| dd… fS )ZUint64é   rh   Nri   rj   rl   r^   r"   r"   r#   Ú_get_u64Ü   s    rp   ztuple[memoryview, memoryview]c                 C  s8   t | ƒ\}} |t| ƒkr tdƒ‚| d|… | |d… fS )zBytes with u32 length prefixrh   N)rn   r[   rI   )rS   Únr"   r"   r#   Ú_get_sshstrã   s    rr   c                 C  s4   t | ƒ\}} |r$|d dkr$tdƒ‚t |d¡| fS )zBig integer.r   é   rh   ri   )rr   rI   r   rm   )rS   Úvalr"   r"   r#   Ú
_get_mpintë   s    ru   ©rt   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 allowedrV   ro   )rI   Ú
bit_lengthr   Zint_to_bytes)rt   Únbytesr"   r"   r#   Ú	_to_mpintó   s    ry   c                   @  s¬   e Zd ZU dZded< d#dddœdd	„Zd
ddœdd„Zdddœdd„Zdddœdd„Zdddœdd„Z	dddœdd„Z
ddœdd„Zd$ddddœdd„Zd dœd!d"„ZdS )%Ú	_FragListz,Build recursive structure without data copy.zlist[utils.Buffer]ÚflistNzlist[utils.Buffer] | NonerZ   )Úinitr!   c                 C  s   g | _ |r| j  |¡ d S ©N)r{   Úextend)Úselfr|   r"   r"   r#   Ú__init__  s    z_FragList.__init__rR   rv   c                 C  s   | j  |¡ dS )zAdd plain bytesN)r{   Úappend©r   rt   r"   r"   r#   Úput_raw  s    z_FragList.put_rawr   c                 C  s   | j  |jddd�¡ dS )zBig-endian uint32rg   ri   ©Úlengthrk   N©r{   r�   Úto_bytesr‚   r"   r"   r#   Úput_u32  s    z_FragList.put_u32c                 C  s   | j  |jddd�¡ dS )zBig-endian uint64ro   ri   r„   Nr†   r‚   r"   r"   r#   Úput_u64  s    z_FragList.put_u64zbytes | _FragListc                 C  sL   t |tttfƒr,|  t|ƒ¡ | j |¡ n|  | ¡ ¡ | j 	|j¡ dS )zBytes prefixed with u32 lengthN)
r;   r   rf   Ú	bytearrayrˆ   r[   r{   r�   Úsizer~   r‚   r"   r"   r#   Ú
put_sshstr  s
    z_FragList.put_sshstrc                 C  s   |   t|ƒ¡ dS )z*Big-endian bigint prefixed with u32 lengthN)rŒ   ry   r‚   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Úmapr[   r{   ©r   r"   r"   r#   r‹      s    z_FragList.sizer   rf   )ÚdstbufÚposr!   c                 C  s2   | j D ]&}t|ƒ}|||  }}||||…< q|S )zWrite into bytearray)r{   r[   )r   r’   r“   ÚfragZflenÚstartr"   r"   r#   Úrender$  s
    
z_FragList.renderr   c                 C  s"   t t|  ¡ ƒƒ}|  |¡ | ¡ S )zReturn as bytes)rf   rŠ   r‹   r–   Útobytes)r   Úbufr"   r"   r#   r—   ,  s    
z_FragList.tobytes)N)r   )r2   r3   r4   Ú__doc__r5   r€   rƒ   rˆ   r‰   rŒ   r�   r‹   r–   r—   r"   r"   r"   r#   rz   ý   s   
	rz   c                   @  sf   e Zd ZdZdddœdd„Zdddœdd	„Zdd
ddœdd„Zddddœdd„Zddddœdd„ZdS )Ú_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    rf   z"tuple[tuple[int, int], memoryview]r]   c                 C  s$   t |ƒ\}}t |ƒ\}}||f|fS )zRSA public fields©ru   )r   rS   Úerq   r"   r"   r#   Ú
get_public<  s    z_SSHFormatRSA.get_publicz#tuple[rsa.RSAPublicKey, memoryview]c                 C  s.   |   |¡\\}}}t ||¡}| ¡ }||fS )zMake RSA public key from data.)r�   r   ÚRSAPublicNumbersr>   )r   rS   rœ   rq   Úpublic_numbersr>   r"   r"   r#   Úload_publicD  s    z_SSHFormatRSA.load_publicr   z$tuple[rsa.RSAPrivateKey, memoryview]©rS   Úunsafe_skip_rsa_key_validationr!   c              	   C  sª   t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}	}||f|kr\tdƒ‚t ||¡}
t ||	¡}t ||¡}t ||	||
|||¡}|j|d�}||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch©r¢   )ru   rI   r   Zrsa_crt_dmp1Zrsa_crt_dmq1rž   ZRSAPrivateNumbersÚprivate_key)r   rS   Ú	pubfieldsr¢   rq   rœ   ÚdÚiqmpÚpÚqZdmp1Zdmq1rŸ   Úprivate_numbersr¤   r"   r"   r#   Úload_privateM  s0          ÿÿz_SSHFormatRSA.load_privatezrsa.RSAPublicKeyrz   rZ   ©r>   Úf_pubr!   c                 C  s$   |  ¡ }| |j¡ | |j¡ dS )zWrite RSA public keyN)rŸ   r�   rœ   rq   )r   r>   r­   Zpubnr"   r"   r#   Úencode_publice  s    z_SSHFormatRSA.encode_publiczrsa.RSAPrivateKey©r¤   Úf_privr!   c                 C  sZ   |  ¡ }|j}| |j¡ | |j¡ | |j¡ | |j¡ | |j¡ | |j¡ dS )zWrite RSA private keyN)	rª   rŸ   r�   rq   rœ   r¦   r§   r¨   r©   )r   r¤   r°   rª   rŸ   r"   r"   r#   Úencode_privatem  s    z_SSHFormatRSA.encode_privateN©	r2   r3   r4   r™   r�   r    r«   r®   r±   r"   r"   r"   r#   rš   3  s   	rš   c                   @  sv   e Zd ZdZdddœdd„Zdddœdd	„Zdd
ddœdd„Zddddœdd„Zddddœdd„Zdddœdd„Z	dS )Ú_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    rf   ztuple[tuple, memoryview]r]   c                 C  s@   t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}||||f|fS )zDSA public fieldsr›   )r   rS   r¨   r©   ÚgÚyr"   r"   r#   r�   †  s
    z_SSHFormatDSA.get_publicz#tuple[dsa.DSAPublicKey, memoryview]c           	      C  sJ   |   |¡\\}}}}}t |||¡}t ||¡}|  |¡ | ¡ }||fS )zMake DSA public key from data.)r�   r	   ÚDSAParameterNumbersÚDSAPublicNumbersÚ	_validater>   )	r   rS   r¨   r©   r´   rµ   Úparameter_numbersrŸ   r>   r"   r"   r#   r    Ž  s    
z_SSHFormatDSA.load_publicr   z$tuple[dsa.DSAPrivateKey, memoryview]r¡   c                 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)	r�   ru   rI   r	   r¶   r·   r¸   ZDSAPrivateNumbersr¤   )r   rS   r¥   r¢   r¨   r©   r´   rµ   Úxr¹   rŸ   rª   r¤   r"   r"   r#   r«   ™  s    
z_SSHFormatDSA.load_privatezdsa.DSAPublicKeyrz   rZ   r¬   c                 C  sL   |  ¡ }|j}|  |¡ | |j¡ | |j¡ | |j¡ | |j¡ dS )zWrite DSA public keyN)rŸ   r¹   r¸   r�   r¨   r©   r´   rµ   )r   r>   r­   rŸ   r¹   r"   r"   r#   r®   ©  s    
z_SSHFormatDSA.encode_publiczdsa.DSAPrivateKeyr¯   c                 C  s$   |   | ¡ |¡ | | ¡ j¡ dS )zWrite DSA private keyN)r®   r>   r�   rª   rº   )r   r¤   r°   r"   r"   r#   r±   ¶  s    z_SSHFormatDSA.encode_privatezdsa.DSAPublicNumbers)rŸ   r!   c                 C  s    |j }|j ¡ dkrtdƒ‚d S )Ni   z#SSH supports only 1024 bit DSA keys)r¹   r¨   rw   rI   )r   rŸ   r¹   r"   r"   r#   r¸   ½  s    z_SSHFormatDSA._validateN)
r2   r3   r4   r™   r�   r    r«   r®   r±   r¸   r"   r"   r"   r#   r³   }  s   r³   c                   @  sv   e Zd ZdZdddœdd„Zddd	œd
d„Zddd	œdd„Zddddœdd„Zddddœdd„Zddddœdd„Z	dS )Ú_SSHFormatECDSAz–Format for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    r   úec.EllipticCurve©Ússh_curve_namerN   c                 C  s   || _ || _d S r}   r½   )r   r¾   rN   r"   r"   r#   r€   Ï  s    z_SSHFormatECDSA.__init__rf   z0tuple[tuple[memoryview, memoryview], memoryview]r]   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   rg   zNeed uncompressed point)rr   r¾   rI   ÚNotImplementedError)r   rS   rN   Úpointr"   r"   r#   r�   Ó  s    
z_SSHFormatECDSA.get_publicú,tuple[ec.EllipticCurvePublicKey, memoryview]c                 C  s.   |   |¡\\}}}tj | j| ¡ ¡}||fS ©z Make ECDSA public key from data.)r�   r
   r?   Zfrom_encoded_pointrN   r—   )r   rS   Ú_rÀ   r>   r"   r"   r#   r    ß  s     ÿz_SSHFormatECDSA.load_publicr   z-tuple[ec.EllipticCurvePrivateKey, memoryview]r¡   c                 C  sH   |   |¡\\}}}t|ƒ\}}||f|kr2tdƒ‚t || j¡}||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r�   ru   rI   r
   Zderive_private_keyrN   )r   rS   r¥   r¢   Z
curve_namerÀ   Úsecretr¤   r"   r"   r#   r«   é  s    z_SSHFormatECDSA.load_privaterL   rz   rZ   r¬   c                 C  s*   |  tjtj¡}| | j¡ | |¡ dS )zWrite ECDSA public keyN)Úpublic_bytesr   ZX962r   ZUncompressedPointrŒ   r¾   )r   r>   r­   rÀ   r"   r"   r#   r®   õ  s     ÿz_SSHFormatECDSA.encode_publiczec.EllipticCurvePrivateKeyr¯   c                 C  s,   |  ¡ }| ¡ }|  ||¡ | |j¡ dS )zWrite ECDSA private keyN)r>   rª   r®   r�   Zprivate_value)r   r¤   r°   r>   rª   r"   r"   r#   r±   ÿ  s    z_SSHFormatECDSA.encode_privateN)
r2   r3   r4   r™   r€   r�   r    r«   r®   r±   r"   r"   r"   r#   r»   Ã  s   

r»   c                   @  sf   e Zd ZdZdddœdd„Zdddœdd	„Zdd
ddœdd„Zddddœdd„Zddddœdd„ZdS )Ú_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    rf   z$tuple[tuple[memoryview], memoryview]r]   c                 C  s   t |ƒ\}}|f|fS )zEd25519 public fields)rr   )r   rS   rÀ   r"   r"   r#   r�     s    z_SSHFormatEd25519.get_publicú+tuple[ed25519.Ed25519PublicKey, memoryview]c                 C  s(   |   |¡\\}}tj | ¡ ¡}||fS ©z"Make Ed25519 public key from data.)r�   r   rG   Zfrom_public_bytesr—   )r   rS   rÀ   r>   r"   r"   r#   r      s
    ÿz_SSHFormatEd25519.load_publicr   z,tuple[ed25519.Ed25519PrivateKey, memoryview]r¡   c           	      C  sb   |   |¡\\}}t|ƒ\}}|dd… }|dd… }||ksF|f|krNtdƒ‚tj |¡}||fS )z#Make Ed25519 private key from data.Nr6   z$Corrupt data: ed25519 field mismatch)r�   rr   rI   r   rF   Zfrom_private_bytes)	r   rS   r¥   r¢   rÀ   ZkeypairrÄ   Zpoint2r¤   r"   r"   r#   r«   %  s    z_SSHFormatEd25519.load_privatezed25519.Ed25519PublicKeyrz   rZ   r¬   c                 C  s   |  tjtj¡}| |¡ dS )zWrite Ed25519 public keyN)rÅ   r   ÚRawr   rŒ   )r   r>   r­   Úraw_public_keyr"   r"   r#   r®   3  s
     ÿz_SSHFormatEd25519.encode_publiczed25519.Ed25519PrivateKeyr¯   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   rz   r®   rŒ   )r   r¤   r°   r>   Zraw_private_keyrÊ   Z	f_keypairr"   r"   r#   r±   <  s      ÿ ÿz _SSHFormatEd25519.encode_privateNr²   r"   r"   r"   r#   rÆ   
  s   	
	rÆ   rŽ   c                 C  s2   t | ƒ\}} | ¡  d¡s*td|› d�ƒ‚|| fS )z!
    U2F application strings
    s   ssh:z4U2F application string does not start with b'ssh:' (ú))rr   r—   Ú
startswithrI   )rS   Zapplicationr"   r"   r#   Úload_applicationM  s    
ÿrÍ   c                   @  s0   e Zd ZdZdddœdd„Zdddœdd	„Zd
S )Ú_SSHFormatSKEd25519zÏ
    The format of a sk-ssh-ed25519@openssh.com public key is:

        string		"sk-ssh-ed25519@openssh.com"
        string		public key
        string		application (user-specified, but typically "ssh:")
    rf   rÇ   r]   c                 C  s&   t tƒ |¡\}}t|ƒ\}}||fS rÈ   )Ú_lookup_kformatrH   r    rÍ   ©r   rS   r>   rÃ   r"   r"   r#   r    c  s    z_SSHFormatSKEd25519.load_publicútyping.NoReturnc                 C  s   t dƒ‚d S )Nz,sk-ssh-ed25519 private keys cannot be loadedr   ©r   rS   r"   r"   r#   r�   k  s    ÿz_SSHFormatSKEd25519.get_publicN©r2   r3   r4   r™   r    r�   r"   r"   r"   r#   rÎ   Z  s   rÎ   c                   @  s0   e Zd ZdZdddœdd„Zdddœdd	„Zd
S )Ú_SSHFormatSKECDSAzò
    The format of a sk-ecdsa-sha2-nistp256@openssh.com public key is:

        string		"sk-ecdsa-sha2-nistp256@openssh.com"
        string		curve name
        ec_point	Q
        string		application (user-specified, but typically "ssh:")
    rf   rÁ   r]   c                 C  s&   t tƒ |¡\}}t|ƒ\}}||fS rÂ   )rÏ   Ú_ECDSA_NISTP256r    rÍ   rÐ   r"   r"   r#   r    }  s    z_SSHFormatSKECDSA.load_publicrÑ   c                 C  s   t dƒ‚d S )Nz4sk-ecdsa-sha2-nistp256 private keys cannot be loadedr   rÒ   r"   r"   r#   r�   …  s    ÿz_SSHFormatSKECDSA.get_publicNrÓ   r"   r"   r"   r#   rÔ   s  s   	rÔ   s   nistp256s   nistp384s   nistp521©rJ   c                 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   rf   r—   Ú_KEY_FORMATSr   rÖ   r"   r"   r#   rÏ   ™  s
    
rÏ   r£   z
typing.AnyÚSSHPrivateKeyTypes)rS   r   Úbackendr¢   r!   c                C  s  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k�s|tk�r(| ¡ }|tk�r0td|›�ƒ‚|tk�rHtd|›�ƒ‚t| j}t| j}t| ƒ\}} t| j�r”t| ƒ}t|ƒ|k�rœtd	ƒ‚nt| ƒ t||ƒ t|	ƒ\}}t|ƒ\}}t|ƒ t||| ¡ |ƒ}| ¡ }t
| |¡ƒ}t| j�rt |t!ƒ�s
t"‚t| #|¡ƒ nt| $¡ ƒ n0|�r6t%d
ƒ‚t| ƒ\}} t| ƒ d}t||ƒ t|ƒ\}}t|ƒ\}}||k�r‚tdƒ‚t|ƒ\}}||k�r tdƒ‚|j&|||d�\}}t|ƒ\}}|t'dt|ƒ… k�rÞtdƒ‚t |t(j)ƒ�rþt*j+dt j,dd� |S )z.Load private key from OpenSSH custom encoding.rS   Nr   zNot OpenSSH private key formatr'   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: z+Corrupt data: invalid tag length for cipherz4Password was given but private key is not encrypted.ro   zCorrupt data: broken checksumzCorrupt data: key type mismatchr£   zCorrupt data: invalid paddingúDSSH DSA keys are deprecated and will be removed in a future release.é   ©Ú
stacklevel)-r   Ú_check_byteslikeÚ_check_bytesÚ_PEM_RCÚsearchrI   r•   ÚendÚbinasciiÚ
a2b_base64rf   rÌ   Ú	_SK_MAGICr[   rr   rn   rÏ   r�   r_   Ú_NONEr—   r8   r   Ú_BCRYPTr-   r0   r1   r   r\   re   Z	decryptorÚupdater;   r   ÚAssertionErrorZfinalize_with_tagÚfinalizerb   r«   Ú_PADDINGr	   rC   ÚwarningsÚwarnÚDeprecatedIn40)rS   r   rÙ   r¢   ÚmÚp1Úp2ra   ÚkdfnameZ
kdfoptionsÚnkeysZpubdataZpub_key_typeÚkformatr¥   Zciphername_bytesÚblklenr0   ZedataÚtagr   Zkbufr   rc   ÚdecZck1Zck2rJ   r¤   rÃ   r"   r"   r#   Úload_ssh_private_keyª  s     




ÿ




ÿ


ý
ürø   r   )r¤   r   Úencryption_algorithmr!   c                 C  sæ  t  d|¡ t| tjƒr*tjdt jdd� t| ƒ}t	|ƒ}t
ƒ }|r¢t}t| j}t}t}	t|tƒrt|jdk	rt|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   úISSH DSA key support is deprecated and will be removed in a future releaserg   rÜ   Nr&   ro   r'   rV   )%r   rß   r;   r	   rC   rì   rí   rî   rK   rÏ   rz   Ú_DEFAULT_CIPHERr8   r-   rç   Ú_DEFAULT_ROUNDSr   Z_kdf_roundsÚosÚurandomrŒ   rˆ   re   ræ   r®   r>   r±   rƒ   rë   r‹   rå   rf   rŠ   r–   Z	encryptorZupdate_intorY   )r¤   r   rù   rJ   rô   Zf_kdfoptionsra   rõ   rò   r   r   rc   ró   ZcheckvalÚcommentZf_public_keyZ	f_secretsZf_mainÚslenÚmlenr˜   Zofsr"   r"   r#   Ú_serialize_ssh_private_key  sl    ü
ÿþ















 r  c                   @  s   e Zd ZdZdZdS )ÚSSHCertificateTyper'   rÛ   N)r2   r3   r4   ÚUSERZHOSTr"   r"   r"   r#   r  w  s   r  c                   @  s  e Zd Zddddddddddddddddddœdd	„Zedd
œdd„ƒZdd
œdd„Zedd
œdd„ƒZedd
œdd„ƒZedd
œdd„ƒZ	edd
œdd„ƒZ
edd
œdd„ƒZedd
œdd„ƒZedd
œdd„ƒZedd
œdd „ƒZdd
œd!d"„Zdd
œd#d$„Zd%d
œd&d'„Zd(S ))ÚSSHCertificaterf   ÚSSHPublicKeyTypesr   úlist[bytes]údict[bytes, bytes]r   )Ú_nonceÚ_public_keyÚ_serialÚ_cctypeÚ_key_idÚ_valid_principalsÚ_valid_afterÚ_valid_beforeÚ_critical_optionsÚ_extensionsÚ	_sig_typeÚ_sig_keyÚ_inner_sig_typeÚ
_signatureÚ_tbs_cert_bodyÚ_cert_key_typeÚ
_cert_bodyc                 C  s�   || _ || _|| _zt|ƒ| _W n tk
r<   tdƒ‚Y nX || _|| _|| _|| _	|	| _
|
| _|| _|| _|| _|| _|| _|| _|| _d S )NzInvalid certificate type)r	  r
  r  r  Ú_typerI   r  r  r  r  r  r  r  r  r  r  r  r  r  )r   r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"   r"   r#   r€   }  s(    zSSHCertificate.__init__rŽ   c                 C  s
   t | jƒS r}   )r   r	  r‘   r"   r"   r#   Únonce¦  s    zSSHCertificate.nonceÚSSHCertPublicKeyTypesc                 C  s   t  t| j¡S r}   )ÚtypingÚcastr  r
  r‘   r"   r"   r#   r>   ª  s    zSSHCertificate.public_keyc                 C  s   | j S r}   )r  r‘   r"   r"   r#   Úserial¯  s    zSSHCertificate.serialr  c                 C  s   | j S r}   )r  r‘   r"   r"   r#   Útype³  s    zSSHCertificate.typec                 C  s
   t | jƒS r}   )r   r  r‘   r"   r"   r#   Úkey_id·  s    zSSHCertificate.key_idc                 C  s   | j S r}   )r  r‘   r"   r"   r#   Úvalid_principals»  s    zSSHCertificate.valid_principalsc                 C  s   | j S r}   )r  r‘   r"   r"   r#   Úvalid_before¿  s    zSSHCertificate.valid_beforec                 C  s   | j S r}   )r  r‘   r"   r"   r#   Úvalid_afterÃ  s    zSSHCertificate.valid_afterc                 C  s   | j S r}   )r  r‘   r"   r"   r#   Úcritical_optionsÇ  s    zSSHCertificate.critical_optionsc                 C  s   | j S r}   )r  r‘   r"   r"   r#   Ú
extensionsË  s    zSSHCertificate.extensionsc                 C  s&   t | jƒ}| | j¡\}}t|ƒ |S r}   )rÏ   r  r    r  r_   )r   Z	sigformatÚsignature_keyZsigkey_restr"   r"   r#   r'  Ï  s    
zSSHCertificate.signature_keyc                 C  s"   t | jƒd tjt | jƒdd� S )Nó    F)Únewline)r   r  rã   Ú
b2a_base64r  r‘   r"   r"   r#   rÅ   Õ  s    ÿþÿzSSHCertificate.public_bytesrZ   c                 C  s   |   ¡ }t|tjƒr.| t| jƒt| jƒ¡ nÎt|tj	ƒrŽt
| jƒ\}}t
|ƒ\}}t|ƒ t ||¡}t|jƒ}| |t| jƒt |¡¡ nnt|tjƒsžt‚| jtkr²t ¡ }n*| jtkrÆt ¡ }n| jtksÔt‚t ¡ }| t| jƒt| jƒt ¡ |¡ d S r}   )r'  r;   r   rG   Úverifyr   r  r  r
   r?   ru   r_   Ú
asym_utilsZencode_dss_signatureÚ_get_ec_hash_algrN   ÚECDSAr   rA   ré   r  rB   r   ÚSHA1Ú_SSH_RSA_SHA256ÚSHA256Ú_SSH_RSA_SHA512ÚSHA512r   ÚPKCS1v15)r   r'  ÚrrS   ÚsZcomputed_sigÚhash_algr"   r"   r#   Úverify_cert_signatureÜ  s<     ÿ
  ÿ



üz$SSHCertificate.verify_cert_signatureN)r2   r3   r4   r€   Úpropertyr  r>   r  r   r!  r"  r#  r$  r%  r&  r'  rÅ   r8  r"   r"   r"   r#   r  |  s.   .)r  r¼   zhashes.HashAlgorithm)rN   r!   c                 C  sD   t | tjƒrt ¡ S t | tjƒr(t ¡ S t | tjƒs8t‚t 	¡ S d S r}   )
r;   r
   Ú	SECP256R1r   r1  Ú	SECP384R1ÚSHA384Ú	SECP521R1ré   r3  )rN   r"   r"   r#   r-  ý  s    r-  z"SSHCertificate | SSHPublicKeyTypesc           "      C  s€  t  d| ¡ t | ¡}|s"tdƒ‚| d¡ }}| d¡}d}| t¡r^d}|d ttƒ … }|t	krr|srt
dƒ‚t|ƒ}ztt |¡ƒ}W n" ttjfk
r®   tdƒ‚Y nX |r¸|}	t|ƒ\}
}|
|krÔtd	ƒ‚|rät|ƒ\}}| |¡\}}|�rpt|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}g }|�rPt|ƒ\}}| t|ƒ¡ �q,t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ}t|ƒ\}}t|ƒ}t|ƒ\}}t|ƒ\}}t|ƒ\}}|t	k�rÌ|�sÌt
d
ƒ‚|	d t|ƒ … }t|ƒ\}}t|ƒ t|ƒ\}} |tk�r|tttfk�s,|tk�r4||k�r4tdƒ‚t| ƒ\}!} t| ƒ t||||||||||||||!|||	ƒS t|ƒ |S d S )NrS   zInvalid line formatr'   rÛ   FTz-DSA keys aren't supported in SSH certificateszInvalid formatzInvalid key formatz3DSA signatures aren't supported in SSH certificatesz!Signature key type does not match)r   rÞ   Ú_SSH_PUBKEY_RCÚmatchrI   ÚgroupÚendswithÚ_CERT_SUFFIXr[   rE   r   rÏ   rf   rã   rä   rb   ÚErrorrr   r    rp   rn   r�   r   Ú_parse_exts_optsr_   rB   r0  r2  r  )"rS   Ú_legacy_dsa_allowedrï   rJ   Zorig_key_typeZkey_bodyZ	with_certrô   ÚrestZ	cert_bodyZinner_key_typer  r>   r  Zcctyper!  Z
principalsr"  Z	principalr$  r#  Zcrit_optionsr%  Úextsr&  rÃ   Zsig_key_rawZsig_typeZsig_keyZtbs_cert_bodyZsignature_rawZinner_sig_typeZsig_restÚ	signaturer"   r"   r#   Ú_load_ssh_public_identity  s®    


ÿÿÿÿþüüïrI  c                 C  s   t | ƒS r}   )rI  r^   r"   r"   r#   Úload_ssh_public_identityf  s    rJ  r  )Ú	exts_optsr!   c                 C  s–   i }d }| r’t | ƒ\}} t|ƒ}||kr0tdƒ‚|d k	rH||k rHtdƒ‚t | ƒ\}} t|ƒdkr€t |ƒ\}}t|ƒdkr€tdƒ‚t|ƒ||< |}q|S )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)rr   r   rI   r[   )rK  ÚresultÚ	last_namerO   ZbnameÚvalueÚextrar"   r"   r#   rD  l  s"    rD  r  zhashes.MD5 | hashes.SHA256)r9   Úhash_algorithmr!   c                 C  sj   t |tjtjfƒstdƒ‚t| ƒ}t|ƒ}tƒ }| |¡ | 	| |¡ | 
¡ }t |¡}| |¡ | ¡ S )Nz+hash_algorithm must be either MD5 or SHA256)r;   r   ÚMD5r1  rb   rK   rÏ   rz   rŒ   r®   r—   ZHashrè   rê   )r9   rP  rJ   rô   r­   Zssh_binary_dataZhash_objr"   r"   r#   Ússh_key_fingerprint€  s    


rR  )rS   rÙ   r!   c                 C  sF   t | dd�}t|tƒr | ¡ }n|}t|tjƒrBtjdtj	dd� |S )NT)rE  rÚ   rÛ   rÜ   )
rI  r;   r  r>   r	   rD   rì   rí   r   rî   )rS   rÙ   Zcert_or_keyr>   r"   r"   r#   Úload_ssh_public_key–  s    

ürS  c                 C  sl   t | tjƒrtjdtjdd� t| ƒ}t|ƒ}t	ƒ }| 
|¡ | | |¡ t | ¡ ¡ ¡ }d |d|g¡S )z&One-line public key format for OpenSSHrú   rg   rÜ   rV   r(  )r;   r	   rD   rì   rí   r   rî   rK   rÏ   rz   rŒ   r®   rã   r*  r—   ÚstriprW   )r>   rJ   rô   r­   Zpubr"   r"   r#   Úserialize_ssh_public_keyª  s    ü
rU  é   c                   @  sî   e Zd Zddddg dddg g f
ddddddddd	d	d
œ
dd„Zdd dœdd„Zdd dœdd„Zdd dœdd„Zdd dœdd„Zdd dœdd„Zd d!„ Z	d"d d#œd$d%„Z
d"d d&œd'd(„Zddd d)œd*d+„Zddd d)œd,d-„Zd.d/d0œd1d2„ZdS )3ÚSSHCertificateBuilderNFzSSHCertPublicKeyTypes | Noner/   zSSHCertificateType | Noner`   r  r   zlist[tuple[bytes, bytes]]©
r
  r  r  r  r  Ú_valid_for_all_principalsr  r  r  r  c                 C  s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S r}   rX  )r   r
  r  r  r  r  rY  r  r  r  r  r"   r"   r#   r€   Ë  s    zSSHCertificateBuilder.__init__r  rM   c                 C  s^   t |tjtjtjfƒstdƒ‚| jd k	r0t	dƒ‚t
|| j| j| j| j| j| j| j| j| jd�
S )Nr:   zpublic_key already setrX  )r;   r
   r?   r   rA   r   rG   rb   r
  rI   rW  r  r  r  r  rY  r  r  r  r  )r   r>   r"   r"   r#   r>   ã  s,    ýþ
öz SSHCertificateBuilder.public_keyr   )r  r!   c                 C  sp   t |tƒstdƒ‚d|  kr&dk s0n tdƒ‚| jd k	rBtdƒ‚t| j|| j| j| j	| j
| j| j| j| jd�
S )Nzserial must be an integerr   ì            z"serial must be between 0 and 2**64zserial already setrX  )r;   r   rb   rI   r  rW  r
  r  r  r  rY  r  r  r  r  )r   r  r"   r"   r#   r  ÿ  s$    

özSSHCertificateBuilder.serialr  )r   r!   c                 C  sR   t |tƒstdƒ‚| jd k	r$tdƒ‚t| j| j|| j| j	| j
| j| j| j| jd�
S )Nz"type must be an SSHCertificateTypeztype already setrX  )r;   r  rb   r  rI   rW  r
  r  r  r  rY  r  r  r  r  )r   r   r"   r"   r#   r     s     

özSSHCertificateBuilder.typer   )r!  r!   c                 C  sR   t |tƒstdƒ‚| jd k	r$tdƒ‚t| j| j| j|| j	| j
| j| j| j| jd�
S )Nzkey_id must be byteszkey_id already setrX  )r;   r   rb   r  rI   rW  r
  r  r  r  rY  r  r  r  r  )r   r!  r"   r"   r#   r!  '  s     

özSSHCertificateBuilder.key_id)r"  r!   c                 C  s|   | j rtdƒ‚tdd„ |D ƒƒr$|s,tdƒ‚| jr:tdƒ‚t|ƒtkrNtdƒ‚t| j| j	| j
| j|| j | j| j| j| jd�
S )NzDPrincipals can't be set because the cert is valid for all principalsc                 s  s   | ]}t |tƒV  qd S r}   )r;   r   )Ú.0rº   r"   r"   r#   Ú	<genexpr>C  s     z9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>z5principals must be a list of bytes and can't be emptyzvalid_principals already setz:Reached or exceeded the maximum number of valid_principalsrX  )rY  rI   Úallrb   r  r[   Ú_SSHKEY_CERT_MAX_PRINCIPALSrW  r
  r  r  r  r  r  r  r  )r   r"  r"   r"   r#   r"  :  s:    ÿÿþÿÿöz&SSHCertificateBuilder.valid_principalsc                 C  sJ   | j rtdƒ‚| jrtdƒ‚t| j| j| j| j| j d| j| j	| j
| jd�
S )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setTrX  )r  rI   rY  rW  r
  r  r  r  r  r  r  r  r‘   r"   r"   r#   Úvalid_for_all_principals^  s$    ÿöz.SSHCertificateBuilder.valid_for_all_principalszint | float)r#  r!   c                 C  sv   t |ttfƒstdƒ‚t|ƒ}|dk s.|dkr6tdƒ‚| jd k	rHtdƒ‚t| j| j| j	| j
| j| j|| j| j| jd�
S )Nz$valid_before must be an int or floatr   rZ  zvalid_before must [0, 2**64)zvalid_before already setrX  )r;   r   Úfloatrb   rI   r  rW  r
  r  r  r  r  rY  r  r  r  )r   r#  r"   r"   r#   r#  t  s&    
öz"SSHCertificateBuilder.valid_before)r$  r!   c                 C  sv   t |ttfƒstdƒ‚t|ƒ}|dk s.|dkr6tdƒ‚| jd k	rHtdƒ‚t| j| j| j	| j
| j| j| j|| j| jd�
S )Nz#valid_after must be an int or floatr   rZ  zvalid_after must [0, 2**64)zvalid_after already setrX  )r;   r   r`  rb   rI   r  rW  r
  r  r  r  r  rY  r  r  r  )r   r$  r"   r"   r#   r$  Š  s&    
öz!SSHCertificateBuilder.valid_after)rO   rN  r!   c                 C  sr   t |tƒrt |tƒstdƒ‚|dd„ | jD ƒkr8tdƒ‚t| j| j| j| j	| j
| j| j| j| j||ff•| jd�
S )Núname and value must be bytesc                 S  s   g | ]\}}|‘qS r"   r"   ©r[  rO   rÃ   r"   r"   r#   Ú
<listcomp>¦  s     z=SSHCertificateBuilder.add_critical_option.<locals>.<listcomp>zDuplicate critical option namerX  )r;   r   rb   r  rI   rW  r
  r  r  r  r  rY  r  r  r  ©r   rO   rN  r"   r"   r#   Úadd_critical_option   s     öz)SSHCertificateBuilder.add_critical_optionc                 C  sr   t |tƒrt |tƒstdƒ‚|dd„ | jD ƒkr8tdƒ‚t| j| j| j| j	| j
| j| j| j| j| j||ff•d�
S )Nra  c                 S  s   g | ]\}}|‘qS r"   r"   rb  r"   r"   r#   rc  ¼  s     z7SSHCertificateBuilder.add_extension.<locals>.<listcomp>zDuplicate extension namerX  )r;   r   rb   r  rI   rW  r
  r  r  r  r  rY  r  r  r  rd  r"   r"   r#   Úadd_extension¶  s     öz#SSHCertificateBuilder.add_extensionÚSSHCertPrivateKeyTypesr  )r¤   r!   c              	   C  sð  t |tjtjtjfƒstdƒ‚| jd kr0t	dƒ‚| j
d kr>dn| j
}| jd krVt	dƒ‚| jd krddn| j}| js~| js~t	dƒ‚| jd kr�t	dƒ‚| jd kr¢t	dƒ‚| j| jkr¶t	d	ƒ‚| jjd
d„ d� | jjdd„ d� t| jƒ}|t }t d¡}t|ƒ}tƒ }| |¡ | |¡ | | j|¡ | |¡ | | jj¡ | |¡ tƒ }	| jD ]}
|	 |
¡ �qT| |	 ¡ ¡ | | j¡ | | j¡ tƒ }| jD ]L\}}| |¡ t |ƒdk�rØtƒ }| |¡ | | ¡ ¡ n
| |¡ �q˜| | ¡ ¡ tƒ }| jD ]L\}}| |¡ t |ƒdk�r@tƒ }| |¡ | | ¡ ¡ n
| |¡ �q | | ¡ ¡ | d¡ t|ƒ}t|ƒ}tƒ }| |¡ | | !¡ |¡ | | ¡ ¡ t |tjƒ�rê| "| ¡ ¡}tƒ }| |¡ | |¡ | | ¡ ¡ nØt |tjƒ�rnt#|j$ƒ}| "| ¡ t %|¡¡}t& '|¡\}}tƒ }| |¡ tƒ }| (|¡ | (|¡ | | ¡ ¡ | | ¡ ¡ nTt |tjƒ�s€t)‚tƒ }| t*¡ | "| ¡ t+ ,¡ t- .¡ ¡}| |¡ | | ¡ ¡ t/ 0| ¡ ¡ 1¡ }t2 3t4t5d 6|d|g¡ƒ¡S )NzUnsupported private key typezpublic_key must be setr   ztype must be setrV   zAvalid_principals must be set if valid_for_all_principals is Falsezvalid_before must be setzvalid_after must be setz-valid_after must be earlier than valid_beforec                 S  s   | d S ©Nr   r"   ©rº   r"   r"   r#   Ú<lambda>÷  rV   z,SSHCertificateBuilder.sign.<locals>.<lambda>)r9   c                 S  s   | d S rh  r"   ri  r"   r"   r#   rj  ø  rV   r6   r(  )7r;   r
   r<   r   r@   r   rF   rb   r
  rI   r  r  r  r  rY  r  r  r  Úsortr  rK   rB  rý   rþ   rÏ   rz   rŒ   r®   r‰   rˆ   rN  r—   r[   r>   Úsignr-  rN   r.  r,  Zdecode_dss_signaturer�   ré   r2  r   r4  r   r3  rã   r*  rT  r  r  r  rJ  rW   )r   r¤   r  r!  rJ   Zcert_prefixr  rô   ÚfZfprincipalsr¨   ZfcritrO   rN  ZfoptvalZfextZfextvalZca_typeZcaformatZcafrH  Zfsigr7  r5  r6  ZfsigblobZ	cert_datar"   r"   r#   rl  Ì  sÈ    ýþ

ÿ





















  ÿ
þzSSHCertificateBuilder.sign)r2   r3   r4   r€   r>   r  r   r!  r"  r_  r#  r$  re  rf  rl  r"   r"   r"   r#   rW  Ê  s,   õ"$rW  )F)N)F)N)€Ú
__future__r   rã   Úenumrý   Úrer  rì   Úbase64r   rX   Zdataclassesr   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr	   r
   r   r   r   r,  Z&cryptography.hazmat.primitives.ciphersr   r   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Zbcryptr   r$   Z_bcrypt_supportedÚImportErrorrH   rB   rE   rÕ   Z_ECDSA_NISTP384Z_ECDSA_NISTP521rB  Z_SK_SSH_ED25519Z_SK_SSH_ECDSA_NISTP256r0  r2  Úcompiler>  rå   Z	_SK_STARTZ_SK_ENDrç   ræ   rû   rü   ÚDOTALLrà   rf   rŠ   Úrangerë   r)   ZAESZCTRZCBCZGCMr8   r5   rP   rK   r=   rY   r\   r_   re   rn   rp   rr   ru   ry   rz   rš   r³   r»   rÆ   rÍ   rÎ   rÔ   r:  r;  r=  r×   rÏ   ÚUnionr<   r@   rC   rF   rØ   rø   r  r?   rA   rD   rG   r  r  ÚEnumr  r  r-  rI  rJ  rD  rR  rS  rU  rg  r^  rW  r"   r"   r"   r#   Ú<module>   sD    	 û 

ù	ù	ùí ýý
6JFGC        ø	ýÿ ýûrMýÿþÿ  þ_ ÿþÿ	