§
    Ètºffk  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ  ed¦  «        rddlmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ndZ%dd„Z& G d„ de¦  «        Z'dS )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.ckeygenÚpassphrasesÚstrÚreturnúCallable[[object], str]c                 ó2   ‡— t          | ¦  «        Šdˆfd„}|S )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}.
    Ú_Úobjectr   r   c                ó"   •— t          ‰¦  «        S ©N)Únext)r   ÚpassphrasesIters    €ú^/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/test/test_ckeygen.pyÚfakeGetpassz makeGetpass.<locals>.fakeGetpass<   s   ø€ Ý�OÑ$Ô$Ð$ó    )r   r    r   r   )Úiter)r   r&   r$   s     @r%   ÚmakeGetpassr)   0   s8   ø€ õ ˜;Ñ'Ô'€Oð%ð %ð %ð %ð %ð %ð Ðr'   c                  óX  — e Zd ZdZd2d„Z	 	 d3d4d„Zd2d„Zd2d„Zd2d„Zd2d„Z	d2d„Z
d2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d„Zd2d „Zd2d!„Zd2d"„Zd2d#„Zd2d$„Zd2d%„Zd2d&„Z d2d'„Z!d2d(„Z"d2d)„Z#d2d*„Z$d2d+„Z%d2d,„Z&d2d-„Z'd2d.„Z(d2d/„Z)d2d0„Z*d2d1„Z+dS )5ÚKeyGenTestszN
    Tests for various functions used to implement the I{ckeygen} script.
    r   ÚNonec                ón   — t          ¦   «         | _        |                      t          d| j        ¦  «         dS )zX
        Patch C{sys.stdout} so tests can make assertions about what's printed.
        ÚstdoutN)r   r.   ÚpatchÚsys©Úselfs    r%   ÚsetUpzKeyGenTests.setUpG   s-   € õ ‘j”jˆŒØ�
Š
•3˜ $¤+Ñ.Ô.Ð.Ð.Ð.r'   NÚkeyTyper   ÚkeySizeú
str | NoneÚprivateKeySubtypec                óž  — |                       ¦   «         }dd|d|dg}|�|                     d|g¦  «         |�|                     d|g¦  «         t          j        |¦  «         t	          j        |¦  «        }t	          j        |dz   ¦  «        }|dk    r)|                      |                     ¦   «         d	¦  «         ni|d
k    r)|                      |                     ¦   «         d¦  «         n:|                      |                     ¦   «         |                     ¦   «         ¦  «         |  	                    | 
                    ¦   «         ¦  «         d S )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   r4   r5   r7   ÚfilenameÚargsÚprivKeyÚpubKeys           r%   Ú_testrunzKeyGenTests._testrunN   s2  € ð —;’;‘=”=ˆØ˜4 ¨$°Ð:KÐLˆØÐØ�KŠK˜˜w˜Ñ(Ô(Ð(ØÐ(Ø�KŠKÐ0Ð2CÐDÑEÔEÐEÝŒ˜ÑÔÐÝ”,˜xÑ(Ô(ˆÝ”˜h¨Ñ/Ñ0Ô0ˆØ�gÒÐØ×Ò˜WŸ\š\™^œ^¨TÑ2Ô2Ð2Ð2Ø˜	Ò!Ð!Ø×Ò˜WŸ\š\™^œ^¨YÑ7Ô7Ð7Ð7à×Ò˜WŸ\š\™^œ^¨W¯]ª]©_¬_Ñ=Ô=Ð=Ø�Š˜ŸšÑ)Ô)Ñ*Ô*Ð*Ð*Ð*r'   c                óL  — |                       dd¦  «         |                       ddd¬¦  «         |                       d¦  «         |                       dd¬¦  «         |                       d¦  «         |                       dd¦  «         |                       ddd¬¦  «         |                       d¦  «         |                       dd¬¦  «         |                       dd¦  «         |                       ddd¬¦  «         |                       d¦  «         |                       dd¬¦  «         d S )	Nr=   Ú384Úv1)r7   r?   ÚdsaÚ2048Úrsa)rO   r1   s    r%   Útest_keygenerationzKeyGenTests.test_keygeneratione   s  € Ø�Š�g˜uÑ%Ô%Ð%Ø�Š�g˜u¸ˆÑ=Ô=Ð=Ø�Š�gÑÔÐØ�Š�g°ˆÑ6Ô6Ð6Ø�Š�iÑ Ô Ð Ø�Š�e˜VÑ$Ô$Ð$Ø�Š�e˜V°tˆÑ<Ô<Ð<Ø�Š�eÑÔÐØ�Š�e¨tˆÑ4Ô4Ð4Ø�Š�e˜VÑ$Ô$Ð$Ø�Š�e˜V°tˆÑ<Ô<Ð<Ø�Š�eÑÔÐØ�Š�e¨tˆÑ4Ô4Ð4Ð4Ð4r'   c                óÐ   — |                       ¦   «         }|                      t          j        ¦  «        5  t          j        dddd|g¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr9   r:   Úfoor;   )rA   ÚassertRaisesrC   ÚCalledProcessErrorÚ
