Ë
    €V.jÒ  ã                  ó´  — 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% 	 d dl&m'Z( dZ)dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5 ejl                  d«      Z7dZ8dZ9dZ:dZ;dZ<d Z=d!Z> ejl                  e9d"z   e:z   ej~                  «      Z@ eA eB eCd#d$«      «      «      ZDe G d%„ d&«      «       ZE eEejŒ                  d'ejŽ                  d!d!dd¬(«       eEejŒ                  d'ej�                  d!d!dd¬(«       eEejŒ                  d'ej’                  d!d)d!d¬(«      d*œZJd+eKd,<   e.e/e0d-œZLd`d.„ZMdad/„ZNe9d0z   e:d0z   f	 	 	 	 	 	 	 dbd1„ZOdcd2„ZPddd3„ZQ	 	 	 	 	 	 	 	 	 	 ded4„ZRdfd5„ZSdfd6„ZTdgd7„ZUdfd8„ZVdhd9„ZW G d:„ d;«      ZX G d<„ d=«      ZY G d>„ d?«      ZZ G d@„ dA«      Z[ G dB„ dC«      Z\didD„Z] G dE„ dF«      Z^ G dG„ dH«      Z_e, eY«       e- eZ«       e+ e\«       e. e[dI ejÀ                  «       «      e/ e[dJ ejÂ                  «       «      e0 e[dK ejÄ                  «       «      e2 e^«       e3 e_«       iZcdjdL„ZdejÊ                  ejÌ                  ejÎ                  ejÐ                  ejÒ                  f   Zj	 dkddMœ	 	 	 	 	 	 	 	 	 dldN„Zk	 	 	 	 	 	 	 	 dmdO„ZlejÊ                  ejÚ                  ejÜ                  ejÞ                  ejà                  f   ZqejÊ                  ejÚ                  ejÜ                  ejà                  f   Zr G dP„ dQejæ                  «      Zt G dR„ dS«      ZudndT„Zv	 d^	 	 	 dodU„Zw	 	 	 	 dodV„ZxdpdW„Zy	 	 	 	 	 	 dqdX„Zz	 dk	 	 	 	 	 drdY„Z{dsdZ„Z|ejÊ                  ejÌ                  ejÎ                  ejÒ                  f   Z}d[Z~ G d\„ d]«      Zy# e*$ r dZ)	 d^	 	 	 	 	 	 	 	 	 	 	 d_d„Z(Y �Œ_w xY w)té    )ÚannotationsN)Úencodebytes)Ú	dataclass)Úutils©ÚUnsupportedAlgorithm)Úhashes)ÚdsaÚecÚed25519ÚpaddingÚrsa)ÚAEADDecryptionContextÚCipherÚ
algorithmsÚmodes)ÚEncodingÚKeySerializationEncryptionÚNoEncryptionÚPrivateFormatÚPublicFormatÚ_KeySerializationEncryption)ÚkdfTFc                ó   — t        d«      ‚)NzNeed bcrypt moduler   )ÚpasswordÚsaltÚdesired_key_bytesÚroundsÚignore_few_roundss        úrC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\cryptography/hazmat/primitives/serialization/ssh.pyÚ_bcrypt_kdfr!   1   s   € ô #Ð#7Ó8Ð8ó    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                  óT   — 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<   y)Ú
_SSHCipherztype[algorithms.AES]ÚalgÚintÚkey_lenz3type[modes.CTR] | type[modes.CBC] | type[modes.GCM]ÚmodeÚ	block_lenÚiv_lenú
int | NoneÚtag_lenÚboolÚis_aeadN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r"   r    r(   r(   \   s(   … à	ÓØƒLØ
=Ó=ØƒNØƒKØÓØ„Mr"   r(   é    )r)   r+   r,   r-   r.   r0   r2   é   )r#   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]Ú_SSH_CIPHERS)Ú	secp256r1Ú	secp384r1Ú	secp521r1c                óü  — t        | t        j                  «      rt        | j	                  «       «      }|S t        | t        j
                  «      rt        | «      }|S t        | t        j                  t        j                  f«      rt        }|S t        | t        j                  t        j                  f«      rt        }|S t        | t        j                  t        j                   f«      rt"        }|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)ÚkeyÚkey_types     r    Ú_get_ssh_key_typerQ   Ž   sÛ   € Ü�#”r×1Ñ1Ô2Ü" 3§>¡>Ó#3Ó4ˆð €Oô 
�Cœ×2Ñ2Ô	3Ü" 3Ó'ˆð €Oô 
�Cœ#×+Ñ+¬S×-=Ñ-=Ð>Ô	?Üˆð €Oô 
�Cœ#×+Ñ+¬S×-=Ñ-=Ð>Ô	?Üˆð €Oô 
ØŒg×'Ñ'¬×)AÑ)AÐBô
ô  ˆð €Oô Ð/Ó0Ð0r"   c                ó”   — | 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: )ÚcurveÚnameÚ_ECDSA_KEY_TYPErN   )rC   rS   s     r    rB   rB   ¡   sE   € à×Ñ€EØ‡z�zœÑ(ÜØ5°e·j±j°^ÐDó
ð 	
ô ˜5Ÿ:™:Ñ&Ð&r"   ó   
c                ó<   — dj                  |t        | «      |g«      S )Nr"   )ÚjoinÚ_base64_encode)ÚdataÚprefixÚsuffixs      r    Ú_ssh_pem_encoder]   «   s   € ð
 �8‰8�Vœ^¨DÓ1°6Ð:Ó;Ð;r"   c                ó@   — | rt        | «      |z  dk7  rt        d«      ‚y)zRequire data to be full blocksr   zCorrupt data: missing paddingN)ÚlenrN   )rZ   r-   s     r    Ú_check_block_sizer`   ³   s&   € á”3�t“9˜yÑ(¨AÒ-ÜÐ8Ó9Ð9ð .r"   c                ó   — | rt        d«      ‚y)z!All data should have been parsed.zCorrupt data: unparsed dataN)rN   ©rZ   s    r    Ú_check_emptyrc   ¹   s   € áÜÐ6Ó7Ð7ð r"   c                ó  — |st        d«      ‚t        |    }t        |||j                  |j                  z   |d«      }t        |j                  |d|j                   «      |j                  ||j                  d «      «      S )z$Generate key + iv and return cipher.z9Key is password-protected, but password was not provided.TN)Ú	TypeErrorr:   r!   r+   r.   r   r)   r,   )Ú
