ó
    Ö›‘hfk  ã                  ó  • S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKJrJrJrJrJr  SSKJr  SS	KJr  SS
KJr  \" S5      (       a  SSKJrJrJrJrJrJr  SSK J!r!J"r"J#r#J$r$  OSr%SS jr& " S S\5      r'g)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                 ó.   ^• [        U 5      mSU4S jjnU$ )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                ó   >• [        T5      $ ©N)Únext)Ú_ÚpassphrasesIters    €ÚcC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/conch/test/test_ckeygen.pyÚfakeGetpassÚ makeGetpass.<locals>.fakeGetpass<   s   ø€ Ü�OÓ$Ð$ó    )r   ÚobjectÚreturnÚstr)Úiter)Úpassphrasesr!   r   s     @r    ÚmakeGetpassr)   0   s   ø€ ô ˜;Ó'€O÷%ð Ðr#   c                  ó¾  • \ rS rSrSrS-S jr  S.       S/S jjrS-S jrS-S jrS-S jr	S-S	 jr
S-S
 jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jrS-S jr S-S  jr!S-S! jr"S-S" jr#S-S# jr$S-S$ jr%S-S% jr&S-S& jr'S-S' jr(S-S( jr)S-S) jr*S-S* jr+S-S+ jr,S,r-g)0ÚKeyGenTestséB   zF
Tests for various functions used to implement the I{ckeygen} script.
c                ód   • [        5       U l        U R                  [        SU R                  5        g)zH
Patch C{sys.stdout} so tests can make assertions about what's printed.
ÚstdoutN)r   r.   ÚpatchÚsys©Úselfs    r    ÚsetUpÚKeyGenTests.setUpG   s!   € ô “jˆŒØ�
‰
”3˜ $§+¡+Õ.r#   Nc                óL  • U R                  5       nSSUSUS/nUb  UR                  SU/5        Ub  UR                  SU/5        [        R                  " U5        [        R
                  " U5      n[        R
                  " US-   5      nUS:X  a!  U R                  UR                  5       S	5        OUUS
:X  a!  U R                  UR                  5       S5        O.U R                  UR                  5       UR                  5       5        U R                  UR                  5       5        g )NÚckeygenú-tú-fz--no-passphrasez-bz--private-key-subtypeú.pubÚecdsaÚECÚed25519ÚEd25519)ÚmktempÚextendÚ
subprocessÚcallr   ÚfromFileÚassertEqualÚtypeÚupperÚ
assertTrueÚisPublic)r2   ÚkeyTypeÚkeySizeÚprivateKeySubtypeÚfilenameÚargsÚprivKeyÚpubKeys           r    Ú_testrunÚKeyGenTests._testrunN   sé   € ð —;‘;“=ˆØ˜4 ¨$°Ð:KÐLˆØÑØ�K‰K˜˜w˜Ô(ØÑ(Ø�K‰KÐ0Ð2CÐDÔEÜ�Š˜ÔÜ—,’,˜xÓ(ˆÜ—’˜h¨Ñ/Ó0ˆØ�gÓØ×Ñ˜WŸ\™\›^¨TÕ2Ø˜	Ó!Ø×Ñ˜WŸ\™\›^¨YÕ7à×Ñ˜WŸ\™\›^¨W¯]©]«_Ô=Ø�‰˜Ÿ™Ó)Õ*r#   c                ó¾  • U R                  SS5        U R                  SSSS9  U R                  S5        U R                  SSS9  U R                  S5        U R                  SS5        U R                  SSSS9  U R                  S5        U R                  SSS9  U R                  SS5        U R                  SSSS9  U R                  S5        U R                  SSS9  g )	Nr:   Ú384Úv1)rJ   r<   ÚdsaÚ2048Úrsa)rO   r1   s    r    Útest_keygenerationÚKeyGenTests.test_keygeneratione   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                óÌ   • U R                  5       nU R                  [        R                  5         [        R                  " SSSSU/5        S S S 5        g ! , (       d  f       g = f)Nr6   r7   Úfoor8   )r>   ÚassertRaisesr@   ÚCalledProcessErrorÚ
check_call©r2   rK   s     r    Útest_runBadKeytypeÚKeyGenTests.test_runBadKeytypet   sF   € Ø—;‘;“=ˆØ×Ñœz×<Ñ<Õ=Ü×!Ò! 9¨d°E¸4ÀÐ"JÔK÷ >×=Ö=ús   °AÁ
A#c                ód   • [        SS05      nU R                  US   [        R                  5        g)z€
L{enumrepresentation} takes a dictionary as input and returns a
dictionary with its attributes changed to enum representation.
Úformatúmd5-hexN)r   ÚassertIsr   ÚMD5_HEX©r2   Úoptionss     r    Útest_enumrepresentationÚ#KeyGenTests.test_enumrepresentationy   s-   € ô
 % h°	Ð%:Ó;ˆØ�‰�g˜hÑ'Ô);×)CÑ)CÕDr#   c                ód   • [        SS05      nU R                  US   [        R                  5        g)z6
