Ë
    oj•0  ã                  ó~  — 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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 ddlmZ dd	lmZmZmZmZ ej                  ej2                  k(  r	 ddlZej6                  ej8                  f  e «       Z!d„ Z" G d„ dejF                  «      Z$d„ Z%d„ Z&d„ Z' e"d«      d„ «       Z( e"d«      d„ «       Z) e"d«      d„ «       Z* e"d«      d„ «       Z+d„ Z,	 	 d!	 	 	 	 	 	 	 d"d„Z-d#d„Z.d„ Z/d„ Z0d$d„Z1	 d%	 	 	 	 	 	 	 d&d„Z2e3d k(  r e%«        yy# eef$ r dej>                  d
<    ee«       Y Œºw xY w)'z2
Implementation module for the `ckeygen` command.
é    )ÚannotationsN)ÚCallable)Úwraps)Úreload)ÚAnyÚDictÚOptional)Úkeys)ÚfailureÚfilepathÚlogÚusageÚtermiosc                ó   ‡ — ˆ fd„}|S )Nc                óB   •‡ — t        ‰ «      ˆ fd„«       }|t        ‰<   |S )Nc                 ó   •—  ‰| i |¤ŽS ©N© )ÚargsÚkwargsÚkeygenerators     €ú?/usr/lib/python3/dist-packages/twisted/conch/scripts/ckeygen.pyÚwrapperz:_keyGenerator.<locals>.assignkeygenerator.<locals>.wrapper%   s   ø€ á Ð0¨Ñ0Ð0ó    )r   ÚsupportedKeyTypes)r   r   ÚkeyTypes   ` €r   Úassignkeygeneratorz)_keyGenerator.<locals>.assignkeygenerator$   s,   ù€ Ü	ˆ|Ó	ó	1ó 
ð	1ð &-Ô˜'Ñ"Øˆr   r   )r   r   s   ` r   Ú_keyGeneratorr   #   s   ø€ ôð Ðr   c            	      ó  — e Zd ZdZdZg d¢g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢gZg d¢g d¢g d¢g d¢g d¢gZ ej                   ej                   e
ej                  «       «      «       ej                  ddg«      dœ¬«      Zy)ÚGeneralOptionszUsage:    ckeygen [options]
 z8ckeygen manipulates public/private keys in various ways.)ÚbitsÚbNz$Number of bits in the key to create.)ÚfilenameÚfNzFilename of the key file.)ÚtypeÚtNzSpecify type of key to create.)ÚcommentÚCNzProvide new comment.)ÚnewpassÚNNzProvide new passphrase.)ÚpassÚPNzProvide old passphrase.)ÚformatÚoúsha256-base64zFingerprint format of key file.)úprivate-key-subtypeNNz5OpenSSH private key subtype to write ("PEM" or "v1").)ÚfingerprintÚlzShow fingerprint of key file.)Ú
changepassÚpz&Change passphrase of private key file.)ÚquietÚqzQuiet.)úno-passphraseNz"Create the key with no passphrase.)ÚshowpubÚyz+Read private key file and print public key.ÚPEMÚv1)r%   r0   )Ú
optActionsN)Ú__name__Ú
__module__Ú__qualname__ÚsynopsisÚlongdescÚoptParametersÚoptFlagsr   ÚCompletionsÚCompleteListÚlistr   r
   ÚcompDatar   r   r   r    r    /   s™   „ ð€Hð J€Hò 	DÚ<Ú=Ú6Ú9Ú6ÚKò	
ð€Mò" 	>ÚEÚ ÚEÚGð€Hð !ˆu× Ñ à&�E×&Ñ&¡tÐ,=×,BÑ,BÓ,DÓ'EÓFØ#5 5×#5Ñ#5°u¸d°mÓ#Dñ
ô�Hr   r    c            	     ó  — t        «       } 	 | j                  t        j                  dd  «       t        j                  «        t        t        _        | d   rŠ| d   j                  «       t        v r1t        d| d   z  «       t        | d   j                  «          | «       y t        j                  d| d   ›ddj                  t        j!                  «       «      ›�«       y | d   rt#        | «       y | d	   rt%        | «       y | d
   rt'        | «       y | j                  «        t        j                  d«       y # t        j
                  $ r>}t        d|z  «       | j                  «        t        j                  d«       Y d }~�ŒWd }~ww xY w)Né   z	ERROR: %sr%   z&Generating public/private %s key pair.zKey type was z, must be one of z, r1   r3   r8   )r    ÚparseOptionsÚsysÚargvr   Ú