ciphernamer   r   r   ÚciphÚseeds         r    Ú_init_cipherri   ¿   s‚   € ñ ÜØGó
ð 	
ô ˜
Ñ#€DÜØ�$˜Ÿ™ t§{¡{Ñ2°F¸Dó€Dô Ø�‰��n˜Ÿ™Ð%Ó&Ø�	‰	�$�t—|‘|�~Ð&Ó'óð r"   c                ór   — t        | «      dk  rt        d«      ‚t        j                  | dd d¬«      | dd fS )ÚUint32é   úInvalid dataNÚbig©Ú	byteorder©r_   rN   r*   Ú
from_bytesrb   s    r    Ú_get_u32rs   Õ   ó<   € ä
ˆ4ƒy�1‚}Ü˜Ó(Ð(Ü�>‰>˜$˜r ˜(¨eˆ>Ó4°d¸1¸2°hÐ>Ð>r"   c                ór   — t        | «      dk  rt        d«      ‚t        j                  | dd d¬«      | dd fS )ÚUint64é   rm   Nrn   ro   rq   rb   s    r    Ú_get_u64rx   Ü   rt   r"   c                ód   — t        | «      \  }} |t        | «      kD  rt        d«      ‚| d| | |d fS )zBytes with u32 length prefixrm   N)rs   r_   rN   )rZ   Úns     r    Ú_get_sshstrr{   ã   s<   € ä�t‹n�G€A€tØŒ3ˆt‹9‚}Ü˜Ó(Ð(Ø��ˆ8�T˜!˜"�XÐÐr"   c                óx   — t        | «      \  }} |r|d   dkD  rt        d«      ‚t        j                  |d«      | fS )zBig integer.r   é   rm   rn   )r{   rN   r*   rr   )rZ   Úvals     r    Ú
_get_mpintr   ë   s>   € ä˜DÓ!�I€CˆÙ
ˆs�1‰v˜Š}Ü˜Ó(Ð(Ü�>‰>˜#˜uÓ% tÐ+Ð+r"   c                ó€   — | dk  rt        d«      ‚| sy| j                  «       dz   dz  }t        j                  | |«      S )z!Storage format for signed bigint.r   znegative mpint not allowedr"   rw   )rN   Ú
bit_lengthr   Úint_to_bytes)r~   Únbytess     r    Ú	_to_mpintr„   ó   sD   € à
ˆQ‚wÜÐ5Ó6Ð6ÙØØ�n‰nÓ Ñ" qÑ(€FÜ×Ñ˜c 6Ó*Ð*r"   c                  óh   — e Zd ZU dZded<   ddd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„Zddd„Zdd„Zy)Ú	_FragListz,Build recursive structure without data copy.zlist[utils.Buffer]ÚflistNc                óN   — g | _         |r| j                   j                  |«       y y ©N)r‡   Úextend)ÚselfÚinits     r    Ú__init__z_FragList.__init__  s#   € ØˆŒ
ÙØ�J‰J×Ñ˜dÕ#ð r"   c                ó:   — | j                   j                  |«       y)zAdd plain bytesN)r‡   Úappend©r‹   r~   s     r    Úput_rawz_FragList.put_raw  s   € à�
‰
×Ñ˜#Õr"   c                ó\   — | j                   j                  |j                  dd¬«      «       y)zBig-endian uint32rl   rn   ©Úlengthrp   N©r‡   r�   Úto_bytesr�   s     r    Úput_u32z_FragList.put_u32  ó!   € à�
‰
×Ñ˜#Ÿ,™,¨a¸5˜,ÓAÕBr"   c                ó\   — | j                   j                  |j                  dd¬«      «       y)zBig-endian uint64rw   rn   r“   Nr•   r�   s     r    Úput_u64z_FragList.put_u64  r˜   r"   c                ó.  — t        |t        t        t        f«      r6| j	                  t        |«      «       | j                  j                  |«       y| j	                  |j                  «       «       | j                  j                  |j                  «       y)zBytes prefixed with u32 lengthN)
r@   ÚbytesÚ
memoryviewÚ	bytearrayr—   r_   r‡   r�   ÚsizerŠ   r�   s     r    Ú
put_sshstrz_FragList.put_sshstr  s]   € ä�cœE¤:¬yÐ9Ô:Ø�L‰Lœ˜S›Ô"Ø�J‰J×Ñ˜cÕ"à�L‰L˜Ÿ™›Ô$Ø�J‰J×Ñ˜cŸi™iÕ(r"   c                ó8   — | j                  t        |«      «       y)z*Big-endian bigint prefixed with u32 lengthN)r    r„   r�   s     r    Ú	put_mpintz_FragList.put_mpint  s   € à�‰œ	 #›Õ'r"   c                óH   — t        t        t        | j                  «      «      S )zCurrent number of bytes)ÚsumÚmapr_   r‡   ©r‹   s    r    rŸ   z_FragList.size   s   € ä”3”s˜DŸJ™JÓ'Ó(Ð(r"   c                óV   — | j                   D ]  }t        |«      }|||z   }}|||| Œ |S )zWrite into bytearray)r‡   r_   )r‹   ÚdstbufÚposÚfragÚflenÚstarts         r    Úrenderz_FragList.render$  s9   € à—J”JˆDÜ�t“9ˆDØ˜c D™j�3ˆEØ $ˆF�5˜Ñð ð ˆ
r"   c                óˆ   — t        t        | j                  «       «      «      }| j                  |«       |j	                  «       S )zReturn as bytes)r�   rž   rŸ   r­   Útobytes)r‹   Úbufs     r    r¯   z_FragList.tobytes,  s/   € äœ 4§9¡9£;Ó/Ó0ˆØ�‰�CÔØ�{‰{‹}Ðr"   r‰   )rŒ   zlist[utils.Buffer] | NoneÚreturnÚNone)r~   úutils.Bufferr±   r²   )r~   r*   r±   r²   )r~   zbytes | _FragListr±   r²   ©r±   r*   )r   )r¨   r�   r©   r*   r±   r*   ©r±   rœ   )r3   r4   r5   Ú__doc__r6   r�   r‘   r—   rš   r    r¢   rŸ   r­   r¯   r7   r"   r    r†   r†   ý   s:   … Ù6àÓô$ó
óCóCó)ó(ó)ôôr"   r†   c                  ól   — e Zd ZdZ	 	 	 	 dd„Z	 	 	 	 d	d„Z	 	 	 	 	 	 d
d„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zy)Ú_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    c                óF   — t        |«      \  }}t        |«      \  }}||f|fS )zRSA public fields©r   )r‹   rZ   Úerz   s       r    Ú
get_publicz_SSHFormatRSA.get_public<  s.   € ô ˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4Ø�1ˆv�tˆ|Ðr"   c                ó„   — | j                  |«      \  \  }}}t        j                  ||«      }|j                  «       }||fS )zMake RSA public key from data.)r¼   r   ÚRSAPublicNumbersrC   )r‹   rZ   r»   rz   Úpublic_numbersrC   s         r    Úload_publicz_SSHFormatRSA.load_publicD  sE   € ð —‘ tÓ,‰‰ˆˆA�Ü×-Ñ-¨a°Ó3ˆØ#×.Ñ.Ó0ˆ
Ø˜4ÐÐr"   c           	     ó´  — t        |«      \  }}t        |«      \  }}t        |«      \  }}t        |«      \  }}t        |«      \  }}t        |«      \  }	}||f|k7  rt        d«      ‚t        j                  ||«      }
t        j                  ||	«      }t        j
                  ||«      }t        j                  ||	||
|||«      }|j                  |¬«      }||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch©Úunsafe_skip_rsa_key_validation)r   rN   r   Úrsa_crt_dmp1Úrsa_crt_dmq1r¾   ÚRSAPrivateNumbersÚprivate_key)r‹   rZ   Ú	pubfieldsrÃ   rz   r»   ÚdÚiqmpÚpÚqÚdmp1Údmq1r¿   Úprivate_numbersrÇ   s                  r    Úload_privatez_SSHFormatRSA.load_privateM  sì   € ô ˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4Ü Ó%‰
ˆˆdÜ˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4àˆqˆ6�YÒÜÐ?Ó@Ð@Ü×Ñ  1Ó%ˆÜ×Ñ  1Ó%ˆÜ×-Ñ-¨a°Ó3ˆÜ×/Ñ/Øˆq�!�T˜4  ~ó
ˆð &×1Ñ1Ø+Ið 2ó 
ˆð ˜DÐ Ð r"   c                ó�   — |j                  «       }|j                  |j                  «       |j                  |j                  «       y)zWrite RSA public keyN)r¿   r¢   r»   rz   )r‹   rC   Úf_pubÚpubns       r    Úencode_publicz_SSHFormatRSA.encode_publice  s2   € ð ×(Ñ(Ó*ˆØ�‰˜Ÿ™ÔØ�‰˜Ÿ™Õr"   c                ó€  — |j                  «       }|j                  }|j                  |j                  «       |j                  |j                  «       |j                  |j
                  «       |j                  |j                  «       |j                  |j                  «       |j                  |j                  «       y)zWrite RSA private keyN)	rÏ   r¿   r¢   rz   r»   rÉ   rÊ   rË   rÌ   )r‹   rÇ   Úf_privrÏ   r¿   s        r    Úencode_privatez_SSHFormatRSA.encode_privatem  s•   € ð &×5Ñ5Ó7ˆØ(×7Ñ7ˆà×Ñ˜×)Ñ)Ô*Ø×Ñ˜×)Ñ)Ô*à×Ñ˜×*Ñ*Ô+Ø×Ñ˜×-Ñ-Ô.Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×*Ñ*Õ+r"   N)rZ   r�   r±   z"tuple[tuple[int, int], memoryview])rZ   r�   r±   z#tuple[rsa.RSAPublicKey, memoryview])rZ   r�   rÃ   r1   r±   z$tuple[rsa.RSAPrivateKey, memoryview])rC   zrsa.RSAPublicKeyrÒ   r†   r±   r²   )rÇ   zrsa.RSAPrivateKeyrÖ   r†   r±   r²   ©	r3   r4   r5   r¶   r¼   rÀ   rÐ   rÔ   r×   r7   r"   r    r¸   r¸   3  sˆ   „ ñðØðà	+óð Øð à	,ó ð!Øð!ØKOð!à	-ó!ð0 Ø*ð Ø3<ð à	ó ð,Ø,ð,Ø6?ð,à	ô,r"   r¸   c                  ól   — e Zd ZdZd	d„Z	 	 	 	 d
d„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zdd„Z	y)Ú_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    c                ó‚   — t        |«      \  }}t        |«      \  }}t        |«      \  }}t        |«      \  }}||||f|fS )zDSA public fieldsrº   )r‹   rZ   rË   rÌ   ÚgÚys         r    r¼   z_SSHFormatDSA.get_public†  sM   € ä˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4Ü˜TÓ"‰ˆˆ4Ø�1�a˜ˆ|˜TÐ!Ð!r"   c                óØ   — | j                  |«      \  \  }}}}}t        j                  |||«      }t        j                  ||«      }| j	                  |«       |j                  «       }||fS )zMake DSA public key from data.)r¼   r
   ÚDSAParameterNumbersÚDSAPublicNumbersÚ	_validaterC   )	r‹   rZ   rË   rÌ   rÜ   rÝ   Úparameter_numbersr¿   rC   s	            r    rÀ   z_SSHFormatDSA.load_publicŽ  sl   € ð "Ÿ_™_¨TÓ2Ñ‰ˆˆAˆq�!�dÜ×3Ñ3°A°q¸!Ó<ÐÜ×-Ñ-¨aÐ1BÓCˆØ�‰�~Ô&Ø#×.Ñ.Ó0ˆ
Ø˜4ÐÐr"   c                óH  — | j                  |«      \  \  }}}}}t        |«      \  }}||||f|k7  rt        d«      ‚t        j                  |||«      }	t        j
                  ||	«      }
| j                  |
«       t        j                  ||
«      }|j                  «       }||fS )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	r¼   r   rN   r
   rß   rà   rá   ÚDSAPrivateNumbersrÇ   )r‹   rZ   rÈ   rÃ   rË   rÌ   rÜ   rÝ   Úxrâ   r¿   rÏ   rÇ   s                r    rÐ   z_SSHFormatDSA.load_private™  s¨   € ð "Ÿ_™_¨TÓ2Ñ‰ˆˆAˆq�!�dÜ˜TÓ"‰ˆˆ4àˆq�!�Qˆ<˜9Ò$ÜÐ?Ó@Ð@Ü×3Ñ3°A°q¸!Ó<ÐÜ×-Ñ-¨aÐ1BÓCˆØ�‰�~Ô&Ü×/Ñ/°°>ÓBˆØ%×1Ñ1Ó3ˆØ˜DÐ Ð r"   c                ó6  — |j                  «       }|j                  }| j                  |«       |j                  |j                  «       |j                  |j
                  «       |j                  |j                  «       |j                  |j                  «       y)zWrite DSA public keyN)r¿   râ   rá   r¢   rË   rÌ   rÜ   rÝ   )r‹   rC   rÒ   r¿   râ   s        r    rÔ   z_SSHFormatDSA.encode_public©  su   € ð $×2Ñ2Ó4ˆØ*×<Ñ<ÐØ�‰�~Ô&à�‰Ð)×+Ñ+Ô,Ø�‰Ð)×+Ñ+Ô,Ø�‰Ð)×+Ñ+Ô,Ø�‰˜×(Ñ(Õ)r"   c                ó–   — | j                  |j                  «       |«       |j                  |j                  «       j                  «       y)zWrite DSA private keyN)rÔ   rC   r¢   rÏ   rå   )r‹   rÇ   rÖ   s      r    r×   z_SSHFormatDSA.encode_private¶  s:   € ð 	×Ñ˜;×1Ñ1Ó3°VÔ<Ø×Ñ˜×4Ñ4Ó6×8Ñ8Õ9r"   c                ól   — |j                   }|j                  j                  «       dk7  rt        d«      ‚y )Ni   z#SSH supports only 1024 bit DSA keys)râ   rË   r�   rN   )r‹   r¿   râ   s      r    rá   z_SSHFormatDSA._validate½  s6   € Ø*×<Ñ<ÐØ×Ñ×)Ñ)Ó+¨tÒ3ÜÐBÓCÐCð 4r"   N)rZ   r�   r±   ztuple[tuple, memoryview])rZ   r�   r±   z#tuple[dsa.DSAPublicKey, memoryview])rZ   r�   rÃ   r1   r±   z$tuple[dsa.DSAPrivateKey, memoryview])rC   zdsa.DSAPublicKeyrÒ   r†   r±   r²   )rÇ   zdsa.DSAPrivateKeyrÖ   r†   r±   r²   )r¿   zdsa.DSAPublicNumbersr±   r²   )