check_call©r2   rK   s     r%   Útest_runBadKeytypezKeyGenTests.test_runBadKeytypet   sº   € Ø—;’;‘=”=ˆØ×Ò�zÔ<Ñ=Ô=ð 	Lð 	LÝÔ! 9¨d°E¸4ÀÐ"JÑKÔKÐKð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Ls   ´AÁAÁ"Ac                ót   — t          ddi¦  «        }|                      |d         t          j        ¦  «         dS )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_enumrepresentationz#KeyGenTests.test_enumrepresentationy   s9   € õ
 % h°	Ð%:Ñ;Ô;ˆØ�Š�g˜hÔ'Õ);Ô)CÑDÔDÐDÐDÐDr'   c                ót   — t          ddi¦  «        }|                      |d         t          j        ¦  «         dS )zF
        Test for format L{FingerprintFormats.SHA256-BASE64}.
        r_   úsha256-base64N)r   ra   r   ÚSHA256_BASE64rc   s     r%   Útest_enumrepresentationsha256z)KeyGenTests.test_enumrepresentationsha256�   s9   € õ % h°Ð%@ÑAÔAˆØ�Š�g˜hÔ'Õ);Ô)IÑJÔJÐJÐJÐJr'   c                óØ   — |                       t          ¦  «        5 }t          ddi¦  «         ddd¦  «         n# 1 swxY w Y   |                      d|j        j        d         ¦  «         dS )z9
        Test for unsupported fingerprint format
        r_   ú
sha-base64Nú*Unsupported fingerprint format: sha-base64r   )rY   r   r   rF   Ú	exceptionrL   )r2   Úems     r%   Ú test_enumrepresentationBadFormatz,KeyGenTests.test_enumrepresentationBadFormatˆ   s¯   € ð ×ÒÕ3Ñ4Ô4ð 	9¸Ý ¨,Ð7Ñ8Ô8Ð8ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9à×ÒØ8¸"¼,Ô:KÈAÔ:Nñ	
ô 	
ð 	
ð 	
ð 	
s   ›9¹=Á =c                óú   — |                       ¦   «         }t          |¦  «                             t          ¦  «         t	          |ddœ¦  «         |                      | j                             ¦   «         d¦  «         dS )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.
        r`   ©rK   r_   z:2048 85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da temp
N©rA   r   Ú
setContentr   r   rF   r.   Úgetvaluer\   s     r%   Útest_printFingerprintz!KeyGenTests.test_printFingerprint’   sz   € ð —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&7Ñ8Ô8Ð8Ý h¸)ÐDÐDÑEÔEÐEØ×ÒØŒK× Ò Ñ"Ô"ØIñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óú   — |                       ¦   «         }t          |¦  «                             t          ¦  «         t	          |ddœ¦  «         |                      | j                             ¦   «         d¦  «         dS )zŽ
        L{printFigerprint} will print key fingerprint in
        L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
        rg   rq   z72048 FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI= temp
Nrr   r\   s     r%   Útest_printFingerprintsha256z'KeyGenTests.test_printFingerprintsha256    sz   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&7Ñ8Ô8Ð8Ý h¸/ÐJÐJÑKÔKÐKØ×ÒØŒK× Ò Ñ"Ô"ØFñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óP  — |                       ¦   «         }t          |¦  «                             t          ¦  «         |                      t
          ¦  «        5 }t          |ddœ¦  «         ddd¦  «         n# 1 swxY w Y   |                      d|j        j	        d         ¦  «         dS )zx
        L{printFigerprint} raises C{keys.BadFingerprintFormat} when unsupported
        formats are requested.
        rk   rq   Nrl   r   )
rA   r   rs   r   rY   r   r   rF   rm   rL   )r2   rK   rn   s      r%   Ú)test_printFingerprintBadFingerPrintFormatz5KeyGenTests.test_printFingerprintBadFingerPrintFormat­   sì   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&7Ñ8Ô8Ð8Ø×ÒÕ3Ñ4Ô4ð 	M¸Ý¨(¸lÐKÐKÑLÔLÐLð	Mð 	Mð 	Mñ 	Mô 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Møøøð 	Mð 	Mð 	Mð 	Mà×ÒØ8¸"¼,Ô:KÈAÔ:Nñ	
ô 	
ð 	
ð 	
ð 	
s   ÁA5Á5A9Á<A9c                ó   — |                       ¦   «         }t          |dz   ¦  «                             t          ¦  «         t	          |ddœ¦  «         |                      | j                             ¦   «         d¦  «         dS )zn
        L{printFingerprint} checks if the filename with the  '.pub' suffix
        exists in ~/.ssh.
        r<   r`   rq   z>2048 85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:da temp.pub
