o
    =jÒ  ã                   @  sB  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 n e*y‰   dZ)	d d¡dd„Z(Y nw 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/d0„ d0ƒƒZEeEejFd1ejGd+d+ddd2�eEejFd1ejHd+d+ddd2�eEejFd1ejId+d3d+dd2�d4œZJd5eKd6< e.e/e0d7œZLd¢d:d;„ZMd£d>d?„ZNe9d@ e:d@ fd¤dEdF„ZOd¥dIdJ„ZPd¦dKdL„ZQd§dPdQ„ZRd¨dTdU„ZSd¨dVdW„ZTd©dYdZ„ZUd¨d[d\„ZVdªd^d_„ZWG d`da„ daƒZXG dbdc„ dcƒZYG ddde„ deƒZZG dfdg„ dgƒZ[G dhdi„ diƒZ\d«djdk„Z]G dldm„ dmƒZ^G dndo„ doƒZ_e,eYƒ e-eZƒ e+e\ƒ e.e[dpe `¡ ƒe/e[dqe a¡ ƒe0e[dre b¡ ƒe2e^ƒ e3e_ƒ iZcd¬dtdu„Zdejeejfejgejhejif Zj	d­ddvœd®d{d|„Zkd¯d€d�„Zlejeejmejnejoejpf Zqejeejmejnejpf ZrG d‚dƒ„ dƒejsƒZtG d„d…„ d…ƒZud°d‰dŠ„Zv	d d±dŒd�„Zwd±dŽd�„Zxd²d’d“„Zyd³d—d˜„Zz	d­d´d™dš„Z{dµ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ÚpasswordÚbytesÚsaltÚdesired_key_bytesÚintÚroundsÚignore_few_roundsÚboolÚreturnc                 C  ó   t dƒ‚)NzNeed bcrypt moduler   )r   r   r   r   r   © r#   úzC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\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/   r1   r2   é   )r&   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]Ú_SSH_CIPHERS)Z	secp256r1Z	secp384r1Z	secp521r1Úkeyú&SSHPrivateKeyTypes | SSHPublicKeyTypesc                 C  sŠ   t | tjƒrt|  ¡ ƒ}|S t | tjƒrt| ƒ}|S t | tjtjfƒr't	}|S t | t
jt
jfƒr4t}|S t | tjtjfƒrAt}|S tdƒ‚)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)r:   Úkey_typer#   r#   r$   Ú_get_ssh_key_typeŽ   s$   óõ
÷ùÿþrM   r@   úec.EllipticCurvePublicKeyc                 C  s*   | j }|jtvrtd|j›�ƒ‚t|j S )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: N)ÚcurveÚnameÚ_ECDSA_KEY_TYPErK   )r@   rO   r#   r#   r$   r?   ¡   s   

