+
    üÐj-m  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RI	Ht ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ R	IHt ]! R
4      '       d   ^ RIHtHtHtHtHtHt ^ RIH t H!t!H"t"H#t# MRt$R R lt% ! R R]4      t&R# )z-
Tests for L{twisted.conch.scripts.ckeygen}.
)ÚannotationsN)ÚStringIO)ÚCallable)ÚNoReturn)ÚprivateECDSA_opensshÚprivateEd25519_openssh_newÚprivateRSA_opensshÚprivateRSA_openssh_encryptedÚpublicRSA_openssh)ÚFilePath)ÚrequireModule)ÚTestCaseÚcryptography)Ú_getKeyOrDefaultÚ_saveKeyÚchangePassPhraseÚdisplayPublicKeyÚenumrepresentationÚprintFingerprint)ÚBadFingerPrintFormatÚBadKeyErrorÚFingerprintFormatsÚKeyz7cryptography required for twisted.conch.scripts.ckeygenc               ó    € V ^8„  d   QhRRRR/# )é   ÚpassphrasesÚstrÚreturnzCallable[[object], str]© )Úformats   "ÚA/usr/lib/python3/dist-packages/twisted/conch/test/test_ckeygen.pyÚ__annotate__r!   1   s   € ÷ ñ ˜cð Ð&=ñ ó    c                 ó0   a€ \        V 4      oR V3R llpV# )a(  
Return a callable to patch C{getpass.getpass}.  Yields a passphrase each
time called. Use case is to provide an old, then new passphrase(s) as if
requested interactively.

@param passphrases: The list of passphrases returned, one per each call.

@return: A callable to patch C{getpass.getpass}.
c               ó    € V ^8„  d   QhRRRR/# )r   Ú_Úobjectr   r   r   )r   s   "r    r!   Ú!makeGetpass.<locals>.__annotate__=   s   € ÷ %ñ %�vð % #ñ %r"   c                ó   <€ \        S4      # ©N)Únext)r%   ÚpassphrasesIters   &€r    ÚfakeGetpassÚ makeGetpass.<locals>.fakeGetpass=   s   ø€ Ü�OÓ$Ð$r"   )Úiter)r   r,   r+   s   * @r    ÚmakeGetpassr/   1   s!   ø€ ô ˜;Ó'€O÷%ð %ð Ðr"   c                  óþ  € ] tR t^CtRtR R ltRTR R lltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& ltR' R( ltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: lt R; R< lt!R= R> lt"R? R@ lt#RA RB lt$RC RD lt%RE RF lt&RG RH lt'RI RJ lt(RK RL lt)RM RN lt*RO RP lt+RQ RR lt,RSt-R# )UÚKeyGenTestszF
Tests for various functions used to implement the I{ckeygen} script.
c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r    r!   ÚKeyGenTests.__annotate__H   s   € ÷ /ñ /�tñ /r"   c                óf   € \        4       V n        V P                  \        RV P                  4       R# )zH
Patch C{sys.stdout} so tests can make assertions about what's printed.
ÚstdoutN)r   r7   ÚpatchÚsys©Úselfs   &r    ÚsetUpÚKeyGenTests.setUpH   s!   € ô “jˆŒØ�
‰
”3˜ $§+¡+Ö.r"   Nc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   ÚkeyTyper   ÚkeySizez
str | NoneÚprivateKeySubtyper   r4   r   )r   s   "r    r!   r5   O   s2   € ÷ +ñ +àð+ð ð+ð &ð	+ð
 
ñ+r"   c                	ó¸  € V P                  4       pR RVRVR.pVe   VP                  RV.4       Ve   VP                  RV.4        \        P                  ! V4       \
        P                  ! V4      p\
        P                  ! VR,           4      pVR	8X  d"   V P                  VP                  4       R