UsageErrorÚprintÚopt_helpÚexitr   ÚdiscardLogsÚhandleErrorÚdeferrÚlowerr   Újoinr
   ÚprintFingerprintÚchangePassPhraseÚdisplayPublicKey)ÚoptionsÚus     r   Úrunr[   U   s7  € ÜÓ€GðØ×ÑœSŸX™X a b˜\Ô*ô
 ‡O�OÔÜ„C„JØˆv‚Ø�6‰?× Ñ Ó"Ô&7Ñ7ÜÐ:¸gÀf¹oÑNÔOÜ˜g f™o×3Ñ3Ó5Ñ6°wÕ?ä�HŠHà˜6“? D§I¡IÔ.?×.DÑ.DÓ.FÔ$GðIõð 
�Ò	Ü˜Õ!Ø	�Ò	Ü˜Õ!Ø	�Ò	Ü˜Õ!à×ÑÔÜ�‰��øô/ ×Ñò Üˆk˜A‰oÔØ×ÑÔÜ�‰��Šûðús   Œ"D9 Ä9F
Å3FÆF
c                óÔ   — | d   dk(  rt         j                  j                  | d<   | S | d   dk(  rt         j                  j                  | d<   | S t        j                  d| d   › �«      ‚)Nr-   zmd5-hexr/   z Unsupported fingerprint format: )r
   ÚFingerprintFormatsÚMD5_HEXÚSHA256_BASE64ÚBadFingerPrintFormat)rY   s    r   Úenumrepresentationra   s   su   € ØˆxÑ˜IÒ%Ü ×3Ñ3×;Ñ;ˆ�ÑØˆØ	�Ñ	˜oÒ	-Ü ×3Ñ3×AÑAˆ�ÑØˆä×'Ñ'Ø.¨w°xÑ/@Ð.AÐBó
ð 	
r   c                 óV   — da t        j                  t        j                  «       «       ‚ )Né   )Ú
exitStatusr   Úerrr   ÚFailurer   r   r   rR   rR   €   s   € à€JÜ‡G�GŒG�O‰OÓÔØ	r   Úrsac                ó¼   — ddl m} ddlm} | d   sd| d<   |j	                  t        | d   «      d |«       ¬«      }t        j                  |«      }t        || «       y )Nr   ©Údefault_backend)rg   r!   i   i  )Úkey_sizeÚpublic_exponentÚbackend)	Úcryptography.hazmat.backendsrj   Ú)cryptography.hazmat.primitives.asymmetricrg   Úgenerate_private_keyÚintr
   ÚKeyÚ_saveKey)rY   rj   rg   ÚkeyPrimitiveÚkeys        r   ÚgenerateRSAkeyrv   ‡   s\   € å<Ý=à�6Š?Øˆ�‰Ø×+Ñ+Ü�W˜V‘_Ó%ØÙÓ!ð ,ó €Lô
 �(‰(�<Ó
 €CÜˆS�'Õr   Údsac                óº   — ddl m} ddlm} | d   sd| d<   |j	                  t        | d   «       |«       ¬«      }t        j                  |«      }t        || «       y )Nr   ri   )rw   r!   i   )rk   rm   )	rn   rj   ro   rw   rp   rq   r
   rr   rs   )rY   rj   rw   rt   ru   s        r   ÚgenerateDSAkeyry   —   sY   € å<Ý=à�6Š?Øˆ�‰Ø×+Ñ+Ü�W˜V‘_Ó%ÙÓ!ð ,ó €Lô �(‰(�<Ó
 €CÜˆS�'Õr   Úecdsac                ó  — ddl m} ddlm} | d   sd| d<   dt	        | d   «      j                  d«      z   }|j                  t        j                  |    |«       ¬«      }t        j                  |«      }t        || «       y )	Nr   ri   )Úecr!   é   s   ecdsa-sha2-nistpÚascii)Úcurverm   )rn   rj   ro   r|   ÚstrÚencoderp   r
   Ú_curveTablerr   rs   )rY   rj   r|   r   rt   ru   s         r   ÚgenerateECDSAkeyrƒ   ¦   sz   € å<Ý<à�6Š?Øˆ�‰ð  ¤# g¨f¡oÓ"6×"=Ñ"=¸gÓ"FÑF€EØ×*Ñ*Ü×Ñ˜uÑ%©Ó/@ð +ó €Lô �(‰(�<Ó
 €CÜˆS�'Õr   Úed25519c                ó‚   — t         j                  j                  «       }t        j                  |«      }t	        || «       y r   )r
   ÚEd25519PrivateKeyÚgeneraterr   rs   )rY   rt   ru   s      r   ÚgenerateEd25519keyrˆ   ·   s.   € ä×)Ñ)×2Ñ2Ó4€LÜ
