U
    
W[^'                  	   @   sh  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
 ejejkrzddlZejejf W n* eefk
r   dejd< e
e Y nX ddlmZ ddlmZmZmZmZ dd	lmZmZ 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&dd Z'dd  Z(d!d" Z)d#d$ Z*e+d%krde!  dS )&z2
Implementation module for the `ckeygen` command.
    )print_functionN)wraps)reloadtermios)keys)failurefilepathlogusage)	raw_input_PY3c                    s    fdd}|S )Nc                    s    t   fdd}|t< |S )Nc                     s
    | |S )N )argskwargskeygeneratorr   ?/usr/lib/python3/dist-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ddddgdddd	gd
dddgddddgddddgddddgddddggZdddgdddgd d!d"gd#dd$gd%d&d'ggZejd
e	e
e i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fzFilename of the key file.typetzSpecify type of key to create.commentCzProvide new comment.newpassNzProvide new passphrase.passPzProvide old passphrase.formatosha256-base64zFingerprint format of key file.fingerprintlzShow fingerprint of key file.
changepasspz&Change passphrase of private key file.quietqzQuiet.no-passphrasez"Create the key with no passphrase.showpubyz+Read private key file and print public key.)Z
optActions)__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 nB tjk
r` } z"td|  |   td W 5 d }~X Y nX t	
  tt	_| d r| d  tkrtd| d   t| d   |  n td| d dt f  nJ| d rt|  n8| d rt|  n&| d	 rt|  n|   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+   r0   )r   ZparseOptionssysargvr
   Z
UsageErrorprintZopt_helpexitr	   ZdiscardLogshandleErrorZdeferrlowerr   joinr   printFingerprintchangePassPhrasedisplayPublicKey)optionsur   r   r   runB   s4    



rC   c                 C   sP   | d dkrt jj| d< | S | d dkr8t jj| d< | S t d| d f d S )Nr&   zmd5-hexr(   z"Unsupported fingerprint format: %s)r   ZFingerprintFormatsZMD5_HEXZSHA256_BASE64ZBadFingerPrintFormat)rA   r   r   r   enumrepresentation_   s    rD   c                   C   s   da tt   d S )N   )Z
exitStatusr	   errr   ZFailurer   r   r   r   r;   l   s    r;   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)rG   r      i  )key_sizeZpublic_exponentbackend)	cryptography.hazmat.backendsrI   )cryptography.hazmat.primitives.asymmetricrG   generate_private_keyintr   Key_saveKey)rA   rI   rG   keyPrimitivekeyr   r   r   generateRSAkeys   s    

rU   dsac                 C   sX   ddl m} ddlm} | d s(d| d< |jt| d | d}t|}t||  d S )Nr   rH   )rV   r   rJ   )rK   rL   )	rM   rI   rN   rV   rO   rP   r   rQ   rR   )rA   rI   rV   rS   rT   r   r   r   generateDSAkey   s    

rW   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   rH   )ecr      s   ecdsa-sha2-nistpascii)curverL   )rM   rI   rN   rY   strencoderO   r   Z_curveTablerQ   rR   )rA   rI   rY   r\   rS   rT   r   r   r   generateECDSAkey   s    
r_   c                 C   s   | d s$t jd}td| | d< t j| d d rH| d  d7  < t| } z@tj| d }t	d|
 || d t j| d f  W n  tjk
r   td Y nX d S )Nr   ~/.ssh/id_rsa%Enter file in which the key is (%s): .pubz%s %s %sr&   zbad key)ospath
expanduserr   existsrD   r   rQ   fromFiler9   sizer)   basenameBadKeyErrorr7   r:   )rA   r   rT   r   r   r   r>      s    r>   c                 C   s   | d s$t jd}td| | d< ztj| d }W n tjk
r   | dsbt		d| d< ztjj| d | d d}W nR tj
k
r   td Y n4 tjk
r } ztd|f  W 5 d }~X Y nX Y n6 tj
k
r
 } ztd|f  W 5 d }~X Y nX | d	sNt		d
}t		d}||kr:qFtd q|| d	< z|jd| d	 d}W n4 tk
r } ztd|f  W 5 d }~X Y nX ztjj|| d	 d W n< tjtj
fk
r } ztd|f  W 5 d }~X Y nX t| d d}|| W 5 Q R X td d S )Nr   r`   ra   r$   zEnter old passphrase: Z
passphrasez1Could not change passphrase: old passphrase errorzCould not change passphrase: %sr"   z0Enter new passphrase (empty for no passphrase): Enter same passphrase again: %Passphrases do not match.  Try again.openssh)Zextrawbz;Your identification has been saved with the new passphrase.)rc   rd   re   r   r   rQ   rg   EncryptedKeyErrorgetgetpassrj   r7   r:   r9   toString	ExceptionZ
fromStringopenwrite)rA   r   rT   ep1p2Z
newkeydatafdr   r   r   r?      sR    
 
&"

""r?   c                 C   s   | d s$t jd}td| | d< ztj| d }W nF tjk
r~   | dsbt		d| d< tjj| d | d d}Y nX |
 d}tr|d}t| d S )	Nr   r`   ra   r$   zEnter passphrase: rk   rn   r[   )rc   rd   re   r   r   rQ   rg   rp   rq   rr   publicrs   r   decoder9   )rA   r   rT   Z
displayKeyr   r   r   r@      s     
 
r@   c           
      C   s  dddd}||    }|d sPtjd|f }td|f }| pJ||d< tj|d rtd|d f  td	}|d
  dkrt	
  |drd|d< n8|d std}td}||krqtd q||d< dt t f }	t|d | d|d  t|d d t|d d |  d|	 t|}td|d f  td|d f  td|d f  t| |d  dS )z
    Persist a SSH key on local filesystem.

    @param key: Key which is persisted on local filesystem.
    @type key: C{keys.Key} implementation.

    @param options:
    @type options: L{dict}
    rX   rG   rV   )ZECZRSAZDSAr   z~/.ssh/id_%sz*Enter file in which to save the key (%s): z%s already exists.zOverwrite (y/n)? r   r1   r/       r$   z,Enter passphrase (empty for no passphrase): rl   rm   z%s@%srn   i  rb   z(Your identification has been saved in %sz(Your public key has been saved in %s.pubzThe key fingerprint in %s is:r&   N)r   rc   rd   re   r   striprf   r9   r<   r7   r:   rq   rr   ZgetusersocketZgethostnamer   ZFilePathZ
setContentrs   chmodr{   rD   r)   )
rT   rA   ZKeyTypeMappingZkeyTypeNameZdefaultPathZnewPathZynrx   ry   r    r   r   r   rR      sF    





rR   __main__),__doc__Z
__future__r   r7   rc   rr   r   	functoolsr   impr   Zunix_getpassr   Z	tcgetattrZ	tcsetattrImportErrorAttributeErrormodulesZtwisted.conch.sshr   Ztwisted.pythonr   r   r	   r
   Ztwisted.python.compatr   r   dictr   r   ZOptionsr   rC   rD   r;   rU   rW   r_   r>   r?   r@   rR   r2   r   r   r   r   <module>   s@    



05