ÿ
r?   ó   
Údataúutils.BufferÚprefixÚsuffixc                 C  s   d  |t| ƒ|g¡S )Nó    )ÚjoinÚ_base64_encode)rS   rU   rV   r#   r#   r$   Ú_ssh_pem_encode«   s   rZ   r.   ÚNonec                 C  s    | r
t | ƒ| dkrtdƒ‚dS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)ÚlenrK   )rS   r.   r#   r#   r$   Ú_check_block_size³   s   ÿr]   c                 C  s   | rt dƒ‚dS )z!All data should have been parsed.zCorrupt data: unparsed dataN)rK   ©rS   r#   r#   r$   Ú_check_empty¹   s   ÿr_   Ú
ciphernameúbytes | Noneú)Cipher[modes.CBC | modes.CTR | modes.GCM]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)Ú	TypeErrorr9   r%   r,   r/   r   r+   r-   )r`   r   r   r   ÚciphÚseedr#   r#   r$   Ú_init_cipher¿   s   ÿÿþrf   Ú
memoryviewútuple[int, memoryview]c                 C  ó6   t | ƒdk r
tdƒ‚tj| dd… dd�| dd… fS )ZUint32é   úInvalid dataNÚbig©Ú	byteorder©r\   rK   r   Ú
from_bytesr^   r#   r#   r$   Ú_get_u32Õ   ó   "rq   c                 C  ri   )ZUint64é   rk   Nrl   rm   ro   r^   r#   r#   r$   Ú_get_u64Ü   rr   rt   útuple[memoryview, memoryview]c                 C  s8   t | ƒ\}} |t| ƒkrtdƒ‚| d|… | |d… fS )zBytes with u32 length prefixrk   N)rq   r\   rK   )rS   Únr#   r#   r$   Ú_get_sshstrã   s   rw   c                 C  s4   t | ƒ\}} |r|d dkrtdƒ‚t |d¡| fS )zBig integer.r   é   rk   rl   N)rw   rK   r   rp   )rS   Úvalr#   r#   r$   Ú
_get_mpintë   s   rz   ry   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 allowedrW   rs   N)rK   Ú
bit_lengthr   Zint_to_bytes)ry   Únbytesr#   r#   r$   Ú	_to_mpintó   s   r}   c                   @  sx   e Zd ZU dZded< d$d%d	d
„Zd&dd„Zd'dd„Zd'dd„Zd(dd„Z	d'dd„Z
d)dd„Zd*d+dd „Zd,d"d#„ZdS )-Ú	_FragListz,Build recursive structure without data copy.zlist[utils.Buffer]ÚflistNÚinitúlist[utils.Buffer] | Noner!   r[   c                 C  s   g | _ |r| j  |¡ d S d S ©N)r   Úextend)Úselfr€   r#   r#   r$   Ú__init__  s   ÿz_FragList.__init__ry   rT   c                 C  s   | j  |¡ dS )zAdd plain bytesN)r   Úappend©r„   ry   r#   r#   r$   Úput_raw  ó   z_FragList.put_rawr   c                 C  ó   | j  |jddd�¡ dS )zBig-endian uint32rj   rl   ©Úlengthrn   N©r   r†   Úto_bytesr‡   r#   r#   r$   Úput_u32  ó   z_FragList.put_u32c                 C  rŠ   )zBig-endian uint64rs   rl   r‹   Nr�   r‡   r#   r#   r$   Úput_u64  r�   z_FragList.put_u64úbytes | _FragListc                 C  sN   t |tttfƒr|  t|ƒ¡ | j |¡ dS |  | ¡ ¡ | j 	|j¡ dS )zBytes prefixed with u32 lengthN)
r=   r   rg   Ú	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•   r}   r‡   r#   r#   r$   Ú	put_mpint  s   z_FragList.put_mpintc                 C  s   t tt| jƒƒS )zCurrent number of bytesN)ÚsumÚmapr\   r   ©r„   r#   r#   r$   r”      r‰   z_FragList.sizer   Údstbufrg   Úposc                 C  s2   | j D ]}t|ƒ}||| }}||||…< q|S )zWrite into bytearrayN)r   r\   )r„   rš   r›   ÚfragZflenÚstartr#   r#   r$   Úrender$  s
   
z_FragList.renderr   c                 C  s"   t t|  ¡ ƒƒ}|  |¡ | ¡ S )zReturn as bytesN)rg   r“   r”   rž   Útobytes)r„   Úbufr#   r#   r$   rŸ   ,  s   
z_FragList.tobytesr‚   )r€   r�   r!   r[   )ry   rT   r!   r[   )ry   r   r!   r[   )ry   r’   r!   r[   ©r!   r   )r   )rš   rg   r›   r   r!   r   ©r!   r   )r3   r4   r5   Ú__doc__r6   r…   rˆ   r�   r‘   r•   r–   r”   rž   rŸ   r#   r#   r#   r$   r~   ý   s   
 




	
r~   c                   @  óB   e Zd ZdZddd„Zdd	d
„Zddd„Zd dd„Zd!dd„ZdS )"Ú_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    rS   rg   r!   ú"tuple[tuple[int, int], memoryview]c                 C  s$   t |ƒ\}}t |ƒ\}}||f|fS )zRSA public fieldsN©rz   )r„   rS   Úerv   r#   r#   r$   Ú
get_public<  s   z_SSHFormatRSA.get_publicú#tuple[rsa.RSAPublicKey, memoryview]c                 C  s.   |   |¡\\}}}t ||¡}| ¡ }||fS )zMake RSA public key from data.N)r©   r   ÚRSAPublicNumbersr@   )r„   rS   r¨   rv   Úpublic_numbersr@   r#   r#   r$   Úload_publicD  s   z_SSHFormatRSA.load_publicÚunsafe_skip_rsa_key_validationr    ú$tuple[rsa.RSAPrivateKey, memoryview]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®   N)rz   rK   r   Zrsa_crt_dmp1Zrsa_crt_dmq1r«   ZRSAPrivateNumbersÚprivate_key)r„   rS   Ú	pubfieldsr®   rv   r¨   ÚdÚiqmpÚpÚqZdmp1Zdmq1r¬   Úprivate_numbersr±   r#   r#   r$   Úload_privateM  s$   ÿÿz_SSHFormatRSA.load_privater@   úrsa.RSAPublicKeyÚf_pubr~   r[   c                 C  s$   |  ¡ }| |j¡ | |j¡ dS )zWrite RSA public keyN)r¬   r–   r¨   rv   )r„   r@   rº   Zpubnr#   r#   r$   Úencode_publice  s   z_SSHFormatRSA.encode_publicr±   úrsa.RSAPrivateKeyÚf_privc                 C  sZ   |  ¡ }|j}| |j¡ | |j¡ | |j¡ | |j¡ | |j¡ | |j¡ dS )zWrite RSA private keyN)	r·   r¬   r–   rv   r¨   r³   r´   rµ   r¶   )r„   r±   r½   r·   r¬   r#   r#   r$   Úencode_privatem  s   z_SSHFormatRSA.encode_privateN)rS   rg   r!   r¦   )rS   rg   r!   rª   )rS   rg   r®   r    r!   r¯   )r@   r¹   rº   r~   r!   r[   )r±   r¼   r½   r~   r!   r[   ©	r3   r4   r5   r£   r©   r­   r¸   r»   r¾   r#   r#   r#   r$   r¥   3  s    


	
r¥   c                   @  sL   e Zd ZdZd!dd„Zd"d	d
„Zd#dd„Zd$dd„Zd%dd„Zd&dd„Z	d S )'Ú_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    rS   rg   r!   útuple[tuple, memoryview]c                 C  s@   t |ƒ\}}t |ƒ\}}t |ƒ\}}t |ƒ\}}||||f|fS )zDSA public fieldsNr§   )r„   rS   rµ   r¶   ÚgÚyr#   r#   r$   r©   †  s
   z_SSHFormatDSA.get_publicú#tuple[dsa.DSAPublicKey, memoryview]c           	      C  sJ   |   |¡\\}}}}}t |||¡}t ||¡}|  |¡ | ¡ }||fS )zMake DSA public key from data.N)r©   r	   ÚDSAParameterNumbersÚDSAPublicNumbersÚ	_validater@   )	r„   rS   rµ   r¶   rÂ   rÃ   Úparameter_numbersr¬   r@   r#   r#   r$   r­   Ž  s   
z_SSHFormatDSA.load_publicr®   r    ú$tuple[dsa.DSAPrivateKey, memoryview]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 mismatchN)	r©   rz   rK   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_privater@   údsa.DSAPublicKeyrº   r~   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_publicr±   ú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_privater¬   údsa.DSAPublicNumbersc                 C  s    |j }|j ¡ dkrtdƒ‚d S )Ni   z#SSH supports only 1024 bit DSA keys)rÈ   rµ   r{   rK   )r„   r¬   rÈ   r#   r#   r$   rÇ   ½  s   ÿz_SSHFormatDSA._validateN)rS   rg   r!   rÁ   )rS   rg   r!   rÄ   )rS   rg   r®   r    r!   rÉ   )r@   rË   rº   r~   r!   r[   )r±   rÌ   r½   r~   r!   r[   )r¬   rÍ   r!   r[   )
r3   r4   r5   r£   r©   r­   r¸   r»   r¾   rÇ   r#   r#   r#   r$   rÀ   }  s    




rÀ   c                   @  sL   e Zd ZdZd#dd„Zd$dd„Zd%dd„Zd&dd„Zd'dd„Z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   rO   úec.EllipticCurvec                 C  s   || _ || _d S r‚   )rÏ   rO   )r„   rÏ   rO   r#   r#   r$   r…   Ï  s   
z_SSHFormatECDSA.__init__rS   rg   r!   ú0tuple[tuple[memoryview, memoryview], memoryview]c                 C  s^   t |ƒ\}}t |ƒ\}}|| jkrtdƒ‚t|ƒdkrtdƒ‚|d dkr)tdƒ‚||f|fS )zECDSA public fieldszCurve name mismatchr   zInvalid EC point: empty datarj   zNeed uncompressed pointN)rw   rÏ   rK   r\   ÚNotImplementedError)r„   rS   rO   Ú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.N)r©   r
   rA   Zfrom_encoded_pointrO   rŸ   )r„   rS   Ú_rÓ   r@   r#   r#   r$   r­   á  s
   
ÿz_SSHFormatECDSA.load_publicr®   r    ú-tuple[ec.EllipticCurvePrivateKey, memoryview]c                 C  sH   |   |¡\\}}}t|ƒ\}}||f|krtdƒ‚t || j¡}||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatchN)r©   rz   rK   r
   Zderive_private_keyrO   )r„   rS   r²   r®   Z
curve_namerÓ   Úsecretr±   r#   r#   r$   r¸   ë  s   z_SSHFormatECDSA.load_privater@   rN   rº   r~   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_publicr±   ú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)rÏ   r   rO   rÐ   )rS   rg   r!   rÑ   ©rS   rg   r!   rÔ   )rS   rg   r®   r    r!   r×   )r@   rN   rº   r~   r!   r[   )r±   rÚ   r½   r~   r!   r[   )
r3   r4   r5   r£   r…   r©   r­   r¸   r»   r¾   r#   r#   r#   r$   rÎ   Ã  s    






rÎ   c                   @  r¤   )"Ú_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    rS   rg   r!   ú$tuple[tuple[memoryview], memoryview]c                 C  s   t |ƒ\}}|f|fS )zEd25519 public fieldsN)rw   )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.N)r©   r   rI   Zfrom_public_bytesrŸ   )r„   rS   rÓ   r@   r#   r#   r$   r­     s
   ÿz_SSHFormatEd25519.load_publicr®   r    ú,tuple[ed25519.Ed25519PrivateKey, memoryview]c           	      C  sb   |   |¡\\}}t|ƒ\}}|dd… }|dd… }||ks#|f|kr'tdƒ‚tj |¡}||fS )z#Make Ed25519 private key from data.Nr7   z$Corrupt data: ed25519 field mismatch)r©   rw   rK   r   rH   Zfrom_private_bytes)	r„   rS   r²   r®   rÓ   ZkeypairrØ   Zpoint2r±   r#   r#   r$   r¸   '  s   z_SSHFormatEd25519.load_privater@   úed25519.Ed25519PublicKeyrº   r~   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»   5  s   ÿz_SSHFormatEd25519.encode_publicr±   ú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   r~   r»   r•   )r„   r±   r½   r@   Zraw_private_keyrã   Z	f_keypairr#   r#   r$   r¾   >  s   ÿÿz _SSHFormatEd25519.encode_privateN)rS   rg   r!   rÝ   ©rS   rg   r!   rÞ   )rS   rg   r®   r    r!   rà   )r@   rá   rº   r~   r!   r[   )r±   rä   r½   r~   r!   r[   r¿   r#   r#   r#   r$   rÜ     s    
	



	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:' (ú)N)rw   rŸ   Ú
startswithrK   )rS   Zapplicationr#   r#   r$   Úload_applicationO  s   ÿÿrè   c                   @  ó$   e Zd ZdZddd„Z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:")
    rS   rg   r!   rÞ   c                 C  ó&   t tƒ |¡\}}t|ƒ\}}||fS rß   )Ú_lookup_kformatrJ   r­   rè   ©r„   rS   r@   rÖ   r#   r#   r$   r­   e  ó   z_SSHFormatSKEd25519.load_publicútyping.NoReturnc                 C  r"   )Nz,sk-ssh-ed25519 private keys cannot be loadedr   ©r„   rS   r#   r#   r$   r©   m  ó   ÿz_SSHFormatSKEd25519.get_publicNrå   ©rS   rg   r!   rï   ©r3   r4   r5   r£   r­   r©   r#   r#   r#   r$   rê   \  s    
rê   c                   @  ré   )Ú_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:")
    rS   rg   r!   rÔ   c                 C  rë   rÕ   )rì   Ú_ECDSA_NISTP256r­   rè   rí   r#   r#   r$   r­     rî   z_SSHFormatSKECDSA.load_publicrï   c                 C  r"   )Nz4sk-ecdsa-sha2-nistp256 private keys cannot be loadedr   rð   r#   r#   r$   r©   ‡  rñ   z_SSHFormatSKECDSA.get_publicNrÛ   rò   ró   r#   r#   r#   r$   rô   u  s    
	rô   s   nistp256s   nistp384s   nistp521rL   c                 C  s4   t | tƒst| ƒ ¡ } | tv rt|  S td| ›�ƒ‚)z"Return valid format or throw errorzUnsupported key type: N)r=   r   rg   rŸ   Ú_KEY_FORMATSr   )rL   r#   r#   r$   rì   ›  s
   
rì   r°   Úbackendú
typing.Anyr®   ÚSSHPrivateKeyTypesc                C  sö  t  d| ¡ |durt  d|¡ t | ¡}|stdƒ‚| d¡}| d¡}t 	t
| ƒ||… ¡} |  t¡s9tdƒ‚t
| ƒttƒd… } t| ƒ\}} t| ƒ\}} t| ƒ\}	} t| ƒ\}
} |
dkrctdƒ‚t| ƒ\}} t|ƒ\}}t|ƒ}| |¡\}}t|ƒ |tks‡|tk�r| ¡ }|tvr–td|›�ƒ‚|tkr¡t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ÿJ ‚t| "|¡ƒ nt| #¡ ƒ n|�rt$d
ƒ‚t| ƒ\}} t| ƒ d}t||ƒ t|ƒ\}}t|ƒ\}}||k�r;tdƒ‚t|ƒ\}}||k�rJtdƒ‚|j%|||d�\}}t|ƒ\}}|t&dt|ƒ… k�ritdƒ‚t |t'j(ƒ�ryt)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.rs   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ÚsearchrK   r�   ÚendÚbinasciiÚ
a2b_base64rg   rç   Ú	_SK_MAGICr\   rw   rq   rì   r©   r_   Ú_NONErŸ   r9   r   Ú_BCRYPTr.   r1   r2   r   r]   rf   Z	decryptorÚupdater=   r   Zfinalize_with_tagÚfinalizerc   r¸   Ú_PADDINGr	   rE   ÚwarningsÚwarnÚDeprecatedIn40)rS   r   r÷   r®   ÚmÚp1Úp2r`   ÚkdfnameZ
kdfoptionsÚnkeysZpubdataZpub_key_typeÚkformatr²   Zciphername_bytesÚblklenr1   ZedataÚtagr   Zkbufr   rd   ÚdecZck1Zck2rL   r±   rÖ   r#   r#   r$   Úload_ssh_private_key¬  s¢   



