o
    Òó·i•0  ã                	   @  sº  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jkrqzddlZejejf W n eefyp   dejd
< eeƒ Y nw e ƒ Z!dd„ Z"G dd„ dej#ƒZ$dd„ Z%dd„ Z&dd„ Z'e"dƒdd„ ƒZ(e"dƒdd„ ƒZ)e"dƒdd„ ƒZ*e"dƒdd „ ƒZ+d!d"„ Z,		d;d<d*d+„Z-d=d-d.„Z.d/d0„ Z/d1d2„ Z0d>d4d5„Z1	d?d@d8d9„Z2e3d:krÛe%ƒ  dS dS )Az2
Implementation module for the `ckeygen` command.
é    )ÚannotationsN)ÚCallable)Úwraps)Úreload)ÚAnyÚDictÚOptional)Úkeys)ÚfailureÚfilepathÚlogÚusageÚtermiosc                   s   ‡ fdd„}|S )Nc                   s    t ˆ ƒ‡ fdd„ƒ}|tˆ< |S )Nc                    s   ˆ | i |¤ŽS ©N© )ÚargsÚkwargs©Úkeygeneratorr   úcC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/conch/scripts/ckeygen.pyÚwrapper%   s   z:_keyGenerator.<locals>.assignkeygenerator.<locals>.wrapper)r   ÚsupportedKeyTypes)r   r   ©ÚkeyTyper   r   Úassignkeygenerator$   s   z)_keyGenerator.<locals>.assignkeygeneratorr   )r   r   r   r   r   Ú_keyGenerator#   s   r   c                	   @  s”   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 	e
e ¡ ƒ¡e 	ddg¡dœd�ZdS )Ú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!   r,   )Z
optActionsN)Ú__name__Ú
__module__Ú__qualname__ZsynopsisZlongdescZoptParametersZoptFlagsr   ZCompletionsZCompleteListÚlistr   r	   ZcompDatar   r   r   r   r   /   s.    øûþ
ÿr   c               
   C  s(  t ƒ } z|  tjdd … ¡ W n" tjy1 } ztd| ƒ |  ¡  t d¡ W Y d }~nd }~ww t	 
¡  tt	_| d rk| d  ¡ tv rYtd| d  ƒ t| d  ¡  | ƒ d S t d| d d t ¡ ¡f ¡ d S | d rut| ƒ d S | d rt| ƒ d S | d	 r‰t| ƒ d S |  ¡  t d¡ d S )
Né   z	ERROR: %sr!   z&Generating public/private %s key pair.z"Key type was %s, must be one of %sz, r-   r/   r4   )r   ZparseOptionsÚsysÚargvr   Z
UsageErrorÚprintZopt_helpÚexitr   ZdiscardLogsÚhandleErrorZdeferrÚlowerr   Újoinr	   ÚprintFingerprintÚchangePassPhraseÚdisplayPublicKey)ÚoptionsÚur   r   r   ÚrunU   s8   €ýÿÿrI   c                 C  sL   | d dkrt jj| d< | S | d dkrt jj| d< | S t  d| d › �¡‚)Nr)   zmd5-hexr+   z Unsupported fingerprint format: )r	   ZFingerprintFormatsZMD5_HEXZSHA256_BASE64ZBadFingerPrintFormat)rG   r   r   r   Úenumrepresentations   s   ÿrJ   c                   C  s   da t t ¡ ¡ ‚ )Né   )Z
exitStatusr   Úerrr
   ZFailurer   r   r   r   rA   €   s   rA   Úrsac                 C  sZ   ddl m} ddlm} | d sd| d< |jt| d ƒd|ƒ d�}t |¡}t|| ƒ d S )Nr   ©Údefault_backend)rM   r   i   i  )Úkey_sizeZpublic_exponentÚbackend)	Úcryptography.hazmat.backendsrO   Ú)cryptography.hazmat.primitives.asymmetricrM   Úgenerate_private_keyÚintr	   ÚKeyÚ_saveKey)rG   rO   rM   ÚkeyPrimitiveÚkeyr   r   r   ÚgenerateRSAkey‡   s   
ý
rZ   Údsac                 C  sX   ddl m} ddlm} | d sd| d< |jt| d ƒ|ƒ d�}t |¡}t|| ƒ d S )Nr   rN   )r[   r   i   )rP   rQ   )	rR   rO   rS   r[   rT   rU   r	   rV   rW   )rG   rO   r[   rX   rY   r   r   r   ÚgenerateDSAkey—   s   
þ
r\   Úecdsac                 C  sl   ddl m} ddlm} | d sd| d< dt| d ƒ d¡ }|jtj| |ƒ d�}t 	|¡}t
|| ƒ d S )	Nr   rN   )Úecr   é   s   ecdsa-sha2-nistpÚascii)ÚcurverQ   )rR   rO   rS   r^   ÚstrÚencoderT   r	   Z_curveTablerV   rW   )rG   rO   r^   ra   rX   rY   r   r   r   ÚgenerateECDSAkey¦   s   ÿ
rd   Úed25519c                 C  s"   t j ¡ }t  |¡}t|| ƒ d S r   )r	   ZEd25519PrivateKeyÚgeneraterV   rW   )rG   rX   rY   r   r   r   ÚgenerateEd25519key·   s   