Nrr   r\   s     r%   Ú#test_printFingerprintSuffixAppendedz/KeyGenTests.test_printFingerprintSuffixAppendedº   s   € ð
 —;’;‘=”=ˆÝ�˜FÑ"Ñ#Ô#×.Ò.Õ/@ÑAÔAÐAÝ h¸)ÐDÐDÑEÔEÐEØ×ÒØŒK× Ò Ñ"Ô"ØMñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óÄ  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    | j
                             ¦   «         d|›d|›d�¦  «         |  	                    |                     |                     d¦  «                             ¦   «         dd¦  «        |¦  «         |  	                    t          j        |                     d	¦  «                             ¦   «         ¦  «        |                     ¦   «         ¦  «         dS )
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Ú
passphraser`   ©rK   Úpassr_   ú&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   rA   ÚmakedirsÚchildÚpathr   Ú
fromStringr	   r   rF   r.   rt   Ú
getContentÚpublic©r2   ÚbaserK   Úkeys       r%   Útest_saveKeyzKeyGenTests.test_saveKeyÇ   sB  € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜hÑ'Ô'Ô,ˆÝŒnÕ/Ñ0Ô0ˆÝ� 8°\ÈYÐWÐWÑXÔXÐXØ×ÒØŒK× Ò Ñ"Ô"Ð"ð DLÀ8À8ÈXÈXÈXðWñ	
ô 	
ð 	
ð 	×ÒØ�NŠN˜4Ÿ:š: hÑ/Ô/×:Ò:Ñ<Ô<¸dÀLÑQÔQÐSVñ	
ô 	
ð 	
ð 	×ÒÝŒN˜4Ÿ:š: lÑ3Ô3×>Ò>Ñ@Ô@ÑAÔAÀ3Ç:Â:Á<Ä<ñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óÄ  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    | j
                             ¦   «         d|›d|›d�¦  «         |  	                    |                     |                     d¦  «                             ¦   «         dd¦  «        |¦  «         |  	                    t          j        |                     d	¦  «                             ¦   «         ¦  «        |                     ¦   «         ¦  «         dS )
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~   r`   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   rA   r†   r‡   rˆ   r   r‰   r   r   rF   r.   rt   rŠ   r‹   rŒ   s       r%   Útest_saveKeyECDSAzKeyGenTests.test_saveKeyECDSAß   sB  € õ ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜jÑ)Ô)Ô.ˆÝŒnÕ1Ñ2Ô2ˆÝ� 8°\ÈYÐWÐWÑXÔXÐXØ×ÒØŒK× Ò Ñ"Ô"Ð"ð DLÀ8À8ÈXÈXÈXðWñ	
ô 	
ð 	
ð 	×ÒØ�NŠN˜4Ÿ:š: jÑ1Ô1×<Ò<Ñ>Ô>ÀÀlÑSÔSÐUXñ	
ô 	
ð 	
ð 	×ÒÝŒN˜4Ÿ:š: nÑ5Ô5×@Ò@ÑBÔBÑCÔCÀSÇZÂZÁ\Ä\ñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óÄ  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    | j
                             ¦   «         d|›d|›d�¦  «         |  	                    |                     |                     d¦  «                             ¦   «         dd¦  «        |¦  «         |  	                    t          j        |                     d	¦  «                             ¦   «         ¦  «        |                     ¦   «         ¦  «         dS )
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~   r`   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   rA   r†   r‡   rˆ   r   r‰   r   r   rF   r.   rt   rŠ   r‹   rŒ   s       r%   Útest_saveKeyEd25519zKeyGenTests.test_saveKeyEd25519ø   sC  € õ ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜lÑ+Ô+Ô0ˆÝŒnÕ7Ñ8Ô8ˆÝ� 8°\ÈYÐWÐWÑXÔXÐXØ×ÒØŒK× Ò Ñ"Ô"Ð"ð DLÀ8À8ÈXÈXÈXðWñ	
ô 	
ð 	
ð 	×ÒØ�NŠN˜4Ÿ:š: lÑ3Ô3×>Ò>Ñ@Ô@À$ÈÑUÔUØñ	
ô 	
ð 	
ð 	×ÒÝŒN˜4Ÿ:š:Ð&6Ñ7Ô7×BÒBÑDÔDÑEÔEÀsÇzÂzÁ|Ä|ñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óÄ  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    | j
                             ¦   «         d|›d|›d�¦  «         |  	                    |                     |                     d¦  «                             ¦   «         dd¦  «        |¦  «         |  	                    t          j        |                     d	¦  «                             ¦   «         ¦  «        |                     ¦   «         ¦  «         dS )
zŠ
        L{_saveKey} will generate key fingerprint in
        L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
        r}   r~   rg   r   r�   r‚   zp.pub
The key fingerprint in <FingerprintFormats=SHA256_BASE64> is:
FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI=
Nr„   r…   rŒ   s       r%   Útest_saveKeysha256zKeyGenTests.test_saveKeysha256  sK  € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜hÑ'Ô'Ô,ˆÝŒnÕ/Ñ0Ô0ˆÝØ˜h°ÈÐXÐXñ	
ô 	
ð 	
ð 	×ÒØŒK× Ò Ñ"Ô"Ð"ð AIÀÀÈ(È(È(ðTñ	
ô 	
ð 	
ð 	×ÒØ�NŠN˜4Ÿ:š: hÑ/Ô/×:Ò:Ñ<Ô<¸dÀLÑQÔQÐSVñ	
ô 	
ð 	
ð 	×ÒÝŒN˜4Ÿ:š: lÑ3Ô3×>Ò>Ñ@Ô@ÑAÔAÀ3Ç:Â:Á<Ä<ñ	
ô 	
ð 	
ð 	
ð 	
r'   c                ó®  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }|                      t          ¦  «        5 }t          ||dddœ¦  «         ddd¦  «         n# 1 swxY w Y   |                      d|j        j        d         ¦  «         dS )zq
        L{_saveKey} raises C{keys.BadFingerprintFormat} when unsupported
        formats are requested.
        r}   r~   rk   r   Nrl   r   )r   rA   r†   r‡   rˆ   r   r‰   r	   rY   r   r   rF   rm   rL   )r2   r�   rK   rŽ   rn   s        r%   Ú test_saveKeyBadFingerPrintformatz,KeyGenTests.test_saveKeyBadFingerPrintformat,  s  € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜hÑ'Ô'Ô,ˆÝŒnÕ/Ñ0Ô0ˆØ×ÒÕ3Ñ4Ô4ð 	¸ÝØØ%¨|À|ÐTÐTñô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 	×ÒØ8¸"¼,Ô:KÈAÔ:Nñ	
ô 	
ð 	
ð 	
ð 	
s   ÂB$Â$B(Â+B(c                óž  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    |                     |                     d¦  «         
                    ¦   «         dd¦  «        |¦  «         dS )úq
        L{_saveKey} will choose an empty string for the passphrase if
        no-passphrase is C{True}.
        r}   Tr`   ©rK   zno-passphraser_   Nr'   )r   rA   r†   r‡   rˆ   r   r‰   r	   r   rF   rŠ   rŒ   s       r%   Útest_saveKeyEmptyPassphrasez'KeyGenTests.test_saveKeyEmptyPassphrase>  s¼   € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜hÑ'Ô'Ô,ˆÝŒnÕ/Ñ0Ô0ˆÝØ˜h¸ÈÐSÐSñ	