4       MVVR8X  d"   V P                  VP                  4       R4       M.V P                  VP                  4       VP                  4       4       V P                  VP                  4       4       R#   \         d    RT^ &   \        P                  ! T4        Lúi ; i)Úckeygenú-tú-fz--no-passphraseNz-bz--private-key-subtypeÚckeygen3ú.pubÚecdsaÚECÚed25519ÚEd25519)ÚmktempÚextendÚ
subprocessÚcallÚFileNotFoundErrorr   ÚfromFileÚassertEqualÚtypeÚupperÚ
assertTrueÚisPublic)r;   r?   r@   rA   ÚfilenameÚargsÚprivKeyÚpubKeys   &&&&    r    Ú_testrunÚKeyGenTests._testrunO   s  € ð —;‘;“=ˆØ˜4 ¨$°Ð:KÐLˆØÒØ�K‰K˜˜w˜Ô(ØÒ(Ø�K‰KÐ0Ð2CÐDÔEð	"Ü�OŠO˜DÔ!ô —,’,˜xÓ(ˆÜ—’˜h¨Õ/Ó0ˆØ�gÔØ×Ñ˜WŸ\™\›^¨TÕ2Ø˜	Ô!Ø×Ñ˜WŸ\™\›^¨YÕ7à×Ñ˜WŸ\™\›^¨W¯]©]«_Ô=Ø�‰˜Ÿ™Ó)Ö*øô !ô 	"Ø ˆD�‰GÜ�OŠO˜DÖ!ð	"ús   ÁD0 Ä0&EÅEc               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   j   s   € ÷ 5ñ 5 Dñ 5r"   c                	óä  € V P                  R R4       V P                  R RRR7       V P                  R 4       V P                  R RR7       V P                  R4       V P                  RR4       V P                  RRRR7       V P                  R4       V P                  RRR7       V P                  RR4       V P                  RRRR7       V P                  R4       V P                  RRR7       R# )	rH   Ú384Úv1)rA   rJ   ÚdsaÚ2048ÚrsaN)r[   r:   s   &r    Útest_keygenerationÚKeyGenTests.test_keygenerationj   sÂ   € Ø�‰�g˜uÔ%Ø�‰�g˜u¸ˆÔ=Ø�‰�gÔØ�‰�g°ˆÔ6Ø�‰�iÔ Ø�‰�e˜VÔ$Ø�‰�e˜V°tˆÔ<Ø�‰�eÔØ�‰�e¨tˆÔ4Ø�‰�e˜VÔ$Ø�‰�e˜V°tˆÔ<Ø�‰�eÔØ�‰�e¨tˆÖ4r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   y   s   € ÷ (ñ ( Dñ (r"   c                	óÂ  € V P                  4       pV P                  \        P                  4      ;_uu_ 4        \	        \
        P                  R 4      ;_uu_ 4       p \        P                  ! RRRRV.VR7       RRR4       RRR4       R#   \         d!    \        P                  ! RRRRT.TR7        L<i ; i  + '       g   i     LH; i  + '       g   i     R# ; i)ÚrbrC   rD   ÚfoorE   )ÚstderrrF   N)	rL   ÚassertRaisesrN   ÚCalledProcessErrorÚopenÚosÚdevnullÚ
check_callrP   )r;   rW   ro   s   &  r    Útest_runBadKeytypeÚKeyGenTests.test_runBadKeytypey   s­   € Ø—;‘;“=ˆØ×Ñœz×<Ñ<×=Õ=Ü”b—j‘j $×'Ô'¨7ð(Ü×)Ò)Ø" D¨%°°xÐ@Ø&õ(÷ (÷ >Ñ=øô )ô (Ü×)Ò)Ø# T¨5°$¸ÐAØ&÷(ð(ú÷ (×'ú÷ >×=Ð=úsA   ¸#CÁB:	ÁBÁ:CÂ(B7Â4B:	Â6B7Â7B:	Â:C
ÃCÃC	c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   †   s   € ÷ Eñ E¨ñ Er"   c                ón   € \        RR/4      pV P                  VR,          \        P                  4       R# )z€
L{enumrepresentation} takes a dictionary as input and returns a
dictionary with its attributes changed to enum representation.
r   úmd5-hexN)r   ÚassertIsr   ÚMD5_HEX©r;   Úoptionss   & r    Útest_enumrepresentationÚ#KeyGenTests.test_enumrepresentation†   s-   € ô
 % h°	Ð%:Ó;ˆØ�‰�g˜hÕ'Ô);×)CÑ)CÖDr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ž   s   € ÷ Kñ K¨tñ Kr"   c                ón   € \        RR/4      pV P                  VR,          \        P                  4       R# )z6
Test for format L{FingerprintFormats.SHA256-BASE64}.
r   úsha256-base64N)r   rv   r   ÚSHA256_BASE64rx   s   & r    Útest_enumrepresentationsha256Ú)KeyGenTests.test_enumrepresentationsha256Ž   s-   € ô % h°Ð%@ÓAˆØ�‰�g˜hÕ'Ô);×)IÑ)IÖJr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   •   s   € ÷ 
ñ 
°$ñ 
r"   c                óì   € V P                  \        4      ;_uu_ 4       p\        RR/4       RRR4       V P                  RXP                  P
                  ^ ,          4       R#   + '       g   i     L?; i)z)
Test for unsupported fingerprint format
r   ú
sha-base64Nú*Unsupported fingerprint format: sha-base64)rk   r   r   rR   Ú	exceptionrX   )r;   Úems   & r    Ú test_enumrepresentationBadFormatÚ,KeyGenTests.test_enumrepresentationBadFormat•   sU   € ð ×ÑÔ3×4Ô4¸Ü ¨,Ð7Ô8÷ 5à×ÑØ8¸"¿,¹,×:KÑ:KÈAÕ:Nö	
÷ 5×4ús   žA#Á#A3	c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ÿ   s   € ÷ 
ñ 
 tñ 
r"   c                óÔ   € V P                  4       p\        V4      P                  \        4       \	        RVRR/4       V P                  V P                  P                  4       R4       R# )z™
L{printFingerprint} writes a line to standard out giving the number of
bits of the key, its fingerprint, and the basename of the file from it
was read.
rW   r   ru   z:2048 85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da temp
N©rL   r   Ú
setContentr
   r   rR   r7   Úgetvalue©r;   rW   s   & r    Útest_printFingerprintÚ!KeyGenTests.test_printFingerprintŸ   sU   € ð —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ü˜* h°¸)ÐDÔEØ×ÑØ�K‰K× Ñ Ó"ØIö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   ­   s   € ÷ 
ñ 
¨Tñ 
r"   c                óÔ   € V P                  4       p\        V4      P                  \        4       \	        RVRR/4       V P                  V P                  P                  4       R4       R# )zv
L{printFigerprint} will print key fingerprint in
L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
rW   r   r~   z72048 FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI= temp
NrŒ   r�   s   & r    Útest_printFingerprintsha256Ú'KeyGenTests.test_printFingerprintsha256­   sU   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ü˜* h°¸/ÐJÔKØ×ÑØ�K‰K× Ñ Ó"ØFö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   º   s   € ÷ 
ñ 
¸4ñ 
r"   c                óL  € V P                  4       p\        V4      P                  \        4       V P	                  \
        4      ;_uu_ 4       p\        RVRR/4       RRR4       V P                  RXP                  P                  ^ ,          4       R#   + '       g   i     L?; i)z`