r3   r4   r5   r¶   r¼   rÀ   rÐ   rÔ   r×   rá   r7   r"   r    rÚ   rÚ   }  s~   „ ñó"ð	 Øð	 à	,ó	 ð!Øð!ØKOð!à	-ó!ð *Ø*ð*Ø3<ð*à	ó*ð:Ø,ð:Ø6?ð:à	ó:ôDr"   rÚ   c                  ót   — e Zd ZdZd	d„Z	 	 	 	 d
d„Z	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	y)Ú_SSHFormatECDSAz–Format for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    c                ó    — || _         || _        y r‰   )Ússh_curve_namerS   )r‹   rì   rS   s      r    r�   z_SSHFormatECDSA.__init__Ï  s   € Ø,ˆÔØˆ�
r"   c                óÒ   — t        |«      \  }}t        |«      \  }}|| j                  k7  rt        d«      ‚t        |«      dk(  rt        d«      ‚|d   dk7  rt	        d«      ‚||f|fS )zECDSA public fieldszCurve name mismatchr   zInvalid EC point: empty datarl   zNeed uncompressed point)r{   rì   rN   r_   ÚNotImplementedError)r‹   rZ   rS   Úpoints       r    r¼   z_SSHFormatECDSA.get_publicÓ  sw   € ô " $Ó'‰ˆˆtÜ! $Ó'‰ˆˆtØ�D×'Ñ'Ò'ÜÐ2Ó3Ð3Üˆu‹:˜Š?ÜÐ;Ó<Ð<Ø�‰8�qŠ=Ü%Ð&?Ó@Ð@Ø�uˆ~˜tÐ#Ð#r"   c                ó¨   — | j                  |«      \  \  }}}t        j                  j                  | j                  |j                  «       «      }||fS ©z Make ECDSA public key from data.)r¼   r   rD   Úfrom_encoded_pointrS   r¯   )r‹   rZ   Ú_rï   rC   s        r    rÀ   z_SSHFormatECDSA.load_publicá  sM   € ð  Ÿ?™?¨4Ó0Ñ‰
ˆˆE�DÜ×.Ñ.×AÑAØ�J‰J˜Ÿ™›ó
ˆ
ð ˜4ÐÐr"   c                ó¸   — | j                  |«      \  \  }}}t        |«      \  }}||f|k7  rt        d«      ‚t        j                  || j
                  «      }||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r¼   r   rN   r   Úderive_private_keyrS   )r‹   rZ   rÈ   rÃ   Ú
curve_namerï   ÚsecretrÇ   s           r    rÐ   z_SSHFormatECDSA.load_privateë  sd   € ð %)§O¡O°DÓ$9Ñ!Ñˆ�U˜TÜ! $Ó'‰ˆ�à˜Ð )Ò+ÜÐAÓBÐBÜ×+Ñ+¨F°D·J±JÓ?ˆØ˜DÐ Ð r"   c                ó¸   — |j                  t        j                  t        j                  «      }|j                  | j                  «       |j                  |«       y)zWrite ECDSA public keyN)Úpublic_bytesr   ÚX962r   ÚUncompressedPointr    rì   )r‹   rC   rÒ   rï   s       r    rÔ   z_SSHFormatECDSA.encode_public÷  sG   € ð ×'Ñ'Ü�M‰Mœ<×9Ñ9ó
ˆð 	×Ñ˜×,Ñ,Ô-Ø×Ñ˜Õr"   c                óž   — |j                  «       }|j                  «       }| j                  ||«       |j                  |j                  «       y)zWrite ECDSA private keyN)rC   rÏ   rÔ   r¢   Úprivate_value)r‹   rÇ   rÖ   rC   rÏ   s        r    r×   z_SSHFormatECDSA.encode_private  sD   € ð !×+Ñ+Ó-ˆ
Ø%×5Ñ5Ó7ˆà×Ñ˜: vÔ.Ø×Ñ˜×6Ñ6Õ7r"   N)rì   rœ   rS   úec.EllipticCurve)rZ   r�   r±   z0tuple[tuple[memoryview, memoryview], memoryview]©rZ   r�   r±   z,tuple[ec.EllipticCurvePublicKey, memoryview])rZ   r�   rÃ   r1   r±   z-tuple[ec.EllipticCurvePrivateKey, memoryview])rC   úec.EllipticCurvePublicKeyrÒ   r†   r±   r²   )rÇ   zec.EllipticCurvePrivateKeyrÖ   r†   r±   r²   )
r3   r4   r5   r¶   r�   r¼   rÀ   rÐ   rÔ   r×   r7   r"   r    rê   rê   Ã  s�   „ ñ	óð$Øð$à	9ó$ð Øð à	5ó ð
!Øð
!ØKOð
!à	6ó
!ð Ø3ð Ø<Eð à	ó ð8Ø5ð8Ø?Hð8à	ô8r"   rê   c                  ól   — e Zd ZdZ	 	 	 	 dd„Z	 	 	 	 d	d„Z	 	 	 	 	 	 d
d„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zy)Ú_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    c                ó(   — t        |«      \  }}|f|fS )zEd25519 public fields)r{   )r‹   rZ   rï   s      r    r¼   z_SSHFormatEd25519.get_public  s   € ô " $Ó'‰ˆˆtØˆx˜ˆ~Ðr"   c                ó�   — | j                  |«      \  \  }}t        j                  j                  |j	                  «       «      }||fS ©z"Make Ed25519 public key from data.)r¼   r   rL   Úfrom_public_bytesr¯   )r‹   rZ   rï   rC   s       r    rÀ   z_SSHFormatEd25519.load_public  sD   € ð Ÿ™¨Ó.‰‰ˆ�$Ü×-Ñ-×?Ñ?Ø�M‰M‹Oó
ˆ
ð ˜4ÐÐr"   c                óÐ   — | j                  |«      \  \  }}t        |«      \  }}|dd }|dd }||k7  s|f|k7  rt        d«      ‚t        j                  j                  |«      }||fS )z#Make Ed25519 private key from data.Nr8   z$Corrupt data: ed25519 field mismatch)r¼   r{   rN   r   rK   Úfrom_private_bytes)	r‹   rZ   rÈ   rÃ   rï   Úkeypairr÷   Úpoint2rÇ   s	            r    rÐ   z_SSHFormatEd25519.load_private'  sy   € ð Ÿ™¨Ó.‰‰ˆ�$Ü# DÓ)‰ˆ�à˜˜"�ˆØ˜˜�ˆØ�FŠ?˜u˜h¨)Ò3ÜÐCÓDÐDÜ×/Ñ/×BÑBÀ6ÓJˆØ˜DÐ Ð r"   c                ó‚   — |j                  t        j                  t        j                  «      }|j	                  |«       y)zWrite Ed25519 public keyN)rù   r   ÚRawr   r    )r‹   rC   rÒ   Úraw_public_keys       r    rÔ   z_SSHFormatEd25519.encode_public5  s3   € ð $×0Ñ0Ü�L‰Lœ,×*Ñ*ó
ˆð 	×Ñ˜Õ(r"   c                óN  — |j                  «       }|j                  t        j                  t        j                  t        «       «      }|j                  t        j                  t        j                  «      }t        ||g«      }| j                  ||«       |j                  |«       y)zWrite Ed25519 private keyN)rC   Úprivate_bytesr   r  r   r   rù   r   r†   rÔ   r    )r‹   rÇ   rÖ   rC   Úraw_private_keyr  Ú	f_keypairs          r    r×   z _SSHFormatEd25519.encode_private>  s…   € ð !×+Ñ+Ó-ˆ
Ø%×3Ñ3Ü�L‰Lœ-×+Ñ+¬\«^ó
ˆð $×0Ñ0Ü�L‰Lœ,×*Ñ*ó
ˆô ˜°Ð?Ó@ˆ	à×Ñ˜: vÔ.Ø×Ñ˜)Õ$r"   N)rZ   r�   r±   z$tuple[tuple[memoryview], memoryview]©rZ   r�   r±   z+tuple[ed25519.Ed25519PublicKey, memoryview])rZ   r�   rÃ   r1   r±   z,tuple[ed25519.Ed25519PrivateKey, memoryview])rC   zed25519.Ed25519PublicKeyrÒ   r†   r±   r²   )rÇ   zed25519.Ed25519PrivateKeyrÖ   r†   r±   r²   rØ   r7   r"   r    r  r    sˆ   „ ñðØðà	-óð Øð à	4ó ð!Øð!ØKOð!à	5ó!ð)Ø2ð)Ø;Dð)à	ó)ð%Ø4ð%Ø>Gð%à	ô%r"   r  c                ó‚   — t        | «      \  }} |j                  «       j                  d«      st        d|› d�«      ‚|| fS )z!
    U2F application strings
    s   ssh:z4U2F application string does not start with b'ssh:' (Ú))r{   r¯   Ú
startswithrN   )rZ   Úapplications     r    Úload_applicationr  O  sU   € ô $ DÓ)Ñ€K�Ø×ÑÓ ×+Ñ+¨GÔ4ÜðØˆ}˜Aðó
ð 	
ð ˜ÐÐr"   c                  ó(   — e Zd ZdZ	 	 	 	 dd„Zdd„Zy)Ú_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:")
    c                óh   — t        t        «      j                  |«      \  }}t        |«      \  }}||fS r  )Ú_lookup_kformatrM   rÀ   r  ©r‹   rZ   rC   ró   s       r    rÀ   z_SSHFormatSKEd25519.load_publice  s7   € ô +¬<Ó8×DÑDÀTÓJÑˆ
