ó
    Ö›‘hz ã                   óJ  • S 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  \" S	5      r\c  S
r\(       a2  SSKJr  SSKJr  SSKJr  SSKJrJrJr  \" 5       R7                  5       rOSrS r " S S\R<                  5      r " S S\R<                  5      r g)z&
Tests for L{twisted.conch.ssh.keys}.
é    N)Údedent)Úkeydata)Ú	randbytes)ÚFilePath)ÚrequireModule)ÚunittestÚcryptographyz Cannot run without cryptography.)Údefault_backend)Úhashes)Úpadding)ÚcommonÚkeysÚsexpyFc                 ó*   • [         (       d  SU l        U $ )Nz$ed25519 not supported on this system)ÚED25519_SUPPORTEDÚskip)Úfs    Ú`C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/conch/test/test_keys.pyÚskipWithoutEd25519r   $   s   € ßÒØ7ˆŒØ€Hó    c                   óˆ  • \ rS rSr\c  \rS rS rS r	S r
S rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S  r$S! r%S" r&S# r'S$ r(S% r)S& r*S' r+S( r,S) r-S* r.S+ r/\0S, 5       r1S- r2S. r3S/ r4S0 r5S1 r6\0S2 5       r7S3 r8S4 r9S5 r:\0S6 5       r;S7 r<S8 r=S9 r>S: r?\0S; 5       r@S< rAS= rBS> rCS? rDS@ rESA rFSB rG\0SC 5       rH\0SD 5       rISE rJSF rKSG rLSH rMSI rNSJ rOSK rPSL rQSM rRSN rSSO rT\0SP 5       rUSQ rVSR rWSS rXST rYSU rZSV r[SW r\SX r]\0SY 5       r^\0SZ 5       r_S[r`g)\ÚKeyTestsé*   Nc           	      ó¶  • [         R                  R                  [        R                  S   [        R                  S   [        R                  S   [        R                  S   [        R                  S   [        R                  S   S9R
                  U l        [         R                  R                  [        R                  S   [        R                  S   [        R                  S   [        R                  S	   [        R                  S
   S9R
                  U l	        [         R                  R                  [        R                  S
   [        R                  S   [        R                  S   [        R                  S   S9R
                  U l        [         R                  R                  [        R                  S
   [        R                  S   [        R                  S   [        R                  S   S9R
                  U l        [         R                  R                  [        R                  S
   [        R                  S   [        R                  S   [        R                  S   S9R
                  U l        ["        (       aO  [         R                  R%                  [        R&                  S   [        R&                  S   S9R
                  U l        SU l        SU l        U R/                  [0        SS 5        U R3                  5       U l        [7        U R4                  S5       nUR9                  [        R:                  5        S S S 5        g ! , (       d  f       g = f)NÚnÚeÚdÚpÚqÚu)r   r   r   r   r   r    ÚyÚgÚx)r!   r   r   r"   r#   ÚprivateValueÚcurve)r#   r!   r$   r%   ÚaÚk)r&   r'   s     ssh-rsa   ~Y£×ýWÆpu@Ø1¡SóOÚEô/xñšáG3ÙÖUŒÙ‹�ŠÁ‘ØdÉç²É,'=QgçxµjÛIÀÞ¯b×@ÊrÎ£zM1q5Þú{wjKNˆËCå‰Ãùi–‘ÛÊ}ÛRTùDJHÏló[‚¢�“ýŽÎ|û^nÔíâÑŠ·aY›B�¤Ç¾7µ9j¤.‡÷ðÚ×Òù9pý?òN›Ï/)
>AÂµjùUWÔ®‡Bæ™t¢y�˜¢ªfË†åkãÎàuë“NˆÉ“YÃ.V±L44`CÇ¦6¯úY’ú¤%Õ 4^¹rYº ù.‰%H¾ƒA–s7      ssh-dss   (?Çë†;ÕTFA´ßÄE@4,d¼	Ù®Ý[í-‚nQŒf›èájrg„p<ÚsecureRandomc                 ó   • SU -  $ )Nó   ÿ© )r#   s    r   Ú<lambda>Ú KeyTests.setUp.<locals>.<lambda>h   s   € ¸À!ºr   Úwb)r   ÚKeyÚ_fromRSAComponentsr   ÚRSADataÚ
_keyObjectÚrsaObjÚ_fromDSAComponentsÚDSADataÚdsaObjÚ_fromECComponentsÚECDatanistp256ÚecObjÚECDatanistp384ÚecObj384ÚECDatanistp521ÚecObj521r   Ú_fromEd25519ComponentsÚEd25519DataÚ
ed25519ObjÚrsaSignatureÚdsaSignatureÚpatchr   ÚmktempÚkeyFileÚopenÚwriteÚprivateRSA_lsh)Úselfr   s     r   ÚsetUpÚKeyTests.setUp.   s�  € Ü—h‘h×1Ñ1Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"ð 2ð 
÷ ‰*ð 	Œô —h‘h×1Ñ1Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"Ü�o‰o˜cÑ"ð 2ð 
÷ ‰*ð 	Œô —X‘X×/Ñ/Ü×$Ñ$ SÑ)Ü×$Ñ$ SÑ)Ü ×/Ñ/°Ñ?Ü×(Ñ(¨Ñ1ð	 0ð 
÷
 ‰*ð 	Œ
ô Ÿ™×2Ñ2Ü×$Ñ$ SÑ)Ü×$Ñ$ SÑ)Ü ×/Ñ/°Ñ?Ü×(Ñ(¨Ñ1ð	 3ð 
÷
 ‰*ð 	Œô Ÿ™×2Ñ2Ü×$Ñ$ SÑ)Ü×$Ñ$ SÑ)Ü ×/Ñ/°Ñ?Ü×(Ñ(¨Ñ1ð	 3ð 
÷
 ‰*ð 	Œ÷ ÒÜ"Ÿh™h×=Ñ=Ü×%Ñ% cÑ*¬g×.AÑ.AÀ#Ñ.Fð >ð ç‰jð ŒOð;ð 	Ôð ð 	Ôð
 	�
‰
”9˜nÑ.CÔDØ—{‘{“}ˆŒÜ�$—,‘, Ô%¨Ø�G‰G”G×*Ñ*Ô+÷ &×%Ö%ús   Ì! M
Í

Mc                 óD   • [         R                  " U R                  5        g ©N)ÚosÚunlinkrE   ©rI   s    r   ÚtearDownÚKeyTests.tearDownm   s   € Ü
�	Š	�$—,‘,Õr   c                 ó  • U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R
                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R	                  5       S5        [        (       a?  U R                  [        R                  " U R                  5      R	                  5       S5        gg)zE
The L{keys.Key.size} method returns the size of key object in bits.
é   é   é   i€  i	  N)ÚassertEqualr   r/   r3   Úsizer6   r9   r;   r=   r   r@   rP   s    r   Ú	test_sizeÚKeyTests.test_sizep   só   € ð 	×ÑœŸš $§+¡+Ó.×3Ñ3Ó5°tÔ<Ø×ÑœŸš $§+¡+Ó.×3Ñ3Ó5°tÔ<Ø×ÑœŸš $§*¡*Ó-×2Ñ2Ó4°cÔ:Ø×ÑœŸš $§-¡-Ó0×5Ñ5Ó7¸Ô=Ø×ÑœŸš $§-¡-Ó0×5Ñ5Ó7¸Ô=ßÒØ×ÑœTŸXšX d§o¡oÓ6×;Ñ;Ó=¸sÕCð r   c                 ó,
  • U R                  [        R                  R                  [        R
                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                  5      S5        U R                  [        R                  R                  [        R                   5      S5        U R                  [        R                  R                  [        R"                  5      S5        U R                  [        R                  R                  [        R$                  5      S5        U R                  [        R                  R                  [        R&                  5      S5        U R                  [        R                  R                  [        R(                  5      S5        U R                  [        R                  R                  [        R*                  5      S5        U R                  [        R                  R                  [        R,                  5      S5        U R                  [        R                  R                  [        R.                  5      S5        U R                  [        R                  R                  S5      S5        U R                  [        R                  R                  S5      S5        U R                  [        R                  R                  S	5      S
5        g
)zG
Test that the _guessStringType method guesses string types
correctly.
Úpublic_opensshÚprivate_opensshÚ
public_lshÚprivate_lshÚagentv3s      ssh-rsa   Úblobs      ssh-dss   s	   not a keyN)rW   r   r/   Ú_guessStringTyper   ÚpublicRSA_opensshÚpublicDSA_opensshÚpublicECDSA_opensshÚpublicSKECDSA_opensshÚpublicEd25519_opensshÚpublicSKEd25519_opensshÚprivateRSA_opensshÚprivateRSA_openssh_newÚprivateDSA_opensshÚprivateDSA_openssh_newÚprivateECDSA_opensshÚprivateECDSA_openssh_newÚprivateEd25519_openssh_newÚpublicRSA_lshÚpublicDSA_lshrH   ÚprivateDSA_lshÚprivateRSA_agentv3ÚprivateDSA_agentv3rP   s    r   Útest__guessStringTypeÚKeyTests.test__guessStringType|   s�  € ð
 	×ÑÜ�H‰H×%Ñ%¤g×&?Ñ&?Ó@ÐBRô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&?Ñ&?Ó@ÐBRô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&AÑ&AÓBÐDTô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&CÑ&CÓDÐFVô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&CÑ&CÓDØô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&EÑ&EÓFØô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&@Ñ&@ÓAÐCTô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&DÑ&DÓEÐGXô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&@Ñ&@ÓAÐCTô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&DÑ&DÓEÐGXô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&BÑ&BÓCÐEVô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&FÑ&FÓGØô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&HÑ&HÓIØô	
ð 	×ÑœŸ™×2Ñ2´7×3HÑ3HÓIÈ<ÔXØ×ÑœŸ™×2Ñ2´7×3HÑ3HÓIÈ<ÔXØ×ÑÜ�H‰H×%Ñ%¤g×&<Ñ&<Ó=¸}ô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&<Ñ&<Ó=¸}ô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&@Ñ&@ÓAÀ9ô	
ð 	×ÑÜ�H‰H×%Ñ%¤g×&@Ñ&@ÓAÀ9ô	
ð 	×ÑÜ�H‰H×%Ñ%Ð&TÓUØô	
ð 	×ÑÜ�H‰H×%Ñ%Ð&TÓUØô	
ð 	×ÑœŸ™×2Ñ2°<Ó@À$ÕGr   c                 ó   • U R                  [        R                  [        R                  R                  [
        R                  5        U R                  [        R                  [        R                  R                  [
        R                  5        g)z-
OpenSSH certificates are not yet supported.
N)ÚassertRaisesr   ÚBadKeyErrorr/   Ú
fromStringr   ÚpublicSKEd25519_cert_opensshÚpublicSKECDSA_cert_opensshrP   s    r   Útest_OpenSSH_cert_not_supportedÚ(KeyTests.test_OpenSSH_cert_not_supportedÄ   s`   € ð 	×ÑÜ×ÑÜ�H‰H×ÑÜ×0Ñ0ô	
ð
 	×ÑÜ×ÑÜ�H‰H×ÑÜ×.Ñ.õ	
r   c                 ó\  • [         R                  R                  [        R                  5      n[         R                  R                  [        R
                  5      nU R                  UR                  5       UR                  5       5        [         R                  R                  [        R                  5      n[         R                  R                  [        R                  5      nU R                  UR                  5       UR                  5       5        [         R                  R                  [        R                  5      n[         R                  R                  [        R                  5      nU R                  UR                  5       UR                  5       5        [        (       a‰  [         R                  R                  [        R                  5      n[         R                  R                  [        R                  5      nU R                  UR                  5       UR                  5       5        gg)zV
The L{keys.Key.public} method returns a public key for both
public and private keys.
N)r   r/   rz   r   ri   rc   rW   Úpublicrk   rd   rm   re   r   ro   rg   )	rI   ÚprivateRSAKeyÚpublicRSAKeyÚprivateDSAKeyÚpublicDSAKeyÚprivateECDSAKeyÚpublicECDSAKeyÚprivateEd25519KeyÚpublicEd25519Keys	            r   Útest_publicÚKeyTests.test_publicÓ   sk  € ô Ÿ™×+Ñ+¬G×,FÑ,FÓGˆÜ—x‘x×*Ñ*¬7×+DÑ+DÓEˆØ×Ñ˜×-Ñ-Ó/°×1DÑ1DÓ1FÔGäŸ™×+Ñ+¬G×,FÑ,FÓGˆÜ—x‘x×*Ñ*¬7×+DÑ+DÓEˆØ×Ñ˜×-Ñ-Ó/°×1DÑ1DÓ1FÔGäŸ(™(×-Ñ-¬g×.JÑ.JÓKˆÜŸ™×,Ñ,¬W×-HÑ-HÓIˆØ×Ñ˜×/Ñ/Ó1°>×3HÑ3HÓ3JÔKçÒÜ $§¡× 3Ñ 3´G×4VÑ4VÓ WÐÜ#Ÿx™x×2Ñ2´7×3PÑ3PÓQÐØ×ÑÐ.×5Ñ5Ó7Ð9I×9PÑ9PÓ9RÕSð r   c                 óä  • [         R                  R                  [        R                  5      n[         R                  R                  [        R
                  5      n[         R                  R                  [        R                  5      nU R                  UR                  5       R                  5       5        U R                  UR                  5       5        U R                  UR                  5       R                  5       5        U R                  UR                  5       5        U R                  UR                  5       R                  5       5        U R                  UR                  5       5        [        (       az  [         R                  R                  [        R                  5      nU R                  UR                  5       R                  5       5        U R                  UR                  5       5        gg)zO
The L{keys.Key.isPublic} method returns True for public keys
otherwise False.
N)r   r/   rz   r   ri   rk   rm   Ú
assertTruer€   ÚisPublicÚassertFalser   ro   )rI   ÚrsaKeyÚdsaKeyÚecdsaKeyÚ
ed25519Keys        r   Útest_isPublicÚKeyTests.test_isPublicë   s?  € ô
 —‘×$Ñ$¤W×%?Ñ%?Ó@ˆÜ—‘×$Ñ$¤W×%?Ñ%?Ó@ˆÜ—8‘8×&Ñ&¤w×'CÑ'CÓDˆØ�‰˜Ÿ™›×0Ñ0Ó2Ô3Ø×Ñ˜Ÿ™Ó*Ô+Ø�‰˜Ÿ™›×0Ñ0Ó2Ô3Ø×Ñ˜Ÿ™Ó*Ô+Ø�‰˜Ÿ™Ó)×2Ñ2Ó4Ô5Ø×Ñ˜×*Ñ*Ó,Ô-çÒÜŸ™×,Ñ,¬W×-OÑ-OÓPˆJØ�O‰O˜J×-Ñ-Ó/×8Ñ8Ó:Ô;Ø×Ñ˜Z×0Ñ0Ó2Õ3ð r   c                 óL   • U R                  XU5        U R                  X#U5        g rM   )Ú_testPublicFromStringÚ_testPrivateFromString)rI   r€   ÚprivateÚtypeÚdatas        r   Ú_testPublicPrivateFromStringÚ%KeyTests._testPublicPrivateFromStringÿ   s"   € Ø×"Ñ" 6°Ô6Ø×#Ñ# G°4Õ8r   c                 óJ   • U R                  XU5        U R                  U5        g rM   )r–   Ú_testSKFromString)rI   r€   r™   rš   s       r   Ú_testPublicSKFromStringÚ KeyTests._testPublicSKFromString  s    € Ø×"Ñ" 6°Ô6Ø×Ñ˜vÕ&r   c                 ó6  • [         R                  R                  U5      nU R                  UR	                  5       5        U R                  UR                  5       U5        UR                  5       R                  5        H  u  pVU R                  X5   U5        M     g rM   )	r   r/   rz   rŒ   r�   rW   r™   rš   Úitems)rI   r€   r™   rš   Ú	publicKeyr'   Úvs          r   r–   ÚKeyTests._testPublicFromString  sp   € Ü—H‘H×'Ñ'¨Ó/ˆ	Ø�‰˜	×*Ñ*Ó,Ô-Ø×Ñ˜Ÿ™Ó)¨4Ô0Ø—N‘NÓ$×*Ñ*Ö,‰DˆAØ×Ñ˜T™W aÖ(ò -r   c                 ó8  • [         R                  R                  U5      nU R                  UR	                  5       5        U R                  UR                  5       U5        UR                  5        H(  u  pVU R                  UR                  5       U   U5        M*     g rM   )	r   r/   rz   rŽ   r�   rW   r™   r¢   rš   )rI   r˜   r™   rš   Ú
privateKeyr'   r¤   s          r   r—   ÚKeyTests._testPrivateFromString  sr   € Ü—X‘X×(Ñ(¨Ó1ˆ
Ø×Ñ˜×,Ñ,Ó.Ô/Ø×Ñ˜Ÿ™Ó*¨DÔ1Ø—J‘J–L‰DˆAØ×Ñ˜ZŸ_™_Ó.¨qÑ1°1Ö5ò !r   c                 óx   • [         R                  R                  U5      nU R                  UR                  5        g rM   )r   r/   rz   rŒ   Ú_sk)rI   r€   r£   s      r   rž   ÚKeyTests._testSKFromString  s&   € Ü—H‘H×'Ñ'¨Ó/ˆ	Ø�‰˜	Ÿ™Õ&r   c                 ó–  • U R                  [        R                  [        R                  S[        R                  5        U R                  [        R
                  [        R                  S[        R                  5        U R                  [        R                  R                  [        R                  SS9[        R                  R                  [        R                  5      5        U R                  [        R                  [        R                  S[        R                  5        U R!                  [        R"                  S[        R$                  5        [&        (       an  U R!                  [        R(                  S[        R*                  5        U R                  [        R,                  [        R.                  S[        R0                  5        gg)z>
Test that keys are correctly generated from OpenSSH strings.
ÚECÚRSAó	   encrypted©Ú
passphraseÚDSAÚEd25519N)r›   r   re   rm   r8   rc   ri   r1   rW   r   r/   rz   ÚprivateRSA_openssh_encryptedrd   rk   r5   rŸ   rf   ÚSKECDatanistp256r   rh   ÚSKEd25519Datarg   ro   r?   rP   s    r   Útest_fromOpenSSHÚKeyTests.test_fromOpenSSH  sW  € ð 	×)Ñ)Ü×'Ñ'Ü×(Ñ(ØÜ×"Ñ"ô		
ð 	×)Ñ)Ü×%Ñ%Ü×&Ñ&ØÜ�O‰Oô		
ð 	×ÑÜ�H‰H×ÑÜ×4Ñ4Àð  ð ô �H‰H×Ñ¤× :Ñ :Ó;ô		
ð 	×)Ñ)Ü×%Ñ%Ü×&Ñ&ØÜ�O‰Oô		
ð 	×$Ñ$Ü×)Ñ)ØÜ×$Ñ$ô	
÷ ÒØ×(Ñ(Ü×/Ñ/ØÜ×%Ñ%ôð ×-Ñ-Ü×-Ñ-Ü×2Ñ2ØÜ×#Ñ#õ	ð r   c                 ó|   • SnU R                  [        R                  [        R                  R                  US5        g)z
Tests for invalid key types.
s   -----BEGIN FOO PRIVATE KEY-----
MIGkAgEBBDAtAi7I8j73WCX20qUM5hhHwHuFzYWYYILs2Sh8UZ+awNkARZ/Fu2LU
LLl5RtOQpbWgBwYFK4EEACKhZANiAATU17sA9P5FRwSknKcFsjjsk0+E3CeXPYX0
Tk/M0HK3PpWQWgrO8JdRHP9eFE9O/23P8BumwFt7F/AvPlCzVd35VfraFT0o4cCW
G0RqpQ+np31aKmeJshkcYALEchnU+tQ=
-----END EC PRIVATE KEY-----N)rx   r   ry   r/   Ú_fromString_PRIVATE_OPENSSH©rI   ÚbadKeys     r   Útest_fromOpenSSHErrorsÚKeyTests.test_fromOpenSSHErrorsJ  s2   € ð ˆð 	×ÑÜ×ÑœdŸh™h×BÑBÀFÈDõ	
r   c                 ó¦   • SnU R                  [        R                  R                  U5      [        R                  R                  US-   5      5        g)z@
If key strings have trailing whitespace, it should be ignored.
ó›  -----BEGIN DSA PRIVATE KEY-----
MIIBuwIBAAKBgQDylESNuc61jq2yatCzZbenlr9llG+p9LhIpOLUbXhhHcwC6hrh
EZIdCKqTO0USLrGoP5uS9UHAUoeN62Z0KXXWTwOWGEQn/syyPzNJtnBorHpNUT9D
Qzwl1yUa53NNgEctpo4NoEFOx8PuU6iFLyvgHCjNn2MsuGuzkZm7sI9ZpQIVAJiR
9dPc08KLdpJyRxz8T74b4FQRAoGAGBc4Z5Y6R/HZi7AYM/iNOM8su6hrk8ypkBwR
a3Dbhzk97fuV3SF1SDrcQu4zF7c4CtH609N5nfZs2SUjLLGPWln83Ysb8qhh55Em
AcHXuROrHS/sDsnqu8FQp86MaudrqMExCOYyVPE7jaBWW+/JWFbKCxmgOCSdViUJ
esJpBFsCgYEA7+jtVvSt9yrwsS/YU1QGP5wRAiDYB+T5cK4HytzAqJKRdC5qS4zf
C7R0eKcDHHLMYO39aPnCwXjscisnInEhYGNblTDyPyiyNxAOXuC8x7luTmwzMbNJ
/ow0IqSj0VF72VJN9uSoPpFd4lLT0zN8v42RWja0M8ohWNf+YNJluPgCFE0PT4Vm
SUrCyZXsNh6VXwjs3gKQ
-----END DSA PRIVATE KEY-----ó   
N)rW   r   r/   rz   ©rI   ÚprivateDSADatas     r   Ú test_fromOpenSSH_with_whitespaceÚ)KeyTests.test_fromOpenSSH_with_whitespaceX  sB   € ð!ˆð 	×ÑÜ�H‰H×Ñ Ó/Ü�H‰H×Ñ °Ñ 6Ó7õ	
r   c                 ó  • [         R                  R                  [        R                  SS9nU R                  UR                  5       S5        [         R                  R                  [        R                  S-   SS9nU R                  X5        g)z†
Newer versions of OpenSSH generate encrypted keys which have a longer
IV than the older versions.  These newer keys are also loaded.
s   testxpr°   r®   rÁ   N)r   r/   rz   r   Ú privateRSA_openssh_encrypted_aesrW   r™   )rI   ÚkeyÚkey2s      r   Útest_fromNewerOpenSSHÚKeyTests.test_fromNewerOpenSSHo  sy   € ô
 �h‰h×!Ñ!Ü×4Ñ4Àð "ð 
ˆð 	×Ñ˜Ÿ™› UÔ+Ü�x‰x×"Ñ"Ü×4Ñ4°uÑ<Èð #ð 
ˆð 	×Ñ˜Õ#r   c                 ó´  • [         R                  [         R                  4[         R                  [         R                  4[         R
                  [         R                  4[         R                  [         R                  4[         R                  [         R                  44 HQ  u  pU R                  [        R                  R                  U5      [        R                  R                  U5      5        MS     U R                  [        R                  R                  [         R                  SS9[        R                  R                  [         R                   SS95        g)zÕ
OpenSSH 6.5 introduced a newer "openssh-key-v1" private key format
(made the default in OpenSSH 7.8).  Loading keys in this format
produces identical results to loading the same keys in the old
PEM-based format.
r¯   r°   N)r   ri   rj   rk   rl   rm   rn   ÚprivateECDSA_openssh384ÚprivateECDSA_openssh384_newÚprivateECDSA_openssh521ÚprivateECDSA_openssh521_newrW   r   r/   rz   Ú privateRSA_openssh_encrypted_newr´   )rI   ÚoldÚnews      r   Útest_fromOpenSSH_v1_formatÚ#KeyTests.test_fromOpenSSH_v1_format}  sü   € ô ×'Ñ'¬×)GÑ)GÐHÜ×'Ñ'¬×)GÑ)GÐHÜ×)Ñ)¬7×+KÑ+KÐLÜ×,Ñ,¬g×.QÑ.QÐRÜ×,Ñ,¬g×.QÑ.QÐRó
‰HˆCð ×ÑœTŸX™X×0Ñ0°Ó5´t·x±x×7JÑ7JÈ3Ó7OÖPñ
ð 	×ÑÜ�H‰H×ÑÜ×8Ñ8À\ð  ð ô �H‰H×ÑÜ×4Ñ4Àð  ð õ		
r   c           	      óÀ   • SnU R                  [        R                  R                  U5      [        R                  R                  UR	                  SS5      5      5        g)zX
Test that keys are correctly generated from OpenSSH strings with
Windows line endings.
rÀ   rÁ   s   
N)rW   r   r/   rz   ÚreplacerÂ   s     r   Ú%test_fromOpenSSH_windows_line_endingsÚ.KeyTests.test_fromOpenSSH_windows_line_endings•  sJ   € ð
!ˆð 	×ÑÜ�H‰H×Ñ Ó/Ü�H‰H×Ñ × 6Ñ 6°u¸gÓ FÓGõ	
r   c                 óà   • [         R                  " SSSS////5      nU R                  [        R                  [        R
                  R                  S[        R                  " U5      -   S-   S9  g)	zI
C{BadKeyError} exception is raised when public key has an unknown
type.
s
   public-keyó   bad-keyó   pó   2ó   {ó   })rš   N)	r   Úpackrx   r   ry   r/   rz   Úbase64Ú	b64encode©rI   Úsexps     r   Ú!test_fromLSHPublicUnsupportedTypeÚ*KeyTests.test_fromLSHPublicUnsupportedType«  sd   € ô
 �zŠz˜M¨J¸¸t¸Ð+EÐFÐGÓHˆà×ÑÜ×ÑÜ�H‰H×ÑØœ×(Ò(¨Ó.Ñ.°Ñ5ð 	ò 	
r   c                 ó°   • [         R                  " SSSS////5      nU R                  [        R                  [        R
                  R                  U5        g)zJ
C{BadKeyError} exception is raised when private key has an unknown
type.
s   private-keyrÛ   rÜ   rÝ   N)r   rà   rx   r   ry   r/   rz   rã   s     r   Ú"test_fromLSHPrivateUnsupportedTypeÚ+KeyTests.test_fromLSHPrivateUnsupportedType¸  sJ   € ô
 �zŠz˜N¨Z¸$À¸Ð,FÐGÐHÓIˆà×ÑÜ×ÑÜ�H‰H×ÑØõ	
r   c                 ó€   • U R                  [        R                  [        R                  S[        R                  5        g)zB
RSA public and private keys can be generated from a LSH strings.
r®   N)r›   r   rp   rH   r1   rP   s    r   Útest_fromLSHRSAÚKeyTests.test_fromLSHRSAÅ  ó.   € ð 	×)Ñ)Ü×!Ñ!Ü×"Ñ"ØÜ�O‰Oõ		
r   c                 ó€   • U R                  [        R                  [        R                  S[        R                  5        g)z8
DSA public and private key can be generated from LSHs.
r²   N)r›   r   rq   rr   r5   rP   s    r   Útest_fromLSHDSAÚKeyTests.test_fromLSHDSAÐ  rí   r   c                 ó2  • U R                  [        R                  S[        R                  5        U R                  [        R                  S[        R
                  5        U R                  [        R                  [        R                  R                  S5        g)z?
Test that keys are correctly generated from Agent v3 strings.
r®   r²   s$      ssh-foo               N)r—   r   rs   r1   rt   r5   rx   r   ry   r/   rz   rP   s    r   Útest_fromAgentv3ÚKeyTests.test_fromAgentv3Û  sc   € ð 	×#Ñ#¤G×$>Ñ$>ÀÄwÇÁÔWØ×#Ñ#¤G×$>Ñ$>ÀÄwÇÁÔWØ×ÑÜ×ÑÜ�H‰H×ÑØDõ	
r   c                 óL  • [         R                  " U R                  5      nUR                  SSR	                  5       S9nU R                  [         R                  R                  USS9U5        U R                  [         R                  [         R                  R                  USS9  g)zN
L{keys.Key.fromString} applies Normalization Form KC to Unicode
passphrases.
Úopensshõ   verschlÃ¼sseltr°   õ   verschluÌˆsseltõ   unassigned ï¿¿N)	r   r/   r3   ÚtoStringÚencoderW   rz   rx   ÚPassphraseNormalizationError©rI   rÈ   Úkey_datas      r   Ú*test_fromStringNormalizesUnicodePassphraseÚ3KeyTests.test_fromStringNormalizesUnicodePassphraseç  s‹   € ô
 �hŠh�t—{‘{Ó#ˆØ—<‘< 	Ð6J×6QÑ6QÓ6S�<ÐTˆØ×ÑÜ�H‰H×Ñ Ð5JÐÐKÈSô	
ð
 	×ÑÜ×-Ñ-Ü�H‰H×ÑØØ*ð	 	ò 	
r   c           	      ór  • U R                  [        R                  [        R                  R                  S5        U R                  [        R                  [        R                  R                  SS5        U R                  [        R                  [        R                  R                  [
        R                  SS9  U R                  [        R                  [        R                  R                  [        R                  " U R                  5      R                  SSS95        U R                  [        R                  [        R                  R                  S5        U R                  [        R                  [        R                  R                  SS	S9  U R                  [        R                  [        R                  R                  S
S	S9  U R                  [        R                  [        R                  R                  SS	S9  U R                  [        R                  [        R                  R                  SS	S9  g)zG
keys.Key.fromString should raise BadKeyError when the key is invalid.
r   Úbad_types   unencryptedr°   rõ   r¯   s   -----BEGIN RSA KEY-----
wA==
sÅ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: weird type

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----Ú	encryptedsÏ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: FOO-123-BAR,01234567

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----sÌ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,01234

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----sÍ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,01234

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----N)
rx   r   ry   r/   rz   r   rp   ÚEncryptedKeyErrorr3   rù   rP   s    r   Útest_fromStringErrorsÚKeyTests.test_fromStringErrorsú  sÈ  € ð 	×Ñœ$×*Ñ*¬D¯H©H×,?Ñ,?ÀÔEà×Ñœ$×*Ñ*¬D¯H©H×,?Ñ,?ÀÀjÔQà×ÑÜ×ÑÜ�H‰H×ÑÜ×!Ñ!Ø%ð	 	ñ 	
ð 	×ÑÜ×"Ñ"Ü�H‰H×ÑÜ�HŠH�T—[‘[Ó!×*Ñ*¨9ÀÐ*ÐNô	
ð 	×ÑÜ×ÑœdŸh™h×1Ñ1Ð3Uô	
ð 	×ÑÜ×ÑÜ�H‰H×Ñð!ð< #ðC 	ñ "	
ðH 	×ÑÜ×ÑÜ�H‰H×Ñð!ð< #ðC 	ñ "	
ðH 	×ÑÜ×ÑÜ�H‰H×Ñð!ð< #ðC 	ñ "	
ðH 	×ÑÜ×ÑÜ�H‰H×Ñð!ð< #ðC 	ò "	
r   c                 óØ  • U R                  [        R                  R                  U R                  5      [        R                  R                  [        R                  5      5        U R                  [        R                  [        R                  R                  U R                  S5        U R                  [        R                  [        R                  R                  U R                  SS9  g)z%
Test that fromFile works correctly.
r  Úunencryptedr°   N)
rW   r   r/   ÚfromFilerE   rz   r   rH   rx   ry   rP   s    r   Útest_fromFileÚKeyTests.test_fromFile£  s™   € ð 	×ÑÜ�H‰H×Ñ˜dŸl™lÓ+¬T¯X©X×-@Ñ-@Ä×AWÑAWÓ-Xô	
ð 	×Ñœ$×*Ñ*¬D¯H©H×,=Ñ,=¸t¿|¹|ÈZÔXØ×ÑÜ×ÑœdŸh™h×/Ñ/°·±È-ð 	ò 	
r   c                 ó¸   • [         R                  R                  SSS9R                  n[         R                  " U5      nU R	                  UR                  U5        g)z:
Test that the PublicKey object is initialized correctly.
é   é   ©r   r   N)r   r/   r0   r2   rW   )rI   ÚobjrÈ   s      r   Ú	test_initÚKeyTests.test_init¯  sD   € ô �h‰h×)Ñ)¨A°Ð)Ð3×>Ñ>ˆÜ�hŠh�s‹mˆØ×Ñ˜Ÿ™¨Õ-r   c                 ó  • [         R                  " U R                  5      n[         R                  " U R                  5      n[         R                  " [         R                  R                  SSS9R                  5      n[         R                  " U R
                  5      nU R                  X:H  5        U R                  X:H  5        U R                  X:H  5        U R                  U[        :H  5        U R                  US:H  5        g)z/
Test that Key objects are compared correctly.
r  r  r  N)	r   r/   r3   r0   r2   r6   rŒ   rŽ   Úobject©rI   Úrsa1Úrsa2Úrsa3Údsas        r   Ú
test_equalÚKeyTests.test_equal·  s´   € ô �xŠx˜Ÿ™Ó$ˆÜ�xŠx˜Ÿ™Ó$ˆÜ�xŠxœŸ™×3Ñ3°a¸1Ð3Ð=×HÑHÓIˆÜ�hŠh�t—{‘{Ó#ˆØ�‰˜™Ô%Ø×Ñ˜™Ô&Ø×Ñ˜™Ô%Ø×Ñ˜¤™Ô(Ø×Ñ˜ ™Õ&r   c                 ó  • [         R                  " U R                  5      n[         R                  " U R                  5      n[         R                  " [         R                  R                  SSS9R                  5      n[         R                  " U R
                  5      nU R                  X:g  5        U R                  X:g  5        U R                  X:g  5        U R                  U[        :g  5        U R                  US:g  5        g)z3
Test that Key objects are not-compared correctly.
r  r  r  N)	r   r/   r3   r0   r2   r6   rŽ   rŒ   r  r  s        r   Útest_notEqualÚKeyTests.test_notEqualÅ  s®   € ô �xŠx˜Ÿ™Ó$ˆÜ�xŠx˜Ÿ™Ó$ˆÜ�xŠxœŸ™×3Ñ3°a¸1Ð3Ð=×HÑHÓIˆÜ�hŠh�t—{‘{Ó#ˆØ×Ñ˜™Ô&Ø�‰˜™Ô%Ø�‰˜™Ô$Ø�‰˜¤™Ô'Ø�‰˜ ™Õ%r   c                 óp   • [         R                  " S5      nU R                  [        UR                  5        g)z?
The L{keys.Key.data} method raises RuntimeError for bad keys.
r   N)r   r/   rx   ÚRuntimeErrorrš   r»   s     r   Útest_dataErrorÚKeyTests.test_dataErrorÓ  s%   € ô —’˜#“ˆØ×Ñœ,¨¯©Õ4r   c                 óü   • U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R
                  5      R	                  5       S5        g)zj
Test that the fingerprint method returns fingerprint in
L{FingerprintFormats.MD5-HEX} format by default.
ú/85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:daú/63:15:b3:0e:e6:4f:50:de:91:48:3d:01:6b:b3:13:c1N)rW   r   r/   r3   Úfingerprintr6   rP   s    r   Útest_fingerprintdefaultÚ KeyTests.test_fingerprintdefaultÚ  sZ   € ð
 	×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-Ó/Ø=ô	
ð 	×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-Ó/Ø=õ	
r   c                 ó`  • U R                  [        R                  " U R                  5      R	                  [        R
                  R                  5      S5        U R                  [        R                  " U R                  5      R	                  [        R
                  R                  5      S5        g)zo
fingerprint method generates key fingerprint in
L{FingerprintFormats.MD5-HEX} format if explicitly specified.
r#  r$  N)rW   r   r/   r3   r%  ÚFingerprintFormatsÚMD5_HEXr6   rP   s    r   Útest_fingerprint_md5_hexÚ!KeyTests.test_fingerprint_md5_hexè  sv   € ð
 	×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-¬d×.EÑ.E×.MÑ.MÓNØ=ô	
ð 	×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-¬d×.EÑ.E×.MÑ.MÓNØ=õ	
r   c                 ó`  • U R                  [        R                  " U R                  5      R	                  [        R
                  R                  5      S5        U R                  [        R                  " U R                  5      R	                  [        R
                  R                  5      S5        g)zu
fingerprint method generates key fingerprint in
L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
z,FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI=z,Wz5o2YbKyxOEcJn1au/UaALSVruUzfz0vaLI1xiIGyY=N)rW   r   r/   r3   r%  r)  ÚSHA256_BASE64r6   rP   s    r   Útest_fingerprintsha256ÚKeyTests.test_fingerprintsha256ö  sv   € ð
 	×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-¬d×.EÑ.E×.SÑ.SÓTØ:ô	
ð 	×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-¬d×.EÑ.E×.SÑ.SÓTØ:õ	
r   c                 ó&  • U R                  [        R                  5       n[        R                  " U R                  5      R                  S5        SSS5        U R                  SWR                  R                  S   5        g! , (       d  f       N8= f)zS
A C{BadFingerPrintFormat} error is raised when unsupported
formats are requested.
zsha256-baseNz+Unsupported fingerprint format: sha256-baser   )	rx   r   ÚBadFingerPrintFormatr/   r3   r%  rW   Ú	exceptionÚargs)rI   Úems     r   Útest_fingerprintBadFormatÚ"KeyTests.test_fingerprintBadFormat  se   € ð
 ×Ñœt×8Ñ8Ô9¸RÜ�HŠH�T—[‘[Ó!×-Ñ-¨mÔ<÷ :à×ÑØ9¸2¿<¹<×;LÑ;LÈQÑ;Oõ	
÷ :Õ9ús    0BÂ
Bc                 ó¼  • U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R                  5       S5        U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R                  5       S5        U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R                  5       [        R                  S   5        [        (       a|  U R                  [        R                  " U R                  5      R	                  5       S5        U R                  [        R                  " U R                  5      R                  5       S5        U R                  [        [        R                  " S	5      R                  5        U R                  [        [        R                  " S	5      R
                  5        U R                  [        [        R                  " U 5      R                  5        U R                  [        [        R                  " U 5      R
                  5        g	)
zC
Test that the type method returns the correct type for an object.
r®   ó   ssh-rsar²   ó   ssh-dssr­   r%   r³   ó   ssh-ed25519N)rW   r   r/   r3   r™   ÚsshTyper6   r9   r   r8   r   r@   rx   r  rP   s    r   Ú	test_typeÚKeyTests.test_type  sÂ  € ð 	×ÑœŸš $§+¡+Ó.×3Ñ3Ó5°uÔ=Ø×ÑœŸš $§+¡+Ó.×6Ñ6Ó8¸*ÔEØ×ÑœŸš $§+¡+Ó.×3Ñ3Ó5°uÔ=Ø×ÑœŸš $§+¡+Ó.×6Ñ6Ó8¸*ÔEØ×ÑœŸš $§*¡*Ó-×2Ñ2Ó4°dÔ;Ø×ÑÜ�HŠH�T—Z‘ZÓ ×(Ñ(Ó*¬G×,BÑ,BÀ7Ñ,Kô	
÷ ÒØ×ÑœTŸXšX d§o¡oÓ6×;Ñ;Ó=¸yÔIØ×ÑœTŸXšX d§o¡oÓ6×>Ñ>Ó@À.ÔQØ×Ñœ,¬¯ª°«×(;Ñ(;Ô<Ø×Ñœ,¬¯ª°«×(>Ñ(>Ô?Ø×Ñœ,¬¯ª°«×(;Ñ(;Ô<Ø×Ñœ,¬¯ª°«×(>Ñ(>Õ?r   c                 ó  • U R                  [        R                  " U R                  5      R	                  5       / SQ5        U R                  [        R                  " U R
                  5      R	                  5       S/5        U R                  [        R                  " U R                  5      R	                  5       S/5        U R                  [        R                  R                  [        R                  5      R	                  5       S/5        [        (       a‹  U R                  [        R                  " U R                  5      R	                  5       S/5        U R                  [        R                  R                  [        R                  5      R	                  5       S/5        U R                  [        [        R                  " S5      R                  5        U R                  [        [        R                  " U 5      R                  5        g)zu
L{keys.Key.supportedSignatureAlgorithms} returns the appropriate
public key signature algorithms for each key type.
)ó   rsa-sha2-512ó   rsa-sha2-256r9  r:  s   ecdsa-sha2-nistp256s"   sk-ecdsa-sha2-nistp256@openssh.comr;  ó   sk-ssh-ed25519@openssh.comN)rW   r   r/   r3   ÚsupportedSignatureAlgorithmsr6   r9   rz   r   rf   r   r@   rh   rx   r  rP   s    r   Ú!test_supportedSignatureAlgorithmsÚ*KeyTests.test_supportedSignatureAlgorithms#  sq  € ð
 	×ÑÜ�HŠH�T—[‘[Ó!×>Ñ>Ó@Ú:ô	
ð 	×ÑÜ�HŠH�T—[‘[Ó!×>Ñ>Ó@À:À,ô	
ð 	×ÑÜ�HŠH�T—Z‘ZÓ ×=Ñ=Ó?Ø#Ð$ô	
ð 	×ÑÜ�H‰H×ÑÜ×-Ñ-óç*Ñ*Ó,Ø2Ð3ô		
÷ ÒØ×ÑÜ—’˜Ÿ™Ó)×FÑFÓHØÐ ôð ×ÑÜ—‘×#Ñ#Ü×3Ñ3óç.Ñ.Ó0Ø.Ð/ô	ð 	×Ñœ,¬¯ª°«×(SÑ(SÔTØ×Ñœ,¬¯ª°«×(SÑ(SÕTr   c                 ó¢   • [         R                  " S5      nU R                  [        R                  [        R
                  R                  U5        g)zM
A C{BadKeyError} error is raised whey the blob has an unsupported
key type.
ó   ssh-badN)r   ÚNSrx   r   ry   r/   rz   ©rI   ÚbadBlobs     r   Útest_fromBlobUnsupportedTypeÚ%KeyTests.test_fromBlobUnsupportedTypeG  s4   € ô
 —)’)˜JÓ'ˆà×Ñœ$×*Ñ*¬D¯H©H×,?Ñ,?ÀÕIr   c                 ó   • [         R                  S   [         R                  S   S.n[        R                  " S5      [        R                  " US   5      -   [        R                  " US   5      -   n[
        R                  R                  U5      nU R                  UR                  5       5        U R                  XR                  5       5        g)zA
A public RSA key is correctly generated from a public key blob.
r   r   r  r9  N)r   r1   r   rH  ÚMPr   r/   rz   rŒ   r�   rW   rš   )rI   ÚrsaPublicDataÚrsaBlobr�   s       r   Útest_fromBlobRSAÚKeyTests.test_fromBlobRSAP  sŸ   € ô
 —‘ Ñ%Ü—‘ Ñ%ñ
ˆô
 �IŠI�jÓ!Ü�iŠi˜ cÑ*Ó+ñ,ä�iŠi˜ cÑ*Ó+ñ,ð 	ô —‘×$Ñ$ WÓ-ˆà�‰˜Ÿ™Ó)Ô*Ø×Ñ˜¯©«Õ6r   c                 óP  • [         R                  S   [         R                  S   [         R                  S   [         R                  S   S.n[        R                  " S5      [        R                  " US   5      -   [        R                  " US   5      -   [        R                  " US   5      -   [        R                  " US   5      -   n[
        R                  R                  U5      nU R                  UR                  5       5        U R                  XR                  5       5        g)zA
A public DSA key is correctly generated from a public key blob.
r   r   r"   r!   )r   r   r"   r!   r:  N)r   r5   r   rH  rN  r   r/   rz   rŒ   r�   rW   rš   )rI   ÚdsaPublicDataÚdsaBlobr�   s       r   Útest_fromBlobDSAÚKeyTests.test_fromBlobDSAc  sç   € ô
 —‘ Ñ%Ü—‘ Ñ%Ü—‘ Ñ%Ü—‘ Ñ%ñ	
ˆô �IŠI�jÓ!Ü�iŠi˜ cÑ*Ó+ñ,ä�iŠi˜ cÑ*Ó+ñ,ô �iŠi˜ cÑ*Ó+ñ,ô �iŠi˜ cÑ*Ó+ñ	,ð 	ô —‘×$Ñ$ WÓ-ˆà�‰˜Ÿ™Ó)Ô*Ø×Ñ˜¯©«Õ6r   c                 ó.  • SSK Jn  [        R                  S   [        R                  S   [        R                  S   S.n[        R
                  " US   5      [        R
                  " US   SS 5      -   [        R
                  " S	UR                  US   S
5      -   UR                  US   S
5      -   5      -   n[        R                  R                  U5      nU R                  UR                  5       5        U R                  X$R                  5       5        g)z1
Key.fromString generates ECDSA keys from blobs.
r   ©Úutilsr#   r!   r%   ©r#   r!   r%   éøÿÿÿNó   é    )r	   rZ  r   r8   r   rH  Úint_to_bytesr   r/   rz   rŒ   r�   rW   rš   )rI   rZ  ÚecPublicDataÚecblobÚeckeys        r   Útest_fromBlobECDSAÚKeyTests.test_fromBlobECDSAz  sô   € õ 	'ô ×'Ñ'¨Ñ,Ü×'Ñ'¨Ñ,Ü×+Ñ+¨GÑ4ñ
ˆô �IŠI�l 7Ñ+Ó,Ü�iŠi˜ WÑ-¨b¨cÐ2Ó3ñ4ä�iŠiØØ×$Ñ$ \°#Ñ%6¸Ó;ñ<à×$Ñ$ \°#Ñ%6¸Ó;ñ<óñð 	ô —‘×#Ñ# FÓ+ˆØ�‰˜Ÿ™Ó(Ô)Ø×Ñ˜§z¡z£|Õ4r   c                 óœ  • SSK Jn  [        R                  S   [        R                  S   [        R                  S   S.n[        R
                  " [        R                  S   5      [        R
                  " [        R                  S   SS 5      -   [        R
                  " S	UR                  US   S
5      -   UR                  US   S
5      -   5      -   n[        R                  R                  U5      nU R                  UR                  5       5        U R                  UR                  5        U R                  X$R                  5       5        g)z3
It can load public SK-ECDSA key from blob format.
r   rY  r#   r!   r%   r[  r\  Nr]  r^  )r	   rZ  r   rµ   r   rH  r_  r   r/   rz   rŒ   r�   rª   rW   rš   )rI   rZ  ÚskEcPublicDataÚskEcblobÚskEckeys        r   Útest_fromBlobSKECDSAÚKeyTests.test_fromBlobSKECDSA”  s  € õ 	'ô ×)Ñ)¨#Ñ.Ü×)Ñ)¨#Ñ.Ü×-Ñ-¨gÑ6ñ
ˆô �IŠI”g×.Ñ.¨wÑ7Ó8Ü�iŠiœ×0Ñ0°Ñ9¸"¸#Ð>Ó?ñ@ä�iŠiØØ×$Ñ$ ^°CÑ%8¸"Ó=ñ>à×$Ñ$ ^°CÑ%8¸"Ó=ñ>óñð 	ô —(‘(×%Ñ% hÓ/ˆØ�‰˜×(Ñ(Ó*Ô+Ø�‰˜Ÿ™Ô$Ø×Ñ˜¯©«Õ8r   c                 óH  • S[         R                  S   0n[        R                  " S5      [        R                  " US   5      -   n[        R
                  R                  U5      nU R                  UR                  5       5        U R                  XR                  5       5        g)zE
A public Ed25519 key is correctly generated from a public key blob.
r&   r;  N)r   r?   r   rH  r   r/   rz   rŒ   r�   rW   rš   )rI   Úed25519PublicDataÚed25519Blobr’   s       r   Útest_fromBlobEd25519ÚKeyTests.test_fromBlobEd25519¯  s   € ð ”×$Ñ$ SÑ)ð
Ðô —i’i Ó/´&·)²)Ð<MÈcÑ<RÓ2SÑSˆä—X‘X×(Ñ(¨Ó5ˆ
à�‰˜
×+Ñ+Ó-Ô.Ø×ÑÐ*¯O©OÓ,=Õ>r   c                 ó~  • S[         R                  S   0n[        R                  " S5      [        R                  " US   5      -   n[        R
                  R                  U5      nU R                  UR                  5       5        U R                  UR                  5        U R                  XR                  5       5        g)zH
A public SK-Ed25519 key is correctly generated from a public key blob.
r&   rB  N)r   r¶   r   rH  r   r/   rz   rŒ   r�   rª   rW   rš   )rI   ÚskEd25519PublicDataÚskEd25519BlobÚskEd25519Keys       r   Útest_fromBlobSKEd25519ÚKeyTests.test_fromBlobSKEd25519¿  s›   € ð
 ”×&Ñ& sÑ+ð
Ðô Ÿ	š	Ð"?Ó@Ä6Ç9Â9Ø Ñ$óD
ñ 
ˆô —x‘x×*Ñ*¨=Ó9ˆà�‰˜×-Ñ-Ó/Ô0Ø�‰˜×(Ñ(Ô)Ø×ÑÐ,×.?Ñ.?Ó.AÕBr   c                 ó¢   • [         R                  " S5      nU R                  [        R                  [        R
                  R                  U5        g)zP
C{BadKeyError} is raised when loading a private blob with an
unsupported type.
rG  N)r   rH  rx   r   ry   r/   Ú_fromString_PRIVATE_BLOBrI  s     r   Ú#test_fromPrivateBlobUnsupportedTypeÚ,KeyTests.test_fromPrivateBlobUnsupportedTypeÑ  s4   € ô
 —)’)˜JÓ'ˆà×Ñœ$×*Ñ*¬D¯H©H×,MÑ,MÈwÕWr   c                 ób  • [         R                  " S5      [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   n[
        R                  R                  U5      nU R                  UR                  5       5        U R                  [        R                  UR                  5       5        U R                  U[
        R                  R                  UR                  5       5      5        g)	zC
A private RSA key is correctly generated from a private key blob.
r9  r   r   r   r    r   r   N)r   rH  rN  r   r1   r   r/   rw  rŽ   r�   rW   rš   ÚprivateBlob)rI   rP  r�   s      r   Útest_fromPrivateBlobRSAÚ KeyTests.test_fromPrivateBlobRSAÚ  s)  € ô
 �IŠI�jÓ!Ü�iŠiœŸ™¨Ñ,Ó-ñ.ä�iŠiœŸ™¨Ñ,Ó-ñ.ô �iŠiœŸ™¨Ñ,Ó-ñ.ô �iŠiœŸ™¨Ñ,Ó-ñ	.ô
 �iŠiœŸ™¨Ñ,Ó-ñ.ô �iŠiœŸ™¨Ñ,Ó-ñ.ð 	ô —‘×2Ñ2°7Ó;ˆà×Ñ˜Ÿ™Ó*Ô+Ø×ÑœŸ™¨&¯+©+«-Ô8Ø×ÑØ”D—H‘H×5Ñ5°f×6HÑ6HÓ6JÓKõ	
r   c                 ó  • [         R                  " S5      [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   5      -   n[
        R                  R                  U5      nU R                  UR                  5       5        U R                  [        R                  UR                  5       5        U R                  U[
        R                  R                  UR                  5       5      5        g)zC
A private DSA key is correctly generated from a private key blob.
r:  r   r   r"   r!   r#   N)r   rH  rN  r   r5   r   r/   rw  rŽ   r�   rW   rš   r{  )rI   rU  r�   s      r   Útest_fromPrivateBlobDSAÚ KeyTests.test_fromPrivateBlobDSAð  s  € ô
 �IŠI�jÓ!Ü�iŠiœŸ™¨Ñ,Ó-ñ.ä�iŠiœŸ™¨Ñ,Ó-ñ.ô �iŠiœŸ™¨Ñ,Ó-ñ.ô �iŠiœŸ™¨Ñ,Ó-ñ	.ô
 �iŠiœŸ™¨Ñ,Ó-ñ.ð 	ô —‘×2Ñ2°7Ó;ˆà×Ñ˜Ÿ™Ó*Ô+Ø×ÑœŸ™¨&¯+©+«-Ô8Ø×ÑØ”D—H‘H×5Ñ5°f×6HÑ6HÓ6JÓKõ	
r   c                 ó°  • SSK Jn  SSKJn  UR	                  [
        R                  S   [
        R                  S   UR                  5       S9n[        R                  " [
        R                  S   5      [        R                  " [
        R                  S   SS	 5      -   [        R                  " UR                  [        5       5      R                  UR                  R                  UR                  R                   5      5      -   [        R"                  " [
        R                  S
   5      -   n[$        R&                  R)                  U5      nU R+                  UR-                  5       5        U R/                  [
        R                  UR1                  5       5        U R/                  U[$        R&                  R)                  UR3                  5       5      5        g	)zB
A private EC key is correctly generated from a private key blob.
r   ©Úserialization)Úecr#   r!   r[  r%   r\  Nr$   )Úcryptography.hazmat.primitivesrƒ  Ú)cryptography.hazmat.primitives.asymmetricr„  ÚEllipticCurvePublicNumbersr   r8   Ú	SECP256R1r   rH  Ú
public_keyr
   Úpublic_bytesÚEncodingÚX962ÚPublicFormatÚUncompressedPointrN  r   r/   rw  rŽ   r�   rW   rš   r{  )rI   rƒ  r„  ÚpublicNumbersra  rb  s         r   Útest_fromPrivateBlobECDSAÚ"KeyTests.test_fromPrivateBlobECDSA  s_  € õ 	AÝ@à×5Ñ5Ü×$Ñ$ SÑ)Ü×$Ñ$ SÑ)Ø—,‘,“.ð 6ð 
ˆô �IŠI”g×,Ñ,¨WÑ5Ó6Ü�iŠiœ×.Ñ.¨wÑ7¸¸Ð<Ó=ñ>ä�iŠiØ×(Ñ(¬Ó):Ó;×HÑHØ!×*Ñ*×/Ñ/Ø!×.Ñ.×@Ñ@óóñô �iŠiœ×.Ñ.¨~Ñ>Ó?ñ@ð 	ô —‘×1Ñ1°&Ó9ˆà×Ñ˜Ÿ™Ó)Ô*Ø×Ñœ×/Ñ/°·±³Ô>Ø×Ñ˜¤§¡× AÑ AÀ%×BSÑBSÓBUÓ VÕWr   c                 óJ  • [         R                  " S5      [         R                  " [        R                  S   5      -   [         R                  " [        R                  S   [        R                  S   -   5      -   n[        R
                  R                  U5      nU R                  UR                  5       5        U R                  [        R                  UR                  5       5        U R                  U[        R
                  R                  UR                  5       5      5        g)zG
A private Ed25519 key is correctly generated from a private key blob.
r;  r&   r'   N)r   rH  r   r?   r   r/   rw  rŽ   r�   rW   rš   r{  )rI   rm  r’   s      r   Útest_fromPrivateBlobEd25519Ú$KeyTests.test_fromPrivateBlobEd25519#  sÓ   € ô �IŠI�nÓ%Ü�iŠiœ×+Ñ+¨CÑ0Ó1ñ2ä�iŠiœ×+Ñ+¨CÑ0´7×3FÑ3FÀsÑ3KÑKÓLñMð 	ô —X‘X×6Ñ6°{ÓCˆ
à×Ñ˜×,Ñ,Ó.Ô/Ø×Ñœ×,Ñ,¨j¯o©oÓ.?Ô@Ø×ÑØœŸ™×9Ñ9¸*×:PÑ:PÓ:RÓSõ	
r   c                 ó´  • U R                  [        R                  " U R                  5      R	                  5       [
        R                  " S5      [
        R                  " U R                  R                  5       R                  R                  5      -   [
        R                  " U R                  R                  5       R                  R                  5      -   5        g)z<
Return the over-the-wire SSH format of the RSA public key.
r9  N)rW   r   r/   r3   ra   r   rH  rN  Úprivate_numbersÚpublic_numbersr   r   rP   s    r   Útest_blobRSAÚKeyTests.test_blobRSA6  s�   € ð 	×ÑÜ�HŠH�T—[‘[Ó!×&Ñ&Ó(Ü�IŠI�jÓ!Ü�iŠi˜Ÿ™×3Ñ3Ó5×DÑD×FÑFÓGñHä�iŠi˜Ÿ™×3Ñ3Ó5×DÑD×FÑFÓGñHõ	
r   c                 ó4  • U R                   R                  5       R                  nU R                  [        R
                  " U R                   5      R                  5       [        R                  " S5      [        R                  " UR                  R                  5      -   [        R                  " UR                  R                  5      -   [        R                  " UR                  R                  5      -   [        R                  " UR                  5      -   5        g)z<
Return the over-the-wire SSH format of the DSA public key.
r:  N)r6   r–  r—  rW   r   r/   ra   r   rH  rN  Úparameter_numbersr   r   r"   r!   ©rI   r�  s     r   Útest_blobDSAÚKeyTests.test_blobDSAA  s¿   € ð Ÿ™×3Ñ3Ó5×DÑDˆà×ÑÜ�HŠH�T—[‘[Ó!×&Ñ&Ó(Ü�IŠI�jÓ!Ü�iŠi˜×7Ñ7×9Ñ9Ó:ñ;ä�iŠi˜×7Ñ7×9Ñ9Ó:ñ;ô �iŠi˜×7Ñ7×9Ñ9Ó:ñ;ô �iŠi˜Ÿ™Ó(ñ	)õ	
r   c                 ó¢  • SSK Jn  U R                  R                  R                  S-   S-  nU R                  [        R                  " U R                  5      R                  5       [        R                  " [        R                  S   5      [        R                  " [        R                  S   SS 5      -   [        R                  " SUR                  U R                  R                  5       R                  R                   U5      -   UR                  U R                  R                  5       R                  R"                  U5      -   5      -   5        g)	z;
Return the over-the-wire SSH format of the EC public key.
r   rY  é   é   r%   r\  Nr]  )r	   rZ  r9   r%   Úkey_sizerW   r   r/   ra   r   rH  r   r8   r_  r–  r—  r#   r!   )rI   rZ  Ú
byteLengths      r   Útest_blobECÚKeyTests.test_blobECP  sÿ   € õ 	'à—j‘j×&Ñ&×/Ñ/°!Ñ3¸Ñ9ˆ
Ø×ÑÜ�HŠH�T—Z‘ZÓ ×%Ñ%Ó'Ü�IŠI”g×,Ñ,¨WÑ5Ó6Ü�iŠiœ×.Ñ.¨wÑ7¸¸Ð<Ó=ñ>ä�iŠiØØ×$Ñ$Ø—J‘J×.Ñ.Ó0×?Ñ?×AÑAÀ:óñð ×$Ñ$Ø—J‘J×.Ñ.Ó0×?Ñ?×AÑAÀ:óñ	óñ
õ	
r   c                 ó†  • SSK Jn  U R                  R                  5       R	                  UR
                  R                  UR                  R                  5      nU R                  [        R                  " U R                  5      R                  5       [        R                  " S5      [        R                  " U5      -   5        g)z@
Return the over-the-wire SSH format of the Ed25519 public key.
r   r‚  r;  N)r…  rƒ  r@   r‰  rŠ  r‹  ÚRawr�  rW   r   r/   ra   r   rH  )rI   rƒ  ÚpublicBytess      r   Útest_blobEd25519ÚKeyTests.test_blobEd25519f  s…   € õ
 	Aà—o‘o×0Ñ0Ó2×?Ñ?Ø×"Ñ"×&Ñ&¨×(BÑ(B×(FÑ(Fó
ˆð 	×ÑÜ�HŠH�T—_‘_Ó%×*Ñ*Ó,Ü�IŠI�nÓ%¬¯	ª	°+Ó(>Ñ>õ	
r   c                 óp   • [         R                  " S5      nU R                  [        UR                  5        g)z`
C{RuntimeError} is raised when the blob is requested for a Key
which is not wrapping anything.
N)r   r/   rx   r  ra   r»   s     r   Útest_blobNoKeyÚKeyTests.test_blobNoKeyv  s%   € ô
 —’˜$“ˆà×Ñœ,¨¯©Õ4r   c                 ó�  • U R                   R                  5       nU R                  [        R                  " U R                   5      R                  5       [        R                  " S5      [        R                  " UR                  R                  5      -   [        R                  " UR                  R                  5      -   [        R                  " UR                  5      -   [        R                  " UR                  5      -   [        R                  " UR                  5      -   [        R                  " UR                  5      -   5        g)zV
L{keys.Key.privateBlob} returns the SSH protocol-level format of an
RSA private key.
r9  N)r3   r–  rW   r   r/   r{  r   rH  rN  r—  r   r   r   Úiqmpr   r   )rI   Únumberss     r   Útest_privateBlobRSAÚKeyTests.test_privateBlobRSA  sß   € ð
 —+‘+×-Ñ-Ó/ˆØ×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-Ó/Ü�IŠI�jÓ!Ü�iŠi˜×.Ñ.×0Ñ0Ó1ñ2ä�iŠi˜×.Ñ.×0Ñ0Ó1ñ2ô �iŠi˜Ÿ	™	Ó"ñ#ô �iŠi˜Ÿ™Ó%ñ	&ô
 �iŠi˜Ÿ	™	Ó"ñ#ô �iŠi˜Ÿ	™	Ó"ñ#õ		
r   c                 ó¦  • U R                   R                  5       R                  nU R                  [        R
                  " U R                   5      R                  5       [        R                  " S5      [        R                  " UR                  R                  5      -   [        R                  " UR                  R                  5      -   [        R                  " UR                  R                  5      -   [        R                  " UR                  5      -   [        R                  " U R                   R                  5       R                  5      -   5        g)zU
L{keys.Key.privateBlob} returns the SSH protocol-level format of a DSA
private key.
r:  N)r6   r–  r—  rW   r   r/   r{  r   rH  rN  r›  r   r   r"   r!   r#   rœ  s     r   Útest_privateBlobDSAÚKeyTests.test_privateBlobDSA�  så   € ð
 Ÿ™×3Ñ3Ó5×DÑDˆà×ÑÜ�HŠH�T—[‘[Ó!×-Ñ-Ó/Ü�IŠI�jÓ!Ü�iŠi˜×7Ñ7×9Ñ9Ó:ñ;ä�iŠi˜×7Ñ7×9Ñ9Ó:ñ;ô �iŠi˜×7Ñ7×9Ñ9Ó:ñ;ô �iŠi˜Ÿ™Ó(ñ	)ô
 �iŠi˜Ÿ™×3Ñ3Ó5×7Ñ7Ó8ñ9õ	
r   c           
      ól  • SSK Jn  U R                  [        R                  " U R
                  5      R                  5       [        R                  " [        R                  S   5      [        R                  " [        R                  S   SS 5      -   [        R                  " U R
                  R                  5       R                  UR                  R                  UR                  R                   5      5      -   [        R"                  " U R
                  R%                  5       R&                  5      -   5        g)zR
L{keys.Key.privateBlob} returns the SSH ptotocol-level format of EC
private key.
r   r‚  r%   r\  N)r…  rƒ  rW   r   r/   r9   r{  r   rH  r   r8   r‰  rŠ  r‹  rŒ  r�  rŽ  rN  r–  Úprivate_value)rI   rƒ  s     r   Útest_privateBlobECÚKeyTests.test_privateBlobEC¡  sÚ   € õ
 	Aà×ÑÜ�HŠH�T—Z‘ZÓ ×,Ñ,Ó.Ü�IŠI”g×,Ñ,¨WÑ5Ó6Ü�iŠiœ×.Ñ.¨wÑ7¸¸Ð<Ó=ñ>ä�iŠiØ—
‘
×%Ñ%Ó'×4Ñ4Ø!×*Ñ*×/Ñ/Ø!×.Ñ.×@Ñ@óóñô �iŠi˜Ÿ
™
×2Ñ2Ó4×BÑBÓCñDõ	
r   c                 ó^  • SSK Jn  U R                  R                  5       R	                  UR
                  R                  UR                  R                  5      nU R                  R                  UR
                  R                  UR                  R                  UR                  5       5      nU R                  [        R                  " U R                  5      R                  5       [        R                   " S5      [        R                   " U5      -   [        R                   " X2-   5      -   5        g)zZ
L{keys.Key.privateBlob} returns the SSH protocol-level format of an
Ed25519 private key.
r   r‚  r;  N)r…  rƒ  r@   r‰  rŠ  r‹  r§  r�  Úprivate_bytesÚPrivateFormatÚNoEncryptionrW   r   r/   r{  r   rH  )rI   rƒ  r¨  ÚprivateBytess       r   Útest_privateBlobEd25519Ú KeyTests.test_privateBlobEd25519µ  sÜ   € õ 	Aà—o‘o×0Ñ0Ó2×?Ñ?Ø×"Ñ"×&Ñ&¨×(BÑ(B×(FÑ(Fó
ˆð —‘×4Ñ4Ø×"Ñ"×&Ñ&Ø×'Ñ'×+Ñ+Ø×&Ñ&Ó(ó
ˆð 	×ÑÜ�HŠH�T—_‘_Ó%×1Ñ1Ó3Ü�IŠI�nÓ%Ü�iŠi˜Ó$ñ%ä�iŠi˜Ñ2Ó3ñ4õ	
r   c                 óp   • [         R                  " S5      nU R                  [        UR                  5        g)zF
Raises L{RuntimeError} if the underlying key object does not exists.
N)r   r/   rx   r  r{  r»   s     r   Útest_privateBlobNoKeyObjectÚ$KeyTests.test_privateBlobNoKeyObjectÍ  s'   € ô —’˜$“ˆà×Ñœ,¨×(:Ñ(:Õ;r   c                 ó2  • [         R                  R                  [        R                  5      nU R                  UR                  S5      R                  5       [        R                  5        U R                  UR                  SSS9R                  S5      S:„  5        U R                  UR                  5       R                  S5      [        R                  SS 5        U R                  UR                  5       R                  SSS	9[        R                  5        g)
z?
L{keys.Key.toString} serializes an RSA key in OpenSSH format.
rõ   r¯   r°   s   DEK-Infor   Nr\  ó   comment©Úcomment)r   r/   rz   r   rs   rW   rù   Ústripri   rŒ   Úfindr€   rc   ©rI   rÈ   s     r   Útest_toOpenSSHRSAÚKeyTests.test_toOpenSSHRSAÕ  sØ   € ô �h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ×Ñ˜Ÿ™ iÓ0×6Ñ6Ó8¼'×:TÑ:TÔUØ�‰Ø�L‰L˜¨|ˆLÐ<×AÑAÀ+ÓNÐQRÑRô	
ð 	×ÑØ�J‰J‹L×!Ñ! )Ó,¬g×.GÑ.GÈÈÐ.Lô	
ð 	×ÑØ�J‰J‹L×!Ñ! )°ZÐ!Ð@Ü×%Ñ%õ	
r   c                 óæ  • [         R                  R                  [        R                  5      nUR                  SSS9nUR                  SSSS9nU R                  SUR                  5       S   5        U R                  SUR                  5       S   5        U R                  U[         R                  R                  U5      5        U R                  U[         R                  R                  USS95        g	)
zD
L{keys.Key.toString} serializes an RSA key in OpenSSH's v1 format.
rõ   Úv1©Úsubtyper  ©rÐ  r±   ó#   -----BEGIN OPENSSH PRIVATE KEY-----r   r°   N)r   r/   rz   r   ri   rù   rW   Ú
splitlines©rI   rÈ   Únew_key_dataÚnew_enc_key_datas       r   Útest_toOpenSSHRSA_v1_formatÚ$KeyTests.test_toOpenSSHRSA_v1_formatæ  óÔ   € ô �h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ—|‘| I°t�|Ð<ˆØŸ<™<¨	¸4ÈK˜<ÐXÐØ×ÑØ2°L×4KÑ4KÓ4MÈaÑ4Pô	
ð 	×ÑØ2Ð4D×4OÑ4OÓ4QÐRSÑ4Tô	
ð 	×Ñ˜œdŸh™h×1Ñ1°,Ó?Ô@Ø×ÑØ”—‘×$Ñ$Ð%5À+Ð$ÐNõ	
r   c                 óÐ  • [         R                  R                  [        R                  5      nU R                  UR                  S5      R                  5       [        R                  5        U R                  UR                  5       R                  SSS9[        R                  5        U R                  UR                  5       R                  S5      [        R                  SS 5        g)z>
L{keys.Key.toString} serializes a DSA key in OpenSSH format.
rõ   rÅ  rÆ  Nr\  )r   r/   rz   r   rr   rW   rù   rÈ  rk   r€   rd   rÊ  s     r   Útest_toOpenSSHDSAÚKeyTests.test_toOpenSSHDSAø  s©   € ô �h‰h×!Ñ!¤'×"8Ñ"8Ó9ˆØ×Ñ˜Ÿ™ iÓ0×6Ñ6Ó8¼'×:TÑ:TÔUØ×ÑØ�J‰J‹L×!Ñ! )°ZÐ!Ð@Ü×%Ñ%ô	
ð 	×ÑØ�J‰J‹L×!Ñ! )Ó,¬g×.GÑ.GÈÈÐ.Lõ	
r   c                 óæ  • [         R                  R                  [        R                  5      nUR                  SSS9nUR                  SSSS9nU R                  SUR                  5       S   5        U R                  SUR                  5       S   5        U R                  U[         R                  R                  U5      5        U R                  U[         R                  R                  USS95        g	)
zC
L{keys.Key.toString} serializes a DSA key in OpenSSH's v1 format.
rõ   rÎ  rÏ  r  rÑ  rÒ  r   r°   N)r   r/   rz   r   rk   rù   rW   rÓ  rÔ  s       r   Útest_toOpenSSHDSA_v1_formatÚ$KeyTests.test_toOpenSSHDSA_v1_format  rÙ  r   c                 óV  • [         R                  R                  [        R                  5      nU R                  UR                  5       R                  SSS9[        R                  5        U R                  UR                  5       R                  S5      [        R                  SS 5        g)zA
L{keys.Key.toString} serializes an ECDSA key in OpenSSH format.
rõ   rÅ  rÆ  Nr\  )	r   r/   rz   r   rm   rW   r€   rù   re   rÊ  s     r   Útest_toOpenSSHECDSAÚKeyTests.test_toOpenSSHECDSA  s�   € ô �h‰h×!Ñ!¤'×">Ñ">Ó?ˆØ×ÑØ�J‰J‹L×!Ñ! )°ZÐ!Ð@Ü×'Ñ'ô	
ð 	×ÑØ�J‰J‹L×!Ñ! )Ó,¬g×.IÑ.IÈ#È2Ð.Nõ	
r   c                 óæ  • [         R                  R                  [        R                  5      nUR                  SSS9nUR                  SSSS9nU R                  SUR                  5       S   5        U R                  SUR                  5       S   5        U R                  U[         R                  R                  U5      5        U R                  U[         R                  R                  USS95        g	)
zF
L{keys.Key.toString} serializes an ECDSA key in OpenSSH's v1 format.
rõ   rÎ  rÏ  r  rÑ  rÒ  r   r°   N)r   r/   rz   r   rm   rù   rW   rÓ  rÔ  s       r   Útest_toOpenSSHECDSA_v1_formatÚ&KeyTests.test_toOpenSSHECDSA_v1_format%  sÔ   € ô �h‰h×!Ñ!¤'×">Ñ">Ó?ˆØ—|‘| I°t�|Ð<ˆØŸ<™<¨	¸4ÈK˜<ÐXÐØ×ÑØ2°L×4KÑ4KÓ4MÈaÑ4Pô	
ð 	×ÑØ2Ð4D×4OÑ4OÓ4QÐRSÑ4Tô	
ð 	×Ñ˜œdŸh™h×1Ñ1°,Ó?Ô@Ø×ÑØ”—‘×$Ñ$Ð%5À+Ð$ÐNõ	
r   c                 ó$  • [         R                  R                  [        R                  5      nUR                  S5      nUR                  SSS9nU R                  SUR                  5       S   5        U R                  SUR                  5       S   5        U R                  U[         R                  R                  U5      5        U R                  U[         R                  R                  USS95        U R                  X!R                  SSS95        g)	zH
L{keys.Key.toString} serializes an Ed25519 key in OpenSSH's v1 format.
rõ   r  r°   rÒ  r   rÎ  rÏ  N)r   r/   rz   r   ro   rù   rW   rÓ  rÔ  s       r   Útest_toOpenSSHEd25519ÚKeyTests.test_toOpenSSHEd255197  së   € ô
 �h‰h×!Ñ!¤'×"DÑ"DÓEˆØ—|‘| IÓ.ˆØŸ<™<¨	¸k˜<ÐJÐØ×ÑØ2°L×4KÑ4KÓ4MÈaÑ4Pô	
ð 	×ÑØ2Ð4D×4OÑ4OÓ4QÐRSÑ4Tô	
ð 	×Ñ˜œdŸh™h×1Ñ1°,Ó?Ô@Ø×ÑØ”—‘×$Ñ$Ð%5À+Ð$ÐNô	
ð 	×Ñ˜§|¡|°IÀt |Ð'LÕMr   c                 óž   • [         R                  R                  [        R                  5      nU R                  [        UR                  SSS9  g)z�
L{keys.Key.toString} refuses to serialize an Ed25519 key in
OpenSSH's old PEM format, as no encoding of Ed25519 is defined for
that format.
rõ   ÚPEMrÏ  N)r   r/   rz   r   ro   rx   Ú
ValueErrorrù   rÊ  s     r   Ú test_toOpenSSHEd25519_PEM_formatÚ)KeyTests.test_toOpenSSHEd25519_PEM_formatK  s9   € ô �h‰h×!Ñ!¤'×"DÑ"DÓEˆØ×Ñœ* c§l¡l°IÀuÐÒMr   c                 ó6  • [         R                  R                  [        R                  5      nU R                  UR                  S5      [        R                  5        U R                  UR                  5       R                  S5      [        R                  5        g)z;
L{keys.Key.toString} serializes an RSA key in LSH format.
ÚlshN)
r   r/   rz   r   ri   rW   rù   rH   r€   rp   rÊ  s     r   Útest_toLSHRSAÚKeyTests.test_toLSHRSAU  ód   € ô �h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ×Ñ˜Ÿ™ eÓ,¬g×.DÑ.DÔEØ×Ñ˜Ÿ™›×.Ñ.¨uÓ5´w×7LÑ7LÕMr   c                 ó6  • [         R                  R                  [        R                  5      nU R                  UR                  S5      [        R                  5        U R                  UR                  5       R                  S5      [        R                  5        g)z:
L{keys.Key.toString} serializes a DSA key in LSH format.
rï  N)
r   r/   rz   r   rk   rW   rù   rr   r€   rq   rÊ  s     r   Útest_toLSHDSAÚKeyTests.test_toLSHDSA]  rò  r   c                 ó¼   • [         R                  R                  [        R                  5      nU R                  UR                  S5      [        R                  5        g)z@
L{keys.Key.toString} serializes an RSA key in Agent v3 format.
r`   N)r   r/   rz   r   ri   rW   rù   rs   rÊ  s     r   Útest_toAgentv3RSAÚKeyTests.test_toAgentv3RSAe  ó=   € ô �h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ×Ñ˜Ÿ™ iÓ0´'×2LÑ2LÕMr   c                 ó¼   • [         R                  R                  [        R                  5      nU R                  UR                  S5      [        R                  5        g)z?
L{keys.Key.toString} serializes a DSA key in Agent v3 format.
r`   N)r   r/   rz   r   rk   rW   rù   rt   rÊ  s     r   Útest_toAgentv3DSAÚKeyTests.test_toAgentv3DSAl  rù  r   c                 ó0  • [         R                  " U R                  5      nUR                  SSS9nU R	                  [         R                  R                  USR                  5       S9U5        U R                  [         R                  UR                  SSS9  g)zL
L{keys.Key.toString} applies Normalization Form KC to Unicode
passphrases.
rõ   r÷   r°   rö   rø   N)	r   r/   r3   rù   rW   rz   rú   rx   rû   rü   s      r   Ú(test_toStringNormalizesUnicodePassphraseÚ1KeyTests.test_toStringNormalizesUnicodePassphrases  s†   € ô
 �hŠh�t—{‘{Ó#ˆØ—<‘< 	Ð6K�<ÐLˆØ×ÑÜ�H‰H×Ñ Ð5I×5PÑ5PÓ5RÐÐSØô	
ð 	×ÑÜ×-Ñ-Ø�L‰LØØ*ð	 	ò 	
r   c                 ó–   • U R                  [        R                  [        R                  " U R                  5      R
                  S5        g)zU
L{keys.Key.toString} raises L{keys.BadKeyError} when passed an invalid
format type.
r  N)rx   r   ry   r/   r3   rù   rP   s    r   Útest_toStringErrorsÚKeyTests.test_toStringErrors‡  s/   € ð
 	×Ñœ$×*Ñ*¬D¯HªH°T·[±[Ó,A×,JÑ,JÈJÕWr   c           	      ód  • Sn[         R                  R                  [        R                  5      nUR                  U5      nU R                  UR                  5       R                  X15      5        U R                  UR                  X15      5        [        R                  " U5      u  pCU R                  US5        U R                  UR                  R                  5       R                  [        R                  " U5      S   U[        R                   " 5       ["        R$                  " 5       5      5        g)zB
Signed data can be verified using RSA (with SHA-1, the default).
ó	   some-datar9  r   N)r   r/   rz   r   ri   ÚsignrŒ   r€   Úverifyr   ÚgetNSrW   ÚassertIsNoner2   r‰  r   ÚPKCS1v15r   ÚSHA1©rI   rš   rÈ   Ú	signatureÚsignatureTypes        r   Útest_signAndVerifyRSAÚKeyTests.test_signAndVerifyRSAŽ  sÒ   € ð ˆÜ�h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ—H‘H˜T“Nˆ	Ø�‰˜Ÿ
™
›×+Ñ+¨IÓ<Ô=Ø�‰˜Ÿ
™
 9Ó3Ô4ä#)§<¢<°	Ó#:Ñ ˆØ×Ñ˜¨
Ô3Ø×ÑØ�N‰N×%Ñ%Ó'×.Ñ.Ü—’˜YÓ'¨Ñ*¨D´'×2BÒ2BÓ2DÄfÇkÂkÃmóõ	
r   c           	      ób  • Sn[         R                  R                  [        R                  5      nUR                  USS9nU R                  UR                  5       R                  X15      5        U R                  UR                  X15      5        [        R                  " U5      u  pCU R                  US5        U R                  UR                  R                  5       R                  [        R                  " U5      S   U[        R                   " 5       ["        R$                  " 5       5      5        g)z5
Signed data can be verified using RSA with SHA-256.
r  rA  ©r  r   N)r   r/   rz   r   ri   r  rŒ   r€   r  r   r  rW   r  r2   r‰  r   r	  r   ÚSHA256r  s        r   Útest_signAndVerifyRSASHA256Ú$KeyTests.test_signAndVerifyRSASHA256   ó×   € ð ˆÜ�h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ—H‘H˜T°�HÐAˆ	Ø�‰˜Ÿ
™
›×+Ñ+¨IÓ<Ô=Ø�‰˜Ÿ
™
 9Ó3Ô4ä#)§<¢<°	Ó#:Ñ ˆØ×Ñ˜¨Ô8Ø×ÑØ�N‰N×%Ñ%Ó'×.Ñ.Ü—’˜YÓ'¨Ñ*¨D´'×2BÒ2BÓ2DÄfÇmÂmÃoóõ	
r   c           	      ób  • Sn[         R                  R                  [        R                  5      nUR                  USS9nU R                  UR                  5       R                  X15      5        U R                  UR                  X15      5        [        R                  " U5      u  pCU R                  US5        U R                  UR                  R                  5       R                  [        R                  " U5      S   U[        R                   " 5       ["        R$                  " 5       5      5        g)z5
Signed data can be verified using RSA with SHA-512.
r  r@  r  r   N)r   r/   rz   r   ri   r  rŒ   r€   r  r   r  rW   r  r2   r‰  r   r	  r   ÚSHA512r  s        r   Útest_signAndVerifyRSASHA512Ú$KeyTests.test_signAndVerifyRSASHA512²  r  r   c                 ó   • Sn[         R                  R                  [        R                  5      nUR                  U5      nU R                  UR                  5       R                  X15      5        U R                  UR                  X15      5        g)z(
Signed data can be verified using DSA.
r  N)	r   r/   rz   r   rk   r  rŒ   r€   r  ©rI   rš   rÈ   r  s       r   Útest_signAndVerifyDSAÚKeyTests.test_signAndVerifyDSAÄ  sb   € ð ˆÜ�h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ—H‘H˜T“Nˆ	Ø�‰˜Ÿ
™
›×+Ñ+¨IÓ<Ô=Ø�‰˜Ÿ
™
 9Ó3Õ4r   c                 óP  • Sn[         R                  R                  [        R                  5      nUR                  U5      n[         R                  R                  [        R                  5      nUR                  U5      n[         R                  R                  [        R                  5      nUR                  U5      nU R                  UR                  5       R                  X15      5        U R                  UR                  X15      5        U R                  UR                  5       R                  XQ5      5        U R                  UR                  XQ5      5        U R                  UR                  5       R                  Xq5      5        U R                  UR                  Xq5      5        g)z'
Signed data can be verified using EC.
r  N)r   r/   rz   r   rm   r  rÍ   rÏ   rŒ   r€   r  )rI   rš   rÈ   r  Úkey384Úsignature384Úkey521Úsignature521s           r   Útest_signAndVerifyECÚKeyTests.test_signAndVerifyECÎ  s  € ð ˆÜ�h‰h×!Ñ!¤'×">Ñ">Ó?ˆØ—H‘H˜T“Nˆ	ä—‘×$Ñ$¤W×%DÑ%DÓEˆØ—{‘{ 4Ó(ˆä—‘×$Ñ$¤W×%DÑ%DÓEˆØ—{‘{ 4Ó(ˆà�‰˜Ÿ
™
›×+Ñ+¨IÓ<Ô=Ø�‰˜Ÿ
™
 9Ó3Ô4Ø�‰˜Ÿ™›×.Ñ.¨|ÓBÔCØ�‰˜Ÿ™ lÓ9Ô:Ø�‰˜Ÿ™›×.Ñ.¨|ÓBÔCØ�‰˜Ÿ™ lÓ9Õ:r   c                 ó   • Sn[         R                  R                  [        R                  5      nUR                  U5      nU R                  UR                  5       R                  X15      5        U R                  UR                  X15      5        g)z,
Signed data can be verified using Ed25519.
r  N)	r   r/   rz   r   ro   r  rŒ   r€   r  r  s       r   Útest_signAndVerifyEd25519Ú"KeyTests.test_signAndVerifyEd25519ã  sb   € ð
 ˆÜ�h‰h×!Ñ!¤'×"DÑ"DÓEˆØ—H‘H˜T“Nˆ	Ø�‰˜Ÿ
™
›×+Ñ+¨IÓ<Ô=Ø�‰˜Ÿ
™
 9Ó3Õ4r   c                 ó`  • [         R                  R                  [        R                  5      nU R                  [         R                  UR                  SSS9  [         R                  R                  [        R                  5      nU R                  [         R                  UR                  SSS9  g)z—
L{keys.Key.sign} raises L{keys.BadSignatureAlgorithmError} when
asked to sign with a public key algorithm that doesn't make sense
with the given key.
s	   some datar:  r  N)	r   r/   rz   r   ri   rx   ÚBadSignatureAlgorithmErrorr  rm   rÊ  s     r   Útest_signWithWrongAlgorithmÚ$KeyTests.test_signWithWrongAlgorithmî  sŒ   € ô �h‰h×!Ñ!¤'×"<Ñ"<Ó=ˆØ×ÑÜ×+Ñ+Ø�H‰HØØ$ð	 	ñ 	
ô �h‰h×!Ñ!¤'×">Ñ">Ó?ˆØ×ÑÜ×+Ñ+Ø�H‰HØØ$ð	 	ò 	
r   c                 ó`  • [         R                  R                  [        R                  5      nU R                  UR                  U R                  S5      5        U R                  UR                  U R                  S5      5        U R                  UR                  U R                  S5      5        g)z3
A known-good RSA signature verifies successfully.
r   ó   aN)
r   r/   rz   r   rc   rŒ   r  rA   rŽ   rB   rÊ  s     r   Útest_verifyRSAÚKeyTests.test_verifyRSA  óy   € ô �h‰h×!Ñ!¤'×";Ñ";Ó<ˆØ�‰˜Ÿ
™
 4×#4Ñ#4°cÓ:Ô;Ø×Ñ˜Ÿ™ D×$5Ñ$5°tÓ<Ô=Ø×Ñ˜Ÿ™ D×$5Ñ$5°sÓ;Õ<r   c                 ó`  • [         R                  R                  [        R                  5      nU R                  UR                  U R                  S5      5        U R                  UR                  U R                  S5      5        U R                  UR                  U R                  S5      5        g)z3
A known-good DSA signature verifies successfully.
r   r-  N)
r   r/   rz   r   rd   rŒ   r  rB   rŽ   rA   rÊ  s     r   Útest_verifyDSAÚKeyTests.test_verifyDSA  r0  r   c                 óº   • [         R                  R                  [        R                  5      nU R                  UR                  U R                  SS S5      5        g)zh
Some commercial SSH servers send DSA keys as 2 20-byte numbers;
they are still verified as valid keys.
iØÿÿÿNr   )r   r/   rz   r   rd   rŒ   r  rB   rÊ  s     r   Útest_verifyDSANoPrefixÚKeyTests.test_verifyDSANoPrefix  sB   € ô
 �h‰h×!Ñ!¤'×";Ñ";Ó<ˆØ�‰˜Ÿ
™
 4×#4Ñ#4°S°TÐ#:¸CÓ@ÕAr   c                 óv   • U R                  [        [        R                  " U R                  5      5      S5        g)zV
The repr of a L{keys.Key} contains all of the RSA components for an RSA
private key.
a\  <RSA Private Key (2048 bits)
attr d:
	21:4c:08:66:a2:28:d5:b4:fb:8e:0f:72:1b:85:09:
	00:b9:f2:4e:37:f0:1c:57:4b:e3:51:7f:9e:23:a7:
	e4:3a:98:55:1b:ea:8b:7a:98:1e:bc:d8:ba:b1:f9:
	89:12:18:60:ac:e8:cc:0b:4e:09:5a:40:6a:ba:2f:
	99:f8:b3:24:60:84:b9:ce:69:95:9a:f9:e2:fc:1f:
	51:4d:27:15:db:2b:27:ad:ef:b4:69:ac:be:7d:10:
	eb:86:47:70:73:b4:00:87:95:15:3b:37:f9:e7:14:
	e7:80:bb:68:1e:1b:e6:dd:bb:73:63:b9:67:e6:b2:
	27:7f:cf:cf:30:9b:c2:98:fd:d9:18:36:2f:36:2e:
	f1:3d:81:7a:9f:e1:03:2d:47:db:34:51:62:39:dd:
	4f:e9:ac:a8:8b:d9:d6:f3:84:c4:17:b9:71:9d:06:
	08:42:78:4d:bb:c5:2a:f4:c3:58:cd:55:2b:ed:be:
	33:5f:04:ea:7b:e6:04:24:63:f2:2d:d7:3d:1b:6c:
	d5:9c:63:43:2f:92:88:8d:3e:6e:da:18:37:d8:0f:
	25:67:89:1d:b9:46:34:5e:c9:ce:c4:8b:ed:92:5a:
	33:07:0f:df:86:08:f9:92:e9:db:eb:38:08:36:c9:
	cd:cd:0a:01:48:5b:39:3e:7a:ca:c6:80:a9:dc:d4:
	39
attr e:
	01:00:01
attr n:
	00:d5:6a:ac:78:23:d6:d6:1b:ec:25:a1:50:c4:77:
	63:50:84:45:01:55:42:14:2a:2a:e0:d0:60:ee:d4:
	e9:a3:ad:4a:fa:39:06:5e:84:55:75:5f:00:36:bf:
	6f:aa:2a:3f:83:26:37:c1:69:2e:5b:fd:f0:f3:d2:
	7d:d6:98:cd:3a:40:78:d5:ca:a8:18:c0:11:93:24:
	09:0c:81:4c:8f:f7:9c:ed:13:16:6a:a4:04:e9:49:
	77:c3:e4:55:64:b3:79:68:9e:2c:08:eb:ac:e8:04:
	2d:21:77:05:a7:8e:ef:53:30:0d:a5:e5:bb:3d:6a:
	e2:09:36:6f:fd:34:d3:7d:6f:46:ff:87:da:a9:29:
	27:aa:ff:ad:f5:85:e6:3e:1a:b8:7a:1d:4a:b1:ea:
	c0:5a:f7:30:df:1f:c2:a4:e4:ef:3f:91:49:96:40:
	d5:19:77:2d:37:c3:5e:ec:9d:a6:3a:44:a5:c2:a4:
	29:dd:d5:ba:9c:3d:45:b3:c6:2c:18:64:d5:ba:3d:
	df:ab:7f:cd:42:ac:a7:f1:18:0b:a0:58:15:62:0b:
	a4:2a:6e:43:c3:e4:04:9f:35:a3:47:8e:46:ed:33:
	a5:65:bd:bc:3b:29:6e:02:0b:57:df:74:e8:13:b4:
	37:35:7e:83:5f:20:26:60:a6:dc:ad:8b:c6:6c:79:
	98:f7
attr p:
	00:d9:70:06:d8:e2:bc:d4:78:91:50:94:d4:c1:1b:
	89:38:6c:46:64:5a:51:a0:9a:07:3d:48:8f:03:51:
	cc:6b:12:8e:7d:1a:b1:65:e7:71:75:39:e0:32:05:
	75:8d:18:4c:af:93:b1:49:b1:66:5f:78:62:7a:d1:
	0c:ca:e6:4d:43:b3:9c:f4:6b:7d:e6:0c:98:dc:cf:
	21:62:8e:d5:2e:12:de:04:ae:d7:24:6e:83:31:a2:
	15:a2:44:3d:22:a9:62:26:22:b9:b2:ed:54:0a:9d:
	08:83:a7:07:0d:ff:19:18:8e:d8:ab:1d:da:48:9c:
	31:68:11:a1:66:6d:e3:d8:1d
attr q:
	00:fb:44:17:8b:a4:36:be:1e:37:1d:a7:f6:61:6c:
	04:c4:aa:dd:78:3e:07:8c:1e:33:02:ae:03:14:87:
	83:7a:e5:9e:7d:08:67:a8:f2:aa:bf:12:70:cf:72:
	a9:a7:c7:0b:1d:88:d5:20:fd:9c:63:ca:47:30:55:
	4e:8b:c4:cf:f4:7f:16:a4:92:12:74:a1:09:c2:c4:
	6e:9c:8c:33:ef:a5:e5:f7:e0:2b:ad:4f:5c:11:aa:
	1a:84:37:5b:fd:7a:ea:c3:cd:7c:b0:c8:e4:1f:54:
	63:b5:c7:af:df:f4:09:a7:fc:c7:25:fc:5c:e9:91:
	d7:92:c5:98:1e:56:d3:b1:23
attr u:
	00:85:4b:1b:7a:9b:12:10:37:9e:1f:ad:5e:da:fe:
	c6:96:fe:df:35:6b:b9:34:e2:16:97:92:26:09:bd:
	bd:70:20:03:a7:35:bd:2d:1b:a0:d2:07:47:2b:d4:
	de:a8:a8:07:07:1b:b8:04:20:a7:27:41:3c:6c:39:
	39:e9:41:ce:e7:17:1d:d1:4c:5c:bc:3d:d2:26:26:
	fe:6a:d6:fd:48:72:ae:46:fa:7b:c3:d3:19:60:44:
	1d:a5:13:a7:80:f5:63:29:d4:7a:5d:06:07:16:5d:
	f6:8b:3d:cb:64:3a:e2:84:5a:4d:8c:06:2d:2d:9d:
	1c:eb:83:4c:78:3d:79:54:ce>N)rW   Úreprr   r/   r3   rP   s    r   Útest_reprPrivateRSAÚKeyTests.test_reprPrivateRSA  s.   € ð
 	×ÑÜ”—’˜$Ÿ+™+Ó&Ó'ðF!õI	
r   c                 ó’   • U R                  [        [        R                  " U R                  5      R                  5       5      S5        g)zU
The repr of a L{keys.Key} contains all of the RSA components for an RSA
public key.
a\  <RSA Public Key (2048 bits)
attr e:
	01:00:01
attr n:
	00:d5:6a:ac:78:23:d6:d6:1b:ec:25:a1:50:c4:77:
	63:50:84:45:01:55:42:14:2a:2a:e0:d0:60:ee:d4:
	e9:a3:ad:4a:fa:39:06:5e:84:55:75:5f:00:36:bf:
	6f:aa:2a:3f:83:26:37:c1:69:2e:5b:fd:f0:f3:d2:
	7d:d6:98:cd:3a:40:78:d5:ca:a8:18:c0:11:93:24:
	09:0c:81:4c:8f:f7:9c:ed:13:16:6a:a4:04:e9:49:
	77:c3:e4:55:64:b3:79:68:9e:2c:08:eb:ac:e8:04:
	2d:21:77:05:a7:8e:ef:53:30:0d:a5:e5:bb:3d:6a:
	e2:09:36:6f:fd:34:d3:7d:6f:46:ff:87:da:a9:29:
	27:aa:ff:ad:f5:85:e6:3e:1a:b8:7a:1d:4a:b1:ea:
	c0:5a:f7:30:df:1f:c2:a4:e4:ef:3f:91:49:96:40:
	d5:19:77:2d:37:c3:5e:ec:9d:a6:3a:44:a5:c2:a4:
	29:dd:d5:ba:9c:3d:45:b3:c6:2c:18:64:d5:ba:3d:
	df:ab:7f:cd:42:ac:a7:f1:18:0b:a0:58:15:62:0b:
	a4:2a:6e:43:c3:e4:04:9f:35:a3:47:8e:46:ed:33:
	a5:65:bd:bc:3b:29:6e:02:0b:57:df:74:e8:13:b4:
	37:35:7e:83:5f:20:26:60:a6:dc:ad:8b:c6:6c:79:
	98:f7>N)rW   r8  r   r/   r3   r€   rP   s    r   Útest_reprPublicRSAÚKeyTests.test_reprPublicRSAm  s5   € ð
 	×ÑÜ”—’˜$Ÿ+™+Ó&×-Ñ-Ó/Ó0ðõ	
r   c                 óà   • U R                  [        [        R                  " U R                  5      R                  5       5      [        S5      R                  " S0 [        R                  D65        g)zT
The repr of a L{keys.Key} contains all the OpenSSH format for an ECDSA
public key.
zÓ                <Elliptic Curve Public Key (256 bits)
                curve:
                	ecdsa-sha2-nistp256
                x:
                	{x}
                y:
                	{y}>
                Nr+   )
rW   r8  r   r/   r9   r€   r   Úformatr   r8   rP   s    r   Útest_reprPublicECDSAÚKeyTests.test_reprPublicECDSAŒ  s^   € ð
 	×ÑÜ”—’˜$Ÿ*™*Ó%×,Ñ,Ó.Ó/Üðó
÷ ‰fð
ñ 
/ô ×-Ñ-ñ
/õ	
r   c                 óÄ   • U R                  [        [        R                  " U R                  5      5      [        S5      R                  " S0 [        R                  D65        g)zU
The repr of a L{keys.Key} contains all the OpenSSH format for an ECDSA
private key.
a                  <Elliptic Curve Private Key (256 bits)
                curve:
                	ecdsa-sha2-nistp256
                privateValue:
                	{privateValue}
                x:
                	{x}
                y:
                	{y}>
                Nr+   )	rW   r8  r   r/   r9   r   r?  r   r8   rP   s    r   Útest_reprPrivateECDSAÚKeyTests.test_reprPrivateECDSA   sU   € ð
 	×ÑÜ”—’˜$Ÿ*™*Ó%Ó&Üð
ó÷ ‰fðñ /ô ×-Ñ-ñ/õ	
r   c                 ó¤   • U R                  [        [        R                  " U R                  5      R                  5       5      [        S5      5        g)zV
The repr of a L{keys.Key} contains all the OpenSSH format for an
Ed25519 public key.
zÜ                <Ed25519 Public Key (256 bits)
                attr a:
                	f1:16:d1:15:4a:1e:15:0e:19:5e:19:46:b5:f2:44:
                	0d:b2:52:a0:ae:2a:6b:23:13:73:45:fd:40:d9:57:
                	7b:8b>N)rW   r8  r   r/   r@   r€   r   rP   s    r   Útest_reprPublicEd25519ÚKeyTests.test_reprPublicEd25519¶  s=   € ð 	×ÑÜ”—’˜$Ÿ/™/Ó*×1Ñ1Ó3Ó4Üðóõ
	
r   c                 óˆ   • U R                  [        [        R                  " U R                  5      5      [        S5      5        g)zW
The repr of a L{keys.Key} contains all the OpenSSH format for an
Ed25519 private key.
aŠ                  <Ed25519 Private Key (256 bits)
                attr a:
                	f1:16:d1:15:4a:1e:15:0e:19:5e:19:46:b5:f2:44:
                	0d:b2:52:a0:ae:2a:6b:23:13:73:45:fd:40:d9:57:
                	7b:8b
                attr k:
                	37:2f:25:da:8d:d4:a8:9a:78:7c:61:f0:98:01:c6:
                	f4:5e:6d:67:05:69:31:37:4c:69:0d:05:55:bb:c9:
                	44:58>N)rW   r8  r   r/   r@   r   rP   s    r   Útest_reprPrivateEd25519Ú KeyTests.test_reprPrivateEd25519È  s4   € ð 	×ÑÜ”—’˜$Ÿ/™/Ó*Ó+Üð	óõ	
r   )	r6   rB   r9   r;   r=   r@   rE   r3   rA   )aÚ__name__Ú
__module__Ú__qualname__Ú__firstlineno__r	   ÚskipCryptographyr   rJ   rQ   rY   ru   r}   r‰   r“   r›   rŸ   r–   r—   rž   r·   r½   rÄ   rÊ   rÔ   rØ   rå   rè   rë   rï   rò   rþ   r  r	  r  r  r  r   r&  r+  r/  r6  r=  rD  rK  rQ  rV  rc  ri  r   rn  rt  rx  r|  r  r�  r“  r˜  r�  r¤  r©  r¬  r±  r´  r¸  r¿  rÂ  rË  r×  rÛ  rÞ  rá  rä  rç  rì  rð  rô  r÷  rû  rþ  r  r  r  r  r  r#  r&  r*  r.  r2  r5  r9  r<  r@  rC  rF  rI  Ú__static_attributes__r+   r   r   r   r   *   sh  † ØÑØˆò=,ò~ ò
DòFHòP
òTò04ò(9ò'ò)ò6ò'ò/òb
ò
ò.$ò
ò0
ò,
ò
ò	
ò	
ò

ò
ò&g
òR

ò.ò'ò&ò5ò
ò
ò
ò	
ò@ò("UòHJò7ò&7ò.5ò49ð6 ñ?ó ð?òCò$Xò
ò,
ò*Xð< ñ
ó ð
ò$	
ò
ò
ð, ñ
ó ð
ò5ò
ò"
ò"
ð( ñ
ó ð
ò.<ò
ò"
ò$
ò
ò$
ò
ð$ ñNó ðNð& ñNó ðNòNòNòNòNò
ò(Xò
ò$
ò$
ò$5ò;ð* ñ5ó ð5ò
ò*=ò=òBòN
ò`
ò>
ò(
ð, ñ
ó ð
ð" ñ
ó ó
r   r   c                   ó4   • \ rS rSrSr\c  \rS rS r	S r
Srg)ÚPersistentRSAKeyTestsiß  z)
Tests for L{keys._getPersistentRSAKey}.
Nc                 ó   • [        U R                  5       5      nUR                  S5      n[        R                  " USS9nU R                  UR                  5       S5        U R                  UR                  5       5        g)zo
L{keys._getPersistentRSAKey} will put the key in
C{directory}/C{filename}, with the key length of C{keySize}.
ú	mykey.pemrU   ©ÚkeySizeN)	r   rD   Úchildr   Ú_getPersistentRSAKeyrW   rX   rŒ   Úexists©rI   ÚtempDirrE   rÈ   s       r   Útest_providedArgumentsÚ,PersistentRSAKeyTests.test_providedArgumentsç  s]   € ô
 ˜4Ÿ;™;›=Ó)ˆØ—-‘- Ó,ˆä×'Ò'¨¸Ñ>ˆØ×Ñ˜Ÿ™› TÔ*Ø�‰˜Ÿ™Ó(Õ)r   c                 óÊ  • [        U R                  5       5      nUR                  S5      n[        R                  " USS9nU R                  UR                  5       S5        U R                  UR                  5       5        UR                  5       n[        R                  " USS9nU R                  UR                  5       S5        U R                  UR                  5       U5        g)zU
L{keys._getPersistentRSAKey} will not regenerate the key if the key
already exists.
rT  rU   rU  rT   N)
r   rD   rW  r   rX  rW   rX   rŒ   rY  Ú
getContent)rI   r[  rE   rÈ   Ú
keyContents        r   Útest_noRegenerationÚ)PersistentRSAKeyTests.test_noRegenerationó  s®   € ô
 ˜4Ÿ;™;›=Ó)ˆØ—-‘- Ó,ˆä×'Ò'¨¸Ñ>ˆØ×Ñ˜Ÿ™› TÔ*Ø�‰˜Ÿ™Ó(Ô)Ø×'Ñ'Ó)ˆ
ô ×'Ò'¨¸Ñ>ˆØ×Ñ˜Ÿ™› TÔ*Ø×Ñ˜×+Ñ+Ó-¨zÕ:r   c                 óÐ   • [        U R                  5       5      nUR                  S5      n[        R                  " USS9nSUl        U R                  UR                  5       S5        g)zg
If the key generated by L{keys.getPersistentRSAKey} is set to None
the key size should then become 0.
rT  rU   rU  Nr   )r   rD   rW  r   rX  r2   rW   rX   rZ  s       r   Útest_keySizeZeroÚ&PersistentRSAKeyTests.test_keySizeZero  sQ   € ô
 ˜4Ÿ;™;›=Ó)ˆØ—-‘- Ó,ˆä×'Ò'¨¸Ñ>ˆØˆŒØ×Ñ˜Ÿ™› QÕ'r   r+   )rK  rL  rM  rN  Ú__doc__r	   rO  r   r\  ra  rd  rP  r+   r   r   rR  rR  ß  s#   † ñð ÑØˆò
*ò;õ&
(r   rR  )!rf  rá   rN   Útextwrapr   Útwisted.conch.testr   Útwisted.pythonr   Útwisted.python.filepathr   Útwisted.python.reflectr   Útwisted.trialr   r	   rO  Úcryptography.hazmat.backendsr
   r…  r   r†  r   Útwisted.conch.sshr   r   r   Úed25519_supportedr   r   ÚTestCaser   rR  r+   r   r   Ú<module>rq     s’   ðñó
 Û 	Ý å &Ý $Ý ,Ý 0Ý "á˜^Ó,€ØÑØ9Ðö Ý<Ý5ÝAç5Ñ5á'Ó)×;Ñ;Ó=ÑàÐòôr
ˆx× Ñ ô r
ôj51(˜H×-Ñ-õ 1(r   