L{printFigerprint} raises C{keys.BadFingerprintFormat} when unsupported
formats are requested.
rW   r   r„   Nr…   )
rL   r   r�   r
   rk   r   r   rR   r†   rX   )r;   rW   r‡   s   &  r    Ú)test_printFingerprintBadFingerPrintFormatÚ5KeyGenTests.test_printFingerprintBadFingerPrintFormatº   sx   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ø×ÑÔ3×4Ô4¸Ü˜j¨(°H¸lÐKÔL÷ 5à×ÑØ8¸"¿,¹,×:KÑ:KÈAÕ:Nö	
÷ 5×4ús   ÁBÂB#	c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ç   s   € ÷ 
ñ 
°Tñ 
r"   c                óâ   € V P                  4       p\        VR,           4      P                  \        4       \	        RVRR/4       V P                  V P                  P                  4       R4       R# )zV
L{printFingerprint} checks if the filename with the  '.pub' suffix
exists in ~/.ssh.
rG   rW   r   ru   z>2048 85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da temp.pub
NrŒ   r�   s   & r    Ú#test_printFingerprintSuffixAppendedÚ/KeyGenTests.test_printFingerprintSuffixAppendedÇ   sZ   € ð
 —;‘;“=ˆÜ�˜FÕ"Ó#×.Ñ.Ô/@ÔAÜ˜* h°¸)ÐDÔEØ×ÑØ�K‰K× Ñ Ó"ØMö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ô   s   € ÷ 
ñ 
˜dñ 
r"   c           	     ón  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  V P                  P                  4       RV: RV: R	24       V P                  VP                  VP                  R4      P                  4       R
R4      V4       V P                  \
        P                  ! VP                  R4      P                  4       4      VP                  4       4       R
# )z~
L{_saveKey} writes the private and public parts of a key to two
different files and writes a report of this to standard out.
Úid_rsarW   ÚpassÚ
passphraser   ru   ú&Your identification has been saved in ú#
Your public key has been saved in úm.pub
The key fingerprint in <FingerprintFormats=MD5_HEX> is:
85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da
Nú
id_rsa.pub©r   rL   ÚmakedirsÚchildÚpathr   Ú
fromStringr   r   rR   r7   rŽ   Ú
getContentÚpublic©r;   ÚbaserW   Úkeys   &   r    Útest_saveKeyÚKeyGenTests.test_saveKeyÔ   sï   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜ��z 8¨V°\À8ÈYÐWÔXØ×ÑØ�K‰K× Ñ Ô"ó DLËXðWô	
ð 	×ÑØ�N‰N˜4Ÿ:™: hÓ/×:Ñ:Ó<¸dÀLÓQÐSVô	
ð 	×ÑÜ�NŠN˜4Ÿ:™: lÓ3×>Ñ>Ó@ÓAÀ3Ç:Á:Ã<ö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   ì   s   € ÷ 
ñ 
 4ñ 
r"   c           	     ón  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  V P                  P                  4       RV: RV: R	24       V P                  VP                  VP                  R4      P                  4       R
R4      V4       V P                  \
        P                  ! VP                  R4      P                  4       4      VP                  4       4       R
# )z“
L{_saveKey} writes the private and public parts of a key to two
different files and writes a report of this to standard out.
Test with ECDSA key.
Úid_ecdsarW   r¡   r¢   r   ru   r£   r¤   zm.pub
The key fingerprint in <FingerprintFormats=MD5_HEX> is:
1e:ab:83:a6:f2:04:22:99:7c:64:14:d2:ab:fa:f5:16
Nzid_ecdsa.pub)r   rL   r¨   r©   rª   r   r«   r   r   rR   r7   rŽ   r¬   r­   r®   s   &   r    Útest_saveKeyECDSAÚKeyGenTests.test_saveKeyECDSAì   sï   € ô ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜jÓ)×.Ñ.ˆÜ�nŠnÔ1Ó2ˆÜ��z 8¨V°\À8ÈYÐWÔXØ×ÑØ�K‰K× Ñ Ô"ó DLËXðWô	
ð 	×ÑØ�N‰N˜4Ÿ:™: jÓ1×<Ñ<Ó>ÀÀlÓSÐUXô	
ð 	×ÑÜ�NŠN˜4Ÿ:™: nÓ5×@Ñ@ÓBÓCÀSÇZÁZÃ\ö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5     s   € ÷ 
ñ 
 Tñ 
r"   c           	     ón  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  V P                  P                  4       RV: RV: R	24       V P                  VP                  VP                  R4      P                  4       R
R4      V4       V P                  \
        P                  ! VP                  R4      P                  4       4      VP                  4       4       R
# )z•
L{_saveKey} writes the private and public parts of a key to two
different files and writes a report of this to standard out.
Test with Ed25519 key.
Ú
id_ed25519rW   r¡   r¢   r   ru   r£   r¤   zm.pub
The key fingerprint in <FingerprintFormats=MD5_HEX> is:
ab:ee:c8:ed:e5:01:1b:45:b7:8d:b2:f0:8f:61:1c:14
Nzid_ed25519.pub)r   rL   r¨   r©   rª   r   r«   r   r   rR   r7   rŽ   r¬   r­   r®   s   &   r    Útest_saveKeyEd25519ÚKeyGenTests.test_saveKeyEd25519  sð   € ô ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜lÓ+×0Ñ0ˆÜ�nŠnÔ7Ó8ˆÜ��z 8¨V°\À8ÈYÐWÔXØ×ÑØ�K‰K× Ñ Ô"ó DLËXðWô	
ð 	×ÑØ�N‰N˜4Ÿ:™: lÓ3×>Ñ>Ó@À$ÈÓUØô	
ð 	×ÑÜ�NŠN˜4Ÿ:™:Ð&6Ó7×BÑBÓDÓEÀsÇzÁzÃ|ö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5     s   € ÷ 
ñ 
 Dñ 
r"   c           	     ón  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  V P                  P                  4       RV: RV: R	24       V P                  VP                  VP                  R4      P                  4       R
R4      V4       V P                  \
        P                  ! VP                  R4      P                  4       4      VP                  4       4       R