ÿ


ÿ
ÿ



ýür  r±   Úencryption_algorithmr   c                 C  sä  t  d|¡ t| tjƒrtjdt jdd� t| ƒ}t	|ƒ}t
ƒ }|rQt}t| j}t}t}	t|tƒr:|jdur:|j}	t d¡}
| |
¡ | |	¡ t|||
|	ƒ}nt }}d}d}d}t d¡}d	}t
ƒ }| |¡ | |  ¡ |¡ t
||gƒ}| |¡ | | |¡ | |¡ | td|| ¡ |  … ¡ t
ƒ }| t¡ | |¡ | |¡ | |¡ | |¡ | |¡ | |¡ | ¡ }| ¡ }tt || ƒƒ}| !|¡ || }|du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 releaserj   rü   Nr'   rs   r(   rW   )%r   rÿ   r=   r	   rE   r  r  r  rM   rì   r~   Ú_DEFAULT_CIPHERr9   r.   r  Ú_DEFAULT_ROUNDSr   Z_kdf_roundsÚosÚurandomr•   r�   rf   r  r»   r@   r¾   rˆ   r
  r”   r  rg   r“   rž   Z	encryptorZupdate_intorZ   )r±   r   r  rL   r  Zf_kdfoptionsr`   r  r  r   r   rd   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)r3   r4   r5   ÚUSERZHOSTr#   r#   r#   r$   r"  y  s    r"  c                   @  s¼   e Zd Zd9dd„Zed:dd„ƒZd;dd„Zed<d d!„ƒZed=d#d$„ƒZed:d%d&„ƒZ	ed>d'd(„ƒZ
ed<d)d*„ƒZed<d+d,„ƒZed?d-d.„ƒZed?d/d0„ƒZd;d1d2„Zd:d3d4„Zd@d6d7„Zd8S )AÚSSHCertificateÚ_noncerg   Ú_public_keyÚSSHPublicKeyTypesÚ_serialr   Ú_cctypeÚ_key_idÚ_valid_principalsúlist[bytes]Ú_valid_afterÚ_valid_beforeÚ_critical_optionsúdict[bytes, bytes]Ú_extensionsÚ	_sig_typeÚ_sig_keyÚ_inner_sig_typeÚ
_signatureÚ_tbs_cert_bodyÚ_cert_key_typer   Ú
_cert_bodyc                 C  sŠ   || _ || _|| _zt|ƒ| _W n ty   tdƒ‚w || _|| _|| _|| _	|	| _
|
| _|| _|| _|| _|| _|| _|| _|| _d S )NzInvalid certificate type)r%  r&  r(  r"  Ú_typerK   r*  r+  r-  r.  r/  r1  r2  r3  r4  r5  r7  r8  r6  )r„   r%  r&  r(  r)  r*  r+  r-  r.  r/  r1  r2  r3  r4  r5  r6  r7  r8  r#   r#   r$   r…     s*   ÿ
zSSHCertificate.__init__r!   c                 C  ó
   t | jƒS r‚   )r   r%  r™   r#   r#   r$   Únonce¨  ó   
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  ó   | j S r‚   )r(  r™   r#   r#   r$   Úserial±  ó   zSSHCertificate.serialr"  c                 C  r@  r‚   )r9  r™   r#   r#   r$   Útypeµ  rB  zSSHCertificate.typec                 C  r:  r‚   )r   r*  r™   r#   r#   r$   Úkey_id¹  r<  zSSHCertificate.key_idc                 C  r@  r‚   )r+  r™   r#   r#   r$   Úvalid_principals½  rB  zSSHCertificate.valid_principalsc                 C  r@  r‚   )r.  r™   r#   r#   r$   Úvalid_beforeÁ  rB  zSSHCertificate.valid_beforec                 C  r@  r‚   )r-  r™   r#   r#   r$   Úvalid_afterÅ  rB  zSSHCertificate.valid_afterc                 C  r@  r‚   )r/  r™   r#   r#   r$   Úcritical_optionsÉ  rB  zSSHCertificate.critical_optionsc                 C  r@  r‚   )r1  r™   r#   r#   r$   Ú
extensionsÍ  rB  zSSHCertificate.extensionsc                 C  s&   t | jƒ}| | j¡\}}t|ƒ |S r‚   )rì   r2  r­   r3  r_   )r„   Z	sigformatÚsignature_keyZsigkey_restr#   r#   r$   rJ  Ñ  s   
zSSHCertificate.signature_keyc                 C  s"   t | jƒd tjt | jƒdd� S )Nó    F)Únewline)r   r7  r  Ú
b2a_base64r8  r™   r#   r#   r$   rÙ   ×  s   ÿþÿzSSHCertificate.public_bytesr[   c                 C  s  |   ¡ }t|tjƒr| t| jƒt| jƒ¡ d S t|tj	ƒrIt
| jƒ\}}t
|ƒ\}}t|ƒ t ||¡}t|jƒ}| |t| jƒt |¡¡ d S t|tjƒsQJ ‚| jtkr[t ¡ }n| jtkret ¡ }n| jtkslJ ‚t ¡ }| t| jƒt| jƒt ¡ |¡ d S r‚   )rJ  r=   r   rI   Úverifyr   r5  r6  r
   rA   rz   r_   Ú
asym_utilsZencode_dss_signatureÚ_get_ec_hash_algrO   ÚECDSAr   rC   r4  rD   r   ÚSHA1Ú_SSH_RSA_SHA256ÚSHA256Ú_SSH_RSA_SHA512ÚSHA512r   ÚPKCS1v15)r„   rJ  ÚrrS   ÚsZcomputed_sigÚhash_algr#   r#   r$   Úverify_cert_signatureÞ  s6   ÿ
ÿ



üz$SSHCertificate.verify_cert_signatureN)"r%  rg   r&  r'  r(  r   r)  r   r*  rg   r+  r,  r-  r   r.  r   r/  r0  r1  r0  r2  rg   r3  rg   r4  rg   r5  rg   r6  rg   r7  r   r8  rg   r¢   )r!   r=  r¡   )r!   r"  )r!   r,  )r!   r0  )r!   r[   )r3   r4   r5   r…   Úpropertyr;  r@   rA  rC  rD  rE  rF  rG  rH  rI  rJ  rÙ   r[  r#   r#   r#   r$   r$  ~  s0    
)


r$  rO   rÐ   úhashes.HashAlgorithmc                 C  s@   t | tjƒr
t ¡ S t | tjƒrt ¡ S t | tjƒsJ ‚t ¡ S r‚   )	r=   r
   Ú	SECP256R1r   rT  Ú	SECP384R1ÚSHA384Ú	SECP521R1rV  )rO   r#   r#   r$   rP  ÿ  s   rP  ú"SSHCertificate | SSHPublicKeyTypesc           "      C  sp  t  d| ¡ t | ¡}|stdƒ‚| d¡ }}| d¡}d}| t¡r/d}|d ttƒ … }|t	kr9|s9t
dƒ‚t|ƒ}z	tt |¡ƒ}W n ttjfyT   tdƒ‚w |rY|}	t|ƒ\}
}|
|krgtd	ƒ‚|rot|ƒ\}}| |¡\}}|�r2t|ƒ\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}g }|r¤t|ƒ\}}| t|ƒ¡ |s•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v�s|tk�r||k�rtdƒ‚t| ƒ\}!} t| ƒ t||||||||||||||!|||	ƒS t|ƒ |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ÚmatchrK   ÚgroupÚendswithÚ_CERT_SUFFIXr\   rG   r   rì   rg   r  r  rc   ÚErrorrw   r­   rt   rq   r†   r   Ú_parse_exts_optsr_   rD   rS  rU  r$  )"rS   Ú_legacy_dsa_allowedr  rL   Zorig_key_typeZkey_bodyZ	with_certr  ÚrestZ	cert_bodyZinner_key_typer;  r@   rA  ZcctyperD  Z
principalsrE  Z	principalrG  rF  Zcrit_optionsrH  ÚextsrI  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²   


ÿÿþÿÿÿþüüïrn  c                 C  s   t | ƒS r‚   )rn  r^   r#   r#   r$   Úload_ssh_public_identityh  s   ro  Ú	exts_optsr0  c                 C  s˜   i }d }| rJt | ƒ\}} t|ƒ}||v rtdƒ‚|d ur$||k r$tdƒ‚t | ƒ\}} t|ƒdkr@t |ƒ\}}t|ƒdkr@tdƒ‚t|ƒ||< |}| s|S )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)rw   r   rK   r\   )rp  ÚresultÚ	last_namerP   ZbnameÚvalueÚextrar#   r#   r$   ri  n  s$   óri  r'  Úhash_algorithmúhashes.MD5 | hashes.SHA256c                 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   ÚMD5rT  rc   rM   rì   r~   r•   r»   rŸ   ZHashr  r	  )r:   ru  rL   r  rº   Zssh_binary_dataZhash_objr#   r#   r$   Ússh_key_fingerprint‚  s   


rx  c                 C  sF   t | dd�}t|tƒr| ¡ }n|}t|tjƒr!tjdtj	dd� |S )NT)rj  rú   rû   rü   )
rn  r=   r$  r@   r	   rF   r  r  r   r  )rS   r÷   Zcert_or_keyr@   r#   r#   r$   Úload_ssh_public_key˜  s   

üry  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  rj   rü   rW   rK  N)r=   r	   rF   r  r  r   r  rM   rì   r~   r•   r»   r  rM  rŸ   ÚstriprX   )r@   rL   r  rº   Zpubr#   r#   r$   Úserialize_ssh_public_key¬  s   ü
r{  é   c                
   @  s˜   e Zd Zddddg dddg g f
d>dd„Zd?dd„Zd@dd„ZdAd!d"„ZdBd%d&„ZdCd(d)„Zd*d+„ Z	dDd.d/„Z
dEd1d2„ZdFd5d6„ZdFd7d8„ZdGd<d=„ZdS )HÚSSHCertificateBuilderNFr&  úSSHCertPublicKeyTypes | Noner(  r0   r9  úSSHCertificateType | Noner*  ra   r+  r,  Ú_valid_for_all_principalsr    r.  r-  r/  úlist[tuple[bytes, bytes]]r1  c                 C  s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S r‚   ©
r&  r(  r9  r*  r+  r€  r.  r-  r/  r1  )r„   r&  r(  r9  r*  r+  r€  r.  r-  r/  r1  r#   r#   r$   r…   Í  s   
zSSHCertificateBuilder.__init__r@   r=  r!   c                 C  s^   t |tjtjtjfƒstdƒ‚| jd urt	dƒ‚t
|| j| j| j| j| j| j| j| j| jd�
S )Nr<   zpublic_key already setr‚  )r=   r
   rA   r   rC   r   rI   rc   r&  rK   r}  r(  r9  r*  r+  r€  r.  r-  r/  r1  )r„   r@   r#   r#   r$   r@   å  s,   ýþ
öz SSHCertificateBuilder.public_keyrA  r   c                 C  sv   t |tƒs	tdƒ‚d|  krdk stdƒ‚ tdƒ‚| jd ur$t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 setr‚  )r=   r   rc   rK   r(  r}  r&  r9  r*  r+  r€  r.  r-  r/  r1  )r„   rA  r#   r#   r$   rA    s(   
ÿ
özSSHCertificateBuilder.serialrC  r"  c                 C  sR   t |tƒs	tdƒ‚| jd urtdƒ‚t| j| j|| j| j	| j
| j| j| j| jd�
S )Nz"type must be an SSHCertificateTypeztype already setr‚  )r=   r"  rc   r9  rK   r}  r&  r(  r*  r+  r€  r.  r-  r/  r1  )r„   rC  r#   r#   r$   rC    s    

özSSHCertificateBuilder.typerD  r   c                 C  sR   t |tƒs	tdƒ‚| jd urtdƒ‚t| j| j| j|| j	| j
| j| j| j| jd�
S )Nzkey_id must be byteszkey_id already setr‚  )r=   r   rc   r*  rK   r}  r&  r(  r9  r+  r€  r.  r-  r/  r1  )r„   rD  r#   r#   r$   rD  )  s    

özSSHCertificateBuilder.key_idrE  c                 C  s|   | j rtdƒ‚tdd„ |D ƒƒr|stdƒ‚| jrtdƒ‚t|ƒtkr't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>E  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_principalsr‚  )r€  rK   Úallrc   r+  r\   Ú_SSHKEY_CERT_MAX_PRINCIPALSr}  r&  r(  r9  r*  r.  r-  r/  r1  )r„   rE  r#   r#   r$   rE  <  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 setTr‚  )r+  rK   r€  r}  r&  r(  r9  r*  r.  r-  r/  r1  r™   r#   r#   r$   Úvalid_for_all_principals`  s$   ÿöz.SSHCertificateBuilder.valid_for_all_principalsrF  úint | floatc                 C  sv   t |ttfƒstdƒ‚t|ƒ}|dk s|dkrtdƒ‚| jd ur$tdƒ‚t| j| j| j	| j
| j| j|| j| j| jd�
S )Nz$valid_before must be an int or floatr   rƒ  zvalid_before must [0, 2**64)zvalid_before already setr‚  )r=   r   Úfloatrc   rK   r.  r}  r&  r(  r9  r*  r+  r€  r-  r/  r1  )r„   rF  r#   r#   r$   rF  v  s&   
öz"SSHCertificateBuilder.valid_beforerG  c                 C  sv   t |ttfƒstdƒ‚t|ƒ}|dk s|dkrtdƒ‚| jd ur$tdƒ‚t| j| j| j	| j
| j| j| j|| j| jd�
S )Nz#valid_after must be an int or floatr   rƒ  zvalid_after must [0, 2**64)zvalid_after already setr‚  )r=   r   rŠ  rc   rK   r-  r}  r&  r(  r9  r*  r+  r€  r.  r/  r1  )r„   rG  r#   r#   r$   rG  Œ  s&   
öz!SSHCertificateBuilder.valid_afterrP   rs  c                 C  st   t |tƒr
t |tƒstdƒ‚|dd„ | jD ƒv rtdƒ‚t| j| j| j| j	| j
| j| j| jg | j¢||f‘| jd�
S )Núname and value must be bytesc                 S  ó   g | ]\}}|‘qS r#   r#   ©r„  rP   rÖ   r#   r#   r$   Ú
<listcomp>¨  ó    z=SSHCertificateBuilder.add_critical_option.<locals>.<listcomp>zDuplicate critical option namer‚  )r=   r   rc   r/  rK   r}  r&  r(  r9  r*  r+  r€  r.  r-  r1  ©r„   rP   rs  r#   r#   r$   Úadd_critical_option¢  s    öz)SSHCertificateBuilder.add_critical_optionc                 C  st   t |tƒr
t |tƒstdƒ‚|dd„ | jD ƒv rtdƒ‚t| j| j| j| j	| j
| j| j| j| jg | j¢||f‘d�
S )Nr‹  c                 S  rŒ  r#   r#   r�  r#   r#   r$   rŽ  ¾  r�  z7SSHCertificateBuilder.add_extension.<locals>.<listcomp>zDuplicate extension namer‚  )r=   r   rc   r1  rK   r}  r&  r(  r9  r*  r+  r€  r.  r-  r/  r�  r#   r#   r$   Úadd_extension¸  s    öz#SSHCertificateBuilder.add_extensionr±   ÚSSHCertPrivateKeyTypesr$  c              	   C  sè  t |tjtjtjfƒstdƒ‚| jd u rt	dƒ‚| j
d u rdn| j
}| jd u r+t	dƒ‚| jd u r2dn| j}| js?| js?t	dƒ‚| jd u rHt	dƒ‚| jd u rQt	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 ]}
|	 |
¡ qª| |	 ¡ ¡ | | j¡ | | j¡ tƒ }| jD ]$\}}| |¡ t |ƒdkrêtƒ }| |¡ | | ¡ ¡ qË| |¡ qË| | ¡ ¡ tƒ }| jD ]%\}}| |¡ t |ƒdk�rtƒ }| |¡ | | ¡ ¡ qý| |¡ qý| | ¡ ¡ | d¡ t|ƒ}t|ƒ}tƒ }| |¡ | | !¡ |¡ | | ¡ ¡ t |tjƒ�rq| "| ¡ ¡}tƒ }| |¡ | |¡ | | ¡ ¡ nlt |tjƒ�r³t#|j$ƒ}| "| ¡ t %|¡¡}t& '|¡\}}tƒ }| |¡ tƒ }| (|¡ | (|¡ | | ¡ ¡ | | ¡ ¡ n*t |tjƒ�s¼J ‚tƒ }| t)¡ | "| ¡ t* +¡ t, -¡ ¡}| |¡ | | ¡ ¡ t. /| ¡ ¡ 0¡ }t1 2t3t4d 5|d|g¡ƒ¡S )NzUnsupported private key typezpublic_key must be setr   ztype must be setrW   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  ó   | d S ©Nr   r#   ©rÊ   r#   r#   r$   Ú<lambda>ù  ó    z,SSHCertificateBuilder.sign.<locals>.<lambda>)r:   c                 S  r”  r•  r#   r–  r#   r#   r$   r—  ú  r˜  r7   rK  )6r=   r
   r>   r   rB   r   rH   rc   r&  rK   r(  r9  r*  r+  r€  r.  r-  r/  Úsortr1  rM   rg  r  r  rì   r~   r•   r»   r‘   r�   rs  rŸ   r\   r@   ÚsignrP  rO   rQ  rO  Zdecode_dss_signaturer–   rU  r   rW  r   rV  r  rM  rz  r>  r?  r$  ro  rX   )r„   r±   rA  rD  rL   Zcert_prefixr;  r  ÚfZfprincipalsrµ   ZfcritrP   rs  ZfoptvalZfextZfextvalZca_typeZcaformatZcafrm  ZfsigrZ  rX  rY  ZfsigblobZ	cert_datar#   r#   r$   rš  Î  sÄ   ýþ