ô 	
ð 	
ð 	×ÒØ�NŠN˜4Ÿ:š: hÑ/Ô/×:Ò:Ñ<Ô<¸dÀCÑHÔHÈ#ñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óœ  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    |                     |                     d¦  «         
                    ¦   «         d¦  «        |¦  «         dS )r›   r‘   Tr`   rœ   N)r   rA   r†   r‡   rˆ   r   r‰   r   r   rF   rŠ   rŒ   s       r%   Ú test_saveKeyECDSAEmptyPassphrasez,KeyGenTests.test_saveKeyECDSAEmptyPassphraseN  s°   € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜jÑ)Ô)Ô.ˆÝŒnÕ1Ñ2Ô2ˆÝØ˜h¸ÈÐSÐSñ	
ô 	
ð 	
ð 	×Ò˜Ÿš¨¯
ª
°:Ñ(>Ô(>×(IÒ(IÑ(KÔ(KÈTÑRÔRÐTWÑXÔXÐXÐXÐXr'   c                óœ  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||dddœ¦  «         |  	                    |                     |                     d¦  «         
                    ¦   «         d¦  «        |¦  «         dS )r›   r”   Tr`   rœ   N)r   rA   r†   r‡   rˆ   r   r‰   r   r   rF   rŠ   rŒ   s       r%   Ú"test_saveKeyEd25519EmptyPassphrasez.KeyGenTests.test_saveKeyEd25519EmptyPassphrase\  sº   € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜lÑ+Ô+Ô0ˆÝŒnÕ7Ñ8Ô8ˆÝØ˜h¸ÈÐSÐSñ	
ô 	
ð 	
ð 	×ÒØ�NŠN˜4Ÿ:š: lÑ3Ô3×>Ò>Ñ@Ô@À$ÑGÔGÈñ	
ô 	
ð 	
ð 	
ð 	
r'   c                ó  ‡‡— t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        Šg Šddl}dˆfd„}|                      |j        j        j	        d	ˆfd
„¦  «         t          j        t          ¦  «        }t          |ddddœ|¦  «         |                     d¦  «                             ¦   «         }|                     |dd¦  «        }|                      ||¦  «         dS )zd
        When no path is specified, it will ask for the path used to store the
        key.
        Ú
custom_keyr   NrL   r    r   r   c                 ó2   •— ‰                      d¦  «         dS ©NÚ ©Úappend©rL   Úinput_promptss    €r%   Ú
mock_inputz6KeyGenTests.test_saveKeyNoFilename.<locals>.mock_inputx  ó   ø€ Ø× Ò  Ñ$Ô$Ð$Ø�2r'   Ú_inputSaveFilec                ó   •— ‰S r"   © )r   ÚkeyPaths    €r%   ú<lambda>z4KeyGenTests.test_saveKeyNoFilename.<locals>.<lambda>|  s   ø€ Èg€ r'   Tr`   rœ   r'   ©rL   r    r   r   )r   rA   r†   r‡   rˆ   Útwisted.conch.scripts.ckeygenr/   ÚconchÚscriptsr9   r   r‰   r	   r   rŠ   rF   )	r2   r�   Útwistedr«   rŽ   ÚpersistedKeyContentÚpersistedKeyrª   r°   s	          @@r%   Útest_saveKeyNoFilenamez"KeyGenTests.test_saveKeyNoFilenamel  s  øø€ õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—*’*˜\Ñ*Ô*Ô/ˆØ#%ˆà,Ð,Ð,Ð,ð	ð 	ð 	ð 	ð 	ð 	ð 	�
Š
�7”=Ô(Ô0Ð2BÐDUÐDUÐDUÐDUÑVÔVÐVÝŒnÕ/Ñ0Ô0ˆÝØØ°À	ÐJÐJØñ	
ô 	
ð 	
ð #Ÿjšj¨Ñ6Ô6×AÒAÑCÔCÐØ—~’~Ð&9¸4ÀÑEÔEˆØ×Ò˜˜lÑ+Ô+Ð+Ð+Ð+r'   c                ót  — dd„}t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }|                      t          j        dd„ ¦  «         t          j        t          ¦  «        }|d	d
dœ}|  
                    t          t          |||¦  «         dS )zs
        When the specified file exists, it will ask the user for confirmation
        before overwriting.
        rL   r    r   ú	list[str]c                 ó   — dgS )NÚnr¯   )rL   s    r%   r«   z6KeyGenTests.test_saveKeyFileExists.<locals>.mock_inputŽ  s	   € Ø�5ˆLr'   r£   Úexistsc                ó   — dS )NTr¯   )r   s    r%   r±   z4KeyGenTests.test_saveKeyFileExists.<locals>.<lambda>•  s   € °€ r'   Tr`   rœ   N)rL   r    r   r»   )r   rA   r†   r‡   rˆ   r/   Úosr   r‰   r	   rY   Ú