�DÜ" 4Ó(‰ˆˆ4Ø˜4ÐÐr"   c                ó   — t        d«      ‚)Nz,sk-ssh-ed25519 private keys cannot be loadedr   ©r‹   rZ   s     r    r¼   z_SSHFormatSKEd25519.get_publicm  s   € ô #Ø:ó
ð 	
r"   Nr  ©rZ   r�   r±   ztyping.NoReturn©r3   r4   r5   r¶   rÀ   r¼   r7   r"   r    r  r  \  s!   „ ñð Øð à	4ó ô
r"   r  c                  ó(   — e Zd ZdZ	 	 	 	 dd„Zdd„Zy)Ú_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:")
    c                óh   — t        t        «      j                  |«      \  }}t        |«      \  }}||fS rñ   )r  Ú_ECDSA_NISTP256rÀ   r  r  s       r    rÀ   z_SSHFormatSKECDSA.load_public  s7   € ô +¬?Ó;×GÑGÈÓMÑˆ
�DÜ" 4Ó(‰ˆˆ4Ø˜4ÐÐr"   c                ó   — t        d«      ‚)Nz4sk-ecdsa-sha2-nistp256 private keys cannot be loadedr   r  s     r    r¼   z_SSHFormatSKECDSA.get_public‡  s   € ô #ØBó
ð 	
r"   Nrÿ   r  r   r7   r"   r    r"  r"  u  s!   „ ñð Øð à	5ó ô
r"   r"  s   nistp256s   nistp384s   nistp521c                ó’   — t        | t        «      st        | «      j                  «       } | t        v r	t        |    S t        d| ›�«      ‚)z"Return valid format or throw errorzUnsupported key type: )r@   rœ   r�   r¯   Ú_KEY_FORMATSr   )rP   s    r    r  r  ›  sE   € ä�h¤Ô&Ü˜hÓ'×/Ñ/Ó1ˆØ”<ÑÜ˜HÑ%Ð%Ü
Ð!7¸°|ÐDÓ
EÐEr"   rÂ   c               óö  — t        j                  d| «       |�t        j                  d|«       t        j	                  | «      }|st        d«      ‚|j                  d«      }|j                  d«      }t        j                  t        | «      || «      } | j                  t        «      st        d«      ‚t        | «      t        t        «      d } t        | «      \  }} t        | «      \  }} t        | «      \  }	} t        | «      \  }
} |
dk7  rt        d«      ‚t        | «      \  }} t        |«      \  }}t!        |«      }|j#                  |«      \  }}t%        |«       |t&        k7  s
|t&        k7  �r†|j)                  «       }|t*        vrt-        d|›�«      ‚|t.        k7  rt-        d|›�«      ‚t*        |   j0                  }t*        |   j2                  }t        | «      \  }} t*        |   j4                  r$t7        | «      }t        |«      |k7  rt        d	«      ‚t%        | «       t9        ||«       t        |	«      \  }}t        |«      \  }}t%        |«       t;        |||j)                  «       |«      }|j=                  «       }t        |j?                  |«      «      }t*        |   j4                  r-tA        |tB        «      sJ ‚t%        |jE                  «      «       nNt%        |jG                  «       «       n4|rtI        d
«      ‚t        | «      \  }} t%        | «       d}t9        ||«       t        |«      \  }}t        |«      \  }}||k7  rt        d«      ‚t        |«      \  }}||k7  rt        d«      ‚|jK                  |||¬«      \  }}t        |«      \  }}|tL        dt        |«       k7  rt        d«      ‚tA        |tN        jP                  «      r&tS        jT                  dt         jV                  d¬«       |S )z.Load private key from OpenSSH custom encoding.rZ   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.rw   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ÚsearchrN   r¬   ÚendÚbinasciiÚ
a2b_base64r�   r  Ú	_SK_MAGICr_   r{   rs   r  r¼   rc   Ú_NONEr¯   r:   r   Ú_BCRYPTr-   r0   r2   rœ   r`   ri   Ú	decryptorÚupdater@   r   Úfinalize_with_tagÚfinalizere   rÐ   Ú_PADDINGr
   rH   ÚwarningsÚwarnÚDeprecatedIn40)rZ   r   ÚbackendrÃ   ÚmÚp1Úp2rf   ÚkdfnameÚ
kdfoptionsÚnkeysÚpubdataÚpub_key_typeÚkformatrÈ   Úciphername_bytesÚblklenr0   ÚedataÚtagr   Úkbufr   rg   ÚdecÚck1Úck2rP   rÇ   ró   s                                 r    Úload_ssh_private_keyrQ  ¬  s¿  € ô 
×Ñ˜6 4Ô(ØÐÜ×Ñ˜: xÔ0ä�‰�tÓ€AÙÜÐ9Ó:Ð:Ø	
�‰�‹€BØ	
�‰ˆq‹€BÜ×Ñœz¨$Ó/°°2Ð6Ó7€DØ�?‰?œ9Ô%ÜÐ9Ó:Ð:Ü�dÓœC¤	›NÐ,Ð-€Dô # 4Ó(Ñ€J�Ü Ó%�M€GˆTÜ" 4Ó(Ñ€J�Ü˜4“.�K€Eˆ4Ø�‚zÜÐ1Ó2Ð2ô   Ó%�M€GˆTÜ'¨Ó0Ñ€L�'Ü˜lÓ+€GØ ×+Ñ+¨GÓ4Ñ€IˆwÜ�Ôà”UÒ˜g¬Ó.Ø%×-Ñ-Ó/ÐØ¤<Ñ/Ü&Ø&Ð'7Ð&:Ð;óð ð ”gÒÜ&Ð):¸7¸+Ð'FÓGÐGÜÐ.Ñ/×9Ñ9ˆÜÐ/Ñ0×8Ñ8ˆä! $Ó'‰ˆˆtô Ð(Ñ)×1Ò1Ü˜“+ˆCÜ�3‹x˜7Ò"Ü Ð!NÓOÐOä˜ÔÜ˜% Ô(Ü  Ó,‰
ˆˆdÜ “~‰ˆ�Ü�TÔÜÐ,¨h¸¿¹»ÈÓOˆØ�n‰nÓˆÜ˜3Ÿ:™: eÓ,Ó-ˆÜÐ(Ñ)×1Ò1Ü˜cÔ#8Ô9Ð9Ð9Ü˜×.Ñ.¨sÓ3Õ4ô ˜Ÿ™›Õ(áÜØFóð ô " $Ó'‰ˆˆtÜ�TÔØˆÜ˜% Ô(Ü˜%“�J€CˆÜ˜%“�J€CˆØ
ˆc‚zÜÐ8Ó9Ð9ô " %Ó(�O€HˆeØ�<ÒÜÐ:Ó;Ð;Ø ×-Ñ-ØØØ'Eð .ó Ñ€K�ô ˜5Ó!�H€A€uð ”˜œ3˜u›:Ð&Ò&ÜÐ8Ó9Ð9ä�+œs×0Ñ0Ô1Ü�‰ðä× Ñ Øõ		
ð Ðr"   c                óÂ  — t        j                  d|«       t        | t        j                  «      r&t        j                  dt         j                  d¬«       t        | «      }t        |«      }t        «       }|r“t        }t        |   j                  }t        }t        }	t        |t         «      r|j"                  �|j"                  }	t%        j&                  d«      }
|j)                  |
«       |j+                  |	«       t-        |||
|	«      }nt.        x}}d}d}d}t%        j&                  d«      }d	}t        «       }|j)                  |«       |j1                  | j3                  «       |«       t        ||g«      }|j)                  |«       |j5                  | |«       |j)                  |«       |j7                  t8        d||j;                  «       |z  z
   «       t        «       }|j7                  t<        «       |j)                  |«       |j)                  |«       |j)                  |«       |j+                  |«       |j)                  |«       |j)                  |«       |j;                  «       }|j;                  «       }t?        tA        ||z   «      «      }|jC                  |«       ||z
  }|�&|jE                  «       jG                  ||| ||d «       tI        |d| «      S )
z3Serialize private key with OpenSSH custom encoding.r   úISSH DSA key support is deprecated and will be removed in a future releaserl   r+  Nr$   rw   r%   r"   )%r   r.  r@   r
   rH   r<  r=  r>  rQ   r  r†   Ú_DEFAULT_CIPHERr:   r-   r6  Ú_DEFAULT_ROUNDSr   Ú_kdf_roundsÚosÚurandomr    r—   ri   r5  rÔ   rC   r×   r‘   r;  rŸ   r4  r�   rž   r­   Ú	encryptorÚupdate_intor]   )rÇ   r   Úencryption_algorithmrP   rH  Úf_kdfoptionsrf   rJ  rC  r   r   rg   rE  ÚcheckvalÚcommentÚf_public_keyÚ	f_secretsÚf_mainÚslenÚmlenr°   Úofss                         r    Ú_serialize_ssh_private_keyre    s  € ô 
×Ñ�z 8Ô,Ü�+œs×0Ñ0Ô1Ü�‰ð*ä× Ñ Øõ		
ô ! Ó-€HÜ˜hÓ'€Gô “;€LÙÜ$ˆ
Ü˜jÑ)×3Ñ3ˆÜˆÜ ˆäÐ+Ô-HÔIØ$×0Ñ0Ð<à)×5Ñ5ˆFÜ�z‰z˜"‹~ˆØ×Ñ Ô%Ø×Ñ˜VÔ$Ü˜J¨°$¸Ó?‰ä$Ð$ˆ
�WØˆØˆØ€EÜ�z‰z˜!‹}€HØ€Gô “;€LØ×Ñ˜HÔ%Ø×Ñ˜+×0Ñ0Ó2°LÔAä˜8 XÐ.Ó/€IØ×Ñ˜Ô"Ø×Ñ˜;¨	Ô2Ø×Ñ˜Ô!Ø×Ñ”hÐE ¨9¯>©>Ó+;¸fÑ+DÑ!EÐFÔGô ‹[€FØ
‡N�N”9ÔØ
×Ñ�jÔ!Ø
×Ñ�gÔØ
×Ñ�lÔ#Ø
‡N�N�5ÔØ
×Ñ�lÔ#Ø
×Ñ�iÔ ð �>‰>Ó€DØ�;‰;‹=€DÜ
”Y˜t f™}Ó-Ó
.€CØ
‡M�M�#ÔØ
�‰+€Cð ÐØ�‰Ó×$Ñ$ S¨¨T ]°C¸¸°IÔ>ä˜3˜u ˜:Ó&Ð&r"   c                  ó   — e Zd ZdZdZy)ÚSSHCertificateTyper%   r*  N)r3   r4   r5   ÚUSERÚHOSTr7   r"   r    rg  rg  y  s   „ Ø€DØ�Dr"   rg  c                  ó  — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zdd„Zedd„«       Zedd„«       Zedd„«       Z	edd„«       Z
edd„«       Zedd	„«       Zedd
„«       Zedd„«       Zdd„Zdd„Zdd„Zy)ÚSSHCertificatec                ó6  — || _         || _        || _        	 t        |«      | _        || _        || _        || _        || _	        |	| _
        |
| _        || _        || _        || _        || _        || _        || _        || _        y # t
        $ r t        d«      ‚w xY w)NzInvalid certificate type)Ú_nonceÚ_public_keyÚ_serialrg  Ú_typerN   Ú_key_idÚ_valid_principalsÚ_valid_afterÚ_valid_beforeÚ_critical_optionsÚ_extensionsÚ	_sig_typeÚ_sig_keyÚ_inner_sig_typeÚ
_signatureÚ_cert_key_typeÚ
_cert_bodyÚ_tbs_cert_body)r‹   rm  rn  ro  Ú_cctyperq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r}  r{  r|  s                     r    r�   zSSHCertificate.__init__  s­   € ð( ˆŒØ&ˆÔØˆŒð	9Ü+¨GÓ4ˆDŒJð ˆŒØ!2ˆÔØ(ˆÔØ*ˆÔØ!2ˆÔØ&ˆÔØ"ˆŒØ ˆŒØ.ˆÔØ$ˆŒØ,ˆÔØ$ˆŒØ,ˆÕøô ò 	9ÜÐ7Ó8Ð8ð	9ús   —B ÂBc                ó,   — t        | j                  «      S r‰   )rœ   rm  r¦   s    r    ÚnoncezSSHCertificate.nonce¨  s   € ä�T—[‘[Ó!Ð!r"   c                óJ   — t        j                  t        | j                  «      S r‰   )ÚtypingÚcastÚSSHCertPublicKeyTypesrn  r¦   s    r    rC   zSSHCertificate.public_key¬  s   € ô �{‰{Ô0°$×2BÑ2BÓCÐCr"   c                ó   — | j                   S r‰   )ro  r¦   s    r    ÚserialzSSHCertificate.serial±  s   € à�|‰|Ðr"   c                ó   — | j                   S r‰   )rp  r¦   s    r    ÚtypezSSHCertificate.typeµ  s   € à�z‰zÐr"   c                ó,   — t        | j                  «      S r‰   )rœ   rq  r¦   s    r    Úkey_idzSSHCertificate.key_id¹  s   € ä�T—\‘\Ó"Ð"r"   c                ó   — | j                   S r‰   )rr  r¦   s    r    Úvalid_principalszSSHCertificate.valid_principals½  ó   € à×%Ñ%Ð%r"   c                ó   — | j                   S r‰   )rt  r¦   s    r    Úvalid_beforezSSHCertificate.valid_beforeÁ  s   € à×!Ñ!Ð!r"   c                ó   — | j                   S r‰   )rs  r¦   s    r    Úvalid_afterzSSHCertificate.valid_afterÅ  s   € à× Ñ Ð r"   c                ó   — | j                   S r‰   )ru  r¦   s    r    Úcritical_optionszSSHCertificate.critical_optionsÉ  r�  r"   c                ó   — | j                   S r‰   )rv  r¦   s    r    Ú
extensionszSSHCertificate.extensionsÍ  s   € à×ÑÐr"   c                ó‚   — t        | j                  «      }|j                  | j                  «      \  }}t	        |«       |S r‰   )r  rw  rÀ   rx  rc   )r‹   Ú	sigformatÚsignature_keyÚsigkey_rests       r    r˜  zSSHCertificate.signature_keyÑ  s7   € Ü# D§N¡NÓ3ˆ	Ø%.×%:Ñ%:¸4¿=¹=Ó%IÑ"ˆ�{Ü�[Ô!ØÐr"   c                óˆ   — t        | j                  «      dz   t        j                  t        | j                  «      d¬«      z   S )Nó    F)Únewline)rœ   r{  r2  Ú
b2a_base64r|  r¦   s    r    rù   zSSHCertificate.public_bytes×  s<   € ä�$×%Ñ%Ó&Øñä×!Ñ!¤%¨¯©Ó"8À%ÔHñIð	
r"   c                óì  — | j                  «       }t        |t        j                  «      r9|j	                  t        | j                  «      t        | j                  «      «       y t        |t        j                  «      r–t        | j                  «      \  }}t        |«      \  }}t        |«       t        j                  ||«      }t        |j                  «      }|j	                  |t        | j                  «      t        j                   |«      «       y t        |t"        j$                  «      sJ ‚| j&                  t(        k(  rt+        j,                  «       }nQ| j&                  t.        k(  rt+        j0                  «       }n)| j&                  t2        k(  sJ ‚t+        j4                  «       }|j	                  t        | j                  «      t        | j                  «      t7        j8                  «       |«       y r‰   )r˜  r@   r   rL   Úverifyrœ   rz  r}  r   rD   r   rc   Ú
asym_utilsÚencode_dss_signatureÚ_get_ec_hash_algrS   ÚECDSAr   rF   ry  rG   r	   ÚSHA1Ú_SSH_RSA_SHA256ÚSHA256Ú_SSH_RSA_SHA512ÚSHA512r   ÚPKCS1v15)r‹   r˜  ÚrrZ   ÚsÚcomputed_sigÚhash_algs          r    Úverify_cert_signaturez$SSHCertificate.verify_cert_signatureÞ  sl  € Ø×*Ñ*Ó,ˆÜ�m¤W×%=Ñ%=Ô>Ø× Ñ Ü�d—o‘oÓ&¬¨d×.AÑ.AÓ(Bõô ˜¤r×'@Ñ'@ÔAä  §¡Ó1‰GˆAˆtÜ  Ó&‰GˆAˆtÜ˜ÔÜ%×:Ñ:¸1¸aÓ@ˆLÜ'¨×(;Ñ(;Ó<ˆHØ× Ñ Øœe D×$7Ñ$7Ó8¼"¿(¹(À8Ó:Lõô ˜m¬S×-=Ñ-=Ô>Ð>Ð>Ø×#Ñ#¤xÒ/Ü!Ÿ;™;›=‘Ø×%Ñ%¬Ò8Ü!Ÿ=™=›?‘à×+Ñ+¬Ò>Ð>Ð>Ü!Ÿ=™=›?�Ø× Ñ Ü�d—o‘oÓ&Ü�d×)Ñ)Ó*Ü× Ñ Ó"Øõ	r"   N)"rm  r�   rn  ÚSSHPublicKeyTypesro  r*   r~  r*   rq  r�   rr  úlist[bytes]rs  r*   rt  r*   ru  údict[bytes, bytes]rv  r±  rw  r�   rx  r�   ry  r�   rz  r�   r}  r�   r{  rœ   r|  r�   rµ   )r±   r„  r´   )r±   rg  )r±   r°  )r±   r±  )r±   r²   )r3   r4   r5   r�   Úpropertyr€  rC   r†  rˆ  rŠ  rŒ  r�  r‘  r“  r•  r˜  rù   r®  r7   r"   r    rk  rk  ~  sy  „ ð'-àð'-ð 'ð'-ð ð	'-ð
 ð'-ð ð'-ð 'ð'-ð ð'-ð ð'-ð .ð'-ð (ð'-ð ð'-ð ð'-ð $ð'-ð ð'-ð  #ð!'-ð" ð#'-ð$ ó%'-ðR ò"ó ð"óDð
 òó ðð òó ðð ò#ó ð#ð ò&ó ð&ð ò"ó ð"ð ò!ó ð!ð ò&ó ð&ð ò ó ð óó
ôr"   rk  c                ó  — t        | t        j                  «      rt        j                  «       S t        | t        j
                  «      rt        j                  «       S t        | t        j                  «      sJ ‚t        j                  «       S r‰   )	r@   r   Ú	SECP256R1r	   r¦  Ú	SECP384R1ÚSHA384Ú	SECP521R1r¨  )rS   s    r    r¢  r¢  ÿ  sV   € Ü�%œŸ™Ô&Ü�}‰}‹ÐÜ	�Eœ2Ÿ<™<Ô	(Ü�}‰}‹Ðä˜%¤§¡Ô.Ð.Ð.Ü�}‰}‹Ðr"   c                ó¶  — t        j                  d| «       t        j                  | «      }|st	        d«      ‚|j                  d«      x}}|j                  d«      }d}|j                  t        «      rd}|d t        t        «        }|t        k(  r|st        d«      ‚t        |«      }	 t        t        j                  |«      «      }|r|}	t#        |«      \  }
}|
|k7  rt	        d	«      ‚|rt#        |«      \  }}|j%                  |«      \  }}|�r”t'        |«      \  }}t)        |«      \  }}t#        |«      \  }}t#        |«      \  }}g }|r+t#        |«      \  }}|j+                  t-        |«      «       |rŒ+t'        |«      \  }}t'        |«      \  }}t#        |«      \  }}t/        |«      }t#        |«      \  }}t/        |«      }t#        |«      \  }}t#        |«      \  }}t#        |«      \  }}|t        k(  r|st        d
«      ‚	d t        |«        }t#        |«      \  }}t1        |«       t#        |«      \  }} |t2        k(  r|t4        t6        t2        fvs|t2        k7  r||k7  rt	        d«      ‚t#        | «      \  }!} t1        | «       t9        |||||||||||||!|||	«      S t1        |«       |S # t        t        j                   f$ r t	        d«      ‚w xY w)NrZ   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ÚmatchrN   ÚgroupÚendswithÚ_CERT_SUFFIXr_   rJ   r   r  r�   r2  r3  re   ÚErrorr{   rÀ   rx   rs   r�   rœ   Ú_parse_exts_optsrc   rG   r¥  r§  rk  )"rZ   Ú_legacy_dsa_allowedr@  rP   Úorig_key_typeÚkey_bodyÚ	with_certrH  ÚrestÚ	cert_bodyÚinner_key_typer€  rC   r†  ÚcctyperŠ  Ú
principalsrŒ  Ú	principalr‘  r�  Úcrit_optionsr“  Úextsr•  ró   Úsig_key_rawÚsig_typeÚsig_keyÚtbs_cert_bodyÚsignature_rawÚinner_sig_typeÚsig_restÚ	signatures"                                     r    Ú_load_ssh_public_identityrÔ  	  s  € ô 
×Ñ˜6 4Ô(ä×Ñ˜TÓ"€AÙÜÐ.Ó/Ð/Ø Ÿw™w q›zÐ)€Hˆ}Ø�w‰w�q‹z€HØ€IØ×ÑœÔ&Øˆ	ØÐ0œs¤<Ó0Ð0Ð1ˆØ”8ÒÑ$7Ü"Ø;ó
ð 	
ô ˜hÓ'€Gð+Üœ(×-Ñ-¨hÓ7Ó8ˆñ Øˆ	Ü& tÓ,Ñ€N�DØ˜Ò&ÜÐ-Ó.Ð.ÙÜ! $Ó'‰ˆˆtØ×*Ñ*¨4Ó0Ñ€J�ÚÜ “~‰ˆ�Ü “~‰ˆ�Ü" 4Ó(‰ˆ�Ü& tÓ,Ñˆ
�DØÐÙÜ$/°
Ó$;Ñ!ˆI�zØ×#Ñ#¤E¨)Ó$4Ô5ò ô % T›NÑˆ�TÜ% d›^Ñˆ�dÜ(¨Ó.Ñˆ�dÜ+¨LÓ9ÐÜ  Ó&‰
ˆˆdÜ% dÓ+ˆ
ä˜dÓ#‰ˆˆ4Ü'¨Ó-Ñˆ�TÜ'¨Ó4Ñˆ�'Ø”xÒÑ(;Ü&ØEóð ð " ,¤S¨£Y JÐ/ˆÜ)¨$Ó/Ñˆ�tÜ�TÔÜ#.¨}Ó#=Ñ ˆ˜ð œÒ ØÜ#¤_´hÐ?ñ@àœ(Ò" ~¸Ò'AÜÐ@ÓAÐAÜ)¨(Ó3Ñˆ	�8Ü�XÔÜØØØØØØØØØØØØØØØØØó#
ð 	
ô( 	�TÔØÐøôK ”x—~‘~Ð&ò +ÜÐ)Ó*Ð*ð+ús   Â+J3 Ê3%Kc                ó   — t        | «      S r‰   )rÔ  rb   s    r    Úload_ssh_public_identityrÖ  h  s   € ô % TÓ*Ð*r"   c                ó2  — i }d }| r�t        | «      \  }} t        |«      }||v rt        d«      ‚|�||k  rt        d«      ‚t        | «      \  }} t        |«      dkD  r't        |«      \  }}t        |«      dkD  rt        d«      ‚t        |«      ||<   |}| rŒ�|S )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)r{   rœ   rN   r_   )Ú	exts_optsÚresultÚ	last_namerT   ÚbnameÚvalueÚextras          r    r¿  r¿  n  s¯   € Ø!#€FØ€IÙ
Ü% iÓ0‰ˆˆiÜ˜T“{ˆØ�F‰?ÜÐ-Ó.Ð.ØÐ  U¨YÒ%6ÜÐ:Ó;Ð;Ü& yÓ1ÑˆˆyÜˆu‹:˜Š>Ü& uÓ-‰LˆE�5Ü�5‹z˜AŠ~Ü Ð!DÓEÐEÜ˜e›ˆˆu‰Øˆ	ò ð €Mr"   c                ó~  — t        |t        j                  t        j                  f«      st	        d«      ‚t        | «      }t        |«      }t        «       }|j                  |«       |j                  | |«       |j                  «       }t        j                  |«      }|j                  |«       |j                  «       S )Nz+hash_algorithm must be either MD5 or SHA256)r@   r	   ÚMD5r¦  re   rQ   r  r†   r    rÔ   r¯   ÚHashr8  r:  )rO   Úhash_algorithmrP   rH  rÒ   Ússh_binary_dataÚhash_objs          r    Ússh_key_fingerprinträ  ‚  s–   € ô �n¤v§z¡z´6·=±=Ð&AÔBÜÐEÓFÐFä  Ó%€HÜ˜hÓ'€Gä‹K€EØ	×Ñ�XÔØ×Ñ˜#˜uÔ%à—m‘m“o€Oô �{‰{˜>Ó*€HØ‡O�O�OÔ$Ø×ÑÓÐr"   c                óæ   — t        | d¬«      }t        |t        «      r|j                  «       }n|}t        |t        j
                  «      r&t        j                  dt        j                  d¬«       |S )NT)rÀ  r)  r*  r+  )
rÔ  r@   rk  rC   r
   rI   r<  r=  r   r>  )rZ   r?  Úcert_or_keyrC   s       r    Úload_ssh_public_keyrç  ˜  sb   € ô ,¨DÀdÔK€Kä�+œ~Ô.Ø ×+Ñ+Ó-‰
à ˆ
ä�*œc×.Ñ.Ô/Ü�‰ðä× Ñ Øõ		
ð Ðr"   c                ó’  — t        | t        j                  «      r&t        j                  dt
        j                  d¬«       t        | «      }t        |«      }t        «       }|j                  |«       |j                  | |«       t        j                  |j                  «       «      j                  «       }dj!                  |d|g«      S )z&One-line public key format for OpenSSHrS  rl   r+  r"   r›  )r@   r
   rI   r<  r=  r   r>  rQ   r  r†   r    rÔ   r2  r�  r¯   ÚstriprX   )rC   rP   rH  rÒ   Úpubs        r    Úserialize_ssh_public_keyrë  ¬  sŸ   € ä�*œc×.Ñ.Ô/Ü�‰ð*ä× Ñ Øõ		
ô ! Ó,€HÜ˜hÓ'€Gä‹K€EØ	×Ñ�XÔØ×Ñ˜* eÔ,ä
×
Ñ
˜eŸm™m›oÓ
.×
4Ñ
4Ó
6€CØ�8‰8�X˜t SÐ)Ó*Ð*r"   é   c            
      óÎ   — e Zd Zddddg dddg g f
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 dd„Zdd„Zdd„Zdd„Z	 	 	 	 dd„Zd	„ Z	dd
„Z
dd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zdd„Zy)ÚSSHCertificateBuilderNFc                ó�   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        y r‰   ©
rn  ro  rp  rq  rr  Ú_valid_for_all_principalsrt  rs  ru  rv  )r‹   rn  ro  rp  rq  rr  rñ  rt  rs  ru  rv  s              r    r�   zSSHCertificateBuilder.__init__Í  sQ   € ð 'ˆÔØˆŒØˆŒ
ØˆŒØ!2ˆÔØ)BˆÔ&Ø*ˆÔØ(ˆÔØ!2ˆÔØ&ˆÕr"   c                ó–  — t        |t        j                  t        j                  t
        j                  f«      st        d«      ‚| j                  �t        d«      ‚t        || j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  ¬«
      S )Nr?   zpublic_key already setrð  )r@   r   rD   r   rF   r   rL   re   rn  rN   rî  ro  rp  rq  rr  rñ  rt  rs  ru  rv  )r‹   rC   s     r    rC   z SSHCertificateBuilder.public_keyå  s°   € ô Øä×)Ñ)Ü× Ñ Ü×(Ñ(ðô
ô Ð2Ó3Ð3Ø×ÑÐ'ÜÐ5Ó6Ð6ä$Ø"Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                óˆ  — t        |t        «      st        d«      ‚d|cxk  rdk  st        d«      ‚ t        d«      ‚| j                  �t        d«      ‚t        | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  ¬«
      S )Nzserial must be an integerr   ì            z"serial must be between 0 and 2**64zserial already setrð  )r@   r*   re   rN   ro  rî  rn  rp  rq  rr  rñ  rt  rs  ru  rv  )r‹   r†  s     r    r†  zSSHCertificateBuilder.serial  sµ   € Ü˜&¤#Ô&ÜÐ7Ó8Ð8Ø�FÔ"˜UÒ"ÜÐAÓBÐBð #ÜÐAÓBÐBØ�<‰<Ð#ÜÐ1Ó2Ð2ä$Ø×(Ñ(ØØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                óD  — t        |t        «      st        d«      ‚| j                  �t	        d«      ‚t        | j                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  ¬«
      S )Nz"type must be an SSHCertificateTypeztype already setrð  )r@   rg  re   rp  rN   rî  rn  ro  rq  rr  rñ  rt  rs  ru  rv  )r‹   rˆ  s     r    rˆ  zSSHCertificateBuilder.type  sŒ   € Ü˜$Ô 2Ô3ÜÐ@ÓAÐAØ�:‰:Ð!ÜÐ/Ó0Ð0ä$Ø×(Ñ(Ø—L‘LØØ—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                óD  — t        |t        «      st        d«      ‚| j                  �t	        d«      ‚t        | j                  | j                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  ¬«
      S )Nzkey_id must be byteszkey_id already setrð  )r@   rœ   re   rq  rN   rî  rn  ro  rp  rr  rñ  rt  rs  ru  rv  )r‹   rŠ  s     r    rŠ  zSSHCertificateBuilder.key_id)  s‹   € Ü˜&¤%Ô(ÜÐ2Ó3Ð3Ø�<‰<Ð#ÜÐ1Ó2Ð2ä$Ø×(Ñ(Ø—L‘LØ—*‘*ØØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                ó´  — | j                   rt        d«      ‚t        d„ |D «       «      r|st        d«      ‚| j                  rt        d«      ‚t        |«      t        kD  rt        d«      ‚t        | j                  | j                  | j                  | j                  || j                   | j                  | j                  | j                  | j                  ¬«
      S )NzDPrincipals can't be set because the cert is valid for all principalsc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‰   )r@   rœ   )Ú.0rå   s     r    Ú	<genexpr>z9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>E  s   è ø€ ÐCÑ2B¨Q”J˜q¤%×(Ñ2Bùs   ‚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ñ  rN   Úallre   rr  r_   Ú_SSHKEY_CERT_MAX_PRINCIPALSrî  rn  ro  rp  rq  rt  rs  ru  rv  )r‹   rŒ  s     r    rŒ  z&SSHCertificateBuilder.valid_principals<  sÖ   € ð ×)Ò)Üð%óð ô
 ÑCÑ2BÓCÔCÙ#äØGóð ð ×!Ò!ÜÐ;Ó<Ð<äÐÓ Ô#>Ò>ÜØLóð ô %Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ.Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                ó<  — | j                   rt        d«      ‚| j                  rt        d«      ‚t        | j                  | j
                  | j                  | j                  | j                   d| j                  | j                  | j                  | j                  ¬«
      S )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setTrð  )rr  rN   rñ  rî  rn  ro  rp  rq  rt  rs  ru  rv  r¦   s    r    Úvalid_for_all_principalsz.SSHCertificateBuilder.valid_for_all_principals`  s�   € Ø×!Ò!Üð+óð ð ×)Ò)ÜÐCÓDÐDä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*Ø×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                ó�  — t        |t        t        f«      st        d«      ‚t        |«      }|dk  s|dk\  rt	        d«      ‚| j
                  �t	        d«      ‚t        | j                  | j                  | j                  | j                  | j                  | j                  || j                  | j                  | j                  ¬«
      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*   Úfloatre   rN   rt  rî  rn  ro  rp  rq  rr  rñ  rs  ru  rv  )r‹   r�  s     r    r�  z"SSHCertificateBuilder.valid_beforev  s´   € Ü˜,¬¬e¨Ô5ÜÐBÓCÐCÜ˜<Ó(ˆØ˜!Ò˜|¨uÒ4ÜÐ;Ó<Ð<Ø×ÑÐ)ÜÐ7Ó8Ð8ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ&Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                ó�  — t        |t        t        f«      st        d«      ‚t        |«      }|dk  s|dk\  rt	        d«      ‚| j
                  �t	        d«      ‚t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  || j                  | j                  ¬«
      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   re   rN   rs  rî  rn  ro  rp  rq  rr  rñ  rt  ru  rv  )r‹   r‘  s     r    r‘  z!SSHCertificateBuilder.valid_afterŒ  s³   € Ü˜+¬¬U |Ô4ÜÐAÓBÐBÜ˜+Ó&ˆØ˜Š?˜k¨UÒ2ÜÐ:Ó;Ð;Ø×ÑÐ(ÜÐ6Ó7Ð7ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø$Ø"×4Ñ4Ø×(Ñ(ô
ð 	
r"   c                óº  — t        |t        «      rt        |t        «      st        d«      ‚|| j                  D ��cg c]  \  }}|‘Œ	 c}}v rt	        d«      ‚t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g | j                  ¢|f‘| j                  ¬«
      S c c}}w )Núname and value must be byteszDuplicate critical option namerð  )r@   rœ   re   ru  rN   rî  rn  ro  rp  rq  rr  rñ  rt  rs  rv  ©r‹   rT   rÜ  ró   s       r    Úadd_critical_optionz)SSHCertificateBuilder.add_critical_option¢  sÇ   € ô ˜$¤Ô&¬j¸ÄÔ.FÜÐ:Ó;Ð;à¨×(>Ò(>Ô?Ñ(>™W˜T 1’DÐ(>Ò?Ñ?ÜÐ=Ó>Ð>ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*ØF × 6Ñ 6ÐF¸¸u¸ÐFØ×(Ñ(ô
ð 	
ùó @ó   ¼Cc                óº  — t        |t        «      rt        |t        «      st        d«      ‚|| j                  D ��cg c]  \  }}|‘Œ	 c}}v rt	        d«      ‚t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  g | j                  ¢|f‘¬«
      S c c}}w )Nr  zDuplicate extension namerð  )r@   rœ   re   rv  rN   rî  rn  ro  rp  rq  rr  rñ  rt  rs  ru  r  s       r    Úadd_extensionz#SSHCertificateBuilder.add_extension¸  sÆ   € ô ˜$¤Ô&¬j¸ÄÔ.FÜÐ:Ó;Ð;à¨×(8Ò(8Ô9Ñ(8™W˜T 1’DÐ(8Ò9Ñ9ÜÐ7Ó8Ð8ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø:˜$×*Ñ*Ð:¨T°5¨MÐ:ô