�(‰(�<Ó
 €CÜˆS�'Õr   c                ó   — | dk(  ryy)a  
    Return a reasonable default private key subtype for a given key type.

    @type keyType: L{str}
    @param keyType: A key type, as returned by
        L{twisted.conch.ssh.keys.Key.type}.

    @rtype: L{str}
    @return: A private OpenSSH key subtype (C{'PEM'} or C{'v1'}).
    ÚEd25519r;   r:   r   )r   s    r   Ú_defaultPrivateKeySubtyper‹   ¾   s   € ð �)Òààr   c                ó
  — |€t         }| d   }|sjt        j                  j                  d|› �«      }t	        j
                  «       dk(  r"t        j                  j                  d|› �«      } |d|z  «      xs |}t        |«      S )a  
    If C{options["filename"]} is None, prompt the user to enter a path
    or attempt to set it to .ssh/id_rsa
    @param options: command line options
    @param inputCollector: dependency injection for testing
    @param keyTypeName: key type or "rsa"
    r#   z
~/.ssh/id_ÚWindowsz%HOMEPATH %\.ssh\id_z%Enter file in which the key is (%s): )ÚinputÚosÚpathÚ
expanduserÚplatformÚsystemr€   )rY   ÚinputCollectorÚkeyTypeNamer#   s       r   Ú_getKeyOrDefaultr–   Ð   s‰   € ð ÐÜˆØ�zÑ"€HÙÜ—7‘7×%Ñ%¨
°;°-Ð&@ÓAˆÜ�?‰?Ó 	Ò)Ü—w‘w×)Ñ)Ð-AÀ+ÀÐ*OÓPˆHáÐBÀXÑMÓNò Øð 	ô ˆx‹=Ðr   c           	     óþ  — t        | «      }t        j                  j                  |dz   «      r|dz  }t	        | «      } 	 t
        j                  j                  |«      }t        |j                  «       ›d|j                  | d   «      ›dt        j                  j                  |«      ›�«       y # t
        j                  $ r t        j                  d«       Y y t        $ r t        j                  |› d�«       Y y w xY w)Nú.pubú r-   zbad keyú, could not be opened, please specify a file.)r–   r�   r�   Úexistsra   r
   rr   ÚfromFilerN   Úsizer1   ÚbasenameÚBadKeyErrorrK   rP   ÚFileNotFoundError)rY   r#   ru   s      r   rV   rV   ê   sË   € Ü Ó(€HÜ	‡w�w‡~�~�h Ñ'Ô(Ø�FÑˆÜ  Ó)€GðLÜ�h‰h×Ñ Ó)ˆÜð —‘•
Ø—‘ ¨Ñ 1Õ2Ü—‘× Ñ  Ô*ð	õ	
øô ×Ñò Ü�‰�ÖÜò LÜ�‰�H�:ÐIÐJÖKðLús   ¿A/B/ Â/(C<Ã C<Ã;C<c                óˆ  — t        | «      }	 t        j                  j                  |«      }| j                  d«      sB	 t        j                  d«      }t        j                  d	«      }||k(  rnt        d
«       Œ<|| d<   | j                  d«      €t        j                  «       «      | d<   	 j                  d| d   | d   ¬«      }	 t        j                  j!                  | d   ¬«       t#        |d«      5 }|j%                  «       d d d «       t        d«       y # t        j                  $ r´ | j                  d«      st        j                  d«      | d<   	 t        j                  j                  || d   ¬«      }na# t        j                  $ r t        j                  d«       Y n7t        j                  $ r"}t        j                  d|› �«       Y d }~nd }~ww xY wY �Œ¸t        j                  $ r#}t        j                  d|› �«       Y d }~�Œèd }~wt        $ r t        j                  |› d�«       Y �Œw xY w# t        $ r#}t        j                  d|› �«       Y d }~�ŒŸd }~ww xY w# t        j                  t        j                  f$ r#}t        j                  d|› �«       Y d }~�ŒÃd }~ww xY w# 1 sw Y   �Œ¯xY w)Nr+   zEnter old passphrase: ©Ú
passphrasez1Could not change passphrase: old passphrase errorzCould not change passphrase: rš   r)   z0Enter new passphrase (empty for no passphrase): úEnter same passphrase again: ú%Passphrases do not match.  Try again.r0   Úopenssh©Úsubtyper£   Úwbz;Your identification has been saved with the new passphrase.)r–   r
   rr   rœ   ÚEncryptedKeyErrorÚgetÚgetpassrŸ   rK   rP   r    rN   r‹   r%   ÚtoStringÚ	ExceptionÚ