rg   c                 C  s   | dkrdS dS )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'}).
    ÚEd25519r7   r6   Nr   r   r   r   r   Ú_defaultPrivateKeySubtype¾   s   ri   rG   úDict[Any, Any]ÚinputCollectorúOptional[Callable[[str], str]]ÚkeyTypeNamerb   Úreturnc                 C  s`   |du rt }| d }|s,tj d|› �¡}t ¡ dkr$tj d|› �¡}|d| ƒp+|}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"
    Nr   z
~/.ssh/id_ÚWindowsz%HOMEPATH %\.ssh\id_z%Enter file in which the key is (%s): )ÚinputÚosÚpathÚ
expanduserÚplatformÚsystemrb   )rG   rk   rm   r   r   r   r   Ú_getKeyOrDefaultÐ   s   þrv   ÚNonec                 C  s¦   t | ƒ}tj |d ¡r|d7 }t| ƒ} ztj |¡}td| 	¡ | 
| d ¡tj |¡f ƒ W d S  tjyA   t d¡ Y d S  tyR   t |› d�¡ Y d S w )Nú.pubz%s %s %sr)   zbad keyú, could not be opened, please specify a file.)rv   rq   rr   ÚexistsrJ   r	   rV   ÚfromFiler?   Úsizer-   ÚbasenameÚBadKeyErrorr=   r@   ÚFileNotFoundError)rG   r   rY   r   r   r   rD   ê   s&   
ýÿ
ÿÿrD   c                 C  sL  t | ƒ}ztj |¡}W nv tjyX   |  d¡s t d¡| d< ztjj|| d d�}W n) tjy;   t 	d¡ Y n tjyU } zt 	d|› �¡ W Y d }~nd }~ww Y n+ tjyr } zt 	d|› �¡ W Y d }~nd }~w t
y‚   t 	|› d�¡ Y nw |  d¡s¡	 t d	¡}t d
¡}||kr˜q�tdƒ q‰|| d< |  d¡d u r°t| ¡ ƒ| d< z|jd| d | d d�}W n tyØ } zt 	d|› �¡ W Y d }~nd }~ww ztjj|| d d� W n tjtjf�y } zt 	d|› �¡ W Y d }~nd }~ww t|dƒ�}| |¡ W d   ƒ n	1 �sw   Y  tdƒ d S )Nr'   zEnter old passphrase: ©Ú
passphrasez1Could not change passphrase: old passphrase errorzCould not change passphrase: ry   r%   r<   z0Enter new passphrase (empty for no passphrase): úEnter same passphrase again: ú%Passphrases do not match.  Try again.r,   Úopenssh©Úsubtyper�   Úwbz;Your identification has been saved with the new passphrase.)rv   r	   rV   r{   ÚEncryptedKeyErrorÚgetÚgetpassr~   r=   r@   r   r?   ri   r!   ÚtoStringÚ	ExceptionZ
fromStringÚopenÚwrite)rG   r   rY   ÚeÚp1Úp2Z
newkeydataÚfdr   r   r   rE   ÿ   sh   
€ÿ€€ÿ


û
ý€ÿ€ÿÿrE   c                 C  sš   t | ƒ}ztj |¡}W n0 ty   t |› d�¡ Y n  tjy<   |  d¡s0t	 	d¡| d< tjj|| d d�}Y nw | 
¡  d¡ d¡}t|ƒ d S )Nry   r'   zEnter passphrase: r€   r„   r`   )rv   r	   rV   r{   r   r=   r@   rˆ   r‰   rŠ   Úpublicr‹   Údecoder?   )rG   r   rY   Z
displayKeyr   r   r   rF   2  s   
ýrF   Úpromptc                 C  s   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.
    N)rp   )r•   r   r   r   Ú_inputSaveFile@  s   r–   rY   úkeys.Keyc                 C  sº  |du rt }dddddœ}||  ¡  }|d }|s-t|||ƒ}td|› d	�ƒ}| ¡ p,|}tj |¡rJt|› d
�ƒ |dƒ}|d  	¡ dkrJt
 ¡  | d¡rTd|d< n|d sq	 t d¡}	t d¡}
|	|
krhqmtdƒ qY|	|d< | d¡du r€t|  ¡ ƒ|d< t ¡ › dt ¡ › �}t |¡}| | jd|d |d d�¡ | d¡ t |d ¡ |  ¡ jd|d�¡ t|ƒ}td|› �ƒ td|› d�ƒ td|d › d �ƒ t|  |d ¡ƒ dS )!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.
    Nr]   re   rM   r[   )ZECrh   ZRSAZDSAr   z%Enter file in which to save the key (z): z already exists.zOverwrite (y/n)? r   r5   r3   ó    r'   r<   z,Enter passphrase (empty for no passphrase): r‚   rƒ   r,   ú@r„   r…   i€�  rx   )r#   z&Your identification has been saved in z"Your public key has been saved in zThe key fingerprint in r)   z is:)rp   r!   rv   r–   Ústriprq   rr   rz   r?   rB   r=   r@   r‰   rŠ   ri   ÚgetuserÚsocketÚgethostnamer   ZFilePathZ
setContentr‹   Úchmodr“   rJ   r-   )rY   rG   rk   ZKeyTypeMappingrm   r   ZdefaultPathZnewPathZynr�   r‘   r#   Úfpr   r   r   rW   I  s^   
ÿ



û
ýÿ
ÿrW   Ú__main__)NrM   )rG   rj   rk   rl   rm   rb   rn   rb   )rG   rj   rn   rw   )r•   rb   rn   rb   r   )rY   r—   rG   rj   rk   rl   rn   rw   )4Ú__doc__Ú
__future__r   rŠ   rq   rt   rœ   r=   Úcollections.abcr   Ú	functoolsr   Ú	importlibr   Útypingr   r   r   Ztwisted.conch.sshr	   Ztwisted.pythonr
   r   r   r   Úunix_getpassr   Ú	tcgetattrÚ	tcsetattrÚImportErrorÚAttributeErrorÚmodulesÚdictr   r   ÚOptionsr   rI   rJ   rA   rZ   r\   rd   rg   ri   rv   rD   rE   rF   r–   rW   r8   r   r   r   r   Ú<module>   s`   
þ&



ý
3
ýF
ÿ