ó
    ‹ÂjÄÑ  ã                  óÞ  • % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r
  S SKJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJr  S SKJr  S S	KJrJrJrJr  S S
KJ r J!r!J"r"J#r#J$r$J%r%   S SK&J'r(  Sr)Sr+Sr,Sr-Sr.Sr/Sr0Sr1Sr2Sr3Sr4Sr5\Rl                  " S5      r7Sr8Sr9Sr:Sr;Sr<S r=S!r>\Rl                  " \9S"-   \:-   \R~                  5      r@\A" \B" \C" S#S$5      5      5      rD\ " S% S&5      5       rE\E" \RŒ                  S'\RŽ                  S!S!SSS(9\E" \RŒ                  S'\R�                  S!S!SSS(9\E" \RŒ                  S'\R’                  S!S)S!SS(9S*.rJS+\KS,'   \.\/\0S-.rLS`S. jrMSaS/ jrN\9S0-   \:S0-   4       SbS1 jjrOScS2 jrPSdS3 jrQ          SeS4 jrRSfS5 jrSSfS6 jrTSgS7 jrUSfS8 jrVShS9 jrW " S: S;5      rX " S< S=5      rY " S> S?5      rZ " S@ SA5      r[ " SB SC5      r\SiSD jr] " SE SF5      r^ " SG SH5      r_\,\Y" 5       \-\Z" 5       \+\\" 5       \.\[" SI\RÀ                  " 5       5      \/\[" SJ\RÂ                  " 5       5      \0\[" SK\RÄ                  " 5       5      \2\^" 5       \3\_" 5       0rcSjSL jrd\RÊ                  \RÌ                  \RÎ                  \RÐ                  \RÒ                  4   rj SkSSM.         SlSN jjjrk        SmSO jrl\RÊ                  \RÚ                  \RÜ                  \RÞ                  \Rà                  4   rq\RÊ                  \RÚ                  \RÜ                  \Rà                  4   rr " SP SQ\Ræ                  5      rt " SR SS5      ruSnST jrv S^   SoSU jjrw    SoSV jrxSpSW jry      SqSX jrz Sk     SrSY jjr{SsSZ jr|\RÊ                  \RÌ                  \RÎ                  \RÒ                  4   r}S[r~ " S\ S]5      rg! \* a    Sr) S^           S_S jjr( GNtf = f)té    )ÚannotationsN)Úencodebytes)Ú	dataclass)Úutils©ÚUnsupportedAlgorithm)Úhashes)ÚdsaÚecÚed25519ÚpaddingÚrsa)ÚAEADDecryptionContextÚCipherÚ
algorithmsÚmodes)ÚEncodingÚKeySerializationEncryptionÚNoEncryptionÚPrivateFormatÚPublicFormatÚ_KeySerializationEncryption)ÚkdfTFc                ó   • [        S5      e)NzNeed bcrypt moduler   )ÚpasswordÚsaltÚdesired_key_bytesÚroundsÚignore_few_roundss        Úf/var/www/website/venv/lib/python3.13/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                  ó\   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   Srg)Ú
_SSHCipheré\   z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_aead© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r4   r"   r    r(   r(   \   s(   ‡ à	ÓØƒLØ
=Ó=ØƒNØƒKØÓØ†Mr"   r(   é    )r*   r,   r-   r.   r/   r1   r3   é   )r#   s
   aes256-cbcs   aes256-gcm@openssh.comzdict[bytes, _SSHCipher]Ú_SSH_CIPHERS)Ú	secp256r1Ú	secp384r1Ú	secp521r1c                ó.  • [        U [        R                  5      (       a  [        U R	                  5       5      nU$ [        U [        R
                  5      (       a  [        U 5      nU$ [        U [        R                  [        R                  45      (       a  [        nU$ [        U [        R                  [        R                  45      (       a  [        nU$ [        U [        R                  [        R                   45      (       a  ["        nU$ [%        S5      e)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_typerT   Ž   sì   € Ü�#”r×1Ñ1×2Ñ2Ü" 3§>¡>Ó#3Ó4ˆð €Oô 
�Cœ×2Ñ2×	3Ñ	3Ü" 3Ó'ˆð €Oô 
�Cœ#×+Ñ+¬S×-=Ñ-=Ð>×	?Ñ	?Üˆð €Oô 
�Cœ#×+Ñ+¬S×-=Ñ-=Ð>×	?Ñ	?Üˆð €Oô 
ØŒg×'Ñ'¬×)AÑ)AÐB÷
ñ 
ô  ˆð €Oô Ð/Ó0Ð0r"   c                óš   • U R                   nUR                  [        ;  a  [        SUR                  < 35      e[        UR                     $ )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: )ÚcurveÚnameÚ_ECDSA_KEY_TYPErQ   )rF   rV   s     r    rE   rE   ¡   sE   € à×Ñ€EØ‡z�zœÓ(ÜØ5°e·j±j±^ÐDó
ð 	
ô ˜5Ÿ:™:Ñ&Ð&r"   ó   
c                ó<   • SR                  U[        U 5      U/5      $ )Nr"   )ÚjoinÚ_base64_encode)ÚdataÚprefixÚsuffixs      r    Ú_ssh_pem_encoder`   «   s   € ð
 �8‰8�Vœ^¨DÓ1°6Ð:Ó;Ð;r"   c                óL   • U (       a  [        U 5      U-  S:w  a  [        S5      eg)zRequire data to be full blocksr   zCorrupt data: missing paddingN)ÚlenrQ   )r]   r.   s     r    Ú_check_block_sizerc   ³   s&   € æ”3�t“9˜yÑ(¨AÓ-ÜÐ8Ó9Ð9ð .r"   c                ó(   • U (       a  [        S5      eg)z!All data should have been parsed.zCorrupt data: unparsed dataN)rQ   ©r]   s    r    Ú_check_emptyrf   ¹   s   € æÜÐ6Ó7Ð7ð r"   c                ó  • U(       d  [        S5      e[        U    n[        XUR                  UR                  -   US5      n[        UR                  USUR                   5      UR                  XTR                  S 5      5      $ )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_cipherrl   ¿   s~   € ö ÜØGó
ð 	
ô ˜
Ñ#€DÜØ˜Ÿ™ t§{¡{Ñ2°F¸Dó€Dô Ø�‰��n˜Ÿ™Ð%Ó&Ø�	‰	�$—|‘|�~Ð&Ó'óð r"   c                ón   • [        U 5      S:  a  [        S5      e[        R                  U SS SS9U SS 4$ )ÚUint32é   úInvalid dataNÚbig©Ú	byteorder©rb   rQ   r+   Ú
from_bytesre   s    r    Ú_get_u32rv   Õ   ó<   € ä
ˆ4ƒy�1ƒ}Ü˜Ó(Ð(Ü�>‰>˜$˜r ˜(¨eˆ>Ð4°d¸1¸2°hÐ>Ð>r"   c                ón   • [        U 5      S:  a  [        S5      e[        R                  U SS SS9U SS 4$ )ÚUint64é   rp   Nrq   rr   rt   re   s    r    Ú_get_u64r{   Ü   rw   r"   c                ób   • [        U 5      u  pU[        U 5      :”  a  [        S5      eU SU XS 4$ )zBytes with u32 length prefixrp   N)rv   rb   rQ   )r]   Úns     r    Ú_get_sshstrr~   ã   s8   € ä�t‹n�G€AØŒ3ˆt‹9ƒ}Ü˜Ó(Ð(Ø��ˆ8�T˜"�XÐÐr"   c                ó‚   • [        U 5      u  pU(       a  US   S:”  a  [        S5      e[        R                  US5      U 4$ )zBig integer.r   é   rp   rq   )r~   rQ   r+   ru   )r]   Úvals     r    Ú
_get_mpintr‚   ë   s<   € ä˜DÓ!�I€CÞ
ˆs�1‰v˜‹}Ü˜Ó(Ð(Ü�>‰>˜#˜uÓ% tÐ+Ð+r"   c                óŒ   • U S:  a  [        S5      eU (       d  gU R                  5       S-   S-  n[        R                  " X5      $ )z!Storage format for signed bigint.r   znegative mpint not allowedr"   rz   )rQ   Ú
bit_lengthr   Úint_to_bytes)r�   Únbytess     r    Ú	_to_mpintr‡   ó   sB   € à
ˆQƒwÜÐ5Ó6Ð6ÞØØ�n‰nÓ Ñ" qÑ(€FÜ×Ò˜cÓ*Ð*r"   c                  ó†   • \ rS rSr% SrS\S'   SSS jjrSS jrSS jrSS	 jr	SS
 jr
SS jrSS jrSSS jjrSS jrSrg)Ú	_FragListéý   z,Build recursive structure without data copy.zlist[utils.Buffer]ÚflistNc                óX   • / U l         U(       a  U R                   R                  U5        g g ©N)r‹   Úextend)ÚselfÚinits     r    Ú__init__Ú_FragList.__init__  s#   € ØˆŒ
ÞØ�J‰J×Ñ˜dÕ#ð r"   c                ó:   • U R                   R                  U5        g)zAdd plain bytesN)r‹   Úappend©r�   r�   s     r    Úput_rawÚ_FragList.put_raw  s   € à�
‰
×Ñ˜#Õr"   c                óV   • U R                   R                  UR                  SSS95        g)zBig-endian uint32ro   rq   ©Úlengthrs   N©r‹   r”   Úto_bytesr•   s     r    Úput_u32Ú_FragList.put_u32  ó!   € à�
‰
×Ñ˜#Ÿ,™,¨a¸5˜,ÐAÕBr"   c                óV   • U R                   R                  UR                  SSS95        g)zBig-endian uint64rz   rq   r™   Nr›   r•   s     r    Úput_u64Ú_FragList.put_u64  rŸ   r"   c                ó8  • [        U[        [        [        45      (       a6  U R	                  [        U5      5        U R                  R                  U5        gU R	                  UR                  5       5        U R                  R                  UR                  5        g)zBytes prefixed with u32 lengthN)
rC   ÚbytesÚ
memoryviewÚ	bytearrayr�   rb   r‹   r”   ÚsizerŽ   r•   s     r    Ú
put_sshstrÚ_FragList.put_sshstr  s`   € ä�cœE¤:¬yÐ9×:Ñ:Ø�L‰Lœ˜S›Ô"Ø�J‰J×Ñ˜cÕ"à�L‰L˜Ÿ™›Ô$Ø�J‰J×Ñ˜cŸi™iÕ(r"   c                ó8   • U R                  [        U5      5        g)z*Big-endian bigint prefixed with u32 lengthN)r¨   r‡   r•   s     r    Ú	put_mpintÚ_FragList.put_mpint  s   € à�‰œ	 #›Õ'r"   c                óH   • [        [        [        U R                  5      5      $ )zCurrent number of bytes)ÚsumÚmaprb   r‹   ©r�   s    r    r§   Ú_FragList.size   s   € ä”3”s˜DŸJ™JÓ'Ó(Ð(r"   c                óR   • U R                    H  n[        U5      nX"U-   p%X1XR& M     U$ )zWrite into bytearray)r‹   rb   )r�   ÚdstbufÚposÚfragÚflenÚstarts         r    ÚrenderÚ_FragList.render$  s1   € à—J”JˆDÜ�t“9ˆDØ D™j�3Ø $�5Òñ ð ˆ
r"   c                óˆ   • [        [        U R                  5       5      5      nU R                  U5        UR	                  5       $ )zReturn as bytes)r¥   r¦   r§   r¸   Útobytes)r�   Úbufs     r    r»   Ú_FragList.tobytes,  s/   € äœ 4§9¡9£;Ó/Ó0ˆØ�‰�CÔØ�{‰{‹}Ðr"   )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¤   )r5   r6   r7   r8   Ú__doc__r9   r‘   r–   r�   r¡   r¨   r«   r§   r¸   r»   r:   r4   r"   r    r‰   r‰   ý   s:   ‡ Ù6àÓö$ô
ôCôCô)ô(ô)ö÷r"   r‰   c                  ó~   • \ rS rSrSr    S
S jr    SS jr      SS jr      SS jr      SS jr	Sr
g	)Ú_SSHFormatRSAi3  zTFormat for RSA keys.

Public:
    mpint e, n
Private:
    mpint n, e, d, iqmp, p, q
c                ó@   • [        U5      u  p![        U5      u  p1X#4U4$ )zRSA public fields©r‚   )r�   r]   Úer}   s       r    Ú
get_publicÚ_SSHFormatRSA.get_public<  s(   € ô ˜TÓ"‰ˆÜ˜TÓ"‰ˆØˆv�tˆ|Ðr"   c                ó€   • U R                  U5      u  u  p#n[        R                  " X#5      nUR                  5       nXQ4$ )zMake RSA public key from data.)rÉ   r   ÚRSAPublicNumbersrF   )r�   r]   rÈ   r}   Úpublic_numbersrF   s         r    Úload_publicÚ_SSHFormatRSA.load_publicD  s?   € ð —‘ tÓ,‰‰ˆ�Ü×-Ò-¨aÓ3ˆØ#×.Ñ.Ó0ˆ
ØÐÐr"   c           	     óœ  • [        U5      u  pA[        U5      u  pQ[        U5      u  pa[        U5      u  pq[        U5      u  p�[        U5      u  p‘XT4U:w  a  [        S5      e[        R                  " Xh5      n
[        R                  " Xi5      n[        R
                  " XT5      n[        R                  " X‰XjX·U5      nUR                  US9nXá4$ )zMake RSA private key from data.z Corrupt data: rsa field mismatch©Úunsafe_skip_rsa_key_validation)r‚   rQ   r   Úrsa_crt_dmp1Úrsa_crt_dmq1rÌ   ÚRSAPrivateNumbersÚprivate_key)r�   r]   Ú	pubfieldsrÒ   r}   rÈ   ÚdÚiqmpÚpÚqÚdmp1Údmq1rÍ   Úprivate_numbersrÖ   s                  r    Úload_privateÚ_SSHFormatRSA.load_privateM  sÐ   € ô ˜TÓ"‰ˆÜ˜TÓ"‰ˆÜ˜TÓ"‰ˆÜ Ó%‰
ˆÜ˜TÓ"‰ˆÜ˜TÓ"‰ˆàˆ6�YÓÜÐ?Ó@Ð@Ü×Ò Ó%ˆÜ×Ò Ó%ˆÜ×-Ò-¨aÓ3ˆÜ×/Ò/Ø�!˜4 ~ó
ˆð &×1Ñ1Ø+Ið 2ð 
ˆð Ð Ð r"   c                ó�   • UR                  5       nUR                  UR                  5        UR                  UR                  5        g)zWrite RSA public keyN)rÍ   r«   rÈ   r}   )r�   rF   Úf_pubÚpubns       r    Úencode_publicÚ_SSHFormatRSA.encode_publice  s2   € ð ×(Ñ(Ó*ˆØ�‰˜Ÿ™ÔØ�‰˜Ÿ™Õr"   c                ó€  • UR                  5       nUR                  nUR                  UR                  5        UR                  UR                  5        UR                  UR
                  5        UR                  UR                  5        UR                  UR                  5        UR                  UR                  5        g)zWrite RSA private keyN)	rÞ   rÍ   r«   r}   rÈ   rØ   rÙ   rÚ   rÛ   )r�   rÖ   Úf_privrÞ   rÍ   s        r    Úencode_privateÚ_SSHFormatRSA.encode_privatem  s•   € ð &×5Ñ5Ó7ˆØ(×7Ñ7ˆà×Ñ˜×)Ñ)Ô*Ø×Ñ˜×)Ñ)Ô*à×Ñ˜×*Ñ*Ô+Ø×Ñ˜×-Ñ-Ô.Ø×Ñ˜×*Ñ*Ô+Ø×Ñ˜×*Ñ*Õ+r"   r4   N)r]   r¥   r¾   z"tuple[tuple[int, int], memoryview])r]   r¥   r¾   z#tuple[rsa.RSAPublicKey, memoryview])r]   r¥   rÒ   r2   r¾   z$tuple[rsa.RSAPrivateKey, memoryview])rF   zrsa.RSAPublicKeyrâ   r‰   r¾   r¿   )rÖ   zrsa.RSAPrivateKeyrç   r‰   r¾   r¿   ©r5   r6   r7   r8   rÃ   rÉ   rÎ   rß   rä   rè   r:   r4   r"   r    rÅ   rÅ   3  sˆ   † ñðØðà	+ôð Øð à	,ô ð!Øð!ØKOð!à	-ô!ð0 Ø*ð Ø3<ð à	ô ð,Ø,ð,Ø6?ð,à	÷,r"   rÅ   c                  ó€   • \ rS rSrSrSS jr    SS jr      SS jr      SS jr      SS jr	SS jr
S	rg
)Ú_SSHFormatDSAi}  zTFormat for DSA keys.

Public:
    mpint p, q, g, y
Private:
    mpint p, q, g, y, x
c                óv   • [        U5      u  p![        U5      u  p1[        U5      u  pA[        U5      u  pQX#XE4U4$ )zDSA public fieldsrÇ   )r�   r]   rÚ   rÛ   ÚgÚys         r    rÉ   Ú_SSHFormatDSA.get_public†  sA   € ä˜TÓ"‰ˆÜ˜TÓ"‰ˆÜ˜TÓ"‰ˆÜ˜TÓ"‰ˆØ�aˆ|˜TÐ!Ð!r"   c                óÒ   • U R                  U5      u  u  p#pEn[        R                  " X#U5      n[        R                  " XV5      nU R	                  U5        UR                  5       nX�4$ )zMake DSA public key from data.)rÉ   r
   ÚDSAParameterNumbersÚDSAPublicNumbersÚ	_validaterF   )	r�   r]   rÚ   rÛ   rî   rï   Úparameter_numbersrÍ   rF   s	            r    rÎ   Ú_SSHFormatDSA.load_publicŽ  sa   € ð "Ÿ_™_¨TÓ2Ñ‰ˆˆq�dÜ×3Ò3°A¸!Ó<ÐÜ×-Ò-¨aÓCˆØ�‰�~Ô&Ø#×.Ñ.Ó0ˆ
ØÐÐr"   c                ó>  • U R                  U5      u  u  pEpgn[        U5      u  p�XEXg4U:w  a  [        S5      e[        R                  " XEU5      n	[        R
                  " Xy5      n
U R                  U
5        [        R                  " XŠ5      nUR                  5       nXÁ4$ )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	rÉ   r‚   rQ   r
   rò   ró   rô   ÚDSAPrivateNumbersrÖ   )r�   r]   r×   rÒ   rÚ   rÛ   rî   rï   Úxrõ   rÍ   rÞ   rÖ   s                r    rß   Ú_SSHFormatDSA.load_private™  s•   € ð "Ÿ_™_¨TÓ2Ñ‰ˆˆq�dÜ˜TÓ"‰ˆà�!ˆ<˜9Ó$ÜÐ?Ó@Ð@Ü×3Ò3°A¸!Ó<ÐÜ×-Ò-¨aÓCˆØ�‰�~Ô&Ü×/Ò/°ÓBˆØ%×1Ñ1Ó3ˆØÐ Ð r"   c                ó6  • UR                  5       nUR                  nU R                  U5        UR                  UR                  5        UR                  UR
                  5        UR                  UR                  5        UR                  UR                  5        g)zWrite DSA public keyN)rÍ   rõ   rô   r«   rÚ   rÛ   rî   rï   )r�   rF   râ   rÍ   rõ   s        r    rä   Ú_SSHFormatDSA.encode_public©  su   € ð $×2Ñ2Ó4ˆØ*×<Ñ<ÐØ�‰�~Ô&à�‰Ð)×+Ñ+Ô,Ø�‰Ð)×+Ñ+Ô,Ø�‰Ð)×+Ñ+Ô,Ø�‰˜×(Ñ(Õ)r"   c                ó–   • U R                  UR                  5       U5        UR                  UR                  5       R                  5        g)zWrite DSA private keyN)rä   rF   r«   rÞ   rù   )r�   rÖ   rç   s      r    rè   Ú_SSHFormatDSA.encode_private¶  s:   € ð 	×Ñ˜;×1Ñ1Ó3°VÔ<Ø×Ñ˜×4Ñ4Ó6×8Ñ8Õ9r"   c                ón   • UR                   nUR                  R                  5       S:w  a  [        S5      eg )Ni   z#SSH supports only 1024 bit DSA keys)rõ   rÚ   r„   rQ   )r�   rÍ   rõ   s      r    rô   Ú_SSHFormatDSA._validate½  s6   € Ø*×<Ñ<ÐØ×Ñ×)Ñ)Ó+¨tÓ3ÜÐBÓCÐCð 4r"   r4   N)r]   r¥   r¾   ztuple[tuple, memoryview])r]   r¥   r¾   z#tuple[dsa.DSAPublicKey, memoryview])r]   r¥   rÒ   r2   r¾   z$tuple[dsa.DSAPrivateKey, memoryview])rF   zdsa.DSAPublicKeyrâ   r‰   r¾   r¿   )rÖ   zdsa.DSAPrivateKeyrç   r‰   r¾   r¿   )rÍ   zdsa.DSAPublicNumbersr¾   r¿   )r5   r6   r7   r8   rÃ   rÉ   rÎ   rß   rä   rè   rô   r:   r4   r"   r    rì   rì   }  s~   † ñô"ð	 Øð	 à	,ô	 ð!Øð!ØKOð!à	-ô!ð *Ø*ð*Ø3<ð*à	ô*ð:Ø,ð:Ø6?ð:à	ô:÷Dr"   rì   c                  óˆ   • \ rS rSrSrSS jr    SS jr    SS jr      SS jr      SS jr	      SS jr
S	rg
)Ú_SSHFormatECDSAiÃ  zvFormat for ECDSA keys.

Public:
    str curve
    bytes point
Private:
    str curve
    bytes point
    mpint secret
c                ó   • Xl         X l        g r�   )Ússh_curve_namerV   )r�   r  rV   s      r    r‘   Ú_SSHFormatECDSA.__init__Ï  s   € Ø,ÔØ�
r"   c                óœ   • [        U5      u  p![        U5      u  p1X R                  :w  a  [        S5      eUS   S:w  a  [        S5      eX#4U4$ )zECDSA public fieldszCurve name mismatchr   ro   zNeed uncompressed point)r~   r  rQ   ÚNotImplementedError)r�   r]   rV   Úpoints       r    rÉ   Ú_SSHFormatECDSA.get_publicÓ  sX   € ô " $Ó'‰ˆÜ! $Ó'‰ˆØ×'Ñ'Ó'ÜÐ2Ó3Ð3Ø�‰8�q‹=Ü%Ð&?Ó@Ð@Øˆ~˜tÐ#Ð#r"   c                ó¤   • U R                  U5      u  u  p#n[        R                  R                  U R                  UR                  5       5      nXA4$ ©z Make ECDSA public key from data.)rÉ   r   rG   Úfrom_encoded_pointrV   r»   )r�   r]   Ú_r  rF   s        r    rÎ   Ú_SSHFormatECDSA.load_publicß  sI   € ð  Ÿ?™?¨4Ó0Ñ‰
ˆ�DÜ×.Ñ.×AÑAØ�J‰J˜Ÿ™›ó
ˆ
ð ÐÐr"   c                ó²   • U R                  U5      u  u  pEn[        U5      u  paXE4U:w  a  [        S5      e[        R                  " X`R
                  5      nXq4$ )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)rÉ   r‚   rQ   r   Úderive_private_keyrV   )r�   r]   r×   rÒ   Ú
curve_namer  ÚsecretrÖ   s           r    rß   Ú_SSHFormatECDSA.load_privateé  sZ   € ð %)§O¡O°DÓ$9Ñ!Ñˆ˜TÜ! $Ó'‰ˆàÐ )Ó+ÜÐAÓBÐBÜ×+Ò+¨F·J±JÓ?ˆØÐ Ð r"   c                ó¸   • UR                  [        R                  [        R                  5      nUR                  U R                  5        UR                  U5        g)zWrite ECDSA public keyN)Úpublic_bytesr   ÚX962r   ÚUncompressedPointr¨   r  )r�   rF   râ   r  s       r    rä   Ú_SSHFormatECDSA.encode_publicõ  sG   € ð ×'Ñ'Ü�M‰Mœ<×9Ñ9ó
ˆð 	×Ñ˜×,Ñ,Ô-Ø×Ñ˜Õr"   c                óœ   • UR                  5       nUR                  5       nU R                  X25        UR                  UR                  5        g)zWrite ECDSA private keyN)rF   rÞ   rä   r«   Úprivate_value)r�   rÖ   rç   rF   rÞ   s        r    rè   Ú_SSHFormatECDSA.encode_privateÿ  sB   € ð !×+Ñ+Ó-ˆ
Ø%×5Ñ5Ó7ˆà×Ñ˜:Ô.Ø×Ñ˜×6Ñ6Õ7r"   )rV   r  N)r  r¤   rV   úec.EllipticCurve)r]   r¥   r¾   z0tuple[tuple[memoryview, memoryview], memoryview]©r]   r¥   r¾   z,tuple[ec.EllipticCurvePublicKey, memoryview])r]   r¥   rÒ   r2   r¾   z-tuple[ec.EllipticCurvePrivateKey, memoryview])rF   úec.EllipticCurvePublicKeyrâ   r‰   r¾   r¿   )rÖ   zec.EllipticCurvePrivateKeyrç   r‰   r¾   r¿   )r5   r6   r7   r8   rÃ   r‘   rÉ   rÎ   rß   rä   rè   r:   r4   r"   r    r  r  Ã  s�   † ñ	ôð
$Øð
$à	9ô
$ð Øð à	5ô ð
!Øð
!ØKOð
!à	6ô
!ð Ø3ð Ø<Eð à	ô ð8Ø5ð8Ø?Hð8à	÷8r"   r  c                  ó~   • \ rS rSrSr    S
S jr    SS jr      SS jr      SS jr      SS jr	Sr
g	)Ú_SSHFormatEd25519i
  zfFormat for Ed25519 keys.

Public:
    bytes point
Private:
    bytes point
    bytes secret_and_point
c                ó&   • [        U5      u  p!U4U4$ )zEd25519 public fields)r~   )r�   r]   r  s      r    rÉ   Ú_SSHFormatEd25519.get_public  s   € ô " $Ó'‰ˆØˆx˜ˆ~Ðr"   c                óŒ   • U R                  U5      u  u  p![        R                  R                  UR	                  5       5      nX14$ ©z"Make Ed25519 public key from data.)rÉ   r   rO   Úfrom_public_bytesr»   )r�   r]   r  rF   s       r    rÎ   Ú_SSHFormatEd25519.load_public  s@   € ð Ÿ™¨Ó.‰‰ˆÜ×-Ñ-×?Ñ?Ø�M‰M‹Oó
ˆ
ð ÐÐr"   c                óÌ   • U R                  U5      u  u  pA[        U5      u  pQUSS nUSS nXG:w  d  U4U:w  a  [        S5      e[        R                  R                  U5      nX�4$ )z#Make Ed25519 private key from data.Nr;   z$Corrupt data: ed25519 field mismatch)rÉ   r~   rQ   r   rN   Úfrom_private_bytes)	r�   r]   r×   rÒ   r  Úkeypairr  Úpoint2rÖ   s	            r    rß   Ú_SSHFormatEd25519.load_private%  sq   € ð Ÿ™¨Ó.‰‰ˆÜ# DÓ)‰ˆà˜˜"�ˆØ˜˜�ˆØ‹?˜u˜h¨)Ó3ÜÐCÓDÐDÜ×/Ñ/×BÑBÀ6ÓJˆØÐ Ð r"   c                ó‚   • UR                  [        R                  [        R                  5      nUR	                  U5        g)zWrite Ed25519 public keyN)r  r   ÚRawr   r¨   )r�   rF   râ   Úraw_public_keys       r    rä   Ú_SSHFormatEd25519.encode_public3  s3   € ð $×0Ñ0Ü�L‰Lœ,×*Ñ*ó
ˆð 	×Ñ˜Õ(r"   c                óJ  • UR                  5       nUR                  [        R                  [        R                  [        5       5      nUR                  [        R                  [        R                  5      n[        XE/5      nU R                  X25        UR                  U5        g)zWrite Ed25519 private keyN)rF   Úprivate_bytesr   r-  r   r   r  r   r‰   rä   r¨   )r�   rÖ   rç   rF   Úraw_private_keyr.  Ú	f_keypairs          r    rè   Ú _SSHFormatEd25519.encode_private<  s�   € ð !×+Ñ+Ó-ˆ
Ø%×3Ñ3Ü�L‰Lœ-×+Ñ+¬\«^ó
ˆð $×0Ñ0Ü�L‰Lœ,×*Ñ*ó
ˆô ˜Ð?Ó@ˆ	à×Ñ˜:Ô.Ø×Ñ˜)Õ$r"   r4   N)r]   r¥   r¾   z$tuple[tuple[memoryview], memoryview]©r]   r¥   r¾   z+tuple[ed25519.Ed25519PublicKey, memoryview])r]   r¥   rÒ   r2   r¾   z,tuple[ed25519.Ed25519PrivateKey, memoryview])rF   zed25519.Ed25519PublicKeyrâ   r‰   r¾   r¿   )rÖ   zed25519.Ed25519PrivateKeyrç   r‰   r¾   r¿   rê   r4   r"   r    r   r   
  sˆ   † ñðØðà	-ôð Øð à	4ô ð!Øð!ØKOð!à	5ô!ð)Ø2ð)Ø;Dð)à	ô)ð%Ø4ð%Ø>Gð%à	÷%r"   r   c                óˆ   • [        U 5      u  pUR                  5       R                  S5      (       d  [        SU S35      eX4$ )z
U2F application strings
s   ssh:z4U2F application string does not start with b'ssh:' (Ú))r~   r»   Ú
startswithrQ   )r]   Úapplications     r    Úload_applicationr:  M  sT   € ô $ DÓ)Ñ€KØ×ÑÓ ×+Ñ+¨G×4Ñ4ÜðØˆ}˜Aðó
ð 	
ð ÐÐr"   c                  ó4   • \ rS rSrSr    SS jrSS jrSrg)	Ú_SSHFormatSKEd25519iZ  zÓ
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                ób   • [        [        5      R                  U5      u  p![        U5      u  p1X!4$ r$  )Ú_lookup_kformatrP   rÎ   r:  ©r�   r]   rF   r  s       r    rÎ   Ú_SSHFormatSKEd25519.load_publicc  s1   € ô +¬<Ó8×DÑDÀTÓJÑˆ
Ü" 4Ó(‰ˆØÐÐr"   c                ó   • [        S5      e)Nz,sk-ssh-ed25519 private keys cannot be loadedr   ©r�   r]   s     r    rÉ   Ú_SSHFormatSKEd25519.get_publick  s   € ô #Ø:ó
ð 	
r"   r4   Nr5  ©r]   r¥   r¾   ztyping.NoReturn©r5   r6   r7   r8   rÃ   rÎ   rÉ   r:   r4   r"   r    r<  r<  Z  s!   † ñð Øð à	4ô ÷
r"   r<  c                  ó4   • \ rS rSrSr    SS jrSS jrSrg)	Ú_SSHFormatSKECDSAis  zù
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                ób   • [        [        5      R                  U5      u  p![        U5      u  p1X!4$ r  )r>  Ú_ECDSA_NISTP256rÎ   r:  r?  s       r    rÎ   Ú_SSHFormatSKECDSA.load_public}  s1   € ô +¬?Ó;×GÑGÈÓMÑˆ
Ü" 4Ó(‰ˆØÐÐr"   c                ó   • [        S5      e)Nz4sk-ecdsa-sha2-nistp256 private keys cannot be loadedr   rB  s     r    rÉ   Ú_SSHFormatSKECDSA.get_public…  s   € ô #ØBó
ð 	
r"   r4   Nr  rD  rE  r4   r"   r    rG  rG  s  s!   † ñð Øð à	5ô ÷
r"   rG  s   nistp256s   nistp384s   nistp521c                ó¢   • [        U [        5      (       d  [        U 5      R                  5       n U [        ;   a	  [        U    $ [        SU < 35      e)z"Return valid format or throw errorzUnsupported key type: )rC   r¤   r¥   r»   Ú_KEY_FORMATSr   )rS   s    r    r>  r>  ™  sH   € ä�h¤×&Ñ&Ü˜hÓ'×/Ñ/Ó1ˆØ”<ÓÜ˜HÑ%Ð%Ü
Ð!7¸±|ÐDÓ
EÐEr"   rÑ   c               óB  • [         R                  " SU 5        Ub  [         R                  " SU5        [        R	                  U 5      nU(       d  [        S5      eUR                  S5      nUR                  S5      n[        R                  " [        U 5      XV 5      n U R                  [        5      (       d  [        S5      e[        U 5      [        [        5      S n [        U 5      u  pp[        U 5      u  p€[        U 5      u  p�[        U 5      u  p U
S:w  a  [        S5      e[        U 5      u  p°[        U5      u  pË[!        U5      nUR#                  U5      u  pë[%        U5        U[&        :w  d  U[&        :w  Ga›  UR)                  5       nU[*        ;  a  [-        SU< 35      eU[.        :w  a  [-        SU< 35      e[*        U   R0                  n[*        U   R2                  n[        U 5      u  nn [*        U   R4                  (       a&  [7        U 5      n[        U5      U:w  a  [        S	5      eO[%        U 5        [9        UU5        [        U	5      u  nn[        U5      u  nn[%        U5        [;        XñUR)                  5       U5      nUR=                  5       n[        UR?                  U5      5      n[*        U   R4                  (       a2  [A        U[B        5      (       d   e[%        URE                  W5      5        OS[%        URG                  5       5        O9U(       a  [I        S
5      e[        U 5      u  nn [%        U 5        Sn[9        UU5        [        U5      u  nn[        U5      u  nnUU:w  a  [        S5      e[        U5      u  nnUU:w  a  [        S5      eURK                  UUUS9u  nn[        U5      u  nnU[L        S[        U5       :w  a  [        S5      e[A        U[N        RP                  5      (       a$  [R        RT                  " S[         RV                  SS9  U$ )z.Load private key from OpenSSH custom encoding.r]   Nr   zNot OpenSSH private key formatr%   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: z+Corrupt data: invalid tag length for cipherz4Password was given but private key is not encrypted.rz   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ÚsearchrQ   r·   ÚendÚbinasciiÚ
a2b_base64r¥   r8  Ú	_SK_MAGICrb   r~   rv   r>  rÉ   rf   Ú_NONEr»   r=   r   Ú_BCRYPTr.   r1   r3   r¤   rc   rl   Ú	decryptorÚupdaterC   r   Úfinalize_with_tagÚfinalizerh   rß   Ú_PADDINGr
   rK   ÚwarningsÚwarnÚDeprecatedIn40)r]   r   ÚbackendrÒ   ÚmÚp1Úp2ri   ÚkdfnameÚ
kdfoptionsÚnkeysÚpubdataÚpub_key_typeÚkformatr×   Úciphername_bytesÚblklenr1   ÚedataÚtagr   Úkbufr   rj   ÚdecÚck1Úck2rS   rÖ   r  s                                 r    Úload_ssh_private_keyrx  ª  s½  € ô 
×Ò˜6 4Ô(ØÑÜ×Ò˜: xÔ0ä�‰�tÓ€AÞÜÐ9Ó:Ð:Ø	
�‰�‹€BØ	
�‰ˆq‹€BÜ×Òœz¨$Ó/°Ð6Ó7€DØ�?‰?œ9×%Ñ%ÜÐ9Ó:Ð:Ü�dÓœC¤	›NÐ,Ð-€Dô # 4Ó(Ñ€JÜ Ó%�M€GÜ" 4Ó(Ñ€JÜ˜4“.�K€EØ�ƒzÜÐ1Ó2Ð2ô   Ó%�M€GÜ'¨Ó0Ñ€LÜ˜lÓ+€GØ ×+Ñ+¨GÓ4Ñ€IÜ�Ôà”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ÔÜÐ,¸¿¹»ÈÓOˆØ�n‰nÓˆÜ˜3Ÿ:™: eÓ,Ó-ˆÜÐ(Ñ)×1×1Ü˜cÔ#8×9Ñ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Ñ1Ü�Šðä× Ñ Øò		
ð Ðr"   c                óÞ  • [         R                  " SU5        [        U [        R                  5      (       a$  [
        R                  " S[         R                  SS9  [        U 5      n[        U5      n[        5       nU(       a˜  [        n[        U   R                  n[        n[        n	[        U[         5      (       a  UR"                  b  UR"                  n	[$        R&                  " S5      n
UR)                  U
5        UR+                  U	5        [-        XaX©5      nO[.        =phSnSnSn[$        R&                  " S5      nS	n[        5       nUR)                  U5        UR1                  U R3                  5       U5        [        XÝ/5      nUR)                  U5        UR5                  U U5        UR)                  U5        UR7                  [8        SUUR;                  5       U-  -
   5        [        5       nUR7                  [<        5        UR)                  U5        UR)                  U5        UR)                  U5        UR+                  U5        UR)                  U5        UR)                  U5        UR;                  5       nUR;                  5       n[?        [A        UU-   5      5      nURC                  U5        UU-
  nUb&  URE                  5       RG                  UUU UUS 5        [I        USU 5      $ )
z3Serialize private key with OpenSSH custom encoding.r   úISSH DSA key support is deprecated and will be removed in a future releasero   rR  Nr$   rz   r%   r"   )%r   rU  rC   r
   rK   rc  rd  re  rT   r>  r‰   Ú_DEFAULT_CIPHERr=   r.   r]  Ú_DEFAULT_ROUNDSr   Ú_kdf_roundsÚosÚurandomr¨   r�   rl   r\  rä   rF   rè   r–   rb  r§   r[  r¥   r¦   r¸   Ú	encryptorÚupdate_intor`   )rÖ   r   Úencryption_algorithmrS   ro  Úf_kdfoptionsri   rq  rj  r   r   rj   rl  ÚcheckvalÚcommentÚf_public_keyÚ	f_secretsÚf_mainÚslenÚmlenr¼   Úofss                         r    Ú_serialize_ssh_private_keyrŒ    s}  € ô 
×Ò�z 8Ô,Ü�+œs×0Ñ0×1Ñ1Ü�Šð*ä× Ñ Øò		
ô ! Ó-€HÜ˜hÓ'€Gô “;€LÞÜ$ˆ
Ü˜jÑ)×3Ñ3ˆÜˆÜ ˆäÐ+Ô-H×IÑIØ$×0Ñ0Ñ<à)×5Ñ5ˆFÜ�zŠz˜"‹~ˆØ×Ñ Ô%Ø×Ñ˜VÔ$Ü˜J°$Ó?‰ä$Ð$ˆ
ØˆØˆØ€EÜ�zŠz˜!‹}€HØ€Gô “;€LØ×Ñ˜HÔ%Ø×Ñ˜+×0Ñ0Ó2°LÔAä˜8Ð.Ó/€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                  ó   • \ rS rSrSrSrSrg)ÚSSHCertificateTypeiw  r%   rQ  r4   N)r5   r6   r7   r8   ÚUSERÚHOSTr:   r4   r"   r    rŽ  rŽ  w  s   † Ø€DØƒDr"   rŽ  c                  ó>  • \ rS rSr                                  SS jr\SS j5       rSS jr\SS j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       rSS jrSS jrSS jrSrg)ÚSSHCertificatei|  c                ó  • Xl         X l        X0l         [        U5      U l        XPl        X`l        Xpl        X€l	        X�l
        X l        X°l        XÀl        XÐl        Xàl        UU l        UU l        Xðl        g ! [
         a    [        S5      ef = f)NzInvalid certificate type)Ú_nonceÚ_public_keyÚ_serialrŽ  Ú_typerQ   Ú_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�   r”  r•  r–  Ú_cctyper˜  r™  rš  r›  rœ  r�  rž  rŸ  r   r¡  r¤  r¢  r£  s                     r    r‘   ÚSSHCertificate.__init__}  s‘   € ð( ŒØ&ÔØŒð	9Ü+¨GÓ4ˆDŒJð ŒØ!2ÔØ(ÔØ*ÔØ!2ÔØ&ÔØ"ŒØ ŒØ.ÔØ$ŒØ,ˆÔØ$ˆŒØ,Õøô ó 	9ÜÐ7Ó8Ð8ð	9ús   ”A5 Á5Bc                ó,   • [        U R                  5      $ r�   )r¤   r”  r°   s    r    ÚnonceÚSSHCertificate.nonce¦  s   € ä�T—[‘[Ó!Ð!r"   c                óL   • [         R                  " [        U R                  5      $ r�   )ÚtypingÚcastÚSSHCertPublicKeyTypesr•  r°   s    r    rF   ÚSSHCertificate.public_keyª  s   € ô �{Š{Ô0°$×2BÑ2BÓCÐCr"   c                ó   • U R                   $ r�   )r–  r°   s    r    ÚserialÚSSHCertificate.serial¯  s   € à�|‰|Ðr"   c                ó   • U R                   $ r�   )r—  r°   s    r    ÚtypeÚSSHCertificate.type³  s   € à�z‰zÐr"   c                ó,   • [        U R                  5      $ r�   )r¤   r˜  r°   s    r    Úkey_idÚSSHCertificate.key_id·  s   € ä�T—\‘\Ó"Ð"r"   c                ó   • U R                   $ r�   )r™  r°   s    r    Úvalid_principalsÚSSHCertificate.valid_principals»  ó   € à×%Ñ%Ð%r"   c                ó   • U R                   $ r�   )r›  r°   s    r    Úvalid_beforeÚSSHCertificate.valid_before¿  s   € à×!Ñ!Ð!r"   c                ó   • U R                   $ r�   )rš  r°   s    r    Úvalid_afterÚSSHCertificate.valid_afterÃ  s   € à× Ñ Ð r"   c                ó   • U R                   $ r�   )rœ  r°   s    r    Úcritical_optionsÚSSHCertificate.critical_optionsÇ  r»  r"   c                ó   • U R                   $ r�   )r�  r°   s    r    Ú
extensionsÚSSHCertificate.extensionsË  s   € à×ÑÐr"   c                ó€   • [        U R                  5      nUR                  U R                  5      u  p#[	        U5        U$ r�   )r>  rž  rÎ   rŸ  rf   )r�   Ú	sigformatÚsignature_keyÚsigkey_rests       r    rÊ  ÚSSHCertificate.signature_keyÏ  s5   € Ü# D§N¡NÓ3ˆ	Ø%.×%:Ñ%:¸4¿=¹=Ó%IÑ"ˆÜ�[Ô!ØÐr"   c                ó„   • [        U R                  5      S-   [        R                  " [        U R                  5      SS9-   $ )Nó    F)Únewline)r¤   r¢  rY  Ú
b2a_base64r£  r°   s    r    r  ÚSSHCertificate.public_bytesÕ  s<   € ä�$×%Ñ%Ó&Øñä×!Ò!¤%¨¯©Ó"8À%ÑHñIð	
r"   c                ó  • U R                  5       n[        U[        R                  5      (       a9  UR	                  [        U R                  5      [        U R                  5      5        g [        U[        R                  5      (       a•  [        U R                  5      u  p#[        U5      u  pC[        U5        [        R                  " X$5      n[        UR                  5      nUR	                  U[        U R                  5      [        R                   " U5      5        g [        U["        R$                  5      (       d   eU R&                  [(        :X  a  [*        R,                  " 5       nOUU R&                  [.        :X  a  [*        R0                  " 5       nO+U R&                  [2        :X  d   e[*        R4                  " 5       nUR	                  [        U R                  5      [        U R                  5      [6        R8                  " 5       U5        g r�   )rÊ  rC   r   rO   Úverifyr¤   r¡  r¤  r   rG   r‚   rf   Ú
asym_utilsÚencode_dss_signatureÚ_get_ec_hash_algrV   ÚECDSAr   rI   r   rJ   r	   ÚSHA1Ú_SSH_RSA_SHA256ÚSHA256Ú_SSH_RSA_SHA512ÚSHA512r   ÚPKCS1v15)r�   rÊ  Úrr]   ÚsÚcomputed_sigÚhash_algs          r    Úverify_cert_signatureÚ$SSHCertificate.verify_cert_signatureÜ  so  € Ø×*Ñ*Ó,ˆÜ�m¤W×%=Ñ%=×>Ñ>Ø× Ñ Ü�d—o‘oÓ&¬¨d×.AÑ.AÓ(Bõô ˜¤r×'@Ñ'@×AÑAä  §¡Ó1‰GˆAÜ  Ó&‰GˆAÜ˜ÔÜ%×:Ò:¸1Ó@ˆLÜ'¨×(;Ñ(;Ó<ˆHØ× Ñ Øœe D×$7Ñ$7Ó8¼"¿(º(À8Ó:Lõô ˜m¬S×-=Ñ-=×>Ñ>Ð>Ð>Ø×#Ñ#¤xÓ/Ü!Ÿ;š;›=‘Ø×%Ñ%¬Ó8Ü!Ÿ=š=›?‘à×+Ñ+¬Ó>Ð>Ð>Ü!Ÿ=š=›?�Ø× Ñ Ü�d—o‘oÓ&Ü�d×)Ñ)Ó*Ü× Ò Ó"Øõ	r"   )r£  r¢  rœ  r�  r   r˜  r”  r•  r–  rŸ  rž  r¡  r¤  r—  rš  r›  r™  N)"r”  r¥   r•  ÚSSHPublicKeyTypesr–  r+   r¥  r+   r˜  r¥   r™  úlist[bytes]rš  r+   r›  r+   rœ  údict[bytes, bytes]r�  ræ  rž  r¥   rŸ  r¥   r   r¥   r¡  r¥   r¤  r¥   r¢  r¤   r£  r¥   rÂ   )r¾   r­  rÁ   )r¾   rŽ  )r¾   rå  )r¾   ræ  )r¾   r¿   )r5   r6   r7   r8   r‘   Úpropertyr¨  rF   r°  r³  r¶  r¹  r½  rÀ  rÃ  rÆ  rÊ  r  râ  r:   r4   r"   r    r’  r’  |  sy  † ð'-àð'-ð 'ð'-ð ð	'-ð
 ð'-ð ð'-ð 'ð'-ð ð'-ð ð'-ð .ð'-ð (ð'-ð ð'-ð ð'-ð $ð'-ð ð'-ð  #ð!'-ð" ð#'-ð$ ô%'-ðR ó"ó ð"ôDð
 óó ðð óó ðð ó#ó ð#ð ó&ó ð&ð ó"ó ð"ð ó!ó ð!ð ó&ó ð&ð ó ó ð ôô
÷r"   r’  c                ó>  • [        U [        R                  5      (       a  [        R                  " 5       $ [        U [        R
                  5      (       a  [        R                  " 5       $ [        U [        R                  5      (       d   e[        R                  " 5       $ r�   )	rC   r   Ú	SECP256R1r	   rÚ  Ú	SECP384R1ÚSHA384Ú	SECP521R1rÜ  )rV   s    r    rÖ  rÖ  ý  s_   € Ü�%œŸ™×&Ñ&Ü�}Š}‹ÐÜ	�Eœ2Ÿ<™<×	(Ñ	(Ü�}Š}‹Ðä˜%¤§¡×.Ñ.Ð.Ð.Ü�}Š}‹Ðr"   c                ó  • [         R                  " SU 5        [        R                  U 5      nU(       d  [	        S5      eUR                  S5      =p4UR                  S5      nSnUR                  [        5      (       a  SnUS [        [        5      *  nU[        :X  a  U(       d  [        S5      e[        U5      n [        [        R                  " U5      5      nU(       a  Un	[#        U5      u  p¨X¤:w  a  [	        S	5      eU(       a  [#        U5      u  p¸UR%                  U5      u  pÈU(       Ga§  ['        U5      u  pØ[)        U5      u  pè[#        U5      u  pø[#        U5      u  nn/ nU(       a1  [#        U5      u  nnUR+                  [-        U5      5        U(       a  M1  ['        U5      u  nn['        U5      u  nn[#        U5      u  nn[/        U5      n[#        U5      u  nn[/        U5      n[#        U5      u  nn[#        U5      u  nn[#        U5      u  nnU[        :X  a  U(       d  [        S
5      eW	S [        U5      *  n[#        U5      u  nn[1        U5        [#        U5      u  nn U[2        :X  a  U[4        [6        [2        4;  d  U[2        :w  a  UU:w  a  [	        S5      e[#        U 5      u  n!n [1        U 5        [9        WUUUUUUUUUUUUU!UUU	5      $ [1        U5        U$ ! [        [        R                   4 a    [	        S5      ef = f)Nr]   zInvalid line formatr%   rQ  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   rT  Ú_SSH_PUBKEY_RCÚmatchrQ   ÚgroupÚendswithÚ_CERT_SUFFIXrb   rM   r   r>  r¥   rY  rZ  rh   ÚErrorr~   rÎ   r{   rv   r”   r¤   Ú_parse_exts_optsrf   rJ   rÙ  rÛ  r’  )"r]   Ú_legacy_dsa_allowedrg  rS   Úorig_key_typeÚkey_bodyÚ	with_certro  ÚrestÚ	cert_bodyÚinner_key_typer¨  rF   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ØÓ&ÜÐ-Ó.Ð.ÞÜ! $Ó'‰ˆØ×*Ñ*¨4Ó0Ñ€JßÜ “~‰ˆÜ “~‰ˆÜ" 4Ó(‰ˆÜ& tÓ,Ñˆ
�DØÐÞÜ$/°
Ó$;Ñ!ˆI�zØ×#Ñ#¤E¨)Ó$4Ô5÷ ˆjô % 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   Â;K# Ë#&L	c                ó   • [        U 5      $ r�   )r	  re   s    r    Úload_ssh_public_identityr  f  s   € ô % TÓ*Ð*r"   c                óH  • 0 nS nU (       a–  [        U 5      u  p0[        U5      nXA;   a  [        S5      eUb  XB:  a  [        S5      e[        U 5      u  pP[        U5      S:”  a'  [        U5      u  pV[        U5      S:”  a  [        S5      e[        U5      X'   UnU (       a  M–  U$ )NzDuplicate namezFields not lexically sortedr   z!Unexpected extra data after value)r~   r¤   rQ   rb   )Ú	exts_optsÚresultÚ	last_namerW   ÚbnameÚvalueÚextras          r    rô  rô  l  s¥   € Ø!#€FØ€IÞ
Ü% iÓ0‰ˆÜ˜T“{ˆØ‹?ÜÐ-Ó.Ð.ØÑ  UÓ%6ÜÐ:Ó;Ð;Ü& yÓ1ÑˆÜˆu‹:˜‹>Ü& uÓ-‰LˆEÜ�5‹z˜A‹~Ü Ð!DÓEÐEÜ˜e›ˆ‰Øˆ	÷ ˆ)ð €Mr"   c                óˆ  • [        U[        R                  [        R                  45      (       d  [	        S5      e[        U 5      n[        U5      n[        5       nUR                  U5        UR                  X5        UR                  5       n[        R                  " U5      nUR                  U5        UR                  5       $ )Nz+hash_algorithm must be either MD5 or SHA256)rC   r	   ÚMD5rÚ  rh   rT   r>  r‰   r¨   rä   r»   ÚHashr_  ra  )rR   Úhash_algorithmrS   ro  râ   Ússh_binary_dataÚhash_objs          r    Ússh_key_fingerprintr  €  s—   € ô �n¤v§z¡z´6·=±=Ð&A×BÑBÜÐEÓFÐFä  Ó%€HÜ˜hÓ'€Gä‹K€EØ	×Ñ�XÔØ×Ñ˜#Ô%à—m‘m“o€Oô �{Š{˜>Ó*€HØ‡O�O�OÔ$Ø×ÑÓÐr"   c                óð   • [        U SS9n[        U[        5      (       a  UR                  5       nOUn[        U[        R
                  5      (       a$  [        R                  " S[        R                  SS9  U$ )NT)rõ  rP  rQ  rR  )
r	  rC   r’  rF   r
   rL   rc  rd  r   re  )r]   rf  Úcert_or_keyrF   s       r    Úload_ssh_public_keyr  –  sh   € ô ,¨DÀdÑK€Kä�+œ~×.Ñ.Ø ×+Ñ+Ó-‰
à ˆ
ä�*œc×.Ñ.×/Ñ/Ü�Šðä× Ñ Øò		
ð Ðr"   c                ó˜  • [        U [        R                  5      (       a$  [        R                  " S[
        R                  SS9  [        U 5      n[        U5      n[        5       nUR                  U5        UR                  X5        [        R                  " UR                  5       5      R                  5       nSR!                  USU/5      $ )z&One-line public key format for OpenSSHrz  ro   rR  r"   rÎ  )rC   r
   rL   rc  rd  r   re  rT   r>  r‰   r¨   rä   rY  rÐ  r»   Ústripr[   )rF   rS   ro  râ   Úpubs        r    Úserialize_ssh_public_keyr   ª  s    € ä�*œc×.Ñ.×/Ñ/Ü�Šð*ä× Ñ Øò		
ô ! Ó,€HÜ˜hÓ'€Gä‹K€EØ	×Ñ�XÔØ×Ñ˜*Ô,ä
×
Ò
˜eŸm™m›oÓ
.×
4Ñ
4Ó
6€CØ�8‰8�X˜t SÐ)Ó*Ð*r"   é   c            
      óî   • \ rS rSrSSSS/ SSS/ / 4
                   SS jjr    SS jrSS jrSS jrSS jr    SS	 jr	S
 r
SS jrSS jr      SS jr      SS jrSS jrSrg)ÚSSHCertificateBuilderiÊ  NFc                ó|   • Xl         X l        X0l        X@l        XPl        X`l        Xpl        X€l        X�l        X l	        g r�   ©
r•  r–  r—  r˜  r™  Ú_valid_for_all_principalsr›  rš  rœ  r�  )r�   r•  r–  r—  r˜  r™  r&  r›  rš  rœ  r�  s              r    r‘   ÚSSHCertificateBuilder.__init__Ë  s=   € ð 'ÔØŒØŒ
ØŒØ!2ÔØ)BÔ&Ø*ÔØ(ÔØ!2ÔØ&Õr"   c                óœ  • [        U[        R                  [        R                  [
        R                  45      (       d  [        S5      eU R                  b  [        S5      e[        UU R                  U R                  U R                  U R                  U R                  U R                   U R"                  U R$                  U R&                  S9
$ )NrB   zpublic_key already setr%  )rC   r   rG   r   rI   r   rO   rh   r•  rQ   r#  r–  r—  r˜  r™  r&  r›  rš  rœ  r�  )r�   rF   s     r    rF   Ú SSHCertificateBuilder.public_keyã  sµ   € ô Øä×)Ñ)Ü× Ñ Ü×(Ñ(ð÷
ñ 
ô Ð2Ó3Ð3Ø×ÑÑ'ÜÐ5Ó6Ð6ä$Ø"Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                ó~  • [        U[        5      (       d  [        S5      eSUs=::  a  S:  d  O  [        S5      eU R                  b  [        S5      e[        U R                  UU R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9
$ )Nzserial must be an integerr   ì            z"serial must be between 0 and 2**64zserial already setr%  )rC   r+   rh   rQ   r–  r#  r•  r—  r˜  r™  r&  r›  rš  rœ  r�  )r�   r°  s     r    r°  ÚSSHCertificateBuilder.serialÿ  s§   € Ü˜&¤#×&Ñ&ÜÐ7Ó8Ð8Ø�FÕ"˜UÕ"ÜÐAÓBÐBØ�<‰<Ñ#ÜÐ1Ó2Ð2ä$Ø×(Ñ(ØØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óJ  • [        U[        5      (       d  [        S5      eU R                  b  [	        S5      e[        U R                  U R                  UU R                  U R                  U R                  U R                  U R                  U R                  U R                  S9
$ )Nz"type must be an SSHCertificateTypeztype already setr%  )rC   rŽ  rh   r—  rQ   r#  r•  r–  r˜  r™  r&  r›  rš  rœ  r�  )r�   r³  s     r    r³  ÚSSHCertificateBuilder.type  s�   € Ü˜$Ô 2×3Ñ3ÜÐ@ÓAÐAØ�:‰:Ñ!ÜÐ/Ó0Ð0ä$Ø×(Ñ(Ø—L‘LØØ—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óJ  • [        U[        5      (       d  [        S5      eU R                  b  [	        S5      e[        U R                  U R                  U R                  UU R                  U R                  U R                  U R                  U R                  U R                  S9
$ )Nzkey_id must be byteszkey_id already setr%  )rC   r¤   rh   r˜  rQ   r#  r•  r–  r—  r™  r&  r›  rš  rœ  r�  )r�   r¶  s     r    r¶  ÚSSHCertificateBuilder.key_id'  sŽ   € Ü˜&¤%×(Ñ(ÜÐ2Ó3Ð3Ø�<‰<Ñ#ÜÐ1Ó2Ð2ä$Ø×(Ñ(Ø—L‘LØ—*‘*ØØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óØ  • U R                   (       a  [        S5      e[        S U 5       5      (       a  U(       d  [        S5      eU R                  (       a  [        S5      e[        U5      [        :”  a  [        S5      e[        U R                  U R                  U R                  U R                  UU R                   U R                  U R                  U R                  U R                  S9
$ )NzDPrincipals can't be set because the cert is valid for all principalsc              3  óB   #   • U  H  n[        U[        5      v •  M     g 7fr�   )rC   r¤   )Ú.0rù   s     r    Ú	<genexpr>Ú9SSHCertificateBuilder.valid_principals.<locals>.<genexpr>C  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&  rQ   Úallrh   r™  rb   Ú_SSHKEY_CERT_MAX_PRINCIPALSr#  r•  r–  r—  r˜  r›  rš  rœ  r�  )r�   r¹  s     r    r¹  Ú&SSHCertificateBuilder.valid_principals:  sÙ   € ð ×)×)Üð%óð ô
 ÑCÑ2BÓC×CÑCÞ#äØGóð ð ×!×!ÜÐ;Ó<Ð<äÐÓ Ô#>Ó>ÜØLóð ô %Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ.Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óJ  • U R                   (       a  [        S5      eU R                  (       a  [        S5      e[        U R                  U R
                  U R                  U R                  U R                   SU R                  U R                  U R                  U R                  S9
$ )Nz@valid_principals already set, can't set valid_for_all_principalsz$valid_for_all_principals already setTr%  )r™  rQ   r&  r#  r•  r–  r—  r˜  r›  rš  rœ  r�  r°   s    r    Úvalid_for_all_principalsÚ.SSHCertificateBuilder.valid_for_all_principals^  s�   € Ø×!×!Üð+óð ð ×)×)ÜÐCÓDÐDä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*Ø×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óš  • [        U[        [        45      (       d  [        S5      e[        U5      nUS:  d  US:¼  a  [	        S5      eU R
                  b  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  UU R                  U R                  U R                  S9
$ )Nz$valid_before must be an int or floatr   r+  zvalid_before must [0, 2**64)zvalid_before already setr%  )rC   r+   Úfloatrh   rQ   r›  r#  r•  r–  r—  r˜  r™  r&  rš  rœ  r�  )r�   r½  s     r    r½  Ú"SSHCertificateBuilder.valid_beforet  s·   € Ü˜,¬¬e¨×5Ñ5ÜÐBÓCÐCÜ˜<Ó(ˆØ˜!Ó˜|¨uÓ4ÜÐ;Ó<Ð<Ø×ÑÑ)ÜÐ7Ó8Ð8ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ&Ø×*Ñ*Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óš  • [        U[        [        45      (       d  [        S5      e[        U5      nUS:  d  US:¼  a  [	        S5      eU R
                  b  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  U R                  UU R                  U R                  S9
$ )Nz#valid_after must be an int or floatr   r+  zvalid_after must [0, 2**64)zvalid_after already setr%  )rC   r+   r=  rh   rQ   rš  r#  r•  r–  r—  r˜  r™  r&  r›  rœ  r�  )r�   rÀ  s     r    rÀ  Ú!SSHCertificateBuilder.valid_afterŠ  s¶   € Ü˜+¬¬U |×4Ñ4ÜÐAÓBÐBÜ˜+Ó&ˆØ˜‹?˜k¨UÓ2ÜÐ:Ó;Ð;Ø×ÑÑ(ÜÐ6Ó7Ð7ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø$Ø"×4Ñ4Ø×(Ñ(ñ
ð 	
r"   c                óÎ  • [        U[        5      (       a  [        U[        5      (       d  [        S5      eXR                   VVs/ s H  u  pUPM	     snn;   a  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  / U R                  QWU4PU R                  S9
$ s  snnf )Núname and value must be byteszDuplicate critical option namer%  )rC   r¤   rh   rœ  rQ   r#  r•  r–  r—  r˜  r™  r&  r›  rš  r�  ©r�   rW   r  r  s       r    Úadd_critical_optionÚ)SSHCertificateBuilder.add_critical_option   sÉ   € ô ˜$¤×&Ñ&¬j¸Ä×.FÑ.FÜÐ:Ó;Ð;à×(>Ò(>Ô?Ò(>™W˜T“DÑ(>Ò?Ó?ÜÐ=Ó>Ð>ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*ØF × 6Ñ 6ÐF¸¸u¸ÐFØ×(Ñ(ñ
ð 	
ùó @ó   ÁC!c                óÎ  • [        U[        5      (       a  [        U[        5      (       d  [        S5      eXR                   VVs/ s H  u  pUPM	     snn;   a  [	        S5      e[        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  / U R                  QWU4PS9
$ s  snnf )NrB  zDuplicate extension namer%  )rC   r¤   rh   r�  rQ   r#  r•  r–  r—  r˜  r™  r&  r›  rš  rœ  rC  s       r    Úadd_extensionÚ#SSHCertificateBuilder.add_extension¶  sÈ   € ô ˜$¤×&Ñ&¬j¸Ä×.FÑ.FÜÐ:Ó;Ð;à×(8Ò(8Ô9Ò(8™W˜T“DÑ(8Ò9Ó9ÜÐ7Ó8Ð8ä$Ø×(Ñ(Ø—L‘LØ—*‘*Ø—L‘LØ"×4Ñ4Ø&*×&DÑ&DØ×,Ñ,Ø×*Ñ*Ø"×4Ñ4Ø:˜$×*Ñ*Ð:¨T°5¨MÐ:ñ
ð 	
ùó :rF  c           
     ó~  • [        U[        R                  [        R                  [
        R                  45      (       d  [        S5      eU R                  c  [        S5      eU R                  c  SOU R                  nU R                  c  [        S5      eU R                  c  SOU R                  nU R                  (       d  U R                  (       d  [        S5      eU R                  c  [        S5      eU R                   c  [        S5      eU R                   U R                  :”  a  [        S	5      eU R"                  R%                  S
 S9  U R&                  R%                  S S9  [)        U R                  5      nU[*        -   n[,        R.                  " S5      n[1        U5      n[3        5       nUR5                  U5        UR5                  U5        UR7                  U R                  U5        UR9                  U5        UR;                  U R                  R<                  5        UR5                  U5        [3        5       n	U R                   H  n
U	R5                  U
5        M     UR5                  U	R?                  5       5        UR9                  U R                   5        UR9                  U R                  5        [3        5       nU R"                   Hr  u  pÍUR5                  U5        [A        U5      S:”  a<  [3        5       nUR5                  U5        UR5                  UR?                  5       5        Ma  UR5                  U5        Mt     UR5                  UR?                  5       5        [3        5       nU R&                   Hr  u  pÍUR5                  U5        [A        U5      S:”  a<  [3        5       nUR5                  U5        UR5                  UR?                  5       5        Ma  UR5                  U5        Mt     UR5                  UR?                  5       5        UR5                  S5        [)        U5      n[1        U5      n[3        5       nUR5                  U5        UR7                  URC                  5       U5        UR5                  UR?                  5       5        [        U[
        R                  5      (       al  URE                  UR?                  5       5      n[3        5       nUR5                  U5        UR5                  U5        UR5                  UR?                  5       5        GO¾[        U[        R                  5      (       aè  [G        URH                  5      nURE                  UR?                  5       [        RJ                  " U5      5      n[L        RN                  " U5      u  nn[3        5       nUR5                  U5        [3        5       nURQ                  U5        URQ                  U5        UR5                  UR?                  5       5        UR5                  UR?                  5       5        O·[        U[        R                  5      (       d   e[3        5       nUR5                  [R        5        URE                  UR?                  5       [T        RV                  " 5       [X        RZ                  " 5       5      nUR5                  U5        UR5                  UR?                  5       5        [\        R^                  " UR?                  5       5      Ra                  5       n[b        Rd                  " [f        [i        SRk                  USU/5      5      5      $ )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                ó   • U S   $ ©Nr   r4   ©rù   s    r    Ú<lambda>Ú,SSHCertificateBuilder.sign.<locals>.<lambda>÷  s   € °!°A²$r"   )rR   c                ó   • U S   $ rL  r4   rM  s    r    rN  rO  ø  s   € ¨A¨aªDr"   r;   rÎ  )6rC   r   rD   r   rH   r   rN   rh   r•  rQ   r–  r—  r˜  r™  r&  r›  rš  rœ  Úsortr�  rT   rò  r~  r  r>  r‰   r¨   rä   r¡   r�   r  r»   rb   rF   ÚsignrÖ  rV   r×  rÔ  Údecode_dss_signaturer«   rÛ  r   rÝ  r	   rÜ  rY  rÐ  r  r«  r¬  r’  r  r[   )r�   rÖ   r°  r¶  rS   Úcert_prefixr¨  ro  ÚfÚfprincipalsrÚ   ÚfcritrW   r  ÚfoptvalÚfextÚfextvalÚca_typeÚcaformatÚcafr  Úfsigrá  rÞ  rß  ÚfsigblobÚ	cert_datas                              r    rR  ÚSSHCertificateBuilder.signÌ  sc  € ÜØä×*Ñ*Ü×!Ñ!Ü×)Ñ)ð÷
ñ 
ô Ð:Ó;Ð;à×ÑÑ#ÜÐ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"   )
rœ  r�  r˜  r•  r–  r—  rš  r›  r&  r™  )r•  zSSHCertPublicKeyTypes | Noner–  r0   r—  zSSHCertificateType | Noner˜  úbytes | Noner™  rå  r&  r2   r›  r0   rš  r0   rœ  úlist[tuple[bytes, bytes]]r�  rc  )rF   r­  r¾   r#  )r°  r+   r¾   r#  )r³  rŽ  r¾   r#  )r¶  r¤   r¾   r#  )r¹  rå  r¾   r#  )r½  úint | floatr¾   r#  )rÀ  rd  r¾   r#  )rW   r¤   r  r¤   r¾   r#  )rÖ   ÚSSHCertPrivateKeyTypesr¾   r’  )r5   r6   r7   r8   r‘   rF   r°  r³  r¶  r¹  r:  r½  rÀ  rD  rH  rR  r:   r4   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   r2   r¾   r¤   )rR   z&SSHPrivateKeyTypes | SSHPublicKeyTypesr¾   r¤   )rF   r  r¾   r¤   )r]   rÀ   r^   r¤   r_   r¤   r¾   r¤   )r]   rÀ   r.   r+   r¾   r¿   )r]   rÀ   r¾   r¿   )
ri   r¤   r   rb  r   r¤   r   r+   r¾   z)Cipher[modes.CBC | modes.CTR | modes.GCM])r]   r¥   r¾   ztuple[int, memoryview])r]   r¥   r¾   útuple[memoryview, memoryview])r�   r+   r¾   r¤   )r¾   rf  )rS   rÀ   r�   )
r]   rÀ   r   rb  rf  ú
typing.AnyrÒ   r2   r¾   ÚSSHPrivateKeyTypes)rÖ   rh  r   r¤   r‚  r   r¾   r¤   )rV   r  r¾   zhashes.HashAlgorithm)r]   rÀ   r¾   z"SSHCertificate | SSHPublicKeyTypes)r  r¥   r¾   ræ  )rR   rä  r  zhashes.MD5 | hashes.SHA256r¾   r¤   )r]   rÀ   rf  rg  r¾   rä  )rF   rä  r¾   r¤   )€Ú
__future__r   rY  Úenumr~  Úrer«  rc  Úbase64r   r\   Ú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ÚImportErrorrP   rJ   rM   rI  Ú_ECDSA_NISTP384Ú_ECDSA_NISTP521rò  Ú_SK_SSH_ED25519Ú_SK_SSH_ECDSA_NISTP256rÙ  rÛ  Úcompilerî  r[  Ú	_SK_STARTÚ_SK_ENDr]  r\  r{  r|  ÚDOTALLrV  r¥   r¦   Úrangerb  r(   ÚAESÚCTRÚCBCÚGCMr=   r9   rX   rT   rE   r`   rc   rf   rl   rv   r{   r~   r‚   r‡   r‰   rÅ   rì   r  r   r:  r<  rG  ré  rê  rì  rN  r>  ÚUnionrD   rH   rK   rN   rh  rx  rŒ  rG   rI   rL   rO   rä  r­  ÚEnumrŽ  r’  rÖ  r	  r  rô  r  r  r   re  r7  r#  r4   r"   r    Ú<module>r†     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D8ñ D8÷N@%ñ @%ô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
øðy$ ó 
9ØÐð #(ð9Øð9àð9ð ð9ð ð	9ð
  ð9ð 
÷9ð 9ð
9ús   Á/O ÏO,Ï+O,