fromStringÚopenÚwrite)rY   r#   ru   ÚeÚp1Úp2Ú
newkeydataÚfds           r   rW   rW   ÿ   sm  € Ü Ó(€HðLÜ�h‰h×Ñ Ó)ˆð  �;‰;�yÔ!ØÜ—‘Ð!SÓTˆBÜ—‘Ð!@ÓAˆBØ�RŠxØÜÐ9Ô:ð ð  ˆ�	Ñà‡{�{Ð(Ó)Ð1Ü)BÀ3Ç8Á8Ã:Ó)NˆÐ%Ñ&ð6Ø—\‘\ØØÐ1Ñ2Ø˜yÑ)ð "ó 
ˆ
ð6Ü�‰×Ñ˜J°7¸9Ñ3EÐÔFô 
ˆh˜Ó	ð  Ø
�‰�Ô÷ô 
Ð
GÕHøôY ×!Ñ!ò 	:à�{‰{˜6Ô"Ü%Ÿo™oÐ.FÓGˆG�F‰Oð	:Ü—(‘(×#Ñ# H¸À¹Ð#ÓI‰CøÜ×Ñò 	JÜ�H‰HÐHÖIÜ×%Ñ%ò 	:Ü�H‰HÐ4°Q°CÐ8×9Ñ9ûð	:ýä×Ñò 6Ü�‰Ð0°°Ð4×5Ò5ûÜò LÜ�‰�H�:ÐIÐJ×KðLûô* ò 6Ü�‰Ð0°°Ð4×5Ò5ûð6ûô
 ×"Ñ"¤D×$4Ñ$4Ð5ò 6Ü�‰Ð0°°Ð4×5Ò5ûð6ú÷ñ ús•   �D Â-H? Ã$I. Ã8J7Ä<H<Å$F Å?H<Æ (GÆ(H<Æ*GÆ<GÇH<ÇGÇH<Ç$H<Ç6HÈ$H<È;H<È?	I+ÉI&É&I+É.#J4ÊJ/Ê/J4Ê7Kc                óÜ  — t        | «      }	 t        j                  j                  |«      }j                  «       j                  d«      j                  d«      }t        |«       y # t        $ r t        j                  |› d�«       Y Œ]t        j                  $ rP | j                  d«      st        j                  d«      | d<   t        j                  j                  || d   ¬«      }Y Œ¾w xY w)Nrš   r+   zEnter passphrase: r¢   r¦   r~   )r–   r
   rr   rœ   r    rK   rP   rª   r«   r¬   Úpublicr­   ÚdecoderN   )rY   r#   ru   Ú
displayKeys       r   rX   rX   2  sÃ   € Ü Ó(€HðFÜ�h‰h×Ñ Ó)ˆð —‘“×&Ñ& yÓ1×8Ñ8¸ÓA€JÜ	ˆ*Õøô ò LÜ�‰�H�:ÐIÐJÖKÜ×!Ñ!ò FØ�{‰{˜6Ô"Ü%Ÿo™oÐ.BÓCˆG�F‰OÜ�h‰h×Ñ °W¸V±_ÐÓEŠðFús   �A& Á&!C+Â	AC+Ã*C+c                ó   — t        | «      S )zv
    Ask the user where to save the key.

    This needs to be a separate function so the unit test can patch it.
    )rŽ   )Úprompts    r   Ú_inputSaveFiler½   @  s   € ô �‹=Ðr   c                ó¸  — |€t         }dddddœ}|| j                  «          }|d   }|s0t        |||«      }t        d|› d	�«      }|j	                  «       xs |}t
        j                  j                  |«      r@t        |› d