SystemExitr   )r2   r«   r�   r°   rŽ   rd   s         r%   Útest_saveKeyFileExistsz"KeyGenTests.test_saveKeyFileExistsˆ  s©   € ð	ð 	ð 	ð 	õ ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—*’*˜\Ñ*Ô*Ô/ˆà�
Š
•2”7˜H n nÑ5Ô5Ð5ÝŒnÕ/Ñ0Ô0ˆØ&¸ÈÐSÐSˆØ×Ò�*¥h°°W¸jÑIÔIÐIÐIÐIr'   c                ó  — t          |                      ¦   «         ¦  «        }|                     ¦   «          |                     d¦  «        j        }t          j        t          ¦  «        }t          ||ddddœ¦  «         |  	                    | j
                             ¦   «         d|›d|›d�¦  «         |                     d¦  «                             ¦   «         }|  	                    |                     |d	d¦  «        |¦  «         |                      |                     d
¦  «        ¦  «         |  	                    t          j        |                     d¦  «                             ¦   «         ¦  «        |                     ¦   «         ¦  «         d	S )zi
        L{_saveKey} can be told to write the new private key file in OpenSSH
        v1 format.
        r}   r~   r`   rR   )rK   r€   r_   úprivate-key-subtyper�   r‚   rƒ   Nó$   -----BEGIN OPENSSH PRIVATE KEY-----
r„   )r   rA   r†   r‡   rˆ   r   r‰   r	   r   rF   r.   rt   rŠ   rI   Ú
startswithr‹   )r2   r�   rK   rŽ   ÚprivateKeyContents        r%   Útest_saveKeySubtypeV1z!KeyGenTests.test_saveKeySubtypeV1š  s}  € õ
 ˜Ÿš™œÑ&Ô&ˆØ�Š‰ŒˆØ—:’:˜hÑ'Ô'Ô,ˆÝŒnÕ/Ñ0Ô0ˆÝØà$Ø$Ø#Ø'+ð	ð ñ	
ô 	
ð 	
ð 	×ÒØŒK× Ò Ñ"Ô"Ð"ð DLÀ8À8ÈXÈXÈXðWñ	
ô 	
ð 	
ð !ŸJšJ xÑ0Ô0×;Ò;Ñ=Ô=ÐØ×Ò˜ŸšÐ(9¸4ÀÑNÔNÐPSÑTÔTÐTØ�ŠØ×(Ò(Ð)QÑRÔRñ	
ô 	
ð 	
ð 	×ÒÝŒN˜4Ÿ:š: lÑ3Ô3×>Ò>Ñ@Ô@ÑAÔAÀ3Ç:Â:Á<Ä<ñ	
ô 	
ð 	
ð 	
ð 	
r'   c                ó   — |                       ¦   «         }t          j        t          ¦  «        }t	          |¦  «                             t          ¦  «         t          d|i¦  «         | j         	                    ¦   «          
                    d¦  «                             d¦  «        }|                      ||                     d¦  «        ¦  «         dS )zl
        L{displayPublicKey} prints out the public key associated with a given
        private key.
        rK   ú
ÚasciiÚopensshN)rA   r   r‰   r   r   rs   r	   r   r.   rt   ÚstripÚencoderF   ÚtoString©r2   rK   rN   Ú	displayeds       r%   Útest_displayPublicKeyz!KeyGenTests.test_displayPublicKey¼  s¨   € ð
 —;’;‘=”=ˆÝ”Õ 1Ñ2Ô2ˆÝ�ÑÔ×%Ò%Õ&8Ñ9Ô9Ð9Ý˜* hÐ/Ñ0Ô0Ð0Ø”K×(Ò(Ñ*Ô*×0Ò0°Ñ6Ô6×=Ò=¸gÑFÔFˆ	Ø×Ò˜ F§O¢O°IÑ$>Ô$>Ñ?Ô?Ð?Ð?Ð?r'   c                ó¢  — |                       ¦   «         }t          j        t          ¦  «        }t	          |¦  «                             t          ¦  «         t          |ddœ¦  «         | j         	                    ¦   «          
                    d¦  «                             d¦  «        }|                      ||                     d¦  «        ¦  «         dS )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)rA   r   r‰   r   r   rs   r
   r   r.   rt   rÍ   rÎ   rF   rÏ   rÐ   s       r%   Útest_displayPublicKeyEncryptedz*KeyGenTests.test_displayPublicKeyEncryptedÈ  s«   € ð
 —;’;‘=”=ˆÝ”Õ 1Ñ2Ô2ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCÝ h¸ÐDÐDÑEÔEÐEØ”K×(Ò(Ñ*Ô*×0Ò0°Ñ6Ô6×=Ò=¸gÑFÔFˆ	Ø×Ò˜ F§O¢O°IÑ$>Ô$>Ñ?Ô?Ð?Ð?Ð?r'   c                óÚ  — |                       ¦   «         }t          j        t          ¦  «        }t	          |¦  «                             t          ¦  «         |                      t          dd„ ¦  «         t          d|i¦  «         | j
                             ¦   «                              d¦  «                             d¦  «        }|                      ||                     d¦  «        ¦  «         dS )z›
        L{displayPublicKey} prints out the public key associated with a given
        private key, asking for the passphrase when it's encrypted.
        Úgetpassc                ó   — dS )NrÔ   r¯   )Úxs    r%   r±   zLKeyGenTests.test_displayPublicKeyEncryptedPassphrasePrompt.<locals>.<lambda>Ü  s   € °€ r'   rK   rÊ   rË   rÌ   N)rA   r   r‰   r   r   rs   r
   r/   rØ   r   r.   rt   rÍ   rÎ   rF   rÏ   rÐ   s       r%   Ú.test_displayPublicKeyEncryptedPassphrasePromptz:KeyGenTests.test_displayPublicKeyEncryptedPassphrasePromptÔ  sÂ   € ð
 —;’;‘=”=ˆÝ”Õ 1Ñ2Ô2ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCØ�
Š
•7˜IÐ'<Ð'<Ñ=Ô=Ð=Ý˜* hÐ/Ñ0Ô0Ð0Ø”K×(Ò(Ñ*Ô*×0Ò0°Ñ6Ô6×=Ò=¸gÑFÔFˆ	Ø×Ò˜ F§O¢O°IÑ$>Ô$>Ñ?Ô?Ð?Ð?Ð?r'   c                óÄ   — |                       ¦   «         }t          |¦  «                             t          ¦  «         |                      t
          t          |ddœ¦  «         dS )zŠ
        L{displayPublicKey} fails with a L{BadKeyError} when trying to decrypt
        an encrypted key with the wrong password.
        ÚwrongrÕ   N)rA   r   rs   r
   rY   r   r   r\   s     r%   Ú$test_displayPublicKeyWrongPassphrasez0KeyGenTests.test_displayPublicKeyWrongPassphraseá  s`   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCØ×ÒÝÕ)¸È'Ð+RÐ+Rñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óì  — t          ddd¦  «        }|                      t          d|¦  «         |                      ¦   «         }t	          |¦  «                             t          ¦  «         t          d|i¦  «         |                      | j	         
                    ¦   «                              d¦  «        d¦  «         |                      t          t	          |¦  «                             ¦   «         ¦  «         dS )zt
        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Ø   rA   r   rs   r
   r   rF   r.   rt   rÍ   ÚassertNotEqualrŠ   )r2   ÚoldNewConfirmrK   s      r%   Útest_changePassphrasez!KeyGenTests.test_changePassphraseì  sß   € õ
 $ K°¸IÑFÔFˆØ�
Š
•7˜I }Ñ5Ô5Ð5à—;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCå˜* hÐ/Ñ0Ô0Ð0Ø×ÒØŒK× Ò Ñ"Ô"×(Ò(¨Ñ.Ô.ØIñ	
ô 	
ð 	
ð 	×ÒÝ(­(°8Ñ*<Ô*<×*GÒ*GÑ*IÔ*Iñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óì  — t          dd¦  «        }|                      t          d|¦  «         |                      ¦   «         }t	          |¦  «                             t          ¦  «         t          |ddœ¦  «         |                      | j	         
                    ¦   «                              d¦  «        d¦  «         |                      t          t	          |¦  «                             ¦   «         ¦  «         dS )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_changePassphraseWithOldz(KeyGenTests.test_changePassphraseWithOld   sà   € õ
 ! ¨IÑ6Ô6ˆ
Ø�
Š
•7˜I zÑ2Ô2Ð2à—;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCå h¸ÐDÐDÑEÔEÐEØ×ÒØŒK× Ò Ñ"Ô"×(Ò(¨Ñ.Ô.ØIñ	
ô 	
ð 	
ð 	×ÒÝ(­(°8Ñ*<Ô*<×*GÒ*GÑ*IÔ*Iñ	
ô 	
ð 	
ð 	
ð 	
r'   c                ó–  — |                       ¦   «         }t          |¦  «                             t          ¦  «         t	          |dddœ¦  «         |                      | j                             ¦   «                              d¦  «        d¦  «         |  	                    t          t          |¦  «         
                    ¦   «         ¦  «         dS )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)rA   r   rs   r
   r   rF   r.   rt   rÍ   rã   rŠ   r\   s     r%   Útest_changePassphraseWithBothz)KeyGenTests.test_changePassphraseWithBoth  sÆ   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCåØ!¨;À<ÐPÐPñ	
ô 	
ð 	
ð 	×ÒØŒK× Ò Ñ"Ô"×(Ò(¨Ñ.Ô.ØIñ	
ô 	
ð 	
ð 	×ÒÝ(­(°8Ñ*<Ô*<×*GÒ*GÑ*IÔ*Iñ	
ô 	
ð 	
ð 	
ð 	
r'   c                ó~  — |                       ¦   «         }t          |¦  «                             t          ¦  «         |                      t
          t          |ddœ¦  «        }|                      dt          |¦  «        ¦  «         |                      t          t          |¦  «         	                    ¦   «         ¦  «         dS )zŽ
        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)
rA   r   rs   r
   rY   rÁ   r   rF   r   rŠ   ©r2   rK   Úerrors      r%   Ú$test_changePassphraseWrongPassphrasez0KeyGenTests.test_changePassphraseWrongPassphrase'  s«   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCØ×!Ò!ÝÕ(°xÈÐ*QÐ*Qñ
ô 
ˆð 	×ÒØ?ÅÀUÁÄñ	
ô 	
ð 	
ð 	×ÒÕ5µxÀÑ7IÔ7I×7TÒ7TÑ7VÔ7VÑWÔWÐWÐWÐWr'   c                óÎ  — |                       t          dt          d¦  «        ¦  «         |                      ¦   «         }t	          |¦  «                             t          ¦  «         |                      t          t          d|i¦  «        }|  
                    dt          |¦  «        ¦  «         |  
                    t          t	          |¦  «                             ¦   «         ¦  «         dS )zƒ
        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)   rA   r   rs   r
   rY   rÁ   r   rF   r   rŠ   rí   s      r%   Ú!test_changePassphraseEmptyGetPassz-KeyGenTests.test_changePassphraseEmptyGetPass6  sÀ   € ð
 	�
Š
•7˜I¥{°2¡¤Ñ7Ô7Ð7Ø—;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCØ×!Ò!¥*Õ.>ÀÈXÐ@VÑWÔWˆØ×Òð#å�‰JŒJñ	
ô 	
ð 	
ð
 	×ÒÕ5µxÀÑ7IÔ7I×7TÒ7TÑ7VÔ7VÑWÔWÐWÐWÐWr'   c                ól  — |                       ¦   «         }t          |¦  «                             d¦  «         |                      t          t
          d|i¦  «        }d}|                      |t          |¦  «        ¦  «         |                      dt          |¦  «                             ¦   «         ¦  «         dS )zc
        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)	rA   r   rs   rY   rÁ   r   rF   r   rŠ   )r2   rK   rî   Úexpecteds       r%   Útest_changePassphraseBadKeyz'KeyGenTests.test_changePassphraseBadKeyF  s›   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò% iÑ0Ô0Ð0Ø×!Ò!¥*Õ.>ÀÈXÐ@VÑWÔWˆàWˆØ×Ò˜¥3 u¡:¤:Ñ.Ô.Ð.Ø×Ò˜¥H¨XÑ$6Ô$6×$AÒ$AÑ$CÔ$CÑDÔDÐDÐDÐDr'   c                ó¾  — |                       ¦   «         }t          |¦  «                             t          ¦  «         dd„}|                      t
          d|¦  «         |                      t          t          |dd	œ¦  «        }|  	                    d