# )zr
L{_saveKey} will generate key fingerprint in
L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
r    rW   r¡   r¢   r   r~   r£   r¤   zp.pub
The key fingerprint in <FingerprintFormats=SHA256_BASE64> is:
FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI=
Nr¦   r§   r®   s   &   r    Útest_saveKeysha256ÚKeyGenTests.test_saveKeysha256  sô   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜØ�*˜h¨°¸hÈÐXô	
ð 	×ÑØ�K‰K× Ñ Ô"ó AIË(ðTô	
ð 	×ÑØ�N‰N˜4Ÿ:™: hÓ/×:Ñ:Ó<¸dÀLÓQÐSVô	
ð 	×ÑÜ�NŠN˜4Ÿ:™: lÓ3×>Ñ>Ó@ÓAÀ3Ç:Á:Ã<ö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   9  s   € ÷ 
ñ 
°$ñ 
r"   c                ó²  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      pV P                  \        4      ;_uu_ 4       p\        VRVRRRR/4       RRR4       V P                  RXP                  P                  ^ ,          4       R#   + '       g   i     L?; i)	zY
L{_saveKey} raises C{keys.BadFingerprintFormat} when unsupported
formats are requested.
r    rW   r¡   r¢   r   r„   Nr…   )r   rL   r¨   r©   rª   r   r«   r   rk   r   r   rR   r†   rX   )r;   r¯   rW   r°   r‡   s   &    r    Ú test_saveKeyBadFingerPrintformatÚ,KeyGenTests.test_saveKeyBadFingerPrintformat9  s¡   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆØ×ÑÔ3×4Ô4¸ÜØØ˜X v¨|¸XÀ|ÐTô÷ 5ð
 	×ÑØ8¸"¿,¹,×:KÑ:KÈAÕ:Nö	