�«        |d«      }|d   j                  «       dk7  rt        j                  «        |j                  d«      rd|d<   nG|d   sB	 t        j                  d«      }	t        j                  d«      }
|	|
k(  rnt        d«       Œ<|	|d<   |j                  d«      €t        | j                  «       «      |d<   t        j                  «       › dt!        j"                  «       › �}t%        j&                  |«      }|j)                  | j+                  d|d   |d   ¬«      «       |j-                  d«       t%        j&                  |dz   «      j)                  | j/                  «       j+                  d|¬«      «       t1        |«      }t        d|› �«       t        d|› d�«       t        d|d   › d�«       t        | j3                  |d   «      «       y) zÀ
    Persist a SSH key on local filesystem.

    @param key: Key which is persisted on local filesystem.

    @param options:

    @param inputCollector: Dependency injection for testing.
    Nrz   r„   rg   rw   )ÚECrŠ   ÚRSAÚDSAr#   z%Enter file in which to save the key (z): z already exists.zOverwrite (y/n)? r   r9   r7   r   r+   z,Enter passphrase (empty for no passphrase): r¤   r¥   r0   ú@r¦   r§   i€�  r˜   )r'   z&Your identification has been saved in z"Your public key has been saved in zThe key fingerprint in r-   z is:)rŽ   r%   r–   r½   Ústripr�   r�   r›   rN   rT   rK   rP   r«   r¬   r‹   ÚgetuserÚsocketÚgethostnamer   ÚFilePathÚ
setContentr­   Úchmodr¸   ra   r1   )ru   rY   r”   ÚKeyTypeMappingr•   r#   ÚdefaultPathÚnewPathÚynr³   r´   r'   Úfps                r   rs   rs   I  s@  € ð ÐÜˆØ#°	À%ÐPUÑV€NØ  §¡£Ñ,€KØ�zÑ"€HÙÜ& w°ÀÓLˆÜ Ø3°K°=ÀÐDó
ˆð —=‘=“?Ò1 kˆä	‡w�w‡~�~�hÔÜ��
Ð*Ð+Ô,ÙÐ/Ó0ˆØˆa‰5�;‰;‹=˜CÒÜ�H‰HŒJà‡{�{�?Ô#Øˆ�ŠØ�VŠ_ØÜ—‘Ð!OÓPˆBÜ—‘Ð!@ÓAˆBØ�RŠxØÜÐ9Ô:ð ð ˆ�‰à‡{�{Ð(Ó)Ð1Ü)BÀ3Ç8Á8Ã:Ó)NˆÐ%Ñ&ä—‘Ó"Ð# 1¤V×%7Ñ%7Ó%9Ð$:Ð;€Gä	×	Ñ	˜8Ó	$€BØ‡M�MØ�‰ØØÐ1Ñ2Ø˜v‘ð 	ó 	
ôð ‡H�HˆXÔä×Ñ�h Ñ'Ó(×3Ñ3Ø�
‰
‹×Ñ˜i°ÐÓ9ôô ! Ó)€Gä	Ð2°8°*Ð
=Ô>Ü	Ð.¨x¨j¸Ð
=Ô>Ü	Ð# G¨HÑ$5Ð#6°dÐ
;Ô<Ü	ˆ#�/‰/˜' (Ñ+Ó
,Õ-r   Ú__main__)Nrg   )rY   úDict[Any, Any]r”   úOptional[Callable[[str], str]]r•   r€   Úreturnr€   )rY   rÐ   rÒ   ÚNone)r¼   r€   rÒ   r€   r   )ru   zkeys.KeyrY   rÐ   r”   rÑ   rÒ   rÓ   )4Ú__doc__Ú
__future__r   r¬   r�   r’   rÅ   rK   Úcollections.abcr   Ú	functoolsr   Ú	importlibr   Útypingr   r   r	   Útwisted.conch.sshr
   Útwisted.pythonr   r   r   r   Úunix_getpassr   Ú	tcgetattrÚ	tcsetattrÚImportErrorÚAttributeErrorÚmodulesÚdictr   r   ÚOptionsr    r[   ra   rR   rv   ry   rƒ   rˆ   r‹   r–   rV   rW   rX   r½   rs   r=   r   r   r   ú<module>rä      s¸  ðñ
õ #ã Û 	Û Û Û 
Ý $Ý Ý ß &Ñ &å "ß 8Ó 8à
‡?�?�g×*Ñ*Ò*ðÛà×Ñ˜7×,Ñ,Ñ,ñ
 “FÐ ò	ô#�U—]‘]ô #òLò<

ò
ñ ˆuÓñó ðñ ˆuÓñó ðñ ˆwÓñó ðñ  ˆyÓñó ðòð( 6:ØðØðà2ðð ðð 	ó	ó4Lò*0Iòfóð 6:ðC.Ø	ðC.àðC.ð 3ðC.ð 
ó	C.ðL ˆzÒÙ…Eð øðg ˜Ð(ò Ø!%ˆ�‰�IÑÙˆwŽðús   Á%D ÄD<Ä;D<