ÿ





















ÿ
þzSSHCertificateBuilder.sign)r&  r~  r(  r0   r9  r  r*  ra   r+  r,  r€  r    r.  r0   r-  r0   r/  r�  r1  r�  )r@   r=  r!   r}  )rA  r   r!   r}  )rC  r"  r!   r}  )rD  r   r!   r}  )rE  r,  r!   r}  )rF  r‰  r!   r}  )rG  r‰  r!   r}  )rP   r   rs  r   r!   r}  )r±   r“  r!   r$  )r3   r4   r5   r…   r@   rA  rC  rD  rE  rˆ  rF  rG  r‘  r’  rš  r#   r#   r#   r$   r}  Ì  s.    õ




$



r}  )F)r   r   r   r   r   r   r   r   r   r    r!   r   )r:   r;   r!   r   )r@   rN   r!   r   )rS   rT   rU   r   rV   r   r!   r   )rS   rT   r.   r   r!   r[   )rS   rT   r!   r[   )
r`   r   r   ra   r   r   r   r   r!   rb   )rS   rg   r!   rh   )rS   rg   r!   ru   )ry   r   r!   r   )r!   ru   )rL   rT   r‚   )
rS   rT   r   ra   r÷   rø   r®   r    r!   rù   )r±   rù   r   r   r  r   r!   r   )rO   rÐ   r!   r]  )rS   rT   r!   rb  )rp  rg   r!   r0  )r:   r'  ru  rv  r!   r   )rS   rT   r÷   rø   r!   r'  )r@   r'  r!   r   )€Ú
__future__r   r  Úenumr  Úrer>  r  Úbase64r   rY   Údataclassesr   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr	   r
   r   r   r   rO  Z&cryptography.hazmat.primitives.ciphersr   r   r   r   Z,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Zbcryptr   r%   Z_bcrypt_supportedÚImportErrorrJ   rD   rG   rõ   Z_ECDSA_NISTP384Z_ECDSA_NISTP521rg  Z_SK_SSH_ED25519Z_SK_SSH_ECDSA_NISTP256rS  rU  Úcompilerc  r  Z	_SK_STARTZ_SK_ENDr  r  r  r  ÚDOTALLr   rg   r“   Úranger
  r*   ZAESZCTRZCBCZGCMr9   r6   rQ   rM   r?   rZ   r]   r_   rf   rq   rt   rw   rz   r}   r~   r¥   rÀ   rÎ   rÜ   rè   rê   rô   r^  r_  ra  rö   rì   ÚUnionr>   rB   rE   rH   rù   r  r!  rA   rC   rF   rI   r'  r=  ÚEnumr"  r$  rP  rn  ro  ri  rx  ry  r{  r“  r‡  r}  r#   r#   r#   r$   Ú<module>   s6   	ûý
ù	ù	ùí ý

ý








6JFI
Cø
	ýÿýû
rMýÿþÿ 
þ
_

ÿ
þÿ	