÷ 5×4ús   Á<CÃC	c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   K  s   € ÷ 
ñ 
¨Tñ 
r"   c           	     óf  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  VP                  VP                  R4      P                  4       RR4      V4       R# )	úY
L{_saveKey} will choose an empty string for the passphrase if
no-passphrase is C{True}.
r    rW   úno-passphraseTr   ru   Nr"   )r   rL   r¨   r©   rª   r   r«   r   r   rR   r¬   r®   s   &   r    Útest_saveKeyEmptyPassphraseÚ'KeyGenTests.test_saveKeyEmptyPassphraseK  sŽ   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜØ�*˜h¨¸¸xÈÐSô	
ð 	×ÑØ�N‰N˜4Ÿ:™: hÓ/×:Ñ:Ó<¸dÀCÓHÈ#ö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   [  s   € ÷ Yñ Y°$ñ Yr"   c           	     ód  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  VP                  VP                  R4      P                  4       R4      V4       R# )rÇ   rµ   rW   rÈ   Tr   ru   N)r   rL   r¨   r©   rª   r   r«   r   r   rR   r¬   r®   s   &   r    Ú test_saveKeyECDSAEmptyPassphraseÚ,KeyGenTests.test_saveKeyECDSAEmptyPassphrase[  sŠ   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜jÓ)×.Ñ.ˆÜ�nŠnÔ1Ó2ˆÜØ�*˜h¨¸¸xÈÐSô	
ð 	×Ñ˜Ÿ™¨¯
©
°:Ó(>×(IÑ(IÓ(KÈTÓRÐTWÖXr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   i  s   € ÷ 
ñ 
°Dñ 
r"   c           	     ód  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRR/4       V P                  VP                  VP                  R4      P                  4       R4      V4       R# )rÇ   rº   rW   rÈ   Tr   ru   N)r   rL   r¨   r©   rª   r   r«   r   r   rR   r¬   r®   s   &   r    Ú"test_saveKeyEd25519EmptyPassphraseÚ.KeyGenTests.test_saveKeyEd25519EmptyPassphrasei  sŒ   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜lÓ+×0Ñ0ˆÜ�nŠnÔ7Ó8ˆÜØ�*˜h¨¸¸xÈÐSô	
ð 	×ÑØ�N‰N˜4Ÿ:™: lÓ3×>Ñ>Ó@À$ÓGÈö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   y  s   € ÷ ,ñ ,¨ñ ,r"   c           	     óú  aa€ \        V P                  4       4      pVP                  4        VP                  R4      P                  o. o^ RIpR V3R llpV P                  VP                  P                  P                  RV3R l4       \        P                  ! \        4      p\        VRRRR	R
R/V4       VP                  R4      P                  4       pVP                  VRR4      pV P                  WF4       R# )zL
When no path is specified, it will ask for the path used to store the
key.
Ú
custom_keyNc               ó    € V ^8„  d   QhRRRR/# ©r   rX   r&   r   r   r   )r   s   "r    r!   Ú8KeyGenTests.test_saveKeyNoFilename.<locals>.__annotate__…  ó   € ÷ 	ñ 	˜fð 	¨ñ 	r"   c                 ó*   <€ SP                  R 4       R # ©Ú ©Úappend©rX   Úinput_promptss   *€r    Ú
mock_inputÚ6KeyGenTests.test_saveKeyNoFilename.<locals>.mock_input…  ó   ø€ Ø× Ñ  Ô$Ùr"   Ú_inputSaveFilec                ó   <€ S# r)   r   )r%   ÚkeyPaths   &€r    Ú<lambda>Ú4KeyGenTests.test_saveKeyNoFilename.<locals>.<lambda>‰  s   ø€ Égr"   rW   rÈ   Tr   ru   r"   )r   rL   r¨   r©   rª   Útwisted.conch.scripts.ckeygenr8   ÚconchÚscriptsrC   r   r«   r   r   r¬   rR   )	r;   r¯   Útwistedrá   r°   ÚpersistedKeyContentÚpersistedKeyrà   ræ   s	   &      @@r    Útest_saveKeyNoFilenameÚ"KeyGenTests.test_saveKeyNoFilenamey  sÐ   ù€ ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—*‘*˜\Ó*×/Ñ/ˆØ#%ˆã,÷	ð 	ð 	�
‰
�7—=‘=×(Ñ(×0Ñ0Ð2BÔDUÔVÜ�nŠnÔ/Ó0ˆÜØØ˜˜°°hÀ	ÐJØô	
ð #Ÿj™j¨Ó6×AÑAÓCÐØ—~‘~Ð&9¸4ÀÓEˆØ×Ñ˜Ö+r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   •  s   € ÷ Jñ J¨ñ Jr"   c                óZ  € R R lp\        V P                  4       4      pVP                  4        VP                  R4      P                  pV P                  \        P                  RR 4       \        P                  ! \        4      pRVRRR	R
/pV P                  \        \        WEV4       R# )z[
When the specified file exists, it will ask the user for confirmation
before overwriting.
c               ó    € V ^8„  d   QhRRRR/# )r   rX   r&   r   z	list[str]r   )r   s   "r    r!   Ú8KeyGenTests.test_saveKeyFileExists.<locals>.__annotate__›  s   € ÷ 	ñ 	˜fð 	¨ñ 	r"   c                 ó   € R .# )Únr   )rX   s   *r    rá   Ú6KeyGenTests.test_saveKeyFileExists.<locals>.mock_input›  s	   € Ø�5ˆLr"   rÕ   Úexistsc                ó   € R # )Tr   )r%   s   &r    rç   Ú4KeyGenTests.test_saveKeyFileExists.<locals>.<lambda>¢  s   € ±r"   rW   rÈ   Tr   ru   N)r   rL   r¨   r©   rª   r8   rn   r   r«   r   rk   Ú
SystemExitr   )r;   rá   r¯   ræ   r°   ry   s   &     r    Útest_saveKeyFileExistsÚ"KeyGenTests.test_saveKeyFileExists•  s   € õ	ô ˜Ÿ™›Ó&ˆØ�‰ŒØ—*‘*˜\Ó*×/Ñ/ˆà�
‰
”2—7‘7˜H¡nÔ5Ü�nŠnÔ/Ó0ˆØ˜w¨¸¸xÈÐSˆØ×Ñœ*¤h°¸jÖIr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   §  s   € ÷  
ñ  
 tñ  
r"   c                ó¶  € \        V P                  4       4      pVP                  4        VP                  R4      P                  p\
        P                  ! \        4      p\        VRVRRRRRR/4       V P                  V P                  P                  4       R	V: R
V: R24       VP                  R4      P                  4       pV P                  VP                  VRR4      V4       V P                  VP                  R4      4       V P                  \
        P                  ! VP                  R4      P                  4       4      VP                  4       4       R# )zQ
L{_saveKey} can be told to write the new private key file in OpenSSH
v1 format.
r    rW   r¡   r¢   r   ru   úprivate-key-subtyper`   r£   r¤   r¥   Nó$   -----BEGIN OPENSSH PRIVATE KEY-----
r¦   )r   rL   r¨   r©   rª   r   r«   r   r   rR   r7   rŽ   r¬   rU   Ú
startswithr­   )r;   r¯   rW   r°   ÚprivateKeyContents   &    r    Útest_saveKeySubtypeV1Ú!KeyGenTests.test_saveKeySubtypeV1§  s  € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜØà˜HØ˜Ø˜)Ø% tð	ô	
ð 	×ÑØ�K‰K× Ñ Ô"ó DLËXðWô	
ð !ŸJ™J xÓ0×;Ñ;Ó=ÐØ×Ñ˜Ÿ™Ð(9¸4ÀÓNÐPSÔTØ�‰Ø×(Ñ(Ð)QÓRô	
ð 	×ÑÜ�NŠN˜4Ÿ:™: lÓ3×>Ñ>Ó@ÓAÀ3Ç:Á:Ã<ö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   É  s   € ÷ 
@ñ 
@ tñ 
@r"   c                ó`  € V P                  4       p\        P                  ! \        4      p\	        V4      P                  \        4       \        RV/4       V P                  P                  4       P                  R4      P                  R4      pV P                  W2P                  R4      4       R# )zT
L{displayPublicKey} prints out the public key associated with a given
private key.
rW   Ú
ÚasciiÚopensshN)rL   r   r«   r
   r   r�   r   r   r7   rŽ   ÚstripÚencoderR   ÚtoString©r;   rW   rZ   Ú	displayeds   &   r    Útest_displayPublicKeyÚ!KeyGenTests.test_displayPublicKeyÉ  s~   € ð
 —;‘;“=ˆÜ—’Ô 1Ó2ˆÜ�Ó×%Ñ%Ô&8Ô9Ü˜* hÐ/Ô0Ø—K‘K×(Ñ(Ó*×0Ñ0°Ó6×=Ñ=¸gÓFˆ	Ø×Ñ˜§O¡O°IÓ$>Ö?r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Õ  s   € ÷ 
@ñ 
@°ñ 
@r"   c                ód  € V P                  4       p\        P                  ! \        4      p\	        V4      P                  \        4       \        RVRR/4       V P                  P                  4       P                  R4      P                  R4      pV P                  W2P                  R4      4       R# )zƒ
L{displayPublicKey} prints out the public key associated with a given
private key using the given passphrase when it's encrypted.
rW   r¡   Ú	encryptedr  r	  r
  N)rL   r   r«   r
   r   r�   r	   r   r7   rŽ   r  r  rR   r  r  s   &   r    Útest_displayPublicKeyEncryptedÚ*KeyGenTests.test_displayPublicKeyEncryptedÕ  s‚   € ð
 —;‘;“=ˆÜ—’Ô 1Ó2ˆÜ�Ó×%Ñ%Ô&BÔCÜ˜* h°¸ÐDÔEØ—K‘K×(Ñ(Ó*×0Ñ0°Ó6×=Ñ=¸gÓFˆ	Ø×Ñ˜§O¡O°IÓ$>Ö?r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   á  s   € ÷ @ñ @Àñ @r"   c                ó�  € V P                  4       p\        P                  ! \        4      p\	        V4      P                  \        4       V P                  \        RR 4       \        RV/4       V P                  P                  4       P                  R4      P                  R4      pV P                  W2P                  R4      4       R# )zƒ
L{displayPublicKey} prints out the public key associated with a given
private key, asking for the passphrase when it's encrypted.
Úgetpassc                ó   € R # )r  r   )Úxs   &r    rç   ÚLKeyGenTests.test_displayPublicKeyEncryptedPassphrasePrompt.<locals>.<lambda>é  s   € ±r"   rW   r  r	  r
  N)rL   r   r«   r
   r   r�   r	   r8   r  r   r7   rŽ   r  r  rR   r  r  s   &   r    Ú.test_displayPublicKeyEncryptedPassphrasePromptÚ:KeyGenTests.test_displayPublicKeyEncryptedPassphrasePromptá  s�   € ð
 —;‘;“=ˆÜ—’Ô 1Ó2ˆÜ�Ó×%Ñ%Ô&BÔCØ�
‰
”7˜IÑ'<Ô=Ü˜* hÐ/Ô0Ø—K‘K×(Ñ(Ó*×0Ñ0°Ó6×=Ñ=¸gÓFˆ	Ø×Ñ˜§O¡O°IÓ$>Ö?r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   î  s   € ÷ 	
ñ 	
°dñ 	
r"   c                ó    € V P                  4       p\        V4      P                  \        4       V P	                  \
        \        RVRR/4       R# )zr
L{displayPublicKey} fails with a L{BadKeyError} when trying to decrypt
an encrypted key with the wrong password.
rW   r¡   ÚwrongN)rL   r   r�   r	   rk   r   r   r�   s   & r    Ú$test_displayPublicKeyWrongPassphraseÚ0KeyGenTests.test_displayPublicKeyWrongPassphraseî  sB   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCØ×ÑÜÔ)¨J¸À&È'Ð+Rö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   ù  s   € ÷ 
ñ 
 tñ 
r"   c                ó�  € \        RRR4      pV P                  \        RV4       V P                  4       p\	        V4      P                  \        4       \        RV/4       V P                  V P                  P                  4       P                  R4      R4       V P                  \        \	        V4      P                  4       4       R# )z\
L{changePassPhrase} allows a user to change the passphrase of a
private key interactively.
r  Únewpassr  rW   r  ú;Your identification has been saved with the new passphrase.N©r/   r8   r  rL   r   r�   r	   r   rR   r7   rŽ   r  ÚassertNotEqualr¬   )r;   ÚoldNewConfirmrW   s   &  r    Útest_changePassphraseÚ!KeyGenTests.test_changePassphraseù  s�   € ô
 $ K°¸IÓFˆØ�
‰
”7˜I }Ô5à—;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCä˜* hÐ/Ô0Ø×ÑØ�K‰K× Ñ Ó"×(Ñ(¨Ó.ØIô	
ð 	×ÑÜ(¬(°8Ó*<×*GÑ*GÓ*Iö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5     s   € ÷ 
ñ 
¨dñ 
r"   c                ó’  € \        RR4      pV P                  \        RV4       V P                  4       p\	        V4      P                  \        4       \        RVRR/4       V P                  V P                  P                  4       P                  R4      R4       V P                  \        \	        V4      P                  4       4       R# )	z†
L{changePassPhrase} allows a user to change the passphrase of a
private key, providing the old passphrase and prompting for new one.
r&  r  rW   r¡   r  r  r'  Nr(  )r;   Ú
newConfirmrW   s   &  r    Útest_changePassphraseWithOldÚ(KeyGenTests.test_changePassphraseWithOld  sŸ   € ô
 ! ¨IÓ6ˆ
Ø�
‰
”7˜I zÔ2à—;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCä˜* h°¸ÐDÔEØ×ÑØ�K‰K× Ñ Ó"×(Ñ(¨Ó.ØIô	
ð 	×ÑÜ(¬(°8Ó*<×*GÑ*GÓ*Iö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   !  s   € ÷ 
ñ 
¨tñ 
r"   c                óP  € V P                  4       p\        V4      P                  \        4       \	        RVRRRR/4       V P                  V P                  P                  4       P                  R4      R4       V P                  \        \        V4      P                  4       4       R# )	zŠ
L{changePassPhrase} allows a user to change the passphrase of a private
key by providing both old and new passphrases without prompting.
rW   r¡   r  r&  Ú
newencryptr  r'  N)rL   r   r�   r	   r   rR   r7   rŽ   r  r)  r¬   r�   s   & r    Útest_changePassphraseWithBothÚ)KeyGenTests.test_changePassphraseWithBoth!  sŒ   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCäØ˜ 6¨;¸	À<ÐPô	
ð 	×ÑØ�K‰K× Ñ Ó"×(Ñ(¨Ó.ØIô	
ð 	×ÑÜ(¬(°8Ó*<×*GÑ*GÓ*Iö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   4  s   € ÷ Xñ X°dñ Xr"   c                ó0  € V P                  4       p\        V4      P                  \        4       V P	                  \
        \        RVRR/4      pV P                  R\        V4      4       V P                  \        \        V4      P                  4       4       R# )zv
L{changePassPhrase} exits if passed an invalid old passphrase when
trying to change the passphrase of a private key.
rW   r¡   r!  z1Could not change passphrase: old passphrase errorN)
rL   r   r�   r	   rk   rû   r   rR   r   r¬   ©r;   rW   Úerrors   &  r    Ú$test_changePassphraseWrongPassphraseÚ0KeyGenTests.test_changePassphraseWrongPassphrase4  s~   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCØ×!Ñ!ÜÔ(¨:°xÀÈÐ*Qó
ˆð 	×ÑØ?ÄÀUÃô	
ð 	×ÑÔ5´xÀÓ7I×7TÑ7TÓ7VÖWr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   C  s   € ÷ Xñ X°4ñ Xr"   c                ól  € V P                  \        R\        R4      4       V P                  4       p\	        V4      P                  \        4       V P                  \        \        RV/4      pV P                  R\        V4      4       V P                  \        \	        V4      P                  4       4       R# )zk
L{changePassPhrase} exits if no passphrase is specified for the
C{getpass} call and the key is encrypted.
r  rÜ   rW   zMCould not change passphrase: Passphrase must be provided for an encrypted keyN)r8   r  r/   rL   r   r�   r	   rk   rû   r   rR   r   r¬   r9  s   &  r    Ú!test_changePassphraseEmptyGetPassÚ-KeyGenTests.test_changePassphraseEmptyGetPassC  sŒ   € ð
 	�
‰
”7˜I¤{°2£Ô7Ø—;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCØ×!Ñ!¤*Ô.>ÀÈXÐ@VÓWˆØ×Ñð#ä�‹Jô	
ð
 	×ÑÔ5´xÀÓ7I×7TÑ7TÓ7VÖWr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   S  s   € ÷ Eñ E¨Tñ Er"   c                ó   € V P                  4       p\        V4      P                  R4       V P                  \        \
        RV/4      pRpV P                  V\        V4      4       V P                  R\        V4      P                  4       4       R# )zK
L{changePassPhrase} exits if the file specified points to an invalid
key.
s   foobarrW   z?Could not change passphrase: cannot guess the type of b'foobar'N)	rL   r   r�   rk   rû   r   rR   r   r¬   )r;   rW   r:  Úexpecteds   &   r    Útest_changePassphraseBadKeyÚ'KeyGenTests.test_changePassphraseBadKeyS  ss   € ð
 —;‘;“=ˆÜ�Ó×%Ñ% iÔ0Ø×!Ñ!¤*Ô.>ÀÈXÐ@VÓWˆàWˆØ×Ñ˜¤3 u£:Ô.Ø×Ñ˜¤H¨XÓ$6×$AÑ$AÓ$CÖDr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   `  s   € ÷ Nñ N°$ñ Nr"   c                ój  € V P                  4       p\        V4      P                  \        4       R R lpV P	                  \
        RV4       V P                  \        \        RVRR/4      pV P                  R\        V4      4       V P                  \        \        V4      P                  4       4       R# )	z‡
L{changePassPhrase} doesn't modify the key file if an unexpected error
happens when trying to create the key with the new passphrase.
c               ó$   € V ^8„  d   QhRRRRRR/# )r   rX   r&   Úkwargsr   r   r   )r   s   "r    r!   ÚBKeyGenTests.test_changePassphraseCreateError.<locals>.__annotate__h  s!   € ÷ 	'ñ 	'˜Fð 	'¨fð 	'¸ñ 	'r"   c                 ó   € \        R 4      h)Úoops)ÚRuntimeError©rX   rI  s   *,r    r  Ú>KeyGenTests.test_changePassphraseCreateError.<locals>.toStringh  s   € Ü˜vÓ&Ð&r"   r  rW   r&  r4  z!Could not change passphrase: oopsN©rL   r   r�   r   r8   r   rk   rû   r   rR   r   r¬   )r;   rW   r  r:  s   &   r    Ú test_changePassphraseCreateErrorÚ,KeyGenTests.test_changePassphraseCreateError`  s’   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&8Ô9õ	'ð 	�
‰
”3˜
 HÔ-à×!Ñ!ÜÜØ˜ 9¨lÐ;ó
ˆð 	×ÑÐ<¼cÀ%»jÔIà×ÑÔ+¬X°hÓ-?×-JÑ-JÓ-LÖMr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   w  s   € ÷ Nñ N°tñ Nr"   c                ón  € V P                  4       p\        V4      P                  \        4       R R lpV P	                  \
        RV4       V P                  \        \        RVRR/4      pRpV P                  V\        V4      4       V P                  \        \        V4      P                  4       4       R# )	zY
L{changePassPhrase} doesn't modify the key file if C{toString} returns
an empty string.
c               ó$   € V ^8„  d   QhRRRRRR/# )r   rX   r&   rI  r   r   r   )r   s   "r    r!   ÚGKeyGenTests.test_changePassphraseEmptyStringError.<locals>.__annotate__  s!   € ÷ 	ñ 	˜Fð 	¨fð 	¸ñ 	r"   c                 ó   € R # rÛ   r   rN  s   *,r    r  ÚCKeyGenTests.test_changePassphraseEmptyStringError.<locals>.toString  s   € Ùr"   r  rW   r&  r4  z9Could not change passphrase: cannot guess the type of b''NrP  )r;   rW   r  r:  rC  s   &    r    Ú%test_changePassphraseEmptyStringErrorÚ1KeyGenTests.test_changePassphraseEmptyStringErrorw  s—   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&8Ô9õ	ð 	�
‰
”3˜
 HÔ-à×!Ñ!ÜÜØ˜ 9¨lÐ;ó
ˆð OˆØ×Ñ˜¤3 u£:Ô.à×ÑÔ+¬X°hÓ-?×-JÑ-JÓ-LÖMr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   �  s   € ÷ Mñ M°ñ Mr"   c                ó0  € V P                  4       p\        V4      P                  \        4       V P	                  \
        \        RVRR/4      pV P                  R\        V4      4       V P                  \        \        V4      P                  4       4       R# )zn
L{changePassPhrase} exits when trying to change the passphrase on a
public key, and doesn't change the file.
rW   r&  r¡   z.Could not change passphrase: key not encryptedN)
rL   r   r�   r
   rk   rû   r   rR   r   r¬   r9  s   &  r    Útest_changePassphrasePublicKeyÚ*KeyGenTests.test_changePassphrasePublicKey�  sz   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ø×!Ñ!ÜÔ(¨:°xÀÈFÐ*Só
ˆð 	×ÑÐIÌ3ÈuË:ÔVØ×ÑÔ*¬H°XÓ,>×,IÑ,IÓ,KÖLr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   œ  s   € ÷ 
ñ 
°ñ 
r"   c                óØ  € \        RRR4      pV P                  \        RV4       V P                  4       p\	        V4      P                  \        4       \        RVRR/4       V P                  V P                  P                  4       P                  R4      R4       \	        V4      P                  4       pV P                  \        V4       V P                  VP                  R	4      4       R
# )zY
L{changePassPhrase} can be told to write the new private key file in
OpenSSH v1 format.
r  r&  r  rW   r   r`   r  r'  r  N)r/   r8   r  rL   r   r�   r	   r   rR   r7   rŽ   r  r¬   r)  rU   r  )r;   r*  rW   r  s   &   r    Útest_changePassphraseSubtypeV1Ú*KeyGenTests.test_changePassphraseSubtypeV1œ  sÂ   € ô
 $ K°¸IÓFˆØ�
‰
”7˜I }Ô5à—;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCä˜* hÐ0EÀtÐLÔMØ×ÑØ�K‰K× Ñ Ó"×(Ñ(¨Ó.ØIô	
ô % XÓ.×9Ñ9Ó;ÐØ×ÑÔ8Ð:KÔLØ�‰Ø×(Ñ(Ð)QÓRö	
r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   ²  s   € ÷ .ñ . tñ .r"   c                óF  a€ . oR V3R llpRR/p\        W!4      pV P                  VR,          R4       V P                  VP                  \        P
                  P                  RR4      4      4       V P                  ^\        S4      4       V P                  R.S4       R# )zO
L{options} will default to "~/.ssh/id_rsa" if the user doesn't
specify a key.
c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r    r!   Ú7KeyGenTests.test_useDefaultForKey.<locals>.__annotate__¹  rÙ   r"   c                 ó*   <€ SP                  R 4       R # rÛ   rÝ   rß   s   *€r    rá   Ú5KeyGenTests.test_useDefaultForKey.<locals>.mock_input¹  rã   r"   rW   rÜ   z.sshr    N)r   rR   rU   Úendswithrn   rª   ÚjoinÚlen)r;   rá   ry   rW   rà   s   &   @r    Útest_useDefaultForKeyÚ!KeyGenTests.test_useDefaultForKey²  s”   ø€ ð
 $&ˆ÷	ð 	ð ˜rÐ"ˆä# GÓ8ˆØ×ÑØ�JÕØô	
ð
 	�‰˜×)Ñ)¬"¯'©'¯,©,°v¸xÓ*HÓIÔJð 	×Ñ˜œC Ó.Ô/Ø×Ñ˜"˜˜}Ö-r"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ë  s   € ÷ Rñ R¸ñ Rr"   c                óŠ   € RR/pV P                  \        \        V4      pV P                  RVP                  ^ ,          4       R# )zs
Ensure FileNotFoundError is handled, whether the user has supplied
a bad path, or has no key at the default path.
rW   ú/foo/barú+could not be opened, please specify a file.N)rk   rû   r   ÚassertInrX   ©r;   ry   Úexcs   &  r    Ú'test_displayPublicKeyHandleFileNotFoundÚ3KeyGenTests.test_displayPublicKeyHandleFileNotFoundË  s:   € ð
 ˜zÐ*ˆØ×Ñ¤
Ô,<¸gÓFˆØ�‰ÐCÀSÇXÁXÈaÅ[ÖQr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ô  ó   € ÷ Rñ R¸ñ Rr"   c                óŠ   € RR/pV P                  \        \        V4      pV P                  RVP                  ^ ,          4       R# )ú>
Ensure FileNotFoundError is handled for an invalid filename.
rW   rp  rq  N)rk   rû   r   rr  rX   rs  s   &  r    Ú'test_changePassPhraseHandleFileNotFoundÚ3KeyGenTests.test_changePassPhraseHandleFileNotFoundÔ  s:   € ð ˜zÐ*ˆØ×Ñ¤
Ô,<¸gÓFˆØ�‰ÐCÀSÇXÁXÈaÅ[ÖQr"   c               ó   € V ^8„  d   QhRR/# r3   r   )r   s   "r    r!   r5   Ü  rx  r"   c                óŽ   € RRRR/pV P                  \        \        V4      pV P                  RVP                  ^ ,          4       R# )rz  rW   rp  r   ru   rq  N)rk   rû   r   rr  rX   rs  s   &  r    Ú'test_printFingerprintHandleFileNotFoundÚ3KeyGenTests.test_printFingerprintHandleFileNotFoundÜ  s>   € ð ˜z¨8°YÐ?ˆØ×Ñ¤
Ô,<¸gÓFˆØ�‰ÐCÀSÇXÁXÈaÅ[ÖQr"   )r7   )NN).Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r<   r[   rd   rq   rz   r€   rˆ   r�   r”   r˜   rœ   r±   r¶   r»   r¿   rÃ   rÉ   rÍ   rÑ   rï   rü   r  r  r  r  r"  r+  r0  r5  r;  r?  rD  rQ  rY  r]  ra  rl  ru  r{  r  Ú__static_attributes__r   r"   r    r1   r1   C   sæ   † ñõ/÷+õ65õ(õEõKõ
õ
õ
õ
õ
õ
õ0
õ2
õ4
õ4
õ$
õ Yõ
õ ,õ8Jõ$ 
õD
@õ
@õ@õ	
õ
õ(
õ(
õ&XõXõ EõNõ.Nõ0Mõ
õ,.õ2RõR÷Rñ Rr"   r1   )'r…  Ú
__future__r   r  rn   rN   r9   Úior   Útypingr   r   Útwisted.conch.test.keydatar   r   r   r	   r
   Útwisted.python.filepathr   Útwisted.python.reflectr   Útwisted.trial.unittestr   ré   r   r   r   r   r   r   Útwisted.conch.ssh.keysr   r   r   r   Úskipr/   r1   r   r"   r    Ú<module>r�     sx   ðñõ #ã Û 	Û Û 
Û 	Ý Ý å ÷õ õ -Ý 0Ý +á�× Ò ÷÷ ÷ô ð E€Dõô$_
R�(ö _
Rr"   