t          |¦  «        ¦  «         |  	                    t          t          |¦  «                             ¦   «         ¦  «         dS )zŸ
        L{changePassPhrase} doesn't modify the key file if an unexpected error
        happens when trying to create the key with the new passphrase.
        rL   r    Úkwargsr   r   c                 ó    — t          d¦  «        ‚)NÚoops)ÚRuntimeError©rL   rö   s     r%   rÏ   z>KeyGenTests.test_changePassphraseCreateError.<locals>.toString[  s   € Ý˜vÑ&Ô&Ð&r'   rÏ   rê   ©rK   rà   z!Could not change passphrase: oopsN)rL   r    rö   r    r   r   ©rA   r   rs   r	   r/   r   rY   rÁ   r   rF   r   rŠ   )r2   rK   rÏ   rî   s       r%   Ú test_changePassphraseCreateErrorz,KeyGenTests.test_changePassphraseCreateErrorS  sÐ   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&8Ñ9Ô9Ð9ð	'ð 	'ð 	'ð 	'ð 	�
Š
•3˜
 HÑ-Ô-Ð-à×!Ò!ÝÝØ!¨lÐ;Ð;ñ
ô 
ˆð 	×ÒÐ<½cÀ%¹j¼jÑIÔIÐIà×ÒÕ+­X°hÑ-?Ô-?×-JÒ-JÑ-LÔ-LÑMÔMÐMÐMÐMr'   c                óÂ  — |                       ¦   «         }t          |¦  «                             t          ¦  «         dd„}|                      t
          d|¦  «         |                      t          t          |dd	œ¦  «        }d
}|  	                    |t          |¦  «        ¦  «         |  	                    t          t          |¦  «                             ¦   «         ¦  «         dS )zq
        L{changePassPhrase} doesn't modify the key file if C{toString} returns
        an empty string.
        rL   r    rö   r   r   c                 ó   — dS r¥   r¯   rú   s     r%   rÏ   zCKeyGenTests.test_changePassphraseEmptyStringError.<locals>.toStringr  s   € Ø�2r'   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_changePassphraseEmptyStringErrorz1KeyGenTests.test_changePassphraseEmptyStringErrorj  sÕ   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&8Ñ9Ô9Ð9ð	ð 	ð 	ð 	ð 	�
Š
•3˜
 HÑ-Ô-Ð-à×!Ò!ÝÝØ!¨lÐ;Ð;ñ
ô 
ˆð OˆØ×Ò˜¥3 u¡:¤:Ñ.Ô.Ð.à×ÒÕ+­X°hÑ-?Ô-?×-JÒ-JÑ-LÔ-LÑMÔMÐMÐMÐMr'   c                ó~  — |                       ¦   «         }t          |¦  «                             t          ¦  «         |                      t
          t          |ddœ¦  «        }|                      dt          |¦  «        ¦  «         |                      t          t          |¦  «         	                    ¦   «         ¦  «         dS )z†
        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)
rA   r   rs   r   rY   rÁ   r   rF   r   rŠ   rí   s      r%   Útest_changePassphrasePublicKeyz*KeyGenTests.test_changePassphrasePublicKey‚  s£   € ð
 —;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&7Ñ8Ô8Ð8Ø×!Ò!ÝÕ(°xÈFÐ*SÐ*Sñ
ô 
ˆð 	×ÒÐIÍ3ÈuÉ:Ì:ÑVÔVÐVØ×ÒÕ*­H°XÑ,>Ô,>×,IÒ,IÑ,KÔ,KÑLÔLÐLÐLÐLr'   c                óB  — t          ddd¦  «        }|                      t          d|¦  «         |                      ¦   «         }t	          |¦  «                             t          ¦  «         t          |ddœ¦  «         |                      | j	         
                    ¦   «                              d¦  «        d¦  «         t	          |¦  «                             ¦   «         }|                      t          |¦  «         |                      |                     d¦  «        ¦  «         d	S )
zq
        L{changePassPhrase} can be told to write the new private key file in
        OpenSSH v1 format.
        rÔ   rà   rØ   rR   )rK   rÄ   rÊ   rá   rÅ   N)r)   r/   rØ   rA   r   rs   r
   r   rF   r.   rt   rÍ   rŠ   rã   rI   rÆ   )r2   rä   rK   rÇ   s       r%   Útest_changePassphraseSubtypeV1z*KeyGenTests.test_changePassphraseSubtypeV1�  s  € õ
 $ K°¸IÑFÔFˆØ�
Š
•7˜I }Ñ5Ô5Ð5à—;’;‘=”=ˆÝ�ÑÔ×%Ò%Õ&BÑCÔCÐCå hÀtÐLÐLÑMÔMÐMØ×ÒØŒK× Ò Ñ"Ô"×(Ò(¨Ñ.Ô.ØIñ	
ô 	
ð 	
õ % XÑ.Ô.×9Ò9Ñ;Ô;ÐØ×ÒÕ8Ð:KÑLÔLÐLØ�ŠØ×(Ò(Ð)QÑRÔRñ	
ô 	
ð 	
ð 	
ð 	
r'   c                óx  ‡— g Šdˆfd„}ddi}t          ||¦  «        }|                      |d         d¦  «         |                      |                     t          j                             dd	¦  «        ¦  «        ¦  «         |                      d
t          ‰¦  «        ¦  «         |                      dg‰¦  «         dS )zg
        L{options} will default to "~/.ssh/id_rsa" if the user doesn't
        specify a key.
        rL   r    r   r   c                 ó2   •— ‰                      d¦  «         dS r¥   r§   r©   s    €r%   r«   z5KeyGenTests.test_useDefaultForKey.<locals>.mock_input¬  r¬   r'   rK   r¦   z.sshr}   é   Nr²   )r   rF   rI   ÚendswithrÀ   rˆ   ÚjoinÚlen)r2   r«   rd   rK   rª   s       @r%   Útest_useDefaultForKeyz!KeyGenTests.test_useDefaultForKey¥  sÖ   ø€ ð
 $&ˆð	ð 	ð 	ð 	ð 	ð 	ð ˜rÐ"ˆå# G¨ZÑ8Ô8ˆØ×ÒØ�JÔØñ	
ô 	
ð 	
ð
 	�Š˜×)Ò)­"¬'¯,ª,°v¸xÑ*HÔ*HÑIÔIÑJÔJÐJð 	×Ò˜�C Ñ.Ô.Ñ/Ô/Ð/Ø×Ò˜"˜˜}Ñ-Ô-Ð-Ð-Ð-r'   c                ó’   — ddi}|                       t          t          |¦  «        }|                      d|j        d         ¦  «         dS )z‹
        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)rY   rÁ   r   ÚassertInrL   ©r2   rd   Úexcs      r%   Ú'test_displayPublicKeyHandleFileNotFoundz3KeyGenTests.test_displayPublicKeyHandleFileNotFound¾  sG   € ð
 ˜zÐ*ˆØ×Ò¥
Õ,<¸gÑFÔFˆØ�ŠÐCÀSÄXÈaÄ[ÑQÔQÐQÐQÐQr'   c                ó’   — ddi}|                       t          t          |¦  «        }|                      d|j        d         ¦  «         dS )úN
        Ensure FileNotFoundError is handled for an invalid filename.
        rK   r  r  r   N)rY   rÁ   r   r  rL   r  s      r%   Ú'test_changePassPhraseHandleFileNotFoundz3KeyGenTests.test_changePassPhraseHandleFileNotFoundÇ  sG   € ð ˜zÐ*ˆØ×Ò¥
Õ,<¸gÑFÔFˆØ�ŠÐCÀSÄXÈaÄ[ÑQÔQÐQÐQÐQr'   c                ó”   — dddœ}|                       t          t          |¦  «        }|                      d|j        d         ¦  «         dS )r  r  r`   rq   r  r   N)rY   rÁ   r   r  rL   r  s      r%   Ú'test_printFingerprintHandleFileNotFoundz3KeyGenTests.test_printFingerprintHandleFileNotFoundÏ  sJ   € ð  *°YÐ?Ð?ˆØ×Ò¥
Õ,<¸gÑFÔFˆØ�ŠÐCÀSÄXÈaÄ[ÑQÔQÐQÐQÐQr'   )r   r,   )NN)r4   r   r5   r6   r7   r6   r   r,   ),Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   rO   rV   r]   re   ri   ro   ru   rw   ry   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+   B   s’  € € € € € ðð ð/ð /ð /ð /ð #Ø(,ð	+ð +ð +ð +ð +ð.5ð 5ð 5ð 5ðLð Lð Lð Lð
Eð Eð Eð EðKð Kð Kð Kð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð0
ð 
ð 
ð 
ð2
ð 
ð 
ð 
ð4
ð 
ð 
ð 
ð4
ð 
ð 
ð 
ð$
ð 
ð 
ð 
ð Yð Yð Yð Yð
ð 
ð 
ð 
ð ,ð ,ð ,ð ,ð8Jð Jð Jð Jð$ 
ð  
ð  
ð  
ðD
@ð 
@ð 
@ð 
@ð
@ð 
@ð 
@ð 
@ð@ð @ð @ð @ð	
ð 	
ð 	
ð 	
ð
ð 
ð 
ð 
ð(
ð 
ð 
ð 
ð(
ð 
ð 
ð 
ð&Xð Xð Xð XðXð Xð Xð Xð Eð Eð Eð EðNð Nð Nð Nð.Nð Nð Nð Nð0Mð Mð Mð Mð
ð 
ð 
ð 
ð,.ð .ð .ð .ð2Rð Rð Rð RðRð Rð Rð RðRð Rð Rð Rð Rð Rr'   r+   )r   r   r   r   )(r  Ú
__future__r   rØ   rÀ   rC   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>r&     s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø +Ð +Ð +Ð +Ð +Ð +à€=�Ñ Ô ð Eðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð E€Dðð ð ð ð$S
Rð S
Rð S
Rð S
Rð S
R�(ñ S
Rô S
Rð S
Rð S
Rð S
Rr'   