ð 	
ùó :r  c           
     ó"  — t        |t        j                  t        j                  t
        j                  f«      st        d«      ‚| j                  €t        d«      ‚| j                  €dn| j                  }| j                  €t        d«      ‚| j                  €dn| j                  }| j                  s| j                  st        d«      ‚| j                  €t        d«      ‚| j                   €t        d«      ‚| j                   | j                  kD  rt        d	«      ‚| j"                  j%                  d
„ ¬«       | j&                  j%                  d„ ¬«       t)        | j                  «      }|t*        z   }t-        j.                  d«      }t1        |«      }t3        «       }|j5                  |«       |j5                  |«       |j7                  | j                  |«       |j9                  |«       |j;                  | j                  j<                  «       |j5                  |«       t3        «       }	| j                  D ]  }
|	j5                  |
«       Œ |j5                  |	j?                  «       «       |j9                  | j                   «       |j9                  | j                  «       t3        «       }| j"                  D ]p  \  }}|j5                  |«       tA        |«      dkD  r;t3        «       }|j5                  |«       |j5                  |j?                  «       «       Œ`|j5                  |«       Œr |j5                  |j?                  «       «       t3        «       }| j&                  D ]p  \  }}|j5                  |«       tA        |«      dkD  r;t3        «       }|j5                  |«       |j5                  |j?                  «       «       Œ`|j5                  |«       Œr |j5                  |j?                  «       «       |j5                  d«       t)        |«      }t1        |«      }t3        «       }|j5                  |«       |j7                  |jC                  «       |«       |j5                  |j?                  «       «       t        |t
        j                  «      rl|jE                  |j?                  «       «      }t3        «       }|j5                  |«       |j5                  |«       |j5                  |j?                  «       «       �n°t        |t        j                  «      rætG        |jH                  «      }|jE                  |j?                  «       t        jJ                  |«      «      }tM        jN                  |«      \  }}t3        «       }|j5                  |«       t3        «       }|jQ                  |«       |jQ                  |«       |j5                  |j?                  «       «       |j5                  |j?                  «       «       n°t        |t        j                  «      sJ ‚t3        «       }|j5                  tR        «       |jE                  |j?                  «       tU        jV                  «       tY        jZ                  «       «      }|j5                  |«       |j5                  |j?                  «       «       t]        j^                  |j?                  «       «      ja                  «       }tc        jd                  tf        ti        djk                  |d|g«      «      «      S )NzUnsupported private key typezpublic_key must be setr   ztype must be setr"   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                ó   — | d   S ©Nr   r7   ©rå   s    r    Ú<lambda>z,SSHCertificateBuilder.sign.<locals>.<lambda>ù  s   € °!°A²$r"   )rO   c                ó   — | d   S r  r7   r  s    r    r  z,SSHCertificateBuilder.sign.<locals>.<lambda>ú  s   € ¨A¨aªDr"   r8   r›  )6r@   r   rA   r   rE   r   rK   re   rn  rN   ro  rp  rq  rr  rñ  rt  rs  ru  Úsortrv  rQ   r½  rW  rX  r  r†   r    rÔ   rš   r—   rÜ  r¯   r_   rC   Úsignr¢  rS   r£  r   Údecode_dss_signaturer¢   r§  r   r©  r	   r¨  r2  r�  ré  r‚  rƒ  rk  rÖ  rX   )r‹   rÇ   r†  rŠ  rP   Úcert_prefixr€  rH  ÚfÚfprincipalsrË   ÚfcritrT   rÜ  ÚfoptvalÚfextÚfextvalÚca_typeÚcaformatÚcafrÓ  Úfsigr­  rª  r«  ÚfsigblobÚ	cert_datas                              r    r  zSSHCertificateBuilder.signÎ  sY  € ÜØä×*Ñ*Ü×!Ñ!Ü×)Ñ)ðô