Test for format L{FingerprintFormats.SHA256-BASE64}.
rb   úsha256-base64N)r   rd   r   ÚSHA256_BASE64rf   s     r    Útest_enumrepresentationsha256Ú)KeyGenTests.test_enumrepresentationsha256�   s-   € ô % h°Ð%@ÓAˆØ�‰�g˜hÑ'Ô);×)IÑ)IÕJr#   c                óÎ   • U R                  [        5       n[        SS05        SSS5        U R                  SWR                  R
                  S   5        g! , (       d  f       N8= f)z)
Test for unsupported fingerprint format
rb   ú
sha-base64Nú*Unsupported fingerprint format: sha-base64r   )r[   r   r   rC   Ú	exceptionrL   )r2   Úems     r    Ú test_enumrepresentationBadFormatÚ,KeyGenTests.test_enumrepresentationBadFormatˆ   sR   € ð ×ÑÔ3Ô4¸Ü ¨,Ð7Ô8÷ 5à×ÑØ8¸"¿,¹,×:KÑ:KÈAÑ:Nõ	
÷ 5Õ4ús   –AÁ
A$c                óÐ   • U R                  5       n[        U5      R                  [        5        [	        USS.5        U R                  U R                  R                  5       S5        g)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.
rc   ©rK   rb   z:2048 85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da temp
N©r>   r   Ú
setContentr   r   rC   r.   Úgetvaluer^   s     r    Útest_printFingerprintÚ!KeyGenTests.test_printFingerprint’   sQ   € ð —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ü h¸)ÑDÔEØ×ÑØ�K‰K× Ñ Ó"ØIõ	
r#   c                óÐ   • U R                  5       n[        U5      R                  [        5        [	        USS.5        U R                  U R                  R                  5       S5        g)zv
L{printFigerprint} will print key fingerprint in
L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
rk   rw   z72048 FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI= temp
Nrx   r^   s     r    Útest_printFingerprintsha256Ú'KeyGenTests.test_printFingerprintsha256    sQ   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ü h¸/ÑJÔKØ×ÑØ�K‰K× Ñ Ó"ØFõ	
r#   c                ó,  • U R                  5       n[        U5      R                  [        5        U R	                  [
        5       n[        USS.5        SSS5        U R                  SWR                  R                  S   5        g! , (       d  f       N8= f)z`
L{printFigerprint} raises C{keys.BadFingerprintFormat} when unsupported
formats are requested.
rp   rw   Nrq   r   )
r>   r   ry   r   r[   r   r   rC   rr   rL   )r2   rK   rs   s      r    Ú)test_printFingerprintBadFingerPrintFormatÚ5KeyGenTests.test_printFingerprintBadFingerPrintFormat­   sq   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ø×ÑÔ3Ô4¸Ü¨(¸lÑKÔL÷ 5à×ÑØ8¸"¿,¹,×:KÑ:KÈAÑ:Nõ	
÷ 5Õ4ús   ÁBÂ
Bc                óÖ   • U R                  5       n[        US-   5      R                  [        5        [	        USS.5        U R                  U R                  R                  5       S5        g)zV
L{printFingerprint} checks if the filename with the  '.pub' suffix
exists in ~/.ssh.
r9   rc   rw   z>2048 85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da temp.pub
Nrx   r^   s     r    Ú#test_printFingerprintSuffixAppendedÚ/KeyGenTests.test_printFingerprintSuffixAppendedº   sV   € ð
 —;‘;“=ˆÜ�˜FÑ"Ó#×.Ñ.Ô/@ÔAÜ h¸)ÑDÔEØ×ÑØ�K‰K× Ñ Ó"ØMõ	
r#   c                óf  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  U R                  R                  5       SU< SU< S35        U R                  UR                  UR                  S5      R                  5       SS5      U5        U R                  [
        R                  " UR                  S	5      R                  5       5      UR                  5       5        g)
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_rsaÚ
passphraserc   ©rK   Úpassrb   ú&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   r>   ÚmakedirsÚchildÚpathr   Ú
fromStringr	   r   rC   r.   rz   Ú
getContentÚpublic©r2   ÚbaserK   Úkeys       r    Útest_saveKeyÚKeyGenTests.test_saveKeyÇ   sç   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜ�°\È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                óf  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  U R                  R                  5       SU< SU< S35        U R                  UR                  UR                  S5      R                  5       SS5      U5        U R                  [
        R                  " UR                  S	5      R                  5       5      UR                  5       5        g)
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_ecdsarˆ   rc   r‰   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   r>   r�   r‘   r’   r   r“   r   r   rC   r.   rz   r”   r•   r–   s       r    Útest_saveKeyECDSAÚKeyGenTests.test_saveKeyECDSAß   sç   € ô ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜jÓ)×.Ñ.ˆÜ�nŠnÔ1Ó2ˆÜ�°\È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                óf  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  U R                  R                  5       SU< SU< S35        U R                  UR                  UR                  S5      R                  5       SS5      U5        U R                  [
        R                  " UR                  S	5      R                  5       5      UR                  5       5        g)
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_ed25519rˆ   rc   r‰   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   r>   r�   r‘   r’   r   r“   r   r   rC   r.   rz   r”   r•   r–   s       r    Útest_saveKeyEd25519ÚKeyGenTests.test_saveKeyEd25519ø   sè   € ô ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜lÓ+×0Ñ0ˆÜ�nŠnÔ7Ó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                óf  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  U R                  R                  5       SU< SU< S35        U R                  UR                  UR                  S5      R                  5       SS5      U5        U R                  [
        R                  " UR                  S	5      R                  5       5      UR                  5       5        g)
zr
L{_saveKey} will generate key fingerprint in
L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
r‡   rˆ   rk   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ˆÜØ°ÈÑXô	
ð 	×ÑØ�K‰K× Ñ Ô"ó AIË(ðTô	
ð 	×ÑØ�N‰N˜4Ÿ:™: hÓ/×:Ñ:Ó<¸dÀLÓQÐSVô	
ð 	×ÑÜ�NŠN˜4Ÿ:™: lÓ3×>Ñ>Ó@ÓAÀ3Ç:Á:Ã<õ	
r#   c                ó�  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      nU R                  [        5       n[        UUSSS.5        SSS5        U R                  SWR                  R                  S   5        g! , (       d  f       N8= f)zY
L{_saveKey} raises C{keys.BadFingerprintFormat} when unsupported
formats are requested.
r‡   rˆ   rp   r‰   Nrq   r   )r   r>   r�   r‘   r’   r   r“   r	   r[   r   r   rC   rr   rL   )r2   r—   rK   r˜   rs   s        r    Ú test_saveKeyBadFingerPrintformatÚ,KeyGenTests.test_saveKeyBadFingerPrintformat,  s˜   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆØ×ÑÔ3Ô4¸ÜØØ%¨|À|ÑTô÷ 5ð
 	×ÑØ8¸"¿,¹,×:KÑ:KÈAÑ:Nõ	
÷ 5Õ4ús   Á4B7Â7
Cc                ó^  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  UR                  UR                  S5      R                  5       SS5      U5        g)úY
L{_saveKey} will choose an empty string for the passphrase if
no-passphrase is C{True}.
r‡   Trc   ©rK   zno-passphraserb   Nr#   )r   r>   r�   r‘   r’   r   r“   r	   r   rC   r”   r–   s       r    Útest_saveKeyEmptyPassphraseÚ'KeyGenTests.test_saveKeyEmptyPassphrase>  s†   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜØ¸ÈÑSô	
ð 	×ÑØ�N‰N˜4Ÿ:™: hÓ/×:Ñ:Ó<¸dÀCÓHÈ#õ	
r#   c                ó\  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  UR                  UR                  S5      R                  5       S5      U5        g)rª   rœ   Trc   r«   N)r   r>   r�   r‘   r’   r   r“   r   r   rC   r”   r–   s       r    Ú test_saveKeyECDSAEmptyPassphraseÚ,KeyGenTests.test_saveKeyECDSAEmptyPassphraseN  s‚   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜jÓ)×.Ñ.ˆÜ�nŠnÔ1Ó2ˆÜØ¸ÈÑSô	
ð 	×Ñ˜Ÿ™¨¯
©
°:Ó(>×(IÑ(IÓ(KÈTÓRÐTWÕXr#   c                ó\  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        X2SSS.5        U R                  UR                  UR                  S5      R                  5       S5      U5        g)rª   r    Trc   r«   N)r   r>   r�   r‘   r’   r   r“   r   r   rC   r”   r–   s       r    Ú"test_saveKeyEd25519EmptyPassphraseÚ.KeyGenTests.test_saveKeyEd25519EmptyPassphrase\  s„   € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜lÓ+×0Ñ0ˆÜ�nŠnÔ7Ó8ˆÜØ¸ÈÑSô	
ð 	×ÑØ�N‰N˜4Ÿ:™: lÓ3×>Ñ>Ó@À$ÓGÈõ	
r#   c                óò  ^^• [        U R                  5       5      nUR                  5         UR                  S5      R                  m/ mSSKnSU4S jjnU R                  UR                  R                  R                  SU4S j5        [        R                  " [        5      n[        USSSS	.U5        UR                  S5      R                  5       nUR                  USS
5      nU R                  XF5        g)zL
When no path is specified, it will ask for the path used to store the
key.
Ú
custom_keyr   Nc                 ó(   >• TR                  S5        g©NÚ ©Úappend©rL   Úinput_promptss    €r    Ú
mock_inputÚ6KeyGenTests.test_saveKeyNoFilename.<locals>.mock_inputx  ó   ø€ Ø× Ñ  Ô$Ør#   Ú_inputSaveFilec                ó   >• T$ r   © )r   ÚkeyPaths    €r    Ú<lambda>Ú4KeyGenTests.test_saveKeyNoFilename.<locals>.<lambda>|  s   ø€ Égr#   Trc   r«   r#   ©rL   r$   r%   r&   )r   r>   r�   r‘   r’   Útwisted.conch.scripts.ckeygenr/   ÚconchÚscriptsr6   r   r“   r	   r   r”   rC   )	r2   r—   Útwistedr½   r˜   ÚpersistedKeyContentÚpersistedKeyr¼   rÃ   s	          @@r    Útest_saveKeyNoFilenameÚ"KeyGenTests.test_saveKeyNoFilenamel  sÅ   ù€ ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—*‘*˜\Ó*×/Ñ/ˆØ#%ˆã,÷	ð 	�
‰
�7—=‘=×(Ñ(×0Ñ0Ð2BÔDUÔVÜ�nŠnÔ/Ó0ˆÜØØ°À	ÑJØô	
ð #Ÿj™j¨Ó6×AÑAÓCÐØ—~‘~Ð&9¸4ÀÓEˆØ×Ñ˜Õ+r#   c                óR  • S	S jn[        U R                  5       5      nUR                  5         UR                  S5      R                  nU R                  [        R                  SS 5        [        R                  " [        5      nUSSS.nU R                  [        [        XEU5        g)
z[
When the specified file exists, it will ask the user for confirmation
before overwriting.
c                 ó   • S/$ )NÚnrÂ   )rL   s    r    r½   Ú6KeyGenTests.test_saveKeyFileExists.<locals>.mock_inputŽ  s	   € Ø�5ˆLr#   rµ   Úexistsc                ó   • g)NTrÂ   )r   s    r    rÄ   Ú4KeyGenTests.test_saveKeyFileExists.<locals>.<lambda>•  s   € °r#   Trc   r«   N)rL   r$   r%   z	list[str])r   r>   r�   r‘   r’   r/   Úosr   r“   r	   r[   Ú
SystemExitr   )r2   r½   r—   rÃ   r˜   rg   s         r    Útest_saveKeyFileExistsÚ"KeyGenTests.test_saveKeyFileExistsˆ  sy   € ô	ô ˜Ÿ™›Ó&ˆØ�‰ŒØ—*‘*˜\Ó*×/Ñ/ˆà�
‰
”2—7‘7˜H¡nÔ5Ü�nŠnÔ/Ó0ˆØ&¸ÈÑSˆØ×Ñœ*¤h°¸jÕIr#   c                ó®  • [        U R                  5       5      nUR                  5         UR                  S5      R                  n[
        R                  " [        5      n[        UUSSSS.5        U R                  U R                  R                  5       SU< SU< S35        UR                  S5      R                  5       nU R                  UR                  US	S5      U5        U R                  UR                  S
5      5        U R                  [
        R                  " UR                  S5      R                  5       5      UR                  5       5        g	)zQ
L{_saveKey} can be told to write the new private key file in OpenSSH
v1 format.
r‡   rˆ   rc   rS   )rK   rŠ   rb   úprivate-key-subtyper‹   rŒ   r�   Nó$   -----BEGIN OPENSSH PRIVATE KEY-----
rŽ   )r   r>   r�   r‘   r’   r   r“   r	   r   rC   r.   rz   r”   rF   Ú
startswithr•   )r2   r—   rK   r˜   ÚprivateKeyContents        r    Útest_saveKeySubtypeV1Ú!KeyGenTests.test_saveKeySubtypeV1š  s  € ô
 ˜Ÿ™›Ó&ˆØ�‰ŒØ—:‘:˜hÓ'×,Ñ,ˆÜ�nŠnÔ/Ó0ˆÜØà$Ø$Ø#Ø'+ñ	ô	
ð 	×ÑØ�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                ó^  • U R                  5       n[        R                  " [        5      n[	        U5      R                  [        5        [        SU05        U R                  R                  5       R                  S5      R                  S5      nU R                  X2R                  S5      5        g)zT
L{displayPublicKey} prints out the public key associated with a given
private key.
rK   Ú
ÚasciiÚopensshN)r>   r   r“   r   r   ry   r	   r   r.   rz   ÚstripÚencoderC   ÚtoString©r2   rK   rN   Ú	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                ó`  • U R                  5       n[        R                  " [        5      n[	        U5      R                  [        5        [        USS.5        U R                  R                  5       R                  S5      R                  S5      nU R                  X2R                  S5      5        g)zƒ
L{displayPublicKey} prints out the public key associated with a given
private key using the given passphrase when it's encrypted.
Ú	encrypted©rK   rŠ   râ   rã   rä   N)r>   r   r“   r   r   ry   r
   r   r.   rz   rå   ræ   rC   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                óŽ  • U R                  5       n[        R                  " [        5      n[	        U5      R                  [        5        U R                  [        SS 5        [        SU05        U R                  R                  5       R                  S5      R                  S5      nU R                  X2R                  S5      5        g)zƒ
L{displayPublicKey} prints out the public key associated with a given
private key, asking for the passphrase when it's encrypted.
Úgetpassc                ó   • g)Nrí   rÂ   )Úxs    r    rÄ   ÚLKeyGenTests.test_displayPublicKeyEncryptedPassphrasePrompt.<locals>.<lambda>Ü  s   € °r#   rK   râ   rã   rä   N)r>   r   r“   r   r   ry   r
   r/   rò   r   r.   rz   rå   ræ   rC   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                óœ   • U R                  5       n[        U5      R                  [        5        U R	                  [
        [        USS.5        g)zr
L{displayPublicKey} fails with a L{BadKeyError} when trying to decrypt
an encrypted key with the wrong password.
Úwrongrî   N)r>   r   ry   r
   r[   r   r   r^   s     r    Ú$test_displayPublicKeyWrongPassphraseÚ0KeyGenTests.test_displayPublicKeyWrongPassphraseá  s>   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCØ×ÑÜÔ)¸È'Ñ+Rõ	
r#   c                óŽ  • [        SSS5      nU R                  [        SU5        U R                  5       n[	        U5      R                  [        5        [        SU05        U R                  U R                  R                  5       R                  S5      S5        U R                  [        [	        U5      R                  5       5        g)z\
L{changePassPhrase} allows a user to change the passphrase of a
private key interactively.
rí   Únewpassrò   rK   râ   ú;Your identification has been saved with the new passphrase.N©r)   r/   rò   r>   r   ry   r
   r   rC   r.   rz   rå   ÚassertNotEqualr”   )r2   ÚoldNewConfirmrK   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                óŽ  • [        SS5      nU R                  [        SU5        U R                  5       n[	        U5      R                  [        5        [        USS.5        U R                  U R                  R                  5       R                  S5      S5        U R                  [        [	        U5      R                  5       5        g)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ò   rí   rî   râ   rþ   Nrÿ   )r2   Ú
newConfirmrK   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                óJ  • U R                  5       n[        U5      R                  [        5        [	        USSS.5        U R                  U R                  R                  5       R                  S5      S5        U R                  [        [        U5      R                  5       5        g)zŠ
L{changePassPhrase} allows a user to change the passphrase of a private
key by providing both old and new passphrases without prompting.
rí   Ú
newencrypt)rK   rŠ   rý   râ   rþ   N)r>   r   ry   r
   r   rC   r.   rz   rå   r   r”   r^   s     r    Útest_changePassphraseWithBothÚ)KeyGenTests.test_changePassphraseWithBoth  s†   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCäØ!¨;À<ÑPô	
ð 	×ÑØ�K‰K× Ñ Ó"×(Ñ(¨Ó.ØIô	
ð 	×ÑÜ(¬(°8Ó*<×*GÑ*GÓ*Iõ	
r#   c                ó,  • U R                  5       n[        U5      R                  [        5        U R	                  [
        [        USS.5      nU R                  S[        U5      5        U R                  [        [        U5      R                  5       5        g)zv
L{changePassPhrase} exits if passed an invalid old passphrase when
trying to change the passphrase of a private key.
rù   rî   z1Could not change passphrase: old passphrase errorN)
r>   r   ry   r
   r[   r×   r   rC   r&   r”   ©r2   rK   Úerrors      r    Ú$test_changePassphraseWrongPassphraseÚ0KeyGenTests.test_changePassphraseWrongPassphrase'  sz   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCØ×!Ñ!ÜÔ(°xÈÑ*Qó
ˆð 	×ÑØ?ÄÀUÃô	
ð 	×ÑÔ5´xÀÓ7I×7TÑ7TÓ7VÕWr#   c                ój  • U R                  [        S[        S5      5        U R                  5       n[	        U5      R                  [        5        U R                  [        [        SU05      nU R                  S[        U5      5        U R                  [        [	        U5      R                  5       5        g)zk
L{changePassPhrase} exits if no passphrase is specified for the
C{getpass} call and the key is encrypted.
rò   r¸   rK   zMCould not change passphrase: Passphrase must be provided for an encrypted keyN)r/   rò   r)   r>   r   ry   r
   r[   r×   r   rC   r&   r”   r  s      r    Ú!test_changePassphraseEmptyGetPassÚ-KeyGenTests.test_changePassphraseEmptyGetPass6  sŒ   € ð
 	�
‰
”7˜I¤{°2£Ô7Ø—;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCØ×!Ñ!¤*Ô.>ÀÈXÐ@VÓWˆØ×Ñð#ä�‹Jô	
ð
 	×ÑÔ5´xÀÓ7I×7TÑ7TÓ7VÕWr#   c                ó  • U R                  5       n[        U5      R                  S5        U R                  [        [
        SU05      nSnU R                  U[        U5      5        U R                  S[        U5      R                  5       5        g)zK
L{changePassPhrase} exits if the file specified points to an invalid
key.
s   foobarrK   z?Could not change passphrase: cannot guess the type of b'foobar'N)	r>   r   ry   r[   r×   r   rC   r&   r”   )r2   rK   r  Úexpecteds       r    Útest_changePassphraseBadKeyÚ'KeyGenTests.test_changePassphraseBadKeyF  ss   € ð
 —;‘;“=ˆÜ�Ó×%Ñ% iÔ0Ø×!Ñ!¤*Ô.>ÀÈXÐ@VÓWˆàWˆØ×Ñ˜¤3 u£:Ô.Ø×Ñ˜¤H¨XÓ$6×$AÑ$AÓ$CÕDr#   c                ód  • U R                  5       n[        U5      R                  [        5        SS jnU R	                  [
        SU5        U R                  [        [        USS.5      nU R                  S[        U5      5        U R                  [        [        U5      R                  5       5        g)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                 ó   • [        S5      e)NÚoops)ÚRuntimeError©rL   Úkwargss     r    rç   Ú>KeyGenTests.test_changePassphraseCreateError.<locals>.toString[  s   € Ü˜vÓ&Ð&r#   rç   r	  ©rK   rý   z!Could not change passphrase: oopsN)rL   r$   r  r$   r%   r   ©r>   r   ry   r	   r/   r   r[   r×   r   rC   r&   r”   )r2   rK   rç   r  s       r    Ú test_changePassphraseCreateErrorÚ,KeyGenTests.test_changePassphraseCreateErrorS  sŽ   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&8Ô9ô	'ð 	�
‰
”3˜
 HÔ-à×!Ñ!ÜÜØ!¨lÑ;ó
ˆð 	×ÑÐ<¼cÀ%»jÔIà×ÑÔ+¬X°hÓ-?×-JÑ-JÓ-LÕMr#   c                óh  • U R                  5       n[        U5      R                  [        5        SS jnU R	                  [
        SU5        U R                  [        [        USS.5      nSnU R                  U[        U5      5        U R                  [        [        U5      R                  5       5        g)zY
L{changePassPhrase} doesn't modify the key file if C{toString} returns
an empty string.
c                 ó   • gr·   rÂ   r  s     r    rç   ÚCKeyGenTests.test_changePassphraseEmptyStringError.<locals>.toStringr  s   € Ør#   rç   r	  r  z9Could not change passphrase: cannot guess the type of b''N)rL   r$   r  r$   r%   r&   r   )r2   rK   rç   r  r  s        r    Ú%test_changePassphraseEmptyStringErrorÚ1KeyGenTests.test_changePassphraseEmptyStringErrorj  s“   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&8Ô9ô	ð 	�
‰
”3˜
 HÔ-à×!Ñ!ÜÜØ!¨lÑ;ó
ˆð OˆØ×Ñ˜¤3 u£:Ô.à×ÑÔ+¬X°hÓ-?×-JÑ-JÓ-LÕMr#   c                ó,  • U R                  5       n[        U5      R                  [        5        U R	                  [
        [        USS.5      nU R                  S[        U5      5        U R                  [        [        U5      R                  5       5        g)zn
L{changePassPhrase} exits when trying to change the passphrase on a
public key, and doesn't change the file.
rŠ   r  z.Could not change passphrase: key not encryptedN)
r>   r   ry   r   r[   r×   r   rC   r&   r”   r  s      r    Útest_changePassphrasePublicKeyÚ*KeyGenTests.test_changePassphrasePublicKey‚  sv   € ð
 —;‘;“=ˆÜ�Ó×%Ñ%Ô&7Ô8Ø×!Ñ!ÜÔ(°xÈFÑ*Só
ˆð 	×ÑÐIÌ3ÈuË:ÔVØ×ÑÔ*¬H°XÓ,>×,IÑ,IÓ,KÕLr#   c                óÔ  • [        SSS5      nU R                  [        SU5        U R                  5       n[	        U5      R                  [        5        [        USS.5        U R                  U R                  R                  5       R                  S5      S5        [	        U5      R                  5       nU R                  [        U5        U R                  UR                  S5      5        g	)
zY
L{changePassPhrase} can be told to write the new private key file in
OpenSSH v1 format.
rí   rý   rò   rS   )rK   rÛ   râ   rþ   rÜ   N)r)   r/   rò   r>   r   ry   r
   r   rC   r.   rz   rå   r”   r   rF   rÝ   )r2   r  rK   rÞ   s       r    Útest_changePassphraseSubtypeV1Ú*KeyGenTests.test_changePassphraseSubtypeV1�  s½   € ô
 $ K°¸IÓFˆØ�
‰
”7˜I }Ô5à—;‘;“=ˆÜ�Ó×%Ñ%Ô&BÔCä hÀtÑLÔMØ×ÑØ�K‰K× Ñ Ó"×(Ñ(¨Ó.ØIô	
ô % XÓ.×9Ñ9Ó;ÐØ×ÑÔ8Ð:KÔLØ�‰Ø×(Ñ(Ð)QÓRõ	
r#   c                ó:  ^• / mSU4S jjnSS0n[        X!5      nU R                  US   S5        U R                  UR                  [        R
                  R                  SS5      5      5        U R                  S[        T5      5        U R                  S/T5        g)	zO
L{options} will default to "~/.ssh/id_rsa" if the user doesn't
specify a key.
c                 ó(   >• TR                  S5        gr·   r¹   r»   s    €r    r½   Ú5KeyGenTests.test_useDefaultForKey.<locals>.mock_input¬  r¿   r#   rK   r¸   z.sshr‡   é   NrÆ   )r   rC   rF   ÚendswithrÖ   r’   ÚjoinÚlen)r2   r½   rg   rK   r¼   s       @r    Útest_useDefaultForKeyÚ!KeyGenTests.test_useDefaultForKey¥  s�   ø€ ð
 $&ˆ÷	ð ˜rÐ"ˆä# GÓ8ˆØ×ÑØ�JÑØô	
ð
 	�‰˜×)Ñ)¬"¯'©'¯,©,°v¸xÓ*HÓIÔJð 	×Ñ˜œC Ó.Ô/Ø×Ñ˜"˜˜}Õ-r#   c                ó€   • SS0nU R                  [        [        U5      nU R                  SUR                  S   5        g)zs
Ensure FileNotFoundError is handled, whether the user has supplied
a bad path, or has no key at the default path.
rK   ú/foo/barú+could not be opened, please specify a file.r   N)r[   r×   r   ÚassertInrL   ©r2   rg   Úexcs      r    Ú'test_displayPublicKeyHandleFileNotFoundÚ3KeyGenTests.test_displayPublicKeyHandleFileNotFound¾  s:   € ð
 ˜zÐ*ˆØ×Ñ¤
Ô,<¸gÓFˆØ�‰ÐCÀSÇXÁXÈaÁ[ÕQr#   c                ó€   • SS0nU R                  [        [        U5      nU R                  SUR                  S   5        g)ú>
Ensure FileNotFoundError is handled for an invalid filename.
rK   r8  r9  r   N)r[   r×   r   r:  rL   r;  s      r    Ú'test_changePassPhraseHandleFileNotFoundÚ3KeyGenTests.test_changePassPhraseHandleFileNotFoundÇ  s:   € ð ˜zÐ*ˆØ×Ñ¤
Ô,<¸gÓFˆØ�‰ÐCÀSÇXÁXÈaÁ[ÕQr#   c                ó‚   • SSS.nU R                  [        [        U5      nU R                  SUR                  S   5        g)r@  r8  rc   rw   r9  r   N)r[   r×   r   r:  rL   r;  s      r    Ú'test_printFingerprintHandleFileNotFoundÚ3KeyGenTests.test_printFingerprintHandleFileNotFoundÏ  s:   € ð  *°YÑ?ˆØ×Ñ¤
Ô,<¸gÓFˆØ�‰ÐCÀSÇXÁXÈaÁ[ÕQr#   )r.   )r%   ÚNone)NN)rH   r&   rI   ú
str | NonerJ   rG  r%   rF  ).Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r3   rO   rW   r_   rh   rm   rt   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,  r5  r=  rA  rD  Ú__static_attributes__rÂ   r#   r    r+   r+   B   s  † ñô/ð #Ø(,ð	+àð+ð ð+ð &ð	+ð
 
õ+ô.5ôLô
EôKô
ô
ô
ô
ô
ô
ô0
ô2
ô4
ô4
ô$
ô Yô
ô ,ô8Jô$ 
ôD
@ô
@ô@ô	
ô
ô(
ô(
ô&XôXô EôNô.Nô0Mô
ô,.ô2RôR÷Rr#   r+   )r(   r&   r%   zCallable[[object], str])(rL  Ú
__future__r   rò   rÖ   r@   r0   Úior   Útypingr   Útyping_extensionsr   Ú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)   r+   rÂ   r#   r    Ú<module>rX     su   ðñõ #ã Û 	Û Û 
Ý Ý å &÷õ õ -Ý 0Ý +á�× Ñ ÷÷ ÷ô ð E€Dôô$S
R�(õ S
Rr#   