ô Ð:Ó;Ð;à×ÑÐ#ÜÐ5Ó6Ð6ð —l‘lÐ*‘°·±ˆà�:‰:ÐÜÐ/Ó0Ð0ð Ÿ™Ð,‘°$·,±,ˆð ×%Ò%¨d×.LÒ.LÜðóð ð
 ×ÑÐ%ÜÐ7Ó8Ð8à×ÑÐ$ÜÐ6Ó7Ð7à×Ñ˜t×1Ñ1Ò1ÜÐLÓMÐMð 	×Ñ×#Ñ#©Ð#Ô7Ø×Ñ×Ñ¡.ÐÔ1ä$ T×%5Ñ%5Ó6ˆØ¤Ñ-ˆô —
‘
˜2“ˆÜ! (Ó+ˆÜ‹KˆØ	�‰�[Ô!Ø	�‰�UÔØ×Ñ˜d×.Ñ.°Ô2Ø	�	‰	�&ÔØ	�	‰	�$—*‘*×"Ñ"Ô#Ø	�‰�VÔÜ“kˆØ×'Ô'ˆAØ×"Ñ" 1Õ%ð (à	�‰�[×(Ñ(Ó*Ô+Ø	�	‰	�$×#Ñ#Ô$Ø	�	‰	�$×$Ñ$Ô%Ü“ˆØ×1Ô1‰KˆD�%Ø×Ñ˜TÔ"Ü�5‹z˜AŠ~Ü#›+�Ø×"Ñ" 5Ô)Ø× Ñ  §¡Ó!2Õ3à× Ñ  Õ'ð 2ð 	
�‰�U—]‘]“_Ô%Ü‹{ˆØ×+Ô+‰KˆD�%Ø�O‰O˜DÔ!Ü�5‹z˜AŠ~Ü#›+�Ø×"Ñ" 5Ô)Ø—‘ §¡Ó 1Õ2à—‘ Õ&ð ,ð 	
�‰�T—\‘\“^Ô$Ø	�‰�SÔä# KÓ0ˆÜ" 7Ó+ˆÜ‹kˆØ�‰�wÔØ×Ñ˜{×5Ñ5Ó7¸Ô=Ø	�‰�S—[‘[“]Ô#ô �k¤7×#<Ñ#<Ô=Ø#×(Ñ(¨¯©«Ó5ˆIÜ“;ˆDØ�O‰O˜GÔ$Ø�O‰O˜IÔ&Ø�L‰L˜Ÿ™›Ö(Ü˜¤R×%?Ñ%?Ô@Ü'¨×(9Ñ(9Ó:ˆHØ#×(Ñ(¨¯©«´b·h±h¸xÓ6HÓIˆIÜ×2Ñ2°9Ó=‰DˆAˆqÜ“;ˆDØ�O‰O˜GÔ$Ü “{ˆHØ×Ñ˜qÔ!Ø×Ñ˜qÔ!Ø�O‰O˜H×,Ñ,Ó.Ô/Ø�L‰L˜Ÿ™›Õ(ô ˜k¬3×+<Ñ+<Ô=Ð=Ð=ô
 “;ˆDØ�O‰OœOÔ,Ø#×(Ñ(Ø—	‘	“œW×-Ñ-Ó/´·±³óˆIð �O‰O˜IÔ&Ø�L‰L˜Ÿ™›Ô(ä×'Ñ'¨¯	©	«Ó4×:Ñ:Ó<ˆ	ô �{‰{ÜÜ$ S§X¡X¨{¸DÀ)Ð.LÓ%MÓNó
ð 	
r"   )rn  zSSHCertPublicKeyTypes | Nonero  r/   rp  zSSHCertificateType | Nonerq  úbytes | Nonerr  r°  rñ  r1   rt  r/   rs  r/   ru  úlist[tuple[bytes, bytes]]rv  r   )rC   r„  r±   rî  )r†  r*   r±   rî  )rˆ  rg  r±   rî  )rŠ  rœ   r±   rî  )rŒ  r°  r±   rî  )r�  úint | floatr±   rî  )r‘  r!  r±   rî  )rT   rœ   rÜ  rœ   r±   rî  )rÇ   ÚSSHCertPrivateKeyTypesr±   rk  )r3   r4   r5   r�   rC   r†  rˆ  rŠ  rŒ  rþ  r�  r‘  r  r  r  r7   r"   r    rî  rî  Ì  s  „ ð 59Ø"Ø+/Ø $Ø)+Ø*/Ø$(Ø#'Ø79Ø13ð'à1ð'ð ð'ð )ð	'ð
 ð'ð 'ð'ð $(ð'ð "ð'ð !ð'ð 5ð'ð /ó'ð0
Ø/ð
à	ó
ó8
ó*
ó&
ð&"
Ø +ð"
à	ó"
òH
ó,
ó,
ð,
Øð
Ø"'ð
à	ó
ð,
Øð
Ø"'ð
à	ó
ô,G
r"   rî  )F)r   rœ   r   rœ   r   r*   r   r*   r   r1   r±   rœ   )rO   z&SSHPrivateKeyTypes | SSHPublicKeyTypesr±   rœ   )rC   r   r±   rœ   )rZ   r³   r[   rœ   r\   rœ   r±   rœ   )rZ   r³   r-   r*   r±   r²   )rZ   r³   r±   r²   )
rf   rœ   r   r  r   rœ   r   r*   r±   z)Cipher[modes.CBC | modes.CTR | modes.GCM])rZ   r�   r±   ztuple[int, memoryview])rZ   r�   r±   útuple[memoryview, memoryview])r~   r*   r±   rœ   )r±   r#  )rP   r³   r‰   )
rZ   r³   r   r  r?  ú
typing.AnyrÃ   r1   r±   ÚSSHPrivateKeyTypes)rÇ   r%  r   rœ   r[  r   r±   rœ   )rS   rþ   r±   zhashes.HashAlgorithm)rZ   r³   r±   z"SSHCertificate | SSHPublicKeyTypes)rØ  r�   r±   r±  )rO   r¯  rá  zhashes.MD5 | hashes.SHA256r±   rœ   )rZ   r³   r?  r$  r±   r¯  )rC   r¯  r±   rœ   )€Ú
__future__r   r2  ÚenumrW  Úrer‚  r<  Úbase64r   rY   Údataclassesr   Úcryptographyr   Úcryptography.exceptionsr   Úcryptography.hazmat.primitivesr	   Ú)cryptography.hazmat.primitives.asymmetricr
   r   r   r   r   r   Ú&cryptography.hazmat.primitives.ciphersr   r   r   r   Ú,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Úbcryptr   r!   Ú_bcrypt_supportedÚImportErrorrM   rG   rJ   r$  Ú_ECDSA_NISTP384Ú_ECDSA_NISTP521r½  Ú_SK_SSH_ED25519Ú_SK_SSH_ECDSA_NISTP256r¥  r§  Úcompiler¹  r4  Ú	_SK_STARTÚ_SK_ENDr6  r5  rT  rU  ÚDOTALLr/  r�   rž   Úranger;  r(   ÚAESÚCTRÚCBCÚGCMr:   r6   rU   rQ   rB   r]   r`   rc   ri   rs   rx   r{   r   r„   r†   r¸   rÚ   rê   r  r  r  r"  r´  rµ  r·  r'  r  ÚUnionrA   rE   rH   rK   r%  rQ  re  rD   rF   rI   rL   r¯  r„  ÚEnumrg  rk  r¢  rÔ  rÖ  r¿  rä  rç  rë  r"  rü  rî  r7   r"   r    Ú<module>rC     s€  ðö
 #ã Û Û 	Û 	Û Û Ý 0Ý !å Ý 8Ý 1÷õ õ J÷ó ÷÷ ð9Ý)àÐð €Ø€Ø€Ø(€Ø(€Ø(€Ø'€ð 0€Ø>Ð ð "€Ø!€à�—‘Ð2Ó3€Ø€	Ø2€	Ø
.€Ø
€Ø€Ø€Ø€ð ˆ"�*‰*�Y Ñ)¨GÑ3°R·Y±YÓ
?€ñ ‘i¡ a¨Ó 0Ó1Ó2€ð ÷ð ó ðñ Ø�N‰NØØ�Y‰YØØØØôñ Ø�N‰NØØ�Y‰YØØØØôñ  *Ø�N‰NØØ�Y‰YØØØØô ñ')€Ð%ó ð@ !Ø Ø ñ€óó&'ð  Ñ%Ø˜e‘Oð<Ø
ð<àð<ð ð<ð ó	<ó:ó8ðØðàðð ðð ð	ð
 /óó,?ó?óó,ó+÷3ñ 3÷lG,ñ G,÷TCDñ CD÷LF8ñ F8÷R@%ñ @%óF
÷
ñ 
÷2
ñ 
ð6 ‰m‹oØ‰m‹oØÑ#Ó%Ø‘_ [°,°"·,±,³.ÓAØ‘_ [°,°"·,±,³.ÓAØ‘_ [°,°"·,±,³.ÓAØÑ(Ó*ØÑ-Ó/ð	€óFð —\‘\Ø×ÑØ×ÑØ×ÑØ×ÑðñÐ ð ðoð
 ,1ñoØ
ðoàðoð ðoð
 %)ðoð óoðdJ'Ø#ðJ'àðJ'ð 5ðJ'ð ó	J'ðZ —L‘LØ×ÑØ×ÑØ×ÑØ×ÑðñÐ ð Ÿ™Ø×ÑØ×ÑØ×ÑðñÐ ô˜Ÿ™ô ÷
~ñ ~óBð ð\Ø
ð\ð (ó\ð~+Ø
ð+à'ó+óð(Ø	ðà.ðð óð. /3ðØ
ðØ!+ðàóó(+ð(  Ÿ™Ø×ÑØ×ÑØ×ÑðñÐ ð "Ð ÷I
ò I
øð}$ ò 
9ØÐð #(ð9Øð9àð9ð ð9ð ð	9ð
  ð9ð 
ö9ð
9ús   Á/N; Î;OÏO